@ -297,6 +297,8 @@ const (
MergeStyleMerge MergeStyle = "merge"
// MergeStyleRebase rebase before merging
MergeStyleRebase MergeStyle = "rebase"
// MergeStyleRebaseMerge rebase before merging with merge commit (--no-ff)
MergeStyleRebaseMerge MergeStyle = "rebase-merge"
// MergeStyleSquash squash commits into single commit before merging
MergeStyleSquash MergeStyle = "squash"
)
@ -434,6 +436,41 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository, mergeStyle
"git" , "merge" , "--ff-only" , "-q" , "head_repo_" + pr . HeadBranch ) ; err != nil {
return fmt . Errorf ( "git merge --ff-only [%s -> %s]: %s" , headRepoPath , tmpBasePath , stderr )
}
case MergeStyleRebaseMerge :
// Checkout head branch
if _ , stderr , err = process . GetManager ( ) . ExecDir ( - 1 , tmpBasePath ,
fmt . Sprintf ( "PullRequest.Merge (git checkout): %s" , tmpBasePath ) ,
"git" , "checkout" , "-b" , "head_repo_" + pr . HeadBranch , "head_repo/" + pr . HeadBranch ) ; err != nil {
return fmt . Errorf ( "git checkout: %s" , stderr )
}
// Rebase before merging
if _ , stderr , err = process . GetManager ( ) . ExecDir ( - 1 , tmpBasePath ,
fmt . Sprintf ( "PullRequest.Merge (git rebase): %s" , tmpBasePath ) ,
"git" , "rebase" , "-q" , pr . BaseBranch ) ; err != nil {
return fmt . Errorf ( "git rebase [%s -> %s]: %s" , headRepoPath , tmpBasePath , stderr )
}
// Checkout base branch again
if _ , stderr , err = process . GetManager ( ) . ExecDir ( - 1 , tmpBasePath ,
fmt . Sprintf ( "PullRequest.Merge (git checkout): %s" , tmpBasePath ) ,
"git" , "checkout" , pr . BaseBranch ) ; err != nil {
return fmt . Errorf ( "git checkout: %s" , stderr )
}
// Prepare merge with commit
if _ , stderr , err = process . GetManager ( ) . ExecDir ( - 1 , tmpBasePath ,
fmt . Sprintf ( "PullRequest.Merge (git merge): %s" , tmpBasePath ) ,
"git" , "merge" , "--no-ff" , "--no-commit" , "-q" , "head_repo_" + pr . HeadBranch ) ; err != nil {
return fmt . Errorf ( "git merge --no-ff [%s -> %s]: %s" , headRepoPath , tmpBasePath , stderr )
}
// Set custom message and author and create merge commit
sig := doer . NewGitSig ( )
if _ , stderr , err = process . GetManager ( ) . ExecDir ( - 1 , tmpBasePath ,
fmt . Sprintf ( "PullRequest.Merge (git commit): %s" , tmpBasePath ) ,
"git" , "commit" , fmt . Sprintf ( "--author='%s <%s>'" , sig . Name , sig . Email ) ,
"-m" , message ) ; err != nil {
return fmt . Errorf ( "git commit [%s]: %v - %s" , tmpBasePath , err , stderr )
}
case MergeStyleSquash :
// Merge with squash
if _ , stderr , err = process . GetManager ( ) . ExecDir ( - 1 , tmpBasePath ,