aboutsummaryrefslogtreecommitdiff
path: root/commitquery/query_resolve_graph_pos.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-29 14:42:13 +0000
committerGravatar Runxi Yu2026-03-29 14:47:04 +0000
commitdf73a4c6f1b58075316ba7449fbfb127b9fbb79d (patch)
tree62fee259ec037410b06419ee3ac9c2c189c35ab3 /commitquery/query_resolve_graph_pos.go
parentinternal/priorityqueue: Update docs (diff)
signatureNo signature
commitquery: Reorganize
Diffstat (limited to 'commitquery/query_resolve_graph_pos.go')
-rw-r--r--commitquery/query_resolve_graph_pos.go40
1 files changed, 40 insertions, 0 deletions
diff --git a/commitquery/query_resolve_graph_pos.go b/commitquery/query_resolve_graph_pos.go
new file mode 100644
index 00000000..dce8fc22
--- /dev/null
+++ b/commitquery/query_resolve_graph_pos.go
@@ -0,0 +1,40 @@
+package commitquery
+
+import commitgraphread "codeberg.org/lindenii/furgit/format/commitgraph/read"
+
+// resolveGraphPos resolves one commit-graph position to one internal query node.
+func (query *query) resolveGraphPos(pos commitgraphread.Position) (nodeIndex, error) {
+ idx, ok := query.byGraphPos[pos]
+ if ok {
+ err := query.ensureLoaded(idx)
+ if err != nil {
+ return 0, err
+ }
+
+ return idx, nil
+ }
+
+ commit, err := query.graph.CommitAt(pos)
+ if err != nil {
+ return 0, err
+ }
+
+ idx, ok = query.byOID[commit.OID]
+ if !ok {
+ idx = query.newNode(commit.OID)
+ query.byOID[commit.OID] = idx
+ }
+
+ query.byGraphPos[pos] = idx
+ query.nodes[idx].graphPos = pos
+ query.nodes[idx].hasGraphPos = true
+
+ err = query.loadCommitAtGraphPos(idx, pos)
+ if err != nil {
+ delete(query.byGraphPos, pos)
+
+ return 0, err
+ }
+
+ return idx, nil
+}