shithub: furgit

ref: ab174c473618dd3743881cf44e02c2db4d1ecd5f
dir: /object/store/packed/internal/reading/read_size.go/

View raw version
package reading

import (
	"fmt"

	objectid "codeberg.org/lindenii/furgit/object/id"
	objecttype "codeberg.org/lindenii/furgit/object/type"
)

// ReadSize reads an object's declared content size.
//
// Like ReadHeader, it resolves header metadata only. It does not verify that
// the full pack entry payload is readable and does not verify any zlib
// Adler-32 trailer for compressed entry data.
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 meta.ty.IsBaseObject() {
		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)
	}
}