ref: df1f2fb3daa1acd25c88510f259d5535fb482126
dir: /object/store/loose/paths.go/
package loose
import (
"errors"
"fmt"
"io/fs"
"os"
"path/filepath"
objectid "codeberg.org/lindenii/furgit/object/id"
objectstore "codeberg.org/lindenii/furgit/object/store"
)
// objectPath returns the loose object path for id relative to the objects root.
func (store *Store) objectPath(id objectid.ObjectID) (string, error) {
if id.Algorithm() != store.algo {
return "", fmt.Errorf("objectstore/loose: object id algorithm mismatch: got %s want %s", id.Algorithm(), store.algo)
}
hex := id.String()
return filepath.Join(hex[:2], hex[2:]), nil
}
// openObject opens the loose object file for id.
// Missing files cause objectstore.ErrObjectNotFound.
func (store *Store) openObject(id objectid.ObjectID) (*os.File, error) {
relPath, err := store.objectPath(id)
if err != nil {
return nil, err
}
file, err := store.root.Open(relPath)
if err != nil {
if errors.Is(err, fs.ErrNotExist) {
return nil, objectstore.ErrObjectNotFound
}
return nil, err
}
return file, nil
}