@@ -297,6 +297,8 @@ const (
297297 MergeStyleMerge MergeStyle = "merge"
298298 // MergeStyleRebase rebase before merging
299299 MergeStyleRebase MergeStyle = "rebase"
300+ // MergeStyleRebaseMerge rebase before merging with merge commit (--no-ff)
301+ MergeStyleRebaseMerge MergeStyle = "rebase-merge"
300302 // MergeStyleSquash squash commits into single commit before merging
301303 MergeStyleSquash MergeStyle = "squash"
302304)
@@ -434,6 +436,41 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle
434436 "git" , "merge" , "--ff-only" , "-q" , "head_repo_" + pr .HeadBranch ); err != nil {
435437 return fmt .Errorf ("git merge --ff-only [%s -> %s]: %s" , headRepoPath , tmpBasePath , stderr )
436438 }
439+ case MergeStyleRebaseMerge :
440+ // Checkout head branch
441+ if _ , stderr , err = process .GetManager ().ExecDir (- 1 , tmpBasePath ,
442+ fmt .Sprintf ("PullRequest.Merge (git checkout): %s" , tmpBasePath ),
443+ "git" , "checkout" , "-b" , "head_repo_" + pr .HeadBranch , "head_repo/" + pr .HeadBranch ); err != nil {
444+ return fmt .Errorf ("git checkout: %s" , stderr )
445+ }
446+ // Rebase before merging
447+ if _ , stderr , err = process .GetManager ().ExecDir (- 1 , tmpBasePath ,
448+ fmt .Sprintf ("PullRequest.Merge (git rebase): %s" , tmpBasePath ),
449+ "git" , "rebase" , "-q" , pr .BaseBranch ); err != nil {
450+ return fmt .Errorf ("git rebase [%s -> %s]: %s" , headRepoPath , tmpBasePath , stderr )
451+ }
452+ // Checkout base branch again
453+ if _ , stderr , err = process .GetManager ().ExecDir (- 1 , tmpBasePath ,
454+ fmt .Sprintf ("PullRequest.Merge (git checkout): %s" , tmpBasePath ),
455+ "git" , "checkout" , pr .BaseBranch ); err != nil {
456+ return fmt .Errorf ("git checkout: %s" , stderr )
457+ }
458+ // Prepare merge with commit
459+ if _ , stderr , err = process .GetManager ().ExecDir (- 1 , tmpBasePath ,
460+ fmt .Sprintf ("PullRequest.Merge (git merge): %s" , tmpBasePath ),
461+ "git" , "merge" , "--no-ff" , "--no-commit" , "-q" , "head_repo_" + pr .HeadBranch ); err != nil {
462+ return fmt .Errorf ("git merge --no-ff [%s -> %s]: %s" , headRepoPath , tmpBasePath , stderr )
463+ }
464+
465+ // Set custom message and author and create merge commit
466+ sig := doer .NewGitSig ()
467+ if _ , stderr , err = process .GetManager ().ExecDir (- 1 , tmpBasePath ,
468+ fmt .Sprintf ("PullRequest.Merge (git commit): %s" , tmpBasePath ),
469+ "git" , "commit" , fmt .Sprintf ("--author='%s <%s>'" , sig .Name , sig .Email ),
470+ "-m" , message ); err != nil {
471+ return fmt .Errorf ("git commit [%s]: %v - %s" , tmpBasePath , err , stderr )
472+ }
473+
437474 case MergeStyleSquash :
438475 // Merge with squash
439476 if _ , stderr , err = process .GetManager ().ExecDir (- 1 , tmpBasePath ,
0 commit comments