|
@@ -366,6 +366,7 @@ func collapseFastForwards(
|
|
|
continue
|
|
|
}
|
|
|
toRemove := map[plumbing.Hash]bool{}
|
|
|
+ sort.Slice(vals, func(i, j int) bool { return vals[i].Hash.String() < vals[j].Hash.String() })
|
|
|
for _, child := range vals {
|
|
|
var queue []plumbing.Hash
|
|
|
visited := map[plumbing.Hash]bool{child.Hash: true}
|
|
@@ -405,13 +406,14 @@ func collapseFastForwards(
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ break
|
|
|
}
|
|
|
- break
|
|
|
- }
|
|
|
- for parent := range parents[head] {
|
|
|
- if !visited[parent] {
|
|
|
- visited[head] = true
|
|
|
- queue = append(queue, parent)
|
|
|
+ } else {
|
|
|
+ for parent := range parents[head] {
|
|
|
+ if !visited[parent] {
|
|
|
+ visited[head] = true
|
|
|
+ queue = append(queue, parent)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -419,6 +421,7 @@ func collapseFastForwards(
|
|
|
if len(toRemove) == 0 {
|
|
|
continue
|
|
|
}
|
|
|
+
|
|
|
// update dag
|
|
|
var newVals []*object.Commit
|
|
|
node := mergedSeq[key][len(mergedSeq[key])-1].Hash
|
|
@@ -457,6 +460,12 @@ func collapseFastForwards(
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ // update parents
|
|
|
+ for rm := range toRemove {
|
|
|
+ delete(parents[rm], key)
|
|
|
+ }
|
|
|
+
|
|
|
if !merged {
|
|
|
mergedDag[key] = newVals
|
|
|
} else {
|
|
@@ -494,7 +503,7 @@ func generatePlan(
|
|
|
branch = -1
|
|
|
}
|
|
|
}
|
|
|
- branchExists := func() bool { return branch >= 0 }
|
|
|
+ branchExists := func() bool { return branch >= rootBranchIndex }
|
|
|
appendCommit := func(c *object.Commit, branch int) {
|
|
|
if branch == 0 {
|
|
|
log.Panicf("setting a zero branch for %s", c.Hash.String())
|
|
@@ -505,9 +514,9 @@ func generatePlan(
|
|
|
Items: []int{branch},
|
|
|
})
|
|
|
}
|
|
|
- appendMergeIfNeeded := func() {
|
|
|
+ appendMergeIfNeeded := func() bool {
|
|
|
if len(parents[commit.Hash]) < 2 {
|
|
|
- return
|
|
|
+ return false
|
|
|
}
|
|
|
// merge after the merge commit (the first in the sequence)
|
|
|
var items []int
|
|
@@ -539,13 +548,14 @@ func generatePlan(
|
|
|
branch = minBranch
|
|
|
branches[commit.Hash] = minBranch
|
|
|
} else if !branchExists() {
|
|
|
- log.Panicf("!branchExists(%s)", commit.Hash.String())
|
|
|
+ log.Panicf("failed to assign the branch to merge %s", commit.Hash.String())
|
|
|
}
|
|
|
plan = append(plan, runAction{
|
|
|
Action: runActionMerge,
|
|
|
Commit: nil,
|
|
|
Items: items,
|
|
|
})
|
|
|
+ return true
|
|
|
}
|
|
|
var head plumbing.Hash
|
|
|
if subseq, exists := mergedSeq[commit.Hash]; exists {
|
|
@@ -554,7 +564,10 @@ func generatePlan(
|
|
|
appendCommit(offspring, branch)
|
|
|
}
|
|
|
if subseqIndex == 0 {
|
|
|
- appendMergeIfNeeded()
|
|
|
+ if !appendMergeIfNeeded() && !branchExists() {
|
|
|
+ log.Panicf("head of the sequence does not have an assigned branch: %s",
|
|
|
+ commit.Hash.String())
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
head = subseq[len(subseq)-1].Hash
|