From d7d01946aebad337ace5873f1e3415448ab5c847 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 16 Feb 2025 17:44:56 -0800 Subject: [PATCH] Cache commit verification --- modules/templates/util_avatar.go | 8 +++++--- services/git/commit.go | 19 +++++++++++++++---- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/modules/templates/util_avatar.go b/modules/templates/util_avatar.go index f7dd408ee2..b44e48ee11 100644 --- a/modules/templates/util_avatar.go +++ b/modules/templates/util_avatar.go @@ -43,9 +43,11 @@ func (au *AvatarUtils) Avatar(item any, others ...any) template.HTML { switch t := item.(type) { case *user_model.User: - src := t.AvatarLinkWithSize(au.ctx, size*setting.Avatar.RenderedSizeFactor) - if src != "" { - return AvatarHTML(src, size, class, t.DisplayName()) + if t != nil && t.ID != 0 { + src := t.AvatarLinkWithSize(au.ctx, size*setting.Avatar.RenderedSizeFactor) + if src != "" { + return AvatarHTML(src, size, class, t.DisplayName()) + } } case *repo_model.Collaborator: src := t.AvatarLinkWithSize(au.ctx, size*setting.Avatar.RenderedSizeFactor) diff --git a/services/git/commit.go b/services/git/commit.go index 8ab8f3d369..f5abce3308 100644 --- a/services/git/commit.go +++ b/services/git/commit.go @@ -5,6 +5,7 @@ package git import ( "context" + "fmt" asymkey_model "code.gitea.io/gitea/models/asymkey" "code.gitea.io/gitea/models/db" @@ -18,9 +19,6 @@ import ( // ParseCommitsWithSignature checks if signaute of commits are corresponding to users gpg keys. func ParseCommitsWithSignature(ctx context.Context, oldCommits []*user_model.UserCommit, repoTrustModel repo_model.TrustModelType, isOwnerMemberCollaborator func(*user_model.User) (bool, error)) ([]*asymkey_model.SignCommit, error) { - newCommits := make([]*asymkey_model.SignCommit, 0, len(oldCommits)) - keyMap := map[string]bool{} - emails := make(container.Set[string]) for _, c := range oldCommits { if c.Committer != nil { @@ -33,6 +31,9 @@ func ParseCommitsWithSignature(ctx context.Context, oldCommits []*user_model.Use return nil, err } + newCommits := make([]*asymkey_model.SignCommit, 0, len(oldCommits)) + keyMap := map[string]bool{} + cachedVerifications := make(map[string]*asymkey_model.CommitVerification) for _, c := range oldCommits { committer, ok := emailUsers[c.Committer.Email] if !ok && c.Committer != nil { @@ -42,9 +43,19 @@ func ParseCommitsWithSignature(ctx context.Context, oldCommits []*user_model.Use } } + key := committer.Email + if c.Signature != nil { + key += fmt.Sprintf("-%s", c.Signature.Signature) + } + verification, ok := cachedVerifications[key] + if !ok { + verification = asymkey_service.ParseCommitWithSignatureCommitter(ctx, c.Commit, committer) + cachedVerifications[key] = verification + } + signCommit := &asymkey_model.SignCommit{ UserCommit: c, - Verification: asymkey_service.ParseCommitWithSignatureCommitter(ctx, c.Commit, committer), + Verification: verification, } _ = asymkey_model.CalculateTrustStatus(signCommit.Verification, repoTrustModel, isOwnerMemberCollaborator, &keyMap)