diff --git a/CHANGELOG.md b/CHANGELOG.md index 197c6ff..72119e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ - Add new `-q, --quiet` flag, see #303 (@Asha20) +- Add new `--no-ignore-parent` flag, see #787 (@will459) + ## Bugfixes - Set default path separator to `/` in MSYS, see #537 and #730 (@aswild) diff --git a/src/app.rs b/src/app.rs index 7139e9d..d2e8167 100644 --- a/src/app.rs +++ b/src/app.rs @@ -49,6 +49,16 @@ pub fn build_app() -> App<'static, 'static> { ignored by '.gitignore' files.", ), ) + .arg( + Arg::with_name("no-ignore-parent") + .long("no-ignore-parent") + .overrides_with("no-ignore-parent") + .hidden_short_help(true) + .long_help( + "Show search results from files and directories that would otherwise be \ + ignored by '.gitignore', '.ignore', or '.fdignore' files in parent directories.", + ), + ) .arg( Arg::with_name("no-global-ignore-file") .long("no-global-ignore-file") diff --git a/src/main.rs b/src/main.rs index f0ce9a6..76408a9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -340,6 +340,10 @@ fn run() -> Result { read_vcsignore: !(matches.is_present("no-ignore") || matches.is_present("rg-alias-hidden-ignore") || matches.is_present("no-ignore-vcs")), + read_parent_ignore: !(matches.is_present("no-ignore") + || matches.is_present("rg-alias-hidden-ignore") + || matches.is_present("no-ignore-vcs") + || matches.is_present("no-ignore-parent")), read_global_ignore: !(matches.is_present("no-ignore") || matches.is_present("rg-alias-hidden-ignore") || matches.is_present("no-global-ignore-file")), diff --git a/src/options.rs b/src/options.rs index c17dd4d..71900df 100644 --- a/src/options.rs +++ b/src/options.rs @@ -24,6 +24,9 @@ pub struct Options { /// Whether to respect `.fdignore` files or not. pub read_fdignore: bool, + /// Whether to respect ignore files in parent directories or not. + pub read_parent_ignore: bool, + /// Whether to respect VCS ignore files (`.gitignore`, ..) or not. pub read_vcsignore: bool, diff --git a/src/walk.rs b/src/walk.rs index a053278..0d91b91 100644 --- a/src/walk.rs +++ b/src/walk.rs @@ -68,7 +68,7 @@ pub fn scan(path_vec: &[PathBuf], pattern: Arc, config: Arc) -> walker .hidden(config.ignore_hidden) .ignore(config.read_fdignore) - .parents(config.read_fdignore || config.read_vcsignore) + .parents(config.read_parent_ignore) .git_ignore(config.read_vcsignore) .git_global(config.read_vcsignore) .git_exclude(config.read_vcsignore) diff --git a/tests/tests.rs b/tests/tests.rs index 724abe1..6278afb 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -498,6 +498,78 @@ fn test_gitignore_and_fdignore() { ); } +/// Ignore parent ignore files (--no-ignore-parent) +#[test] +fn test_no_ignore_parent() { + let dirs = &["inner"]; + let files = &[ + "inner/parent-ignored", + "inner/child-ignored", + "inner/not-ignored", + ]; + let te = TestEnv::new(dirs, files); + + // Ignore 'parent-ignored' in root + fs::File::create(te.test_root().join(".gitignore")) + .unwrap() + .write_all(b"parent-ignored") + .unwrap(); + // Ignore 'child-ignored' in inner + fs::File::create(te.test_root().join("inner/.gitignore")) + .unwrap() + .write_all(b"child-ignored") + .unwrap(); + + te.assert_output_subdirectory("inner", &[], "not-ignored"); + + te.assert_output_subdirectory( + "inner", + &["--no-ignore-parent"], + "parent-ignored + not-ignored", + ); +} + +/// Ignore parent ignore files (--no-ignore-parent) with an inner git repo +#[test] +fn test_no_ignore_parent_inner_git() { + let dirs = &["inner"]; + let files = &[ + "inner/parent-ignored", + "inner/child-ignored", + "inner/not-ignored", + ]; + let te = TestEnv::new(dirs, files); + + // Make the inner folder also appear as a git repo + fs::create_dir_all(te.test_root().join("inner/.git")).unwrap(); + + // Ignore 'parent-ignored' in root + fs::File::create(te.test_root().join(".gitignore")) + .unwrap() + .write_all(b"parent-ignored") + .unwrap(); + // Ignore 'child-ignored' in inner + fs::File::create(te.test_root().join("inner/.gitignore")) + .unwrap() + .write_all(b"child-ignored") + .unwrap(); + + te.assert_output_subdirectory( + "inner", + &[], + "not-ignored + parent-ignored", + ); + + te.assert_output_subdirectory( + "inner", + &["--no-ignore-parent"], + "not-ignored + parent-ignored", + ); +} + /// Precedence of .fdignore files #[test] fn test_custom_ignore_precedence() {