diff --git a/ignore/src/overrides.rs b/ignore/src/overrides.rs index c53a50f72..c737b04e4 100644 --- a/ignore/src/overrides.rs +++ b/ignore/src/overrides.rs @@ -79,8 +79,9 @@ impl Override { /// /// If there are no overrides, then this always returns `Match::None`. /// - /// If there is at least one whitelist override, then this never returns - /// `Match::None`, since non-matches are interpreted as ignored. + /// If there is at least one whitelist override and `is_dir` is false, then + /// this never returns `Match::None`, since non-matches are interpreted as + /// ignored. /// /// The given path is matched to the globs relative to the path given /// when building the override matcher. Specifically, before matching @@ -97,7 +98,7 @@ impl Override { return Match::None; } let mat = self.0.matched(path, is_dir).invert(); - if mat.is_none() && self.num_whitelists() > 0 { + if mat.is_none() && self.num_whitelists() > 0 && !is_dir { return Match::Ignore(Glob::unmatched()); } mat.map(move |giglob| Glob(GlobInner::Matched(giglob))) @@ -166,7 +167,7 @@ mod tests { assert!(ov.matched("a.foo", false).is_whitelist()); assert!(ov.matched("a.foo", true).is_whitelist()); assert!(ov.matched("a.rs", false).is_ignore()); - assert!(ov.matched("a.rs", true).is_ignore()); + assert!(ov.matched("a.rs", true).is_none()); assert!(ov.matched("a.bar", false).is_ignore()); assert!(ov.matched("a.bar", true).is_ignore()); } @@ -199,4 +200,18 @@ mod tests { assert!(ov.matched("baz/a", false).is_whitelist()); assert!(ov.matched("baz/a/b", false).is_whitelist()); } + + #[test] + fn allow_directories() { + // This tests that directories are NOT ignored when they are unmatched. + let ov = ov(&["*.rs"]); + assert!(ov.matched("foo.rs", false).is_whitelist()); + assert!(ov.matched("foo.c", false).is_ignore()); + assert!(ov.matched("foo", false).is_ignore()); + assert!(ov.matched("foo", true).is_none()); + assert!(ov.matched("src/foo.rs", false).is_whitelist()); + assert!(ov.matched("src/foo.c", false).is_ignore()); + assert!(ov.matched("src/foo", false).is_ignore()); + assert!(ov.matched("src/foo", true).is_none()); + } } diff --git a/tests/tests.rs b/tests/tests.rs index 795c09963..65962c74a 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -865,6 +865,16 @@ clean!(regression_184, "test", ".", |wd: WorkDir, mut cmd: Command| { assert_eq!(lines, "baz:test\n"); }); +// See: https://github.com/BurntSushi/ripgrep/issues/206 +clean!(regression_206, "test", ".", |wd: WorkDir, mut cmd: Command| { + wd.create_dir("foo"); + wd.create("foo/bar.txt", "test"); + cmd.arg("-g").arg("*.txt"); + + let lines: String = wd.stdout(&mut cmd); + assert_eq!(lines, format!("{}:test\n", path("foo/bar.txt"))); +}); + // See: https://github.com/BurntSushi/ripgrep/issues/20 sherlock!(feature_20_no_filename, "Sherlock", ".", |wd: WorkDir, mut cmd: Command| {