diff options
-rw-r--r-- | models/fixtures/email_address.yml | 2 | ||||
-rw-r--r-- | models/user/user.go | 24 | ||||
-rw-r--r-- | models/user/user_test.go | 34 | ||||
-rw-r--r-- | options/locale/locale_fr-FR.ini | 1 | ||||
-rw-r--r-- | options/locale/locale_ga-IE.ini | 1 | ||||
-rw-r--r-- | options/locale/locale_pt-PT.ini | 1 | ||||
-rw-r--r-- | options/locale/locale_zh-CN.ini | 6 | ||||
-rw-r--r-- | services/git/commit.go | 8 |
8 files changed, 56 insertions, 21 deletions
diff --git a/models/fixtures/email_address.yml b/models/fixtures/email_address.yml index b2a0432635..0f6bd9ee6d 100644 --- a/models/fixtures/email_address.yml +++ b/models/fixtures/email_address.yml @@ -81,7 +81,7 @@ - id: 11 uid: 4 - email: user4@example.com + email: User4@Example.Com lower_email: user4@example.com is_activated: true is_primary: true diff --git a/models/user/user.go b/models/user/user.go index d7331d79f0..86a3549345 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -1151,8 +1151,8 @@ func ValidateCommitsWithEmails(ctx context.Context, oldCommits []*git.Commit) ([ } for _, c := range oldCommits { - user, ok := emailUserMap[c.Author.Email] - if !ok { + user := emailUserMap.GetByEmail(c.Author.Email) // FIXME: why ValidateCommitsWithEmails uses "Author", but ParseCommitsWithSignature uses "Committer"? + if user == nil { user = &User{ Name: c.Author.Name, Email: c.Author.Email, @@ -1166,7 +1166,15 @@ func ValidateCommitsWithEmails(ctx context.Context, oldCommits []*git.Commit) ([ return newCommits, nil } -func GetUsersByEmails(ctx context.Context, emails []string) (map[string]*User, error) { +type EmailUserMap struct { + m map[string]*User +} + +func (eum *EmailUserMap) GetByEmail(email string) *User { + return eum.m[strings.ToLower(email)] +} + +func GetUsersByEmails(ctx context.Context, emails []string) (*EmailUserMap, error) { if len(emails) == 0 { return nil, nil } @@ -1176,7 +1184,7 @@ func GetUsersByEmails(ctx context.Context, emails []string) (map[string]*User, e for _, email := range emails { if strings.HasSuffix(email, "@"+setting.Service.NoReplyAddress) { username := strings.TrimSuffix(email, "@"+setting.Service.NoReplyAddress) - needCheckUserNames.Add(username) + needCheckUserNames.Add(strings.ToLower(username)) } else { needCheckEmails.Add(strings.ToLower(email)) } @@ -1203,8 +1211,7 @@ func GetUsersByEmails(ctx context.Context, emails []string) (map[string]*User, e for _, email := range emailAddresses { user := users[email.UID] if user != nil { - results[user.Email] = user - results[user.GetPlaceholderEmail()] = user + results[email.LowerEmail] = user } } } @@ -1214,10 +1221,9 @@ func GetUsersByEmails(ctx context.Context, emails []string) (map[string]*User, e return nil, err } for _, user := range users { - results[user.Email] = user - results[user.GetPlaceholderEmail()] = user + results[strings.ToLower(user.GetPlaceholderEmail())] = user } - return results, nil + return &EmailUserMap{results}, nil } // GetUserByEmail returns the user object by given e-mail if exists. diff --git a/models/user/user_test.go b/models/user/user_test.go index 15412f94c5..93b6e68a8d 100644 --- a/models/user/user_test.go +++ b/models/user/user_test.go @@ -58,13 +58,33 @@ func TestUserEmails(t *testing.T) { assert.ElementsMatch(t, []string{"user8@example.com"}, user_model.GetUserEmailsByNames(db.DefaultContext, []string{"user8", "org7"})) }) t.Run("GetUsersByEmails", func(t *testing.T) { - m, err := user_model.GetUsersByEmails(db.DefaultContext, []string{"user1@example.com", "user2@" + setting.Service.NoReplyAddress}) - require.NoError(t, err) - require.Len(t, m, 4) - assert.EqualValues(t, 1, m["user1@example.com"].ID) - assert.EqualValues(t, 1, m["user1@"+setting.Service.NoReplyAddress].ID) - assert.EqualValues(t, 2, m["user2@example.com"].ID) - assert.EqualValues(t, 2, m["user2@"+setting.Service.NoReplyAddress].ID) + defer test.MockVariableValue(&setting.Service.NoReplyAddress, "NoReply.gitea.internal")() + testGetUserByEmail := func(t *testing.T, email string, uid int64) { + m, err := user_model.GetUsersByEmails(db.DefaultContext, []string{email}) + require.NoError(t, err) + user := m.GetByEmail(email) + if uid == 0 { + require.Nil(t, user) + return + } + require.NotNil(t, user) + assert.Equal(t, uid, user.ID) + } + cases := []struct { + Email string + UID int64 + }{ + {"UseR1@example.com", 1}, + {"user1-2@example.COM", 1}, + {"USER2@" + setting.Service.NoReplyAddress, 2}, + {"user4@example.com", 4}, + {"no-such", 0}, + } + for _, c := range cases { + t.Run(c.Email, func(t *testing.T) { + testGetUserByEmail(t, c.Email, c.UID) + }) + } }) } diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 1a85e1806c..2cc0ca7202 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -1560,6 +1560,7 @@ issues.filter_user_placeholder=Rechercher des utilisateurs issues.filter_user_no_select=Tous les utilisateurs issues.filter_type=Type issues.filter_type.all_issues=Tous les tickets +issues.filter_type.all_pull_requests=Toutes les demandes d’ajout issues.filter_type.assigned_to_you=Qui vous sont assignés issues.filter_type.created_by_you=Créés par vous issues.filter_type.mentioning_you=Vous mentionnant diff --git a/options/locale/locale_ga-IE.ini b/options/locale/locale_ga-IE.ini index c3e0346a3a..79df1d26d0 100644 --- a/options/locale/locale_ga-IE.ini +++ b/options/locale/locale_ga-IE.ini @@ -1560,6 +1560,7 @@ issues.filter_user_placeholder=Cuardaigh úsáideoirí issues.filter_user_no_select=Gach úsáideoir issues.filter_type=Cineál issues.filter_type.all_issues=Gach saincheist +issues.filter_type.all_pull_requests=Gach iarratas tarraingt issues.filter_type.assigned_to_you=Sannta duit issues.filter_type.created_by_you=Cruthaithe agat issues.filter_type.mentioning_you=Ag tagairt duit diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index f232418cde..d932feacae 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -1559,6 +1559,7 @@ issues.filter_user_placeholder=Procurar utilizadores issues.filter_user_no_select=Todos os utilizadores issues.filter_type=Tipo issues.filter_type.all_issues=Todas as questões +issues.filter_type.all_pull_requests=Todos os pedidos de integração issues.filter_type.assigned_to_you=Atribuídas a si issues.filter_type.created_by_you=Criadas por si issues.filter_type.mentioning_you=Mencionando a si diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index d91a06d205..d35814d82a 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -1228,6 +1228,7 @@ migrate.migrating_issues=迁移工单 migrate.migrating_pulls=迁移合并请求 migrate.cancel_migrating_title=取消迁移 migrate.cancel_migrating_confirm=您想要取消此次迁移吗? +migrating_status=迁移状态 mirror_from=镜像自地址 forked_from=派生自 @@ -1559,6 +1560,7 @@ issues.filter_user_placeholder=搜索用户 issues.filter_user_no_select=所有用户 issues.filter_type=类型筛选 issues.filter_type.all_issues=所有工单 +issues.filter_type.all_pull_requests=所有合并请求 issues.filter_type.assigned_to_you=指派给您的 issues.filter_type.created_by_you=由您创建的 issues.filter_type.mentioning_you=提及您的 @@ -3810,6 +3812,10 @@ runs.no_workflows.documentation=关于Gitea Actions的更多信息,请参阅 < runs.no_runs=工作流尚未运行过。 runs.empty_commit_message=(空白的提交消息) runs.expire_log_message=旧的日志已被清除 +runs.delete=删除工作流运行 +runs.delete.description=您确定要永久删除此工作流运行吗?此操作无法撤消。 +runs.not_done=此工作流运行未完成。 +runs.view_workflow_file=查看工作流文件 workflow.disable=禁用工作流 workflow.disable_success=工作流 '%s' 已成功禁用。 diff --git a/services/git/commit.go b/services/git/commit.go index d3ebcab569..2e0e8a5096 100644 --- a/services/git/commit.go +++ b/services/git/commit.go @@ -34,9 +34,9 @@ func ParseCommitsWithSignature(ctx context.Context, repo *repo_model.Repository, } for _, c := range oldCommits { - committer, ok := emailUsers[c.Committer.Email] - if !ok && c.Committer != nil { - committer = &user_model.User{ + committerUser := emailUsers.GetByEmail(c.Committer.Email) // FIXME: why ValidateCommitsWithEmails uses "Author", but ParseCommitsWithSignature uses "Committer"? + if committerUser == nil { + committerUser = &user_model.User{ Name: c.Committer.Name, Email: c.Committer.Email, } @@ -44,7 +44,7 @@ func ParseCommitsWithSignature(ctx context.Context, repo *repo_model.Repository, signCommit := &asymkey_model.SignCommit{ UserCommit: c, - Verification: asymkey_service.ParseCommitWithSignatureCommitter(ctx, c.Commit, committer), + Verification: asymkey_service.ParseCommitWithSignatureCommitter(ctx, c.Commit, committerUser), } isOwnerMemberCollaborator := func(user *user_model.User) (bool, error) { |