Fix issues count bug (#21557)
fix #19349 , #19505 Co-authored-by: delvh <dev.lh@web.de>
This commit is contained in:
		
							parent
							
								
									29c00eb1ed
								
							
						
					
					
						commit
						5e8e3ecbeb
					
				|  | @ -886,7 +886,7 @@ func updateCommentInfos(ctx context.Context, opts *CreateCommentOptions, comment | |||
| 			} | ||||
| 		} | ||||
| 	case CommentTypeReopen, CommentTypeClose: | ||||
| 		if err = updateIssueClosedNum(ctx, opts.Issue); err != nil { | ||||
| 		if err = repo_model.UpdateRepoIssueNumbers(ctx, opts.Issue.RepoID, opts.Issue.IsPull, true); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  |  | |||
|  | @ -725,7 +725,8 @@ func doChangeIssueStatus(ctx context.Context, issue *Issue, doer *user_model.Use | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if err := updateIssueClosedNum(ctx, issue); err != nil { | ||||
| 	// update repository's issue closed number
 | ||||
| 	if err := repo_model.UpdateRepoIssueNumbers(ctx, issue.RepoID, issue.IsPull, true); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
|  | @ -2137,15 +2138,6 @@ func (issue *Issue) BlockingDependencies(ctx context.Context) (issueDeps []*Depe | |||
| 	return issueDeps, err | ||||
| } | ||||
| 
 | ||||
| func updateIssueClosedNum(ctx context.Context, issue *Issue) (err error) { | ||||
| 	if issue.IsPull { | ||||
| 		err = repo_model.StatsCorrectNumClosed(ctx, issue.RepoID, true, "num_closed_pulls") | ||||
| 	} else { | ||||
| 		err = repo_model.StatsCorrectNumClosed(ctx, issue.RepoID, false, "num_closed_issues") | ||||
| 	} | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| // FindAndUpdateIssueMentions finds users mentioned in the given content string, and saves them in the database.
 | ||||
| func FindAndUpdateIssueMentions(ctx context.Context, issue *Issue, doer *user_model.User, content string) (mentions []*user_model.User, err error) { | ||||
| 	rawMentions := references.FindAllMentionsMarkdown(content) | ||||
|  |  | |||
|  | @ -404,24 +404,19 @@ func repoStatsCorrectIssueNumComments(ctx context.Context, id int64) error { | |||
| } | ||||
| 
 | ||||
| func repoStatsCorrectNumIssues(ctx context.Context, id int64) error { | ||||
| 	return repoStatsCorrectNum(ctx, id, false, "num_issues") | ||||
| 	return repo_model.UpdateRepoIssueNumbers(ctx, id, false, false) | ||||
| } | ||||
| 
 | ||||
| func repoStatsCorrectNumPulls(ctx context.Context, id int64) error { | ||||
| 	return repoStatsCorrectNum(ctx, id, true, "num_pulls") | ||||
| } | ||||
| 
 | ||||
| func repoStatsCorrectNum(ctx context.Context, id int64, isPull bool, field string) error { | ||||
| 	_, err := db.GetEngine(ctx).Exec("UPDATE `repository` SET "+field+"=(SELECT COUNT(*) FROM `issue` WHERE repo_id=? AND is_pull=?) WHERE id=?", id, isPull, id) | ||||
| 	return err | ||||
| 	return repo_model.UpdateRepoIssueNumbers(ctx, id, true, false) | ||||
| } | ||||
| 
 | ||||
| func repoStatsCorrectNumClosedIssues(ctx context.Context, id int64) error { | ||||
| 	return repo_model.StatsCorrectNumClosed(ctx, id, false, "num_closed_issues") | ||||
| 	return repo_model.UpdateRepoIssueNumbers(ctx, id, false, true) | ||||
| } | ||||
| 
 | ||||
| func repoStatsCorrectNumClosedPulls(ctx context.Context, id int64) error { | ||||
| 	return repo_model.StatsCorrectNumClosed(ctx, id, true, "num_closed_pulls") | ||||
| 	return repo_model.UpdateRepoIssueNumbers(ctx, id, true, true) | ||||
| } | ||||
| 
 | ||||
| func statsQuery(args ...interface{}) func(context.Context) ([]map[string][]byte, error) { | ||||
|  |  | |||
|  | @ -765,35 +765,30 @@ func CountRepositories(ctx context.Context, opts CountRepositoryOptions) (int64, | |||
| 	return count, nil | ||||
| } | ||||
| 
 | ||||
| // StatsCorrectNumClosed update repository's issue related numbers
 | ||||
| func StatsCorrectNumClosed(ctx context.Context, id int64, isPull bool, field string) error { | ||||
| 	_, err := db.Exec(ctx, "UPDATE `repository` SET "+field+"=(SELECT COUNT(*) FROM `issue` WHERE repo_id=? AND is_closed=? AND is_pull=?) WHERE id=?", id, true, isPull, id) | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| // UpdateRepoIssueNumbers update repository issue numbers
 | ||||
| // UpdateRepoIssueNumbers updates one of a repositories amount of (open|closed) (issues|PRs) with the current count
 | ||||
| func UpdateRepoIssueNumbers(ctx context.Context, repoID int64, isPull, isClosed bool) error { | ||||
| 	e := db.GetEngine(ctx) | ||||
| 	field := "num_" | ||||
| 	if isClosed { | ||||
| 		field += "closed_" | ||||
| 	} | ||||
| 	if isPull { | ||||
| 		if _, err := e.ID(repoID).Decr("num_pulls").Update(new(Repository)); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if isClosed { | ||||
| 			if _, err := e.ID(repoID).Decr("num_closed_pulls").Update(new(Repository)); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 		field += "pulls" | ||||
| 	} else { | ||||
| 		if _, err := e.ID(repoID).Decr("num_issues").Update(new(Repository)); err != nil { | ||||
| 		field += "issues" | ||||
| 	} | ||||
| 
 | ||||
| 	subQuery := builder.Select("count(*)"). | ||||
| 		From("issue").Where(builder.Eq{ | ||||
| 		"repo_id": repoID, | ||||
| 		"is_pull": isPull, | ||||
| 	}.And(builder.If(isClosed, builder.Eq{"is_closed": isClosed}))) | ||||
| 
 | ||||
| 	// builder.Update(cond) will generate SQL like UPDATE ... SET cond
 | ||||
| 	query := builder.Update(builder.Eq{field: subQuery}). | ||||
| 		From("repository"). | ||||
| 		Where(builder.Eq{"id": repoID}) | ||||
| 	_, err := db.Exec(ctx, query) | ||||
| 	return err | ||||
| 		} | ||||
| 		if isClosed { | ||||
| 			if _, err := e.ID(repoID).Decr("num_closed_issues").Update(new(Repository)); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // CountNullArchivedRepository counts the number of repositories with is_archived is null
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue