...

Source file src/edge-infra.dev/pkg/f8n/devinfra/jack/plugin/enforce_release_label/issues.go

Documentation: edge-infra.dev/pkg/f8n/devinfra/jack/plugin/enforce_release_label

     1  package enforcereleaselabel
     2  
     3  import (
     4  	"regexp"
     5  
     6  	"github.com/google/go-github/v47/github"
     7  
     8  	"edge-infra.dev/pkg/f8n/devinfra/jack/constants"
     9  	"edge-infra.dev/pkg/f8n/devinfra/jack/plugin"
    10  )
    11  
    12  // Check if a valid release label was added when PR opened otherwise add triage/needs-release-kind
    13  func openingReleaseLabel(hp plugin.HandlerParams, event github.PullRequestEvent) error {
    14  	if !validReleaseLabel(event.PullRequest.Labels) {
    15  		if err := addNeedReleaseLabel(hp, event); err != nil {
    16  			return err
    17  		}
    18  		if err := addDoNotMergeLabel(hp, event); err != nil {
    19  			return err
    20  		}
    21  	}
    22  	return nil
    23  }
    24  
    25  // Check for triage/needs-release-kind in labels
    26  func checkTriageReleaseLabel(labels []*github.Label) bool {
    27  	for _, label := range labels {
    28  		if label.GetName() == constants.TriageReleaseLabel {
    29  			return true
    30  		}
    31  	}
    32  	return false
    33  }
    34  
    35  // Checks if any labels contains a valid instance of a release label
    36  func validReleaseLabel(labels []*github.Label) bool {
    37  	r := regexp.MustCompile(`release-kind/\w.*`)
    38  	s := regexp.MustCompile(`exclude-from-release-notes`)
    39  	for _, label := range labels {
    40  		if r.MatchString(label.GetName()) {
    41  			return true
    42  		}
    43  		if s.MatchString(label.GetName()) {
    44  			return true
    45  		}
    46  	}
    47  	return false
    48  }
    49  
    50  // Simple add triage/needs-release-kind label
    51  func addNeedReleaseLabel(hp plugin.HandlerParams, event github.PullRequestEvent) error {
    52  	hp.Log.Info("adding needs-release-kind label")
    53  
    54  	newLabels := []string{constants.TriageReleaseLabel}
    55  	_, _, err := hp.Client.Issues().AddLabelsToIssue(hp.Ctx, hp.Org, hp.Repo, event.PullRequest.GetNumber(), newLabels)
    56  	if err != nil {
    57  		hp.Log.Error(err, "Failed to add needs-release-kind label")
    58  		return err
    59  	}
    60  	return nil
    61  }
    62  
    63  // Simple remove triage/needs-release-kind label
    64  func removeReleaseLabel(hp plugin.HandlerParams, event github.PullRequestEvent) error {
    65  	// exit if theres no triage label
    66  	if !checkTriageReleaseLabel(event.PullRequest.Labels) {
    67  		hp.Log.Info("no triage release label exists, ignoring")
    68  		return nil
    69  	}
    70  
    71  	_, err := hp.Client.Issues().RemoveLabelForIssue(hp.Ctx, hp.Org, hp.Repo, event.PullRequest.GetNumber(), constants.TriageReleaseLabel)
    72  	if err != nil {
    73  		hp.Log.Error(err, "Failed to remove needs-release-kind label")
    74  		return err
    75  	}
    76  	return nil
    77  }
    78  
    79  // If label manually added is triage/needs-release-kind, and if a valid release label found, remove the triage label
    80  
    81  // nolint
    82  func addedManualLabel(hp plugin.HandlerParams, event github.PullRequestEvent) error {
    83  	hp.Log.Info("Check if label added is release label")
    84  	if event.GetSender().GetType() == constants.Bot {
    85  		hp.Log.Info("Bot check on addedManualLabel")
    86  		return nil
    87  	}
    88  	if event.Label.GetName() == constants.TriageReleaseLabel {
    89  		if validReleaseLabel(event.PullRequest.Labels) {
    90  			if err := removeReleaseLabel(hp, event); err != nil {
    91  				return err
    92  			}
    93  			if err := removeDoNotMergeLabel(hp, event); err != nil {
    94  				return err
    95  			}
    96  		}
    97  	}
    98  	if event.Label.GetName() == constants.DoNotMergeNeedsRelease {
    99  		if validReleaseLabel(event.PullRequest.Labels) {
   100  			if err := removeReleaseLabel(hp, event); err != nil {
   101  				return err
   102  			}
   103  			if err := removeDoNotMergeLabel(hp, event); err != nil {
   104  				return err
   105  			}
   106  		}
   107  	}
   108  
   109  	r := regexp.MustCompile(`release-kind/\w.*`)
   110  	s := regexp.MustCompile(`exclude-from-release-notes`)
   111  	if r.MatchString(event.Label.GetName()) || s.MatchString(event.Label.GetName()) {
   112  		if err := removeReleaseLabel(hp, event); err != nil {
   113  			return err
   114  		}
   115  		if err := removeDoNotMergeLabel(hp, event); err != nil {
   116  			return err
   117  		}
   118  	}
   119  	return nil
   120  }
   121  
   122  // See if the label removed is triage/needs-release-kind, if it is put it back
   123  
   124  // nolint
   125  func checkRemoveLabel(hp plugin.HandlerParams, event github.PullRequestEvent) error {
   126  	if event.GetSender().GetType() == constants.Bot {
   127  		hp.Log.Info("Bot check on checkRemoveLabel")
   128  		return nil
   129  	}
   130  	if event.Label.GetName() == constants.TriageReleaseLabel {
   131  		if !validReleaseLabel(event.PullRequest.Labels) {
   132  			if err := addNeedReleaseLabel(hp, event); err != nil {
   133  				return err
   134  			}
   135  			if err := addDoNotMergeLabel(hp, event); err != nil {
   136  				return err
   137  			}
   138  		}
   139  	}
   140  	if event.Label.GetName() == constants.DoNotMergeNeedsRelease {
   141  		if !validReleaseLabel(event.PullRequest.Labels) {
   142  			if err := addNeedReleaseLabel(hp, event); err != nil {
   143  				return err
   144  			}
   145  			if err := addDoNotMergeLabel(hp, event); err != nil {
   146  				return err
   147  			}
   148  		}
   149  	}
   150  	r := regexp.MustCompile(`release-kind/\w.*`)
   151  	s := regexp.MustCompile(`exclude-from-release-notes`)
   152  	if r.MatchString(event.Label.GetName()) || s.MatchString(event.Label.GetName()) {
   153  		if err := addNeedReleaseLabel(hp, event); err != nil {
   154  			return err
   155  		}
   156  		if err := addDoNotMergeLabel(hp, event); err != nil {
   157  			return err
   158  		}
   159  	}
   160  	return nil
   161  }
   162  
   163  // Simple add bulldozer/blocked-needs-release-kind label
   164  func addDoNotMergeLabel(hp plugin.HandlerParams, event github.PullRequestEvent) error {
   165  	hp.Log.Info("adding bulldozer/do-not-merge label")
   166  
   167  	newLabels := []string{constants.DoNotMergeNeedsRelease}
   168  	_, _, err := hp.Client.Issues().AddLabelsToIssue(hp.Ctx, hp.Org, hp.Repo, event.PullRequest.GetNumber(), newLabels)
   169  	if err != nil {
   170  		hp.Log.Error(err, "Failed to add bulldozer/do-not-merge label")
   171  		return err
   172  	}
   173  	return nil
   174  }
   175  
   176  // Check for bulldozer/blocked-needs-release-kind in labels
   177  func checkDoNotMergeLabel(labels []*github.Label) bool {
   178  	for _, label := range labels {
   179  		if label.GetName() == constants.DoNotMergeNeedsRelease {
   180  			return true
   181  		}
   182  	}
   183  	return false
   184  }
   185  
   186  // Simple remove bulldozer/blocked-needs-release-kind label
   187  func removeDoNotMergeLabel(hp plugin.HandlerParams, event github.PullRequestEvent) error {
   188  	// exit if theres no triage label
   189  	if !checkDoNotMergeLabel(event.PullRequest.Labels) {
   190  		hp.Log.Info("no bulldozer/do-not-merge label exists, ignoring")
   191  		return nil
   192  	}
   193  
   194  	_, err := hp.Client.Issues().RemoveLabelForIssue(hp.Ctx, hp.Org, hp.Repo, event.PullRequest.GetNumber(), constants.DoNotMergeNeedsRelease)
   195  	if err != nil {
   196  		hp.Log.Error(err, "Failed to remove bulldozer/do-not-merge label")
   197  		return err
   198  	}
   199  	return nil
   200  }
   201  

View as plain text