Skip to content

Commit 6da5fc6

Browse files
committed
fix
1 parent f88dbf8 commit 6da5fc6

File tree

8 files changed

+221
-107
lines changed

8 files changed

+221
-107
lines changed

routers/web/repo/cherry_pick.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,19 @@ func CherryPickPost(ctx *context.Context) {
114114
message += "\n\n" + form.CommitMessage
115115
}
116116

117+
gitCommitter, valid := WebGitOperationGetCommitChosenEmailIdentity(ctx, form.CommitEmail)
118+
if !valid {
119+
ctx.Data["Err_CommitEmail"] = true
120+
ctx.RenderWithErr(ctx.Tr("repo.editor.invalid_commit_email"), tplCherryPick, &form)
121+
return
122+
}
117123
opts := &files.ApplyDiffPatchOptions{
118124
LastCommitID: form.LastCommit,
119125
OldBranch: ctx.Repo.BranchName,
120126
NewBranch: branchName,
121127
Message: message,
128+
Author: gitCommitter,
129+
Committer: gitCommitter,
122130
}
123131

124132
// First lets try the simple plain read-tree -m approach

routers/web/repo/editor.go

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313
git_model "code.gitea.io/gitea/models/git"
1414
repo_model "code.gitea.io/gitea/models/repo"
1515
"code.gitea.io/gitea/models/unit"
16-
user_model "code.gitea.io/gitea/models/user"
1716
"code.gitea.io/gitea/modules/charset"
1817
"code.gitea.io/gitea/modules/git"
1918
"code.gitea.io/gitea/modules/json"
@@ -103,18 +102,6 @@ func getParentTreeFields(treePath string) (treeNames, treePaths []string) {
103102
return treeNames, treePaths
104103
}
105104

