From f9f60fcda1e75ddf9ed34ee5997c5cfbe3388e96 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Wed, 4 Mar 2026 12:52:14 +0800 Subject: repository: Split --- repository/open_objects.go | 64 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 repository/open_objects.go (limited to 'repository/open_objects.go') 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 +} -- cgit v1.3.1-10-gc9f91