diff options
Diffstat (limited to 'repository')
| -rw-r--r-- | repository/objects.go | 57 | ||||
| -rw-r--r-- | repository/repository.go | 4 | ||||
| -rw-r--r-- | repository/write_loose.go | 12 | ||||
| -rw-r--r-- | repository/write_loose_test.go | 8 |
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) } |
