summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2020-01-25 10:48:22 +0800
committerGitHub <noreply@github.com>2020-01-25 10:48:22 +0800
commitf2d12f7b034e32d0e7cc7b60e7ad015af122db3f (patch)
tree5009bac317f4dbed07c459aa5361583a4f3fc2b7 /services
parentee26f042c421d90cbd3f852427de8b98f1cc71a7 (diff)
downloadgitea-f2d12f7b034e32d0e7cc7b60e7ad015af122db3f.tar.gz
gitea-f2d12f7b034e32d0e7cc7b60e7ad015af122db3f.zip
Fix pull view when head repository or head branch missed and close related pull requests when delete head repository or head branch (#9927)
* fix pull view when head repository or head branch missed and close related pull requests when delete branch * fix pull view broken when head repository deleted * close pull requests when head repositories deleted * Add tests for broken pull request head repository or branch * fix typo * ignore special error when close pull request Co-authored-by: Lauris BH <lauris@nix.lv>
Diffstat (limited to 'services')
-rw-r--r--services/pull/pull.go76
-rw-r--r--services/repository/repository.go5
2 files changed, 81 insertions, 0 deletions
diff --git a/services/pull/pull.go b/services/pull/pull.go
index bc71e52213..705eab06a2 100644
--- a/services/pull/pull.go
+++ b/services/pull/pull.go
@@ -355,3 +355,79 @@ func PushToBaseRepo(pr *models.PullRequest) (err error) {
return nil
}
+
+type errlist []error
+
+func (errs errlist) Error() string {
+ if len(errs) > 0 {
+ var buf strings.Builder
+ for i, err := range errs {
+ if i > 0 {
+ buf.WriteString(", ")
+ }
+ buf.WriteString(err.Error())
+ }
+ return buf.String()
+ }
+ return ""
+}
+
+// CloseBranchPulls close all the pull requests who's head branch is the branch
+func CloseBranchPulls(doer *models.User, repoID int64, branch string) error {
+ prs, err := models.GetUnmergedPullRequestsByHeadInfo(repoID, branch)
+ if err != nil {
+ return err
+ }
+
+ prs2, err := models.GetUnmergedPullRequestsByBaseInfo(repoID, branch)
+ if err != nil {
+ return err
+ }
+
+ prs = append(prs, prs2...)
+ if err := models.PullRequestList(prs).LoadAttributes(); err != nil {
+ return err
+ }
+
+ var errs errlist
+ for _, pr := range prs {
+ if err = issue_service.ChangeStatus(pr.Issue, doer, true); err != nil && !models.IsErrIssueWasClosed(err) {
+ errs = append(errs, err)
+ }
+ }
+ if len(errs) > 0 {
+ return errs
+ }
+ return nil
+}
+
+// CloseRepoBranchesPulls close all pull requests which head branches are in the given repository
+func CloseRepoBranchesPulls(doer *models.User, repo *models.Repository) error {
+ branches, err := git.GetBranchesByPath(repo.RepoPath())
+ if err != nil {
+ return err
+ }
+
+ var errs errlist
+ for _, branch := range branches {
+ prs, err := models.GetUnmergedPullRequestsByHeadInfo(repo.ID, branch.Name)
+ if err != nil {
+ return err
+ }
+
+ if err = models.PullRequestList(prs).LoadAttributes(); err != nil {
+ return err
+ }
+
+ for _, pr := range prs {
+ if err = issue_service.ChangeStatus(pr.Issue, doer, true); err != nil && !models.IsErrIssueWasClosed(err) {
+ errs = append(errs, err)
+ }
+ }
+ }
+
+ if len(errs) > 0 {
+ return errs
+ }
+ return nil
+}
diff --git a/services/repository/repository.go b/services/repository/repository.go
index eea8b352b4..f50b98b640 100644
--- a/services/repository/repository.go
+++ b/services/repository/repository.go
@@ -11,6 +11,7 @@ import (
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/notification"
repo_module "code.gitea.io/gitea/modules/repository"
+ pull_service "code.gitea.io/gitea/services/pull"
)
// CreateRepository creates a repository for the user/organization.
@@ -49,6 +50,10 @@ func ForkRepository(doer, u *models.User, oldRepo *models.Repository, name, desc
// DeleteRepository deletes a repository for a user or organization.
func DeleteRepository(doer *models.User, repo *models.Repository) error {
+ if err := pull_service.CloseRepoBranchesPulls(doer, repo); err != nil {
+ log.Error("CloseRepoBranchesPulls failed: %v", err)
+ }
+
if err := models.DeleteRepository(doer, repo.OwnerID, repo.ID); err != nil {
return err
}