@@ -16,6 +16,7 @@ import (
16
16
"github.com/gobwas/glob"
17
17
"github.com/nektos/act/pkg/jobparser"
18
18
"github.com/nektos/act/pkg/model"
19
+ "github.com/nektos/act/pkg/workflowpattern"
19
20
)
20
21
21
22
func ListWorkflows (commit * git.Commit ) (git.Entries , error ) {
@@ -152,40 +153,94 @@ func matchPushEvent(commit *git.Commit, pushPayload *api.PushPayload, evt *jobpa
152
153
}
153
154
154
155
matchTimes := 0
156
+ hasBranchFilter := false
157
+ hasTagFilter := false
158
+ refName := git .RefName (pushPayload .Ref )
155
159
// all acts conditions should be satisfied
156
160
for cond , vals := range evt .Acts {
157
161
switch cond {
158
- case "branches" , "tags" :
159
- refShortName := git .RefName (pushPayload .Ref ).ShortName ()
160
- for _ , val := range vals {
161
- if glob .MustCompile (val , '/' ).Match (refShortName ) {
162
- matchTimes ++
162
+ case "branches" :
163
+ hasBranchFilter = true
164
+ if ! refName .IsBranch () {
165
+ break
166
+ }
167
+ patterns , err := workflowpattern .CompilePatterns (vals ... )
168
+ if err != nil {
169
+ break
170
+ }
171
+ if ! workflowpattern .Skip (patterns , []string {refName .ShortName ()}, & workflowpattern.EmptyTraceWriter {}) {
172
+ matchTimes ++
173
+ }
174
+ case "branches-ignore" :
175
+ hasBranchFilter = true
176
+ if ! refName .IsBranch () {
177
+ break
178
+ }
179
+ patterns , err := workflowpattern .CompilePatterns (vals ... )
180
+ if err != nil {
181
+ break
182
+ }
183
+ if ! workflowpattern .Filter (patterns , []string {refName .ShortName ()}, & workflowpattern.EmptyTraceWriter {}) {
184
+ matchTimes ++
185
+ }
186
+ case "tags" :
187
+ hasTagFilter = true
188
+ if ! refName .IsTag () {
189
+ break
190
+ }
191
+ patterns , err := workflowpattern .CompilePatterns (vals ... )
192
+ if err != nil {
193
+ break
194
+ }
195
+ if ! workflowpattern .Skip (patterns , []string {refName .ShortName ()}, & workflowpattern.EmptyTraceWriter {}) {
196
+ matchTimes ++
197
+ }
198
+ case "tags-ignore" :
199
+ hasTagFilter = true
200
+ if ! refName .IsTag () {
201
+ break
202
+ }
203
+ patterns , err := workflowpattern .CompilePatterns (vals ... )
204
+ if err != nil {
205
+ break
206
+ }
207
+ if ! workflowpattern .Filter (patterns , []string {refName .ShortName ()}, & workflowpattern.EmptyTraceWriter {}) {
208
+ matchTimes ++
209
+ }
210
+ case "paths" :
211
+ filesChanged , err := commit .GetFilesChangedSinceCommit (pushPayload .Before )
212
+ if err != nil {
213
+ log .Error ("GetFilesChangedSinceCommit [commit_sha1: %s]: %v" , commit .ID .String (), err )
214
+ } else {
215
+ patterns , err := workflowpattern .CompilePatterns (vals ... )
216
+ if err != nil {
163
217
break
164
218
}
219
+ if ! workflowpattern .Skip (patterns , filesChanged , & workflowpattern.EmptyTraceWriter {}) {
220
+ matchTimes ++
221
+ }
165
222
}
166
- case "paths" :
223
+ case "paths-ignore " :
167
224
filesChanged , err := commit .GetFilesChangedSinceCommit (pushPayload .Before )
168
225
if err != nil {
169
226
log .Error ("GetFilesChangedSinceCommit [commit_sha1: %s]: %v" , commit .ID .String (), err )
170
227
} else {
171
- for _ , val := range vals {
172
- matched := false
173
- for _ , file := range filesChanged {
174
- if glob .MustCompile (val , '/' ).Match (file ) {
175
- matched = true
176
- break
177
- }
178
- }
179
- if matched {
180
- matchTimes ++
181
- break
182
- }
228
+ patterns , err := workflowpattern .CompilePatterns (vals ... )
229
+ if err != nil {
230
+ break
231
+ }
232
+ if ! workflowpattern .Filter (patterns , filesChanged , & workflowpattern.EmptyTraceWriter {}) {
233
+ matchTimes ++
183
234
}
184
235
}
185
236
default :
186
237
log .Warn ("push event unsupported condition %q" , cond )
187
238
}
188
239
}
240
+ // if both branch and tag filter are defined in the workflow only one needs to match
241
+ if hasBranchFilter && hasTagFilter {
242
+ matchTimes ++
243
+ }
189
244
return matchTimes == len (evt .Acts )
190
245
}
191
246
@@ -237,30 +292,47 @@ func matchPullRequestEvent(commit *git.Commit, prPayload *api.PullRequestPayload
237
292
}
238
293
}
239
294
case "branches" :
240
- refShortName := git .RefName (prPayload .PullRequest .Base .Ref ).ShortName ()
241
- for _ , val := range vals {
242
- if glob .MustCompile (val , '/' ).Match (refShortName ) {
243
- matchTimes ++
295
+ refName := git .RefName (prPayload .PullRequest .Base .Ref )
296
+ patterns , err := workflowpattern .CompilePatterns (vals ... )
297
+ if err != nil {
298
+ break
299
+ }
300
+ if ! workflowpattern .Skip (patterns , []string {refName .ShortName ()}, & workflowpattern.EmptyTraceWriter {}) {
301
+ matchTimes ++
302
+ }
303
+ case "branches-ignore" :
304
+ refName := git .RefName (prPayload .PullRequest .Base .Ref )
305
+ patterns , err := workflowpattern .CompilePatterns (vals ... )
306
+ if err != nil {
307
+ break
308
+ }
309
+ if ! workflowpattern .Filter (patterns , []string {refName .ShortName ()}, & workflowpattern.EmptyTraceWriter {}) {
310
+ matchTimes ++
311
+ }
312
+ case "paths" :
313
+ filesChanged , err := commit .GetFilesChangedSinceCommit (prPayload .PullRequest .Base .Ref )
314
+ if err != nil {
315
+ log .Error ("GetFilesChangedSinceCommit [commit_sha1: %s]: %v" , commit .ID .String (), err )
316
+ } else {
317
+ patterns , err := workflowpattern .CompilePatterns (vals ... )
318
+ if err != nil {
244
319
break
245
320
}
321
+ if ! workflowpattern .Skip (patterns , filesChanged , & workflowpattern.EmptyTraceWriter {}) {
322
+ matchTimes ++
323
+ }
246
324
}
247
- case "paths" :
325
+ case "paths-ignore " :
248
326
filesChanged , err := commit .GetFilesChangedSinceCommit (prPayload .PullRequest .Base .Ref )
249
327
if err != nil {
250
328
log .Error ("GetFilesChangedSinceCommit [commit_sha1: %s]: %v" , commit .ID .String (), err )
251
329
} else {
252
- for _ , val := range vals {
253
- matched := false
254
- for _ , file := range filesChanged {
255
- if glob .MustCompile (val , '/' ).Match (file ) {
256
- matched = true
257
- break
258
- }
259
- }
260
- if matched {
261
- matchTimes ++
262
- break
263
- }
330
+ patterns , err := workflowpattern .CompilePatterns (vals ... )
331
+ if err != nil {
332
+ break
333
+ }
334
+ if ! workflowpattern .Filter (patterns , filesChanged , & workflowpattern.EmptyTraceWriter {}) {
335
+ matchTimes ++
264
336
}
265
337
}
266
338
default :
0 commit comments