From d1b9ae1908070acce510f837df312b63d671caf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20T=C3=B6lle?= Date: Mon, 5 Aug 2024 01:00:34 +0200 Subject: [PATCH] feat: ensure labels exist in repo --- cmd/rp/cmd/run.go | 11 ++++++++++- forge.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++ releasepr.go | 10 ++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) diff --git a/cmd/rp/cmd/run.go b/cmd/rp/cmd/run.go index 645580e..b5ac5ee 100644 --- a/cmd/rp/cmd/run.go +++ b/cmd/rp/cmd/run.go @@ -69,7 +69,12 @@ func run(cmd *cobra.Command, _ []string) error { }) } - err := createPendingReleases(ctx, f) + err := ensureLabels(ctx, f) + if err != nil { + return fmt.Errorf("failed to ensure all labels exist: %w", err) + } + + err = createPendingReleases(ctx, f) if err != nil { return fmt.Errorf("failed to create pending releases: %w", err) } @@ -87,6 +92,10 @@ func run(cmd *cobra.Command, _ []string) error { return nil } +func ensureLabels(ctx context.Context, forge rp.Forge) error { + return forge.EnsureLabelsExist(ctx, rp.Labels) +} + func createPendingReleases(ctx context.Context, forge rp.Forge) error { logger.InfoContext(ctx, "checking for pending releases") prs, err := forge.PendingReleases(ctx) diff --git a/forge.go b/forge.go index dd443c4..23d5902 100644 --- a/forge.go +++ b/forge.go @@ -21,6 +21,7 @@ const ( GitHubPRStateClosed = "closed" GitHubEnvAPIToken = "GITHUB_TOKEN" GitHubEnvUsername = "GITHUB_USER" + GitHubLabelColor = "dedede" ) type Changeset struct { @@ -47,6 +48,8 @@ type Forge interface { // Changesets looks up the Pull/Merge Requests for each commit, returning its parsed metadata. Changesets(context.Context, []Commit) ([]Changeset, error) + EnsureLabelsExist(context.Context, []string) error + // PullRequestForBranch returns the open pull request between the branch and ForgeOptions.BaseBranch. If no open PR // exists, it returns nil. PullRequestForBranch(context.Context, string) (*ReleasePullRequest, error) @@ -322,6 +325,52 @@ func (g *GitHub) Changesets(ctx context.Context, commits []Commit) ([]Changeset, return changesets, nil } +func (g *GitHub) EnsureLabelsExist(ctx context.Context, labels []string) error { + existingLabels := make([]string, 0, len(labels)) + + page := 1 + + for { + g.log.Debug("fetching labels on repo", "page", page) + ghLabels, resp, err := g.client.Issues.ListLabels( + ctx, g.options.Owner, g.options.Repo, + &github.ListOptions{ + Page: page, + PerPage: GitHubPerPageMax, + }) + if err != nil { + return err + } + + for _, label := range ghLabels { + existingLabels = append(existingLabels, label.GetName()) + } + + if page == resp.LastPage || resp.LastPage == 0 { + break + } + page = resp.NextPage + } + + for _, label := range labels { + if !slices.Contains(existingLabels, label) { + g.log.Info("creating label in repository", "label.name", label) + _, _, err := g.client.Issues.CreateLabel( + ctx, g.options.Owner, g.options.Repo, + &github.Label{ + Name: &label, + Color: Pointer(GitHubLabelColor), + }, + ) + if err != nil { + return err + } + } + } + + return nil +} + func (g *GitHub) PullRequestForBranch(ctx context.Context, branch string) (*ReleasePullRequest, error) { page := 1 diff --git a/releasepr.go b/releasepr.go index d87e785..eadb3b0 100644 --- a/releasepr.go +++ b/releasepr.go @@ -99,6 +99,16 @@ const ( LabelReleaseTagged = "rp-release::tagged" ) +var Labels = []string{ + LabelNextVersionTypeNormal, + LabelNextVersionTypeRC, + LabelNextVersionTypeBeta, + LabelNextVersionTypeAlpha, + + LabelReleasePending, + LabelReleaseTagged, +} + const ( DescriptionLanguagePrefix = "rp-prefix" DescriptionLanguageSuffix = "rp-suffix"