From f8ae334ca9416aae06eed600fec0eb94118a04ea Mon Sep 17 00:00:00 2001 From: William Correia Date: Sun, 8 Aug 2021 17:38:24 -0400 Subject: [PATCH 1/2] Add --no-ignore-parent flag - Flag toggles parent checking in the `ignore` crate. This should affect both git and non-git ignore files. - Updated Changelog. --- CHANGELOG.md | 2 ++ src/app.rs | 10 ++++++++++ src/main.rs | 4 ++++ src/options.rs | 3 +++ src/walk.rs | 2 +- 5 files changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 08e4e60..16d6e20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Features +- 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 2d6ec94..fcfbebe 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 8654688..f3cda2d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -338,6 +338,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 aa9b5ea..cf7d28d 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 0529191..d970d2c 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) From 43f5c8adc984303aca260857f028256bd380bc63 Mon Sep 17 00:00:00 2001 From: William Correia Date: Fri, 27 Aug 2021 22:04:53 -0400 Subject: [PATCH 2/2] Add tests for --no-ignore-parent --- tests/tests.rs | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/tests/tests.rs b/tests/tests.rs index 7fe2c70..4642f28 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -497,6 +497,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() {