@@ -146,8 +146,19 @@ func updateIssueNumbers(ctx context.Context, issue *Issue, doer *user_model.User
146146 }
147147
148148 // update repository's issue closed number
149- if err := repo_model .UpdateRepoIssueNumbers (ctx , issue .RepoID , issue .IsPull , true ); err != nil {
150- return nil , err
149+ switch cmtType {
150+ case CommentTypeClose , CommentTypeMergePull :
151+ // only increase closed count
152+ if err := IncrRepoIssueNumbers (ctx , issue .RepoID , issue .IsPull , false ); err != nil {
153+ return nil , err
154+ }
155+ case CommentTypeReopen :
156+ // only decrease closed count
157+ if err := DecrRepoIssueNumbers (ctx , issue .RepoID , issue .IsPull , false , true ); err != nil {
158+ return nil , err
159+ }
160+ default :
161+ return nil , fmt .Errorf ("invalid comment type: %d" , cmtType )
151162 }
152163
153164 return CreateComment (ctx , & CreateCommentOptions {
@@ -318,7 +329,6 @@ type NewIssueOptions struct {
318329 Issue * Issue
319330 LabelIDs []int64
320331 Attachments []string // In UUID format.
321- IsPull bool
322332}
323333
324334// NewIssueWithIndex creates issue with given index
@@ -369,7 +379,8 @@ func NewIssueWithIndex(ctx context.Context, doer *user_model.User, opts NewIssue
369379 }
370380 }
371381
372- if err := repo_model .UpdateRepoIssueNumbers (ctx , opts .Issue .RepoID , opts .IsPull , false ); err != nil {
382+ // Update repository issue total count
383+ if err := IncrRepoIssueNumbers (ctx , opts .Repo .ID , opts .Issue .IsPull , true ); err != nil {
373384 return err
374385 }
375386
@@ -439,6 +450,42 @@ func NewIssue(ctx context.Context, repo *repo_model.Repository, issue *Issue, la
439450 })
440451}
441452
453+ // IncrRepoIssueNumbers increments repository issue numbers.
454+ func IncrRepoIssueNumbers (ctx context.Context , repoID int64 , isPull , totalOrClosed bool ) error {
455+ dbSession := db .GetEngine (ctx )
456+ var colName string
457+ if totalOrClosed {
458+ colName = util .Iif (isPull , "num_pulls" , "num_issues" )
459+ } else {
460+ colName = util .Iif (isPull , "num_closed_pulls" , "num_closed_issues" )
461+ }
462+ _ , err := dbSession .Incr (colName ).ID (repoID ).
463+ NoAutoCondition ().NoAutoTime ().
464+ Update (new (repo_model.Repository ))
465+ return err
466+ }
467+
468+ // DecrRepoIssueNumbers decrements repository issue numbers.
469+ func DecrRepoIssueNumbers (ctx context.Context , repoID int64 , isPull , includeTotal , includeClosed bool ) error {
470+ if ! includeTotal && ! includeClosed {
471+ return fmt .Errorf ("no numbers to decrease for repo id %d" , repoID )
472+ }
473+
474+ dbSession := db .GetEngine (ctx )
475+ if includeTotal {
476+ colName := util .Iif (isPull , "num_pulls" , "num_issues" )
477+ dbSession = dbSession .Decr (colName )
478+ }
479+ if includeClosed {
480+ closedColName := util .Iif (isPull , "num_closed_pulls" , "num_closed_issues" )
481+ dbSession = dbSession .Decr (closedColName )
482+ }
483+ _ , err := dbSession .ID (repoID ).
484+ NoAutoCondition ().NoAutoTime ().
485+ Update (new (repo_model.Repository ))
486+ return err
487+ }
488+
442489// UpdateIssueMentions updates issue-user relations for mentioned users.
443490func UpdateIssueMentions (ctx context.Context , issueID int64 , mentions []* user_model.User ) error {
444491 if len (mentions ) == 0 {
0 commit comments