shithub: furgit

ref: dff530bd93b9b7200d5d492b4ccb86c17daadf21
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)
	}
}