@@ -297,6 +297,8 @@ const (
297
297
MergeStyleMerge MergeStyle = "merge"
298
298
// MergeStyleRebase rebase before merging
299
299
MergeStyleRebase MergeStyle = "rebase"
300
+ // MergeStyleRebaseMerge rebase before merging with merge commit (--no-ff)
301
+ MergeStyleRebaseMerge MergeStyle = "rebase-merge"
300
302
// MergeStyleSquash squash commits into single commit before merging
301
303
MergeStyleSquash MergeStyle = "squash"
302
304
)
@@ -434,6 +436,41 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle
434
436
"git" , "merge" , "--ff-only" , "-q" , "head_repo_" + pr .HeadBranch ); err != nil {
435
437
return fmt .Errorf ("git merge --ff-only [%s -> %s]: %s" , headRepoPath , tmpBasePath , stderr )
436
438
}
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
+
437
474
case MergeStyleSquash :
438
475
// Merge with squash
439
476
if _ , stderr , err = process .GetManager ().ExecDir (- 1 , tmpBasePath ,
0 commit comments