aboutsummaryrefslogtreecommitdiff
path: root/repository
diff options
context:
space:
mode:
Diffstat (limited to 'repository')
-rw-r--r--repository/close.go21
-rw-r--r--repository/objects.go57
-rw-r--r--repository/open.go5
-rw-r--r--repository/repository.go5
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
}