diff --git a/models/git/commit_status.go b/models/git/commit_status.go index 256096c828b..ebabb7d4627 100644 --- a/models/git/commit_status.go +++ b/models/git/commit_status.go @@ -182,7 +182,7 @@ func GetNextCommitStatusIndex(ctx context.Context, repoID int64, sha string) (in func (status *CommitStatus) loadRepository(ctx context.Context) (err error) { if status.Repo == nil { - status.Repo, err = repo_model.GetRepositoryByID(ctx, status.RepoID) + status.Repo, err = cache.GetWithContextCache(ctx, cachegroup.Repository, status.RepoID, repo_model.GetRepositoryByID) if err != nil { return fmt.Errorf("getRepositoryByID [%d]: %w", status.RepoID, err) } @@ -230,11 +230,9 @@ func (status *CommitStatus) cutTargetURLGiteaActionsPrefix(ctx context.Context) return "", false } - if status.Repo == nil { - if err := status.loadRepository(ctx); err != nil { - log.Error("loadRepository: %v", err) - return "", false - } + if err := status.loadRepository(ctx); err != nil { + log.Error("loadRepository: %v", err) + return "", false } prefix := status.Repo.Link() + "/actions" @@ -572,11 +570,12 @@ func SignCommitsApplyDoerPermission(ctx context.Context, doer *user_model.User, } func statusRepoCanReadActions(ctx context.Context, doer *user_model.User, status *CommitStatus) bool { + if err := status.loadRepository(ctx); err != nil { + log.Error("loadRepository: %v", err) + return false + } perm, err := cache.GetWithContextCache(ctx, cachegroup.RepoUserPermission, access_model.RepoUserPermissionCacheKey(status.RepoID, doer), - func(ctx context.Context, _ string) (access_model.Permission, error) { // only runs on a cache miss - if err := status.loadRepository(ctx); err != nil { - return access_model.Permission{}, err - } + func(ctx context.Context, _key string) (access_model.Permission, error) { return access_model.GetDoerRepoPermission(ctx, status.Repo, doer) }, ) diff --git a/models/git/commit_status_test.go b/models/git/commit_status_test.go index 8b1c250cf28..954e444e8da 100644 --- a/models/git/commit_status_test.go +++ b/models/git/commit_status_test.go @@ -13,6 +13,7 @@ import ( repo_model "gitea.dev/models/repo" "gitea.dev/models/unittest" user_model "gitea.dev/models/user" + "gitea.dev/modules/cache" "gitea.dev/modules/commitstatus" "gitea.dev/modules/git" @@ -281,8 +282,10 @@ func TestCommitStatusesApplyDoerPermission(t *testing.T) { }, } - git_model.CommitStatusesApplyDoerPermission(t.Context(), doer, statuses) + git_model.CommitStatusesApplyDoerPermission(cache.WithCacheContext(t.Context()), doer, statuses) assert.Equal(t, visibleURL, statuses[0].TargetURL) assert.Empty(t, statuses[1].TargetURL) assert.Equal(t, "https://mycicd.org/1", statuses[2].TargetURL) + assert.NotNil(t, statuses[0].Repo) + assert.Same(t, statuses[0].Repo, statuses[2].Repo) } diff --git a/modules/actions/commit_status_info.go b/modules/actions/commit_status_info.go index e7e33695440..4afb6e52b90 100644 --- a/modules/actions/commit_status_info.go +++ b/modules/actions/commit_status_info.go @@ -11,7 +11,6 @@ import ( actions_model "gitea.dev/models/actions" "gitea.dev/models/db" git_model "gitea.dev/models/git" - repo_model "gitea.dev/models/repo" "gitea.dev/modules/log" ) @@ -36,19 +35,11 @@ func GetCommitActionsStatusMap(ctx context.Context, statuses []*git_model.Commit return nil } statusByJobID := make(map[int64]*git_model.CommitStatus) - repoByID := make(map[int64]*repo_model.Repository) for _, status := range statuses { if status == nil || status.TargetURL == "" { continue } - if status.Repo == nil { - status.Repo = repoByID[status.RepoID] - } - // ParseGiteaActionsTargetURL lazy-loads status.Repo on miss; cache the - // outcome so later entries with the same RepoID skip that load. - _, jobID, ok := status.ParseGiteaActionsTargetURL(ctx) - repoByID[status.RepoID] = status.Repo - if ok { + if _, jobID, ok := status.ParseGiteaActionsTargetURL(ctx); ok { statusByJobID[jobID] = status } } diff --git a/modules/cachegroup/cachegroup.go b/modules/cachegroup/cachegroup.go index 06085f860f7..2655fdb7b5b 100644 --- a/modules/cachegroup/cachegroup.go +++ b/modules/cachegroup/cachegroup.go @@ -8,5 +8,6 @@ const ( EmailAvatarLink = "email_avatar_link" UserEmailAddresses = "user_email_addresses" GPGKeyWithSubKeys = "gpg_key_with_subkeys" + Repository = "repository" RepoUserPermission = "repo_user_permission" ) diff --git a/services/context/repo.go b/services/context/repo.go index a7f3982850f..a4c8f89f2fa 100644 --- a/services/context/repo.go +++ b/services/context/repo.go @@ -455,8 +455,9 @@ func repoAssignmentLegacy(ctx *Context, data *repoAssignmentPrepareDataStruct) { return } } - // publish it so code resolving the same permission later in this request reuses it + // publish them so code resolving the same repository or permission later in this request reuses them if c := cache.GetContextCache(ctx); c != nil { + c.Put(cachegroup.Repository, repo.ID, repo) c.Put(cachegroup.RepoUserPermission, access_model.RepoUserPermissionCacheKey(repo.ID, ctx.Doer), ctx.Repo.Permission) }