diff --git a/hack/tools/release/notes.go b/hack/tools/release/notes.go index 478571212365..e84431e54cf8 100644 --- a/hack/tools/release/notes.go +++ b/hack/tools/release/notes.go @@ -435,6 +435,7 @@ type releaseNoteEntry struct { prNumber string } +// modifyEntryTitle removes the specified prefixes from the title. func modifyEntryTitle(title string, prefixes []string) string { entryWithoutTag := title for _, prefix := range prefixes { @@ -444,6 +445,16 @@ func modifyEntryTitle(title string, prefixes []string) string { return strings.ToUpper(string(entryWithoutTag[0])) + entryWithoutTag[1:] } +// trimAreaFromTitle removes the prefixed area from title to avoid duplication. +func trimAreaFromTitle(title, area string) string { + titleWithoutArea := title + pattern := `(?i)^` + regexp.QuoteMeta(area+":") + re := regexp.MustCompile(pattern) + titleWithoutArea = re.ReplaceAllString(titleWithoutArea, "") + titleWithoutArea = strings.TrimSpace(titleWithoutArea) + return titleWithoutArea +} + // generateReleaseNoteEntry processes a commit into a PR line item for the release notes. func generateReleaseNoteEntry(c *commit) (*releaseNoteEntry, error) { entry := &releaseNoteEntry{} @@ -501,6 +512,7 @@ func generateReleaseNoteEntry(c *commit) (*releaseNoteEntry, error) { } if *prefixAreaLabel { + entry.title = trimAreaFromTitle(entry.title, area) entry.title = fmt.Sprintf("- %s: %s", area, entry.title) } else { entry.title = fmt.Sprintf("- %s", entry.title) diff --git a/hack/tools/release/notes_test.go b/hack/tools/release/notes_test.go index 3979596025c2..83c7193f93f7 100644 --- a/hack/tools/release/notes_test.go +++ b/hack/tools/release/notes_test.go @@ -61,3 +61,45 @@ func Test_trimTitle(t *testing.T) { }) } } + +func Test_trimAreaFromTitle(t *testing.T) { + tests := []struct { + name string + title string + area string + want string + }{ + { + name: "PR title with area", + title: "e2e: improve logging for a detected rollout", + area: "e2e", + want: "improve logging for a detected rollout", + }, + { + name: "PR title without area", + title: "improve logging for a detected rollout", + area: "e2e", + want: "improve logging for a detected rollout", + }, + { + name: "PR title without area being prefixed", + title: "test/e2e: improve logging for a detected rollout", + area: "e2e", + want: "test/e2e: improve logging for a detected rollout", + }, + { + name: "PR title without space between area and title", + title: "e2e:improve logging for a detected rollout", + area: "e2e", + want: "improve logging for a detected rollout", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := trimAreaFromTitle(tt.title, tt.area); got != tt.want { + t.Errorf("trimAreaFromTitle() = %v, want %v", got, tt.want) + } + }) + } +}