aboutsummaryrefslogtreecommitdiff
path: root/commitquery/node_generation.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-29 13:38:19 +0000
committerGravatar Runxi Yu2026-03-29 13:39:49 +0000
commit37707aada0157f255dbad920b917efb601184e12 (patch)
tree29f79d242c764de8d6f1e65bcc847e53f21cd646 /commitquery/node_generation.go
parentcommitquery: Context has been gone long ago (diff)
signatureNo signature
commitquery: Reorganize
Diffstat (limited to 'commitquery/node_generation.go')
-rw-r--r--commitquery/node_generation.go43
1 files changed, 43 insertions, 0 deletions
diff --git a/commitquery/node_generation.go b/commitquery/node_generation.go
new file mode 100644
index 00000000..b04f3762
--- /dev/null
+++ b/commitquery/node_generation.go
@@ -0,0 +1,43 @@
+package commitquery
+
+import (
+ "math"
+
+ objectid "codeberg.org/lindenii/furgit/object/id"
+)
+
+// EffectiveGeneration returns one node's generation value.
+func (query *query) effectiveGeneration(idx nodeIndex) uint64 {
+ if !query.nodes[idx].hasGeneration {
+ return generationInfinity
+ }
+
+ return query.nodes[idx].generation
+}
+
+const (
+ generationInfinity = uint64(math.MaxUint64)
+)
+
+func (query *query) compareByGeneration() func(nodeIndex, nodeIndex) int {
+ return func(left, right nodeIndex) int {
+ leftGeneration := query.effectiveGeneration(left)
+ rightGeneration := query.effectiveGeneration(right)
+
+ switch {
+ case leftGeneration < rightGeneration:
+ return -1
+ case leftGeneration > rightGeneration:
+ return 1
+ }
+
+ switch {
+ case query.nodes[left].commitTime < query.nodes[right].commitTime:
+ return -1
+ case query.nodes[left].commitTime > query.nodes[right].commitTime:
+ return 1
+ }
+
+ return objectid.Compare(query.nodes[left].id, query.nodes[right].id)
+ }
+}