aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--commitquery/bits.go14
-rw-r--r--commitquery/load.go57
-rw-r--r--commitquery/marks.go13
-rw-r--r--commitquery/node.go14
-rw-r--r--commitquery/node_commit_time.go5
-rw-r--r--commitquery/node_compare.go (renamed from commitquery/compare.go)0
-rw-r--r--commitquery/node_generation.go (renamed from commitquery/generation.go)2
-rw-r--r--commitquery/node_id.go7
-rw-r--r--commitquery/node_index.go4
-rw-r--r--commitquery/node_new.go14
-rw-r--r--commitquery/node_paint_down_to_common.go (renamed from commitquery/paint.go)0
-rw-r--r--commitquery/node_parent.go (renamed from commitquery/parent.go)10
-rw-r--r--commitquery/node_populate.go (renamed from commitquery/populate.go)0
-rw-r--r--commitquery/oid.go101
-rw-r--r--commitquery/reduce.go4
-rw-r--r--commitquery/resolve.go39
16 files changed, 147 insertions, 137 deletions
diff --git a/commitquery/bits.go b/commitquery/bits.go
deleted file mode 100644
index 36ffff29..00000000
--- a/commitquery/bits.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package commitquery
-
-type markBits uint8
-
-const (
- markLeft markBits = 1 << iota
- markRight
- markStale
- markResult
-)
-
-const (
- allMarks = markLeft | markRight | markStale | markResult
-)
diff --git a/commitquery/load.go b/commitquery/load.go
index be39c7d9..076f3000 100644
--- a/commitquery/load.go
+++ b/commitquery/load.go
@@ -1,5 +1,15 @@
package commitquery
+import (
+ stderrors "errors"
+
+ giterrors "codeberg.org/lindenii/furgit/errors"
+ commitgraphread "codeberg.org/lindenii/furgit/format/commitgraph/read"
+ objectcommit "codeberg.org/lindenii/furgit/object/commit"
+ objectstore "codeberg.org/lindenii/furgit/object/store"
+ objecttype "codeberg.org/lindenii/furgit/object/type"
+)
+
// ensureLoaded completes one node's metadata load if it has not been loaded yet.
func (query *query) ensureLoaded(idx nodeIndex) error {
if query.nodes[idx].loaded {
@@ -12,3 +22,50 @@ func (query *query) ensureLoaded(idx nodeIndex) error {
return query.loadByOID(idx)
}
+
+// loadByOID populates one node from an object ID.
+func (query *query) loadByOID(idx nodeIndex) error {
+ id := query.nodes[idx].id
+
+ if query.graph != nil {
+ pos, err := query.graph.Lookup(id)
+ if err != nil {
+ if _, ok := stderrors.AsType[*commitgraphread.NotFoundError](err); !ok {
+ return err
+ }
+ } else {
+ return query.loadCommitAtGraphPos(idx, pos)
+ }
+ }
+
+ ty, content, err := query.store.ReadBytesContent(id)
+ if err != nil {
+ if stderrors.Is(err, objectstore.ErrObjectNotFound) {
+ return &giterrors.ObjectMissingError{OID: id}
+ }
+
+ 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
+ }
+
+ parents := make([]parentRef, 0, len(commitObj.Parents))
+ for _, parentID := range commitObj.Parents {
+ parents = append(parents, parentRef{ID: parentID})
+ }
+
+ commit := commitData{
+ ID: id,
+ Parents: parents,
+ CommitTime: commitObj.Committer.WhenUnix,
+ }
+
+ return query.populateNode(idx, commit)
+}
diff --git a/commitquery/marks.go b/commitquery/marks.go
index 43ca9f44..2d0b013f 100644
--- a/commitquery/marks.go
+++ b/commitquery/marks.go
@@ -87,3 +87,16 @@ func (query *query) collectMarkedResults() []nodeIndex {
return out
}
+
+type markBits uint8
+
+const (
+ markLeft markBits = 1 << iota
+ markRight
+ markStale
+ markResult
+)
+
+const (
+ allMarks = markLeft | markRight | markStale | markResult
+)
diff --git a/commitquery/node.go b/commitquery/node.go
index d5f1d3cd..7432a719 100644
--- a/commitquery/node.go
+++ b/commitquery/node.go
@@ -5,9 +5,6 @@ import (
objectid "codeberg.org/lindenii/furgit/object/id"
)
-// nodeIndex identifies one internal query node.
-type nodeIndex int
-
// node stores one mutable commit traversal node.
type node struct {
id objectid.ObjectID
@@ -26,14 +23,3 @@ type node struct {
touchedPhase uint32
}
-
-// newNode allocates one empty internal node.
-func (query *query) newNode(id objectid.ObjectID) nodeIndex {
- count := len(query.nodes)
-
- idx := nodeIndex(count)
-
- query.nodes = append(query.nodes, node{id: id})
-
- return idx
-}
diff --git a/commitquery/node_commit_time.go b/commitquery/node_commit_time.go
new file mode 100644
index 00000000..3c42673d
--- /dev/null
+++ b/commitquery/node_commit_time.go
@@ -0,0 +1,5 @@
+package commitquery
+
+func (query *query) commitTime(idx nodeIndex) int64 {
+ return query.nodes[idx].commitTime
+}
diff --git a/commitquery/compare.go b/commitquery/node_compare.go
index 7ae984dc..7ae984dc 100644
--- a/commitquery/compare.go
+++ b/commitquery/node_compare.go
diff --git a/commitquery/generation.go b/commitquery/node_generation.go
index 935da104..b04f3762 100644
--- a/commitquery/generation.go
+++ b/commitquery/node_generation.go
@@ -19,7 +19,7 @@ const (
generationInfinity = uint64(math.MaxUint64)
)
-func compareByGeneration(query *query) func(nodeIndex, nodeIndex) int {
+func (query *query) compareByGeneration() func(nodeIndex, nodeIndex) int {
return func(left, right nodeIndex) int {
leftGeneration := query.effectiveGeneration(left)
rightGeneration := query.effectiveGeneration(right)
diff --git a/commitquery/node_id.go b/commitquery/node_id.go
new file mode 100644
index 00000000..c1d82f38
--- /dev/null
+++ b/commitquery/node_id.go
@@ -0,0 +1,7 @@
+package commitquery
+
+import objectid "codeberg.org/lindenii/furgit/object/id"
+
+func (query *query) id(idx nodeIndex) objectid.ObjectID {
+ return query.nodes[idx].id
+}
diff --git a/commitquery/node_index.go b/commitquery/node_index.go
new file mode 100644
index 00000000..06122d62
--- /dev/null
+++ b/commitquery/node_index.go
@@ -0,0 +1,4 @@
+package commitquery
+
+// nodeIndex identifies one internal query node.
+type nodeIndex int
diff --git a/commitquery/node_new.go b/commitquery/node_new.go
new file mode 100644
index 00000000..14a35262
--- /dev/null
+++ b/commitquery/node_new.go
@@ -0,0 +1,14 @@
+package commitquery
+
+import objectid "codeberg.org/lindenii/furgit/object/id"
+
+// newNode allocates one empty internal node.
+func (query *query) newNode(id objectid.ObjectID) nodeIndex {
+ count := len(query.nodes)
+
+ idx := nodeIndex(count)
+
+ query.nodes = append(query.nodes, node{id: id})
+
+ return idx
+}
diff --git a/commitquery/paint.go b/commitquery/node_paint_down_to_common.go
index 6bb1f489..6bb1f489 100644
--- a/commitquery/paint.go
+++ b/commitquery/node_paint_down_to_common.go
diff --git a/commitquery/parent.go b/commitquery/node_parent.go
index fe0f4fba..17224701 100644
--- a/commitquery/parent.go
+++ b/commitquery/node_parent.go
@@ -5,6 +5,11 @@ import (
objectid "codeberg.org/lindenii/furgit/object/id"
)
+// Parents returns resolved parent node indices for one internal node.
+func (query *query) parents(idx nodeIndex) []nodeIndex {
+ return query.nodes[idx].parents
+}
+
// parentRef references one commit parent.
type parentRef struct {
ID objectid.ObjectID
@@ -12,11 +17,6 @@ type parentRef struct {
HasGraphPos bool
}
-// Parents returns resolved parent node indices for one internal node.
-func (query *query) parents(idx nodeIndex) []nodeIndex {
- return query.nodes[idx].parents
-}
-
// resolveParent resolves one parent descriptor to one internal node.
func (query *query) resolveParent(parent parentRef) (nodeIndex, error) {
if parent.HasGraphPos {
diff --git a/commitquery/populate.go b/commitquery/node_populate.go
index 26fb5629..26fb5629 100644
--- a/commitquery/populate.go
+++ b/commitquery/node_populate.go
diff --git a/commitquery/oid.go b/commitquery/oid.go
deleted file mode 100644
index fd524dfb..00000000
--- a/commitquery/oid.go
+++ /dev/null
@@ -1,101 +0,0 @@
-package commitquery
-
-import (
- stderrors "errors"
-
- giterrors "codeberg.org/lindenii/furgit/errors"
- commitgraphread "codeberg.org/lindenii/furgit/format/commitgraph/read"
- "codeberg.org/lindenii/furgit/internal/peel"
- objectcommit "codeberg.org/lindenii/furgit/object/commit"
- objectid "codeberg.org/lindenii/furgit/object/id"
- objectstore "codeberg.org/lindenii/furgit/object/store"
- objecttype "codeberg.org/lindenii/furgit/object/type"
-)
-
-func (query *query) id(idx nodeIndex) objectid.ObjectID {
- return query.nodes[idx].id
-}
-
-func (query *query) commitTime(idx nodeIndex) int64 {
- return query.nodes[idx].commitTime
-}
-
-func (query *query) resolveOID(id objectid.ObjectID) (nodeIndex, error) {
- idx, ok := query.byOID[id]
- if ok {
- err := query.ensureLoaded(idx)
- if err != nil {
- return 0, err
- }
-
- return idx, nil
- }
-
- idx = query.newNode(id)
- query.byOID[id] = idx
-
- err := query.loadByOID(idx)
- if err != nil {
- delete(query.byOID, id)
-
- return 0, err
- }
-
- return idx, nil
-}
-
-func (query *query) resolveCommitish(id objectid.ObjectID) (nodeIndex, error) {
- commitID, err := peel.ToCommit(query.store, id)
- if err != nil {
- return 0, err
- }
-
- return query.resolveOID(commitID)
-}
-
-// loadByOID populates one node from an object ID.
-func (query *query) loadByOID(idx nodeIndex) error {
- id := query.nodes[idx].id
-
- if query.graph != nil {
- pos, err := query.graph.Lookup(id)
- if err != nil {
- if _, ok := stderrors.AsType[*commitgraphread.NotFoundError](err); !ok {
- return err
- }
- } else {
- return query.loadCommitAtGraphPos(idx, pos)
- }
- }
-
- ty, content, err := query.store.ReadBytesContent(id)
- if err != nil {
- if stderrors.Is(err, objectstore.ErrObjectNotFound) {
- return &giterrors.ObjectMissingError{OID: id}
- }
-
- 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
- }
-
- parents := make([]parentRef, 0, len(commitObj.Parents))
- for _, parentID := range commitObj.Parents {
- parents = append(parents, parentRef{ID: parentID})
- }
-
- commit := commitData{
- ID: id,
- Parents: parents,
- CommitTime: commitObj.Committer.WhenUnix,
- }
-
- return query.populateNode(idx, commit)
-}
diff --git a/commitquery/reduce.go b/commitquery/reduce.go
index f8a86f69..46c3bf39 100644
--- a/commitquery/reduce.go
+++ b/commitquery/reduce.go
@@ -74,7 +74,7 @@ func removeRedundantNoGen(query *query, candidates []nodeIndex) ([]nodeIndex, er
func removeRedundantWithGen(query *query, candidates []nodeIndex) []nodeIndex {
sorted := append([]nodeIndex(nil), candidates...)
- slices.SortFunc(sorted, compareByGeneration(query))
+ slices.SortFunc(sorted, query.compareByGeneration())
minGeneration := query.effectiveGeneration(sorted[0])
minGenPos := 0
@@ -97,7 +97,7 @@ func removeRedundantWithGen(query *query, candidates []nodeIndex) []nodeIndex {
}
}
- slices.SortFunc(walkStart, compareByGeneration(query))
+ slices.SortFunc(walkStart, query.compareByGeneration())
for _, idx := range walkStart {
query.clearMarks(idx, markStale)
diff --git a/commitquery/resolve.go b/commitquery/resolve.go
new file mode 100644
index 00000000..cd6c3650
--- /dev/null
+++ b/commitquery/resolve.go
@@ -0,0 +1,39 @@
+package commitquery
+
+import (
+ "codeberg.org/lindenii/furgit/internal/peel"
+ objectid "codeberg.org/lindenii/furgit/object/id"
+)
+
+func (query *query) resolveOID(id objectid.ObjectID) (nodeIndex, error) {
+ idx, ok := query.byOID[id]
+ if ok {
+ err := query.ensureLoaded(idx)
+ if err != nil {
+ return 0, err
+ }
+
+ return idx, nil
+ }
+
+ idx = query.newNode(id)
+ query.byOID[id] = idx
+
+ err := query.loadByOID(idx)
+ if err != nil {
+ delete(query.byOID, id)
+
+ return 0, err
+ }
+
+ return idx, nil
+}
+
+func (query *query) resolveCommitish(id objectid.ObjectID) (nodeIndex, error) {
+ commitID, err := peel.ToCommit(query.store, id)
+ if err != nil {
+ return 0, err
+ }
+
+ return query.resolveOID(commitID)
+}