diff options
| author | 2026-03-06 01:48:44 +0800 | |
|---|---|---|
| committer | 2026-03-06 01:48:44 +0800 | |
| commit | 120509f0aad0e945d8e0fc90a822fa904fb70b68 (patch) | |
| tree | 20a541f059591b35795a1a5d3b7dcf48ec711b6a /repository/objects.go | |
| parent | refstore/loose: Fix package-level comment (diff) | |
| signature | No signature | |
repository: Refactor v0.1.55
Diffstat (limited to 'repository/objects.go')
| -rw-r--r-- | repository/objects.go | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/repository/objects.go b/repository/objects.go new file mode 100644 index 00000000..c8278150 --- /dev/null +++ b/repository/objects.go @@ -0,0 +1,69 @@ +package repository + +import ( + "errors" + "fmt" + "os" + + "codeberg.org/lindenii/furgit/objectid" + "codeberg.org/lindenii/furgit/objectstore" + objectloose "codeberg.org/lindenii/furgit/objectstore/loose" + objectmix "codeberg.org/lindenii/furgit/objectstore/mix" + objectpacked "codeberg.org/lindenii/furgit/objectstore/packed" +) + +func openObjectStore(root *os.Root, algo objectid.Algorithm) (objectstore.Store, *objectloose.Store, error) { + objectsRoot, err := root.OpenRoot("objects") + if err != nil { + return nil, nil, fmt.Errorf("repository: open objects: %w", err) + } + + looseStore, err := objectloose.New(objectsRoot, algo) + if err != nil { + return nil, nil, err + } + + backends := []objectstore.Store{looseStore} + + packRoot, err := objectsRoot.OpenRoot("pack") + if err == nil { + var packedStore *objectpacked.Store + + packedStore, err = objectpacked.New(packRoot, algo) + if err != nil { + _ = looseStore.Close() + + return nil, nil, err + } + + backends = append(backends, packedStore) + } else if !errors.Is(err, os.ErrNotExist) { + _ = looseStore.Close() + + return nil, nil, fmt.Errorf("repository: open objects/pack: %w", err) + } + + objectsChain := objectmix.New(backends...) + + objectsRootForWriting, err := root.OpenRoot("objects") + if err != nil { + _ = objectsChain.Close() + + return nil, nil, fmt.Errorf("repository: open objects for loose writing: %w", err) + } + + objectsLooseForWritingOnly, err := objectloose.New(objectsRootForWriting, algo) + if err != nil { + _ = objectsRootForWriting.Close() + _ = objectsChain.Close() + + return nil, nil, err + } + + return objectsChain, objectsLooseForWritingOnly, nil +} + +// Objects returns the configured object store. +func (repo *Repository) Objects() objectstore.Store { + return repo.objects +} |
