diff options
Diffstat (limited to 'repository/refs.go')
| -rw-r--r-- | repository/refs.go | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/repository/refs.go b/repository/refs.go new file mode 100644 index 00000000..bdcab843 --- /dev/null +++ b/repository/refs.go @@ -0,0 +1,52 @@ +package repository + +import ( + "errors" + "fmt" + "os" + + "codeberg.org/lindenii/furgit/objectid" + "codeberg.org/lindenii/furgit/refstore" + refchain "codeberg.org/lindenii/furgit/refstore/chain" + refloose "codeberg.org/lindenii/furgit/refstore/loose" + refpacked "codeberg.org/lindenii/furgit/refstore/packed" +) + +func openRefStore(root *os.Root, algo objectid.Algorithm) (out refstore.Store, err error) { + looseRoot, err := root.OpenRoot(".") + if err != nil { + return nil, fmt.Errorf("repository: open root for loose refs: %w", err) + } + + looseStore, err := refloose.New(looseRoot, algo) + if err != nil { + _ = looseRoot.Close() + + return nil, err + } + + backends := []refstore.Store{looseStore} + + _, err = root.Stat("packed-refs") + if err == nil { + packedStore, packedErr := refpacked.New(root, algo) + if packedErr != nil { + _ = looseStore.Close() + + return nil, packedErr + } + + backends = append(backends, packedStore) + } else if !errors.Is(err, os.ErrNotExist) { + _ = looseStore.Close() + + return nil, fmt.Errorf("repository: stat packed-refs: %w", err) + } + + return refchain.New(backends...), nil +} + +// Refs returns the configured ref store. +func (repo *Repository) Refs() refstore.Store { + return repo.refs +} |
