summaryrefslogtreecommitdiffstats
path: root/models/migrations/v1_18/v229.go
diff options
context:
space:
mode:
Diffstat (limited to 'models/migrations/v1_18/v229.go')
-rw-r--r--models/migrations/v1_18/v229.go46
1 files changed, 46 insertions, 0 deletions
diff --git a/models/migrations/v1_18/v229.go b/models/migrations/v1_18/v229.go
new file mode 100644
index 0000000..10d9f35
--- /dev/null
+++ b/models/migrations/v1_18/v229.go
@@ -0,0 +1,46 @@
+// Copyright 2022 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package v1_18 //nolint
+
+import (
+ "fmt"
+
+ "code.gitea.io/gitea/models/issues"
+
+ "xorm.io/builder"
+ "xorm.io/xorm"
+)
+
+func UpdateOpenMilestoneCounts(x *xorm.Engine) error {
+ var openMilestoneIDs []int64
+ err := x.Table("milestone").Select("id").Where(builder.Neq{"is_closed": 1}).Find(&openMilestoneIDs)
+ if err != nil {
+ return fmt.Errorf("error selecting open milestone IDs: %w", err)
+ }
+
+ for _, id := range openMilestoneIDs {
+ _, err := x.ID(id).
+ SetExpr("num_issues", builder.Select("count(*)").From("issue").Where(
+ builder.Eq{"milestone_id": id},
+ )).
+ SetExpr("num_closed_issues", builder.Select("count(*)").From("issue").Where(
+ builder.Eq{
+ "milestone_id": id,
+ "is_closed": true,
+ },
+ )).
+ Update(&issues.Milestone{})
+ if err != nil {
+ return fmt.Errorf("error updating issue counts in milestone %d: %w", id, err)
+ }
+ _, err = x.Exec("UPDATE `milestone` SET completeness=100*num_closed_issues/(CASE WHEN num_issues > 0 THEN num_issues ELSE 1 END) WHERE id=?",
+ id,
+ )
+ if err != nil {
+ return fmt.Errorf("error setting completeness on milestone %d: %w", id, err)
+ }
+ }
+
+ return nil
+}