mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	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:
		@@ -343,8 +343,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)
 | 
			
		||||
@@ -383,6 +385,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{}
 | 
			
		||||
 | 
			
		||||
@@ -394,6 +399,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 {
 | 
			
		||||
@@ -405,6 +412,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 {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user