mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Fix CheckRepoStats and reuse it during migration (#18264)
The CheckRepoStats function missed the following counters: - label num_closed_issues & num_closed_pulls - milestone num_closed_issues & num_closed_pulls The update SQL statements for updating the repository num_closed_issues & num_closed_pulls fields were repeated in three functions (repo.CheckRepoStats, migrate.insertIssues and models.Issue.updateClosedNum) and were moved to a single helper. The UpdateRepoStats is implemented and called in the Finish migration method so that it happens immediately instead of wating for the CheckRepoStats to run. Signed-off-by: Loïc Dachary loic@dachary.org --- [source](https://lab.forgefriends.org/forgefriends/forgefriends/-/merge_requests/34)
This commit is contained in:
		
				
					committed by
					
						
						GitHub
					
				
			
			
				
	
			
			
			
						parent
						
							7dde39a6db
						
					
				
				
					commit
					076cead40d
				
			@@ -5,6 +5,8 @@
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models/db"
 | 
			
		||||
	"code.gitea.io/gitea/modules/structs"
 | 
			
		||||
 | 
			
		||||
@@ -46,25 +48,28 @@ func InsertIssues(issues ...*Issue) error {
 | 
			
		||||
	defer committer.Close()
 | 
			
		||||
 | 
			
		||||
	for _, issue := range issues {
 | 
			
		||||
		if err := insertIssue(db.GetEngine(ctx), issue); err != nil {
 | 
			
		||||
		if err := insertIssue(ctx, issue); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	err = UpdateRepoStats(ctx, issues[0].RepoID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return committer.Commit()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func insertIssue(sess db.Engine, issue *Issue) error {
 | 
			
		||||
func insertIssue(ctx context.Context, issue *Issue) error {
 | 
			
		||||
	sess := db.GetEngine(ctx)
 | 
			
		||||
	if _, err := sess.NoAutoTime().Insert(issue); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	issueLabels := make([]IssueLabel, 0, len(issue.Labels))
 | 
			
		||||
	labelIDs := make([]int64, 0, len(issue.Labels))
 | 
			
		||||
	for _, label := range issue.Labels {
 | 
			
		||||
		issueLabels = append(issueLabels, IssueLabel{
 | 
			
		||||
			IssueID: issue.ID,
 | 
			
		||||
			LabelID: label.ID,
 | 
			
		||||
		})
 | 
			
		||||
		labelIDs = append(labelIDs, label.ID)
 | 
			
		||||
	}
 | 
			
		||||
	if len(issueLabels) > 0 {
 | 
			
		||||
		if _, err := sess.Insert(issueLabels); err != nil {
 | 
			
		||||
@@ -82,54 +87,6 @@ func insertIssue(sess db.Engine, issue *Issue) error {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	cols := make([]string, 0)
 | 
			
		||||
	if !issue.IsPull {
 | 
			
		||||
		sess.ID(issue.RepoID).Incr("num_issues")
 | 
			
		||||
		cols = append(cols, "num_issues")
 | 
			
		||||
		if issue.IsClosed {
 | 
			
		||||
			sess.Incr("num_closed_issues")
 | 
			
		||||
			cols = append(cols, "num_closed_issues")
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		sess.ID(issue.RepoID).Incr("num_pulls")
 | 
			
		||||
		cols = append(cols, "num_pulls")
 | 
			
		||||
		if issue.IsClosed {
 | 
			
		||||
			sess.Incr("num_closed_pulls")
 | 
			
		||||
			cols = append(cols, "num_closed_pulls")
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if _, err := sess.NoAutoTime().Cols(cols...).Update(issue.Repo); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	cols = []string{"num_issues"}
 | 
			
		||||
	sess.Incr("num_issues")
 | 
			
		||||
	if issue.IsClosed {
 | 
			
		||||
		sess.Incr("num_closed_issues")
 | 
			
		||||
		cols = append(cols, "num_closed_issues")
 | 
			
		||||
	}
 | 
			
		||||
	if _, err := sess.In("id", labelIDs).NoAutoTime().Cols(cols...).Update(new(Label)); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if issue.MilestoneID > 0 {
 | 
			
		||||
		cols = []string{"num_issues"}
 | 
			
		||||
		sess.Incr("num_issues")
 | 
			
		||||
		cl := "num_closed_issues"
 | 
			
		||||
		if issue.IsClosed {
 | 
			
		||||
			sess.Incr("num_closed_issues")
 | 
			
		||||
			cols = append(cols, "num_closed_issues")
 | 
			
		||||
			cl = "(num_closed_issues + 1)"
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if _, err := sess.ID(issue.MilestoneID).
 | 
			
		||||
			SetExpr("completeness", cl+" * 100 / (num_issues + 1)").
 | 
			
		||||
			NoAutoTime().Cols(cols...).
 | 
			
		||||
			Update(new(Milestone)); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -182,7 +139,7 @@ func InsertPullRequests(prs ...*PullRequest) error {
 | 
			
		||||
	defer committer.Close()
 | 
			
		||||
	sess := db.GetEngine(ctx)
 | 
			
		||||
	for _, pr := range prs {
 | 
			
		||||
		if err := insertIssue(sess, pr.Issue); err != nil {
 | 
			
		||||
		if err := insertIssue(ctx, pr.Issue); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		pr.IssueID = pr.Issue.ID
 | 
			
		||||
@@ -191,6 +148,10 @@ func InsertPullRequests(prs ...*PullRequest) error {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = UpdateRepoStats(ctx, prs[0].Issue.RepoID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return committer.Commit()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user