@@ -10,6 +10,7 @@ import (
10
10
"code.gitea.io/gitea/modules/setting"
11
11
api "code.gitea.io/gitea/modules/structs"
12
12
"code.gitea.io/gitea/modules/timeutil"
13
+ "xorm.io/builder"
13
14
14
15
"github.com/go-xorm/xorm"
15
16
)
@@ -191,7 +192,6 @@ func (milestones MilestoneList) getMilestoneIDs() []int64 {
191
192
192
193
// GetMilestonesByRepoID returns all opened milestones of a repository.
193
194
func GetMilestonesByRepoID (repoID int64 , state api.StateType ) (MilestoneList , error ) {
194
-
195
195
sess := x .Where ("repo_id = ?" , repoID )
196
196
197
197
switch state {
@@ -238,13 +238,34 @@ func GetMilestones(repoID int64, page int, isClosed bool, sortType string) (Mile
238
238
}
239
239
240
240
func updateMilestone (e Engine , m * Milestone ) error {
241
- _ , err := e .ID (m .ID ).AllCols ().Update (m )
241
+ _ , err := e .ID (m .ID ).AllCols ().
242
+ SetExpr ("num_issues" , builder .Select ("count(*)" ).From ("issue" ).Where (
243
+ builder.Eq {"milestone_id" : m .ID },
244
+ )).
245
+ SetExpr ("num_closed_issues" , builder .Select ("count(*)" ).From ("issue" ).Where (
246
+ builder.Eq {
247
+ "milestone_id" : m .ID ,
248
+ "is_closed" : true ,
249
+ },
250
+ )).
251
+ Update (m )
242
252
return err
243
253
}
244
254
245
255
// UpdateMilestone updates information of given milestone.
246
256
func UpdateMilestone (m * Milestone ) error {
247
- return updateMilestone (x , m )
257
+ if err := updateMilestone (x , m ); err != nil {
258
+ return err
259
+ }
260
+
261
+ return updateMilestoneCompleteness (x , m .ID )
262
+ }
263
+
264
+ func updateMilestoneCompleteness (e Engine , milestoneID int64 ) error {
265
+ _ , err := e .Exec ("UPDATE `milestone` SET completeness=100*num_closed_issues/(CASE WHEN num_issues > 0 THEN num_issues ELSE 1 END) WHERE id=?" ,
266
+ milestoneID ,
267
+ )
268
+ return err
248
269
}
249
270
250
271
func countRepoMilestones (e Engine , repoID int64 ) (int64 , error ) {
@@ -278,39 +299,34 @@ func MilestoneStats(repoID int64) (open int64, closed int64, err error) {
278
299
279
300
// ChangeMilestoneStatus changes the milestone open/closed status.
280
301
func ChangeMilestoneStatus (m * Milestone , isClosed bool ) (err error ) {
281
- repo , err := GetRepositoryByID (m .RepoID )
282
- if err != nil {
283
- return err
284
- }
285
-
286
302
sess := x .NewSession ()
287
303
defer sess .Close ()
288
304
if err = sess .Begin (); err != nil {
289
305
return err
290
306
}
291
307
292
308
m .IsClosed = isClosed
293
- if err = updateMilestone ( sess , m ); err != nil {
309
+ if _ , err := sess . ID ( m . ID ). Cols ( "is_closed" ). Update ( m ); err != nil {
294
310
return err
295
311
}
296
312
297
- numMilestones , err := countRepoMilestones (sess , repo .ID )
298
- if err != nil {
313
+ if err := updateRepoMilestoneNum (sess , m .RepoID ); err != nil {
299
314
return err
300
315
}
301
- numClosedMilestones , err := countRepoClosedMilestones (sess , repo .ID )
302
- if err != nil {
303
- return err
304
- }
305
- repo .NumMilestones = int (numMilestones )
306
- repo .NumClosedMilestones = int (numClosedMilestones )
307
316
308
- if _ , err = sess .ID (repo .ID ).Cols ("num_milestones, num_closed_milestones" ).Update (repo ); err != nil {
309
- return err
310
- }
311
317
return sess .Commit ()
312
318
}
313
319
320
+ func updateRepoMilestoneNum (e Engine , repoID int64 ) error {
321
+ _ , 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=?" ,
322
+ repoID ,
323
+ repoID ,
324
+ true ,
325
+ repoID ,
326
+ )
327
+ return err
328
+ }
329
+
314
330
func updateMilestoneTotalNum (e Engine , milestoneID int64 ) (err error ) {
315
331
if _ , err = e .Exec ("UPDATE `milestone` SET num_issues=(SELECT count(*) FROM issue WHERE milestone_id=?) WHERE id=?" ,
316
332
milestoneID ,
@@ -319,11 +335,7 @@ func updateMilestoneTotalNum(e Engine, milestoneID int64) (err error) {
319
335
return
320
336
}
321
337
322
- _ , err = e .Exec ("UPDATE `milestone` SET completeness=100*num_closed_issues/(CASE WHEN num_issues > 0 THEN num_issues ELSE 1 END) WHERE id=?" ,
323
- milestoneID ,
324
- )
325
-
326
- return
338
+ return updateMilestoneCompleteness (e , milestoneID )
327
339
}
328
340
329
341
func updateMilestoneClosedNum (e Engine , milestoneID int64 ) (err error ) {
@@ -335,10 +347,7 @@ func updateMilestoneClosedNum(e Engine, milestoneID int64) (err error) {
335
347
return
336
348
}
337
349
338
- _ , err = e .Exec ("UPDATE `milestone` SET completeness=100*num_closed_issues/(CASE WHEN num_issues > 0 THEN num_issues ELSE 1 END) WHERE id=?" ,
339
- milestoneID ,
340
- )
341
- return
350
+ return updateMilestoneCompleteness (e , milestoneID )
342
351
}
343
352
344
353
func changeMilestoneAssign (e * xorm.Session , doer * User , issue * Issue , oldMilestoneID int64 ) error {
0 commit comments