From e9aa39bda4581a69f04dd1d46aab7980940e99ce Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Fri, 19 Jul 2024 23:52:49 +0800 Subject: [PATCH] Fix a branch divergence cache bug (#31659) Fix #31599 A branch divergence is counted based on the default branch. If the default branch is updated, all divergence caches of the repo need to be deleted. --- services/repository/branch.go | 17 +++++++++++++++++ services/repository/push.go | 10 ++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/services/repository/branch.go b/services/repository/branch.go index 869921bfbc..7fc9993077 100644 --- a/services/repository/branch.go +++ b/services/repository/branch.go @@ -147,6 +147,23 @@ func DelDivergenceFromCache(repoID int64, branchName string) error { return cache.GetCache().Delete(getDivergenceCacheKey(repoID, branchName)) } +// DelRepoDivergenceFromCache deletes all divergence caches of a repository +func DelRepoDivergenceFromCache(ctx context.Context, repoID int64) error { + dbBranches, err := db.Find[git_model.Branch](ctx, git_model.FindBranchOptions{ + RepoID: repoID, + ListOptions: db.ListOptionsAll, + }) + if err != nil { + return err + } + for i := range dbBranches { + if err := DelDivergenceFromCache(repoID, dbBranches[i].Name); err != nil { + log.Error("DelDivergenceFromCache: %v", err) + } + } + return nil +} + func loadOneBranch(ctx context.Context, repo *repo_model.Repository, dbBranch *git_model.Branch, protectedBranches *git_model.ProtectedBranchRules, repoIDToRepo map[int64]*repo_model.Repository, repoIDToGitRepo map[int64]*git.Repository, diff --git a/services/repository/push.go b/services/repository/push.go index 39843249a5..f27e6a58dd 100644 --- a/services/repository/push.go +++ b/services/repository/push.go @@ -221,8 +221,14 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error { } // delete cache for divergence - if err := DelDivergenceFromCache(repo.ID, branch); err != nil { - log.Error("DelDivergenceFromCache: %v", err) + if branch == repo.DefaultBranch { + if err := DelRepoDivergenceFromCache(ctx, repo.ID); err != nil { + log.Error("DelRepoDivergenceFromCache: %v", err) + } + } else { + if err := DelDivergenceFromCache(repo.ID, branch); err != nil { + log.Error("DelDivergenceFromCache: %v", err) + } } commits := repo_module.GitToPushCommits(l)