diff --git a/crates/typos-cli/src/bin/typos-cli/main.rs b/crates/typos-cli/src/bin/typos-cli/main.rs index dc8ce6b..629e666 100644 --- a/crates/typos-cli/src/bin/typos-cli/main.rs +++ b/crates/typos-cli/src/bin/typos-cli/main.rs @@ -188,7 +188,7 @@ fn run_checks(args: &args::Args) -> proc_exit::ExitResult { }; // Note: file_list and args.path are mutually exclusive, enforced by clap - for path in file_list.as_ref().unwrap_or(&args.path) { + 'path: for path in file_list.as_ref().unwrap_or(&args.path) { // Note paths are passed through stdin, `-` is treated like a normal path let cwd = if path == std::path::Path::new("-") { if args.file_list.is_some() { @@ -244,8 +244,14 @@ fn run_checks(args: &args::Args) -> proc_exit::ExitResult { .build() .with_code(proc_exit::sysexits::CONFIG_ERR)?; if args.force_exclude { - if let ignore::Match::Ignore(_) = overrides.matched(path, path.is_dir()) { - continue; + let mut ancestors = path.ancestors().collect::>(); + ancestors.reverse(); + for path in ancestors { + match overrides.matched(path, path.is_dir()) { + ignore::Match::None => {} + ignore::Match::Ignore(_) => continue 'path, + ignore::Match::Whitelist(_) => break, + } } } walk.overrides(overrides); diff --git a/crates/typos-cli/tests/cmd/force-exclude.toml b/crates/typos-cli/tests/cmd/force-exclude.toml index 405c75d..4587740 100644 --- a/crates/typos-cli/tests/cmd/force-exclude.toml +++ b/crates/typos-cli/tests/cmd/force-exclude.toml @@ -1,19 +1,5 @@ bin.name = "typos" args = "file.ignore ignore/file parent/ignore/file --force-exclude" stdin = "" -stdout = """ -error: `hello` should be `goodbye` - --> ignore/file:1:1 - | -1 | hello - | ^^^^^ - | -error: `hello` should be `goodbye` - --> parent/ignore/file:1:1 - | -1 | hello - | ^^^^^ - | -""" +stdout = "" stderr = "" -status.code = 2