diff --git a/hack/tools/release/internal/constants.go b/hack/tools/release/internal/constants.go index 1d739c7c404f..64ba92688ecd 100644 --- a/hack/tools/release/internal/constants.go +++ b/hack/tools/release/internal/constants.go @@ -35,8 +35,7 @@ const ( Warning = ":warning: Breaking Changes" // Dependencies is the tag used for PRs that update dependencies. - // This is empty because the kubernetes release notes tool prints the title for us. - Dependencies = "" + Dependencies = ":arrow_up: Dependencies" // Other is the tag used for PRs that don't fit in any other category. Other = ":seedling: Others" diff --git a/hack/tools/release/notes/generator.go b/hack/tools/release/notes/generator.go index 97334024f80f..86dd1e0bf28e 100644 --- a/hack/tools/release/notes/generator.go +++ b/hack/tools/release/notes/generator.go @@ -19,21 +19,25 @@ limitations under the License. package main +import "fmt" + // notesGenerator orchestrates the release notes generation. // Lists the selected PRs for this collection of notes, // process them to generate one entry per PR and then // formats and prints the results. type notesGenerator struct { - lister prLister - processor prProcessor - printer entriesPrinter + lister prLister + processor prProcessor + printer entriesPrinter + dependenciesProcessor dependenciesProcessor } -func newNotesGenerator(lister prLister, processor prProcessor, printer entriesPrinter) *notesGenerator { +func newNotesGenerator(lister prLister, processor prProcessor, printer entriesPrinter, dedependenciesProcessor dependenciesProcessor) *notesGenerator { return ¬esGenerator{ - lister: lister, - processor: processor, - printer: printer, + lister: lister, + processor: processor, + printer: printer, + dependenciesProcessor: dedependenciesProcessor, } } @@ -59,7 +63,7 @@ type notesEntry struct { // prProcessor generates notes entries for a list of PRs. type prProcessor interface { - process([]pr) ([]notesEntry, error) + process([]pr) []notesEntry } // entriesPrinter formats and outputs to stdout the notes @@ -75,10 +79,14 @@ func (g *notesGenerator) run() error { return err } - entries, err := g.processor.process(prs) + entries := g.processor.process(prs) + + dependencies, err := g.dependenciesProcessor.generateDependencies() if err != nil { + fmt.Printf("Error generating dependencies: %v\n", err) return err } + entries = append(entries, dependencies) g.printer.print(entries) diff --git a/hack/tools/release/notes/github.go b/hack/tools/release/notes/github.go index 433d25709aa3..5911eca91829 100644 --- a/hack/tools/release/notes/github.go +++ b/hack/tools/release/notes/github.go @@ -166,6 +166,7 @@ func (c githubClient) listMergedPRs(after, before time.Time, baseBranches ...str func (c githubClient) runGHAPICommand(url string, response any) error { cmd := exec.Command("gh", "api", url) + out, err := cmd.CombinedOutput() if err != nil { return fmt.Errorf("%s: %v", string(out), err) @@ -187,6 +188,7 @@ func iterate[T, C any](client githubClient, url string, pageSize int, extraQuery for elementsRead < totalElements { page++ requestURL := fmt.Sprintf("%s?per_page=%d&page=%d&%s", url, pageSize, page, strings.Join(extraQueryArgs, "&")) + log.Printf("Calling endpoint %s", requestURL) pageResult := new(T) if err := client.runGHAPICommand(requestURL, pageResult); err != nil { return nil, nil, err diff --git a/hack/tools/release/notes/main.go b/hack/tools/release/notes/main.go index 5b0cb678d2a3..3a001e60e5a3 100644 --- a/hack/tools/release/notes/main.go +++ b/hack/tools/release/notes/main.go @@ -107,8 +107,9 @@ func (cmd *notesCmd) run() error { generator := newNotesGenerator( newGithubFromToPRLister(cmd.config.repo, from, to, cmd.config.branch), - newPREntryProcessor(cmd.config.prefixAreaLabel, cmd.config.repo, from.value, to.value), + newPREntryProcessor(cmd.config.prefixAreaLabel), printer, + newDependenciesProcessor(cmd.config.repo, from.value, to.value), ) return generator.run() diff --git a/hack/tools/release/notes/print.go b/hack/tools/release/notes/print.go index ddb3839b73a1..8a4321d6704d 100644 --- a/hack/tools/release/notes/print.go +++ b/hack/tools/release/notes/print.go @@ -155,7 +155,10 @@ REPLACE ME: A couple sentences describing the deprecation, including links to do ) } default: - fmt.Println("## " + key) + // Don't print the section title for dependencies as the title is included in the kubernetes dependencies generator. + if key != release.Dependencies { + fmt.Println("## " + key) + } sort.Slice(mergeslice, func(i int, j int) bool { str1 := strings.ToLower(mergeslice[i]) str2 := strings.ToLower(mergeslice[j]) diff --git a/hack/tools/release/notes/process.go b/hack/tools/release/notes/process.go index 5c44bb47a4e6..f3ccf384e638 100644 --- a/hack/tools/release/notes/process.go +++ b/hack/tools/release/notes/process.go @@ -72,25 +72,33 @@ var ( type prEntriesProcessor struct { userFriendlyAreas map[string]string addAreaPrefix bool - repo string - fromTag string - toTag string } -func newPREntryProcessor(addAreaPrefix bool, repo, fromTag, toTag string) prEntriesProcessor { +func newPREntryProcessor(addAreaPrefix bool) prEntriesProcessor { return prEntriesProcessor{ userFriendlyAreas: defaultUserFriendlyAreas, addAreaPrefix: addAreaPrefix, - repo: repo, - fromTag: fromTag, - toTag: toTag, + } +} + +type dependenciesProcessor struct { + repo string + fromTag string + toTag string +} + +func newDependenciesProcessor(repo, fromTag, toTag string) dependenciesProcessor { + return dependenciesProcessor{ + repo: repo, + fromTag: fromTag, + toTag: toTag, } } // process generates a PR entry ready for printing per PR. It extracts the area // from the PR labels and appends it as a prefix to the title. // It might skip some PRs depending on the title. -func (g prEntriesProcessor) process(prs []pr) ([]notesEntry, error) { +func (g prEntriesProcessor) process(prs []pr) []notesEntry { entries := make([]notesEntry, 0, len(prs)) for i := range prs { pr := &prs[i] @@ -104,20 +112,14 @@ func (g prEntriesProcessor) process(prs []pr) ([]notesEntry, error) { entries = append(entries, *entry) } - dependencies, err := g.generateDependencies() - if err != nil { - log.Printf("Error generating dependencies: %v", err) - return nil, err - } - entries = append(entries, dependencies) - return entries, nil + return entries } -func (g prEntriesProcessor) generateDependencies() (notesEntry, error) { - repoURL := fmt.Sprintf("https://github.com/%s", g.repo) +func (d dependenciesProcessor) generateDependencies() (notesEntry, error) { + repoURL := fmt.Sprintf("https://github.com/%s", d.repo) deps, err := notes.NewDependencies().ChangesForURL( - repoURL, g.fromTag, g.toTag, + repoURL, d.fromTag, d.toTag, ) if err != nil { return notesEntry{}, err