diff --git a/models/issue.go b/models/issue.go index bde5758b0..7561083e0 100644 --- a/models/issue.go +++ b/models/issue.go @@ -1849,3 +1849,22 @@ func (issue *Issue) BlockedByDependencies() ([]*Issue, error) { func (issue *Issue) BlockingDependencies() ([]*Issue, error) { return issue.getBlockingDependencies(x) } + +func (issue *Issue) updateClosedNum(e Engine) (err error) { + if issue.IsPull { + _, err = e.Exec("UPDATE `repository` SET num_closed_pulls=(SELECT count(*) FROM issue WHERE repo_id=? AND is_pull=? AND is_closed=?) WHERE id=?", + issue.RepoID, + true, + true, + issue.RepoID, + ) + } else { + _, err = e.Exec("UPDATE `repository` SET num_closed_issues=(SELECT count(*) FROM issue WHERE repo_id=? AND is_pull=? AND is_closed=?) WHERE id=?", + issue.RepoID, + false, + true, + issue.RepoID, + ) + } + return +} diff --git a/models/issue_comment.go b/models/issue_comment.go index b930b0b12..5e7ebc0cf 100644 --- a/models/issue_comment.go +++ b/models/issue_comment.go @@ -634,12 +634,7 @@ func sendCreateCommentAction(e *xorm.Session, opts *CreateCommentOptions, commen act.OpType = ActionReopenPullRequest } - if opts.Issue.IsPull { - _, err = e.Exec("UPDATE `repository` SET num_closed_pulls=num_closed_pulls-1 WHERE id=?", opts.Repo.ID) - } else { - _, err = e.Exec("UPDATE `repository` SET num_closed_issues=num_closed_issues-1 WHERE id=?", opts.Repo.ID) - } - if err != nil { + if err = opts.Issue.updateClosedNum(e); err != nil { return err } @@ -649,12 +644,7 @@ func sendCreateCommentAction(e *xorm.Session, opts *CreateCommentOptions, commen act.OpType = ActionClosePullRequest } - if opts.Issue.IsPull { - _, err = e.Exec("UPDATE `repository` SET num_closed_pulls=num_closed_pulls+1 WHERE id=?", opts.Repo.ID) - } else { - _, err = e.Exec("UPDATE `repository` SET num_closed_issues=num_closed_issues+1 WHERE id=?", opts.Repo.ID) - } - if err != nil { + if err = opts.Issue.updateClosedNum(e); err != nil { return err } } diff --git a/models/repo.go b/models/repo.go index c60488844..ba1415539 100644 --- a/models/repo.go +++ b/models/repo.go @@ -2311,6 +2311,23 @@ func CheckRepoStats() { } // ***** END: Repository.NumClosedIssues ***** + // ***** START: Repository.NumClosedPulls ***** + desc = "repository count 'num_closed_pulls'" + results, err = x.Query("SELECT repo.id FROM `repository` repo WHERE repo.num_closed_pulls!=(SELECT COUNT(*) FROM `issue` WHERE repo_id=repo.id AND is_closed=? AND is_pull=?)", true, true) + if err != nil { + log.Error("Select %s: %v", desc, err) + } else { + for _, result := range results { + id := com.StrTo(result["id"]).MustInt64() + log.Trace("Updating %s: %d", desc, id) + _, err = x.Exec("UPDATE `repository` SET num_closed_pulls=(SELECT COUNT(*) FROM `issue` WHERE repo_id=? AND is_closed=? AND is_pull=?) WHERE id=?", id, true, true, id) + if err != nil { + log.Error("Update %s[%d]: %v", desc, id, err) + } + } + } + // ***** END: Repository.NumClosedPulls ***** + // FIXME: use checker when stop supporting old fork repo format. // ***** START: Repository.NumForks ***** results, err = x.Query("SELECT repo.id FROM `repository` repo WHERE repo.num_forks!=(SELECT COUNT(*) FROM `repository` WHERE fork_id=repo.id)")