mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +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 {
 | 
						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 {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user