1
1
mirror of https://github.com/go-gitea/gitea synced 2025-07-16 07:18:37 +00:00

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:
a1012112796
2021-08-31 22:03:45 +08:00
committed by GitHub
parent 2bb32006fd
commit cbf05c3f79
10 changed files with 184 additions and 26 deletions

View File

@@ -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