106-
func getCandidateEmailAddresses(ctx *context.Context) []string {
107-
emails, err := user_model.GetActivatedEmailAddresses(ctx, ctx.Doer.ID)
108-
if err != nil {
109-
log.Error("getCandidateEmailAddresses: GetActivatedEmailAddresses: %v", err)
110-
}
111-
112-
if ctx.Doer.KeepEmailPrivate {
113-
emails = append([]string{ctx.Doer.GetPlaceholderEmail()}, emails...)
114-
}
115-
return emails
116-
}
117-
118105
func editFileCommon(ctx *context.Context, isNewFile bool) {
119106
ctx.Data["PageIsEdit"] = true
120107
ctx.Data["IsNewFile"] = isNewFile
@@ -123,8 +110,6 @@ func editFileCommon(ctx *context.Context, isNewFile bool) {
123110
ctx.Data["LineWrapExtensions"] = strings.Join(setting.Repository.Editor.LineWrapExtensions, ",")
124111
ctx.Data["IsEditingFileOnly"] = ctx.FormString("return_uri") != ""
125112
ctx.Data["ReturnURI"] = ctx.FormString("return_uri")
126-
ctx.Data["CommitCandidateEmails"] = getCandidateEmailAddresses(ctx)
127-
ctx.Data["CommitDefaultEmail"] = ctx.Doer.GetEmail()
128113
}
129114

130115
func editFile(ctx *context.Context, isNewFile bool) {
@@ -287,15 +272,11 @@ func editFilePost(ctx *context.Context, form forms.EditRepoFileForm, isNewFile b
287272
message += "\n\n" + form.CommitMessage
288273
}
289274

290-
gitCommitter := &files_service.IdentityOptions{}
291-
if form.CommitEmail != "" {
292-
if util.SliceContainsString(getCandidateEmailAddresses(ctx), form.CommitEmail, true) {
293-
gitCommitter.GitUserEmail = form.CommitEmail
294-
} else {
295-
ctx.Data["Err_CommitEmail"] = true
296-
ctx.RenderWithErr(ctx.Tr("repo.editor.invalid_commit_email"), tplEditFile, &form)
297-
return
298-
}
275+
gitCommitter, valid := WebGitOperationGetCommitChosenEmailIdentity(ctx, form.CommitEmail)
276+
if !valid {
277+
ctx.Data["Err_CommitEmail"] = true
278+
ctx.RenderWithErr(ctx.Tr("repo.editor.invalid_commit_email"), tplEditFile, &form)
279+
return
299280
}
300281

301282
operation := "update"
@@ -515,6 +496,13 @@ func DeleteFilePost(ctx *context.Context) {
515496
message += "\n\n" + form.CommitMessage
516497
}
517498

499+
gitCommitter, valid := WebGitOperationGetCommitChosenEmailIdentity(ctx, form.CommitEmail)
500+
if !valid {
501+
ctx.Data["Err_CommitEmail"] = true
502+
ctx.RenderWithErr(ctx.Tr("repo.editor.invalid_commit_email"), tplDeleteFile, &form)
503+
return
504+
}
505+
518506
if _, err := files_service.ChangeRepoFiles(ctx, ctx.Repo.Repository, ctx.Doer, &files_service.ChangeRepoFilesOptions{
519507
LastCommitID: form.LastCommit,
520508
OldBranch: ctx.Repo.BranchName,
@@ -525,8 +513,10 @@ func DeleteFilePost(ctx *context.Context) {
525513
TreePath: ctx.Repo.TreePath,
526514
},
527515
},
528-
Message: message,
529-
Signoff: form.Signoff,
516+
Message: message,
517+
Signoff: form.Signoff,
518+
Author: gitCommitter,
519+
Committer: gitCommitter,
530520
}); err != nil {
531521
// This is where we handle all the errors thrown by repofiles.DeleteRepoFile
532522
if git.IsErrNotExist(err) || files_service.IsErrRepoFileDoesNotExist(err) {
@@ -726,6 +716,13 @@ func UploadFilePost(ctx *context.Context) {
726716
message += "\n\n" + form.CommitMessage
727717
}
728718

719+
gitCommitter, valid := WebGitOperationGetCommitChosenEmailIdentity(ctx, form.CommitEmail)
720+
if !valid {
721+
ctx.Data["Err_CommitEmail"] = true
722+
ctx.RenderWithErr(ctx.Tr("repo.editor.invalid_commit_email"), tplUploadFile, &form)
723+
return
724+
}
725+
729726
if err := files_service.UploadRepoFiles(ctx, ctx.Repo.Repository, ctx.Doer, &files_service.UploadRepoFileOptions{
730727
LastCommitID: ctx.Repo.CommitID,
731728
OldBranch: oldBranchName,
@@ -734,6 +731,8 @@ func UploadFilePost(ctx *context.Context) {
734731
Message: message,
735732
Files: form.Files,
736733
Signoff: form.Signoff,
734+
Author: gitCommitter,
735+
Committer: gitCommitter,
737736
}); err != nil {
738737
if git_model.IsErrLFSFileLocked(err) {
739738
ctx.Data["Err_TreePath"] = true

routers/web/repo/patch.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func NewDiffPatchPost(ctx *context.Context) {
6666
return
6767
}
6868

69-
// Cannot commit to a an existing branch if user doesn't have rights
69+
// Cannot commit to an existing branch if user doesn't have rights
7070
if branchName == ctx.Repo.BranchName && !canCommit {
7171
ctx.Data["Err_NewBranchName"] = true
7272
ctx.Data["commit_choice"] = frmCommitChoiceNewBranch
@@ -86,12 +86,21 @@ func NewDiffPatchPost(ctx *context.Context) {
8686
message += "\n\n" + form.CommitMessage
8787
}
8888

89+
gitCommitter, valid := WebGitOperationGetCommitChosenEmailIdentity(ctx, form.CommitEmail)
90+
if !valid {
91+
ctx.Data["Err_CommitEmail"] = true
92+
ctx.RenderWithErr(ctx.Tr("repo.editor.invalid_commit_email"), tplPatchFile, &form)
93+
return
94+
}
95+
8996
fileResponse, err := files.ApplyDiffPatch(ctx, ctx.Repo.Repository, ctx.Doer, &files.ApplyDiffPatchOptions{
9097
LastCommitID: form.LastCommit,
9198
OldBranch: ctx.Repo.BranchName,
9299
NewBranch: branchName,
93100
Message: message,
94101
Content: strings.ReplaceAll(form.Content, "\r", ""),
102+
Author: gitCommitter,
103+
Committer: gitCommitter,
95104
})
96105
if err != nil {
97106
if git_model.IsErrBranchAlreadyExists(err) {

routers/web/repo/webgit.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Copyright 2025 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package repo
5+
6+
import (
7+
user_model "code.gitea.io/gitea/models/user"
8+
"code.gitea.io/gitea/modules/log"
9+
"code.gitea.io/gitea/modules/setting"
10+
"code.gitea.io/gitea/modules/util"
11+
"code.gitea.io/gitea/services/context"
12+
files_service "code.gitea.io/gitea/services/repository/files"
13+
)
14+
15+
func WebGitOperationCommonData(ctx *context.Context) {
16+
// TODO: more places like "wiki page" and "merging a pull request or creating an auto merge merging task"
17+
emails, err := user_model.GetActivatedEmailAddresses(ctx, ctx.Doer.ID)
18+
if err != nil {
19+
log.Error("WebGitOperationCommonData: GetActivatedEmailAddresses: %v", err)
20+
}
21+
if ctx.Doer.KeepEmailPrivate {
22+
emails = append([]string{ctx.Doer.GetPlaceholderEmail()}, emails...)
23+
}
24+
ctx.Data["CommitCandidateEmails"] = emails
25+
ctx.Data["CommitDefaultEmail"] = ctx.Doer.GetEmail()
26+
}
27+
28+
func WebGitOperationGetCommitChosenEmailIdentity(ctx *context.Context, email string) (_ *files_service.IdentityOptions, valid bool) {
29+
if ctx.Data["CommitCandidateEmails"] == nil {
30+
setting.PanicInDevOrTesting("no CommitCandidateEmails in context data")
31+
}
32+
emails, _ := ctx.Data["CommitCandidateEmails"].([]string)
33+
if email == "" {
34+
return nil, true
35+
}
36+
if util.SliceContainsString(emails, email, true) {
37+
return &files_service.IdentityOptions{GitUserEmail: email}, true
38+
}
39+
return nil, false
40+
}

routers/web/web.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1294,21 +1294,20 @@ func registerRoutes(m *web.Router) {
12941294
m.Group("/{username}/{reponame}", func() { // repo code
12951295
m.Group("", func() {
12961296
m.Group("", func() {
1297+
m.Post("/_preview/*", web.Bind(forms.EditPreviewDiffForm{}), repo.DiffPreviewPost)
12971298
m.Combo("/_edit/*").Get(repo.EditFile).
12981299
Post(web.Bind(forms.EditRepoFileForm{}), repo.EditFilePost)
12991300
m.Combo("/_new/*").Get(repo.NewFile).
13001301
Post(web.Bind(forms.EditRepoFileForm{}), repo.NewFilePost)
1301-
m.Post("/_preview/*", web.Bind(forms.EditPreviewDiffForm{}), repo.DiffPreviewPost)
13021302
m.Combo("/_delete/*").Get(repo.DeleteFile).
13031303
Post(web.Bind(forms.DeleteRepoFileForm{}), repo.DeleteFilePost)
1304-
m.Combo("/_upload/*", repo.MustBeAbleToUpload).
1305-
Get(repo.UploadFile).
1304+
m.Combo("/_upload/*", repo.MustBeAbleToUpload).Get(repo.UploadFile).
13061305
Post(web.Bind(forms.UploadRepoFileForm{}), repo.UploadFilePost)
13071306
m.Combo("/_diffpatch/*").Get(repo.NewDiffPatch).
13081307
Post(web.Bind(forms.EditRepoFileForm{}), repo.NewDiffPatchPost)
13091308
m.Combo("/_cherrypick/{sha:([a-f0-9]{7,64})}/*").Get(repo.CherryPick).
13101309
Post(web.Bind(forms.CherryPickForm{}), repo.CherryPickPost)
1311-
}, context.RepoRefByType(git.RefTypeBranch), context.CanWriteToBranch())
1310+
}, context.RepoRefByType(git.RefTypeBranch), context.CanWriteToBranch(), repo.WebGitOperationCommonData)
13121311
m.Group("", func() {
13131312
m.Post("/upload-file", repo.UploadFileToServer)
13141313
m.Post("/upload-remove", web.Bind(forms.RemoveUploadFileForm{}), repo.RemoveUploadFileFromServer)

services/forms/repo_form.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -756,6 +756,7 @@ type CherryPickForm struct {
756756
LastCommit string
757757
Revert bool
758758
Signoff bool
759+
CommitEmail string
759760
}
760761

761762
// Validate validates the fields
@@ -781,6 +782,7 @@ type UploadRepoFileForm struct {
781782
NewBranchName string `binding:"GitRefName;MaxSize(100)"`
782783
Files []string
783784
Signoff bool
785+
CommitEmail string
784786
}
785787

786788
// Validate validates the fields
@@ -815,6 +817,7 @@ type DeleteRepoFileForm struct {
815817
NewBranchName string `binding:"GitRefName;MaxSize(100)"`
816818
LastCommit string
817819
Signoff bool
820+
CommitEmail string
818821
}
819822

820823
// Validate validates the fields

services/repository/files/upload.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ type UploadRepoFileOptions struct {
2727
Message string
2828
Files []string // In UUID format.
2929
Signoff bool
30+
Author *IdentityOptions
31+
Committer *IdentityOptions
3032
}
3133

3234
type uploadInfo struct {
@@ -130,11 +132,13 @@ func UploadRepoFiles(ctx context.Context, repo *repo_model.Repository, doer *use
130132

131133
// Now commit the tree
132134
commitOpts := &CommitTreeUserOptions{
133-
ParentCommitID: opts.LastCommitID,
134-
TreeHash: treeHash,
135-
CommitMessage: opts.Message,
136-
SignOff: opts.Signoff,
137-
DoerUser: doer,
135+
ParentCommitID: opts.LastCommitID,
136+
TreeHash: treeHash,
137+
CommitMessage: opts.Message,
138+
SignOff: opts.Signoff,
139+
DoerUser: doer,
140+
AuthorIdentity: opts.Author,
141+
CommitterIdentity: opts.Committer,
138142
}
139143
commitHash, err := t.CommitTree(commitOpts)
140144
if err != nil {

0 commit comments

Comments
 (0)