diff options
| -rw-r--r-- | objectstore/loose/read_bytes.go | 28 |
1 files 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 } |
