forked from forgejo/forgejo
Add option to update pull request by rebase
(#16125)
* add option to update pull request by `rebase` Signed-off-by: a1012112796 <1012112796@qq.com>
This commit is contained in:
parent
2bb32006fd
commit
cbf05c3f79
10 changed files with 184 additions and 26 deletions
|
@ -13,13 +13,24 @@ import (
|
|||
)
|
||||
|
||||
// Update updates pull request with base branch.
|
||||
func Update(pull *models.PullRequest, doer *models.User, message string) error {
|
||||
//use merge functions but switch repo's and branch's
|
||||
pr := &models.PullRequest{
|
||||
HeadRepoID: pull.BaseRepoID,
|
||||
BaseRepoID: pull.HeadRepoID,
|
||||
HeadBranch: pull.BaseBranch,
|
||||
BaseBranch: pull.HeadBranch,
|
||||
func Update(pull *models.PullRequest, doer *models.User, message string, rebase bool) error {
|
||||
var (
|
||||
pr *models.PullRequest
|
||||
style models.MergeStyle
|
||||
)
|
||||
|
||||
if rebase {
|
||||
pr = pull
|
||||
style = models.MergeStyleRebaseUpdate
|
||||
} else {
|
||||
//use merge functions but switch repo's and branch's
|
||||
pr = &models.PullRequest{
|
||||
HeadRepoID: pull.BaseRepoID,
|
||||
BaseRepoID: pull.HeadRepoID,
|
||||
HeadBranch: pull.BaseBranch,
|
||||
BaseBranch: pull.HeadBranch,
|
||||
}
|
||||
style = models.MergeStyleMerge
|
||||
}
|
||||
|
||||
if pull.Flow == models.PullRequestFlowAGit {
|
||||
|
@ -42,9 +53,13 @@ func Update(pull *models.PullRequest, doer *models.User, message string) error {
|
|||
return fmt.Errorf("HeadBranch of PR %d is up to date", pull.Index)
|
||||
}
|
||||
|
||||
_, err = rawMerge(pr, doer, models.MergeStyleMerge, message)
|
||||
_, err = rawMerge(pr, doer, style, message)
|
||||
|
||||
defer func() {
|
||||
if rebase {
|
||||
go AddTestPullRequestTask(doer, pr.BaseRepo.ID, pr.BaseBranch, false, "", "")
|
||||
return
|
||||
}
|
||||
go AddTestPullRequestTask(doer, pr.HeadRepo.ID, pr.HeadBranch, false, "", "")
|
||||
}()
|
||||
|
||||
|
@ -52,17 +67,17 @@ func Update(pull *models.PullRequest, doer *models.User, message string) error {
|
|||
}
|
||||
|
||||
// IsUserAllowedToUpdate check if user is allowed to update PR with given permissions and branch protections
|
||||
func IsUserAllowedToUpdate(pull *models.PullRequest, user *models.User) (bool, error) {
|
||||
func IsUserAllowedToUpdate(pull *models.PullRequest, user *models.User) (mergeAllowed, rebaseAllowed bool, err error) {
|
||||
if pull.Flow == models.PullRequestFlowAGit {
|
||||
return false, nil
|
||||
return false, false, nil
|
||||
}
|
||||
|
||||
if user == nil {
|
||||
return false, nil
|
||||
return false, false, nil
|
||||
}
|
||||
headRepoPerm, err := models.GetUserRepoPermission(pull.HeadRepo, user)
|
||||
if err != nil {
|
||||
return false, err
|
||||
return false, false, err
|
||||
}
|
||||
|
||||
pr := &models.PullRequest{
|
||||
|
@ -74,15 +89,25 @@ func IsUserAllowedToUpdate(pull *models.PullRequest, user *models.User) (bool, e
|
|||
|
||||
err = pr.LoadProtectedBranch()
|
||||
if err != nil {
|
||||
return false, err
|
||||
return false, false, err
|
||||
}
|
||||
|
||||
// can't do rebase on protected branch because need force push
|
||||
if pr.ProtectedBranch == nil {
|
||||
rebaseAllowed = true
|
||||
}
|
||||
|
||||
// Update function need push permission
|
||||
if pr.ProtectedBranch != nil && !pr.ProtectedBranch.CanUserPush(user.ID) {
|
||||
return false, nil
|
||||
return false, false, nil
|
||||
}
|
||||
|
||||
return IsUserAllowedToMerge(pr, headRepoPerm, user)
|
||||
mergeAllowed, err = IsUserAllowedToMerge(pr, headRepoPerm, user)
|
||||
if err != nil {
|
||||
return false, false, err
|
||||
}
|
||||
|
||||
return mergeAllowed, rebaseAllowed, nil
|
||||
}
|
||||
|
||||
// GetDiverging determines how many commits a PR is ahead or behind the PR base branch
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue