From f967b297353c7dfb1edb32fcb73b05e38ebf1a16 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Mon, 30 May 2022 11:46:15 -0400 Subject: [PATCH 1/2] find/matchers: Implement the -{read,writ,execut}able access checks --- Cargo.lock | 12 ++++++++ Cargo.toml | 1 + src/find/matchers/access.rs | 60 +++++++++++++++++++++++++++++++++++++ src/find/matchers/mod.rs | 5 ++++ tests/find_cmd_tests.rs | 29 ++++++++++++++++++ 5 files changed, 107 insertions(+) create mode 100644 src/find/matchers/access.rs diff --git a/Cargo.lock b/Cargo.lock index 4b35a37..6b3ab86 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -194,6 +194,17 @@ dependencies = [ "termcolor", ] +[[package]] +name = "faccess" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ae66425802d6a903e268ae1a08b8c38ba143520f227a205edf4e9c7e3e26d5" +dependencies = [ + "bitflags", + "libc", + "winapi", +] + [[package]] name = "fastrand" version = "1.7.0" @@ -222,6 +233,7 @@ dependencies = [ "assert_cmd", "chrono", "clap", + "faccess", "filetime", "once_cell", "onig", diff --git a/Cargo.toml b/Cargo.toml index 95c97bd..7df23bb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,7 @@ authors = ["uutils developers"] [dependencies] chrono = "0.4" clap = "2.34" +faccess = "0.2.4" walkdir = "2.3" regex = "1.5" once_cell = "1.12" diff --git a/src/find/matchers/access.rs b/src/find/matchers/access.rs new file mode 100644 index 0000000..7276ef9 --- /dev/null +++ b/src/find/matchers/access.rs @@ -0,0 +1,60 @@ +// Copyright 2022 Tavian Barnes +// +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file or at +// https://opensource.org/licenses/MIT. + +use faccess::PathExt; +use walkdir::DirEntry; + +use super::{Matcher, MatcherIO}; + +/// Matcher for -{read,writ,execut}able. +pub enum AccessMatcher { + Readable, + Writable, + Executable, +} + +impl Matcher for AccessMatcher { + fn matches(&self, file_info: &DirEntry, _: &mut MatcherIO) -> bool { + let path = file_info.path(); + + match self { + Self::Readable => path.readable(), + Self::Writable => path.writable(), + Self::Executable => path.executable(), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + use crate::find::matchers::tests::get_dir_entry_for; + use crate::find::matchers::Matcher; + use crate::find::tests::FakeDependencies; + + #[test] + fn access_matcher() { + let file_info = get_dir_entry_for("test_data/simple", "abbbc"); + let deps = FakeDependencies::new(); + + assert!( + AccessMatcher::Readable.matches(&file_info, &mut deps.new_matcher_io()), + "file should be readable" + ); + + assert!( + AccessMatcher::Writable.matches(&file_info, &mut deps.new_matcher_io()), + "file should be writable" + ); + + #[cfg(unix)] + assert!( + !AccessMatcher::Executable.matches(&file_info, &mut deps.new_matcher_io()), + "file should not be executable" + ); + } +} diff --git a/src/find/matchers/mod.rs b/src/find/matchers/mod.rs index 49d9813..ef575cf 100644 --- a/src/find/matchers/mod.rs +++ b/src/find/matchers/mod.rs @@ -4,6 +4,7 @@ // license that can be found in the LICENSE file or at // https://opensource.org/licenses/MIT. +mod access; mod delete; mod empty; pub mod exec; @@ -28,6 +29,7 @@ use std::time::SystemTime; use std::{error::Error, str::FromStr}; use walkdir::DirEntry; +use self::access::AccessMatcher; use self::delete::DeleteMatcher; use self::empty::EmptyMatcher; use self::exec::SingleExecMatcher; @@ -305,6 +307,7 @@ fn build_matcher_tree( i += 1; Some(PathMatcher::new(args[i], args[i - 1].starts_with("-i")).into_box()) } + "-readable" => Some(AccessMatcher::Readable.into_box()), "-regextype" => { if i >= args.len() - 1 { return Err(From::from(format!("missing argument to {}", args[i]))); @@ -398,6 +401,7 @@ fn build_matcher_tree( .into_box(), ) } + "-executable" => Some(AccessMatcher::Executable.into_box()), "-perm" => { if i >= args.len() - 1 { return Err(From::from(format!("missing argument to {}", args[i]))); @@ -407,6 +411,7 @@ fn build_matcher_tree( } "-prune" => Some(PruneMatcher::new().into_box()), "-quit" => Some(QuitMatcher.into_box()), + "-writable" => Some(AccessMatcher::Writable.into_box()), "-not" | "!" => { if !are_more_expressions(args, i) { return Err(From::from(format!( diff --git a/tests/find_cmd_tests.rs b/tests/find_cmd_tests.rs index 98bc03e..e64db3a 100644 --- a/tests/find_cmd_tests.rs +++ b/tests/find_cmd_tests.rs @@ -429,3 +429,32 @@ fn find_mount_xdev() { .stderr(predicate::str::is_empty()) .stdout(predicate::str::contains("abbbc")); } + +#[serial(working_dir)] +#[test] +fn find_accessable() { + Command::cargo_bin("find") + .expect("found binary") + .args(&["test_data", "-readable"]) + .assert() + .success() + .stderr(predicate::str::is_empty()) + .stdout(predicate::str::contains("abbbc")); + + Command::cargo_bin("find") + .expect("found binary") + .args(&["test_data", "-writable"]) + .assert() + .success() + .stderr(predicate::str::is_empty()) + .stdout(predicate::str::contains("abbbc")); + + #[cfg(unix)] + Command::cargo_bin("find") + .expect("found binary") + .args(&["test_data", "-executable"]) + .assert() + .success() + .stderr(predicate::str::is_empty()) + .stdout(predicate::str::contains("abbbc").not()); +} From f05c2f1b61f9e1a907f0c5dac8ae2c8f95bfa099 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Jun 2022 03:17:56 +0000 Subject: [PATCH 2/2] build(deps): bump serial_test from 0.6.0 to 0.7.0 Bumps [serial_test](https://github.com/palfrey/serial_test) from 0.6.0 to 0.7.0. - [Release notes](https://github.com/palfrey/serial_test/releases) - [Commits](https://github.com/palfrey/serial_test/compare/v0.6.0...v0.7.0) --- updated-dependencies: - dependency-name: serial_test dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 93 ++++++++++++++++++++++++++++++++++++++---------------- Cargo.toml | 2 +- 2 files changed, 66 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4b35a37..7056e9d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -47,9 +47,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "bindgen" @@ -211,7 +211,7 @@ checksum = "c0408e2626025178a6a7f7ffc05a25bc47103229f19c113755de7bf63816290c" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.2.10", + "redox_syscall", "winapi", ] @@ -311,10 +311,11 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.2" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312" +checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" dependencies = [ + "autocfg", "scopeguard", ] @@ -436,27 +437,25 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.11.1" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ - "instant", "lock_api", "parking_lot_core", ] [[package]] name = "parking_lot_core" -version = "0.8.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ccb628cad4f84851442432c60ad8e1f607e29752d0bf072cbd0baf28aa34272" +checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" dependencies = [ "cfg-if", - "instant", "libc", - "redox_syscall 0.1.57", + "redox_syscall", "smallvec", - "winapi", + "windows-sys", ] [[package]] @@ -543,12 +542,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "redox_syscall" -version = "0.1.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" - [[package]] name = "redox_syscall" version = "0.2.10" @@ -564,7 +557,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8440d8acb4fd3d277125b4bd01a6f38aee8d814b3b5fc09b3f2b825d37d3fe8f" dependencies = [ - "redox_syscall 0.2.10", + "redox_syscall", ] [[package]] @@ -631,20 +624,21 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "serial_test" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5bcc41d18f7a1d50525d080fd3e953be87c4f9f1a974f3c21798ca00d54ec15" +checksum = "d19dbfb999a147cedbfe82f042eb9555f5b0fa4ef95ee4570b74349103d9c9f4" dependencies = [ "lazy_static", + "log", "parking_lot", "serial_test_derive", ] [[package]] name = "serial_test_derive" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2881bccd7d60fb32dfa3d7b3136385312f8ad75e2674aab2852867a09790cae8" +checksum = "cb9e2050b2be1d681f8f1c1a528bcfe4e00afa2d8995f713974f5333288659f2" dependencies = [ "proc-macro-error", "proc-macro2", @@ -661,9 +655,9 @@ checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" [[package]] name = "smallvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a55ca5f3b68e41c979bf8c46a6f1da892ca4db8f94023ce0bd32407573b1ac0" +checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" [[package]] name = "strsim" @@ -691,7 +685,7 @@ dependencies = [ "cfg-if", "fastrand", "libc", - "redox_syscall 0.2.10", + "redox_syscall", "remove_dir_all", "winapi", ] @@ -713,7 +707,7 @@ checksum = "077185e2eac69c3f8379a4298e1e07cd36beb962290d4a51199acf0fdc10607e" dependencies = [ "libc", "numtoa", - "redox_syscall 0.2.10", + "redox_syscall", "redox_termios", ] @@ -863,3 +857,46 @@ dependencies = [ "winapi", "winapi-util", ] + +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" diff --git a/Cargo.toml b/Cargo.toml index 95c97bd..a3bf602 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ uucore = { version = "0.0.12", features = ["entries", "fs", "fsext", "mode"] } assert_cmd = "2" filetime = "0.2" predicates = "2" -serial_test = "0.6" +serial_test = "0.7" tempfile = "3" [[bin]]