rules:changes:
takes glob patterns. And yes, your understanding is correct: by nature, glob patterns are inclusive only, so you cannot use add exclusionary parameters to a glob pattern or "negate" specific items that would otherwise match. Adding additional items to the changes:
is also additive.
You can, however use negative-matching to include non-matching files (e.g., !(foo|bar|baz)
). This should work for your use case.
So, a rule like this should work how you want:
rules:
- changes:
- "packages/foo/**/!(readme.md)"
Edit:
However, ruby's fnmatch doesn't support the !
metacharacter, so instead you can use the pattern:
packages/foo/**/{[^r]*,r,r[^e]*,re,re[^a]*,rea,rea[^d]*,read,read[^m]*,readm,readm[^e]*,readme,readme[^.]*,readme.,readme.[^m]*,readme.m,readme.m[^d]*,readme.md?*}
reference
Which should have the same effect.
rules:
- changes:
# same as "packages/foo/**/!(readme.md)"
# SEE: https://stackoverflow.com/a/69906355/5747944
- 'packages/foo/**/{[^r]*,r,r[^e]*,re,re[^a]*,rea,rea[^d]*,read,read[^m]*,readm,readm[^e]*,readme,readme[^.]*,readme.,readme.[^m]*,readme.m,readme.m[^d]*,readme.md?*}'
Tested in irb:
irb(main):011:0> pattern = './packages/foo/**/{[^r]*,r,r[^e]*,re,re[^a]*,rea,rea[^d]*,read,read[^m]*,readm,readm[^e]*,readme,readme[^.]*,readme.,readme.[^m]*,readme.m,readme.m[^d]*,readme.md?*}'
irb(main):012:0> File.fnmatch(pattern, './packages/foo/readme.md', File::FNM_PATHNAME | File::FNM_DOTMATCH | File::FNM_EXTGLOB)
=> false
irb(main):013:0> File.fnmatch(pattern, './packages/foo/anything-else', File::FNM_PATHNAME | File::FNM_DOTMATCH | File::FNM_EXTGLOB)
=> true