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
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
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
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
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
64 func removeReleaseLabel(hp plugin.HandlerParams, event github.PullRequestEvent) error {
65
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
80
81
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
123
124
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
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
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
187 func removeDoNotMergeLabel(hp plugin.HandlerParams, event github.PullRequestEvent) error {
188
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