From 62d363f044dbcd5dbdf447a0f3ce4c12b8ab30e4 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sat, 16 May 2026 08:29:46 +0000 Subject: object/header: Refactor --- REFACTOR | 1 - object/header/append.go | 23 +++++++++-------------- object/header/encode.go | 8 -------- object/header/parse.go | 25 ++++++++++++++----------- 4 files changed, 23 insertions(+), 34 deletions(-) delete mode 100644 object/header/encode.go diff --git a/REFACTOR b/REFACTOR index d72d6124..55ecd95f 100644 --- a/REFACTOR +++ b/REFACTOR @@ -47,7 +47,6 @@ object object/blob object/commit object/fetch -object/header object/signature object/signed object/signed/commit diff --git a/object/header/append.go b/object/header/append.go index d1e98672..d79016a0 100644 --- a/object/header/append.go +++ b/object/header/append.go @@ -1,25 +1,20 @@ package header import ( + "slices" "strconv" "codeberg.org/lindenii/furgit/object/typ" ) // AppendHeader appends a canonical loose-object header ("type size\x00") to dst. -func AppendHeader(dst []byte, ty typ.Type, size uint64) ([]byte, bool) { - tyName, ok := ty.Name() - if !ok { - return nil, false - } +func AppendHeader(dst []byte, ty typ.Type, size uint64) ([]byte) { + tyName := ty.Name() - sizeStr := strconv.FormatInt(size, 10) - out := make([]byte, 0, len(dst)+len(tyName)+len(sizeStr)+2) - out = append(out, dst...) - out = append(out, tyName...) - out = append(out, ' ') - out = append(out, sizeStr...) - out = append(out, 0) - - return out, true + dst = slices.Grow(dst, len(tyName)+1+19+1) + dst = append(dst, tyName...) + dst = append(dst, ' ') + dst = strconv.AppendUint(dst, size, 10) + dst = append(dst, 0) + return dst } diff --git a/object/header/encode.go b/object/header/encode.go deleted file mode 100644 index 4cd8599c..00000000 --- a/object/header/encode.go +++ /dev/null @@ -1,8 +0,0 @@ -package header - -import "codeberg.org/lindenii/furgit/object/typ" - -// Encode returns a canonical loose-object header ("type size\x00"). -func Encode(ty typ.Type, size int64) ([]byte, bool) { - return Append(nil, ty, size) -} diff --git a/object/header/parse.go b/object/header/parse.go index 77deef38..7fb3ed04 100644 --- a/object/header/parse.go +++ b/object/header/parse.go @@ -2,39 +2,42 @@ package header import ( "bytes" + "errors" "strconv" "codeberg.org/lindenii/furgit/object/typ" ) +var ErrInvalidHeader = errors.New("object/header: invalid header") + // Parse parses a canonical loose-object header ("type size\x00"). -func Parse(data []byte) (ty typ.Type, size int64, consumed int, ok bool) { +func Parse(data []byte) (ty typ.Type, size uint64, consumed int, err error) { space := bytes.IndexByte(data, ' ') if space <= 0 { - return typ.TypeInvalid, 0, 0, false + return 0, 0, 0, ErrInvalidHeader } nulRel := bytes.IndexByte(data[space+1:], 0) if nulRel < 0 { - return typ.TypeInvalid, 0, 0, false + return 0, 0, 0, ErrInvalidHeader } nul := space + 1 + nulRel - ty, ok = typ.Parse(string(data[:space])) - if !ok { - return typ.TypeInvalid, 0, 0, false + ty, err = typ.Parse(string(data[:space])) + if err != nil { + return 0, 0, 0, ErrInvalidHeader } sizeBytes := data[space+1 : nul] if len(sizeBytes) == 0 { - return typ.TypeInvalid, 0, 0, false + return 0, 0, 0, ErrInvalidHeader } - size, err := strconv.ParseInt(string(sizeBytes), 10, 64) - if err != nil || size < 0 { - return typ.TypeInvalid, 0, 0, false + size, err = strconv.ParseUint(string(sizeBytes), 10, 64) + if err != nil { + return 0, 0, 0, ErrInvalidHeader } - return ty, size, nul + 1, true + return ty, size, nul + 1, nil } -- cgit v1.3.1-10-gc9f91