From ecdae2b758ef6849222525c941574bbac13ea85c Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sun, 29 Mar 2026 15:00:06 +0000 Subject: commitquery: Use fetcher --- commitquery/queries.go | 8 ++--- commitquery/queries_acquire.go | 2 +- .../queries_is_ancestor_integration_test.go | 9 +++--- commitquery/queries_is_ancestor_unit_test.go | 7 +++-- .../queries_merge_bases_integration_test.go | 11 +++---- commitquery/queries_merge_bases_unit_test.go | 13 ++++---- commitquery/queries_new.go | 8 ++--- commitquery/query.go | 6 ++-- commitquery/query_load_by_oid.go | 18 +++++------ commitquery/query_new.go | 8 ++--- commitquery/query_resolve_commitish.go | 35 ++++++++++++++++++---- 11 files changed, 76 insertions(+), 49 deletions(-) (limited to 'commitquery') 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, + } + } + } } -- cgit v1.3.1-10-gc9f91