Fix #30421 Backport #30426 Co-authored-by: Jason Song <i@wolfogre.com> (cherry picked from commit 7ffc0acc424b3116e1a478962b3ea51611c710e3) Conflicts: services/repository/commitstatus/commitstatus.go resolved in the same way as https://codeberg.org/forgejo/forgejo/pulls/3245/files#diff-1122f6e98dabe36f18c4ec06bce75fc9a799d83c
This commit is contained in:
parent
ce31e611e2
commit
05523fc96f
1 changed files with 42 additions and 12 deletions
|
@ -15,6 +15,7 @@ import (
|
||||||
"code.gitea.io/gitea/modules/cache"
|
"code.gitea.io/gitea/modules/cache"
|
||||||
"code.gitea.io/gitea/modules/git"
|
"code.gitea.io/gitea/modules/git"
|
||||||
"code.gitea.io/gitea/modules/gitrepo"
|
"code.gitea.io/gitea/modules/gitrepo"
|
||||||
|
"code.gitea.io/gitea/modules/json"
|
||||||
"code.gitea.io/gitea/modules/log"
|
"code.gitea.io/gitea/modules/log"
|
||||||
api "code.gitea.io/gitea/modules/structs"
|
api "code.gitea.io/gitea/modules/structs"
|
||||||
"code.gitea.io/gitea/services/automerge"
|
"code.gitea.io/gitea/services/automerge"
|
||||||
|
@ -25,12 +26,41 @@ func getCacheKey(repoID int64, brancheName string) string {
|
||||||
return fmt.Sprintf("commit_status:%x", hashBytes)
|
return fmt.Sprintf("commit_status:%x", hashBytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateCommitStatusCache(ctx context.Context, repoID int64, branchName string, status api.CommitStatusState) error {
|
type commitStatusCacheValue struct {
|
||||||
c := cache.GetCache()
|
State string `json:"state"`
|
||||||
return c.Put(getCacheKey(repoID, branchName), string(status), 3*24*60)
|
TargetURL string `json:"target_url"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func deleteCommitStatusCache(ctx context.Context, repoID int64, branchName string) error {
|
func getCommitStatusCache(repoID int64, branchName string) *commitStatusCacheValue {
|
||||||
|
c := cache.GetCache()
|
||||||
|
statusStr, ok := c.Get(getCacheKey(repoID, branchName)).(string)
|
||||||
|
if ok && statusStr != "" {
|
||||||
|
var cv commitStatusCacheValue
|
||||||
|
err := json.Unmarshal([]byte(statusStr), &cv)
|
||||||
|
if err == nil && cv.State != "" {
|
||||||
|
return &cv
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
log.Warn("getCommitStatusCache: json.Unmarshal failed: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateCommitStatusCache(repoID int64, branchName string, state api.CommitStatusState, targetURL string) error {
|
||||||
|
c := cache.GetCache()
|
||||||
|
bs, err := json.Marshal(commitStatusCacheValue{
|
||||||
|
State: state.String(),
|
||||||
|
TargetURL: targetURL,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
log.Warn("updateCommitStatusCache: json.Marshal failed: %v", err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return c.Put(getCacheKey(repoID, branchName), string(bs), 3*24*60)
|
||||||
|
}
|
||||||
|
|
||||||
|
func deleteCommitStatusCache(repoID int64, branchName string) error {
|
||||||
c := cache.GetCache()
|
c := cache.GetCache()
|
||||||
return c.Delete(getCacheKey(repoID, branchName))
|
return c.Delete(getCacheKey(repoID, branchName))
|
||||||
}
|
}
|
||||||
|
@ -74,7 +104,7 @@ func CreateCommitStatus(ctx context.Context, repo *repo_model.Repository, creato
|
||||||
}
|
}
|
||||||
|
|
||||||
if commit.ID.String() == defaultBranchCommit.ID.String() { // since one commit status updated, the combined commit status should be invalid
|
if commit.ID.String() == defaultBranchCommit.ID.String() { // since one commit status updated, the combined commit status should be invalid
|
||||||
if err := deleteCommitStatusCache(ctx, repo.ID, repo.DefaultBranch); err != nil {
|
if err := deleteCommitStatusCache(repo.ID, repo.DefaultBranch); err != nil {
|
||||||
log.Error("deleteCommitStatusCache[%d:%s] failed: %v", repo.ID, repo.DefaultBranch, err)
|
log.Error("deleteCommitStatusCache[%d:%s] failed: %v", repo.ID, repo.DefaultBranch, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -91,12 +121,12 @@ func CreateCommitStatus(ctx context.Context, repo *repo_model.Repository, creato
|
||||||
// FindReposLastestCommitStatuses loading repository default branch latest combinded commit status with cache
|
// FindReposLastestCommitStatuses loading repository default branch latest combinded commit status with cache
|
||||||
func FindReposLastestCommitStatuses(ctx context.Context, repos []*repo_model.Repository) ([]*git_model.CommitStatus, error) {
|
func FindReposLastestCommitStatuses(ctx context.Context, repos []*repo_model.Repository) ([]*git_model.CommitStatus, error) {
|
||||||
results := make([]*git_model.CommitStatus, len(repos))
|
results := make([]*git_model.CommitStatus, len(repos))
|
||||||
c := cache.GetCache()
|
|
||||||
|
|
||||||
for i, repo := range repos {
|
for i, repo := range repos {
|
||||||
status, ok := c.Get(getCacheKey(repo.ID, repo.DefaultBranch)).(string)
|
if cv := getCommitStatusCache(repo.ID, repo.DefaultBranch); cv != nil {
|
||||||
if ok && status != "" {
|
results[i] = &git_model.CommitStatus{
|
||||||
results[i] = &git_model.CommitStatus{State: api.CommitStatusState(status)}
|
State: api.CommitStatusState(cv.State),
|
||||||
|
TargetURL: cv.TargetURL,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,8 +153,8 @@ func FindReposLastestCommitStatuses(ctx context.Context, repos []*repo_model.Rep
|
||||||
for i, repo := range repos {
|
for i, repo := range repos {
|
||||||
if results[i] == nil {
|
if results[i] == nil {
|
||||||
results[i] = git_model.CalcCommitStatus(repoToItsLatestCommitStatuses[repo.ID])
|
results[i] = git_model.CalcCommitStatus(repoToItsLatestCommitStatuses[repo.ID])
|
||||||
if results[i] != nil {
|
if results[i] != nil && results[i].State != "" {
|
||||||
if err := updateCommitStatusCache(ctx, repo.ID, repo.DefaultBranch, results[i].State); err != nil {
|
if err := updateCommitStatusCache(repo.ID, repo.DefaultBranch, results[i].State, results[i].TargetURL); err != nil {
|
||||||
log.Error("updateCommitStatusCache[%d:%s] failed: %v", repo.ID, repo.DefaultBranch, err)
|
log.Error("updateCommitStatusCache[%d:%s] failed: %v", repo.ID, repo.DefaultBranch, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue