diff --git a/models/issue_dependency.go b/models/issue_dependency.go index 3379c9d66..29d9741f5 100644 --- a/models/issue_dependency.go +++ b/models/issue_dependency.go @@ -180,3 +180,23 @@ func issueDepExists(e Engine, issueID int64, depID int64) (exists bool, err erro return } + +// check if issue can be closed +func IssueNoDependenciesLeft(issueID int64) bool{ + + var issueDeps []IssueDependency + err := x.Where("issue_id = ?", issueID).Find(&issueDeps) + + for _, issueDep := range issueDeps{ + issueDetails, _ := getIssueByID(x, issueDep.DependencyID) + if !issueDetails.IsClosed { + return false + } + } + + if err != nil { + return false + } + + return true +} diff --git a/routers/repo/issue.go b/routers/repo/issue.go index 4e15deb12..ff51b6aaa 100644 --- a/routers/repo/issue.go +++ b/routers/repo/issue.go @@ -868,6 +868,18 @@ func NewComment(ctx *context.Context, form auth.CreateCommentForm) { (form.Status == "reopen" || form.Status == "close") && !(issue.IsPull && issue.PullRequest.HasMerged) { + // Check for open dependencies + if form.Status == "close"{ + + canbeClosed := models.IssueNoDependenciesLeft(issue.ID) + + if !canbeClosed { + ctx.Flash.Error("You need to close all issues blocking this issue!") + ctx.Redirect(fmt.Sprintf("%s/issues/%d", ctx.Repo.RepoLink, issue.Index)) + return + } + } + // Duplication and conflict check should apply to reopen pull request. var pr *models.PullRequest