Skip to content

Commit

Permalink
Create separate dependencies processor
Browse files Browse the repository at this point in the history
  • Loading branch information
willie-yao committed Jan 26, 2024
1 parent 15d8133 commit 179a08f
Show file tree
Hide file tree
Showing 6 changed files with 46 additions and 31 deletions.
3 changes: 1 addition & 2 deletions hack/tools/release/internal/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
26 changes: 17 additions & 9 deletions hack/tools/release/notes/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 &notesGenerator{
lister: lister,
processor: processor,
printer: printer,
lister: lister,
processor: processor,
printer: printer,
dependenciesProcessor: dedependenciesProcessor,
}
}

Expand All @@ -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
Expand All @@ -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)

Expand Down
2 changes: 2 additions & 0 deletions hack/tools/release/notes/github.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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
Expand Down
3 changes: 2 additions & 1 deletion hack/tools/release/notes/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
5 changes: 4 additions & 1 deletion hack/tools/release/notes/print.go
Original file line number Diff line number Diff line change
Expand Up @@ -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])
Expand Down
38 changes: 20 additions & 18 deletions hack/tools/release/notes/process.go
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand All @@ -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
Expand Down

0 comments on commit 179a08f

Please sign in to comment.