diff --git a/modules/task/pull_create.go b/modules/task/pull_create.go index f61108e..1a7bc6b 100644 --- a/modules/task/pull_create.go +++ b/modules/task/pull_create.go @@ -6,6 +6,7 @@ package task import ( "fmt" + "regexp" "strings" "code.gitea.io/sdk/gitea" @@ -16,6 +17,12 @@ import ( "code.gitea.io/tea/modules/utils" ) +var ( + spaceRegex = regexp.MustCompile(`[\s_-]+`) + noSpace = regexp.MustCompile(`^[^a-zA-Z\s]*`) + consecutive = regexp.MustCompile(`[\s]{2,}`) +) + // CreatePull creates a PR in the given repo and prints the result func CreatePull(ctx *context.TeaContext, base, head string, allowMaintainerEdits bool, opts *gitea.CreateIssueOption) (err error) { // default is default branch @@ -65,7 +72,6 @@ func CreatePull(ctx *context.TeaContext, base, head string, allowMaintainerEdits Milestone: opts.Milestone, Deadline: opts.Deadline, }) - if err != nil { return fmt.Errorf("could not create PR from %s to %s:%s: %s", head, ctx.Owner, base, err) } @@ -133,13 +139,18 @@ func GetHeadSpec(owner, branch, baseOwner string) string { } // GetDefaultPRTitle transforms a string like a branchname to a readable text -func GetDefaultPRTitle(head string) string { - title := head - if strings.Contains(title, ":") { - title = strings.SplitN(title, ":", 2)[1] +func GetDefaultPRTitle(header string) string { + // Extract the part after the last colon in the input string + colonIndex := strings.LastIndex(header, ":") + if colonIndex != -1 { + header = header[colonIndex+1:] } - title = strings.Replace(title, "-", " ", -1) - title = strings.Replace(title, "_", " ", -1) + + title := noSpace.ReplaceAllString(header, "") + title = spaceRegex.ReplaceAllString(title, " ") + title = strings.TrimSpace(title) title = strings.Title(strings.ToLower(title)) + title = consecutive.ReplaceAllString(title, " ") + return title } diff --git a/modules/task/pull_create_test.go b/modules/task/pull_create_test.go new file mode 100644 index 0000000..819253c --- /dev/null +++ b/modules/task/pull_create_test.go @@ -0,0 +1,28 @@ +// Copyright 2023 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package task + +import "testing" + +func TestGetDefaultPRTitle(t *testing.T) { + tests := []struct { + input string + want string + }{ + {input: "Add new feature", want: "Add New Feature"}, + {input: "update-docs: Fix typo", want: "Fix Typo"}, + {input: "remove_long-string", want: "Remove Long String"}, + {input: "Replace_Underscores_With_Spaces", want: "Replace Underscores With Spaces"}, + {input: " leading-and-trailing-spaces ", want: "Leading And Trailing Spaces"}, + {input: "-----No--Upper--Case-----", want: "No Upper Case"}, + {input: "", want: ""}, + } + for _, test := range tests { + got := GetDefaultPRTitle(test.input) + if got != test.want { + t.Errorf("GetDefaultPRTitle(%q) = %q, want %q", test.input, got, test.want) + } + } +}