diff options
| author | 2026-03-04 12:52:14 +0800 | |
|---|---|---|
| committer | 2026-03-04 12:52:14 +0800 | |
| commit | f9f60fcda1e75ddf9ed34ee5997c5cfbe3388e96 (patch) | |
| tree | c80bdf5b8a50936f00a79ef750bc70932bf033b7 /repository/open_objects.go | |
| parent | objectstore/mix: Separate (diff) | |
| signature | No signature | |
repository: Split
Diffstat (limited to 'repository/open_objects.go')
| -rw-r--r-- | repository/open_objects.go | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/repository/open_objects.go b/repository/open_objects.go new file mode 100644 index 00000000..61fc0f93 --- /dev/null +++ b/repository/open_objects.go @@ -0,0 +1,64 @@ +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 +} |
