mutation-testing: verify source files with find, not a ** glob (#282)

The "Verify patterns" step under No Mutants Generated ran
`ls src/**/*.rs` to answer whether source files exist where the include
pattern points. Whether `**` recurses depends on the shell: zsh expands
it, bash does not unless globstar is set, and the bash 3.2 macOS ships
has no globstar option to set. Under bash the glob degrades to
`src/*/*.rs`. On a tree holding src/top.rs, src/a/one.rs,
src/a/b/two.rs and src/a/b/c/three.rs, find reports four files and the
ls form reports one.

So the command existed to tell the user their include pattern was fine
and instead under-reported the files that matched it, on some machines
but not others. The dropped files read as "include pattern doesn't
match" — the first entry in the Common causes list directly below it —
and send someone off to edit a pattern that was already correct.

find behaves identically in every shell and exits 0 when nothing
matches rather than erroring.

Only the unquoted shell glob changed. The `**` in mewt.toml include
values and in quoted `--target 'src/auth/**/*.rs'` arguments is mewt's
own glob syntax, expanded by mewt rather than the shell, and is correct
as written; the note says so to keep the fix from spreading there.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
kz-tob
2026-08-27 08:58:20 -04:00
committed by GitHub
parent 5eb104e1c5
commit 4518c6df20
3 changed files with 5 additions and 3 deletions
+1 -1
View File
@@ -126,7 +126,7 @@
},
{
"name": "mutation-testing",
"version": "1.0.2",
"version": "1.0.3",
"description": "Configures mewt or muton mutation testing campaigns — scopes targets, tunes timeouts, and optimizes long-running runs. Use when the user mentions mewt, muton, mutation testing, or wants to configure or optimize a mutation testing campaign.",
"author": {
"name": "Trail of Bits",
@@ -1,6 +1,6 @@
{
"name": "mutation-testing",
"version": "1.0.2",
"version": "1.0.3",
"description": "Configures mewt or muton mutation testing campaigns — scopes targets, tunes timeouts, and optimizes long-running runs. Use when the user mentions mewt, muton, mutation testing, or wants to configure or optimize a mutation testing campaign.",
"author": {
"name": "Trail of Bits",
@@ -277,9 +277,11 @@ mewt print mutations --language rust
**Verify patterns:**
```bash
mewt print config
ls src/**/*.rs # Do files exist and match include patterns?
find src -name '*.rs' | head # Do source files exist where include points?
```
`find`, not `ls src/**/*.rs`. Whether `**` recurses depends on the shell: zsh expands it, bash does not unless `globstar` is set, and the bash 3.2 that macOS ships has no `globstar` option to set. So the `ls` form degrades to `src/*/*.rs` under bash — given `src/top.rs`, `src/a/one.rs`, and `src/a/b/two.rs` it lists only `src/a/one.rs` — while the same line is correct under zsh. A diagnostic that under-reports on some machines and not others is worse than none: the files it drops read as "the include pattern doesn't match," sending you to edit a pattern that was already right. `find` behaves identically in every shell and exits 0 when nothing matches, instead of erroring. Keep the `**` in `mewt.toml`, where mewt expands it rather than the shell.
**Common causes:**
- Include pattern doesn't match files
- Ignore pattern too broad (e.g., `"test"` matches `test_utils.rs`)