From 0e17be182a8ecc729e0bd3a7685d53fdb2e2477f Mon Sep 17 00:00:00 2001 From: hanbings Date: Thu, 4 Jul 2024 05:30:39 -0400 Subject: [PATCH 1/6] Added -ignore_readdir_race and -noignore_readdir_race support. --- src/find/matchers/mod.rs | 8 ++++++++ src/find/mod.rs | 2 ++ 2 files changed, 10 insertions(+) diff --git a/src/find/matchers/mod.rs b/src/find/matchers/mod.rs index 97d238b0..87f6dbce 100644 --- a/src/find/matchers/mod.rs +++ b/src/find/matchers/mod.rs @@ -692,6 +692,14 @@ fn build_matcher_tree( return Ok((i, top_level_matcher.build())); } + "-ignore_readdir_race" => { + config.ignore_readdir_race = true; + None + } + "-noignore_readdir_race" => { + config.ignore_readdir_race = false; + None + } "-d" | "-depth" => { // TODO add warning if it appears after actual testing criterion config.depth_first = true; diff --git a/src/find/mod.rs b/src/find/mod.rs index 80266798..e1f5f55a 100644 --- a/src/find/mod.rs +++ b/src/find/mod.rs @@ -21,6 +21,7 @@ pub struct Config { sorted_output: bool, help_requested: bool, version_requested: bool, + ignore_readdir_race: bool, } impl Default for Config { @@ -33,6 +34,7 @@ impl Default for Config { sorted_output: false, help_requested: false, version_requested: false, + ignore_readdir_race: false, } } } From f4bb537b5511117023412c09cf7ffa57a25e74b2 Mon Sep 17 00:00:00 2001 From: hanbings Date: Thu, 4 Jul 2024 12:44:54 -0400 Subject: [PATCH 2/6] Added tests. --- src/find/mod.rs | 31 +++++++++++++++++++++++++++++++ tests/find_cmd_tests.rs | 24 ++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/src/find/mod.rs b/src/find/mod.rs index e1f5f55a..c88f840b 100644 --- a/src/find/mod.rs +++ b/src/find/mod.rs @@ -1221,4 +1221,35 @@ mod tests { assert_eq!(rc, 0); } + + #[test] + #[cfg(unix)] + fn test_ignore_readdir_race() { + use crate::find::tests::FakeDependencies; + + let deps = FakeDependencies::new(); + let rc = find_main( + &["find", "./test_data/simple/subdir", "-ignore_readdir_race"], + &deps, + ); + + assert_eq!(rc, 0); + } + + #[test] + fn test_noignore_readdir_race() { + use crate::find::tests::FakeDependencies; + + let deps = FakeDependencies::new(); + let rc = find_main( + &[ + "find", + "./test_data/simple/subdir", + "-noignore_readdir_race", + ], + &deps, + ); + + assert_eq!(rc, 0); + } } diff --git a/tests/find_cmd_tests.rs b/tests/find_cmd_tests.rs index ae4c8b32..1a573350 100644 --- a/tests/find_cmd_tests.rs +++ b/tests/find_cmd_tests.rs @@ -881,3 +881,27 @@ fn find_samefile() { .stdout(predicate::str::is_empty()) .stderr(predicate::str::contains("not-exist-file")); } + +#[test] +#[serial(working_dir)] +fn find_ignore_readdir_race() { + Command::cargo_bin("find") + .expect("found binary") + .args(["./test_data/simple/subdir", "-ignore_readdir_race"]) + .assert() + .success() + .stdout(predicate::str::contains("./test_data/simple/subdir")) + .stderr(predicate::str::is_empty()); +} + +#[test] +#[serial(working_dir)] +fn find_noignore_readdir_race() { + Command::cargo_bin("find") + .expect("found binary") + .args(["./test_data/simple/subdir", "-noignore_readdir_race"]) + .assert() + .success() + .stdout(predicate::str::contains("./test_data/simple/subdir")) + .stderr(predicate::str::is_empty()); +} From 74136375caf31aaee155c1a1abe487d821a96b74 Mon Sep 17 00:00:00 2001 From: hanbings Date: Sat, 6 Jul 2024 01:31:38 -0400 Subject: [PATCH 3/6] Add description of why parameter has no effect. --- src/find/matchers/mod.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/find/matchers/mod.rs b/src/find/matchers/mod.rs index 87f6dbce..47ca2b08 100644 --- a/src/find/matchers/mod.rs +++ b/src/find/matchers/mod.rs @@ -692,6 +692,12 @@ fn build_matcher_tree( return Ok((i, top_level_matcher.build())); } + // In our implementation, including the `-exec` parameter, + // it is always run in a single thread. + // Therefore, there is no race condition for now. + // and we currently only add the corresponding fields in Config. + // + // Related: https://github.com/uutils/findutils/pull/411#issuecomment-2210638686 "-ignore_readdir_race" => { config.ignore_readdir_race = true; None From c9a36d00dcb5188c8b9c0261b7a9c4ad08abcfe7 Mon Sep 17 00:00:00 2001 From: hanbings Date: Sat, 6 Jul 2024 01:33:55 -0400 Subject: [PATCH 4/6] Run cargo fmt. --- src/find/matchers/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/find/matchers/mod.rs b/src/find/matchers/mod.rs index 47ca2b08..d332b12b 100644 --- a/src/find/matchers/mod.rs +++ b/src/find/matchers/mod.rs @@ -692,11 +692,11 @@ fn build_matcher_tree( return Ok((i, top_level_matcher.build())); } - // In our implementation, including the `-exec` parameter, - // it is always run in a single thread. + // In our implementation, including the `-exec` parameter, + // it is always run in a single thread. // Therefore, there is no race condition for now. // and we currently only add the corresponding fields in Config. - // + // // Related: https://github.com/uutils/findutils/pull/411#issuecomment-2210638686 "-ignore_readdir_race" => { config.ignore_readdir_race = true; From 9250adc7898307b49124ffb6811ee905bba93cef Mon Sep 17 00:00:00 2001 From: hanbings Date: Mon, 8 Jul 2024 08:39:18 -0400 Subject: [PATCH 5/6] Add description of not changing behavior in parser. --- src/find/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/find/mod.rs b/src/find/mod.rs index c88f840b..6fa8e0f5 100644 --- a/src/find/mod.rs +++ b/src/find/mod.rs @@ -34,6 +34,7 @@ impl Default for Config { sorted_output: false, help_requested: false, version_requested: false, + // For compat: doesn't change anything ignore_readdir_race: false, } } From 2184e7c3a0d495237fbced271af49cf53a57f1b2 Mon Sep 17 00:00:00 2001 From: hanbings Date: Wed, 31 Jul 2024 21:08:28 +0800 Subject: [PATCH 6/6] Resolving Conflicts. --- src/find/matchers/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/find/matchers/mod.rs b/src/find/matchers/mod.rs index cc97ae4e..0c885de9 100644 --- a/src/find/matchers/mod.rs +++ b/src/find/matchers/mod.rs @@ -708,6 +708,7 @@ fn build_matcher_tree( "-noignore_readdir_race" => { config.ignore_readdir_race = false; None + } "-daystart" => { config.today_start = true; None