mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Backport #22037. When deleting a closed issue, we should update both `NumIssues`and `NumClosedIssues`, or `NumOpenIssues`(`= NumIssues -NumClosedIssues`) will be wrong. It's the same for pull requests. Releated to #21557. Alse fixed two harmless problems: - The SQL to check issue/PR total numbers is wrong, that means it will update the numbers even if they are correct. - Replace legacy `num_issues = num_issues + 1` operations with `UpdateRepoIssueNumbers`. Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
This commit is contained in:
		@@ -1010,12 +1010,7 @@ func NewIssueWithIndex(ctx context.Context, doer *user_model.User, opts NewIssue
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if opts.IsPull {
 | 
						if err := repo_model.UpdateRepoIssueNumbers(ctx, opts.Issue.RepoID, opts.IsPull, false); err != nil {
 | 
				
			||||||
		_, err = e.Exec("UPDATE `repository` SET num_pulls = num_pulls + 1 WHERE id = ?", opts.Issue.RepoID)
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		_, err = e.Exec("UPDATE `repository` SET num_issues = num_issues + 1 WHERE id = ?", opts.Issue.RepoID)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -444,7 +444,7 @@ func CheckRepoStats(ctx context.Context) error {
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		// Repository.NumIssues
 | 
							// Repository.NumIssues
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			statsQuery("SELECT repo.id FROM `repository` repo WHERE repo.num_issues!=(SELECT COUNT(*) FROM `issue` WHERE repo_id=repo.id AND is_closed=? AND is_pull=?)", false, false),
 | 
								statsQuery("SELECT repo.id FROM `repository` repo WHERE repo.num_issues!=(SELECT COUNT(*) FROM `issue` WHERE repo_id=repo.id AND is_pull=?)", false),
 | 
				
			||||||
			repoStatsCorrectNumIssues,
 | 
								repoStatsCorrectNumIssues,
 | 
				
			||||||
			"repository count 'num_issues'",
 | 
								"repository count 'num_issues'",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@@ -456,7 +456,7 @@ func CheckRepoStats(ctx context.Context) error {
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		// Repository.NumPulls
 | 
							// Repository.NumPulls
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			statsQuery("SELECT repo.id FROM `repository` repo WHERE repo.num_pulls!=(SELECT COUNT(*) FROM `issue` WHERE repo_id=repo.id AND is_closed=? AND is_pull=?)", false, true),
 | 
								statsQuery("SELECT repo.id FROM `repository` repo WHERE repo.num_pulls!=(SELECT COUNT(*) FROM `issue` WHERE repo_id=repo.id AND is_pull=?)", true),
 | 
				
			||||||
			repoStatsCorrectNumPulls,
 | 
								repoStatsCorrectNumPulls,
 | 
				
			||||||
			"repository count 'num_pulls'",
 | 
								"repository count 'num_pulls'",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -220,9 +220,16 @@ func deleteIssue(issue *issues_model.Issue) error {
 | 
				
			|||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := repo_model.UpdateRepoIssueNumbers(ctx, issue.RepoID, issue.IsPull, issue.IsClosed); err != nil {
 | 
						// update the total issue numbers
 | 
				
			||||||
 | 
						if err := repo_model.UpdateRepoIssueNumbers(ctx, issue.RepoID, issue.IsPull, false); err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						// if the issue is closed, update the closed issue numbers
 | 
				
			||||||
 | 
						if issue.IsClosed {
 | 
				
			||||||
 | 
							if err := repo_model.UpdateRepoIssueNumbers(ctx, issue.RepoID, issue.IsPull, true); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := issues_model.UpdateMilestoneCounters(ctx, issue.MilestoneID); err != nil {
 | 
						if err := issues_model.UpdateMilestoneCounters(ctx, issue.MilestoneID); err != nil {
 | 
				
			||||||
		return fmt.Errorf("error updating counters for milestone id %d: %w",
 | 
							return fmt.Errorf("error updating counters for milestone id %d: %w",
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user