Detect conflicts with 3way merge (#18536)
* Detect conflicts with 3way merge Unforunately git apply --3way reports conflicts differently than standard patches resulting in conflicts being missed. Adjust the conflict detection code to account for this different error reporting. Fix #18514 Signed-off-by: Andrew Thornton <art27@cantab.net> * and three-way failed Signed-off-by: Andrew Thornton <art27@cantab.net> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
This commit is contained in:
parent
5469e61a8e
commit
92e81e97e8
1 changed files with 13 additions and 0 deletions
|
@ -343,8 +343,10 @@ func checkConflicts(pr *models.PullRequest, gitRepo *git.Repository, tmpBasePath
|
||||||
if prConfig.IgnoreWhitespaceConflicts {
|
if prConfig.IgnoreWhitespaceConflicts {
|
||||||
args = append(args, "--ignore-whitespace")
|
args = append(args, "--ignore-whitespace")
|
||||||
}
|
}
|
||||||
|
is3way := false
|
||||||
if git.CheckGitVersionAtLeast("2.32.0") == nil {
|
if git.CheckGitVersionAtLeast("2.32.0") == nil {
|
||||||
args = append(args, "--3way")
|
args = append(args, "--3way")
|
||||||
|
is3way = true
|
||||||
}
|
}
|
||||||
args = append(args, patchPath)
|
args = append(args, patchPath)
|
||||||
pr.ConflictedFiles = make([]string, 0, 5)
|
pr.ConflictedFiles = make([]string, 0, 5)
|
||||||
|
@ -383,6 +385,9 @@ func checkConflicts(pr *models.PullRequest, gitRepo *git.Repository, tmpBasePath
|
||||||
|
|
||||||
const prefix = "error: patch failed:"
|
const prefix = "error: patch failed:"
|
||||||
const errorPrefix = "error: "
|
const errorPrefix = "error: "
|
||||||
|
const threewayFailed = "Failed to perform three-way merge..."
|
||||||
|
const appliedPatchPrefix = "Applied patch to '"
|
||||||
|
const withConflicts = "' with conflicts."
|
||||||
|
|
||||||
conflictMap := map[string]bool{}
|
conflictMap := map[string]bool{}
|
||||||
|
|
||||||
|
@ -394,6 +399,8 @@ func checkConflicts(pr *models.PullRequest, gitRepo *git.Repository, tmpBasePath
|
||||||
conflict = true
|
conflict = true
|
||||||
filepath := strings.TrimSpace(strings.Split(line[len(prefix):], ":")[0])
|
filepath := strings.TrimSpace(strings.Split(line[len(prefix):], ":")[0])
|
||||||
conflictMap[filepath] = true
|
conflictMap[filepath] = true
|
||||||
|
} else if is3way && line == threewayFailed {
|
||||||
|
conflict = true
|
||||||
} else if strings.HasPrefix(line, errorPrefix) {
|
} else if strings.HasPrefix(line, errorPrefix) {
|
||||||
conflict = true
|
conflict = true
|
||||||
for _, suffix := range patchErrorSuffices {
|
for _, suffix := range patchErrorSuffices {
|
||||||
|
@ -405,6 +412,12 @@ func checkConflicts(pr *models.PullRequest, gitRepo *git.Repository, tmpBasePath
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if is3way && strings.HasPrefix(line, appliedPatchPrefix) && strings.HasSuffix(line, withConflicts) {
|
||||||
|
conflict = true
|
||||||
|
filepath := strings.TrimPrefix(strings.TrimSuffix(line, withConflicts), appliedPatchPrefix)
|
||||||
|
if filepath != "" {
|
||||||
|
conflictMap[filepath] = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// only list 10 conflicted files
|
// only list 10 conflicted files
|
||||||
if len(conflictMap) >= 10 {
|
if len(conflictMap) >= 10 {
|
||||||
|
|
Loading…
Reference in a new issue