package enforcereleaselabel import ( "regexp" "github.com/google/go-github/v47/github" "edge-infra.dev/pkg/f8n/devinfra/jack/constants" "edge-infra.dev/pkg/f8n/devinfra/jack/plugin" ) // Check if a valid release label was added when PR opened otherwise add triage/needs-release-kind func openingReleaseLabel(hp plugin.HandlerParams, event github.PullRequestEvent) error { if !validReleaseLabel(event.PullRequest.Labels) { if err := addNeedReleaseLabel(hp, event); err != nil { return err } if err := addDoNotMergeLabel(hp, event); err != nil { return err } } return nil } // Check for triage/needs-release-kind in labels func checkTriageReleaseLabel(labels []*github.Label) bool { for _, label := range labels { if label.GetName() == constants.TriageReleaseLabel { return true } } return false } // Checks if any labels contains a valid instance of a release label func validReleaseLabel(labels []*github.Label) bool { r := regexp.MustCompile(`release-kind/\w.*`) s := regexp.MustCompile(`exclude-from-release-notes`) for _, label := range labels { if r.MatchString(label.GetName()) { return true } if s.MatchString(label.GetName()) { return true } } return false } // Simple add triage/needs-release-kind label func addNeedReleaseLabel(hp plugin.HandlerParams, event github.PullRequestEvent) error { hp.Log.Info("adding needs-release-kind label") newLabels := []string{constants.TriageReleaseLabel} _, _, err := hp.Client.Issues().AddLabelsToIssue(hp.Ctx, hp.Org, hp.Repo, event.PullRequest.GetNumber(), newLabels) if err != nil { hp.Log.Error(err, "Failed to add needs-release-kind label") return err } return nil } // Simple remove triage/needs-release-kind label func removeReleaseLabel(hp plugin.HandlerParams, event github.PullRequestEvent) error { // exit if theres no triage label if !checkTriageReleaseLabel(event.PullRequest.Labels) { hp.Log.Info("no triage release label exists, ignoring") return nil } _, err := hp.Client.Issues().RemoveLabelForIssue(hp.Ctx, hp.Org, hp.Repo, event.PullRequest.GetNumber(), constants.TriageReleaseLabel) if err != nil { hp.Log.Error(err, "Failed to remove needs-release-kind label") return err } return nil } // If label manually added is triage/needs-release-kind, and if a valid release label found, remove the triage label // nolint func addedManualLabel(hp plugin.HandlerParams, event github.PullRequestEvent) error { hp.Log.Info("Check if label added is release label") if event.GetSender().GetType() == constants.Bot { hp.Log.Info("Bot check on addedManualLabel") return nil } if event.Label.GetName() == constants.TriageReleaseLabel { if validReleaseLabel(event.PullRequest.Labels) { if err := removeReleaseLabel(hp, event); err != nil { return err } if err := removeDoNotMergeLabel(hp, event); err != nil { return err } } } if event.Label.GetName() == constants.DoNotMergeNeedsRelease { if validReleaseLabel(event.PullRequest.Labels) { if err := removeReleaseLabel(hp, event); err != nil { return err } if err := removeDoNotMergeLabel(hp, event); err != nil { return err } } } r := regexp.MustCompile(`release-kind/\w.*`) s := regexp.MustCompile(`exclude-from-release-notes`) if r.MatchString(event.Label.GetName()) || s.MatchString(event.Label.GetName()) { if err := removeReleaseLabel(hp, event); err != nil { return err } if err := removeDoNotMergeLabel(hp, event); err != nil { return err } } return nil } // See if the label removed is triage/needs-release-kind, if it is put it back // nolint func checkRemoveLabel(hp plugin.HandlerParams, event github.PullRequestEvent) error { if event.GetSender().GetType() == constants.Bot { hp.Log.Info("Bot check on checkRemoveLabel") return nil } if event.Label.GetName() == constants.TriageReleaseLabel { if !validReleaseLabel(event.PullRequest.Labels) { if err := addNeedReleaseLabel(hp, event); err != nil { return err } if err := addDoNotMergeLabel(hp, event); err != nil { return err } } } if event.Label.GetName() == constants.DoNotMergeNeedsRelease { if !validReleaseLabel(event.PullRequest.Labels) { if err := addNeedReleaseLabel(hp, event); err != nil { return err } if err := addDoNotMergeLabel(hp, event); err != nil { return err } } } r := regexp.MustCompile(`release-kind/\w.*`) s := regexp.MustCompile(`exclude-from-release-notes`) if r.MatchString(event.Label.GetName()) || s.MatchString(event.Label.GetName()) { if err := addNeedReleaseLabel(hp, event); err != nil { return err } if err := addDoNotMergeLabel(hp, event); err != nil { return err } } return nil } // Simple add bulldozer/blocked-needs-release-kind label func addDoNotMergeLabel(hp plugin.HandlerParams, event github.PullRequestEvent) error { hp.Log.Info("adding bulldozer/do-not-merge label") newLabels := []string{constants.DoNotMergeNeedsRelease} _, _, err := hp.Client.Issues().AddLabelsToIssue(hp.Ctx, hp.Org, hp.Repo, event.PullRequest.GetNumber(), newLabels) if err != nil { hp.Log.Error(err, "Failed to add bulldozer/do-not-merge label") return err } return nil } // Check for bulldozer/blocked-needs-release-kind in labels func checkDoNotMergeLabel(labels []*github.Label) bool { for _, label := range labels { if label.GetName() == constants.DoNotMergeNeedsRelease { return true } } return false } // Simple remove bulldozer/blocked-needs-release-kind label func removeDoNotMergeLabel(hp plugin.HandlerParams, event github.PullRequestEvent) error { // exit if theres no triage label if !checkDoNotMergeLabel(event.PullRequest.Labels) { hp.Log.Info("no bulldozer/do-not-merge label exists, ignoring") return nil } _, err := hp.Client.Issues().RemoveLabelForIssue(hp.Ctx, hp.Org, hp.Repo, event.PullRequest.GetNumber(), constants.DoNotMergeNeedsRelease) if err != nil { hp.Log.Error(err, "Failed to remove bulldozer/do-not-merge label") return err } return nil }