summaryrefslogtreecommitdiffstats
path: root/models/repo/repo.go
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2022-10-25 20:47:46 +0800
committerGitHub <noreply@github.com>2022-10-25 14:47:46 +0200
commit5e8e3ecbeb71ea924ed9662251af2897285b8220 (patch)
tree7e75b1d76fc496c117ee2e8f6712804822320e64 /models/repo/repo.go
parent29c00eb1ed13fbcd2a5e493d075c2bbd0e2a26f7 (diff)
downloadgitea-5e8e3ecbeb71ea924ed9662251af2897285b8220.tar.gz
gitea-5e8e3ecbeb71ea924ed9662251af2897285b8220.zip
Fix issues count bug (#21557)
fix #19349 , #19505 Co-authored-by: delvh <dev.lh@web.de>
Diffstat (limited to 'models/repo/repo.go')
-rw-r--r--models/repo/repo.go45
1 files changed, 20 insertions, 25 deletions
diff --git a/models/repo/repo.go b/models/repo/repo.go
index 848138c824..77e0367a5a 100644
--- a/models/repo/repo.go
+++ b/models/repo/repo.go
@@ -765,35 +765,30 @@ func CountRepositories(ctx context.Context, opts CountRepositoryOptions) (int64,
return count, nil
}
-// StatsCorrectNumClosed update repository's issue related numbers
-func StatsCorrectNumClosed(ctx context.Context, id int64, isPull bool, field string) error {
- _, err := db.Exec(ctx, "UPDATE `repository` SET "+field+"=(SELECT COUNT(*) FROM `issue` WHERE repo_id=? AND is_closed=? AND is_pull=?) WHERE id=?", id, true, isPull, id)
- return err
-}
-
-// UpdateRepoIssueNumbers update repository issue numbers
+// UpdateRepoIssueNumbers updates one of a repositories amount of (open|closed) (issues|PRs) with the current count
func UpdateRepoIssueNumbers(ctx context.Context, repoID int64, isPull, isClosed bool) error {
- e := db.GetEngine(ctx)
+ field := "num_"
+ if isClosed {
+ field += "closed_"
+ }
if isPull {
- if _, err := e.ID(repoID).Decr("num_pulls").Update(new(Repository)); err != nil {
- return err
- }
- if isClosed {
- if _, err := e.ID(repoID).Decr("num_closed_pulls").Update(new(Repository)); err != nil {
- return err
- }
- }
+ field += "pulls"
} else {
- if _, err := e.ID(repoID).Decr("num_issues").Update(new(Repository)); err != nil {
- return err
- }
- if isClosed {
- if _, err := e.ID(repoID).Decr("num_closed_issues").Update(new(Repository)); err != nil {
- return err
- }
- }
+ field += "issues"
}
- return nil
+
+ subQuery := builder.Select("count(*)").
+ From("issue").Where(builder.Eq{
+ "repo_id": repoID,
+ "is_pull": isPull,
+ }.And(builder.If(isClosed, builder.Eq{"is_closed": isClosed})))
+
+ // builder.Update(cond) will generate SQL like UPDATE ... SET cond
+ query := builder.Update(builder.Eq{field: subQuery}).
+ From("repository").
+ Where(builder.Eq{"id": repoID})
+ _, err := db.Exec(ctx, query)
+ return err
}
// CountNullArchivedRepository counts the number of repositories with is_archived is null