@@ -13,13 +13,24 @@ import (
1313)
1414
1515// Update updates pull request with base branch.
16- func Update (pull * models.PullRequest , doer * models.User , message string ) error {
17- //use merge functions but switch repo's and branch's
18- pr := & models.PullRequest {
19- HeadRepoID : pull .BaseRepoID ,
20- BaseRepoID : pull .HeadRepoID ,
21- HeadBranch : pull .BaseBranch ,
22- BaseBranch : pull .HeadBranch ,
16+ func Update (pull * models.PullRequest , doer * models.User , message string , rebase bool ) error {
17+ var (
18+ pr * models.PullRequest
19+ style models.MergeStyle
20+ )
21+
22+ if rebase {
23+ pr = pull
24+ style = models .MergeStyleRebaseUpdate
25+ } else {
26+ //use merge functions but switch repo's and branch's
27+ pr = & models.PullRequest {
28+ HeadRepoID : pull .BaseRepoID ,
29+ BaseRepoID : pull .HeadRepoID ,
30+ HeadBranch : pull .BaseBranch ,
31+ BaseBranch : pull .HeadBranch ,
32+ }
33+ style = models .MergeStyleMerge
2334 }
2435
2536 if pull .Flow == models .PullRequestFlowAGit {
@@ -42,27 +53,31 @@ func Update(pull *models.PullRequest, doer *models.User, message string) error {
4253 return fmt .Errorf ("HeadBranch of PR %d is up to date" , pull .Index )
4354 }
4455
45- _ , err = rawMerge (pr , doer , models . MergeStyleMerge , message )
56+ _ , err = rawMerge (pr , doer , style , message )
4657
4758 defer func () {
59+ if rebase {
60+ go AddTestPullRequestTask (doer , pr .BaseRepo .ID , pr .BaseBranch , false , "" , "" )
61+ return
62+ }
4863 go AddTestPullRequestTask (doer , pr .HeadRepo .ID , pr .HeadBranch , false , "" , "" )
4964 }()
5065
5166 return err
5267}
5368
5469// IsUserAllowedToUpdate check if user is allowed to update PR with given permissions and branch protections
55- func IsUserAllowedToUpdate (pull * models.PullRequest , user * models.User ) (bool , error ) {
70+ func IsUserAllowedToUpdate (pull * models.PullRequest , user * models.User ) (mergeAllowed , rebaseAllowed bool , err error ) {
5671 if pull .Flow == models .PullRequestFlowAGit {
57- return false , nil
72+ return false , false , nil
5873 }
5974
6075 if user == nil {
61- return false , nil
76+ return false , false , nil
6277 }
6378 headRepoPerm , err := models .GetUserRepoPermission (pull .HeadRepo , user )
6479 if err != nil {
65- return false , err
80+ return false , false , err
6681 }
6782
6883 pr := & models.PullRequest {
@@ -74,15 +89,25 @@ func IsUserAllowedToUpdate(pull *models.PullRequest, user *models.User) (bool, e
7489
7590 err = pr .LoadProtectedBranch ()
7691 if err != nil {
77- return false , err
92+ return false , false , err
93+ }
94+
95+ // can't do rebase on protected branch because need force push
96+ if pr .ProtectedBranch == nil {
97+ rebaseAllowed = true
7898 }
7999
80100 // Update function need push permission
81101 if pr .ProtectedBranch != nil && ! pr .ProtectedBranch .CanUserPush (user .ID ) {
82- return false , nil
102+ return false , false , nil
103+ }
104+
105+ mergeAllowed , err = IsUserAllowedToMerge (pr , headRepoPerm , user )
106+ if err != nil {
107+ return false , false , err
83108 }
84109
85- return IsUserAllowedToMerge ( pr , headRepoPerm , user )
110+ return mergeAllowed , rebaseAllowed , nil
86111}
87112
88113// GetDiverging determines how many commits a PR is ahead or behind the PR base branch
0 commit comments