From 0dfe5fa2d69f92058207249a62308915ed60c435 Mon Sep 17 00:00:00 2001 From: zeripath Date: Wed, 2 Feb 2022 14:35:25 +0000 Subject: [PATCH] Detect conflicts with 3way merge (#18536) (#18537) Backport #18536 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 --- services/pull/patch.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/services/pull/patch.go b/services/pull/patch.go index 0eba3f86ed5..ee10c97392f 100644 --- a/services/pull/patch.go +++ b/services/pull/patch.go @@ -339,8 +339,10 @@ func checkConflicts(pr *models.PullRequest, gitRepo *git.Repository, tmpBasePath if prConfig.IgnoreWhitespaceConflicts { args = append(args, "--ignore-whitespace") } + is3way := false if git.CheckGitVersionAtLeast("2.32.0") == nil { args = append(args, "--3way") + is3way = true } args = append(args, patchPath) pr.ConflictedFiles = make([]string, 0, 5) @@ -379,6 +381,9 @@ func checkConflicts(pr *models.PullRequest, gitRepo *git.Repository, tmpBasePath const prefix = "error: patch failed:" const errorPrefix = "error: " + const threewayFailed = "Failed to perform three-way merge..." + const appliedPatchPrefix = "Applied patch to '" + const withConflicts = "' with conflicts." conflictMap := map[string]bool{} @@ -390,6 +395,8 @@ func checkConflicts(pr *models.PullRequest, gitRepo *git.Repository, tmpBasePath conflict = true filepath := strings.TrimSpace(strings.Split(line[len(prefix):], ":")[0]) conflictMap[filepath] = true + } else if is3way && line == threewayFailed { + conflict = true } else if strings.HasPrefix(line, errorPrefix) { conflict = true for _, suffix := range patchErrorSuffices { @@ -401,6 +408,12 @@ func checkConflicts(pr *models.PullRequest, gitRepo *git.Repository, tmpBasePath 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 if len(conflictMap) >= 10 {