aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--commitquery/queries.go8
-rw-r--r--commitquery/queries_acquire.go2
-rw-r--r--commitquery/queries_is_ancestor_integration_test.go9
-rw-r--r--commitquery/queries_is_ancestor_unit_test.go7
-rw-r--r--commitquery/queries_merge_bases_integration_test.go11
-rw-r--r--commitquery/queries_merge_bases_unit_test.go13
-rw-r--r--commitquery/queries_new.go8
-rw-r--r--commitquery/query.go6
-rw-r--r--commitquery/query_load_by_oid.go18
-rw-r--r--commitquery/query_new.go8
-rw-r--r--commitquery/query_resolve_commitish.go35
-rw-r--r--network/receivepack/hooks/reject_force_push.go3
-rw-r--r--repository/fetcher.go2
-rw-r--r--repository/open.go4
-rw-r--r--repository/repository.go2
15 files changed, 84 insertions, 52 deletions
diff --git a/commitquery/queries.go b/commitquery/queries.go
index 9eb6f0fa..33709783 100644
--- a/commitquery/queries.go
+++ b/commitquery/queries.go
@@ -4,18 +4,18 @@ import (
"sync"
commitgraphread "codeberg.org/lindenii/furgit/format/commitgraph/read"
- objectstore "codeberg.org/lindenii/furgit/object/store"
+ objectfetch "codeberg.org/lindenii/furgit/object/fetch"
)
-// Queries provides commit-domain queries over one object store
+// Queries provides commit-domain queries over one object fetcher
// and optional commit-graph reader.
//
// Queries reuses internal mutable query workers across operations.
//
// Labels: MT-Safe.
type Queries struct {
- store objectstore.ReadingStore
- graph *commitgraphread.Reader
+ fetcher *objectfetch.Fetcher
+ graph *commitgraphread.Reader
mu sync.Mutex
idle []*query
diff --git a/commitquery/queries_acquire.go b/commitquery/queries_acquire.go
index 2925010c..a3aa0e58 100644
--- a/commitquery/queries_acquire.go
+++ b/commitquery/queries_acquire.go
@@ -7,7 +7,7 @@ func (queries *Queries) acquire() *query {
count := len(queries.idle)
if count == 0 {
- return newQuery(queries.store, queries.graph)
+ return newQuery(queries.fetcher, queries.graph)
}
q := queries.idle[count-1]
diff --git a/commitquery/queries_is_ancestor_integration_test.go b/commitquery/queries_is_ancestor_integration_test.go
index 8db680e6..7e8886a9 100644
--- a/commitquery/queries_is_ancestor_integration_test.go
+++ b/commitquery/queries_is_ancestor_integration_test.go
@@ -7,6 +7,7 @@ import (
"codeberg.org/lindenii/furgit/commitquery"
giterrors "codeberg.org/lindenii/furgit/errors"
"codeberg.org/lindenii/furgit/internal/testgit"
+ "codeberg.org/lindenii/furgit/object/fetch"
objectid "codeberg.org/lindenii/furgit/object/id"
)
@@ -33,7 +34,7 @@ func TestIsMatchesGitMergeBase(t *testing.T) {
store := testRepo.OpenObjectStore(t)
- got, err := commitquery.New(store, nil).IsAncestor(c1, tag)
+ got, err := commitquery.New(fetch.New(store), nil).IsAncestor(c1, tag)
if err != nil {
t.Fatalf("Is(c1, tag): %v", err)
}
@@ -43,7 +44,7 @@ func TestIsMatchesGitMergeBase(t *testing.T) {
t.Fatalf("Is(c1, tag)=%v, want %v", got, want)
}
- got, err = commitquery.New(store, nil).IsAncestor(c3, c2)
+ got, err = commitquery.New(fetch.New(store), nil).IsAncestor(c3, c2)
if err != nil {
t.Fatalf("Is(c3, c2): %v", err)
}
@@ -78,7 +79,7 @@ func TestIsMatchesGitMergeBaseWithCommitGraph(t *testing.T) {
store := testRepo.OpenObjectStore(t)
graph := testRepo.OpenCommitGraph(t)
- got, err := commitquery.New(store, graph).IsAncestor(c1, c2)
+ got, err := commitquery.New(fetch.New(store), graph).IsAncestor(c1, c2)
if err != nil {
t.Fatalf("Is(c1, c2): %v", err)
}
@@ -106,7 +107,7 @@ func TestIsMissingObject(t *testing.T) {
store := testRepo.OpenObjectStore(t)
- _, err := commitquery.New(store, nil).IsAncestor(treeID, commitID)
+ _, err := commitquery.New(fetch.New(store), nil).IsAncestor(treeID, commitID)
if err == nil {
t.Fatal("expected error")
}
diff --git a/commitquery/queries_is_ancestor_unit_test.go b/commitquery/queries_is_ancestor_unit_test.go
index 8cb147a6..bc8fb995 100644
--- a/commitquery/queries_is_ancestor_unit_test.go
+++ b/commitquery/queries_is_ancestor_unit_test.go
@@ -7,6 +7,7 @@ import (
giterrors "codeberg.org/lindenii/furgit/errors"
"codeberg.org/lindenii/furgit/internal/testgit"
+ "codeberg.org/lindenii/furgit/object/fetch"
objectid "codeberg.org/lindenii/furgit/object/id"
"codeberg.org/lindenii/furgit/object/store/memory"
objecttree "codeberg.org/lindenii/furgit/object/tree"
@@ -71,7 +72,7 @@ func TestIs(t *testing.T) {
c3 := store.AddObject(objecttype.TypeCommit, ancestorCommitBody(otherTree))
tag := store.AddObject(objecttype.TypeTag, ancestorTagBody(c2, objecttype.TypeCommit))
- ok, err := commitquery.New(store, nil).IsAncestor(c1, tag)
+ ok, err := commitquery.New(fetch.New(store), nil).IsAncestor(c1, tag)
if err != nil {
t.Fatalf("Is(c1, tag): %v", err)
}
@@ -80,7 +81,7 @@ func TestIs(t *testing.T) {
t.Fatal("expected c1 to be ancestor of tag->c2")
}
- ok, err = commitquery.New(store, nil).IsAncestor(c3, c2)
+ ok, err = commitquery.New(fetch.New(store), nil).IsAncestor(c3, c2)
if err != nil {
t.Fatalf("Is(c3, c2): %v", err)
}
@@ -105,7 +106,7 @@ func TestIsRejectsNonCommitAfterPeel(t *testing.T) {
commit := store.AddObject(objecttype.TypeCommit, ancestorCommitBody(tree))
tagToTree := store.AddObject(objecttype.TypeTag, ancestorTagBody(tree, objecttype.TypeTree))
- _, err := commitquery.New(store, nil).IsAncestor(commit, tagToTree)
+ _, err := commitquery.New(fetch.New(store), nil).IsAncestor(commit, tagToTree)
if err == nil {
t.Fatal("expected error")
}
diff --git a/commitquery/queries_merge_bases_integration_test.go b/commitquery/queries_merge_bases_integration_test.go
index f19468eb..4fdfdf16 100644
--- a/commitquery/queries_merge_bases_integration_test.go
+++ b/commitquery/queries_merge_bases_integration_test.go
@@ -8,6 +8,7 @@ import (
"codeberg.org/lindenii/furgit/commitquery"
"codeberg.org/lindenii/furgit/internal/testgit"
+ "codeberg.org/lindenii/furgit/object/fetch"
objectid "codeberg.org/lindenii/furgit/object/id"
)
@@ -34,7 +35,7 @@ func TestQueryMatchesGitMergeBaseAll(t *testing.T) {
store := testRepo.OpenObjectStore(t)
- query := commitquery.New(store, nil)
+ query := commitquery.New(fetch.New(store), nil)
all, err := query.MergeBases(left, tag)
if err != nil {
@@ -77,7 +78,7 @@ func TestQueryCrissCrossMatchesGitMergeBaseAll(t *testing.T) {
store := testRepo.OpenObjectStore(t)
- query := commitquery.New(store, nil)
+ query := commitquery.New(fetch.New(store), nil)
all, err := query.MergeBases(left, right)
if err != nil {
@@ -138,7 +139,7 @@ func TestQueryMatchesGitMergeBaseAllWithCommitGraph(t *testing.T) {
store := testRepo.OpenObjectStore(t)
graph := testRepo.OpenCommitGraph(t)
- query := commitquery.New(store, graph)
+ query := commitquery.New(fetch.New(store), graph)
all, err := query.MergeBases(left, right)
if err != nil {
@@ -200,7 +201,7 @@ func TestBaseMatchesGitMergeBaseWithoutAll(t *testing.T) {
store := testRepo.OpenObjectStore(t)
- query := commitquery.New(store, nil)
+ query := commitquery.New(fetch.New(store), nil)
got, ok, err := query.MergeBase(left, right)
if err != nil {
@@ -222,7 +223,7 @@ func TestBaseMatchesGitMergeBaseWithoutAll(t *testing.T) {
graph := testRepo.OpenCommitGraph(t)
- got, ok, err = commitquery.New(store, graph).MergeBase(left, right)
+ got, ok, err = commitquery.New(fetch.New(store), graph).MergeBase(left, right)
if err != nil {
t.Fatalf("Base(left, right) with commit-graph: %v", err)
}
diff --git a/commitquery/queries_merge_bases_unit_test.go b/commitquery/queries_merge_bases_unit_test.go
index 4db4f548..596a5edc 100644
--- a/commitquery/queries_merge_bases_unit_test.go
+++ b/commitquery/queries_merge_bases_unit_test.go
@@ -10,6 +10,7 @@ import (
"codeberg.org/lindenii/furgit/commitquery"
giterrors "codeberg.org/lindenii/furgit/errors"
"codeberg.org/lindenii/furgit/internal/testgit"
+ "codeberg.org/lindenii/furgit/object/fetch"
objectid "codeberg.org/lindenii/furgit/object/id"
"codeberg.org/lindenii/furgit/object/store/memory"
"codeberg.org/lindenii/furgit/object/tree"
@@ -83,7 +84,7 @@ func TestQueryLinearHistory(t *testing.T) {
left := store.AddObject(objecttype.TypeCommit, commitBody(tree, base))
right := store.AddObject(objecttype.TypeCommit, commitBody(tree, left))
- query := commitquery.New(store, nil)
+ query := commitquery.New(fetch.New(store), nil)
got, err := query.MergeBases(left, right)
if err != nil {
@@ -130,7 +131,7 @@ func TestQueryPeelsAnnotatedTags(t *testing.T) {
right := store.AddObject(objecttype.TypeCommit, commitBody(rightTree, base))
tag := store.AddObject(objecttype.TypeTag, tagBody(right, objecttype.TypeCommit))
- query := commitquery.New(store, nil)
+ query := commitquery.New(fetch.New(store), nil)
got, err := query.MergeBases(left, tag)
if err != nil {
@@ -180,7 +181,7 @@ func TestQueryCrissCrossReturnsAllBestCommonAncestors(t *testing.T) {
left := store.AddObject(objecttype.TypeCommit, commitBody(leftTree, base1, base2))
right := store.AddObject(objecttype.TypeCommit, commitBody(rightTree, base2, base1))
- query := commitquery.New(store, nil)
+ query := commitquery.New(fetch.New(store), nil)
all, err := query.MergeBases(left, right)
if err != nil {
@@ -229,7 +230,7 @@ func TestQueryReturnsNoResultWhenNoCommonAncestorExists(t *testing.T) {
left := store.AddObject(objecttype.TypeCommit, commitBody(leftTree))
right := store.AddObject(objecttype.TypeCommit, commitBody(rightTree))
- query := commitquery.New(store, nil)
+ query := commitquery.New(fetch.New(store), nil)
got, err := query.MergeBases(left, right)
if err != nil {
@@ -265,7 +266,7 @@ func TestQueryRejectsNonCommitAfterPeel(t *testing.T) {
commit := store.AddObject(objecttype.TypeCommit, commitBody(tree))
tagToTree := store.AddObject(objecttype.TypeTag, tagBody(tree, objecttype.TypeTree))
- query := commitquery.New(store, nil)
+ query := commitquery.New(fetch.New(store), nil)
_, err := query.MergeBases(commit, tagToTree)
if err == nil {
@@ -298,7 +299,7 @@ func TestQueryAllIsRepeatable(t *testing.T) {
left := store.AddObject(objecttype.TypeCommit, commitBody(tree, base))
right := store.AddObject(objecttype.TypeCommit, commitBody(tree, left))
- query := commitquery.New(store, nil)
+ query := commitquery.New(fetch.New(store), nil)
first, err := query.MergeBases(left, right)
if err != nil {
diff --git a/commitquery/queries_new.go b/commitquery/queries_new.go
index 3c563c12..5eae7990 100644
--- a/commitquery/queries_new.go
+++ b/commitquery/queries_new.go
@@ -4,18 +4,18 @@ import (
"runtime"
commitgraphread "codeberg.org/lindenii/furgit/format/commitgraph/read"
- objectstore "codeberg.org/lindenii/furgit/object/store"
+ objectfetch "codeberg.org/lindenii/furgit/object/fetch"
)
-// New builds one concurrent-safe commit query service over one object store
+// New builds one concurrent-safe commit query service over one object fetcher
// and optional commit-graph reader.
//
// Labels: Deps-Borrowed, Life-Parent.
-func New(store objectstore.ReadingStore, graph *commitgraphread.Reader) *Queries {
+func New(fetcher *objectfetch.Fetcher, graph *commitgraphread.Reader) *Queries {
maxIdle := max(runtime.GOMAXPROCS(0), 1)
return &Queries{
- store: store,
+ fetcher: fetcher,
graph: graph,
maxIdle: maxIdle,
}
diff --git a/commitquery/query.go b/commitquery/query.go
index 5f184a5f..65e90ec8 100644
--- a/commitquery/query.go
+++ b/commitquery/query.go
@@ -2,16 +2,16 @@ package commitquery
import (
commitgraphread "codeberg.org/lindenii/furgit/format/commitgraph/read"
+ objectfetch "codeberg.org/lindenii/furgit/object/fetch"
objectid "codeberg.org/lindenii/furgit/object/id"
- objectstore "codeberg.org/lindenii/furgit/object/store"
)
// query stores one mutable reusable worker and its cached node arena.
//
// Labels: MT-Unsafe.
type query struct {
- store objectstore.ReadingStore
- graph *commitgraphread.Reader
+ fetcher *objectfetch.Fetcher
+ graph *commitgraphread.Reader
nodes []node
diff --git a/commitquery/query_load_by_oid.go b/commitquery/query_load_by_oid.go
index eb997b2d..b9860a05 100644
--- a/commitquery/query_load_by_oid.go
+++ b/commitquery/query_load_by_oid.go
@@ -5,7 +5,7 @@ import (
giterrors "codeberg.org/lindenii/furgit/errors"
commitgraphread "codeberg.org/lindenii/furgit/format/commitgraph/read"
- objectcommit "codeberg.org/lindenii/furgit/object/commit"
+ "codeberg.org/lindenii/furgit/object/commit"
objectstore "codeberg.org/lindenii/furgit/object/store"
objecttype "codeberg.org/lindenii/furgit/object/type"
)
@@ -25,7 +25,7 @@ func (query *query) loadByOID(idx nodeIndex) error {
}
}
- ty, content, err := query.store.ReadBytesContent(id)
+ obj, err := query.fetcher.ExactObject(id)
if err != nil {
if stderrors.Is(err, objectstore.ErrObjectNotFound) {
return &giterrors.ObjectMissingError{OID: id}
@@ -34,13 +34,13 @@ func (query *query) loadByOID(idx nodeIndex) error {
return err
}
- if ty != objecttype.TypeCommit {
- return &giterrors.ObjectTypeError{OID: id, Got: ty, Want: objecttype.TypeCommit}
- }
-
- commitObj, err := objectcommit.Parse(content, id.Algorithm())
- if err != nil {
- return err
+ commitObj, ok := obj.Object().(*commit.Commit)
+ if !ok {
+ return &giterrors.ObjectTypeError{
+ OID: id,
+ Got: obj.Object().ObjectType(),
+ Want: objecttype.TypeCommit,
+ }
}
parents := make([]parentRef, 0, len(commitObj.Parents))
diff --git a/commitquery/query_new.go b/commitquery/query_new.go
index 722f049e..0f23a321 100644
--- a/commitquery/query_new.go
+++ b/commitquery/query_new.go
@@ -2,16 +2,16 @@ package commitquery
import (
commitgraphread "codeberg.org/lindenii/furgit/format/commitgraph/read"
+ objectfetch "codeberg.org/lindenii/furgit/object/fetch"
objectid "codeberg.org/lindenii/furgit/object/id"
- objectstore "codeberg.org/lindenii/furgit/object/store"
)
-// newQuery builds one empty mutable worker over one object store and graph.
+// newQuery builds one empty mutable worker over one object fetcher and graph.
//
// Labels: Deps-Borrowed, Life-Parent.
-func newQuery(store objectstore.ReadingStore, graph *commitgraphread.Reader) *query {
+func newQuery(fetcher *objectfetch.Fetcher, graph *commitgraphread.Reader) *query {
return &query{
- store: store,
+ fetcher: fetcher,
graph: graph,
byOID: make(map[objectid.ObjectID]nodeIndex),
byGraphPos: make(map[commitgraphread.Position]nodeIndex),
diff --git a/commitquery/query_resolve_commitish.go b/commitquery/query_resolve_commitish.go
index 1b91c8bd..a9ad8bb5 100644
--- a/commitquery/query_resolve_commitish.go
+++ b/commitquery/query_resolve_commitish.go
@@ -1,16 +1,39 @@
package commitquery
import (
- "codeberg.org/lindenii/furgit/internal/peel"
+ stderrors "errors"
+
+ giterrors "codeberg.org/lindenii/furgit/errors"
+ "codeberg.org/lindenii/furgit/object/commit"
objectid "codeberg.org/lindenii/furgit/object/id"
+ objectstore "codeberg.org/lindenii/furgit/object/store"
+ "codeberg.org/lindenii/furgit/object/tag"
+ objecttype "codeberg.org/lindenii/furgit/object/type"
)
// resolveCommitish peels one commit-ish object ID and resolves the commit.
func (query *query) resolveCommitish(id objectid.ObjectID) (nodeIndex, error) {
- commitID, err := peel.ToCommit(query.store, id)
- if err != nil {
- return 0, err
- }
+ for {
+ obj, err := query.fetcher.ExactObject(id)
+ if err != nil {
+ if stderrors.Is(err, objectstore.ErrObjectNotFound) {
+ return 0, &giterrors.ObjectMissingError{OID: id}
+ }
- return query.resolveOID(commitID)
+ return 0, err
+ }
+
+ switch parsed := obj.Object().(type) {
+ case *commit.Commit:
+ return query.resolveOID(id)
+ case *tag.Tag:
+ id = parsed.Target
+ default:
+ return 0, &giterrors.ObjectTypeError{
+ OID: id,
+ Got: parsed.ObjectType(),
+ Want: objecttype.TypeCommit,
+ }
+ }
+ }
}
diff --git a/network/receivepack/hooks/reject_force_push.go b/network/receivepack/hooks/reject_force_push.go
index 5902ef73..ee71e96c 100644
--- a/network/receivepack/hooks/reject_force_push.go
+++ b/network/receivepack/hooks/reject_force_push.go
@@ -7,6 +7,7 @@ import (
"codeberg.org/lindenii/furgit/commitquery"
receivepack "codeberg.org/lindenii/furgit/network/receivepack"
+ "codeberg.org/lindenii/furgit/object/fetch"
objectmix "codeberg.org/lindenii/furgit/object/store/mix"
refstore "codeberg.org/lindenii/furgit/ref/store"
)
@@ -24,7 +25,7 @@ func RejectForcePush() receivepack.Hook {
defer func() { _ = objects.Close() }()
- queries := commitquery.New(objects, req.CommitGraph)
+ queries := commitquery.New(fetch.New(objects), req.CommitGraph)
decisions := make([]receivepack.UpdateDecision, len(req.Updates))
for i := range decisions {
diff --git a/repository/fetcher.go b/repository/fetcher.go
index 7c3ea421..ae3b9a7d 100644
--- a/repository/fetcher.go
+++ b/repository/fetcher.go
@@ -10,5 +10,5 @@ import "codeberg.org/lindenii/furgit/object/fetch"
//
// Labels: Life-Parent, Close-No.
func (repo *Repository) Fetcher() *fetch.Fetcher {
- return fetch.New(repo.objects)
+ return repo.fetcher
}
diff --git a/repository/open.go b/repository/open.go
index 3724df26..04aaa00c 100644
--- a/repository/open.go
+++ b/repository/open.go
@@ -5,6 +5,7 @@ import (
"os"
"codeberg.org/lindenii/furgit/commitquery"
+ "codeberg.org/lindenii/furgit/object/fetch"
reffiles "codeberg.org/lindenii/furgit/ref/store/files"
)
@@ -44,6 +45,7 @@ func Open(root *os.Root) (repo *Repository, err error) {
}
repo.objects = objects
+ repo.fetcher = fetch.New(objects)
repo.objectsRoot = objectsRoot
repo.objectsPackRoot = objectsPackRoot
repo.objectsLoose = objectsLoose
@@ -55,7 +57,7 @@ func Open(root *os.Root) (repo *Repository, err error) {
}
repo.commitGraph = commitGraph
- repo.commitQueries = commitquery.New(objects, commitGraph)
+ repo.commitQueries = commitquery.New(repo.fetcher, commitGraph)
refRoot, err := root.OpenRoot(".")
if err != nil {
diff --git a/repository/repository.go b/repository/repository.go
index 301607f9..df3075fb 100644
--- a/repository/repository.go
+++ b/repository/repository.go
@@ -13,6 +13,7 @@ import (
"codeberg.org/lindenii/furgit/commitquery"
"codeberg.org/lindenii/furgit/config"
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"
objectloose "codeberg.org/lindenii/furgit/object/store/loose"
@@ -32,6 +33,7 @@ type Repository struct {
algo objectid.Algorithm
objects objectstore.ReadingStore
+ fetcher *fetch.Fetcher
objectsRoot *os.Root
objectsPackRoot *os.Root
objectsLoose *objectloose.Store