Skip to content

Commit 91de000

Browse files
committed
Try to keep branch PRs open when branch is deleted cause of it's PR merged and closed, fixes #18408
1 parent 290cc88 commit 91de000

File tree

3 files changed

+44
-0
lines changed

3 files changed

+44
-0
lines changed

routers/api/v1/repo/pull.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -888,6 +888,13 @@ func MergePullRequest(ctx *context.APIContext) {
888888
}
889889
defer headRepo.Close()
890890
}
891+
if pr.BaseRepoID == pr.HeadRepoID {
892+
if err := pull_service.RebaseBranchPulls(ctx, ctx.Doer, pr.HeadRepoID, pr.HeadBranch, pr.BaseBranch); err != nil {
893+
log.Error("RebaseBranchPulls: %v", err)
894+
ctx.Error(http.StatusInternalServerError, "RebaseBranchPulls", err)
895+
return
896+
}
897+
}
891898
if err := repo_service.DeleteBranch(ctx.Doer, pr.HeadRepo, headRepo, pr.HeadBranch); err != nil {
892899
switch {
893900
case git.IsErrBranchNotExist(err):

routers/web/repo/pull.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1318,6 +1318,15 @@ func CleanUpPullRequest(ctx *context.Context) {
13181318

13191319
func deleteBranch(ctx *context.Context, pr *models.PullRequest, gitRepo *git.Repository) {
13201320
fullBranchName := pr.HeadRepo.Owner.Name + "/" + pr.HeadBranch
1321+
1322+
if pr.BaseRepoID == pr.HeadRepoID {
1323+
if err := pull_service.RebaseBranchPulls(ctx, ctx.Doer, pr.HeadRepoID, pr.HeadBranch, pr.BaseBranch); err != nil {
1324+
log.Error("RebaseBranchPulls: %v", err)
1325+
ctx.Flash.Error(ctx.Tr("repo.branch.deletion_failed", fullBranchName))
1326+
return
1327+
}
1328+
}
1329+
13211330
if err := repo_service.DeleteBranch(ctx.Doer, pr.HeadRepo, gitRepo, pr.HeadBranch); err != nil {
13221331
switch {
13231332
case git.IsErrBranchNotExist(err):

services/pull/pull.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,34 @@ func (errs errlist) Error() string {
511511
return ""
512512
}
513513

514+
// RebaseBranchPulls change target branch for all pull requests who's base branch is the branch
515+
func RebaseBranchPulls(ctx context.Context, doer *user_model.User, repoID int64, branch, targetBranch string) error {
516+
prs, err := models.GetUnmergedPullRequestsByBaseInfo(repoID, branch)
517+
if err != nil {
518+
return err
519+
}
520+
521+
if err := models.PullRequestList(prs).LoadAttributes(); err != nil {
522+
return err
523+
}
524+
525+
var errs errlist
526+
for _, pr := range prs {
527+
if err = pr.Issue.LoadAttributes(); err != nil {
528+
errs = append(errs, err)
529+
} else if err = ChangeTargetBranch(ctx, pr, doer, targetBranch); err != nil &&
530+
!models.IsErrIssueIsClosed(err) && !models.IsErrPullRequestHasMerged(err) &&
531+
!models.IsErrPullRequestAlreadyExists(err) {
532+
errs = append(errs, err)
533+
}
534+
}
535+
536+
if len(errs) > 0 {
537+
return errs
538+
}
539+
return nil
540+
}
541+
514542
// CloseBranchPulls close all the pull requests who's head branch is the branch
515543
func CloseBranchPulls(doer *user_model.User, repoID int64, branch string) error {
516544
prs, err := models.GetUnmergedPullRequestsByHeadInfo(repoID, branch)

0 commit comments

Comments
 (0)