ref: 5d85a8de7bdb9e3223d8bbe6661dfb5c2bdd16c7
dir: /objectstore/packed/read_size.go/
package packed
import (
"fmt"
packfmt "codeberg.org/lindenii/furgit/format/pack"
"codeberg.org/lindenii/furgit/objectid"
"codeberg.org/lindenii/furgit/objecttype"
)
// ReadSize reads an object's declared content size.
func (store *Store) ReadSize(id objectid.ObjectID) (int64, error) {
loc, err := store.lookup(id)
if err != nil {
return 0, err
}
return store.resolveSizeAt(loc)
}
// resolveSizeAt resolves one object's declared content size from location.
func (store *Store) resolveSizeAt(start location) (int64, error) {
pack, meta, err := store.entryMetaAt(start)
if err != nil {
return 0, err
}
if packfmt.IsBaseObjectType(meta.ty) {
return meta.size, nil
}
switch meta.ty {
case objecttype.TypeRefDelta, objecttype.TypeOfsDelta:
return deltaDeclaredSizeAt(pack, meta.dataOffset)
case objecttype.TypeInvalid, objecttype.TypeFuture:
return 0, fmt.Errorf("objectstore/packed: unsupported pack type %d", meta.ty)
case objecttype.TypeCommit, objecttype.TypeTree, objecttype.TypeBlob, objecttype.TypeTag:
return 0, fmt.Errorf("objectstore/packed: internal invariant violation for base type %d", meta.ty)
default:
return 0, fmt.Errorf("objectstore/packed: unsupported pack type %d", meta.ty)
}
}