@@ -16,6 +16,7 @@ import (
1616 "github.com/gobwas/glob"
1717 "github.com/nektos/act/pkg/jobparser"
1818 "github.com/nektos/act/pkg/model"
19+ "github.com/nektos/act/pkg/workflowpattern"
1920)
2021
2122func ListWorkflows (commit * git.Commit ) (git.Entries , error ) {
@@ -152,40 +153,94 @@ func matchPushEvent(commit *git.Commit, pushPayload *api.PushPayload, evt *jobpa
152153 }
153154
154155 matchTimes := 0
156+ hasBranchFilter := false
157+ hasTagFilter := false
158+ refName := git .RefName (pushPayload .Ref )
155159 // all acts conditions should be satisfied
156160 for cond , vals := range evt .Acts {
157161 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 {
163217 break
164218 }
219+ if ! workflowpattern .Skip (patterns , filesChanged , & workflowpattern.EmptyTraceWriter {}) {
220+ matchTimes ++
221+ }
165222 }
166- case "paths" :
223+ case "paths-ignore " :
167224 filesChanged , err := commit .GetFilesChangedSinceCommit (pushPayload .Before )
168225 if err != nil {
169226 log .Error ("GetFilesChangedSinceCommit [commit_sha1: %s]: %v" , commit .ID .String (), err )
170227 } 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 ++
183234 }
184235 }
185236 default :
186237 log .Warn ("push event unsupported condition %q" , cond )
187238 }
188239 }
240+ // if both branch and tag filter are defined in the workflow only one needs to match
241+ if hasBranchFilter && hasTagFilter {
242+ matchTimes ++
243+ }
189244 return matchTimes == len (evt .Acts )
190245}
191246
@@ -237,30 +292,47 @@ func matchPullRequestEvent(commit *git.Commit, prPayload *api.PullRequestPayload
237292 }
238293 }
239294 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 {
244319 break
245320 }
321+ if ! workflowpattern .Skip (patterns , filesChanged , & workflowpattern.EmptyTraceWriter {}) {
322+ matchTimes ++
323+ }
246324 }
247- case "paths" :
325+ case "paths-ignore " :
248326 filesChanged , err := commit .GetFilesChangedSinceCommit (prPayload .PullRequest .Base .Ref )
249327 if err != nil {
250328 log .Error ("GetFilesChangedSinceCommit [commit_sha1: %s]: %v" , commit .ID .String (), err )
251329 } 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 ++
264336 }
265337 }
266338 default :
0 commit comments