aboutsummaryrefslogtreecommitdiff
path: root/repository
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-30 19:40:23 +0000
committerGravatar Runxi Yu2026-03-30 19:40:23 +0000
commit84342973be94c2981fac56c6680d9f87eb9fa9ce (patch)
treee0c95866bf8ddfebd17017426f78e528a96585e8 /repository
parentobject/store: Unify writers and fix naming (diff)
signatureNo signature
repository: Use dual v0.1.161
Diffstat (limited to 'repository')
-rw-r--r--repository/objects.go57
-rw-r--r--repository/repository.go4
-rw-r--r--repository/write_loose.go12
-rw-r--r--repository/write_loose_test.go8
4 files changed, 40 insertions, 41 deletions
diff --git a/repository/objects.go b/repository/objects.go
index 81d4ce70..2527363a 100644
--- a/repository/objects.go
+++ b/repository/objects.go
@@ -1,14 +1,13 @@
package repository
import (
- "errors"
"fmt"
"os"
objectid "codeberg.org/lindenii/furgit/object/id"
objectstore "codeberg.org/lindenii/furgit/object/store"
+ objectdual "codeberg.org/lindenii/furgit/object/store/dual"
objectloose "codeberg.org/lindenii/furgit/object/store/loose"
- objectmix "codeberg.org/lindenii/furgit/object/store/mix"
objectpacked "codeberg.org/lindenii/furgit/object/store/packed"
)
@@ -26,7 +25,7 @@ func openObjectStore(
root *os.Root,
algo objectid.Algorithm,
) (
- objects objectstore.Reader,
+ objects *objectdual.Dual,
objectsRoot *os.Root,
objectsPackRoot *os.Root,
objectsLoose *objectloose.Store,
@@ -45,32 +44,39 @@ func openObjectStore(
return nil, nil, nil, nil, nil, err
}
- backends := []objectstore.Reader{objectsLoose}
+ err = objectsRoot.Mkdir("pack", 0o755)
+ if err != nil && !os.IsExist(err) {
+ _ = objectsLoose.Close()
+ _ = objectsRoot.Close()
+
+ return nil, nil, nil, nil, nil, fmt.Errorf("repository: create objects/pack: %w", err)
+ }
objectsPackRoot, err = objectsRoot.OpenRoot("pack")
- if err == nil {
- objectsPacked, err = objectpacked.New(
- objectsPackRoot,
- algo,
- objectpacked.Options{RefreshPolicy: objectpacked.RefreshPolicyNever},
- )
- if err != nil {
- _ = objectsPackRoot.Close()
- _ = objectsLoose.Close()
- _ = objectsRoot.Close()
+ if err != nil {
+ _ = objectsLoose.Close()
+ _ = objectsRoot.Close()
- return nil, nil, nil, nil, nil, err
- }
+ return nil, nil, nil, nil, nil, fmt.Errorf("repository: open objects/pack: %w", err)
+ }
- backends = append(backends, objectsPacked)
- } else if !errors.Is(err, os.ErrNotExist) {
+ objectsPacked, err = objectpacked.New(
+ objectsPackRoot,
+ algo,
+ objectpacked.Options{
+ RefreshPolicy: objectpacked.RefreshPolicyNever,
+ WriteRev: true,
+ },
+ )
+ if err != nil {
+ _ = objectsPackRoot.Close()
_ = objectsLoose.Close()
_ = objectsRoot.Close()
- return nil, nil, nil, nil, nil, fmt.Errorf("repository: open objects/pack: %w", err)
+ return nil, nil, nil, nil, nil, err
}
- objects = objectmix.New(backends...)
+ objects = objectdual.New(objectsLoose, objectsPacked)
return objects, objectsRoot, objectsPackRoot, objectsLoose, objectsPacked, nil
}
@@ -78,12 +84,17 @@ func openObjectStore(
// Objects returns the configured object store.
//
// Use Objects for direct object-ID lookups, object headers, sizes, raw object
-// bytes, or streamed object contents. Callers who want typed object values
-// should usually prefer [Repository.Fetcher].
+// bytes, streamed object contents, object writes, pack ingestion, and
+// coordinated quarantines. Callers who want typed object values should usually
+// prefer [Repository.Fetcher].
//
// Labels: Life-Parent.
//
//nolint:ireturn
-func (repo *Repository) Objects() objectstore.Reader {
+func (repo *Repository) Objects() interface {
+ objectstore.Reader
+ objectstore.Writer
+ objectstore.Quarantiner
+} {
return repo.objects
}
diff --git a/repository/repository.go b/repository/repository.go
index 6b588df1..0cda1077 100644
--- a/repository/repository.go
+++ b/repository/repository.go
@@ -15,7 +15,7 @@ import (
commitgraphread "codeberg.org/lindenii/furgit/format/commitgraph/read"
"codeberg.org/lindenii/furgit/object/fetch"
objectid "codeberg.org/lindenii/furgit/object/id"
- objectstore "codeberg.org/lindenii/furgit/object/store"
+ objectdual "codeberg.org/lindenii/furgit/object/store/dual"
objectloose "codeberg.org/lindenii/furgit/object/store/loose"
objectpacked "codeberg.org/lindenii/furgit/object/store/packed"
refstore "codeberg.org/lindenii/furgit/ref/store"
@@ -32,7 +32,7 @@ type Repository struct {
config *config.Config
algo objectid.Algorithm
- objects objectstore.Reader
+ objects *objectdual.Dual
fetcher *fetch.Fetcher
objectsRoot *os.Root
objectsPackRoot *os.Root
diff --git a/repository/write_loose.go b/repository/write_loose.go
deleted file mode 100644
index eeade86f..00000000
--- a/repository/write_loose.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package repository
-
-import (
- objectloose "codeberg.org/lindenii/furgit/object/store/loose"
-)
-
-// LooseStoreForWriting returns the repository's loose-object writer.
-//
-// Labels: Life-Parent, Close-No.
-func (repo *Repository) LooseStoreForWriting() *objectloose.Store {
- return repo.objectsLoose
-}
diff --git a/repository/write_loose_test.go b/repository/write_loose_test.go
index a0354f98..d1fa479c 100644
--- a/repository/write_loose_test.go
+++ b/repository/write_loose_test.go
@@ -23,7 +23,7 @@ func TestWriteLooseBytesContent(t *testing.T) {
content := []byte("write-loose-bytes-content\n")
- gotID, err := repo.LooseStoreForWriting().WriteBytesContent(objecttype.TypeBlob, content)
+ gotID, err := repo.Objects().WriteBytesContent(objecttype.TypeBlob, content)
if err != nil {
t.Fatalf("WriteLooseBytesContent: %v", err)
}
@@ -62,7 +62,7 @@ func TestWriteLooseReaderContent(t *testing.T) {
content := []byte("write-loose-reader-content\n")
- gotID, err := repo.LooseStoreForWriting().WriteReaderContent(objecttype.TypeBlob, int64(len(content)), bytes.NewReader(content))
+ gotID, err := repo.Objects().WriteReaderContent(objecttype.TypeBlob, int64(len(content)), bytes.NewReader(content))
if err != nil {
t.Fatalf("WriteLooseReaderContent: %v", err)
}
@@ -92,7 +92,7 @@ func TestWriteLooseFull(t *testing.T) {
t.Fatalf("ReadStoredBytesFull: %v", err)
}
- idFromBytes, err := repo.LooseStoreForWriting().WriteBytesFull(raw)
+ idFromBytes, err := repo.Objects().WriteBytesFull(raw)
if err != nil {
t.Fatalf("WriteLooseBytesFull: %v", err)
}
@@ -101,7 +101,7 @@ func TestWriteLooseFull(t *testing.T) {
t.Fatalf("WriteLooseBytesFull id = %s, want %s", idFromBytes, commitID)
}
- idFromReader, err := repo.LooseStoreForWriting().WriteReaderFull(bytes.NewReader(raw))
+ idFromReader, err := repo.Objects().WriteReaderFull(bytes.NewReader(raw))
if err != nil {
t.Fatalf("WriteLooseReaderFull: %v", err)
}