@@ -311,71 +311,74 @@ func ChangeMilestoneStatus(m *Milestone, isClosed bool) (err error) {
311311 return sess .Commit ()
312312}
313313
314- func changeMilestoneIssueStats (e * xorm.Session , issue * Issue ) error {
315- if issue .MilestoneID == 0 {
316- return nil
314+ func updateMilestoneTotalNum (e Engine , milestoneID int64 ) (err error ) {
315+ if _ , err = e .Exec ("UPDATE `milestone` SET num_issues=(SELECT count(*) FROM issue WHERE milestone_id=?) WHERE id=?" ,
316+ milestoneID ,
317+ milestoneID ,
318+ ); err != nil {
319+ return
317320 }
318321
319- m , err := getMilestoneByRepoID (e , issue .RepoID , issue .MilestoneID )
320- if err != nil {
321- return err
322- }
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+ )
323325
324- if issue .IsClosed {
325- m .NumOpenIssues --
326- m .NumClosedIssues ++
327- } else {
328- m .NumOpenIssues ++
329- m .NumClosedIssues --
326+ return
327+ }
328+
329+ func updateMilestoneClosedNum (e Engine , milestoneID int64 ) (err error ) {
330+ if _ , err = e .Exec ("UPDATE `milestone` SET num_closed_issues=(SELECT count(*) FROM issue WHERE milestone_id=? AND is_closed=?) WHERE id=?" ,
331+ milestoneID ,
332+ true ,
333+ milestoneID ,
334+ ); err != nil {
335+ return
330336 }
331337
332- return updateMilestone (e , m )
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
333342}
334343
335344func changeMilestoneAssign (e * xorm.Session , doer * User , issue * Issue , oldMilestoneID int64 ) error {
345+ if err := updateIssueCols (e , issue , "milestone_id" ); err != nil {
346+ return err
347+ }
348+
336349 if oldMilestoneID > 0 {
337- m , err := getMilestoneByRepoID (e , issue .RepoID , oldMilestoneID )
338- if err != nil {
350+ if err := updateMilestoneTotalNum (e , oldMilestoneID ); err != nil {
339351 return err
340352 }
341-
342- m .NumIssues --
343353 if issue .IsClosed {
344- m .NumClosedIssues --
345- }
346-
347- if err = updateMilestone (e , m ); err != nil {
348- return err
354+ if err := updateMilestoneClosedNum (e , oldMilestoneID ); err != nil {
355+ return err
356+ }
349357 }
350358 }
351359
352360 if issue .MilestoneID > 0 {
353- m , err := getMilestoneByRepoID (e , issue .RepoID , issue .MilestoneID )
354- if err != nil {
361+ if err := updateMilestoneTotalNum (e , issue .MilestoneID ); err != nil {
355362 return err
356363 }
357-
358- m .NumIssues ++
359364 if issue .IsClosed {
360- m .NumClosedIssues ++
365+ if err := updateMilestoneClosedNum (e , issue .MilestoneID ); err != nil {
366+ return err
367+ }
361368 }
369+ }
362370
363- if err = updateMilestone (e , m ); err != nil {
371+ if oldMilestoneID > 0 || issue .MilestoneID > 0 {
372+ if err := issue .loadRepo (e ); err != nil {
364373 return err
365374 }
366- }
367-
368- if err := issue .loadRepo (e ); err != nil {
369- return err
370- }
371375
372- if oldMilestoneID > 0 || issue .MilestoneID > 0 {
373376 if _ , err := createMilestoneComment (e , doer , issue .Repo , issue , oldMilestoneID , issue .MilestoneID ); err != nil {
374377 return err
375378 }
376379 }
377380
378- return updateIssueCols ( e , issue , "milestone_id" )
381+ return nil
379382}
380383
381384// ChangeMilestoneAssign changes assignment of milestone for issue.
0 commit comments