Skip to content

Commit 47efba7

Browse files
wolfogredelvh
andauthored
Support template for merge message description (#22248)
Fix #21435. Use the first line of the template as the git commit message title, and the rest as the description. ## Snapshots <img width="806" alt="image" src="https://user-images.githubusercontent.com/9418365/209644083-5d85179c-cf58-404f-bc98-c662398a2411.png"> <img width="860" alt="image" src="https://user-images.githubusercontent.com/9418365/209644392-22573090-e2c1-458b-ba44-855b79735632.png"> <img width="1154" alt="image" src="https://user-images.githubusercontent.com/9418365/209644457-a1b2711a-6787-45b4-b52c-a88d7fc132d7.png"> Co-authored-by: delvh <[email protected]>
1 parent a357498 commit 47efba7

File tree

7 files changed

+103
-25
lines changed

7 files changed

+103
-25
lines changed

Diff for: routers/api/v1/repo/pull.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -815,7 +815,7 @@ func MergePullRequest(ctx *context.APIContext) {
815815

816816
message := strings.TrimSpace(form.MergeTitleField)
817817
if len(message) == 0 {
818-
message, err = pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pr, repo_model.MergeStyle(form.Do))
818+
message, _, err = pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pr, repo_model.MergeStyle(form.Do))
819819
if err != nil {
820820
ctx.Error(http.StatusInternalServerError, "GetDefaultMergeMessage", err)
821821
return

Diff for: routers/web/repo/issue.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -1664,19 +1664,21 @@ func ViewIssue(ctx *context.Context) {
16641664

16651665
ctx.Data["MergeStyle"] = mergeStyle
16661666

1667-
defaultMergeMessage, err := pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pull, mergeStyle)
1667+
defaultMergeMessage, defaultMergeBody, err := pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pull, mergeStyle)
16681668
if err != nil {
16691669
ctx.ServerError("GetDefaultMergeMessage", err)
16701670
return
16711671
}
16721672
ctx.Data["DefaultMergeMessage"] = defaultMergeMessage
1673+
ctx.Data["DefaultMergeBody"] = defaultMergeBody
16731674

1674-
defaultSquashMergeMessage, err := pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pull, repo_model.MergeStyleSquash)
1675+
defaultSquashMergeMessage, defaultSquashMergeBody, err := pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pull, repo_model.MergeStyleSquash)
16751676
if err != nil {
16761677
ctx.ServerError("GetDefaultSquashMergeMessage", err)
16771678
return
16781679
}
16791680
ctx.Data["DefaultSquashMergeMessage"] = defaultSquashMergeMessage
1681+
ctx.Data["DefaultSquashMergeBody"] = defaultSquashMergeBody
16801682

