Skip to content

Commit 6840258

Browse files
Use GitHub Actions compatible globbing for branches, tag, path filter (#22804)
Replaces the current globbing library with a https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet compatible one. This adds support for - `paths-ignore`, `tags-ignore` and `branches-ignore` filters. - negative patterns in `paths`, `tags` and `branches` filters - using both `tags` and `paths` filter on the push event Original PR https://gitea.com/gitea/act/pulls/13. nektos/act PR nektos/act#1618 for the workflowpattern package (It can take some months for it to appear in https://gitea.com/gitea/act) Related to #13539
1 parent e6e602f commit 6840258

File tree

1 file changed

+107
-35
lines changed

1 file changed

+107
-35
lines changed

modules/actions/workflows.go

+107-35
Original file line numberDiff line numberDiff line change
@@ -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

2122
func 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

Comments
 (0)