From f04cb2e9aff390d952c9b38dafd6f57aa0371aac Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sat, 21 Feb 2026 04:04:43 +0800 Subject: objectstore/loose: Simplify ReadBytes* with a helper --- objectstore/loose/read_bytes.go | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/objectstore/loose/read_bytes.go b/objectstore/loose/read_bytes.go index 80350809..2f7c24bc 100644 --- a/objectstore/loose/read_bytes.go +++ b/objectstore/loose/read_bytes.go @@ -5,18 +5,30 @@ import ( "codeberg.org/lindenii/furgit/objecttype" ) -// ReadBytesFull reads a full serialized object as "type size\0content". -func (store *Store) ReadBytesFull(id objectid.ObjectID) ([]byte, error) { +// readBytesParsed reads, inflates, and parses a loose object in one pass. +// It returns the full raw payload and its parsed type and content. +func (store *Store) readBytesParsed(id objectid.ObjectID) ([]byte, objecttype.Type, []byte, error) { file, err := store.openObject(id) if err != nil { - return nil, err + return nil, objecttype.TypeInvalid, nil, err } defer func() { _ = file.Close() }() + raw, err := decodeAll(file) if err != nil { - return nil, err + return nil, objecttype.TypeInvalid, nil, err + } + ty, content, err := parseRaw(raw) + if err != nil { + return nil, objecttype.TypeInvalid, nil, err } - if _, _, err := parseRaw(raw); err != nil { + return raw, ty, content, nil +} + +// ReadBytesFull reads a full serialized object as "type size\0content". +func (store *Store) ReadBytesFull(id objectid.ObjectID) ([]byte, error) { + raw, _, _, err := store.readBytesParsed(id) + if err != nil { return nil, err } return raw, nil @@ -24,11 +36,7 @@ func (store *Store) ReadBytesFull(id objectid.ObjectID) ([]byte, error) { // ReadBytesContent reads an object's type and content bytes. func (store *Store) ReadBytesContent(id objectid.ObjectID) (objecttype.Type, []byte, error) { - raw, err := store.ReadBytesFull(id) - if err != nil { - return objecttype.TypeInvalid, nil, err - } - ty, content, err := parseRaw(raw) // Just for the size check. + _, ty, content, err := store.readBytesParsed(id) if err != nil { return objecttype.TypeInvalid, nil, err } -- cgit v1.3.1-10-gc9f91