diff options
| author | 2025-11-22 08:00:00 +0800 | |
|---|---|---|
| committer | 2025-11-22 08:00:00 +0800 | |
| commit | 8aa544539d452f310b6a88348f2a50bda017e317 (patch) | |
| tree | 6dd059c709853c4296ea8fd837857a8a92bcb497 | |
| parent | pack: Allocate the header on the stack instead (diff) | |
| signature | No signature | |
obj: call parseObjectBody in ReadObject instead of loose/pack readers
| -rw-r--r-- | loose.go | 8 | ||||
| -rw-r--r-- | obj.go | 15 | ||||
| -rw-r--r-- | pack_pack.go | 17 |
3 files changed, 21 insertions, 19 deletions
@@ -24,14 +24,12 @@ func (repo *Repository) loosePath(id Hash) (string, error) { return filepath.Join("objects", hex[:2], hex[2:]), nil } -func (repo *Repository) looseRead(id Hash) (StoredObject, error) { +func (repo *Repository) looseRead(id Hash) (ObjectType, *bufpool.Buffer, error) { ty, body, err := repo.looseReadTyped(id) if err != nil { - return nil, err + return ObjectTypeInvalid, nil, err } - obj, err := parseObjectBody(ty, id, body.Bytes(), repo) - body.Release() - return obj, err + return ty, body, nil } func (repo *Repository) looseReadTyped(id Hash) (ObjectType, *bufpool.Buffer, error) { @@ -95,18 +95,25 @@ func parseObjectBody(ty ObjectType, id Hash, body []byte, repo *Repository) (Sto // ReadObject resolves an ID. func (repo *Repository) ReadObject(id Hash) (StoredObject, error) { - obj, err := repo.looseRead(id) + ty, body, err := repo.looseRead(id) if err == nil { - return obj, nil + obj, parseErr := parseObjectBody(ty, id, body.Bytes(), repo) + body.Release() + return obj, parseErr } if !errors.Is(err, ErrNotFound) { return nil, err } - obj, err = repo.packRead(id) + ty, body, err = repo.packRead(id) if errors.Is(err, ErrNotFound) { return nil, ErrInvalidObject } - return obj, err + if err != nil { + return nil, err + } + obj, parseErr := parseObjectBody(ty, id, body.Bytes(), repo) + body.Release() + return obj, parseErr } // ReadObjectTypeSize reports the object type and size. diff --git a/pack_pack.go b/pack_pack.go index 1b98bcca..c7910462 100644 --- a/pack_pack.go +++ b/pack_pack.go @@ -22,10 +22,10 @@ type packlocation struct { Offset uint64 } -func (repo *Repository) packRead(id Hash) (StoredObject, error) { +func (repo *Repository) packRead(id Hash) (ObjectType, *bufpool.Buffer, error) { loc, err := repo.packIndexFind(id) if err != nil { - return nil, err + return ObjectTypeInvalid, nil, err } return repo.packReadAt(loc, id) } @@ -48,19 +48,16 @@ func (repo *Repository) packIndexFind(id Hash) (packlocation, error) { return packlocation{}, ErrNotFound } -func (repo *Repository) packReadAt(loc packlocation, want Hash) (StoredObject, error) { +func (repo *Repository) packReadAt(loc packlocation, want Hash) (ObjectType, *bufpool.Buffer, error) { ty, body, err := repo.packBodyResolveAtLocation(loc) if err != nil { - return nil, err + return ObjectTypeInvalid, nil, err } - data := body.Bytes() - // if !repo.verifyTypedObject(ty, data, want) { + // if !repo.verifyTypedObject(ty, body.Bytes(), want) { // body.Release() - // return nil, ErrInvalidObject + // return ObjectTypeInvalid, nil, ErrInvalidObject // } - obj, err := parseObjectBody(ty, want, data, repo) - body.Release() - return obj, err + return ty, body, nil } func (repo *Repository) packBodyResolveAtLocation(loc packlocation) (ObjectType, *bufpool.Buffer, error) { |
