MCPcopy Index your code
hub / github.com/nektos/act / PatternToRegex

Function PatternToRegex

pkg/workflowpattern/workflow_pattern.go:38–136  ·  view source on GitHub ↗

nolint:gocyclo

(pattern string)

Source from the content-addressed store, hash-verified

36
37//nolint:gocyclo
38func PatternToRegex(pattern string) (string, error) {
39 var rpattern strings.Builder
40 rpattern.WriteString("^")
41 pos := 0
42 errors := map[int]string{}
43 for pos < len(pattern) {
44 switch pattern[pos] {
45 case '*':
46 if pos+1 < len(pattern) && pattern[pos+1] == '*' {
47 if pos+2 < len(pattern) && pattern[pos+2] == '/' {
48 rpattern.WriteString("(.+/)?")
49 pos += 3
50 } else {
51 rpattern.WriteString(".*")
52 pos += 2
53 }
54 } else {
55 rpattern.WriteString("[^/]*")
56 pos++
57 }
58 case '+', '?':
59 if pos > 0 {
60 rpattern.WriteByte(pattern[pos])
61 } else {
62 rpattern.WriteString(regexp.QuoteMeta(string([]byte{pattern[pos]})))
63 }
64 pos++
65 case '[':
66 rpattern.WriteByte(pattern[pos])
67 pos++
68 if pos < len(pattern) && pattern[pos] == ']' {
69 errors[pos] = "Unexpected empty brackets '[]'"
70 pos++
71 break
72 }
73 validChar := func(a, b, test byte) bool {
74 return test >= a && test <= b
75 }
76 startPos := pos
77 for pos < len(pattern) && pattern[pos] != ']' {
78 switch pattern[pos] {
79 case '-':
80 if pos <= startPos || pos+1 >= len(pattern) {
81 errors[pos] = "Invalid range"
82 pos++
83 break
84 }
85 validRange := func(a, b byte) bool {
86 return validChar(a, b, pattern[pos-1]) && validChar(a, b, pattern[pos+1]) && pattern[pos-1] <= pattern[pos+1]
87 }
88 if !validRange('A', 'z') && !validRange('0', '9') {
89 errors[pos] = "Ranges can only include a-z, A-Z, A-z, and 0-9"
90 pos++
91 break
92 }
93 rpattern.WriteString(pattern[pos : pos+2])
94 pos += 2
95 default:

Callers 1

CompilePatternFunction · 0.85

Calls 1

StringMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…