Skip to content

Commit 26e1f78

Browse files
committed
fix
1 parent 669cccd commit 26e1f78

File tree

2 files changed

+43
-7
lines changed

2 files changed

+43
-7
lines changed

services/pull/merge_squash.go

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package pull
66
import (
77
"fmt"
88
"strings"
9+
"unicode"
910

1011
repo_model "code.gitea.io/gitea/models/repo"
1112
user_model "code.gitea.io/gitea/models/user"
@@ -51,6 +52,34 @@ func getAuthorSignatureSquash(ctx *mergeContext) (*git.Signature, error) {
5152
return ctx.pr.Issue.Poster.NewGitSig(), nil
5253
}
5354

55+
func AddCommitMessageTailer(message, tailerKey, tailerValue string) string {
56+
tailerLine := tailerKey + ": " + tailerValue
57+
if strings.Contains(message, "\n"+tailerLine+"\n") || strings.HasSuffix(message, "\n"+tailerLine) {
58+
return message
59+
}
60+
61+
if !strings.HasSuffix(message, "\n") {
62+
message += "\n"
63+
}
64+
pos1 := strings.LastIndexByte(message[:len(message)-1], '\n')
65+
pos2 := -1
66+
if pos1 != -1 {
67+
pos2 = strings.IndexByte(message[pos1:], ':')
68+
if pos2 != -1 {
69+
pos2 += pos1
70+
}
71+
}
72+
var lastLine string
73+
if pos1 != -1 && pos2 != -1 {
74+
lastLine = message[pos1+1 : pos2+1]
75+
}
76+
lastLineIsTailerLine := lastLine != "" && unicode.IsUpper(rune(lastLine[0])) && strings.Contains(lastLine, "-")
77+
if !strings.HasSuffix(message, "\n\n") && !lastLineIsTailerLine {
78+
message += "\n"
79+
}
80+
return message + tailerLine
81+
}
82+
5483
// doMergeStyleSquash squashes the tracking branch on the current HEAD (=base)
5584
func doMergeStyleSquash(ctx *mergeContext, message string) error {
5685
sig, err := getAuthorSignatureSquash(ctx)
@@ -66,13 +95,8 @@ func doMergeStyleSquash(ctx *mergeContext, message string) error {
6695

6796
if setting.Repository.PullRequest.AddCoCommitterTrailers && ctx.committer.String() != sig.String() {
6897
// add trailer
69-
if !strings.HasSuffix(message, "\n") {
70-
message += "\n"
71-
}
72-
if !strings.Contains(message, "Co-authored-by: "+sig.String()) {
73-
message += "\nCo-authored-by: " + sig.String()
74-
}
75-
message += fmt.Sprintf("\nCo-committed-by: %s\n", sig.String())
98+
message = AddCommitMessageTailer(message, "Co-authored-by", sig.String())
99+
message = AddCommitMessageTailer(message, "Co-committed-by", sig.String()) // FIXME: this one should be removed, it is not really used or widely used
76100
}
77101
cmdCommit := git.NewCommand("commit").
78102
AddOptionFormat("--author='%s <%s>'", sig.Name, sig.Email).

services/pull/merge_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,15 @@ func Test_expandDefaultMergeMessage(t *testing.T) {
6565
})
6666
}
6767
}
68+
69+
func TestAddCommitMessageTailer(t *testing.T) {
70+
assert.Equal(t, "\n\nTest-tailer: TestValue", AddCommitMessageTailer("", "Test-tailer", "TestValue"))
71+
assert.Equal(t, "title\n\nTest-tailer: TestValue", AddCommitMessageTailer("title", "Test-tailer", "TestValue"))
72+
assert.Equal(t, "title\n\nTest-tailer: TestValue", AddCommitMessageTailer("title\n", "Test-tailer", "TestValue"))
73+
assert.Equal(t, "title\n\nTest-tailer: TestValue", AddCommitMessageTailer("title\n\n", "Test-tailer", "TestValue"))
74+
assert.Equal(t, "title\n\nTest-tailer: TestValue", AddCommitMessageTailer("title\n\nTest-tailer: TestValue", "Test-tailer", "TestValue"))
75+
assert.Equal(t, "title\n\nTest-tailer: TestValue\n", AddCommitMessageTailer("title\n\nTest-tailer: TestValue\n", "Test-tailer", "TestValue"))
76+
77+
assert.Equal(t, "title\n\nTest-tailer: v1\nTest-tailer: v2", AddCommitMessageTailer("title\n\nTest-tailer: v1", "Test-tailer", "v2"))
78+
assert.Equal(t, "title\n\nTest-tailer: v1\nTest-tailer: v2", AddCommitMessageTailer("title\n\nTest-tailer: v1\n", "Test-tailer", "v2"))
79+
}

0 commit comments

Comments
 (0)