mirror of
https://github.com/go-gitea/gitea.git
synced 2026-09-23 05:03:39 +09:00
fine tune
This commit is contained in:
@@ -70,9 +70,11 @@ func (c *CommitMessage) MessageTrailer() CommitMessageTrailerValues {
|
|||||||
|
|
||||||
var commitMessageTrailerSplit = sync.OnceValue(func() *regexp.Regexp {
|
var commitMessageTrailerSplit = sync.OnceValue(func() *regexp.Regexp {
|
||||||
// the sep is either something like "\n---\n" or "\n\n" in the body, or at the start of the body like "---\n"
|
// the sep is either something like "\n---\n" or "\n\n" in the body, or at the start of the body like "---\n"
|
||||||
return regexp.MustCompile(`(?s)^(?P<content>.*?)(?P<sep>^|^\n|^-{3,}\n|\n-{3,}\n|\n\n)(?P<trailer>(?:[A-Za-z0-9][-A-Za-z0-9]*:[^\n]*\n?)*\n*)$`)
|
return regexp.MustCompile(`(?s)^(?P<content>.*?)(?P<sep>^|^\n|^-{3,}\n+|\n-{3,}\n+|\n\n)(?P<trailer>(?:[A-Za-z0-9][-A-Za-z0-9]*:[^\n]*\n?)*\n*)$`)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// CommitMessageSplitTrailer tries to split the message by the trailer separator
|
||||||
|
// content + sep + trailer will reconstruct the original message
|
||||||
func CommitMessageSplitTrailer(s string) (content, sep, trailer string) {
|
func CommitMessageSplitTrailer(s string) (content, sep, trailer string) {
|
||||||
s = util.NormalizeStringEOL(s)
|
s = util.NormalizeStringEOL(s)
|
||||||
re := commitMessageTrailerSplit()
|
re := commitMessageTrailerSplit()
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ func TestCommitMessageTrailer(t *testing.T) {
|
|||||||
{"a\n\nk:v\n\n", "a", "\n\n", "k:v\n\n"},
|
{"a\n\nk:v\n\n", "a", "\n\n", "k:v\n\n"},
|
||||||
{"a\n--\nk:v", "a\n--\nk:v", "", ""},
|
{"a\n--\nk:v", "a\n--\nk:v", "", ""},
|
||||||
{"a\n---\nk:v", "a", "\n---\n", "k:v"},
|
{"a\n---\nk:v", "a", "\n---\n", "k:v"},
|
||||||
|
{"a\n\n---\n\nk:v", "a\n", "\n---\n\n", "k:v"},
|
||||||
|
|
||||||
{"k: v", "", "", "k: v"},
|
{"k: v", "", "", "k: v"},
|
||||||
{"\nk:v", "", "\n", "k:v"},
|
{"\nk:v", "", "\n", "k:v"},
|
||||||
|
|||||||
@@ -9,10 +9,10 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"regexp"
|
|
||||||
"slices"
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
"unicode"
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
|
|
||||||
"gitea.dev/models/db"
|
"gitea.dev/models/db"
|
||||||
@@ -768,8 +768,6 @@ func CloseRepoBranchesPulls(ctx context.Context, doer *user_model.User, repo *re
|
|||||||
return errors.Join(errs...)
|
return errors.Join(errs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
var commitMessageTrailersPattern = regexp.MustCompile(`(?:^|\n\n)(?:[\w-]+[ \t]*:[^\n]+\n*(?:[ \t]+[^\n]+\n*)*)+$`)
|
|
||||||
|
|
||||||
// GetSquashMergeCommitMessages returns the commit messages between head and merge base (if there is one)
|
// GetSquashMergeCommitMessages returns the commit messages between head and merge base (if there is one)
|
||||||
func GetSquashMergeCommitMessages(ctx context.Context, pr *issues_model.PullRequest) string {
|
func GetSquashMergeCommitMessages(ctx context.Context, pr *issues_model.PullRequest) string {
|
||||||
if err := pr.LoadIssue(ctx); err != nil {
|
if err := pr.LoadIssue(ctx); err != nil {
|
||||||
@@ -834,8 +832,9 @@ func buildSquashMergeCommitMessages(mergeMessage string, coAuthors []string) str
|
|||||||
}
|
}
|
||||||
|
|
||||||
msgContent, msgSep, msgTrailer := git.CommitMessageSplitTrailer(mergeMessage)
|
msgContent, msgSep, msgTrailer := git.CommitMessageSplitTrailer(mergeMessage)
|
||||||
if msgTrailer == "" {
|
if (msgSep == "" || msgSep == "\n\n") && msgTrailer == "" {
|
||||||
msgSep = "\n---------\n"
|
msgContent = strings.TrimRightFunc(msgContent, unicode.IsSpace)
|
||||||
|
msgSep = "\n\n---------\n\n"
|
||||||
}
|
}
|
||||||
var sb strings.Builder
|
var sb strings.Builder
|
||||||
sb.WriteString(msgContent)
|
sb.WriteString(msgContent)
|
||||||
|
|||||||
@@ -21,23 +21,6 @@ import (
|
|||||||
|
|
||||||
// TODO TestPullRequest_PushToBaseRepo
|
// TODO TestPullRequest_PushToBaseRepo
|
||||||
|
|
||||||
func TestPullRequest_CommitMessageTrailersPattern(t *testing.T) {
|
|
||||||
// Not a valid trailer section
|
|
||||||
assert.False(t, commitMessageTrailersPattern.MatchString(""))
|
|
||||||
assert.False(t, commitMessageTrailersPattern.MatchString("No trailer."))
|
|
||||||
assert.False(t, commitMessageTrailersPattern.MatchString("Signed-off-by: Bob <bob@example.com>\nNot a trailer due to following text."))
|
|
||||||
assert.False(t, commitMessageTrailersPattern.MatchString("Message body not correctly separated from trailer section by empty line.\nSigned-off-by: Bob <bob@example.com>"))
|
|
||||||
// Valid trailer section
|
|
||||||
assert.True(t, commitMessageTrailersPattern.MatchString("Signed-off-by: Bob <bob@example.com>"))
|
|
||||||
assert.True(t, commitMessageTrailersPattern.MatchString("Signed-off-by: Bob <bob@example.com>\nOther-Trailer: Value"))
|
|
||||||
assert.True(t, commitMessageTrailersPattern.MatchString("Message body correctly separated from trailer section by empty line.\n\nSigned-off-by: Bob <bob@example.com>"))
|
|
||||||
assert.True(t, commitMessageTrailersPattern.MatchString("Multiple trailers.\n\nSigned-off-by: Bob <bob@example.com>\nOther-Trailer: Value"))
|
|
||||||
assert.True(t, commitMessageTrailersPattern.MatchString("Newline after trailer section.\n\nSigned-off-by: Bob <bob@example.com>\n"))
|
|
||||||
assert.True(t, commitMessageTrailersPattern.MatchString("No space after colon is accepted.\n\nSigned-off-by:Bob <bob@example.com>"))
|
|
||||||
assert.True(t, commitMessageTrailersPattern.MatchString("Additional whitespace is accepted.\n\nSigned-off-by \t : \tBob <bob@example.com> "))
|
|
||||||
assert.True(t, commitMessageTrailersPattern.MatchString("Folded value.\n\nFolded-trailer: This is\n a folded\n trailer value\nOther-Trailer: Value"))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestPullRequest_FormatSquashMergeCommitMessages(t *testing.T) {
|
func TestPullRequest_FormatSquashMergeCommitMessages(t *testing.T) {
|
||||||
oldest := &git.Commit{CommitMessage: git.CommitMessage{MessageRaw: "commit msg 1"}}
|
oldest := &git.Commit{CommitMessage: git.CommitMessage{MessageRaw: "commit msg 1"}}
|
||||||
newest := &git.Commit{CommitMessage: git.CommitMessage{MessageRaw: "commit msg 2\n\nCommit description."}}
|
newest := &git.Commit{CommitMessage: git.CommitMessage{MessageRaw: "commit msg 2\n\nCommit description."}}
|
||||||
@@ -118,13 +101,14 @@ func TestBuildSquashMergeCommitMessages(t *testing.T) {
|
|||||||
expected string
|
expected string
|
||||||
}{
|
}{
|
||||||
{"title", nil, "title"},
|
{"title", nil, "title"},
|
||||||
{"title", []string{"the-user"}, "title\n---------\nCo-authored-by: the-user\n"},
|
{"title", []string{"the-user"}, "title\n\n---------\n\nCo-authored-by: the-user\n"},
|
||||||
|
{"title\n\n", []string{"the-user"}, "title\n\n---------\n\nCo-authored-by: the-user\n"},
|
||||||
{"title\n\nKey: val", []string{"the-user"}, "title\n\nKey: val\nCo-authored-by: the-user\n"},
|
{"title\n\nKey: val", []string{"the-user"}, "title\n\nKey: val\nCo-authored-by: the-user\n"},
|
||||||
{"title\n\n----\nKey: val", []string{"the-user"}, "title\n\n----\nKey: val\nCo-authored-by: the-user\n"},
|
{"title\n\n----\nKey: val", []string{"the-user"}, "title\n\n----\nKey: val\nCo-authored-by: the-user\n"},
|
||||||
{"title\n\n----\nKey: val\n\n", []string{"the-user"}, "title\n\n----\nKey: val\nCo-authored-by: the-user\n"},
|
{"title\n\n----\nKey: val\n\n", []string{"the-user"}, "title\n\n----\nKey: val\nCo-authored-by: the-user\n"},
|
||||||
|
|
||||||
{"title\n\nbody", nil, "title\n\nbody"},
|
{"title\n\nbody", nil, "title\n\nbody"},
|
||||||
{"title\n\nbody", []string{"the-user"}, "title\n\nbody\n---------\nCo-authored-by: the-user\n"},
|
{"title\n\nbody", []string{"the-user"}, "title\n\nbody\n\n---------\n\nCo-authored-by: the-user\n"},
|
||||||
{"title\n\nbody\n\nKey: val", []string{"the-user"}, "title\n\nbody\n\nKey: val\nCo-authored-by: the-user\n"},
|
{"title\n\nbody\n\nKey: val", []string{"the-user"}, "title\n\nbody\n\nKey: val\nCo-authored-by: the-user\n"},
|
||||||
{"title\n\nbody\n\n----\nKey: val", []string{"the-user"}, "title\n\nbody\n\n----\nKey: val\nCo-authored-by: the-user\n"},
|
{"title\n\nbody\n\n----\nKey: val", []string{"the-user"}, "title\n\nbody\n\n----\nKey: val\nCo-authored-by: the-user\n"},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1272,7 +1272,7 @@ Commit description.
|
|||||||
commitMessage: `loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong message`,
|
commitMessage: `loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong message`,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
expectedMessage: `* looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...`,
|
expectedMessage: "* looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...\n\n",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Test Co-authored-by",
|
name: "Test Co-authored-by",
|
||||||
|
|||||||
Reference in New Issue
Block a user