Skip to content

Commit 58aafa8

Browse files
realaravinthStelios Malathouras
authored and
Stelios Malathouras
committed
Fix CheckRepoStats and reuse it during migration (go-gitea#18264)
The CheckRepoStats function missed the following counters: - label num_closed_issues & num_closed_pulls - milestone num_closed_issues & num_closed_pulls The update SQL statements for updating the repository num_closed_issues & num_closed_pulls fields were repeated in three functions (repo.CheckRepoStats, migrate.insertIssues and models.Issue.updateClosedNum) and were moved to a single helper. The UpdateRepoStats is implemented and called in the Finish migration method so that it happens immediately instead of wating for the CheckRepoStats to run. Signed-off-by: Loïc Dachary loic@dachary.org --- [source](https://lab.forgefriends.org/forgefriends/forgefriends/-/merge_requests/34)
1 parent 54bdd01 commit 58aafa8

10 files changed

+219
-168
lines changed

models/issue.go

+13-24
Original file line numberDiff line numberDiff line change
@@ -595,8 +595,8 @@ func (issue *Issue) ReadBy(userID int64) error {
595595
return setIssueNotificationStatusReadIfUnread(db.GetEngine(db.DefaultContext), userID, issue.ID)
596596
}
597597

598-
func updateIssueCols(e db.Engine, issue *Issue, cols ...string) error {
599-
if _, err := e.ID(issue.ID).Cols(cols...).Update(issue); err != nil {
598+
func updateIssueCols(ctx context.Context, issue *Issue, cols ...string) error {
599+
if _, err := db.GetEngine(ctx).ID(issue.ID).Cols(cols...).Update(issue); err != nil {
600600
return err
601601
}
602602
return nil
@@ -646,7 +646,7 @@ func (issue *Issue) doChangeStatus(ctx context.Context, doer *user_model.User, i
646646
issue.ClosedUnix = 0
647647
}
648648

649-
if err := updateIssueCols(e, issue, "is_closed", "closed_unix"); err != nil {
649+
if err := updateIssueCols(ctx, issue, "is_closed", "closed_unix"); err != nil {
650650
return nil, err
651651
}
652652

@@ -662,12 +662,12 @@ func (issue *Issue) doChangeStatus(ctx context.Context, doer *user_model.User, i
662662

663663
// Update issue count of milestone
664664
if issue.MilestoneID > 0 {
665-
if err := updateMilestoneCounters(e, issue.MilestoneID); err != nil {
665+
if err := updateMilestoneCounters(ctx, issue.MilestoneID); err != nil {
666666
return nil, err
667667
}
668668
}
669669

670-
if err := issue.updateClosedNum(e); err != nil {
670+
if err := issue.updateClosedNum(ctx); err != nil {
671671
return nil, err
672672
}
673673

@@ -722,7 +722,7 @@ func (issue *Issue) ChangeTitle(doer *user_model.User, oldTitle string) (err err
722722
}
723723
defer committer.Close()
724724

725-
if err = updateIssueCols(db.GetEngine(ctx), issue, "name"); err != nil {
725+
if err = updateIssueCols(ctx, issue, "name"); err != nil {
726726
return fmt.Errorf("updateIssueCols: %v", err)
727727
}
728728

@@ -756,7 +756,7 @@ func (issue *Issue) ChangeRef(doer *user_model.User, oldRef string) (err error)
756756
}
757757
defer committer.Close()
758758

759-
if err = updateIssueCols(db.GetEngine(ctx), issue, "ref"); err != nil {
759+
if err = updateIssueCols(ctx, issue, "ref"); err != nil {
760760
return fmt.Errorf("updateIssueCols: %v", err)
761761
}
762762

@@ -847,7 +847,7 @@ func (issue *Issue) ChangeContent(doer *user_model.User, content string) (err er
847847

848848
issue.Content = content
849849

850-
if err = updateIssueCols(db.GetEngine(ctx), issue, "content"); err != nil {
850+
if err = updateIssueCols(ctx, issue, "content"); err != nil {
851851
return fmt.Errorf("UpdateIssueCols: %v", err)
852852
}
853853

@@ -956,7 +956,7 @@ func newIssue(ctx context.Context, doer *user_model.User, opts NewIssueOptions)
956956
}
957957

958958
if opts.Issue.MilestoneID > 0 {
959-
if err := updateMilestoneCounters(e, opts.Issue.MilestoneID); err != nil {
959+
if err := updateMilestoneCounters(ctx, opts.Issue.MilestoneID); err != nil {
960960
return err
961961
}
962962

@@ -1970,10 +1970,9 @@ func UpdateIssueDeadline(issue *Issue, deadlineUnix timeutil.TimeStamp, doer *us
19701970
return err
19711971
}
19721972
defer committer.Close()
1973-
sess := db.GetEngine(ctx)
19741973

19751974
// Update the deadline
1976-
if err = updateIssueCols(sess, &Issue{ID: issue.ID, DeadlineUnix: deadlineUnix}, "deadline_unix"); err != nil {
1975+
if err = updateIssueCols(ctx, &Issue{ID: issue.ID, DeadlineUnix: deadlineUnix}, "deadline_unix"); err != nil {
19771976
return err
19781977
}
19791978

@@ -2059,21 +2058,11 @@ func (issue *Issue) BlockingDependencies() ([]*DependencyInfo, error) {
20592058
return issue.getBlockingDependencies(db.GetEngine(db.DefaultContext))
20602059
}
20612060

2062-
func (issue *Issue) updateClosedNum(e db.Engine) (err error) {
2061+
func (issue *Issue) updateClosedNum(ctx context.Context) (err error) {
20632062
if issue.IsPull {
2064-
_, err = e.Exec("UPDATE `repository` SET num_closed_pulls=(SELECT count(*) FROM issue WHERE repo_id=? AND is_pull=? AND is_closed=?) WHERE id=?",
2065-
issue.RepoID,
2066-
true,
2067-
true,
2068-
issue.RepoID,
2069-
)
2063+
err = repoStatsCorrectNumClosed(ctx, issue.RepoID, true, "num_closed_pulls")
20702064
} else {
2071-
_, err = e.Exec("UPDATE `repository` SET num_closed_issues=(SELECT count(*) FROM issue WHERE repo_id=? AND is_pull=? AND is_closed=?) WHERE id=?",
2072-
issue.RepoID,
2073-
false,
2074-
true,
2075-
issue.RepoID,
2076-
)
2065+
err = repoStatsCorrectNumClosed(ctx, issue.RepoID, false, "num_closed_issues")
20772066
}
20782067
return
20792068
}

models/issue_comment.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -856,12 +856,12 @@ func updateCommentInfos(ctx context.Context, opts *CreateCommentOptions, comment
856856
}
857857
}
858858
case CommentTypeReopen, CommentTypeClose:
859-
if err = opts.Issue.updateClosedNum(e); err != nil {
859+
if err = opts.Issue.updateClosedNum(ctx); err != nil {
860860
return err
861861
}
862862
}
863863
// update the issue's updated_unix column
864-
return updateIssueCols(e, opts.Issue, "updated_unix")
864+
return updateIssueCols(ctx, opts.Issue, "updated_unix")
865865
}
866866

867867
func createDeadlineComment(ctx context.Context, doer *user_model.User, issue *Issue, newDeadlineUnix timeutil.TimeStamp) (*Comment, error) {

models/issue_lock.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func updateIssueLock(opts *IssueLockOptions, lock bool) error {
4646
}
4747
defer committer.Close()
4848

49-
if err := updateIssueCols(db.GetEngine(ctx), opts.Issue, "is_locked"); err != nil {
49+
if err := updateIssueCols(ctx, opts.Issue, "is_locked"); err != nil {
5050
return err
5151
}
5252

models/issue_milestone.go

+18-22
Original file line numberDiff line numberDiff line change
@@ -158,37 +158,36 @@ func UpdateMilestone(m *Milestone, oldIsClosed bool) error {
158158
}
159159
defer committer.Close()
160160

161-
sess := db.GetEngine(ctx)
162-
163161
if m.IsClosed && !oldIsClosed {
164162
m.ClosedDateUnix = timeutil.TimeStampNow()
165163
}
166164

167-
if err := updateMilestone(sess, m); err != nil {
165+
if err := updateMilestone(ctx, m); err != nil {
168166
return err
169167
}
170168

171169
// if IsClosed changed, update milestone numbers of repository
172170
if oldIsClosed != m.IsClosed {
173-
if err := updateRepoMilestoneNum(sess, m.RepoID); err != nil {
171+
if err := updateRepoMilestoneNum(ctx, m.RepoID); err != nil {
174172
return err
175173
}
176174
}
177175

178176
return committer.Commit()
179177
}
180178

181-
func updateMilestone(e db.Engine, m *Milestone) error {
179+
func updateMilestone(ctx context.Context, m *Milestone) error {
182180
m.Name = strings.TrimSpace(m.Name)
183-
_, err := e.ID(m.ID).AllCols().Update(m)
181+
_, err := db.GetEngine(ctx).ID(m.ID).AllCols().Update(m)
184182
if err != nil {
185183
return err
186184
}
187-
return updateMilestoneCounters(e, m.ID)
185+
return updateMilestoneCounters(ctx, m.ID)
188186
}
189187

190188
// updateMilestoneCounters calculates NumIssues, NumClosesIssues and Completeness
191-
func updateMilestoneCounters(e db.Engine, id int64) error {
189+
func updateMilestoneCounters(ctx context.Context, id int64) error {
190+
e := db.GetEngine(ctx)
192191
_, err := e.ID(id).
193192
SetExpr("num_issues", builder.Select("count(*)").From("issue").Where(
194193
builder.Eq{"milestone_id": id},
@@ -217,21 +216,19 @@ func ChangeMilestoneStatusByRepoIDAndID(repoID, milestoneID int64, isClosed bool
217216
}
218217
defer committer.Close()
219218

220-
sess := db.GetEngine(ctx)
221-
222219
m := &Milestone{
223220
ID: milestoneID,
224221
RepoID: repoID,
225222
}
226223

227-
has, err := sess.ID(milestoneID).Where("repo_id = ?", repoID).Get(m)
224+
has, err := db.GetEngine(ctx).ID(milestoneID).Where("repo_id = ?", repoID).Get(m)
228225
if err != nil {
229226
return err
230227
} else if !has {
231228
return ErrMilestoneNotExist{ID: milestoneID, RepoID: repoID}
232229
}
233230

234-
if err := changeMilestoneStatus(sess, m, isClosed); err != nil {
231+
if err := changeMilestoneStatus(ctx, m, isClosed); err != nil {
235232
return err
236233
}
237234

@@ -246,43 +243,42 @@ func ChangeMilestoneStatus(m *Milestone, isClosed bool) (err error) {
246243
}
247244
defer committer.Close()
248245

249-
if err := changeMilestoneStatus(db.GetEngine(ctx), m, isClosed); err != nil {
246+
if err := changeMilestoneStatus(ctx, m, isClosed); err != nil {
250247
return err
251248
}
252249

253250
return committer.Commit()
254251
}
255252

256-
func changeMilestoneStatus(e db.Engine, m *Milestone, isClosed bool) error {
253+
func changeMilestoneStatus(ctx context.Context, m *Milestone, isClosed bool) error {
257254
m.IsClosed = isClosed
258255
if isClosed {
259256
m.ClosedDateUnix = timeutil.TimeStampNow()
260257
}
261258

262-
count, err := e.ID(m.ID).Where("repo_id = ? AND is_closed = ?", m.RepoID, !isClosed).Cols("is_closed", "closed_date_unix").Update(m)
259+
count, err := db.GetEngine(ctx).ID(m.ID).Where("repo_id = ? AND is_closed = ?", m.RepoID, !isClosed).Cols("is_closed", "closed_date_unix").Update(m)
263260
if err != nil {
264261
return err
265262
}
266263
if count < 1 {
267264
return nil
268265
}
269-
return updateRepoMilestoneNum(e, m.RepoID)
266+
return updateRepoMilestoneNum(ctx, m.RepoID)
270267
}
271268

272269
func changeMilestoneAssign(ctx context.Context, doer *user_model.User, issue *Issue, oldMilestoneID int64) error {
273-
e := db.GetEngine(ctx)
274-
if err := updateIssueCols(e, issue, "milestone_id"); err != nil {
270+
if err := updateIssueCols(ctx, issue, "milestone_id"); err != nil {
275271
return err
276272
}
277273

278274
if oldMilestoneID > 0 {
279-
if err := updateMilestoneCounters(e, oldMilestoneID); err != nil {
275+
if err := updateMilestoneCounters(ctx, oldMilestoneID); err != nil {
280276
return err
281277
}
282278
}
283279

284280
if issue.MilestoneID > 0 {
285-
if err := updateMilestoneCounters(e, issue.MilestoneID); err != nil {
281+
if err := updateMilestoneCounters(ctx, issue.MilestoneID); err != nil {
286282
return err
287283
}
288284
}
@@ -634,8 +630,8 @@ func CountMilestonesByRepoCondAndKw(repoCond builder.Cond, keyword string, isClo
634630
return countMap, nil
635631
}
636632

637-
func updateRepoMilestoneNum(e db.Engine, repoID int64) error {
638-
_, err := e.Exec("UPDATE `repository` SET num_milestones=(SELECT count(*) FROM milestone WHERE repo_id=?),num_closed_milestones=(SELECT count(*) FROM milestone WHERE repo_id=? AND is_closed=?) WHERE id=?",
633+
func updateRepoMilestoneNum(ctx context.Context, repoID int64) error {
634+
_, err := db.GetEngine(ctx).Exec("UPDATE `repository` SET num_milestones=(SELECT count(*) FROM milestone WHERE repo_id=?),num_closed_milestones=(SELECT count(*) FROM milestone WHERE repo_id=? AND is_closed=?) WHERE id=?",
639635
repoID,
640636
repoID,
641637
true,

models/issue_milestone_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -228,14 +228,14 @@ func TestUpdateMilestoneCounters(t *testing.T) {
228228
issue.ClosedUnix = timeutil.TimeStampNow()
229229
_, err := db.GetEngine(db.DefaultContext).ID(issue.ID).Cols("is_closed", "closed_unix").Update(issue)
230230
assert.NoError(t, err)
231-
assert.NoError(t, updateMilestoneCounters(db.GetEngine(db.DefaultContext), issue.MilestoneID))
231+
assert.NoError(t, updateMilestoneCounters(db.DefaultContext, issue.MilestoneID))
232232
unittest.CheckConsistencyFor(t, &Milestone{})
233233

234234
issue.IsClosed = false
235235
issue.ClosedUnix = 0
236236
_, err = db.GetEngine(db.DefaultContext).ID(issue.ID).Cols("is_closed", "closed_unix").Update(issue)
237237
assert.NoError(t, err)
238-
assert.NoError(t, updateMilestoneCounters(db.GetEngine(db.DefaultContext), issue.MilestoneID))
238+
assert.NoError(t, updateMilestoneCounters(db.DefaultContext, issue.MilestoneID))
239239
unittest.CheckConsistencyFor(t, &Milestone{})
240240
}
241241

models/issue_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ func TestUpdateIssueCols(t *testing.T) {
129129
issue.Content = "This should have no effect"
130130

131131
now := time.Now().Unix()
132-
assert.NoError(t, updateIssueCols(db.GetEngine(db.DefaultContext), issue, "name"))
132+
assert.NoError(t, updateIssueCols(db.DefaultContext, issue, "name"))
133133
then := time.Now().Unix()
134134

135135
updatedIssue := unittest.AssertExistsAndLoadBean(t, &Issue{ID: issue.ID}).(*Issue)

0 commit comments

Comments
 (0)