16811683
if err = pull.LoadProtectedBranch(ctx); err != nil {
16821684
ctx.ServerError("LoadProtectedBranch", err)

Diff for: routers/web/repo/pull.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -986,7 +986,7 @@ func MergePullRequest(ctx *context.Context) {
986986
message := strings.TrimSpace(form.MergeTitleField)
987987
if len(message) == 0 {
988988
var err error
989-
message, err = pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pr, repo_model.MergeStyle(form.Do))
989+
message, _, err = pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pr, repo_model.MergeStyle(form.Do))
990990
if err != nil {
991991
ctx.ServerError("GetDefaultMergeMessage", err)
992992
return

Diff for: services/pull/merge.go

+23-15
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,19 @@ import (
3939
)
4040

4141
// GetDefaultMergeMessage returns default message used when merging pull request
42-
func GetDefaultMergeMessage(ctx context.Context, baseGitRepo *git.Repository, pr *issues_model.PullRequest, mergeStyle repo_model.MergeStyle) (string, error) {
42+
func GetDefaultMergeMessage(ctx context.Context, baseGitRepo *git.Repository, pr *issues_model.PullRequest, mergeStyle repo_model.MergeStyle) (message, body string, err error) {
4343
if err := pr.LoadHeadRepo(ctx); err != nil {
44-
return "", err
44+
return "", "", err
4545
}
4646
if err := pr.LoadBaseRepo(ctx); err != nil {
47-
return "", err
47+
return "", "", err
4848
}
4949
if pr.BaseRepo == nil {
50-
return "", repo_model.ErrRepoNotExist{ID: pr.BaseRepoID}
50+
return "", "", repo_model.ErrRepoNotExist{ID: pr.BaseRepoID}
5151
}
5252

5353
if err := pr.LoadIssue(ctx); err != nil {
54-
return "", err
54+
return "", "", err
5555
}
5656

5757
isExternalTracker := pr.BaseRepo.UnitEnabled(ctx, unit.TypeExternalTracker)
@@ -64,12 +64,12 @@ func GetDefaultMergeMessage(ctx context.Context, baseGitRepo *git.Repository, pr
6464
templateFilepath := fmt.Sprintf(".gitea/default_merge_message/%s_TEMPLATE.md", strings.ToUpper(string(mergeStyle)))
6565
commit, err := baseGitRepo.GetBranchCommit(pr.BaseRepo.DefaultBranch)
6666
if err != nil {
67-
return "", err
67+
return "", "", err
6868
}
6969
templateContent, err := commit.GetFileContent(templateFilepath, setting.Repository.PullRequest.DefaultMergeMessageSize)
7070
if err != nil {
7171
if !git.IsErrNotExist(err) {
72-
return "", err
72+
return "", "", err
7373
}
7474
} else {
7575
vars := map[string]string{
@@ -107,27 +107,35 @@ func GetDefaultMergeMessage(ctx context.Context, baseGitRepo *git.Repository, pr
107107
vars["ClosingIssues"] = ""
108108
}
109109
}
110-
111-
return os.Expand(templateContent, func(s string) string {
112-
return vars[s]
113-
}), nil
110+
message, body = expandDefaultMergeMessage(templateContent, vars)
111+
return message, body, nil
114112
}
115113
}
116114

117115
// Squash merge has a different from other styles.
118116
if mergeStyle == repo_model.MergeStyleSquash {
119-
return fmt.Sprintf("%s (%s%d)", pr.Issue.Title, issueReference, pr.Issue.Index), nil
117+
return fmt.Sprintf("%s (%s%d)", pr.Issue.Title, issueReference, pr.Issue.Index), "", nil
120118
}
121119

122120
if pr.BaseRepoID == pr.HeadRepoID {
123-
return fmt.Sprintf("Merge pull request '%s' (%s%d) from %s into %s", pr.Issue.Title, issueReference, pr.Issue.Index, pr.HeadBranch, pr.BaseBranch), nil
121+
return fmt.Sprintf("Merge pull request '%s' (%s%d) from %s into %s", pr.Issue.Title, issueReference, pr.Issue.Index, pr.HeadBranch, pr.BaseBranch), "", nil
124122
}
125123

126124
if pr.HeadRepo == nil {
127-
return fmt.Sprintf("Merge pull request '%s' (%s%d) from <deleted>:%s into %s", pr.Issue.Title, issueReference, pr.Issue.Index, pr.HeadBranch, pr.BaseBranch), nil
125+
return fmt.Sprintf("Merge pull request '%s' (%s%d) from <deleted>:%s into %s", pr.Issue.Title, issueReference, pr.Issue.Index, pr.HeadBranch, pr.BaseBranch), "", nil
128126
}
129127

130-
return fmt.Sprintf("Merge pull request '%s' (%s%d) from %s:%s into %s", pr.Issue.Title, issueReference, pr.Issue.Index, pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseBranch), nil
128+
return fmt.Sprintf("Merge pull request '%s' (%s%d) from %s:%s into %s", pr.Issue.Title, issueReference, pr.Issue.Index, pr.HeadRepo.FullName(), pr.HeadBranch, pr.BaseBranch), "", nil
129+
}
130+
131+
func expandDefaultMergeMessage(template string, vars map[string]string) (message, body string) {
132+
message = strings.TrimSpace(template)
133+
if splits := strings.SplitN(message, "\n", 2); len(splits) == 2 {
134+
message = splits[0]
135+
body = strings.TrimSpace(splits[1])
136+
}
137+
mapping := func(s string) string { return vars[s] }
138+
return os.Expand(message, mapping), os.Expand(body, mapping)
131139
}
132140

133141
// Merge merges pull request to base repository.

Diff for: services/pull/merge_test.go

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
// Copyright 2022 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package pull
5+
6+
import (
7+
"testing"
8+
9+
"github.com/stretchr/testify/assert"
10+
)
11+
12+
func Test_expandDefaultMergeMessage(t *testing.T) {
13+
type args struct {
14+
template string
15+
vars map[string]string
16+
}
17+
tests := []struct {
18+
name string
19+
args args
20+
want string
21+
wantBody string
22+
}{
23+
{
24+
name: "single line",
25+
args: args{
26+
template: "Merge ${PullRequestTitle}",
27+
vars: map[string]string{
28+
"PullRequestTitle": "PullRequestTitle",
29+
"PullRequestDescription": "Pull\nRequest\nDescription\n",
30+
},
31+
},
32+
want: "Merge PullRequestTitle",
33+
wantBody: "",
34+
},
35+
{
36+
name: "multiple lines",
37+
args: args{
38+
template: "Merge ${PullRequestTitle}\nDescription:\n\n${PullRequestDescription}\n",
39+
vars: map[string]string{
40+
"PullRequestTitle": "PullRequestTitle",
41+
"PullRequestDescription": "Pull\nRequest\nDescription\n",
42+
},
43+
},
44+
want: "Merge PullRequestTitle",
45+
wantBody: "Description:\n\nPull\nRequest\nDescription\n",
46+
},
47+
{
48+
name: "leading newlines",
49+
args: args{
50+
template: "\n\n\nMerge ${PullRequestTitle}\n\n\nDescription:\n\n${PullRequestDescription}\n",
51+
vars: map[string]string{
52+
"PullRequestTitle": "PullRequestTitle",
53+
"PullRequestDescription": "Pull\nRequest\nDescription\n",
54+
},
55+
},
56+
want: "Merge PullRequestTitle",
57+
wantBody: "Description:\n\nPull\nRequest\nDescription\n",
58+
},
59+
}
60+
for _, tt := range tests {
61+
t.Run(tt.name, func(t *testing.T) {
62+
got, got1 := expandDefaultMergeMessage(tt.args.template, tt.args.vars)
63+
assert.Equalf(t, tt.want, got, "expandDefaultMergeMessage(%v, %v)", tt.args.template, tt.args.vars)
64+
assert.Equalf(t, tt.wantBody, got1, "expandDefaultMergeMessage(%v, %v)", tt.args.template, tt.args.vars)
65+
})
66+
}
67+
}

Diff for: services/pull/pull_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,13 @@ func TestPullRequest_GetDefaultMergeMessage_InternalTracker(t *testing.T) {
4545
assert.NoError(t, err)
4646
defer gitRepo.Close()
4747

48-
mergeMessage, err := GetDefaultMergeMessage(db.DefaultContext, gitRepo, pr, "")
48+
mergeMessage, _, err := GetDefaultMergeMessage(db.DefaultContext, gitRepo, pr, "")
4949
assert.NoError(t, err)
5050
assert.Equal(t, "Merge pull request 'issue3' (#3) from branch2 into master", mergeMessage)
5151

5252
pr.BaseRepoID = 1
5353
pr.HeadRepoID = 2
54-
mergeMessage, err = GetDefaultMergeMessage(db.DefaultContext, gitRepo, pr, "")
54+
mergeMessage, _, err = GetDefaultMergeMessage(db.DefaultContext, gitRepo, pr, "")
5555
assert.NoError(t, err)
5656
assert.Equal(t, "Merge pull request 'issue3' (#3) from user2/repo1:branch2 into master", mergeMessage)
5757
}
@@ -75,7 +75,7 @@ func TestPullRequest_GetDefaultMergeMessage_ExternalTracker(t *testing.T) {
7575
assert.NoError(t, err)
7676
defer gitRepo.Close()
7777

78-
mergeMessage, err := GetDefaultMergeMessage(db.DefaultContext, gitRepo, pr, "")
78+
mergeMessage, _, err := GetDefaultMergeMessage(db.DefaultContext, gitRepo, pr, "")
7979
assert.NoError(t, err)
8080

8181
assert.Equal(t, "Merge pull request 'issue3' (!3) from branch2 into master", mergeMessage)
@@ -84,7 +84,7 @@ func TestPullRequest_GetDefaultMergeMessage_ExternalTracker(t *testing.T) {
8484
pr.HeadRepoID = 2
8585
pr.BaseRepo = nil
8686
pr.HeadRepo = nil
87-
mergeMessage, err = GetDefaultMergeMessage(db.DefaultContext, gitRepo, pr, "")
87+
mergeMessage, _, err = GetDefaultMergeMessage(db.DefaultContext, gitRepo, pr, "")
8888
assert.NoError(t, err)
8989

9090
assert.Equal(t, "Merge pull request 'issue3' (#3) from user2/repo2:branch2 into master", mergeMessage)

Diff for: templates/repo/issue/view_content/pull.tmpl

+3-2
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,8 @@
343343
(() => {
344344
const defaultMergeTitle = {{.DefaultMergeMessage}};
345345
const defaultSquashMergeTitle = {{.DefaultSquashMergeMessage}};
346-
const defaultMergeMessage = 'Reviewed-on: ' + {{$.Issue.HTMLURL}} + '\n' + {{$approvers}};
346+
const defaultMergeMessage = {{if .DefaultMergeBody}}{{.DefaultMergeBody}}{{else}}'Reviewed-on: ' + {{$.Issue.HTMLURL}} + '\n' + {{$approvers}}{{end}};
347+
const defaultSquashMergeMessage = {{if .DefaultSquashMergeBody}}{{.DefaultSquashMergeBody}}{{else}}'Reviewed-on: ' + {{$.Issue.HTMLURL}} + '\n' + {{$approvers}}{{end}};
347348
const mergeForm = {
348349
'baseLink': {{.Link}},
349350
'textCancel': {{$.locale.Tr "cancel"}},
@@ -398,7 +399,7 @@
398399
'allowed': {{$prUnit.PullRequestsConfig.AllowSquash}},
399400
'textDoMerge': {{$.locale.Tr "repo.pulls.squash_merge_pull_request"}},
400401
'mergeTitleFieldText': defaultSquashMergeTitle,
401-
'mergeMessageFieldText': {{.GetCommitMessages}} + defaultMergeMessage,
402+
'mergeMessageFieldText': {{.GetCommitMessages}} + defaultSquashMergeMessage,
402403
'hideAutoMerge': generalHideAutoMerge,
403404
},
404405
{

0 commit comments

Comments
 (0)