shithub: furgit

ref: 246c82d09118977d45e6ccdf3a289ba0f451cd87
dir: /objectstore/packed/read_size.go/

View raw version
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)
	}
}