diff options
Diffstat (limited to 'repository')
| -rw-r--r-- | repository/close.go | 21 | ||||
| -rw-r--r-- | repository/objects.go | 57 | ||||
| -rw-r--r-- | repository/open.go | 5 | ||||
| -rw-r--r-- | repository/repository.go | 5 |
4 files changed, 70 insertions, 18 deletions
diff --git a/repository/close.go b/repository/close.go index 998742d0..2b76cde1 100644 --- a/repository/close.go +++ b/repository/close.go @@ -28,5 +28,26 @@ func (repo *Repository) Close() error { } } + if repo.objectsWriteRoot != nil { + err := repo.objectsWriteRoot.Close() + if err != nil { + errs = append(errs, err) + } + } + + if repo.objectsPackRoot != nil { + err := repo.objectsPackRoot.Close() + if err != nil { + errs = append(errs, err) + } + } + + if repo.objectsRoot != nil { + err := repo.objectsRoot.Close() + if err != nil { + errs = append(errs, err) + } + } + return errors.Join(errs...) } diff --git a/repository/objects.go b/repository/objects.go index 8e1394b0..1881de2d 100644 --- a/repository/objects.go +++ b/repository/objects.go @@ -13,59 +13,82 @@ import ( ) //nolint:ireturn -func openObjectStore(root *os.Root, algo objectid.Algorithm) (objectstore.Store, *objectloose.Store, error) { - objectsRoot, err := root.OpenRoot("objects") +func openObjectStore( + root *os.Root, + algo objectid.Algorithm, +) ( + objects objectstore.Store, + objectsRoot *os.Root, + objectsPackRoot *os.Root, + objectsLooseForWritingOnly *objectloose.Store, + objectsWriteRoot *os.Root, + err error, +) { + objectsRoot, err = root.OpenRoot("objects") if err != nil { - return nil, nil, fmt.Errorf("repository: open objects: %w", err) + return nil, nil, nil, nil, nil, fmt.Errorf("repository: open objects: %w", err) } looseStore, err := objectloose.New(objectsRoot, algo) if err != nil { - return nil, nil, err + _ = objectsRoot.Close() + + return nil, nil, nil, nil, nil, err } backends := []objectstore.Store{looseStore} + objectsPackRoot, err = objectsRoot.OpenRoot("pack") - packRoot, err := objectsRoot.OpenRoot("pack") if err == nil { var packedStore *objectpacked.Store packedStore, err = objectpacked.New( - packRoot, + objectsPackRoot, algo, objectpacked.Options{RefreshPolicy: objectpacked.RefreshPolicyNever}, ) if err != nil { + _ = objectsPackRoot.Close() _ = looseStore.Close() + _ = objectsRoot.Close() - return nil, nil, err + return nil, nil, nil, nil, nil, err } backends = append(backends, packedStore) } else if !errors.Is(err, os.ErrNotExist) { _ = looseStore.Close() + _ = objectsRoot.Close() - return nil, nil, fmt.Errorf("repository: open objects/pack: %w", err) + return nil, nil, nil, nil, nil, fmt.Errorf("repository: open objects/pack: %w", err) } - objectsChain := objectmix.New(backends...) + objects = objectmix.New(backends...) - objectsRootForWriting, err := root.OpenRoot("objects") + objectsWriteRoot, err = root.OpenRoot("objects") if err != nil { - _ = objectsChain.Close() + _ = objects.Close() + if objectsPackRoot != nil { + _ = objectsPackRoot.Close() + } + _ = objectsRoot.Close() - return nil, nil, fmt.Errorf("repository: open objects for loose writing: %w", err) + return nil, nil, nil, nil, nil, fmt.Errorf("repository: open objects for loose writing: %w", err) } - objectsLooseForWritingOnly, err := objectloose.New(objectsRootForWriting, algo) + objectsLooseForWritingOnly, err = objectloose.New(objectsWriteRoot, algo) if err != nil { - _ = objectsRootForWriting.Close() - _ = objectsChain.Close() + _ = objects.Close() + _ = objectsWriteRoot.Close() + if objectsPackRoot != nil { + _ = objectsPackRoot.Close() + } + _ = objectsRoot.Close() - return nil, nil, err + return nil, nil, nil, nil, nil, err } - return objectsChain, objectsLooseForWritingOnly, nil + return objects, objectsRoot, objectsPackRoot, objectsLooseForWritingOnly, objectsWriteRoot, nil } // Objects returns the configured object store. diff --git a/repository/open.go b/repository/open.go index f1bff5da..797da7ad 100644 --- a/repository/open.go +++ b/repository/open.go @@ -28,13 +28,16 @@ func Open(root *os.Root) (repo *Repository, err error) { repo.algo = algo - objects, objectsLooseForWritingOnly, err := openObjectStore(root, algo) + objects, objectsRoot, objectsPackRoot, objectsLooseForWritingOnly, objectsWriteRoot, err := openObjectStore(root, algo) if err != nil { return nil, err } repo.objects = objects + repo.objectsRoot = objectsRoot + repo.objectsPackRoot = objectsPackRoot repo.objectsLooseForWritingOnly = objectsLooseForWritingOnly + repo.objectsWriteRoot = objectsWriteRoot refs, err := openRefStore(root, algo, detectPackedRefsTimeout(cfg)) if err != nil { diff --git a/repository/repository.go b/repository/repository.go index f120ea72..04ca34a8 100644 --- a/repository/repository.go +++ b/repository/repository.go @@ -2,6 +2,8 @@ package repository import ( + "os" + "codeberg.org/lindenii/furgit/config" "codeberg.org/lindenii/furgit/objectid" "codeberg.org/lindenii/furgit/objectstore" @@ -18,6 +20,9 @@ type Repository struct { algo objectid.Algorithm objects objectstore.Store + objectsRoot *os.Root + objectsPackRoot *os.Root objectsLooseForWritingOnly *objectloose.Store + objectsWriteRoot *os.Root refs refstore.ReadWriteStore } |
