mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 03:25:11 +01:00 
			
		
		
		
	Backport #22568 The merge and update branch code was previously a little tangled and had some very long functions. The functions were not very clear in their reasoning and there were deficiencies in their logging and at least one bug in the handling of LFS for update by rebase. This PR substantially refactors this code and splits things out to into separate functions. It also attempts to tidy up the calls by wrapping things in "context"s. There are also attempts to improve logging when there are errors. Signed-off-by: Andrew Thornton <art27@cantab.net> Signed-off-by: Andrew Thornton <art27@cantab.net> Co-authored-by: zeripath <art27@cantab.net> Co-authored-by: techknowlogick <techknowlogick@gitea.io> Co-authored-by: delvh <dev.lh@web.de>
		
			
				
	
	
		
			51 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright 2023 The Gitea Authors. All rights reserved.
 | |
| // SPDX-License-Identifier: MIT
 | |
| 
 | |
| package pull
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 
 | |
| 	repo_model "code.gitea.io/gitea/models/repo"
 | |
| 	"code.gitea.io/gitea/modules/git"
 | |
| 	"code.gitea.io/gitea/modules/log"
 | |
| )
 | |
| 
 | |
| // doMergeStyleRebase rebaases the tracking branch on the base branch as the current HEAD with or with a merge commit to the original pr branch
 | |
| func doMergeStyleRebase(ctx *mergeContext, mergeStyle repo_model.MergeStyle, message string) error {
 | |
| 	if err := rebaseTrackingOnToBase(ctx, mergeStyle); err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	// Checkout base branch again
 | |
| 	if err := git.NewCommand(ctx, "checkout").AddDynamicArguments(baseBranch).
 | |
| 		Run(ctx.RunOpts()); err != nil {
 | |
| 		log.Error("git checkout base prior to merge post staging rebase %-v: %v\n%s\n%s", ctx.pr, err, ctx.outbuf.String(), ctx.errbuf.String())
 | |
| 		return fmt.Errorf("git checkout base prior to merge post staging rebase  %v: %w\n%s\n%s", ctx.pr, err, ctx.outbuf.String(), ctx.errbuf.String())
 | |
| 	}
 | |
| 	ctx.outbuf.Reset()
 | |
| 	ctx.errbuf.Reset()
 | |
| 
 | |
| 	cmd := git.NewCommand(ctx, "merge")
 | |
| 	if mergeStyle == repo_model.MergeStyleRebase {
 | |
| 		cmd.AddArguments("--ff-only")
 | |
| 	} else {
 | |
| 		cmd.AddArguments("--no-ff", "--no-commit")
 | |
| 	}
 | |
| 	cmd.AddDynamicArguments(stagingBranch)
 | |
| 
 | |
| 	// Prepare merge with commit
 | |
| 	if err := runMergeCommand(ctx, mergeStyle, cmd); err != nil {
 | |
| 		log.Error("Unable to merge staging into base: %v", err)
 | |
| 		return err
 | |
| 	}
 | |
| 	if mergeStyle == repo_model.MergeStyleRebaseMerge {
 | |
| 		if err := commitAndSignNoAuthor(ctx, message); err != nil {
 | |
| 			log.Error("Unable to make final commit: %v", err)
 | |
| 			return err
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 |