@@ -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 ) {
@@ -136,40 +137,94 @@ func matchPushEvent(commit *git.Commit, pushPayload *api.PushPayload, evt *jobpa
136
137
}
137
138
138
139
matchTimes := 0
140
+ hasBranchFilter := false
141
+ hasTagFilter := false
142
+ refName := git .RefName (pushPayload .Ref )
139
143
// all acts conditions should be satisfied
140
144
for cond , vals := range evt .Acts {
141
145
switch cond {
142
- case "branches" , "tags" :
143
- refShortName := git .RefName (pushPayload .Ref ).ShortName ()
144
- for _ , val := range vals {
145
- if glob .MustCompile (val , '/' ).Match (refShortName ) {
146
- matchTimes ++
146
+ case "branches" :
147
+ hasBranchFilter = true
148
+ if ! refName .IsBranch () {
149
+ break
150
+ }
151
+ patterns , err := workflowpattern .CompilePatterns (vals ... )
152
+ if err != nil {
153
+ break
154
+ }
155
+ if ! workflowpattern .Skip (patterns , []string {refName .ShortName ()}, & workflowpattern.EmptyTraceWriter {}) {
156
+ matchTimes ++
157
+ }
158
+ case "branches-ignore" :
159
+ hasBranchFilter = true
160
+ if ! refName .IsBranch () {
161
+ break
162
+ }
163
+ patterns , err := workflowpattern .CompilePatterns (vals ... )
164
+ if err != nil {
165
+ break
166
+ }
167
+ if ! workflowpattern .Filter (patterns , []string {refName .ShortName ()}, & workflowpattern.EmptyTraceWriter {}) {
168
+ matchTimes ++
169
+ }
170
+ case "tags" :
171
+ hasTagFilter = true
172
+ if ! refName .IsTag () {
173
+ break
174
+ }
175
+ patterns , err := workflowpattern .CompilePatterns (vals ... )
176
+ if err != nil {
177
+ break
178
+ }
179
+ if ! workflowpattern .Skip (patterns , []string {refName .ShortName ()}, & workflowpattern.EmptyTraceWriter {}) {
180
+ matchTimes ++
181
+ }
182
+ case "tags-ignore" :
183
+ hasTagFilter = true
184
+ if ! refName .IsTag () {
185
+ break
186
+ }
187
+ patterns , err := workflowpattern .CompilePatterns (vals ... )
188
+ if err != nil {
189
+ break
190
+ }
191
+ if ! workflowpattern .Filter (patterns , []string {refName .ShortName ()}, & workflowpattern.EmptyTraceWriter {}) {
192
+ matchTimes ++
193
+ }
194
+ case "paths" :
195
+ filesChanged , err := commit .GetFilesChangedSinceCommit (pushPayload .Before )
196
+ if err != nil {
197
+ log .Error ("GetFilesChangedSinceCommit [commit_sha1: %s]: %v" , commit .ID .String (), err )
198
+ } else {
199
+ patterns , err := workflowpattern .CompilePatterns (vals ... )
200
+ if err != nil {
147
201
break
148
202
}
203
+ if ! workflowpattern .Skip (patterns , filesChanged , & workflowpattern.EmptyTraceWriter {}) {
204
+ matchTimes ++
205
+ }
149
206
}
150
- case "paths" :
207
+ case "paths-ignore " :
151
208
filesChanged , err := commit .GetFilesChangedSinceCommit (pushPayload .Before )
152
209
if err != nil {
153
210
log .Error ("GetFilesChangedSinceCommit [commit_sha1: %s]: %v" , commit .ID .String (), err )
154
211
} else {
155
- for _ , val := range vals {
156
- matched := false
157
- for _ , file := range filesChanged {
158
- if glob .MustCompile (val , '/' ).Match (file ) {
159
- matched = true
160
- break
161
- }
162
- }
163
- if matched {
164
- matchTimes ++
165
- break
166
- }
212
+ patterns , err := workflowpattern .CompilePatterns (vals ... )
213
+ if err != nil {
214
+ break
215
+ }
216
+ if ! workflowpattern .Filter (patterns , filesChanged , & workflowpattern.EmptyTraceWriter {}) {
217
+ matchTimes ++
167
218
}
168
219
}
169
220
default :
170
221
log .Warn ("push event unsupported condition %q" , cond )
171
222
}
172
223
}
224
+ // if both branch and tag filter are defined in the workflow only one needs to match
225
+ if hasBranchFilter && hasTagFilter {
226
+ matchTimes ++
227
+ }
173
228
return matchTimes == len (evt .Acts )
174
229
}
175
230
@@ -221,30 +276,47 @@ func matchPullRequestEvent(commit *git.Commit, prPayload *api.PullRequestPayload
221
276
}
222
277
}
223
278
case "branches" :
224
- refShortName := git .RefName (prPayload .PullRequest .Base .Ref ).ShortName ()
225
- for _ , val := range vals {
226
- if glob .MustCompile (val , '/' ).Match (refShortName ) {
227
- matchTimes ++
279
+ refName := git .RefName (prPayload .PullRequest .Base .Ref )
280
+ patterns , err := workflowpattern .CompilePatterns (vals ... )
281
+ if err != nil {
282
+ break
283
+ }
284
+ if ! workflowpattern .Skip (patterns , []string {refName .ShortName ()}, & workflowpattern.EmptyTraceWriter {}) {
285
+ matchTimes ++
286
+ }
287
+ case "branches-ignore" :
288
+ refName := git .RefName (prPayload .PullRequest .Base .Ref )
289
+ patterns , err := workflowpattern .CompilePatterns (vals ... )
290
+ if err != nil {
291
+ break
292
+ }
293
+ if ! workflowpattern .Filter (patterns , []string {refName .ShortName ()}, & workflowpattern.EmptyTraceWriter {}) {
294
+ matchTimes ++
295
+ }
296
+ case "paths" :
297
+ filesChanged , err := commit .GetFilesChangedSinceCommit (prPayload .PullRequest .Base .Ref )
298
+ if err != nil {
299
+ log .Error ("GetFilesChangedSinceCommit [commit_sha1: %s]: %v" , commit .ID .String (), err )
300
+ } else {
301
+ patterns , err := workflowpattern .CompilePatterns (vals ... )
302
+ if err != nil {
228
303
break
229
304
}
305
+ if ! workflowpattern .Skip (patterns , filesChanged , & workflowpattern.EmptyTraceWriter {}) {
306
+ matchTimes ++
307
+ }
230
308
}
231
- case "paths" :
309
+ case "paths-ignore " :
232
310
filesChanged , err := commit .GetFilesChangedSinceCommit (prPayload .PullRequest .Base .Ref )
233
311
if err != nil {
234
312
log .Error ("GetFilesChangedSinceCommit [commit_sha1: %s]: %v" , commit .ID .String (), err )
235
313
} else {
236
- for _ , val := range vals {
237
- matched := false
238
- for _ , file := range filesChanged {
239
- if glob .MustCompile (val , '/' ).Match (file ) {
240
- matched = true
241
- break
242
- }
243
- }
244
- if matched {
245
- matchTimes ++
246
- break
247
- }
314
+ patterns , err := workflowpattern .CompilePatterns (vals ... )
315
+ if err != nil {
316
+ break
317
+ }
318
+ if ! workflowpattern .Filter (patterns , filesChanged , & workflowpattern.EmptyTraceWriter {}) {
319
+ matchTimes ++
248
320
}
249
321
}
250
322
default :
0 commit comments