aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--commitquery/marks.go18
-rw-r--r--commitquery/merge_bases.go82
-rw-r--r--commitquery/paint.go55
-rw-r--r--commitquery/priority_queue.go11
4 files changed, 84 insertions, 82 deletions
diff --git a/commitquery/marks.go b/commitquery/marks.go
index de008789..401acb15 100644
--- a/commitquery/marks.go
+++ b/commitquery/marks.go
@@ -69,3 +69,21 @@ func (query *Query) trackTouched(idx nodeIndex) {
query.nodes[idx].touchedPhase = query.markPhase
query.touched = append(query.touched, idx)
}
+
+func (query *Query) collectMarkedResults() []nodeIndex {
+ out := make([]nodeIndex, 0, 4)
+
+ for _, idx := range query.touched {
+ if !query.hasAnyMarks(idx, markResult) {
+ continue
+ }
+
+ if query.hasAnyMarks(idx, markStale) {
+ continue
+ }
+
+ out = append(out, idx)
+ }
+
+ return out
+}
diff --git a/commitquery/merge_bases.go b/commitquery/merge_bases.go
index b7021814..0e410709 100644
--- a/commitquery/merge_bases.go
+++ b/commitquery/merge_bases.go
@@ -87,85 +87,3 @@ func (query *Query) mergeBases(left, right nodeIndex) ([]nodeIndex, error) {
return reduced, nil
}
-
-func (query *Query) paintDownToCommon(left nodeIndex, rights []nodeIndex, minGeneration uint64) error {
- query.beginMarkPhase()
-
- query.setMarks(left, markLeft)
-
- if len(rights) == 0 {
- query.setMarks(left, markResult)
-
- return nil
- }
-
- queue := newPriorityQueue(query)
- queue.PushNode(left)
-
- for _, right := range rights {
- query.setMarks(right, markRight)
- queue.PushNode(right)
- }
-
- lastGeneration := generationInfinity
-
- for query.queueHasNonStale(queue) {
- idx := queue.PopNode()
-
- generation := query.effectiveGeneration(idx)
- if generation > lastGeneration {
- return errBadGenerationOrder
- }
-
- lastGeneration = generation
- if generation < minGeneration {
- break
- }
-
- flags := query.marks(idx) & (markLeft | markRight | markStale)
- if flags == (markLeft | markRight) {
- query.setMarks(idx, markResult)
-
- flags |= markStale
- }
-
- for _, parent := range query.parents(idx) {
- if query.hasAllMarks(parent, flags) {
- continue
- }
-
- query.setMarks(parent, flags)
- queue.PushNode(parent)
- }
- }
-
- return nil
-}
-
-func (query *Query) queueHasNonStale(queue *priorityQueue) bool {
- for _, idx := range queue.items {
- if !query.hasAnyMarks(idx, markStale) {
- return true
- }
- }
-
- return false
-}
-
-func (query *Query) collectMarkedResults() []nodeIndex {
- out := make([]nodeIndex, 0, 4)
-
- for _, idx := range query.touched {
- if !query.hasAnyMarks(idx, markResult) {
- continue
- }
-
- if query.hasAnyMarks(idx, markStale) {
- continue
- }
-
- out = append(out, idx)
- }
-
- return out
-}
diff --git a/commitquery/paint.go b/commitquery/paint.go
new file mode 100644
index 00000000..90b38b10
--- /dev/null
+++ b/commitquery/paint.go
@@ -0,0 +1,55 @@
+package commitquery
+
+func (query *Query) paintDownToCommon(left nodeIndex, rights []nodeIndex, minGeneration uint64) error {
+ query.beginMarkPhase()
+
+ query.setMarks(left, markLeft)
+
+ if len(rights) == 0 {
+ query.setMarks(left, markResult)
+
+ return nil
+ }
+
+ queue := newPriorityQueue(query)
+ queue.PushNode(left)
+
+ for _, right := range rights {
+ query.setMarks(right, markRight)
+ queue.PushNode(right)
+ }
+
+ lastGeneration := generationInfinity
+
+ for query.queueHasNonStale(queue) {
+ idx := queue.PopNode()
+
+ generation := query.effectiveGeneration(idx)
+ if generation > lastGeneration {
+ return errBadGenerationOrder
+ }
+
+ lastGeneration = generation
+ if generation < minGeneration {
+ break
+ }
+
+ flags := query.marks(idx) & (markLeft | markRight | markStale)
+ if flags == (markLeft | markRight) {
+ query.setMarks(idx, markResult)
+
+ flags |= markStale
+ }
+
+ for _, parent := range query.parents(idx) {
+ if query.hasAllMarks(parent, flags) {
+ continue
+ }
+
+ query.setMarks(parent, flags)
+ queue.PushNode(parent)
+ }
+ }
+
+ return nil
+}
diff --git a/commitquery/priority_queue.go b/commitquery/priority_queue.go
index 0ca57f7d..0d948c64 100644
--- a/commitquery/priority_queue.go
+++ b/commitquery/priority_queue.go
@@ -66,3 +66,14 @@ func (queue *priorityQueue) PopNode() nodeIndex {
return idx
}
+
+func (query *Query) queueHasNonStale(queue *priorityQueue) bool {
+ // TODO
+ for _, idx := range queue.items {
+ if !query.hasAnyMarks(idx, markStale) {
+ return true
+ }
+ }
+
+ return false
+}