From da198dbb197c436e65d3c108ff9b9a53a2031338 Mon Sep 17 00:00:00 2001 From: Jan Scheer Date: Sun, 19 Sep 2021 22:24:11 +0200 Subject: [PATCH 001/242] tests/util: add a convenience wrapper to run a ucmd with root permissions --- tests/common/util.rs | 68 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/tests/common/util.rs b/tests/common/util.rs index f3cdec0100d..a7c6e464d89 100644 --- a/tests/common/util.rs +++ b/tests/common/util.rs @@ -1237,6 +1237,58 @@ pub fn expected_result(ts: &TestScenario, args: &[&str]) -> std::result::Result< )) } +/// This is a convenience wrapper to run a ucmd with root permissions. +/// This runs 'sudo -E --non-interactive target/debug/coreutils util_name args` +/// This is primarily designed to run in the CICD environment where whoami is in $path +/// and where non-interactive sudo is possible. +/// To check if i) non-interactive sudo is possible and ii) if sudo works, this runs: +/// 'sudo -E --non-interactive whoami' first. +/// +/// Example: +/// +/// ```no_run +/// use crate::common::util::*; +/// #[test] +/// fn test_xyz() { +/// let ts = TestScenario::new("whoami"); +/// let expected = "root\n".to_string(); +/// if let Ok(result) = run_ucmd_as_root(&ts, &[]) { +/// result.stdout_is(expected); +/// } else { +/// print!("TEST SKIPPED"); +/// } +/// } +///``` +#[cfg(unix)] +pub fn run_ucmd_as_root( + ts: &TestScenario, + args: &[&str], +) -> std::result::Result { + if ts + .cmd_keepenv("sudo") + .env("LC_ALL", "C") + .arg("-E") + .arg("--non-interactive") + .arg("whoami") + .run() + .stdout_str() + .trim() + != "root" + { + Err("\"sudo whoami\" didn't return \"root\"".to_string()) + } else { + Ok(ts + .cmd_keepenv("sudo") + .env("LC_ALL", "C") + .arg("-E") + .arg("--non-interactive") + .arg(&ts.bin_path) + .arg(&ts.util_name) + .args(args) + .run()) + } +} + /// Sanity checks for test utils #[cfg(test)] mod tests { @@ -1523,4 +1575,20 @@ mod tests { std::assert_eq!(host_name_for("gwho"), "gwho"); } } + + #[test] + #[cfg(unix)] + fn test_run_ucmd_as_root() { + // We need non-interactive `sudo. + // CICD environment should allow non-interactive `sudo`. + // Return early if we can't guarantee non-interactive `sudo` + if !is_ci() { + return; + } + let ts = TestScenario::new("whoami"); + std::assert_eq!( + run_ucmd_as_root(&ts, &[]).unwrap().stdout_str().trim(), + "root" + ); + } } From 4ef77232486f0c7e9a6b8e0ad88a966f96b79f6d Mon Sep 17 00:00:00 2001 From: Jan Scheer Date: Mon, 20 Sep 2021 00:20:06 +0200 Subject: [PATCH 002/242] Update util.rs add feature for `whoami` --- tests/common/util.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/common/util.rs b/tests/common/util.rs index a7c6e464d89..f056f35103a 100644 --- a/tests/common/util.rs +++ b/tests/common/util.rs @@ -1578,6 +1578,7 @@ mod tests { #[test] #[cfg(unix)] + #[cfg(feature = "whoami")] fn test_run_ucmd_as_root() { // We need non-interactive `sudo. // CICD environment should allow non-interactive `sudo`. From 1ccf55a3dc611c5de46b9fe8a479dc6d42c67d6d Mon Sep 17 00:00:00 2001 From: Jan Scheer Date: Tue, 21 Sep 2021 00:23:23 +0200 Subject: [PATCH 003/242] Update util.rs --- tests/common/util.rs | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/tests/common/util.rs b/tests/common/util.rs index f056f35103a..928bc84f3de 100644 --- a/tests/common/util.rs +++ b/tests/common/util.rs @@ -1239,7 +1239,7 @@ pub fn expected_result(ts: &TestScenario, args: &[&str]) -> std::result::Result< /// This is a convenience wrapper to run a ucmd with root permissions. /// This runs 'sudo -E --non-interactive target/debug/coreutils util_name args` -/// This is primarily designed to run in the CICD environment where whoami is in $path +/// This is primarily designed to run in an environment where whoami is in $path /// and where non-interactive sudo is possible. /// To check if i) non-interactive sudo is possible and ii) if sudo works, this runs: /// 'sudo -E --non-interactive whoami' first. @@ -1264,6 +1264,7 @@ pub fn run_ucmd_as_root( ts: &TestScenario, args: &[&str], ) -> std::result::Result { + // Apparently CICD environment has no `sudo`? if ts .cmd_keepenv("sudo") .env("LC_ALL", "C") @@ -1580,16 +1581,18 @@ mod tests { #[cfg(unix)] #[cfg(feature = "whoami")] fn test_run_ucmd_as_root() { - // We need non-interactive `sudo. - // CICD environment should allow non-interactive `sudo`. - // Return early if we can't guarantee non-interactive `sudo` - if !is_ci() { - return; + // Skip test if we can't guarantee non-interactive `sudo`. + if let Ok(_status) = Command::new("sudo") + .args(&["-E", "-v", "--non-interactive"]) + .status() + { + let ts = TestScenario::new("whoami"); + std::assert_eq!( + run_ucmd_as_root(&ts, &[]).unwrap().stdout_str().trim(), + "root" + ); + } else { + print!("TEST SKIPPED"); } - let ts = TestScenario::new("whoami"); - std::assert_eq!( - run_ucmd_as_root(&ts, &[]).unwrap().stdout_str().trim(), - "root" - ); } } From ea175ce25206defaa3e664eeb6c4c7fad1d12363 Mon Sep 17 00:00:00 2001 From: Pyokyeong Son Date: Thu, 17 Feb 2022 07:37:55 +0000 Subject: [PATCH 004/242] mkdir: permissions respects umask - hardcoded default permissions changed to ones defined by umask --- src/uu/mkdir/src/mkdir.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/uu/mkdir/src/mkdir.rs b/src/uu/mkdir/src/mkdir.rs index 377036174b5..7aa6fd8f8f3 100644 --- a/src/uu/mkdir/src/mkdir.rs +++ b/src/uu/mkdir/src/mkdir.rs @@ -64,7 +64,10 @@ fn get_mode(matches: &ArgMatches, mode_had_minus_prefix: bool) -> Result Ok(DEFAULT_PERM), + None => { + // If no mode argument is specified return the mode from umask + Ok(mode::get_umask()) + } } } @@ -119,7 +122,7 @@ pub fn uu_app<'a>() -> App<'a> { .short('m') .long(options::MODE) .help("set file mode (not implemented on windows)") - .default_value("755"), + .takes_value(true), ) .arg( Arg::new(options::PARENTS) From b8c0a87f8552290f07dcd22fbb6db89ba1c64569 Mon Sep 17 00:00:00 2001 From: Pyokyeong Son Date: Fri, 18 Feb 2022 07:52:38 +0000 Subject: [PATCH 005/242] mkdir: fixed permissions behavior with umask - umask application more closely resembles gnu --- src/uu/mkdir/src/mkdir.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/uu/mkdir/src/mkdir.rs b/src/uu/mkdir/src/mkdir.rs index 7aa6fd8f8f3..f1f21501ac9 100644 --- a/src/uu/mkdir/src/mkdir.rs +++ b/src/uu/mkdir/src/mkdir.rs @@ -65,8 +65,8 @@ fn get_mode(matches: &ArgMatches, mode_had_minus_prefix: bool) -> Result { - // If no mode argument is specified return the mode from umask - Ok(mode::get_umask()) + // If no mode argument is specified return the mode derived from umask + Ok(!mode::get_umask() & 0o0777) } } } From 8ffe367dd8c58a853208adfca79a428321a00f46 Mon Sep 17 00:00:00 2001 From: Pyokyeong Son Date: Sat, 19 Feb 2022 05:37:56 +0000 Subject: [PATCH 006/242] test/mkdir: added testing for umask compliance - tests for all permission combinations --- tests/by-util/test_mkdir.rs | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/tests/by-util/test_mkdir.rs b/tests/by-util/test_mkdir.rs index e1038003b3c..cfb50f2528b 100644 --- a/tests/by-util/test_mkdir.rs +++ b/tests/by-util/test_mkdir.rs @@ -1,6 +1,8 @@ use crate::common::util::*; #[cfg(not(windows))] use std::os::unix::fs::PermissionsExt; +extern crate libc; +use self::libc::umask; static TEST_DIR1: &str = "mkdir_test1"; static TEST_DIR2: &str = "mkdir_test2"; @@ -9,11 +11,7 @@ static TEST_DIR4: &str = "mkdir_test4/mkdir_test4_1"; static TEST_DIR5: &str = "mkdir_test5/mkdir_test5_1"; static TEST_DIR6: &str = "mkdir_test6"; static TEST_FILE7: &str = "mkdir_test7"; - -#[test] -fn test_mkdir_mkdir() { - new_ucmd!().arg(TEST_DIR1).succeeds(); -} +static TEST_DIR8: &str = "mkdir_test8"; #[test] fn test_mkdir_verbose() { @@ -100,3 +98,24 @@ fn test_multi_symbolic() { let perms = at.metadata(TEST_DIR1).permissions().mode(); assert_eq!(perms, 0o40750); } + +#[test] +#[cfg(not(windows))] +fn test_umask_compliance() { + fn test_single_case(umask_set: u32) { + let (at, mut ucmd) = at_and_ucmd!(); + + let original_umask = unsafe { umask(umask_set) }; + + ucmd.arg(TEST_DIR8).succeeds(); + let perms = at.metadata(TEST_DIR8).permissions().mode(); + + assert_eq!(perms, (!umask_set & 0o0777) + 0o40000); // before compare, add the setguid, uid bits + unsafe { umask(original_umask); } // set umask back to original + } + + for i in 0o0..0o777 { // tests all permission combinations + test_single_case(i); + } + +} From 553c22d33db3b47b464e58300679cb19d388a049 Mon Sep 17 00:00:00 2001 From: Pyokyeong Son Date: Sat, 19 Feb 2022 05:46:11 +0000 Subject: [PATCH 007/242] test/mkdir: reverted mkdir testing delete --- tests/by-util/test_mkdir.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/by-util/test_mkdir.rs b/tests/by-util/test_mkdir.rs index cfb50f2528b..3806df8155a 100644 --- a/tests/by-util/test_mkdir.rs +++ b/tests/by-util/test_mkdir.rs @@ -13,6 +13,11 @@ static TEST_DIR6: &str = "mkdir_test6"; static TEST_FILE7: &str = "mkdir_test7"; static TEST_DIR8: &str = "mkdir_test8"; +#[test] +fn test_mkdir_mkdir() { + new_ucmd!().arg(TEST_DIR1).succeeds(); +} + #[test] fn test_mkdir_verbose() { let expected = "mkdir: created directory 'mkdir_test1'\n"; From fe9e9e668998fc180ea6419df6170b72040dd040 Mon Sep 17 00:00:00 2001 From: Pyokyeong Son Date: Thu, 24 Feb 2022 07:26:46 +0000 Subject: [PATCH 008/242] test/mkdir: made umask variable mode_t --- tests/by-util/test_mkdir.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/by-util/test_mkdir.rs b/tests/by-util/test_mkdir.rs index 3806df8155a..d2181e8ea28 100644 --- a/tests/by-util/test_mkdir.rs +++ b/tests/by-util/test_mkdir.rs @@ -2,7 +2,7 @@ use crate::common::util::*; #[cfg(not(windows))] use std::os::unix::fs::PermissionsExt; extern crate libc; -use self::libc::umask; +use self::libc::{umask, mode_t}; static TEST_DIR1: &str = "mkdir_test1"; static TEST_DIR2: &str = "mkdir_test2"; @@ -107,7 +107,7 @@ fn test_multi_symbolic() { #[test] #[cfg(not(windows))] fn test_umask_compliance() { - fn test_single_case(umask_set: u32) { + fn test_single_case(umask_set: mode_t) { let (at, mut ucmd) = at_and_ucmd!(); let original_umask = unsafe { umask(umask_set) }; From 31d91f36b94efa49125a5310b2811ea3e61d82a1 Mon Sep 17 00:00:00 2001 From: Pyokyeong Son Date: Thu, 24 Feb 2022 07:43:53 +0000 Subject: [PATCH 009/242] test/mkdir: fixed assert types to both mode_t --- tests/by-util/test_mkdir.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/by-util/test_mkdir.rs b/tests/by-util/test_mkdir.rs index d2181e8ea28..730beaef190 100644 --- a/tests/by-util/test_mkdir.rs +++ b/tests/by-util/test_mkdir.rs @@ -113,7 +113,7 @@ fn test_umask_compliance() { let original_umask = unsafe { umask(umask_set) }; ucmd.arg(TEST_DIR8).succeeds(); - let perms = at.metadata(TEST_DIR8).permissions().mode(); + let perms = at.metadata(TEST_DIR8).permissions().mode() as mode_t; assert_eq!(perms, (!umask_set & 0o0777) + 0o40000); // before compare, add the setguid, uid bits unsafe { umask(original_umask); } // set umask back to original @@ -122,5 +122,5 @@ fn test_umask_compliance() { for i in 0o0..0o777 { // tests all permission combinations test_single_case(i); } - + } From 71a6ae14434ac358da3384a32f08e842f5eba803 Mon Sep 17 00:00:00 2001 From: Kartik Sharma Date: Sun, 20 Mar 2022 17:57:00 +0530 Subject: [PATCH 010/242] Added support to read a filename redirected to stdin - Canonicalization of `/dev/stdin` which points to stdin file --- src/uu/stat/src/stat.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/uu/stat/src/stat.rs b/src/uu/stat/src/stat.rs index 569c94d96f1..512eb6a8a61 100644 --- a/src/uu/stat/src/stat.rs +++ b/src/uu/stat/src/stat.rs @@ -471,11 +471,18 @@ impl Stater { } fn new(matches: &ArgMatches) -> UResult { - let files: Vec = matches + let mut files: Vec = matches .values_of(ARG_FILES) .map(|v| v.map(ToString::to_string).collect()) .unwrap_or_default(); - + #[cfg(unix)] + if files.contains(&String::from("-")) { + files = Vec::from([Path::new("/dev/stdin") + .canonicalize()? + .into_os_string() + .into_string() + .unwrap()]); + } let format_str = if matches.is_present(options::PRINTF) { matches .value_of(options::PRINTF) From 193899f09ce7922fcbd8f65b1b96e72362c8f621 Mon Sep 17 00:00:00 2001 From: Kartik Sharma Date: Wed, 23 Mar 2022 20:05:20 +0530 Subject: [PATCH 011/242] Modified code to replace all instances of `-` Now all instances of `-` will be replaced with real / canonicalized path of `/dev/stdin` --- src/uu/stat/src/stat.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/uu/stat/src/stat.rs b/src/uu/stat/src/stat.rs index 512eb6a8a61..3196c373d6f 100644 --- a/src/uu/stat/src/stat.rs +++ b/src/uu/stat/src/stat.rs @@ -477,11 +477,17 @@ impl Stater { .unwrap_or_default(); #[cfg(unix)] if files.contains(&String::from("-")) { - files = Vec::from([Path::new("/dev/stdin") - .canonicalize()? + let redirected_path = Path::new("/dev/stdin") + .canonicalize() + .expect("unable to canonicalize /dev/stdin") .into_os_string() .into_string() - .unwrap()]); + .unwrap(); + for file in &mut files { + if file == "-" { + *file = redirected_path.clone(); + } + } } let format_str = if matches.is_present(options::PRINTF) { matches From 98370727a24e2fe0c2dbc71c27bb5c2e4867c32a Mon Sep 17 00:00:00 2001 From: Pyokyeong Son Date: Fri, 25 Mar 2022 15:04:15 +0000 Subject: [PATCH 012/242] test/mkdir: formatting compliance --- tests/by-util/test_mkdir.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/tests/by-util/test_mkdir.rs b/tests/by-util/test_mkdir.rs index 6d617f4e172..8b08d7962c9 100644 --- a/tests/by-util/test_mkdir.rs +++ b/tests/by-util/test_mkdir.rs @@ -1,8 +1,10 @@ use crate::common::util::*; #[cfg(not(windows))] use std::os::unix::fs::PermissionsExt; +#[cfg(not(windows))] extern crate libc; -use self::libc::{umask, mode_t}; +#[cfg(not(windows))] +use self::libc::{mode_t, umask}; static TEST_DIR1: &str = "mkdir_test1"; static TEST_DIR2: &str = "mkdir_test2"; @@ -17,7 +19,7 @@ static TEST_DIR10: &str = "mkdir_test10"; #[test] fn test_mkdir_mkdir() { - new_ucmd!().arg(TEST_DIR1).succeeds(); + new_ucmd!().arg(TEST_DIR1).succeeds(); } #[test] @@ -138,11 +140,14 @@ fn test_umask_compliance() { ucmd.arg(TEST_DIR10).succeeds(); let perms = at.metadata(TEST_DIR10).permissions().mode() as mode_t; - assert_eq!(perms, (!umask_set & 0o0777) + 0o40000); // before compare, add the setguid, uid bits - unsafe { umask(original_umask); } // set umask back to original + assert_eq!(perms, (!umask_set & 0o0777) + 0o40000); // before compare, add the set GUID, UID bits + unsafe { + umask(original_umask); + } // set umask back to original } - for i in 0o0..0o777 { // tests all permission combinations + for i in 0o0..0o777 { + // tests all permission combinations test_single_case(i); } } From 9a76f3ba31365c77291eae72d84f848dc7d677f9 Mon Sep 17 00:00:00 2001 From: Pyokyeong Son Date: Thu, 31 Mar 2022 15:50:52 +0900 Subject: [PATCH 013/242] tests/mkdir: reduced tested permission combinations tests/pwd: escapted directory paths --- tests/by-util/test_mkdir.rs | 7 +++---- tests/by-util/test_pwd.rs | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/by-util/test_mkdir.rs b/tests/by-util/test_mkdir.rs index 09e9915db34..b2d2dc8fd51 100644 --- a/tests/by-util/test_mkdir.rs +++ b/tests/by-util/test_mkdir.rs @@ -19,7 +19,6 @@ static TEST_DIR10: &str = "mkdir_test10/."; static TEST_DIR11: &str = "mkdir_test11/.."; static TEST_DIR12: &str = "mkdir_test12"; - #[test] fn test_mkdir_mkdir() { new_ucmd!().arg(TEST_DIR1).succeeds(); @@ -175,8 +174,8 @@ fn test_umask_compliance() { } // set umask back to original } - for i in 0o0..0o777 { + for i in 0o0..0o027 { // tests all permission combinations - test_single_case(i); + test_single_case(i as mode_t); } -} \ No newline at end of file +} diff --git a/tests/by-util/test_pwd.rs b/tests/by-util/test_pwd.rs index bc08ddbb0df..950a148a306 100644 --- a/tests/by-util/test_pwd.rs +++ b/tests/by-util/test_pwd.rs @@ -26,7 +26,7 @@ fn test_deleted_dir() { let output = Command::new("sh") .arg("-c") .arg(format!( - "cd '{}'; mkdir foo; cd foo; rmdir ../foo; exec {} {}", + "cd '{}'; mkdir foo; cd foo; rmdir ../foo; exec '{}' {}", at.root_dir_resolved(), ts.bin_path.to_str().unwrap(), ts.util_name, From 12ad0f0903d7cb34504bbbc3b04068218aea9783 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sat, 2 Apr 2022 09:54:11 +0200 Subject: [PATCH 014/242] Fix clippy Co-authored-by: Terts Diepraam --- tests/by-util/test_mkdir.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/by-util/test_mkdir.rs b/tests/by-util/test_mkdir.rs index b2d2dc8fd51..be7a95af2e7 100644 --- a/tests/by-util/test_mkdir.rs +++ b/tests/by-util/test_mkdir.rs @@ -17,6 +17,7 @@ static TEST_DIR8: &str = "mkdir_test8/mkdir_test8_1/mkdir_test8_2"; static TEST_DIR9: &str = "mkdir_test9/../mkdir_test9_1/../mkdir_test9_2"; static TEST_DIR10: &str = "mkdir_test10/."; static TEST_DIR11: &str = "mkdir_test11/.."; +#[cfg(not(windows))] static TEST_DIR12: &str = "mkdir_test12"; #[test] From 33e3e0d7414df7820461758ddc6b2fd942ce89e8 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sat, 2 Apr 2022 14:21:16 +0200 Subject: [PATCH 015/242] Document how to install it easily --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index ae217dc4909..6b4f45a4abe 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,13 @@ uutils is an attempt at writing universal (as in cross-platform) CLI utilities in [Rust](http://www.rust-lang.org). +To install it: + +``` +$ cargo install coreutils +$ ~/.cargo/bin/coreutils +``` + ## Why? uutils aims to work on as many platforms as possible, to be able to use the From 3629421e1776668aece281c759bd401e9e961040 Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Fri, 1 Apr 2022 18:43:05 +0200 Subject: [PATCH 016/242] Bump MSRV to 1.56 --- .clippy.toml | 2 +- .github/workflows/CICD.yml | 2 +- README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.clippy.toml b/.clippy.toml index 0f31b88d4f1..0d369b50fac 100644 --- a/.clippy.toml +++ b/.clippy.toml @@ -1 +1 @@ -msrv = "1.54.0" +msrv = "1.56.0" diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml index d2cf890a2ee..08803afb14d 100644 --- a/.github/workflows/CICD.yml +++ b/.github/workflows/CICD.yml @@ -13,7 +13,7 @@ env: PROJECT_NAME: coreutils PROJECT_DESC: "Core universal (cross-platform) utilities" PROJECT_AUTH: "uutils" - RUST_MIN_SRV: "1.54.0" ## MSRV v1.54.0 + RUST_MIN_SRV: "1.56.0" ## MSRV v1.56.0 # * style job configuration STYLE_FAIL_ON_FAULT: true ## (bool) fail the build if a style job contains a fault (error or warning); may be overridden on a per-job basis diff --git a/README.md b/README.md index 6b4f45a4abe..e00a01ec58e 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ Both can also be generated locally, the instructions for that can be found in th ### Rust Version uutils follows Rust's release channels and is tested against stable, beta and nightly. -The current oldest supported version of the Rust compiler is `1.54`. +The current oldest supported version of the Rust compiler is `1.56`. On both Windows and Redox, only the nightly version is tested currently. From 4701ea0c953746859c6c74e799b05089fa05702b Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Fri, 1 Apr 2022 18:46:12 +0200 Subject: [PATCH 017/242] uucore: use split_once in canon_host --- src/uucore/src/lib/features/utmpx.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/uucore/src/lib/features/utmpx.rs b/src/uucore/src/lib/features/utmpx.rs index c82fd35efac..2a0e2810b02 100644 --- a/src/uucore/src/lib/features/utmpx.rs +++ b/src/uucore/src/lib/features/utmpx.rs @@ -221,11 +221,7 @@ impl Utmpx { pub fn canon_host(&self) -> IOResult { let host = self.host(); - // TODO: change to use `split_once` when MSRV hits 1.52.0 - // let (hostname, display) = host.split_once(':').unwrap_or((&host, "")); - let mut h = host.split(':'); - let hostname = h.next().unwrap_or(&host); - let display = h.next().unwrap_or(""); + let (hostname, display) = host.split_once(':').unwrap_or((&host, "")); if !hostname.is_empty() { extern crate dns_lookup; From 0fc667730d7619f5cfa8c45d88e16dff691740a5 Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Fri, 1 Apr 2022 18:50:42 +0200 Subject: [PATCH 018/242] join: fix workaround for IntErrorKind In Rust versions before 1.55, there was no enum for parse errors. With the bump of the MSRV to 1.56 we can simplify this. --- src/uu/join/src/join.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/uu/join/src/join.rs b/src/uu/join/src/join.rs index 1d306415b29..ef19fe32833 100644 --- a/src/uu/join/src/join.rs +++ b/src/uu/join/src/join.rs @@ -18,6 +18,7 @@ use std::error::Error; use std::fmt::Display; use std::fs::File; use std::io::{stdin, stdout, BufRead, BufReader, BufWriter, Split, Stdin, Write}; +use std::num::IntErrorKind; #[cfg(unix)] use std::os::unix::ffi::OsStrExt; use uucore::display::Quotable; @@ -965,13 +966,9 @@ fn get_field_number(keys: Option, key: Option) -> UResult { /// Parse the specified field string as a natural number and return /// the zero-based field number. fn parse_field_number(value: &str) -> UResult { - // TODO: use ParseIntError.kind() once MSRV >= 1.55 - // For now, store an overflow Err from parsing a value 10x 64 bit usize::MAX - // Adapted from https://github.com/rust-lang/rust/issues/22639 - let overflow = "184467440737095516150".parse::().err().unwrap(); match value.parse::() { Ok(result) if result > 0 => Ok(result - 1), - Err(ref e) if *e == overflow => Ok(usize::MAX), + Err(e) if e.kind() == &IntErrorKind::PosOverflow => Ok(usize::MAX), _ => Err(USimpleError::new( 1, format!("invalid field number: {}", value.quote()), From e82ef6966e986db0bb1012921158af1bf2ef1959 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 2 Apr 2022 12:12:52 +0000 Subject: [PATCH 019/242] build(deps): bump exacl from 0.6.0 to 0.8.0 Bumps [exacl](https://github.com/byllyfish/exacl) from 0.6.0 to 0.8.0. - [Release notes](https://github.com/byllyfish/exacl/releases) - [Changelog](https://github.com/byllyfish/exacl/blob/main/CHANGELOG.md) - [Commits](https://github.com/byllyfish/exacl/compare/v0.6.0...v0.8.0) --- updated-dependencies: - dependency-name: exacl dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 100 ++++++------------------------------------- src/uu/cp/Cargo.toml | 2 +- 2 files changed, 13 insertions(+), 89 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bed803490db..577a0a2c46d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -333,7 +333,7 @@ dependencies = [ "hex-literal", "lazy_static", "libc", - "nix 0.23.1", + "nix", "phf", "phf_codegen", "pretty_assertions", @@ -670,7 +670,7 @@ version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a19c6cedffdc8c03a3346d723eb20bd85a13362bb96dc2ac000842c6381ec7bf" dependencies = [ - "nix 0.23.1", + "nix", "winapi 0.3.9", ] @@ -781,16 +781,13 @@ dependencies = [ [[package]] name = "exacl" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "769bbd173781e84865b957cf83449f0d2869f4c9d2f191cbbffffb3d9751ba2b" +checksum = "9d5d9a2fa7d72579802c22bb97c37953cf1007f21f7ac2247d150c4c2d40c2ab" dependencies = [ "bitflags", "log", - "nix 0.21.0", - "num_enum", "scopeguard", - "serde", "uuid", ] @@ -1192,19 +1189,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "nix" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c3728fec49d363a50a8828a190b379a446cc5cf085c06259bbbeb34447e4ec7" -dependencies = [ - "bitflags", - "cc", - "cfg-if 1.0.0", - "libc", - "memoffset", -] - [[package]] name = "nix" version = "0.23.1" @@ -1278,27 +1262,6 @@ dependencies = [ "libc", ] -[[package]] -name = "num_enum" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "720d3ea1055e4e4574c0c0b0f8c3fd4f24c4cdaf465948206dea090b57b526ad" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d992b768490d7fe0d8586d9b5745f6c49f557da6d81dc982b1d167ad4edbb21" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote 1.0.14", - "syn", -] - [[package]] name = "number_prefix" version = "0.4.0" @@ -1515,16 +1478,6 @@ dependencies = [ "output_vt100", ] -[[package]] -name = "proc-macro-crate" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebace6889caf889b4d3f76becee12e90353f2b8c7d875534a71e5742f8f6f83" -dependencies = [ - "thiserror", - "toml", -] - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1827,26 +1780,6 @@ dependencies = [ "walkdir", ] -[[package]] -name = "serde" -version = "1.0.134" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b3c34c1690edf8174f5b289a336ab03f568a4460d8c6df75f2f3a692b3bc6a" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.134" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784ed1fbfa13fe191077537b0d70ec8ad1e903cfe04831da608aa36457cb653d" -dependencies = [ - "proc-macro2", - "quote 1.0.14", - "syn", -] - [[package]] name = "sha1" version = "0.10.1" @@ -2136,15 +2069,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" -[[package]] -name = "toml" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" -dependencies = [ - "serde", -] - [[package]] name = "typenum" version = "1.15.0" @@ -2320,7 +2244,7 @@ version = "0.0.13" dependencies = [ "atty", "clap 3.1.6", - "nix 0.23.1", + "nix", "thiserror", "unix_socket", "uucore", @@ -2739,7 +2663,7 @@ dependencies = [ "atty", "clap 3.1.6", "crossterm", - "nix 0.23.1", + "nix", "unicode-segmentation", "unicode-width", "uucore", @@ -2760,7 +2684,7 @@ version = "0.0.13" dependencies = [ "clap 3.1.6", "libc", - "nix 0.23.1", + "nix", "uucore", ] @@ -3065,7 +2989,7 @@ version = "0.0.13" dependencies = [ "clap 3.1.6", "libc", - "nix 0.23.1", + "nix", "uucore", "winapi 0.3.9", ] @@ -3096,7 +3020,7 @@ version = "0.0.13" dependencies = [ "clap 3.1.6", "libc", - "nix 0.23.1", + "nix", "uucore", ] @@ -3214,7 +3138,7 @@ dependencies = [ "bytecount", "clap 3.1.6", "libc", - "nix 0.23.1", + "nix", "unicode-width", "utf-8", "uucore", @@ -3243,7 +3167,7 @@ name = "uu_yes" version = "0.0.13" dependencies = [ "clap 3.1.6", - "nix 0.23.1", + "nix", "uucore", ] @@ -3259,7 +3183,7 @@ dependencies = [ "itertools", "lazy_static", "libc", - "nix 0.23.1", + "nix", "once_cell", "os_display", "thiserror", diff --git a/src/uu/cp/Cargo.toml b/src/uu/cp/Cargo.toml index a580fce7429..452e1e8cf73 100644 --- a/src/uu/cp/Cargo.toml +++ b/src/uu/cp/Cargo.toml @@ -35,7 +35,7 @@ winapi = { version="0.3", features=["fileapi"] } [target.'cfg(unix)'.dependencies] xattr="0.2.1" -exacl= { version = "0.6.0", optional=true } +exacl= { version = "0.8.0", optional=true } [[bin]] name = "cp" From ee515b57c3f26d4d2cf93ce3eac67b00b86c74a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Mar 2022 23:12:38 +0000 Subject: [PATCH 020/242] build(deps): bump lscolors from 0.7.1 to 0.9.0 Bumps [lscolors](https://github.com/sharkdp/lscolors) from 0.7.1 to 0.9.0. - [Release notes](https://github.com/sharkdp/lscolors/releases) - [Commits](https://github.com/sharkdp/lscolors/compare/v0.7.1...v0.9.0) --- updated-dependencies: - dependency-name: lscolors dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- src/uu/ls/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bed803490db..0de066b3431 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1093,9 +1093,9 @@ dependencies = [ [[package]] name = "lscolors" -version = "0.7.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24b894c45c9da468621cdd615a5a79ee5e5523dd4f75c76ebc03d458940c16e" +checksum = "4e9323b3525d4efad2dead1837a105e313253bfdbad1d470994038eededa4d62" dependencies = [ "ansi_term", ] diff --git a/src/uu/ls/Cargo.toml b/src/uu/ls/Cargo.toml index d082c8260bd..bd13588dedc 100644 --- a/src/uu/ls/Cargo.toml +++ b/src/uu/ls/Cargo.toml @@ -22,7 +22,7 @@ number_prefix = "0.4" term_grid = "0.1.5" termsize = "0.1.6" glob = "0.3.0" -lscolors = { version = "0.7.1", features = ["ansi_term"] } +lscolors = { version = "0.9.0", features = ["ansi_term"] } uucore = { version = ">=0.0.8", package = "uucore", path = "../../uucore", features = ["entries", "fs"] } once_cell = "1.10.0" atty = "0.2" From fd84b97227c6377b865baa7635b84c2a44437e6d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 25 Mar 2022 20:04:48 +0000 Subject: [PATCH 021/242] build(deps): bump crossterm from 0.22.1 to 0.23.1 Bumps [crossterm](https://github.com/crossterm-rs/crossterm) from 0.22.1 to 0.23.1. - [Release notes](https://github.com/crossterm-rs/crossterm/releases) - [Changelog](https://github.com/crossterm-rs/crossterm/blob/master/CHANGELOG.md) - [Commits](https://github.com/crossterm-rs/crossterm/commits) --- updated-dependencies: - dependency-name: crossterm dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 63 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bed803490db..614ee15c2c6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -621,9 +621,9 @@ dependencies = [ [[package]] name = "crossterm" -version = "0.22.1" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c85525306c4291d1b73ce93c8acf9c339f9b213aef6c1d85c3830cbf1c16325c" +checksum = "f1fd7173631a4e9e2ca8b32ae2fad58aab9843ea5aaf56642661937d87e28a3e" dependencies = [ "bitflags", "crossterm_winapi", @@ -1075,9 +1075,9 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" +checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" dependencies = [ "scopeguard", ] @@ -1402,27 +1402,25 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.11.2" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" dependencies = [ - "instant", "lock_api", "parking_lot_core", ] [[package]] name = "parking_lot_core" -version = "0.8.5" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954" dependencies = [ "cfg-if 1.0.0", - "instant", "libc", "redox_syscall", "smallvec", - "winapi 0.3.9", + "windows-sys", ] [[package]] @@ -3461,6 +3459,49 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3df6e476185f92a12c072be4a189a0210dcdcf512a1891d6dff9edb874deadc6" +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.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" + +[[package]] +name = "windows_i686_gnu" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" + +[[package]] +name = "windows_i686_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" + [[package]] name = "xattr" version = "0.2.2" From 46ceeed54cc4e049fc4145f299c060dc371d1c2d Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sat, 2 Apr 2022 10:02:20 +0200 Subject: [PATCH 022/242] GNU: add a script to list the failing tests and sort them by size: (the smaller, the easier to fix in general) --- util/remaining-gnu-error.py | 49 +++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100755 util/remaining-gnu-error.py diff --git a/util/remaining-gnu-error.py b/util/remaining-gnu-error.py new file mode 100755 index 00000000000..79f1ae790dc --- /dev/null +++ b/util/remaining-gnu-error.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 +# This script lists the GNU failing tests by size +# Just like with util/run-gnu-test.sh, we expect the gnu sources +# to be in ../ +import urllib.request + +import urllib +import os +import glob +import json + +base = "../gnu/tests/" +urllib.request.urlretrieve( + "https://raw.githubusercontent.com/uutils/coreutils-tracking/main/gnu-full-result.json", + "result.json", +) + +tests = glob.glob(base + "/*/*.sh") +tests_pl = glob.glob(base + "/*/*.pl") +tests_xpl = glob.glob(base + "/*/*.xpl") +tests = tests + tests_pl + tests_xpl + +# sort by size +list_of_files = sorted(tests, key=lambda x: os.stat(x).st_size) + +with open("result.json", "r") as json_file: + data = json.load(json_file) + +for d in data: + for e in data[d]: + # Not all the tests are .sh files, rename them if not. + script = e.replace(".log", ".sh") + a = "%s%s/%s" % (base, d, script) + if not os.path.exists(a): + a = a.replace(".sh", ".pl") + if not os.path.exists(a): + a = a.replace(".pl", ".xpl") + + # the tests pass, we don't care anymore + if data[d][e] == "PASS": + list_of_files.remove(a) + +# Remove the factor tests and reverse the list (bigger first) +tests = list(filter(lambda k: "factor" not in k, list_of_files)) + +for f in reversed(tests): + print("%s: %s" % (f, os.stat(f).st_size)) +print("") +print("%s tests remaining" % len(tests)) From f633d52cb11caad7b4010e0db3ab10104749e4f8 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sat, 2 Apr 2022 10:20:07 +0200 Subject: [PATCH 023/242] GNU: Document how to fix GNU tests --- README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README.md b/README.md index e00a01ec58e..b95f05b9982 100644 --- a/README.md +++ b/README.md @@ -373,6 +373,25 @@ $ bash util/run-gnu-test.sh tests/touch/not-owner.sh # for example Note that it relies on individual utilities (not the multicall binary). +### Improving the GNU compatibility + +The Python script `./util/remaining-gnu-error.py` shows the list of failing tests in the CI. + +To improve the GNU compatibility, the following process is recommended: + +1. Identify a test (the smaller, the better) on a program that you understand or easy to understand. You can use the `./util/remaining-gnu-error.py` script to help with this decision. +1. Build both the GNU and Rust coreutils using: `bash util/build-gnu.sh` +1. Run the test with `bash util/run-gnu-test.sh ` +1. Start to modify `` to understand what is wrong. Examples: + 1. Add `set -v` to have the bash verbose mode + 1. Add `echo $?` where needed + 1. Bump the content of the output (ex: `cat err`) + 1. ... +1. Or, if the test is simple, extract the relevant information to create a new test case running both GNU & Rust implementation +1. Start to modify the Rust implementation to match the expected behavior +1. Add a test to make sure that we don't regress (our test suite is super quick) + + ## Contributing To contribute to uutils, please see [CONTRIBUTING](CONTRIBUTING.md). From 02cc67c915332fa488d69ea63e75a8bf1af9fa07 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sun, 3 Apr 2022 00:35:35 +0200 Subject: [PATCH 024/242] rm: rename none by --interactive=never to fix ../gnu/tests/rm/i-never.sh --- src/uu/rm/src/rm.rs | 6 +++--- tests/by-util/test_rm.rs | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/uu/rm/src/rm.rs b/src/uu/rm/src/rm.rs index a1924b41db9..0701387d972 100644 --- a/src/uu/rm/src/rm.rs +++ b/src/uu/rm/src/rm.rs @@ -24,7 +24,7 @@ use walkdir::{DirEntry, WalkDir}; #[derive(Eq, PartialEq, Clone, Copy)] enum InteractiveMode { - None, + Never, Once, Always, } @@ -101,7 +101,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { InteractiveMode::Once } else if matches.is_present(OPT_INTERACTIVE) { match matches.value_of(OPT_INTERACTIVE).unwrap() { - "none" => InteractiveMode::None, + "never" => InteractiveMode::Never, "once" => InteractiveMode::Once, "always" => InteractiveMode::Always, val => { @@ -112,7 +112,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } } } else { - InteractiveMode::None + InteractiveMode::Never } }, one_fs: matches.is_present(OPT_ONE_FILE_SYSTEM), diff --git a/tests/by-util/test_rm.rs b/tests/by-util/test_rm.rs index f813f071cb8..1b45175a8b7 100644 --- a/tests/by-util/test_rm.rs +++ b/tests/by-util/test_rm.rs @@ -326,3 +326,24 @@ fn test_rm_silently_accepts_presume_input_tty2() { assert!(!at.file_exists(file_2)); } + +#[test] +fn test_rm_interactive_never() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + let file_2 = "test_rm_interactive"; + + at.touch(file_2); + #[cfg(feature = "chmod")] + scene.ccmd("chmod").arg("0").arg(file_2).succeeds(); + + scene + .ucmd() + .arg("--interactive=never") + .arg(file_2) + .succeeds() + .stdout_is(""); + + assert!(!at.file_exists(file_2)); +} From 950432e492a8f39021e76626ab28f4af88a1d6d8 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sun, 3 Apr 2022 11:09:45 +0200 Subject: [PATCH 025/242] fix typo Co-authored-by: Terts Diepraam --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b95f05b9982..0683e42f83d 100644 --- a/README.md +++ b/README.md @@ -379,7 +379,7 @@ The Python script `./util/remaining-gnu-error.py` shows the list of failing test To improve the GNU compatibility, the following process is recommended: -1. Identify a test (the smaller, the better) on a program that you understand or easy to understand. You can use the `./util/remaining-gnu-error.py` script to help with this decision. +1. Identify a test (the smaller, the better) on a program that you understand or is easy to understand. You can use the `./util/remaining-gnu-error.py` script to help with this decision. 1. Build both the GNU and Rust coreutils using: `bash util/build-gnu.sh` 1. Run the test with `bash util/run-gnu-test.sh ` 1. Start to modify `` to understand what is wrong. Examples: From 7076cc084f92bcb85d8364eb3a6ec19daaf16024 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sun, 3 Apr 2022 11:10:39 +0200 Subject: [PATCH 026/242] Use the more modern python string declaration --- util/remaining-gnu-error.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/remaining-gnu-error.py b/util/remaining-gnu-error.py index 79f1ae790dc..5be7e784c13 100755 --- a/util/remaining-gnu-error.py +++ b/util/remaining-gnu-error.py @@ -30,7 +30,7 @@ for e in data[d]: # Not all the tests are .sh files, rename them if not. script = e.replace(".log", ".sh") - a = "%s%s/%s" % (base, d, script) + a = f"{base}{d}{script}" if not os.path.exists(a): a = a.replace(".sh", ".pl") if not os.path.exists(a): From 2628f3ed60f82c31c1218dfd5ddc6c2189a1bee0 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sat, 2 Apr 2022 11:06:19 +0200 Subject: [PATCH 027/242] install: support of `-d dir/.` to match GNU's --- src/uu/install/src/install.rs | 16 +++++++++++++--- tests/by-util/test_install.rs | 24 ++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/uu/install/src/install.rs b/src/uu/install/src/install.rs index 28d1aa7023c..f50b7e81b92 100644 --- a/src/uu/install/src/install.rs +++ b/src/uu/install/src/install.rs @@ -395,6 +395,16 @@ fn directory(paths: &[String], b: &Behavior) -> UResult<()> { for path in paths.iter().map(Path::new) { // if the path already exist, don't try to create it again if !path.exists() { + // Special case to match GNU's behavior: + // install -d foo/. should work and just create foo/ + // std::fs::create_dir("foo/."); fails in pure Rust + // See also mkdir.rs for another occurrence of this + let path_to_create = if path.to_string_lossy().ends_with("/.") { + // Do a simple dance to strip the "/." + Path::new(path).components().collect::() + } else { + path.to_path_buf() + }; // Differently than the primary functionality // (MainFunction::Standard), the directory functionality should // create all ancestors (or components) of a directory @@ -404,15 +414,15 @@ fn directory(paths: &[String], b: &Behavior) -> UResult<()> { // target directory. All created ancestor directories will have // the default mode. Hence it is safe to use fs::create_dir_all // and then only modify the target's dir mode. - if let Err(e) = - fs::create_dir_all(path).map_err_context(|| path.maybe_quote().to_string()) + if let Err(e) = fs::create_dir_all(path_to_create.as_path()) + .map_err_context(|| path_to_create.as_path().maybe_quote().to_string()) { show!(e); continue; } if b.verbose { - println!("creating directory {}", path.quote()); + println!("creating directory {}", path_to_create.quote()); } } diff --git a/tests/by-util/test_install.rs b/tests/by-util/test_install.rs index c4ed0d617f2..1cbbdfe1c3c 100644 --- a/tests/by-util/test_install.rs +++ b/tests/by-util/test_install.rs @@ -1124,3 +1124,27 @@ fn test_install_missing_destination() { file_1 )); } + +#[test] +fn test_install_dir_dot() { + // To match tests/install/d-slashdot.sh + let scene = TestScenario::new(util_name!()); + + scene.ucmd().arg("-d").arg("dir1/.").succeeds(); + scene.ucmd().arg("-d").arg("dir2/..").succeeds(); + // Tests that we don't have dir3/. in the output + // but only 'dir3' + scene + .ucmd() + .arg("-d") + .arg("dir3/.") + .arg("-v") + .succeeds() + .stdout_contains("creating directory 'dir3'"); + + let at = &scene.fixtures; + + assert!(at.dir_exists("dir1")); + assert!(at.dir_exists("dir2")); + assert!(at.dir_exists("dir3")); +} From 845b2294e1ec8f09a4022a63d895eecffa7607e3 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sat, 2 Apr 2022 13:10:28 +0200 Subject: [PATCH 028/242] create a function dir_strip_dot_for_creation to manage the /. issue --- src/uu/install/src/install.rs | 8 ++------ src/uucore/src/lib/features/fs.rs | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/uu/install/src/install.rs b/src/uu/install/src/install.rs index f50b7e81b92..330124467ac 100644 --- a/src/uu/install/src/install.rs +++ b/src/uu/install/src/install.rs @@ -20,6 +20,7 @@ use uucore::display::Quotable; use uucore::entries::{grp2gid, usr2uid}; use uucore::error::{FromIo, UError, UIoError, UResult, UUsageError}; use uucore::format_usage; +use uucore::fs::dir_strip_dot_for_creation; use uucore::mode::get_umask; use uucore::perms::{wrap_chown, Verbosity, VerbosityLevel}; @@ -399,12 +400,7 @@ fn directory(paths: &[String], b: &Behavior) -> UResult<()> { // install -d foo/. should work and just create foo/ // std::fs::create_dir("foo/."); fails in pure Rust // See also mkdir.rs for another occurrence of this - let path_to_create = if path.to_string_lossy().ends_with("/.") { - // Do a simple dance to strip the "/." - Path::new(path).components().collect::() - } else { - path.to_path_buf() - }; + let path_to_create = dir_strip_dot_for_creation(path.to_path_buf()); // Differently than the primary functionality // (MainFunction::Standard), the directory functionality should // create all ancestors (or components) of a directory diff --git a/src/uucore/src/lib/features/fs.rs b/src/uucore/src/lib/features/fs.rs index f5295f17ffb..1b7fb24b34d 100644 --- a/src/uucore/src/lib/features/fs.rs +++ b/src/uucore/src/lib/features/fs.rs @@ -470,6 +470,20 @@ pub fn display_permissions_unix(mode: mode_t, display_file_type: bool) -> String result } +// For some programs like install or mkdir, dir/. can be provided +// Special case to match GNU's behavior: +// install -d foo/. should work and just create foo/ +// std::fs::create_dir("foo/."); fails in pure Rust +// See also mkdir.rs for another occurrence of this +pub fn dir_strip_dot_for_creation(path: PathBuf) -> PathBuf { + if path.to_string_lossy().ends_with("/.") { + // Do a simple dance to strip the "/." + Path::new(&path).components().collect::() + } else { + path.to_path_buf() + } +} + #[cfg(test)] mod tests { // Note this useful idiom: importing names from outer (for mod tests) scope. From c00a277448d4527260403e5b75f320345594a289 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sat, 2 Apr 2022 13:14:09 +0200 Subject: [PATCH 029/242] mkdir: also use the dir_strip_dot_for_creation function --- src/uu/install/src/install.rs | 2 +- src/uu/mkdir/src/mkdir.rs | 7 +++---- src/uucore/src/lib/features/fs.rs | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/uu/install/src/install.rs b/src/uu/install/src/install.rs index 330124467ac..e3154aa5136 100644 --- a/src/uu/install/src/install.rs +++ b/src/uu/install/src/install.rs @@ -400,7 +400,7 @@ fn directory(paths: &[String], b: &Behavior) -> UResult<()> { // install -d foo/. should work and just create foo/ // std::fs::create_dir("foo/."); fails in pure Rust // See also mkdir.rs for another occurrence of this - let path_to_create = dir_strip_dot_for_creation(path.to_path_buf()); + let path_to_create = dir_strip_dot_for_creation(path); // Differently than the primary functionality // (MainFunction::Standard), the directory functionality should // create all ancestors (or components) of a directory diff --git a/src/uu/mkdir/src/mkdir.rs b/src/uu/mkdir/src/mkdir.rs index 35078d296be..7c8d4e4137f 100644 --- a/src/uu/mkdir/src/mkdir.rs +++ b/src/uu/mkdir/src/mkdir.rs @@ -12,12 +12,12 @@ extern crate uucore; use clap::{crate_version, Arg, ArgMatches, Command, OsValues}; use std::path::{Path, PathBuf}; -use uucore::display::Quotable; #[cfg(not(windows))] use uucore::error::FromIo; use uucore::error::{UResult, USimpleError}; #[cfg(not(windows))] use uucore::mode; +use uucore::{display::Quotable, fs::dir_strip_dot_for_creation}; use uucore::{format_usage, InvalidEncodingHandling}; static DEFAULT_PERM: u32 = 0o755; @@ -146,9 +146,8 @@ fn exec(dirs: OsValues, recursive: bool, mode: u32, verbose: bool) -> UResult<() // Special case to match GNU's behavior: // mkdir -p foo/. should work and just create foo/ // std::fs::create_dir("foo/."); fails in pure Rust - let path = if recursive && dir.to_string_lossy().ends_with("/.") { - // Do a simple dance to strip the "/." - Path::new(dir).components().collect::() + let path = if recursive { + dir_strip_dot_for_creation(&PathBuf::from(dir)) } else { // Normal case PathBuf::from(dir) diff --git a/src/uucore/src/lib/features/fs.rs b/src/uucore/src/lib/features/fs.rs index 1b7fb24b34d..5cd6d253df7 100644 --- a/src/uucore/src/lib/features/fs.rs +++ b/src/uucore/src/lib/features/fs.rs @@ -475,7 +475,7 @@ pub fn display_permissions_unix(mode: mode_t, display_file_type: bool) -> String // install -d foo/. should work and just create foo/ // std::fs::create_dir("foo/."); fails in pure Rust // See also mkdir.rs for another occurrence of this -pub fn dir_strip_dot_for_creation(path: PathBuf) -> PathBuf { +pub fn dir_strip_dot_for_creation(path: &Path) -> PathBuf { if path.to_string_lossy().ends_with("/.") { // Do a simple dance to strip the "/." Path::new(&path).components().collect::() From 74a348161ee232de89adeaaa8a9e6b5489f8a123 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sat, 2 Apr 2022 14:40:12 +0200 Subject: [PATCH 030/242] install: add tests to test with multiple directories to please @calixteman --- tests/by-util/test_install.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/by-util/test_install.rs b/tests/by-util/test_install.rs index 1cbbdfe1c3c..0c775d14537 100644 --- a/tests/by-util/test_install.rs +++ b/tests/by-util/test_install.rs @@ -1141,10 +1141,26 @@ fn test_install_dir_dot() { .arg("-v") .succeeds() .stdout_contains("creating directory 'dir3'"); + scene + .ucmd() + .arg("-d") + .arg("dir4/./cal") + .arg("-v") + .succeeds() + .stdout_contains("creating directory 'dir4/./cal'"); + scene + .ucmd() + .arg("-d") + .arg("dir5/./cali/.") + .arg("-v") + .succeeds() + .stdout_contains("creating directory 'dir5/cali'"); let at = &scene.fixtures; assert!(at.dir_exists("dir1")); assert!(at.dir_exists("dir2")); assert!(at.dir_exists("dir3")); + assert!(at.dir_exists("dir4/cal")); + assert!(at.dir_exists("dir5/cali")); } From 298f73f778e98a342caef9e8c3cc15fdbb354e86 Mon Sep 17 00:00:00 2001 From: ndd7xv Date: Sun, 20 Mar 2022 22:19:27 -0400 Subject: [PATCH 031/242] env: add program signal messages --- src/uu/env/Cargo.toml | 2 +- src/uu/env/src/env.rs | 36 +++++++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/uu/env/Cargo.toml b/src/uu/env/Cargo.toml index a0d8b21fcf7..ae30458a017 100644 --- a/src/uu/env/Cargo.toml +++ b/src/uu/env/Cargo.toml @@ -17,7 +17,7 @@ path = "src/env.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } rust-ini = "0.17.0" -uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } +uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["signals"]} [[bin]] name = "env" diff --git a/src/uu/env/src/env.rs b/src/uu/env/src/env.rs index b78b5f224c5..2ec0ce1c63c 100644 --- a/src/uu/env/src/env.rs +++ b/src/uu/env/src/env.rs @@ -22,10 +22,14 @@ use std::borrow::Cow; use std::env; use std::io::{self, Write}; use std::iter::Iterator; +#[cfg(unix)] +use std::os::unix::process::ExitStatusExt; use std::process; use uucore::display::Quotable; use uucore::error::{UResult, USimpleError, UUsageError}; use uucore::format_usage; +#[cfg(unix)] +use uucore::signals::signal_name_by_value; const USAGE: &str = "{} [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]"; const AFTER_HELP: &str = "\ @@ -308,7 +312,37 @@ fn run_env(args: impl uucore::Args) -> UResult<()> { * created. This is much simpler than dealing with the hassles of calling execvp directly. */ match process::Command::new(&*prog).args(args).status() { - Ok(exit) if !exit.success() => return Err(exit.code().unwrap().into()), + Ok(exit) if !exit.success() => { + #[cfg(unix)] + if let Some(exit_code) = exit.code() { + return Err(exit_code.into()); + } else { + // `exit.code()` returns `None` on Unix when the process is terminated by a signal. + // See std::os::unix::process::ExitStatusExt for more information. This prints out + // the interrupted process and the signal it received. + let signal_code = exit.signal().unwrap(); + eprintln!( + "\"{}\" terminated by signal {}", + { + let mut command = uucore::util_name().to_owned(); + command.push(' '); + command.push_str(&opts.program.join(" ")); + command + }, + signal_name_by_value(signal_code as usize).map_or_else( + || String::from("UNKNOWN"), + |signal| { + let mut full_signal_name = String::from("SIG"); + full_signal_name.push_str(signal); + full_signal_name + } + ) + ); + return Err((128 + signal_code).into()); + } + #[cfg(not(unix))] + return Err(exit.code().unwrap().into()); + } Err(ref err) if err.kind() == io::ErrorKind::NotFound => return Err(127.into()), Err(_) => return Err(126.into()), Ok(_) => (), From cf722d7f0cafadf5193b1b94ec662c0c2cd51e95 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Mon, 4 Apr 2022 22:55:36 +0200 Subject: [PATCH 032/242] tty: should not return 2 when --help is used This is impacting gnu/tests/misc/usage_vs_getopt.sh --- src/uu/tty/src/tty.rs | 6 ++---- tests/by-util/test_tty.rs | 5 +++++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/uu/tty/src/tty.rs b/src/uu/tty/src/tty.rs index b13b61784a3..4ae5ad00733 100644 --- a/src/uu/tty/src/tty.rs +++ b/src/uu/tty/src/tty.rs @@ -12,7 +12,7 @@ use clap::{crate_version, Arg, Command}; use std::ffi::CStr; use std::io::Write; -use uucore::error::{UResult, UUsageError}; +use uucore::error::UResult; use uucore::{format_usage, InvalidEncodingHandling}; static ABOUT: &str = "Print the file name of the terminal connected to standard input."; @@ -28,9 +28,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { .collect_str(InvalidEncodingHandling::ConvertLossy) .accept_any(); - let matches = uu_app() - .try_get_matches_from(args) - .map_err(|e| UUsageError::new(2, format!("{}", e)))?; + let matches = uu_app().get_matches_from(args); let silent = matches.is_present(options::SILENT); diff --git a/tests/by-util/test_tty.rs b/tests/by-util/test_tty.rs index ed490e7ab7f..09340d39cb4 100644 --- a/tests/by-util/test_tty.rs +++ b/tests/by-util/test_tty.rs @@ -64,6 +64,11 @@ fn test_wrong_argument() { new_ucmd!().args(&["a"]).fails().code_is(2); } +#[test] +fn test_help() { + new_ucmd!().args(&["--help"]).succeeds(); +} + #[test] // FixME: freebsd panic #[cfg(all(unix, not(target_os = "freebsd")))] From af9f718936e38a31fe3ba1fa65eb49d1d9328a8c Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Fri, 1 Apr 2022 19:03:15 +0200 Subject: [PATCH 033/242] Change edition to 2021 --- Cargo.toml | 2 +- src/uu/arch/Cargo.toml | 2 +- src/uu/base32/Cargo.toml | 2 +- src/uu/base64/Cargo.toml | 2 +- src/uu/basename/Cargo.toml | 2 +- src/uu/basenc/Cargo.toml | 2 +- src/uu/cat/Cargo.toml | 2 +- src/uu/chcon/Cargo.toml | 2 +- src/uu/chgrp/Cargo.toml | 2 +- src/uu/chmod/Cargo.toml | 2 +- src/uu/chown/Cargo.toml | 2 +- src/uu/chroot/Cargo.toml | 2 +- src/uu/cksum/Cargo.toml | 2 +- src/uu/comm/Cargo.toml | 2 +- src/uu/cp/Cargo.toml | 2 +- src/uu/csplit/Cargo.toml | 2 +- src/uu/cut/Cargo.toml | 2 +- src/uu/date/Cargo.toml | 2 +- src/uu/dd/Cargo.toml | 2 +- src/uu/df/Cargo.toml | 2 +- src/uu/dircolors/Cargo.toml | 2 +- src/uu/dirname/Cargo.toml | 2 +- src/uu/du/Cargo.toml | 2 +- src/uu/echo/Cargo.toml | 2 +- src/uu/env/Cargo.toml | 2 +- src/uu/expand/Cargo.toml | 2 +- src/uu/expr/Cargo.toml | 2 +- src/uu/factor/Cargo.toml | 2 +- src/uu/false/Cargo.toml | 2 +- src/uu/fmt/Cargo.toml | 2 +- src/uu/fold/Cargo.toml | 2 +- src/uu/groups/Cargo.toml | 2 +- src/uu/hashsum/Cargo.toml | 2 +- src/uu/head/Cargo.toml | 2 +- src/uu/hostid/Cargo.toml | 2 +- src/uu/hostname/Cargo.toml | 2 +- src/uu/id/Cargo.toml | 2 +- src/uu/install/Cargo.toml | 2 +- src/uu/join/Cargo.toml | 2 +- src/uu/kill/Cargo.toml | 2 +- src/uu/link/Cargo.toml | 2 +- src/uu/ln/Cargo.toml | 2 +- src/uu/logname/Cargo.toml | 2 +- src/uu/ls/Cargo.toml | 2 +- src/uu/mkdir/Cargo.toml | 2 +- src/uu/mkfifo/Cargo.toml | 2 +- src/uu/mknod/Cargo.toml | 2 +- src/uu/mktemp/Cargo.toml | 2 +- src/uu/more/Cargo.toml | 2 +- src/uu/mv/Cargo.toml | 2 +- src/uu/nice/Cargo.toml | 2 +- src/uu/nl/Cargo.toml | 2 +- src/uu/nohup/Cargo.toml | 2 +- src/uu/nproc/Cargo.toml | 2 +- src/uu/numfmt/Cargo.toml | 2 +- src/uu/od/Cargo.toml | 2 +- src/uu/paste/Cargo.toml | 2 +- src/uu/pathchk/Cargo.toml | 2 +- src/uu/pinky/Cargo.toml | 2 +- src/uu/pr/Cargo.toml | 2 +- src/uu/printenv/Cargo.toml | 2 +- src/uu/printf/Cargo.toml | 2 +- src/uu/ptx/Cargo.toml | 2 +- src/uu/pwd/Cargo.toml | 2 +- src/uu/readlink/Cargo.toml | 2 +- src/uu/realpath/Cargo.toml | 2 +- src/uu/relpath/Cargo.toml | 2 +- src/uu/rm/Cargo.toml | 2 +- src/uu/rmdir/Cargo.toml | 2 +- src/uu/runcon/Cargo.toml | 2 +- src/uu/seq/Cargo.toml | 2 +- src/uu/shred/Cargo.toml | 2 +- src/uu/shuf/Cargo.toml | 2 +- src/uu/sleep/Cargo.toml | 2 +- src/uu/sort/Cargo.toml | 2 +- src/uu/split/Cargo.toml | 2 +- src/uu/stat/Cargo.toml | 2 +- src/uu/stdbuf/Cargo.toml | 2 +- src/uu/stdbuf/src/libstdbuf/Cargo.toml | 2 +- src/uu/sum/Cargo.toml | 2 +- src/uu/sync/Cargo.toml | 2 +- src/uu/tac/Cargo.toml | 2 +- src/uu/tail/Cargo.toml | 2 +- src/uu/tee/Cargo.toml | 2 +- src/uu/test/Cargo.toml | 2 +- src/uu/timeout/Cargo.toml | 2 +- src/uu/touch/Cargo.toml | 2 +- src/uu/tr/Cargo.toml | 2 +- src/uu/true/Cargo.toml | 2 +- src/uu/truncate/Cargo.toml | 2 +- src/uu/tsort/Cargo.toml | 2 +- src/uu/tty/Cargo.toml | 2 +- src/uu/uname/Cargo.toml | 2 +- src/uu/unexpand/Cargo.toml | 2 +- src/uu/uniq/Cargo.toml | 2 +- src/uu/unlink/Cargo.toml | 2 +- src/uu/uptime/Cargo.toml | 2 +- src/uu/users/Cargo.toml | 2 +- src/uu/wc/Cargo.toml | 2 +- src/uu/who/Cargo.toml | 2 +- src/uu/whoami/Cargo.toml | 2 +- src/uu/yes/Cargo.toml | 2 +- src/uucore/Cargo.toml | 2 +- src/uucore_procs/Cargo.toml | 2 +- tests/benches/factor/Cargo.toml | 2 +- 105 files changed, 105 insertions(+), 105 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 377f466ebc2..c2737d475da 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,7 @@ repository = "https://github.com/uutils/coreutils" readme = "README.md" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" build = "build.rs" diff --git a/src/uu/arch/Cargo.toml b/src/uu/arch/Cargo.toml index 588520fa317..d57e747aa4e 100644 --- a/src/uu/arch/Cargo.toml +++ b/src/uu/arch/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/arch" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/arch.rs" diff --git a/src/uu/base32/Cargo.toml b/src/uu/base32/Cargo.toml index c5d54133ecf..ede70e70d88 100644 --- a/src/uu/base32/Cargo.toml +++ b/src/uu/base32/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/base32" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/base32.rs" diff --git a/src/uu/base64/Cargo.toml b/src/uu/base64/Cargo.toml index 0169ee77bdf..9569467dc13 100644 --- a/src/uu/base64/Cargo.toml +++ b/src/uu/base64/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/base64" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/base64.rs" diff --git a/src/uu/basename/Cargo.toml b/src/uu/basename/Cargo.toml index 226f61b203f..51780516488 100644 --- a/src/uu/basename/Cargo.toml +++ b/src/uu/basename/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/basename" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/basename.rs" diff --git a/src/uu/basenc/Cargo.toml b/src/uu/basenc/Cargo.toml index 4242e03916c..1eeddbfae03 100644 --- a/src/uu/basenc/Cargo.toml +++ b/src/uu/basenc/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/basenc" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/basenc.rs" diff --git a/src/uu/cat/Cargo.toml b/src/uu/cat/Cargo.toml index f7684649186..ddf129bdbc8 100644 --- a/src/uu/cat/Cargo.toml +++ b/src/uu/cat/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/cat" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/cat.rs" diff --git a/src/uu/chcon/Cargo.toml b/src/uu/chcon/Cargo.toml index 092f7702e9d..62283c6af5d 100644 --- a/src/uu/chcon/Cargo.toml +++ b/src/uu/chcon/Cargo.toml @@ -8,7 +8,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/chcon" keywords = ["coreutils", "uutils", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/chcon.rs" diff --git a/src/uu/chgrp/Cargo.toml b/src/uu/chgrp/Cargo.toml index 952c83e542f..e270069cf41 100644 --- a/src/uu/chgrp/Cargo.toml +++ b/src/uu/chgrp/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/chgrp" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/chgrp.rs" diff --git a/src/uu/chmod/Cargo.toml b/src/uu/chmod/Cargo.toml index 844c655444f..66ba427360d 100644 --- a/src/uu/chmod/Cargo.toml +++ b/src/uu/chmod/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/chmod" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/chmod.rs" diff --git a/src/uu/chown/Cargo.toml b/src/uu/chown/Cargo.toml index 7db67752c74..c0162f12a51 100644 --- a/src/uu/chown/Cargo.toml +++ b/src/uu/chown/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/chown" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/chown.rs" diff --git a/src/uu/chroot/Cargo.toml b/src/uu/chroot/Cargo.toml index 8976f825623..db766970421 100644 --- a/src/uu/chroot/Cargo.toml +++ b/src/uu/chroot/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/chroot" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/chroot.rs" diff --git a/src/uu/cksum/Cargo.toml b/src/uu/cksum/Cargo.toml index 50fdccf8892..e694c7c38b7 100644 --- a/src/uu/cksum/Cargo.toml +++ b/src/uu/cksum/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/cksum" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/cksum.rs" diff --git a/src/uu/comm/Cargo.toml b/src/uu/comm/Cargo.toml index a6de62a58f8..b4f1a96ceec 100644 --- a/src/uu/comm/Cargo.toml +++ b/src/uu/comm/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/comm" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/comm.rs" diff --git a/src/uu/cp/Cargo.toml b/src/uu/cp/Cargo.toml index 452e1e8cf73..b60006df1dd 100644 --- a/src/uu/cp/Cargo.toml +++ b/src/uu/cp/Cargo.toml @@ -13,7 +13,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/cp" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/cp.rs" diff --git a/src/uu/csplit/Cargo.toml b/src/uu/csplit/Cargo.toml index 5c9ae227add..bb263ec49c6 100644 --- a/src/uu/csplit/Cargo.toml +++ b/src/uu/csplit/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/ls" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/csplit.rs" diff --git a/src/uu/cut/Cargo.toml b/src/uu/cut/Cargo.toml index 3f800a78649..65ba2c41685 100644 --- a/src/uu/cut/Cargo.toml +++ b/src/uu/cut/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/cut" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/cut.rs" diff --git a/src/uu/date/Cargo.toml b/src/uu/date/Cargo.toml index a73a04d1b67..cf723279f8a 100644 --- a/src/uu/date/Cargo.toml +++ b/src/uu/date/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/date" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/date.rs" diff --git a/src/uu/dd/Cargo.toml b/src/uu/dd/Cargo.toml index da2d4318479..d311c97336c 100644 --- a/src/uu/dd/Cargo.toml +++ b/src/uu/dd/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/dd" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/dd.rs" diff --git a/src/uu/df/Cargo.toml b/src/uu/df/Cargo.toml index 0490621ca5c..c6a1c570bbd 100644 --- a/src/uu/df/Cargo.toml +++ b/src/uu/df/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/df" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/df.rs" diff --git a/src/uu/dircolors/Cargo.toml b/src/uu/dircolors/Cargo.toml index 533793b6334..b5fe79b4782 100644 --- a/src/uu/dircolors/Cargo.toml +++ b/src/uu/dircolors/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/dircolors" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/dircolors.rs" diff --git a/src/uu/dirname/Cargo.toml b/src/uu/dirname/Cargo.toml index cede0c6b1a0..6e4c2f9f53c 100644 --- a/src/uu/dirname/Cargo.toml +++ b/src/uu/dirname/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/dirname" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/dirname.rs" diff --git a/src/uu/du/Cargo.toml b/src/uu/du/Cargo.toml index c0c64f2e774..9da4be090fe 100644 --- a/src/uu/du/Cargo.toml +++ b/src/uu/du/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/du" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/du.rs" diff --git a/src/uu/echo/Cargo.toml b/src/uu/echo/Cargo.toml index 9fde0ce35d5..374aa48813b 100644 --- a/src/uu/echo/Cargo.toml +++ b/src/uu/echo/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/echo" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/echo.rs" diff --git a/src/uu/env/Cargo.toml b/src/uu/env/Cargo.toml index ae30458a017..e7f1df1592a 100644 --- a/src/uu/env/Cargo.toml +++ b/src/uu/env/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/env" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/env.rs" diff --git a/src/uu/expand/Cargo.toml b/src/uu/expand/Cargo.toml index aba67d6c72f..9e21585e841 100644 --- a/src/uu/expand/Cargo.toml +++ b/src/uu/expand/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/expand" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/expand.rs" diff --git a/src/uu/expr/Cargo.toml b/src/uu/expr/Cargo.toml index 79107069f61..c4a1bae4a80 100644 --- a/src/uu/expr/Cargo.toml +++ b/src/uu/expr/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/expr" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/expr.rs" diff --git a/src/uu/factor/Cargo.toml b/src/uu/factor/Cargo.toml index b1d2d956032..e1620ed907d 100644 --- a/src/uu/factor/Cargo.toml +++ b/src/uu/factor/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [build-dependencies] num-traits = "0.2.13" # used in src/numerics.rs, which is included by build.rs diff --git a/src/uu/false/Cargo.toml b/src/uu/false/Cargo.toml index 3a4c7cc4e2c..26c2762b523 100644 --- a/src/uu/false/Cargo.toml +++ b/src/uu/false/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/false" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/false.rs" diff --git a/src/uu/fmt/Cargo.toml b/src/uu/fmt/Cargo.toml index 714b75ffe9c..6a85f1c667a 100644 --- a/src/uu/fmt/Cargo.toml +++ b/src/uu/fmt/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/fmt" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/fmt.rs" diff --git a/src/uu/fold/Cargo.toml b/src/uu/fold/Cargo.toml index 0ac9a000668..67cc74ec9ff 100644 --- a/src/uu/fold/Cargo.toml +++ b/src/uu/fold/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/fold" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/fold.rs" diff --git a/src/uu/groups/Cargo.toml b/src/uu/groups/Cargo.toml index 0eee2a96088..e1effbb235c 100644 --- a/src/uu/groups/Cargo.toml +++ b/src/uu/groups/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/groups" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/groups.rs" diff --git a/src/uu/hashsum/Cargo.toml b/src/uu/hashsum/Cargo.toml index 6b0181629fa..f23a3068f93 100644 --- a/src/uu/hashsum/Cargo.toml +++ b/src/uu/hashsum/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/hashsum" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/hashsum.rs" diff --git a/src/uu/head/Cargo.toml b/src/uu/head/Cargo.toml index 9159296d282..d02aaa9e072 100644 --- a/src/uu/head/Cargo.toml +++ b/src/uu/head/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/head" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/head.rs" diff --git a/src/uu/hostid/Cargo.toml b/src/uu/hostid/Cargo.toml index 6449684f6f0..f9c2555d443 100644 --- a/src/uu/hostid/Cargo.toml +++ b/src/uu/hostid/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/hostid" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/hostid.rs" diff --git a/src/uu/hostname/Cargo.toml b/src/uu/hostname/Cargo.toml index 0ff8f2f4dd3..d0c1234b64c 100644 --- a/src/uu/hostname/Cargo.toml +++ b/src/uu/hostname/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/hostname" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/hostname.rs" diff --git a/src/uu/id/Cargo.toml b/src/uu/id/Cargo.toml index 332ba9ca64b..de18a826912 100644 --- a/src/uu/id/Cargo.toml +++ b/src/uu/id/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/id" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/id.rs" diff --git a/src/uu/install/Cargo.toml b/src/uu/install/Cargo.toml index f82c6de3451..009005a4cbf 100644 --- a/src/uu/install/Cargo.toml +++ b/src/uu/install/Cargo.toml @@ -12,7 +12,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/install" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/install.rs" diff --git a/src/uu/join/Cargo.toml b/src/uu/join/Cargo.toml index c4d8cb57c63..1a28689a8d3 100644 --- a/src/uu/join/Cargo.toml +++ b/src/uu/join/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/join" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/join.rs" diff --git a/src/uu/kill/Cargo.toml b/src/uu/kill/Cargo.toml index 9eea3172bc4..561209eb374 100644 --- a/src/uu/kill/Cargo.toml +++ b/src/uu/kill/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/kill" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/kill.rs" diff --git a/src/uu/link/Cargo.toml b/src/uu/link/Cargo.toml index caec3e2a653..6cc51462e79 100644 --- a/src/uu/link/Cargo.toml +++ b/src/uu/link/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/link" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/link.rs" diff --git a/src/uu/ln/Cargo.toml b/src/uu/ln/Cargo.toml index 9fd6b3d12e6..453222df845 100644 --- a/src/uu/ln/Cargo.toml +++ b/src/uu/ln/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/ln" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/ln.rs" diff --git a/src/uu/logname/Cargo.toml b/src/uu/logname/Cargo.toml index d800d41b0a4..34ca9355a82 100644 --- a/src/uu/logname/Cargo.toml +++ b/src/uu/logname/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/logname" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/logname.rs" diff --git a/src/uu/ls/Cargo.toml b/src/uu/ls/Cargo.toml index d082c8260bd..d7b1d47bd8a 100644 --- a/src/uu/ls/Cargo.toml +++ b/src/uu/ls/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/ls" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/ls.rs" diff --git a/src/uu/mkdir/Cargo.toml b/src/uu/mkdir/Cargo.toml index 08b2f1aff14..11210d0ce26 100644 --- a/src/uu/mkdir/Cargo.toml +++ b/src/uu/mkdir/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/mkdir" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/mkdir.rs" diff --git a/src/uu/mkfifo/Cargo.toml b/src/uu/mkfifo/Cargo.toml index 1c16043ae8c..bb2ced83e5e 100644 --- a/src/uu/mkfifo/Cargo.toml +++ b/src/uu/mkfifo/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/mkfifo" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/mkfifo.rs" diff --git a/src/uu/mknod/Cargo.toml b/src/uu/mknod/Cargo.toml index 68de0443b7e..2f9a5cea00e 100644 --- a/src/uu/mknod/Cargo.toml +++ b/src/uu/mknod/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/mknod" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] name = "uu_mknod" diff --git a/src/uu/mktemp/Cargo.toml b/src/uu/mktemp/Cargo.toml index 19af4f20efb..c0c3366dcc6 100644 --- a/src/uu/mktemp/Cargo.toml +++ b/src/uu/mktemp/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/mktemp" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/mktemp.rs" diff --git a/src/uu/more/Cargo.toml b/src/uu/more/Cargo.toml index 230276938f7..9cc69f3c5df 100644 --- a/src/uu/more/Cargo.toml +++ b/src/uu/more/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/more" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/more.rs" diff --git a/src/uu/mv/Cargo.toml b/src/uu/mv/Cargo.toml index 861d96c7ffa..da1b8efe6e7 100644 --- a/src/uu/mv/Cargo.toml +++ b/src/uu/mv/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/mv" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/mv.rs" diff --git a/src/uu/nice/Cargo.toml b/src/uu/nice/Cargo.toml index 37d88e8a8be..eeec708af4d 100644 --- a/src/uu/nice/Cargo.toml +++ b/src/uu/nice/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/nice" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/nice.rs" diff --git a/src/uu/nl/Cargo.toml b/src/uu/nl/Cargo.toml index 8901cf34ae7..397cc3861f2 100644 --- a/src/uu/nl/Cargo.toml +++ b/src/uu/nl/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/nl" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/nl.rs" diff --git a/src/uu/nohup/Cargo.toml b/src/uu/nohup/Cargo.toml index fd2b5e82d8b..fb2aed6348e 100644 --- a/src/uu/nohup/Cargo.toml +++ b/src/uu/nohup/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/nohup" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/nohup.rs" diff --git a/src/uu/nproc/Cargo.toml b/src/uu/nproc/Cargo.toml index c44c9883da9..7980f5c2ad3 100644 --- a/src/uu/nproc/Cargo.toml +++ b/src/uu/nproc/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/nproc" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/nproc.rs" diff --git a/src/uu/numfmt/Cargo.toml b/src/uu/numfmt/Cargo.toml index 216503aae99..c59924f1f25 100644 --- a/src/uu/numfmt/Cargo.toml +++ b/src/uu/numfmt/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/numfmt" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/numfmt.rs" diff --git a/src/uu/od/Cargo.toml b/src/uu/od/Cargo.toml index d6cb3235d73..a0a983f4883 100644 --- a/src/uu/od/Cargo.toml +++ b/src/uu/od/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/od" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/od.rs" diff --git a/src/uu/paste/Cargo.toml b/src/uu/paste/Cargo.toml index e741c1485b1..a07d32af8d1 100644 --- a/src/uu/paste/Cargo.toml +++ b/src/uu/paste/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/paste" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/paste.rs" diff --git a/src/uu/pathchk/Cargo.toml b/src/uu/pathchk/Cargo.toml index 88417a5a14f..09a14e0a692 100644 --- a/src/uu/pathchk/Cargo.toml +++ b/src/uu/pathchk/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/pathchk" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/pathchk.rs" diff --git a/src/uu/pinky/Cargo.toml b/src/uu/pinky/Cargo.toml index a4562562f70..2dab3449199 100644 --- a/src/uu/pinky/Cargo.toml +++ b/src/uu/pinky/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/pinky" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/pinky.rs" diff --git a/src/uu/pr/Cargo.toml b/src/uu/pr/Cargo.toml index 7ed902cb0e0..f2ded14b4f7 100644 --- a/src/uu/pr/Cargo.toml +++ b/src/uu/pr/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/pr" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/pr.rs" diff --git a/src/uu/printenv/Cargo.toml b/src/uu/printenv/Cargo.toml index 7c708602dd7..a44a5a5c131 100644 --- a/src/uu/printenv/Cargo.toml +++ b/src/uu/printenv/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/printenv" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/printenv.rs" diff --git a/src/uu/printf/Cargo.toml b/src/uu/printf/Cargo.toml index 02167bcbb76..c2326308598 100644 --- a/src/uu/printf/Cargo.toml +++ b/src/uu/printf/Cargo.toml @@ -12,7 +12,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/printf" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/printf.rs" diff --git a/src/uu/ptx/Cargo.toml b/src/uu/ptx/Cargo.toml index 73f4bad1670..d1058d78b18 100644 --- a/src/uu/ptx/Cargo.toml +++ b/src/uu/ptx/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/ptx" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/ptx.rs" diff --git a/src/uu/pwd/Cargo.toml b/src/uu/pwd/Cargo.toml index d045d617912..3d993bd7024 100644 --- a/src/uu/pwd/Cargo.toml +++ b/src/uu/pwd/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/pwd" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/pwd.rs" diff --git a/src/uu/readlink/Cargo.toml b/src/uu/readlink/Cargo.toml index 5a2e420043d..0d02d5115a5 100644 --- a/src/uu/readlink/Cargo.toml +++ b/src/uu/readlink/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/readlink" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/readlink.rs" diff --git a/src/uu/realpath/Cargo.toml b/src/uu/realpath/Cargo.toml index 77d8ccacb4d..d19eea0dccb 100644 --- a/src/uu/realpath/Cargo.toml +++ b/src/uu/realpath/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/realpath" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/realpath.rs" diff --git a/src/uu/relpath/Cargo.toml b/src/uu/relpath/Cargo.toml index 4ac8ca0cde8..2954ac0e833 100644 --- a/src/uu/relpath/Cargo.toml +++ b/src/uu/relpath/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/relpath" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/relpath.rs" diff --git a/src/uu/rm/Cargo.toml b/src/uu/rm/Cargo.toml index adef3eeab8a..630f3a294fe 100644 --- a/src/uu/rm/Cargo.toml +++ b/src/uu/rm/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/rm" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/rm.rs" diff --git a/src/uu/rmdir/Cargo.toml b/src/uu/rmdir/Cargo.toml index 34ad368195c..5a6ccee6dc6 100644 --- a/src/uu/rmdir/Cargo.toml +++ b/src/uu/rmdir/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/rmdir" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/rmdir.rs" diff --git a/src/uu/runcon/Cargo.toml b/src/uu/runcon/Cargo.toml index 4cce3c50427..30406d82044 100644 --- a/src/uu/runcon/Cargo.toml +++ b/src/uu/runcon/Cargo.toml @@ -8,7 +8,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/runcon" keywords = ["coreutils", "uutils", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/runcon.rs" diff --git a/src/uu/seq/Cargo.toml b/src/uu/seq/Cargo.toml index b6573a792ef..ad8bba5b645 100644 --- a/src/uu/seq/Cargo.toml +++ b/src/uu/seq/Cargo.toml @@ -10,7 +10,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/seq" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/seq.rs" diff --git a/src/uu/shred/Cargo.toml b/src/uu/shred/Cargo.toml index 6f92de22a6f..658abf598ff 100644 --- a/src/uu/shred/Cargo.toml +++ b/src/uu/shred/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/shred" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/shred.rs" diff --git a/src/uu/shuf/Cargo.toml b/src/uu/shuf/Cargo.toml index 61326e985da..26577d0d551 100644 --- a/src/uu/shuf/Cargo.toml +++ b/src/uu/shuf/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/shuf" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/shuf.rs" diff --git a/src/uu/sleep/Cargo.toml b/src/uu/sleep/Cargo.toml index 0542b3ec8cb..bf1a4a5c538 100644 --- a/src/uu/sleep/Cargo.toml +++ b/src/uu/sleep/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/sleep" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/sleep.rs" diff --git a/src/uu/sort/Cargo.toml b/src/uu/sort/Cargo.toml index 4523c0748a8..69f7f746871 100644 --- a/src/uu/sort/Cargo.toml +++ b/src/uu/sort/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/sort" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/sort.rs" diff --git a/src/uu/split/Cargo.toml b/src/uu/split/Cargo.toml index 31677462152..75e080dfd74 100644 --- a/src/uu/split/Cargo.toml +++ b/src/uu/split/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/split" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/split.rs" diff --git a/src/uu/stat/Cargo.toml b/src/uu/stat/Cargo.toml index 23087e2df71..28ca9c51b26 100644 --- a/src/uu/stat/Cargo.toml +++ b/src/uu/stat/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/stat" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/stat.rs" diff --git a/src/uu/stdbuf/Cargo.toml b/src/uu/stdbuf/Cargo.toml index 98cdadf9fc7..4e6ea21eb42 100644 --- a/src/uu/stdbuf/Cargo.toml +++ b/src/uu/stdbuf/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/stdbuf" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/stdbuf.rs" diff --git a/src/uu/stdbuf/src/libstdbuf/Cargo.toml b/src/uu/stdbuf/src/libstdbuf/Cargo.toml index 72c6b3e03a4..aacfe852452 100644 --- a/src/uu/stdbuf/src/libstdbuf/Cargo.toml +++ b/src/uu/stdbuf/src/libstdbuf/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/stdbuf" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] name = "libstdbuf" diff --git a/src/uu/sum/Cargo.toml b/src/uu/sum/Cargo.toml index dab6605745e..7e7894769b8 100644 --- a/src/uu/sum/Cargo.toml +++ b/src/uu/sum/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/sum" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/sum.rs" diff --git a/src/uu/sync/Cargo.toml b/src/uu/sync/Cargo.toml index 01400448afa..a4d66aff541 100644 --- a/src/uu/sync/Cargo.toml +++ b/src/uu/sync/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/sync" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/sync.rs" diff --git a/src/uu/tac/Cargo.toml b/src/uu/tac/Cargo.toml index b63790a9f8d..b6c5d62b809 100644 --- a/src/uu/tac/Cargo.toml +++ b/src/uu/tac/Cargo.toml @@ -11,7 +11,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/tac" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/tac.rs" diff --git a/src/uu/tail/Cargo.toml b/src/uu/tail/Cargo.toml index aae0a3f7dee..0df4e2d78df 100644 --- a/src/uu/tail/Cargo.toml +++ b/src/uu/tail/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/tail" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/tail.rs" diff --git a/src/uu/tee/Cargo.toml b/src/uu/tee/Cargo.toml index 1fd255fcf6f..80af45ea6a8 100644 --- a/src/uu/tee/Cargo.toml +++ b/src/uu/tee/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/tee" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/tee.rs" diff --git a/src/uu/test/Cargo.toml b/src/uu/test/Cargo.toml index 002eda823af..6e2f4f78935 100644 --- a/src/uu/test/Cargo.toml +++ b/src/uu/test/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/test" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/test.rs" diff --git a/src/uu/timeout/Cargo.toml b/src/uu/timeout/Cargo.toml index fa515913ca0..930185320ed 100644 --- a/src/uu/timeout/Cargo.toml +++ b/src/uu/timeout/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/timeout" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/timeout.rs" diff --git a/src/uu/touch/Cargo.toml b/src/uu/touch/Cargo.toml index 521c4c151b8..646b65f50e0 100644 --- a/src/uu/touch/Cargo.toml +++ b/src/uu/touch/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/touch" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/touch.rs" diff --git a/src/uu/tr/Cargo.toml b/src/uu/tr/Cargo.toml index cabf7455605..1bfb4becc11 100644 --- a/src/uu/tr/Cargo.toml +++ b/src/uu/tr/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/tr" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/tr.rs" diff --git a/src/uu/true/Cargo.toml b/src/uu/true/Cargo.toml index bd3bda2bac1..bb35c63f5df 100644 --- a/src/uu/true/Cargo.toml +++ b/src/uu/true/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/true" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/true.rs" diff --git a/src/uu/truncate/Cargo.toml b/src/uu/truncate/Cargo.toml index 348b1498f43..3defee473ef 100644 --- a/src/uu/truncate/Cargo.toml +++ b/src/uu/truncate/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/truncate" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/truncate.rs" diff --git a/src/uu/tsort/Cargo.toml b/src/uu/tsort/Cargo.toml index 61fe36903eb..e9d236247fa 100644 --- a/src/uu/tsort/Cargo.toml +++ b/src/uu/tsort/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/tsort" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/tsort.rs" diff --git a/src/uu/tty/Cargo.toml b/src/uu/tty/Cargo.toml index d99a8e7626a..c27309008be 100644 --- a/src/uu/tty/Cargo.toml +++ b/src/uu/tty/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/tty" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/tty.rs" diff --git a/src/uu/uname/Cargo.toml b/src/uu/uname/Cargo.toml index 8717d210fe5..66b9a3eb846 100644 --- a/src/uu/uname/Cargo.toml +++ b/src/uu/uname/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/uname" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/uname.rs" diff --git a/src/uu/unexpand/Cargo.toml b/src/uu/unexpand/Cargo.toml index 6a9c81864e6..beee39dafe7 100644 --- a/src/uu/unexpand/Cargo.toml +++ b/src/uu/unexpand/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/unexpand" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/unexpand.rs" diff --git a/src/uu/uniq/Cargo.toml b/src/uu/uniq/Cargo.toml index 2d72e617779..1d534140bdb 100644 --- a/src/uu/uniq/Cargo.toml +++ b/src/uu/uniq/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/uniq" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/uniq.rs" diff --git a/src/uu/unlink/Cargo.toml b/src/uu/unlink/Cargo.toml index 7342fa5b410..75cba4472df 100644 --- a/src/uu/unlink/Cargo.toml +++ b/src/uu/unlink/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/unlink" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/unlink.rs" diff --git a/src/uu/uptime/Cargo.toml b/src/uu/uptime/Cargo.toml index b199fb24a8b..f08cb4d11e3 100644 --- a/src/uu/uptime/Cargo.toml +++ b/src/uu/uptime/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/uptime" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/uptime.rs" diff --git a/src/uu/users/Cargo.toml b/src/uu/users/Cargo.toml index 3b660f304f3..2796a5a4601 100644 --- a/src/uu/users/Cargo.toml +++ b/src/uu/users/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/users" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/users.rs" diff --git a/src/uu/wc/Cargo.toml b/src/uu/wc/Cargo.toml index 02b009dde4f..d8b58938862 100644 --- a/src/uu/wc/Cargo.toml +++ b/src/uu/wc/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/wc" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/wc.rs" diff --git a/src/uu/who/Cargo.toml b/src/uu/who/Cargo.toml index aa9ba27d6d4..3e3ee496e73 100644 --- a/src/uu/who/Cargo.toml +++ b/src/uu/who/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/who" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/who.rs" diff --git a/src/uu/whoami/Cargo.toml b/src/uu/whoami/Cargo.toml index 67893b185d3..2400801a49a 100644 --- a/src/uu/whoami/Cargo.toml +++ b/src/uu/whoami/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/whoami" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/whoami.rs" diff --git a/src/uu/yes/Cargo.toml b/src/uu/yes/Cargo.toml index 91f6cfb3e78..d756f28f99e 100644 --- a/src/uu/yes/Cargo.toml +++ b/src/uu/yes/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://github.com/uutils/coreutils" repository = "https://github.com/uutils/coreutils/tree/main/src/uu/yes" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path = "src/yes.rs" diff --git a/src/uucore/Cargo.toml b/src/uucore/Cargo.toml index a326402c5b6..4a145481f39 100644 --- a/src/uucore/Cargo.toml +++ b/src/uucore/Cargo.toml @@ -10,7 +10,7 @@ repository = "https://github.com/uutils/coreutils/tree/main/src/uucore" # readme = "README.md" keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] categories = ["command-line-utilities"] -edition = "2018" +edition = "2021" [lib] path="src/lib/lib.rs" diff --git a/src/uucore_procs/Cargo.toml b/src/uucore_procs/Cargo.toml index 151c308cfd5..4547beb8cb7 100644 --- a/src/uucore_procs/Cargo.toml +++ b/src/uucore_procs/Cargo.toml @@ -10,7 +10,7 @@ repository = "https://github.com/uutils/coreutils/tree/main/src/uucore_procs" # readme = "README.md" keywords = ["cross-platform", "proc-macros", "uucore", "uutils"] # categories = ["os"] -edition = "2018" +edition = "2021" [lib] proc-macro = true diff --git a/tests/benches/factor/Cargo.toml b/tests/benches/factor/Cargo.toml index eb3d69105f1..efada4b00ee 100644 --- a/tests/benches/factor/Cargo.toml +++ b/tests/benches/factor/Cargo.toml @@ -5,7 +5,7 @@ authors = ["nicoo "] license = "MIT" description = "Benchmarks for the uu_factor integer factorization tool" homepage = "https://github.com/uutils/coreutils" -edition = "2018" +edition = "2021" [dependencies] uu_factor = { path = "../../../src/uu/factor" } From c6c936f52980b5707e9439de8ef0adeed9f16ed3 Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Fri, 1 Apr 2022 19:11:25 +0200 Subject: [PATCH 034/242] all: remove explicit imports of TryFrom and TryInto This is enabled by the changing the edition from 2018 to 2021 --- src/uu/dd/src/dd.rs | 1 - src/uu/head/src/head.rs | 1 - src/uu/od/src/od.rs | 1 - src/uu/seq/src/numberparse.rs | 1 - src/uu/sort/src/sort.rs | 1 - src/uu/split/src/split.rs | 1 - src/uu/stdbuf/src/stdbuf.rs | 1 - src/uu/tail/src/tail.rs | 1 - src/uucore/src/lib/features/entries.rs | 1 - src/uucore/src/lib/features/fs.rs | 2 -- src/uucore/src/lib/parser/parse_size.rs | 1 - tests/benches/factor/benches/table.rs | 1 - 12 files changed, 13 deletions(-) diff --git a/src/uu/dd/src/dd.rs b/src/uu/dd/src/dd.rs index 354e4b26110..3b9bb02d874 100644 --- a/src/uu/dd/src/dd.rs +++ b/src/uu/dd/src/dd.rs @@ -23,7 +23,6 @@ mod blocks; use blocks::conv_block_unblock_helper; use std::cmp; -use std::convert::TryInto; use std::env; use std::fs::{File, OpenOptions}; use std::io::{self, Read, Seek, Write}; diff --git a/src/uu/head/src/head.rs b/src/uu/head/src/head.rs index 1ddfc0492d3..b6d36a4ada4 100644 --- a/src/uu/head/src/head.rs +++ b/src/uu/head/src/head.rs @@ -6,7 +6,6 @@ // spell-checker:ignore (vars) zlines BUFWRITER seekable use clap::{crate_version, Arg, ArgMatches, Command}; -use std::convert::{TryFrom, TryInto}; use std::ffi::OsString; use std::io::{self, BufWriter, ErrorKind, Read, Seek, SeekFrom, Write}; use uucore::display::Quotable; diff --git a/src/uu/od/src/od.rs b/src/uu/od/src/od.rs index 81cfb94de19..33fac39d372 100644 --- a/src/uu/od/src/od.rs +++ b/src/uu/od/src/od.rs @@ -29,7 +29,6 @@ mod prn_float; mod prn_int; use std::cmp; -use std::convert::TryFrom; use crate::byteorder_io::*; use crate::formatteriteminfo::*; diff --git a/src/uu/seq/src/numberparse.rs b/src/uu/seq/src/numberparse.rs index 06f5534780f..c3f3656a8fc 100644 --- a/src/uu/seq/src/numberparse.rs +++ b/src/uu/seq/src/numberparse.rs @@ -3,7 +3,6 @@ //! //! This module provides an implementation of [`FromStr`] for the //! [`PreciseNumber`] struct. -use std::convert::TryInto; use std::str::FromStr; use bigdecimal::BigDecimal; diff --git a/src/uu/sort/src/sort.rs b/src/uu/sort/src/sort.rs index a1aa92a2bc7..5c153ebae19 100644 --- a/src/uu/sort/src/sort.rs +++ b/src/uu/sort/src/sort.rs @@ -33,7 +33,6 @@ use numeric_str_cmp::{human_numeric_str_cmp, numeric_str_cmp, NumInfo, NumInfoPa use rand::{thread_rng, Rng}; use rayon::prelude::*; use std::cmp::Ordering; -use std::convert::TryFrom; use std::env; use std::error::Error; use std::ffi::{OsStr, OsString}; diff --git a/src/uu/split/src/split.rs b/src/uu/split/src/split.rs index b64b928987d..c90c7a6b261 100644 --- a/src/uu/split/src/split.rs +++ b/src/uu/split/src/split.rs @@ -14,7 +14,6 @@ mod platform; use crate::filenames::FilenameIterator; use crate::filenames::SuffixType; use clap::{crate_version, Arg, ArgMatches, Command}; -use std::convert::TryInto; use std::env; use std::fmt; use std::fs::{metadata, File}; diff --git a/src/uu/stdbuf/src/stdbuf.rs b/src/uu/stdbuf/src/stdbuf.rs index 2eedb038bb8..5e0e7178978 100644 --- a/src/uu/stdbuf/src/stdbuf.rs +++ b/src/uu/stdbuf/src/stdbuf.rs @@ -11,7 +11,6 @@ extern crate uucore; use clap::{crate_version, Arg, ArgMatches, Command}; -use std::convert::{TryFrom, TryInto}; use std::fs::File; use std::io::{self, Write}; use std::os::unix::process::ExitStatusExt; diff --git a/src/uu/tail/src/tail.rs b/src/uu/tail/src/tail.rs index 6654a61fe9d..96b6daf79f6 100644 --- a/src/uu/tail/src/tail.rs +++ b/src/uu/tail/src/tail.rs @@ -22,7 +22,6 @@ use chunks::ReverseChunks; use clap::{Arg, Command}; use std::collections::VecDeque; -use std::convert::TryInto; use std::ffi::OsString; use std::fmt; use std::fs::{File, Metadata}; diff --git a/src/uucore/src/lib/features/entries.rs b/src/uucore/src/lib/features/entries.rs index 90f3134ab42..0366355d49a 100644 --- a/src/uucore/src/lib/features/entries.rs +++ b/src/uucore/src/lib/features/entries.rs @@ -41,7 +41,6 @@ use libc::{c_char, c_int, gid_t, uid_t}; use libc::{getgrgid, getgrnam, getgroups}; use libc::{getpwnam, getpwuid, group, passwd}; -use std::convert::TryInto; use std::ffi::{CStr, CString}; use std::io::Error as IOError; use std::io::ErrorKind; diff --git a/src/uucore/src/lib/features/fs.rs b/src/uucore/src/lib/features/fs.rs index 5cd6d253df7..3963d865c27 100644 --- a/src/uucore/src/lib/features/fs.rs +++ b/src/uucore/src/lib/features/fs.rs @@ -99,8 +99,6 @@ impl FileInformation { pub fn file_size(&self) -> u64 { #[cfg(unix)] { - use std::convert::TryInto; - assert!(self.0.st_size >= 0, "File size is negative"); self.0.st_size.try_into().unwrap() } diff --git a/src/uucore/src/lib/parser/parse_size.rs b/src/uucore/src/lib/parser/parse_size.rs index e68c04e5c13..28a898825bf 100644 --- a/src/uucore/src/lib/parser/parse_size.rs +++ b/src/uucore/src/lib/parser/parse_size.rs @@ -5,7 +5,6 @@ // spell-checker:ignore (ToDO) hdsf ghead gtail -use std::convert::TryFrom; use std::error::Error; use std::fmt; diff --git a/tests/benches/factor/benches/table.rs b/tests/benches/factor/benches/table.rs index 9090c7d515e..7f749a10ffb 100644 --- a/tests/benches/factor/benches/table.rs +++ b/tests/benches/factor/benches/table.rs @@ -1,6 +1,5 @@ use array_init::array_init; use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput}; -use std::convert::TryInto; use uu_factor::{table::*, Factors}; fn table(c: &mut Criterion) { From 18369dc0beb48f31d106361315a6f5e3f4032920 Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Sat, 2 Apr 2022 10:47:37 +0200 Subject: [PATCH 035/242] all: use array intoiterator --- src/uu/dd/src/parseargs/unit_tests.rs | 4 +-- src/uu/du/src/du.rs | 2 +- src/uu/sort/src/sort.rs | 2 +- tests/by-util/test_base32.rs | 10 +++--- tests/by-util/test_base64.rs | 10 +++--- tests/by-util/test_basename.rs | 10 +++--- tests/by-util/test_cat.rs | 28 ++++++++-------- tests/by-util/test_chcon.rs | 4 +-- tests/by-util/test_chgrp.rs | 8 ++--- tests/by-util/test_chmod.rs | 2 +- tests/by-util/test_comm.rs | 2 +- tests/by-util/test_cp.rs | 4 +-- tests/by-util/test_cut.rs | 12 +++---- tests/by-util/test_date.rs | 10 +++--- tests/by-util/test_dd.rs | 2 +- tests/by-util/test_env.rs | 2 +- tests/by-util/test_id.rs | 34 +++++++++---------- tests/by-util/test_ls.rs | 48 +++++++++++++-------------- tests/by-util/test_nl.rs | 2 +- tests/by-util/test_numfmt.rs | 2 +- tests/by-util/test_od.rs | 6 ++-- tests/by-util/test_paste.rs | 6 ++-- tests/by-util/test_pr.rs | 14 ++++---- tests/by-util/test_runcon.rs | 8 ++--- tests/by-util/test_sort.rs | 20 +++++------ tests/by-util/test_stat.rs | 2 +- tests/by-util/test_tail.rs | 2 +- tests/by-util/test_tee.rs | 2 +- tests/by-util/test_timeout.rs | 2 +- tests/by-util/test_touch.rs | 2 +- tests/by-util/test_wc.rs | 2 +- tests/by-util/test_who.rs | 24 +++++++------- tests/by-util/test_yes.rs | 2 +- 33 files changed, 145 insertions(+), 145 deletions(-) diff --git a/src/uu/dd/src/parseargs/unit_tests.rs b/src/uu/dd/src/parseargs/unit_tests.rs index 6a2ea5b54ac..95e783c58b2 100644 --- a/src/uu/dd/src/parseargs/unit_tests.rs +++ b/src/uu/dd/src/parseargs/unit_tests.rs @@ -10,7 +10,7 @@ fn unimplemented_flags_should_error_non_linux() { let mut succeeded = Vec::new(); // The following flags are only implemented in linux - for &flag in &[ + for flag in [ "direct", "directory", "dsync", @@ -47,7 +47,7 @@ fn unimplemented_flags_should_error() { let mut succeeded = Vec::new(); // The following flags are not implemented - for &flag in &["cio", "nocache", "nolinks", "text", "binary"] { + for flag in ["cio", "nocache", "nolinks", "text", "binary"] { let args = vec![ String::from("dd"), format!("--iflag={}", flag), diff --git a/src/uu/du/src/du.rs b/src/uu/du/src/du.rs index 0690c6299c8..5a2e3ada191 100644 --- a/src/uu/du/src/du.rs +++ b/src/uu/du/src/du.rs @@ -253,7 +253,7 @@ fn read_block_size(s: Option<&str>) -> u64 { parse_size(s) .unwrap_or_else(|e| crash!(1, "{}", format_error_message(&e, s, options::BLOCK_SIZE))) } else { - for env_var in &["DU_BLOCK_SIZE", "BLOCK_SIZE", "BLOCKSIZE"] { + for env_var in ["DU_BLOCK_SIZE", "BLOCK_SIZE", "BLOCKSIZE"] { if let Ok(env_size) = env::var(env_var) { if let Ok(v) = parse_size(&env_size) { return v; diff --git a/src/uu/sort/src/sort.rs b/src/uu/sort/src/sort.rs index 5c153ebae19..77d81c54ce5 100644 --- a/src/uu/sort/src/sort.rs +++ b/src/uu/sort/src/sort.rs @@ -1636,7 +1636,7 @@ fn get_leading_gen(input: &str) -> Range { let leading_whitespace_len = input.len() - trimmed.len(); // check for inf, -inf and nan - for allowed_prefix in &["inf", "-inf", "nan"] { + for allowed_prefix in ["inf", "-inf", "nan"] { if trimmed.is_char_boundary(allowed_prefix.len()) && trimmed[..allowed_prefix.len()].eq_ignore_ascii_case(allowed_prefix) { diff --git a/tests/by-util/test_base32.rs b/tests/by-util/test_base32.rs index 0eceb4a6648..ed1468abd48 100644 --- a/tests/by-util/test_base32.rs +++ b/tests/by-util/test_base32.rs @@ -34,7 +34,7 @@ fn test_base32_encode_file() { #[test] fn test_decode() { - for decode_param in &["-d", "--decode", "--dec"] { + for decode_param in ["-d", "--decode", "--dec"] { let input = "JBSWY3DPFQQFO33SNRSCC===\n"; // spell-checker:disable-line new_ucmd!() .arg(decode_param) @@ -56,7 +56,7 @@ fn test_garbage() { #[test] fn test_ignore_garbage() { - for ignore_garbage_param in &["-i", "--ignore-garbage", "--ig"] { + for ignore_garbage_param in ["-i", "--ignore-garbage", "--ig"] { let input = "JBSWY\x013DPFQ\x02QFO33SNRSCC===\n"; // spell-checker:disable-line new_ucmd!() .arg("-d") @@ -69,7 +69,7 @@ fn test_ignore_garbage() { #[test] fn test_wrap() { - for wrap_param in &["-w", "--wrap", "--wr"] { + for wrap_param in ["-w", "--wrap", "--wr"] { let input = "The quick brown fox jumps over the lazy dog."; new_ucmd!() .arg(wrap_param) @@ -84,7 +84,7 @@ fn test_wrap() { #[test] fn test_wrap_no_arg() { - for wrap_param in &["-w", "--wrap"] { + for wrap_param in ["-w", "--wrap"] { let ts = TestScenario::new(util_name!()); let expected_stderr = &format!( "error: The argument '--wrap \' requires a value but none was \ @@ -102,7 +102,7 @@ fn test_wrap_no_arg() { #[test] fn test_wrap_bad_arg() { - for wrap_param in &["-w", "--wrap"] { + for wrap_param in ["-w", "--wrap"] { new_ucmd!() .arg(wrap_param) .arg("b") diff --git a/tests/by-util/test_base64.rs b/tests/by-util/test_base64.rs index a4b461f91a4..11d3453474f 100644 --- a/tests/by-util/test_base64.rs +++ b/tests/by-util/test_base64.rs @@ -26,7 +26,7 @@ fn test_base64_encode_file() { #[test] fn test_decode() { - for decode_param in &["-d", "--decode", "--dec"] { + for decode_param in ["-d", "--decode", "--dec"] { let input = "aGVsbG8sIHdvcmxkIQ=="; // spell-checker:disable-line new_ucmd!() .arg(decode_param) @@ -48,7 +48,7 @@ fn test_garbage() { #[test] fn test_ignore_garbage() { - for ignore_garbage_param in &["-i", "--ignore-garbage", "--ig"] { + for ignore_garbage_param in ["-i", "--ignore-garbage", "--ig"] { let input = "aGVsbG8sIHdvcmxkIQ==\0"; // spell-checker:disable-line new_ucmd!() .arg("-d") @@ -61,7 +61,7 @@ fn test_ignore_garbage() { #[test] fn test_wrap() { - for wrap_param in &["-w", "--wrap", "--wr"] { + for wrap_param in ["-w", "--wrap", "--wr"] { let input = "The quick brown fox jumps over the lazy dog."; new_ucmd!() .arg(wrap_param) @@ -75,7 +75,7 @@ fn test_wrap() { #[test] fn test_wrap_no_arg() { - for wrap_param in &["-w", "--wrap"] { + for wrap_param in ["-w", "--wrap"] { new_ucmd!().arg(wrap_param).fails().stderr_contains( &"The argument '--wrap ' requires a value but none was supplied", ); @@ -84,7 +84,7 @@ fn test_wrap_no_arg() { #[test] fn test_wrap_bad_arg() { - for wrap_param in &["-w", "--wrap"] { + for wrap_param in ["-w", "--wrap"] { new_ucmd!() .arg(wrap_param) .arg("b") diff --git a/tests/by-util/test_basename.rs b/tests/by-util/test_basename.rs index 1250ba76f13..0c7249b3250 100644 --- a/tests/by-util/test_basename.rs +++ b/tests/by-util/test_basename.rs @@ -6,7 +6,7 @@ use std::ffi::OsStr; #[test] fn test_help() { - for help_flg in &["-h", "--help"] { + for help_flg in ["-h", "--help"] { new_ucmd!() .arg(&help_flg) .succeeds() @@ -17,7 +17,7 @@ fn test_help() { #[test] fn test_version() { - for version_flg in &["-V", "--version"] { + for version_flg in ["-V", "--version"] { assert!(new_ucmd!() .arg(&version_flg) .succeeds() @@ -61,7 +61,7 @@ fn test_do_not_remove_suffix() { #[test] fn test_multiple_param() { - for &multiple_param in &["-a", "--multiple", "--mul"] { + for multiple_param in ["-a", "--multiple", "--mul"] { let path = "/foo/bar/baz"; new_ucmd!() .args(&[multiple_param, path, path]) @@ -72,7 +72,7 @@ fn test_multiple_param() { #[test] fn test_suffix_param() { - for &suffix_param in &["-s", "--suffix", "--suf"] { + for suffix_param in ["-s", "--suffix", "--suf"] { let path = "/foo/bar/baz.exe"; new_ucmd!() .args(&[suffix_param, ".exe", path, path]) @@ -83,7 +83,7 @@ fn test_suffix_param() { #[test] fn test_zero_param() { - for &zero_param in &["-z", "--zero", "--ze"] { + for zero_param in ["-z", "--zero", "--ze"] { let path = "/foo/bar/baz"; new_ucmd!() .args(&[zero_param, "-a", path, path]) diff --git a/tests/by-util/test_cat.rs b/tests/by-util/test_cat.rs index 64a511656b8..96c77a40ea6 100644 --- a/tests/by-util/test_cat.rs +++ b/tests/by-util/test_cat.rs @@ -19,7 +19,7 @@ fn test_output_simple() { #[test] fn test_no_options() { // spell-checker:disable-next-line - for fixture in &["empty.txt", "alpha.txt", "nonewline.txt"] { + for fixture in ["empty.txt", "alpha.txt", "nonewline.txt"] { // Give fixture through command line file argument new_ucmd!() .args(&[fixture]) @@ -36,7 +36,7 @@ fn test_no_options() { #[test] #[cfg(any(target_vendor = "apple", target_os = "linux", target_os = "android"))] fn test_no_options_big_input() { - for &n in &[ + for n in [ 0, 1, 42, @@ -114,7 +114,7 @@ fn test_closes_file_descriptors() { fn test_piped_to_regular_file() { use std::fs::read_to_string; - for &append in &[true, false] { + for append in [true, false] { let s = TestScenario::new(util_name!()); let file_path = s.fixtures.plus("file.txt"); @@ -139,7 +139,7 @@ fn test_piped_to_regular_file() { #[test] #[cfg(unix)] fn test_piped_to_dev_null() { - for &append in &[true, false] { + for append in [true, false] { let s = TestScenario::new(util_name!()); { let dev_null = OpenOptions::new() @@ -159,7 +159,7 @@ fn test_piped_to_dev_null() { #[test] #[cfg(any(target_os = "linux", target_os = "freebsd", target_os = "netbsd"))] fn test_piped_to_dev_full() { - for &append in &[true, false] { + for append in [true, false] { let s = TestScenario::new(util_name!()); { let dev_full = OpenOptions::new() @@ -192,7 +192,7 @@ fn test_directory_and_file() { let s = TestScenario::new(util_name!()); s.fixtures.mkdir("test_directory2"); // spell-checker:disable-next-line - for fixture in &["empty.txt", "alpha.txt", "nonewline.txt"] { + for fixture in ["empty.txt", "alpha.txt", "nonewline.txt"] { s.ucmd() .args(&["test_directory2", fixture]) .fails() @@ -264,7 +264,7 @@ fn test_numbered_lines_no_trailing_newline() { #[test] fn test_stdin_show_nonprinting() { - for same_param in &["-v", "--show-nonprinting", "--show-non"] { + for same_param in ["-v", "--show-nonprinting", "--show-non"] { new_ucmd!() .args(&[same_param]) .pipe_in("\t\0\n") @@ -275,7 +275,7 @@ fn test_stdin_show_nonprinting() { #[test] fn test_stdin_show_tabs() { - for same_param in &["-T", "--show-tabs", "--show-ta"] { + for same_param in ["-T", "--show-tabs", "--show-ta"] { new_ucmd!() .args(&[same_param]) .pipe_in("\t\0\n") @@ -286,7 +286,7 @@ fn test_stdin_show_tabs() { #[test] fn test_stdin_show_ends() { - for &same_param in &["-E", "--show-ends", "--show-e"] { + for same_param in ["-E", "--show-ends", "--show-e"] { new_ucmd!() .args(&[same_param, "-"]) .pipe_in("\t\0\n\t") @@ -317,7 +317,7 @@ fn test_show_ends_crlf() { #[test] fn test_stdin_show_all() { - for same_param in &["-A", "--show-all", "--show-a"] { + for same_param in ["-A", "--show-all", "--show-a"] { new_ucmd!() .args(&[same_param]) .pipe_in("\t\0\n") @@ -346,7 +346,7 @@ fn test_stdin_nonprinting_and_tabs() { #[test] fn test_stdin_squeeze_blank() { - for same_param in &["-s", "--squeeze-blank", "--squeeze"] { + for same_param in ["-s", "--squeeze-blank", "--squeeze"] { new_ucmd!() .arg(same_param) .pipe_in("\n\na\n\n\n\n\nb\n\n\n") @@ -358,7 +358,7 @@ fn test_stdin_squeeze_blank() { #[test] fn test_stdin_number_non_blank() { // spell-checker:disable-next-line - for same_param in &["-b", "--number-nonblank", "--number-non"] { + for same_param in ["-b", "--number-nonblank", "--number-non"] { new_ucmd!() .arg(same_param) .arg("-") @@ -371,7 +371,7 @@ fn test_stdin_number_non_blank() { #[test] fn test_non_blank_overrides_number() { // spell-checker:disable-next-line - for &same_param in &["-b", "--number-nonblank"] { + for same_param in ["-b", "--number-nonblank"] { new_ucmd!() .args(&[same_param, "-"]) .pipe_in("\na\nb\n\n\nc") @@ -382,7 +382,7 @@ fn test_non_blank_overrides_number() { #[test] fn test_squeeze_blank_before_numbering() { - for &same_param in &["-s", "--squeeze-blank"] { + for same_param in ["-s", "--squeeze-blank"] { new_ucmd!() .args(&[same_param, "-n", "-"]) .pipe_in("a\n\n\nb") diff --git a/tests/by-util/test_chcon.rs b/tests/by-util/test_chcon.rs index 82dab9ae36b..bea5462b4ca 100644 --- a/tests/by-util/test_chcon.rs +++ b/tests/by-util/test_chcon.rs @@ -23,7 +23,7 @@ fn help() { #[test] fn reference_errors() { - for args in &[ + for args in [ &["--verbose", "--reference"] as &[&str], &["--verbose", "--reference=/dev/null"], &["--verbose", "--reference=/inexistent", "/dev/null"], @@ -34,7 +34,7 @@ fn reference_errors() { #[test] fn recursive_errors() { - for args in &[ + for args in [ &["--verbose", "-P"] as &[&str], &["--verbose", "-H"], &["--verbose", "-L"], diff --git a/tests/by-util/test_chgrp.rs b/tests/by-util/test_chgrp.rs index 6c0aa46ad2d..1d89caca73f 100644 --- a/tests/by-util/test_chgrp.rs +++ b/tests/by-util/test_chgrp.rs @@ -60,7 +60,7 @@ fn test_1() { #[test] fn test_fail_silently() { if get_effective_gid() != 0 { - for opt in &["-f", "--silent", "--quiet", "--sil", "--qui"] { + for opt in ["-f", "--silent", "--quiet", "--sil", "--qui"] { new_ucmd!() .arg(opt) .arg("bin") @@ -74,7 +74,7 @@ fn test_fail_silently() { #[test] fn test_preserve_root() { // It's weird that on OS X, `realpath /etc/..` returns '/private' - for d in &[ + for d in [ "/", "/////tmp///../../../../", "../../../../../../../../../../../../../../", @@ -92,7 +92,7 @@ fn test_preserve_root() { #[test] fn test_preserve_root_symlink() { let file = "test_chgrp_symlink2root"; - for d in &[ + for d in [ "/", "////tmp//../../../../", "..//../../..//../..//../../../../../../../../", @@ -299,7 +299,7 @@ fn test_traverse_symlinks() { } let (first_group, second_group) = (groups[0], groups[1]); - for &(args, traverse_first, traverse_second) in &[ + for (args, traverse_first, traverse_second) in [ (&[][..] as &[&str], false, false), (&["-H"][..], true, false), (&["-P"][..], false, false), diff --git a/tests/by-util/test_chmod.rs b/tests/by-util/test_chmod.rs index 373ad97ce82..8f6b7fb52a9 100644 --- a/tests/by-util/test_chmod.rs +++ b/tests/by-util/test_chmod.rs @@ -532,7 +532,7 @@ fn test_chmod_strip_minus_from_mode() { #[test] fn test_chmod_keep_setgid() { - for &(from, arg, to) in &[ + for (from, arg, to) in [ (0o7777, "777", 0o46777), (0o7777, "=777", 0o40777), (0o7777, "0777", 0o46777), diff --git a/tests/by-util/test_comm.rs b/tests/by-util/test_comm.rs index d5b72b1e908..ebfc9c6f9d6 100644 --- a/tests/by-util/test_comm.rs +++ b/tests/by-util/test_comm.rs @@ -76,7 +76,7 @@ fn output_delimiter_require_arg() { #[cfg_attr(not(feature = "test_unimplemented"), ignore)] #[test] fn zero_terminated() { - for ¶m in &["-z", "--zero-terminated"] { + for param in ["-z", "--zero-terminated"] { new_ucmd!() .args(&[param, "a", "b"]) .fails() diff --git a/tests/by-util/test_cp.rs b/tests/by-util/test_cp.rs index 11afa469e71..7bb11306d31 100644 --- a/tests/by-util/test_cp.rs +++ b/tests/by-util/test_cp.rs @@ -1469,7 +1469,7 @@ fn test_canonicalize_symlink() { #[test] fn test_copy_through_just_created_symlink() { - for &create_t in &[true, false] { + for create_t in [true, false] { let (at, mut ucmd) = at_and_ucmd!(); at.mkdir("a"); at.mkdir("b"); @@ -1606,7 +1606,7 @@ fn test_cp_dir_vs_file() { fn test_cp_overriding_arguments() { let s = TestScenario::new(util_name!()); s.fixtures.touch("file1"); - for (arg1, arg2) in &[ + for (arg1, arg2) in [ #[cfg(not(windows))] ("--remove-destination", "--force"), #[cfg(not(windows))] diff --git a/tests/by-util/test_cut.rs b/tests/by-util/test_cut.rs index da707ac3a37..0fe222b060a 100644 --- a/tests/by-util/test_cut.rs +++ b/tests/by-util/test_cut.rs @@ -41,7 +41,7 @@ static COMPLEX_SEQUENCE: &TestedSequence = &TestedSequence { #[test] fn test_byte_sequence() { - for ¶m in &["-b", "--bytes", "--byt"] { + for param in ["-b", "--bytes", "--byt"] { for example_seq in EXAMPLE_SEQUENCES { new_ucmd!() .args(&[param, example_seq.sequence, INPUT]) @@ -53,7 +53,7 @@ fn test_byte_sequence() { #[test] fn test_char_sequence() { - for ¶m in &["-c", "--characters", "--char"] { + for param in ["-c", "--characters", "--char"] { for example_seq in EXAMPLE_SEQUENCES { //as of coreutils 8.25 a char range is effectively the same as a byte range; there is no distinct treatment of utf8 chars. new_ucmd!() @@ -66,7 +66,7 @@ fn test_char_sequence() { #[test] fn test_field_sequence() { - for ¶m in &["-f", "--fields", "--fie"] { + for param in ["-f", "--fields", "--fie"] { for example_seq in EXAMPLE_SEQUENCES { new_ucmd!() .args(&[param, example_seq.sequence, INPUT]) @@ -78,7 +78,7 @@ fn test_field_sequence() { #[test] fn test_specify_delimiter() { - for ¶m in &["-d", "--delimiter", "--del"] { + for param in ["-d", "--delimiter", "--del"] { new_ucmd!() .args(&[param, ":", "-f", COMPLEX_SEQUENCE.sequence, INPUT]) .succeeds() @@ -115,7 +115,7 @@ fn test_output_delimiter() { #[test] fn test_complement() { - for param in &["--complement", "--com"] { + for param in ["--complement", "--com"] { new_ucmd!() .args(&["-d_", param, "-f", "2"]) .pipe_in("9_1\n8_2\n7_3") @@ -135,7 +135,7 @@ fn test_zero_terminated() { #[test] fn test_only_delimited() { - for param in &["-s", "--only-delimited", "--only-del"] { + for param in ["-s", "--only-delimited", "--only-del"] { new_ucmd!() .args(&["-d_", param, "-f", "1"]) .pipe_in("91\n82\n7_3") diff --git a/tests/by-util/test_date.rs b/tests/by-util/test_date.rs index 05c6f89db7c..a04de9b5994 100644 --- a/tests/by-util/test_date.rs +++ b/tests/by-util/test_date.rs @@ -7,7 +7,7 @@ use rust_users::*; #[test] fn test_date_email() { - for param in &["--rfc-email", "--rfc-e", "-R"] { + for param in ["--rfc-email", "--rfc-e", "-R"] { new_ucmd!().arg(param).succeeds(); } } @@ -23,7 +23,7 @@ fn test_date_rfc_3339() { let re = Regex::new(rfc_regexp).unwrap(); // Check that the output matches the regexp - for param in &["--rfc-3339", "--rfc-3"] { + for param in ["--rfc-3339", "--rfc-3"] { scene .ucmd() .arg(format!("{}=ns", param)) @@ -40,21 +40,21 @@ fn test_date_rfc_3339() { #[test] fn test_date_rfc_8601() { - for param in &["--iso-8601", "--i"] { + for param in ["--iso-8601", "--i"] { new_ucmd!().arg(format!("{}=ns", param)).succeeds(); } } #[test] fn test_date_rfc_8601_second() { - for param in &["--iso-8601", "--i"] { + for param in ["--iso-8601", "--i"] { new_ucmd!().arg(format!("{}=second", param)).succeeds(); } } #[test] fn test_date_utc() { - for param in &["--universal", "--utc", "--uni", "--u"] { + for param in ["--universal", "--utc", "--uni", "--u"] { new_ucmd!().arg(param).succeeds(); } } diff --git a/tests/by-util/test_dd.rs b/tests/by-util/test_dd.rs index f6287a940dc..71049a2afe3 100644 --- a/tests/by-util/test_dd.rs +++ b/tests/by-util/test_dd.rs @@ -463,7 +463,7 @@ fn test_zeros_to_stdout() { #[cfg(target_pointer_width = "32")] #[test] fn test_oversized_bs_32_bit() { - for bs_param in &["bs", "ibs", "obs", "cbs"] { + for bs_param in ["bs", "ibs", "obs", "cbs"] { new_ucmd!() .args(&[format!("{}=5GB", bs_param)]) .run() diff --git a/tests/by-util/test_env.rs b/tests/by-util/test_env.rs index 3559e74cd6a..395e6d157f3 100644 --- a/tests/by-util/test_env.rs +++ b/tests/by-util/test_env.rs @@ -83,7 +83,7 @@ fn test_unset_invalid_variables() { // Cannot test input with \0 in it, since output will also contain \0. rlimit::prlimit fails // with this error: Error { kind: InvalidInput, message: "nul byte found in provided data" } - for var in &["", "a=b"] { + for var in ["", "a=b"] { new_ucmd!().arg("-u").arg(var).run().stderr_only(format!( "env: cannot unset {}: Invalid argument", var.quote() diff --git a/tests/by-util/test_id.rs b/tests/by-util/test_id.rs index db918aa33e8..8606678e910 100644 --- a/tests/by-util/test_id.rs +++ b/tests/by-util/test_id.rs @@ -49,7 +49,7 @@ fn test_id_single_user() { .code_is(exp_result.code()); // u/g/G z/n - for &opt in &["--user", "--group", "--groups"] { + for opt in ["--user", "--group", "--groups"] { let mut args = vec![opt]; args.extend_from_slice(&test_users); exp_result = unwrap_or_return!(expected_result(&ts, &args)); @@ -108,7 +108,7 @@ fn test_id_single_user_non_existing() { #[cfg(unix)] fn test_id_name() { let ts = TestScenario::new(util_name!()); - for &opt in &["--user", "--group", "--groups"] { + for opt in ["--user", "--group", "--groups"] { let args = [opt, "--name"]; let result = ts.ucmd().args(&args).run(); let exp_result = unwrap_or_return!(expected_result(&ts, &args)); @@ -127,7 +127,7 @@ fn test_id_name() { #[cfg(unix)] fn test_id_real() { let ts = TestScenario::new(util_name!()); - for &opt in &["--user", "--group", "--groups"] { + for opt in ["--user", "--group", "--groups"] { let args = [opt, "--real"]; let result = ts.ucmd().args(&args).run(); let exp_result = unwrap_or_return!(expected_result(&ts, &args)); @@ -188,7 +188,7 @@ fn test_id_multiple_users() { .code_is(exp_result.code()); // u/g/G z/n - for &opt in &["--user", "--group", "--groups"] { + for opt in ["--user", "--group", "--groups"] { let mut args = vec![opt]; args.extend_from_slice(&test_users); exp_result = unwrap_or_return!(expected_result(&ts, &args)); @@ -256,7 +256,7 @@ fn test_id_multiple_users_non_existing() { .code_is(exp_result.code()); // u/g/G z/n - for &opt in &["--user", "--group", "--groups"] { + for opt in ["--user", "--group", "--groups"] { let mut args = vec![opt]; args.extend_from_slice(&test_users); exp_result = unwrap_or_return!(expected_result(&ts, &args)); @@ -297,14 +297,14 @@ fn test_id_multiple_users_non_existing() { #[cfg(unix)] fn test_id_default_format() { let ts = TestScenario::new(util_name!()); - for &opt1 in &["--name", "--real"] { + for opt1 in ["--name", "--real"] { // id: cannot print only names or real IDs in default format let args = [opt1]; ts.ucmd() .args(&args) .fails() .stderr_only(unwrap_or_return!(expected_result(&ts, &args)).stderr_str()); - for &opt2 in &["--user", "--group", "--groups"] { + for opt2 in ["--user", "--group", "--groups"] { // u/g/G n/r let args = [opt2, opt1]; let result = ts.ucmd().args(&args).run(); @@ -315,7 +315,7 @@ fn test_id_default_format() { .code_is(exp_result.code()); } } - for &opt2 in &["--user", "--group", "--groups"] { + for opt2 in ["--user", "--group", "--groups"] { // u/g/G let args = [opt2]; ts.ucmd() @@ -329,20 +329,20 @@ fn test_id_default_format() { #[cfg(unix)] fn test_id_zero() { let ts = TestScenario::new(util_name!()); - for z_flag in &["-z", "--zero"] { + for z_flag in ["-z", "--zero"] { // id: option --zero not permitted in default format ts.ucmd() .args(&[z_flag]) .fails() .stderr_only(unwrap_or_return!(expected_result(&ts, &[z_flag])).stderr_str()); - for &opt1 in &["--name", "--real"] { + for opt1 in ["--name", "--real"] { // id: cannot print only names or real IDs in default format let args = [opt1, z_flag]; ts.ucmd() .args(&args) .fails() .stderr_only(unwrap_or_return!(expected_result(&ts, &args)).stderr_str()); - for &opt2 in &["--user", "--group", "--groups"] { + for opt2 in ["--user", "--group", "--groups"] { // u/g/G n/r z let args = [opt2, z_flag, opt1]; let result = ts.ucmd().args(&args).run(); @@ -353,7 +353,7 @@ fn test_id_zero() { .code_is(exp_result.code()); } } - for &opt2 in &["--user", "--group", "--groups"] { + for opt2 in ["--user", "--group", "--groups"] { // u/g/G z let args = [opt2, z_flag]; ts.ucmd() @@ -373,18 +373,18 @@ fn test_id_context() { return; } let ts = TestScenario::new(util_name!()); - for c_flag in &["-Z", "--context"] { + for c_flag in ["-Z", "--context"] { ts.ucmd() .args(&[c_flag]) .succeeds() .stdout_only(unwrap_or_return!(expected_result(&ts, &[c_flag])).stdout_str()); - for &z_flag in &["-z", "--zero"] { + for z_flag in ["-z", "--zero"] { let args = [c_flag, z_flag]; ts.ucmd() .args(&args) .succeeds() .stdout_only(unwrap_or_return!(expected_result(&ts, &args)).stdout_str()); - for &opt1 in &["--name", "--real"] { + for opt1 in ["--name", "--real"] { // id: cannot print only names or real IDs in default format let args = [opt1, c_flag]; ts.ucmd() @@ -396,7 +396,7 @@ fn test_id_context() { .args(&args) .succeeds() .stdout_only(unwrap_or_return!(expected_result(&ts, &args)).stdout_str()); - for &opt2 in &["--user", "--group", "--groups"] { + for opt2 in ["--user", "--group", "--groups"] { // u/g/G n/r z Z // for now, we print clap's standard response for "conflicts_with" instead of: // id: cannot print "only" of more than one choice @@ -409,7 +409,7 @@ fn test_id_context() { // .code_is(exp_result.code()); } } - for &opt2 in &["--user", "--group", "--groups"] { + for opt2 in ["--user", "--group", "--groups"] { // u/g/G z Z // for now, we print clap's standard response for "conflicts_with" instead of: // id: cannot print "only" of more than one choice diff --git a/tests/by-util/test_ls.rs b/tests/by-util/test_ls.rs index f60d53b6e5c..45ebc238259 100644 --- a/tests/by-util/test_ls.rs +++ b/tests/by-util/test_ls.rs @@ -604,7 +604,7 @@ fn test_ls_width() { at.touch(&at.plus_as_string("test-width-3")); at.touch(&at.plus_as_string("test-width-4")); - for option in &[ + for option in [ "-w 100", "-w=100", "--width=100", @@ -619,7 +619,7 @@ fn test_ls_width() { .stdout_only("test-width-1 test-width-2 test-width-3 test-width-4\n"); } - for option in &["-w 50", "-w=50", "--width=50", "--width 50", "--wid=50"] { + for option in ["-w 50", "-w=50", "--width=50", "--width 50", "--wid=50"] { scene .ucmd() .args(&option.split(' ').collect::>()) @@ -628,7 +628,7 @@ fn test_ls_width() { .stdout_only("test-width-1 test-width-3\ntest-width-2 test-width-4\n"); } - for option in &["-w 25", "-w=25", "--width=25", "--width 25", "--wid=25"] { + for option in ["-w 25", "-w=25", "--width=25", "--width 25", "--wid=25"] { scene .ucmd() .args(&option.split(' ').collect::>()) @@ -637,7 +637,7 @@ fn test_ls_width() { .stdout_only("test-width-1\ntest-width-2\ntest-width-3\ntest-width-4\n"); } - for option in &["-w 0", "-w=0", "--width=0", "--width 0", "--wid=0"] { + for option in ["-w 0", "-w=0", "--width=0", "--width 0", "--wid=0"] { scene .ucmd() .args(&option.split(' ').collect::>()) @@ -653,7 +653,7 @@ fn test_ls_width() { .fails() .stderr_contains("invalid line width"); - for option in &["-w 1a", "-w=1a", "--width=1a", "--width 1a", "--wid 1a"] { + for option in ["-w 1a", "-w=1a", "--width=1a", "--width 1a", "--wid 1a"] { scene .ucmd() .args(&option.split(' ').collect::>()) @@ -1088,9 +1088,9 @@ fn test_ls_long_total_size() { let result = scene.ucmd().arg(arg).succeeds(); result.stdout_contains(expected_prints["long_vanilla"]); - for arg2 in &["-h", "--human-readable", "--si"] { + for arg2 in ["-h", "--human-readable", "--si"] { let result = scene.ucmd().arg(arg).arg(arg2).succeeds(); - result.stdout_contains(if *arg2 == "--si" { + result.stdout_contains(if arg2 == "--si" { expected_prints["long_si"] } else { expected_prints["long_human_readable"] @@ -1158,7 +1158,7 @@ fn test_ls_long_formats() { .stdout_matches(&re_three_num); } - for arg in &[ + for arg in [ "-l", // only group and owner "-g --author", // only author and group "-o --author", // only author and owner @@ -1184,7 +1184,7 @@ fn test_ls_long_formats() { } } - for arg in &[ + for arg in [ "-g", // only group "-gl", // only group "-o", // only owner @@ -1213,7 +1213,7 @@ fn test_ls_long_formats() { } } - for arg in &[ + for arg in [ "-og", "-ogl", "-lgo", @@ -1255,7 +1255,7 @@ fn test_ls_oneline() { // Bit of a weird situation: in the tests oneline and columns have the same output, // except on Windows. - for option in &["-1", "--format=single-column"] { + for option in ["-1", "--format=single-column"] { scene .ucmd() .arg(option) @@ -1376,7 +1376,7 @@ fn test_ls_long_ctime() { at.touch("test-long-ctime-1"); - for arg in &["-c", "--time=ctime", "--time=status"] { + for arg in ["-c", "--time=ctime", "--time=status"] { let result = scene.ucmd().arg("-l").arg(arg).succeeds(); // Should show the time on Unix, but question marks on windows. @@ -1537,7 +1537,7 @@ fn test_ls_order_time() { // 3 was accessed last in the read // So the order should be 2 3 4 1 - for arg in &["-u", "--time=atime", "--time=access", "--time=use"] { + for arg in ["-u", "--time=atime", "--time=access", "--time=use"] { let result = scene.ucmd().arg("-t").arg(arg).succeeds(); at.open("test-3").metadata().unwrap().accessed().unwrap(); at.open("test-4").metadata().unwrap().accessed().unwrap(); @@ -1656,7 +1656,7 @@ fn test_ls_color() { assert!(!result.stdout_str().contains(z_with_colors)); // Color should be enabled - for param in &["--color", "--col", "--color=always", "--col=always"] { + for param in ["--color", "--col", "--color=always", "--col=always"] { scene .ucmd() .arg(param) @@ -2034,7 +2034,7 @@ fn test_ls_success_on_c_drv_root_windows() { fn test_ls_version_sort() { let scene = TestScenario::new(util_name!()); let at = &scene.fixtures; - for filename in &[ + for filename in [ "a2", "b1", "b20", @@ -2130,7 +2130,7 @@ fn test_ls_quoting_style() { .succeeds() .stdout_only("'one'$'\\n''two'\n"); - for (arg, correct) in &[ + for (arg, correct) in [ ("--quoting-style=literal", "one?two"), ("-N", "one?two"), ("--literal", "one?two"), @@ -2154,7 +2154,7 @@ fn test_ls_quoting_style() { .stdout_only(format!("{}\n", correct)); } - for (arg, correct) in &[ + for (arg, correct) in [ ("--quoting-style=literal", "one\ntwo"), ("-N", "one\ntwo"), ("--literal", "one\ntwo"), @@ -2170,7 +2170,7 @@ fn test_ls_quoting_style() { .stdout_only(format!("{}\n", correct)); } - for (arg, correct) in &[ + for (arg, correct) in [ ("--quoting-style=literal", "one\\two"), ("-N", "one\\two"), ("--quoting-style=c", "\"one\\\\two\""), @@ -2195,7 +2195,7 @@ fn test_ls_quoting_style() { // Tests for a character that forces quotation in shell-style escaping // after a character in a dollar expression at.touch("one\n&two"); - for (arg, correct) in &[ + for (arg, correct) in [ ("--quoting-style=shell-escape", "'one'$'\\n''&two'"), ("--quoting-style=shell-escape-always", "'one'$'\\n''&two'"), ] { @@ -2215,7 +2215,7 @@ fn test_ls_quoting_style() { .succeeds() .stdout_only("'one two'\n"); - for (arg, correct) in &[ + for (arg, correct) in [ ("--quoting-style=literal", "one two"), ("-N", "one two"), ("--literal", "one two"), @@ -2241,7 +2241,7 @@ fn test_ls_quoting_style() { scene.ucmd().arg("one").succeeds().stdout_only("one\n"); - for (arg, correct) in &[ + for (arg, correct) in [ ("--quoting-style=literal", "one"), ("-N", "one"), ("--quoting-style=c", "\"one\""), @@ -2649,7 +2649,7 @@ fn test_ls_deref_command_line_dir() { fn test_ls_sort_extension() { let scene = TestScenario::new(util_name!()); let at = &scene.fixtures; - for filename in &[ + for filename in [ "file1", "file2", "anotherFile", @@ -2831,7 +2831,7 @@ fn test_ls_context2() { return; } let ts = TestScenario::new(util_name!()); - for c_flag in &["-Z", "--context"] { + for c_flag in ["-Z", "--context"] { ts.ucmd() .args(&[c_flag, &"/"]) .succeeds() @@ -2851,7 +2851,7 @@ fn test_ls_context_format() { // NOTE: // --format=long/verbose matches the output of GNU's ls for --context // except for the size count which may differ to the size count reported by GNU's ls. - for word in &[ + for word in [ "across", "commas", "horizontal", diff --git a/tests/by-util/test_nl.rs b/tests/by-util/test_nl.rs index ce301431143..1ed46c31362 100644 --- a/tests/by-util/test_nl.rs +++ b/tests/by-util/test_nl.rs @@ -42,7 +42,7 @@ fn test_padding_with_overflow() { #[test] fn test_sections_and_styles() { // spell-checker:disable - for &(fixture, output) in &[ + for (fixture, output) in [ ( "section.txt", "\nHEADER1\nHEADER2\n\n1 |BODY1\n2 \ diff --git a/tests/by-util/test_numfmt.rs b/tests/by-util/test_numfmt.rs index 0086c25e18b..38faacdc56d 100644 --- a/tests/by-util/test_numfmt.rs +++ b/tests/by-util/test_numfmt.rs @@ -484,7 +484,7 @@ fn test_delimiter_with_padding_and_fields() { #[test] fn test_round() { - for (method, exp) in &[ + for (method, exp) in [ ("from-zero", ["9.1K", "-9.1K", "9.1K", "-9.1K"]), ("towards-zero", ["9.0K", "-9.0K", "9.0K", "-9.0K"]), ("up", ["9.1K", "-9.0K", "9.1K", "-9.0K"]), diff --git a/tests/by-util/test_od.rs b/tests/by-util/test_od.rs index a6a81d1d6e8..3272971d748 100644 --- a/tests/by-util/test_od.rs +++ b/tests/by-util/test_od.rs @@ -70,12 +70,12 @@ fn test_2files() { let file1 = tmpdir.join("test1"); let file2 = tmpdir.join("test2"); - for &(n, a) in &[(1, "a"), (2, "b")] { + for (n, a) in [(1, "a"), (2, "b")] { println!("number: {} letter:{}", n, a); } // spell-checker:disable-next-line - for &(path, data) in &[(&file1, "abcdefghijklmnop"), (&file2, "qrstuvwxyz\n")] { + for (path, data) in [(&file1, "abcdefghijklmnop"), (&file2, "qrstuvwxyz\n")] { let mut f = File::create(&path).unwrap(); assert!( f.write_all(data.as_bytes()).is_ok(), @@ -127,7 +127,7 @@ fn test_from_mixed() { // spell-checker:disable-next-line let (data1, data2, data3) = ("abcdefg", "hijklmnop", "qrstuvwxyz\n"); - for &(path, data) in &[(&file1, data1), (&file3, data3)] { + for (path, data) in [(&file1, data1), (&file3, data3)] { let mut f = File::create(&path).unwrap(); assert!( f.write_all(data.as_bytes()).is_ok(), diff --git a/tests/by-util/test_paste.rs b/tests/by-util/test_paste.rs index 09401ec59fc..6d539e45e52 100644 --- a/tests/by-util/test_paste.rs +++ b/tests/by-util/test_paste.rs @@ -82,8 +82,8 @@ static EXAMPLE_DATA: &[TestData] = &[ #[test] fn test_combine_pairs_of_lines() { - for &s in &["-s", "--serial"] { - for &d in &["-d", "--delimiters"] { + for s in ["-s", "--serial"] { + for d in ["-d", "--delimiters"] { new_ucmd!() .args(&[s, d, "\t\n", "html_colors.txt"]) .run() @@ -94,7 +94,7 @@ fn test_combine_pairs_of_lines() { #[test] fn test_multi_stdin() { - for &d in &["-d", "--delimiters"] { + for d in ["-d", "--delimiters"] { new_ucmd!() .args(&[d, "\t\n", "-", "-"]) .pipe_in_fixture("html_colors.txt") diff --git a/tests/by-util/test_pr.rs b/tests/by-util/test_pr.rs index 2e72aaed768..cd832cf680e 100644 --- a/tests/by-util/test_pr.rs +++ b/tests/by-util/test_pr.rs @@ -69,7 +69,7 @@ fn test_with_long_header_option() { let test_file_path = "test_one_page.log"; let expected_test_file_path = "test_one_page_header.log.expected"; let header = "new file"; - for args in &[&["-h", header][..], &["--header=new file"][..]] { + for args in [&["-h", header][..], &["--header=new file"][..]] { let mut scenario = new_ucmd!(); let value = file_last_modified_time(&scenario, test_file_path); scenario @@ -87,7 +87,7 @@ fn test_with_long_header_option() { fn test_with_double_space_option() { let test_file_path = "test_one_page.log"; let expected_test_file_path = "test_one_page_double_line.log.expected"; - for &arg in &["-d", "--double-space"] { + for arg in ["-d", "--double-space"] { let mut scenario = new_ucmd!(); let value = file_last_modified_time(&scenario, test_file_path); scenario @@ -183,7 +183,7 @@ fn test_with_page_range() { let test_file_path = "test.log"; let expected_test_file_path = "test_page_range_1.log.expected"; let expected_test_file_path1 = "test_page_range_2.log.expected"; - for &arg in &["--pages=15", "+15"] { + for arg in ["--pages=15", "+15"] { let mut scenario = new_ucmd!(); let value = file_last_modified_time(&scenario, test_file_path); scenario @@ -194,7 +194,7 @@ fn test_with_page_range() { &[("{last_modified_time}", &value)], ); } - for &arg in &["--pages=15:17", "+15:17"] { + for arg in ["--pages=15:17", "+15:17"] { let mut scenario = new_ucmd!(); let value = file_last_modified_time(&scenario, test_file_path); scenario @@ -222,7 +222,7 @@ fn test_with_no_header_trailer_option() { #[test] fn test_with_page_length_option() { let test_file_path = "test.log"; - for (arg, expected) in &[ + for (arg, expected) in [ ("100", "test_page_length.log.expected"), ("5", "test_page_length1.log.expected"), ] { @@ -265,7 +265,7 @@ fn test_with_stdin() { fn test_with_column() { let test_file_path = "column.log"; let expected_test_file_path = "column.log.expected"; - for arg in &["-3", "--column=3"] { + for arg in ["-3", "--column=3"] { let mut scenario = new_ucmd!(); let value = file_last_modified_time(&scenario, test_file_path); scenario @@ -293,7 +293,7 @@ fn test_with_column_across_option() { #[test] fn test_with_column_across_option_and_column_separator() { let test_file_path = "column.log"; - for (arg, expected) in &[ + for (arg, expected) in [ ("-s|", "column_across_sep.log.expected"), ("-Sdivide", "column_across_sep1.log.expected"), ] { diff --git a/tests/by-util/test_runcon.rs b/tests/by-util/test_runcon.rs index 047ce576908..dd4445625bc 100644 --- a/tests/by-util/test_runcon.rs +++ b/tests/by-util/test_runcon.rs @@ -22,11 +22,11 @@ fn help() { fn print() { new_ucmd!().succeeds(); - for &flag in &["-c", "--compute"] { + for flag in ["-c", "--compute"] { new_ucmd!().arg(flag).succeeds(); } - for &flag in &[ + for flag in [ "-t", "--type", "-u", "--user", "-r", "--role", "-l", "--range", ] { new_ucmd!().args(&[flag, "example"]).succeeds(); @@ -57,7 +57,7 @@ fn invalid() { // TODO: Enable this code once the issue is fixed in the clap version we're using. //new_ucmd!().arg("--compute=example").fails().code_is(1); - for &flag in &[ + for flag in [ "-t", "--type", "-u", "--user", "-r", "--role", "-l", "--range", ] { new_ucmd!().arg(flag).fails().code_is(1); @@ -119,7 +119,7 @@ fn custom_context() { let args = &["--compute", "--range=s0", "/bin/true"]; new_ucmd!().args(args).succeeds(); - for &(ctx, u, r) in &[ + for (ctx, u, r) in [ ("unconfined_u:unconfined_r:unconfined_t:s0", u_ud, r_ud), ("system_u:unconfined_r:unconfined_t:s0", "system_u", r_ud), ("unconfined_u:system_r:unconfined_t:s0", u_ud, "system_r"), diff --git a/tests/by-util/test_sort.rs b/tests/by-util/test_sort.rs index c33d1a9860f..4975ceff430 100644 --- a/tests/by-util/test_sort.rs +++ b/tests/by-util/test_sort.rs @@ -220,7 +220,7 @@ fn test_random_shuffle_contains_all_lines() { #[test] fn test_random_shuffle_two_runs_not_the_same() { - for arg in &["-R", "-k1,1R"] { + for arg in ["-R", "-k1,1R"] { // check to verify that two random shuffles are not equal; this has the // potential to fail in the very unlikely event that the random order is the same // as the starting order, or if both random sorts end up having the same order. @@ -407,7 +407,7 @@ fn test_mixed_floats_ints_chars_numeric_stable() { #[test] fn test_numeric_floats_and_ints2() { - for numeric_sort_param in &["-n", "--numeric-sort"] { + for numeric_sort_param in ["-n", "--numeric-sort"] { let input = "1.444\n8.013\n1\n-8\n1.04\n-1"; new_ucmd!() .arg(numeric_sort_param) @@ -419,7 +419,7 @@ fn test_numeric_floats_and_ints2() { #[test] fn test_numeric_floats2() { - for numeric_sort_param in &["-n", "--numeric-sort"] { + for numeric_sort_param in ["-n", "--numeric-sort"] { let input = "1.444\n8.013\n1.58590\n-8.90880\n1.040000000\n-.05"; new_ucmd!() .arg(numeric_sort_param) @@ -439,7 +439,7 @@ fn test_numeric_floats_with_nan2() { #[test] fn test_human_block_sizes2() { - for human_numeric_sort_param in &["-h", "--human-numeric-sort", "--sort=human-numeric"] { + for human_numeric_sort_param in ["-h", "--human-numeric-sort", "--sort=human-numeric"] { let input = "8981K\n909991M\n-8T\n21G\n0.8M"; new_ucmd!() .arg(human_numeric_sort_param) @@ -461,7 +461,7 @@ fn test_human_numeric_zero_stable() { #[test] fn test_month_default2() { - for month_sort_param in &["-M", "--month-sort", "--sort=month"] { + for month_sort_param in ["-M", "--month-sort", "--sort=month"] { let input = "JAn\nMAY\n000may\nJun\nFeb"; new_ucmd!() .arg(month_sort_param) @@ -555,7 +555,7 @@ fn test_keys_invalid_char_zero() { #[test] fn test_keys_with_options() { let input = "aa 3 cc\ndd 1 ff\ngg 2 cc\n"; - for param in &[ + for param in [ &["-k", "2,2n"][..], &["-k", "2n,2"][..], &["-k", "2,2", "-n"][..], @@ -571,7 +571,7 @@ fn test_keys_with_options() { #[test] fn test_keys_with_options_blanks_start() { let input = "aa 3 cc\ndd 1 ff\ngg 2 cc\n"; - for param in &[&["-k", "2b,2"][..], &["-k", "2,2", "-b"][..]] { + for param in [&["-k", "2b,2"][..], &["-k", "2,2", "-b"][..]] { new_ucmd!() .args(param) .pipe_in(input) @@ -761,7 +761,7 @@ fn test_pipe() { #[test] fn test_check() { - for diagnose_arg in &["-c", "--check", "--check=diagnose-first"] { + for diagnose_arg in ["-c", "--check", "--check=diagnose-first"] { new_ucmd!() .arg(diagnose_arg) .arg("check_fail.txt") @@ -779,7 +779,7 @@ fn test_check() { #[test] fn test_check_silent() { - for silent_arg in &["-C", "--check=silent", "--check=quiet"] { + for silent_arg in ["-C", "--check=silent", "--check=quiet"] { new_ucmd!() .arg(silent_arg) .arg("check_fail.txt") @@ -803,7 +803,7 @@ fn test_check_unique() { #[test] fn test_dictionary_and_nonprinting_conflicts() { let conflicting_args = ["n", "h", "g", "M"]; - for restricted_arg in &["d", "i"] { + for restricted_arg in ["d", "i"] { for conflicting_arg in &conflicting_args { new_ucmd!() .arg(&format!("-{}{}", restricted_arg, conflicting_arg)) diff --git a/tests/by-util/test_stat.rs b/tests/by-util/test_stat.rs index 65db4804ef0..b8445543f7d 100644 --- a/tests/by-util/test_stat.rs +++ b/tests/by-util/test_stat.rs @@ -236,7 +236,7 @@ fn test_symlinks() { let mut tested: bool = false; // arbitrarily chosen symlinks with hope that the CI environment provides at least one of them - for file in &[ + for file in [ "/bin/sh", "/bin/sudoedit", "/usr/bin/ex", diff --git a/tests/by-util/test_tail.rs b/tests/by-util/test_tail.rs index 9791e346ca4..23dd94352da 100644 --- a/tests/by-util/test_tail.rs +++ b/tests/by-util/test_tail.rs @@ -522,7 +522,7 @@ fn test_tail_bytes_for_funny_files() { // gnu/tests/tail-2/tail-c.sh let ts = TestScenario::new(util_name!()); let at = &ts.fixtures; - for &file in &["/proc/version", "/sys/kernel/profiling"] { + for file in ["/proc/version", "/sys/kernel/profiling"] { if !at.file_exists(file) { continue; } diff --git a/tests/by-util/test_tee.rs b/tests/by-util/test_tee.rs index 17e3c05cf0c..e89b9d4387f 100644 --- a/tests/by-util/test_tee.rs +++ b/tests/by-util/test_tee.rs @@ -9,7 +9,7 @@ fn test_tee_processing_multiple_operands() { // POSIX says: "Processing of at least 13 file operands shall be supported." let content = "tee_sample_content"; - for &n in &[1, 2, 12, 13] { + for n in [1, 2, 12, 13] { let files = (1..=n).map(|x| x.to_string()).collect::>(); let (at, mut ucmd) = at_and_ucmd!(); diff --git a/tests/by-util/test_timeout.rs b/tests/by-util/test_timeout.rs index fef5fd4ae68..5d77e1fa066 100644 --- a/tests/by-util/test_timeout.rs +++ b/tests/by-util/test_timeout.rs @@ -39,7 +39,7 @@ fn test_command_with_args() { #[test] fn test_verbose() { - for &verbose_flag in &["-v", "--verbose"] { + for verbose_flag in ["-v", "--verbose"] { new_ucmd!() .args(&[verbose_flag, ".1", "sleep", "10"]) .fails() diff --git a/tests/by-util/test_touch.rs b/tests/by-util/test_touch.rs index d7a0df1292a..6e5d656c403 100644 --- a/tests/by-util/test_touch.rs +++ b/tests/by-util/test_touch.rs @@ -333,7 +333,7 @@ fn test_touch_reference() { at.touch(file_a); set_file_times(&at, file_a, start_of_year, start_of_year); assert!(at.file_exists(file_a)); - for &opt in &["-r", "--ref", "--reference"] { + for opt in ["-r", "--ref", "--reference"] { scenario .ccmd("touch") .args(&[opt, file_a, file_b]) diff --git a/tests/by-util/test_wc.rs b/tests/by-util/test_wc.rs index 1efbe81a772..3537f902dfe 100644 --- a/tests/by-util/test_wc.rs +++ b/tests/by-util/test_wc.rs @@ -7,7 +7,7 @@ use crate::common::util::*; #[test] fn test_count_bytes_large_stdin() { - for &n in &[ + for n in [ 0, 1, 42, diff --git a/tests/by-util/test_who.rs b/tests/by-util/test_who.rs index 65773655d54..580d9ea6fd0 100644 --- a/tests/by-util/test_who.rs +++ b/tests/by-util/test_who.rs @@ -12,7 +12,7 @@ use crate::common::util::*; #[ignore = "issue #3219"] fn test_count() { let ts = TestScenario::new(util_name!()); - for opt in &["-q", "--count", "--c"] { + for opt in ["-q", "--count", "--c"] { let expected_stdout = unwrap_or_return!(expected_result(&ts, &[opt])).stdout_move_str(); ts.ucmd().arg(opt).succeeds().stdout_is(expected_stdout); } @@ -22,7 +22,7 @@ fn test_count() { #[test] fn test_boot() { let ts = TestScenario::new(util_name!()); - for opt in &["-b", "--boot", "--b"] { + for opt in ["-b", "--boot", "--b"] { let expected_stdout = unwrap_or_return!(expected_result(&ts, &[opt])).stdout_move_str(); ts.ucmd().arg(opt).succeeds().stdout_is(expected_stdout); } @@ -33,7 +33,7 @@ fn test_boot() { #[ignore = "issue #3219"] fn test_heading() { let ts = TestScenario::new(util_name!()); - for opt in &["-H", "--heading", "--head"] { + for opt in ["-H", "--heading", "--head"] { // allow whitespace variation // * minor whitespace differences occur between platform built-in outputs; // specifically number of TABs between "TIME" and "COMMENT" may be variant @@ -52,7 +52,7 @@ fn test_heading() { #[ignore = "issue #3219"] fn test_short() { let ts = TestScenario::new(util_name!()); - for opt in &["-s", "--short", "--s"] { + for opt in ["-s", "--short", "--s"] { let expected_stdout = unwrap_or_return!(expected_result(&ts, &[opt])).stdout_move_str(); ts.ucmd().arg(opt).succeeds().stdout_is(expected_stdout); } @@ -62,7 +62,7 @@ fn test_short() { #[test] fn test_login() { let ts = TestScenario::new(util_name!()); - for opt in &["-l", "--login", "--log"] { + for opt in ["-l", "--login", "--log"] { let expected_stdout = unwrap_or_return!(expected_result(&ts, &[opt])).stdout_move_str(); ts.ucmd().arg(opt).succeeds().stdout_is(expected_stdout); } @@ -80,7 +80,7 @@ fn test_m() { #[test] fn test_process() { let ts = TestScenario::new(util_name!()); - for opt in &["-p", "--process", "--p"] { + for opt in ["-p", "--process", "--p"] { let expected_stdout = unwrap_or_return!(expected_result(&ts, &[opt])).stdout_move_str(); ts.ucmd().arg(opt).succeeds().stdout_is(expected_stdout); } @@ -90,7 +90,7 @@ fn test_process() { #[test] fn test_runlevel() { let ts = TestScenario::new(util_name!()); - for opt in &["-r", "--runlevel", "--r"] { + for opt in ["-r", "--runlevel", "--r"] { let expected_stdout = unwrap_or_return!(expected_result(&ts, &[opt])).stdout_move_str(); ts.ucmd().arg(opt).succeeds().stdout_is(expected_stdout); @@ -103,7 +103,7 @@ fn test_runlevel() { #[test] fn test_time() { let ts = TestScenario::new(util_name!()); - for opt in &["-t", "--time", "--t"] { + for opt in ["-t", "--time", "--t"] { let expected_stdout = unwrap_or_return!(expected_result(&ts, &[opt])).stdout_move_str(); ts.ucmd().arg(opt).succeeds().stdout_is(expected_stdout); } @@ -120,7 +120,7 @@ fn test_mesg() { // --writable // same as -T let ts = TestScenario::new(util_name!()); - for opt in &[ + for opt in [ "-T", "-w", "--mesg", @@ -157,7 +157,7 @@ fn test_too_many_args() { #[ignore = "issue #3219"] fn test_users() { let ts = TestScenario::new(util_name!()); - for opt in &["-u", "--users", "--us"] { + for opt in ["-u", "--users", "--us"] { let actual = ts.ucmd().arg(opt).succeeds().stdout_move_str(); let expect = unwrap_or_return!(expected_result(&ts, &[opt])).stdout_move_str(); println!("actual: {:?}", actual); @@ -192,7 +192,7 @@ fn test_lookup() { #[test] fn test_dead() { let ts = TestScenario::new(util_name!()); - for opt in &["-d", "--dead", "--de"] { + for opt in ["-d", "--dead", "--de"] { let expected_stdout = unwrap_or_return!(expected_result(&ts, &[opt])).stdout_move_str(); ts.ucmd().arg(opt).succeeds().stdout_is(expected_stdout); } @@ -226,7 +226,7 @@ fn test_all() { } let ts = TestScenario::new(util_name!()); - for opt in &["-a", "--all", "--a"] { + for opt in ["-a", "--all", "--a"] { let expected_stdout = unwrap_or_return!(expected_result(&ts, &[opt])).stdout_move_str(); ts.ucmd().arg(opt).succeeds().stdout_is(expected_stdout); } diff --git a/tests/by-util/test_yes.rs b/tests/by-util/test_yes.rs index 38165e92b9e..7325cb4bcf0 100644 --- a/tests/by-util/test_yes.rs +++ b/tests/by-util/test_yes.rs @@ -55,7 +55,7 @@ fn test_long_input() { fn test_piped_to_dev_full() { use std::fs::OpenOptions; - for &append in &[true, false] { + for append in [true, false] { { let dev_full = OpenOptions::new() .write(true) From 876924f5d5b6b6c6846d4234326655c06f5aa7f1 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Tue, 5 Apr 2022 14:21:32 +0200 Subject: [PATCH 036/242] df: show error if same type is included & excluded Fixes #3302 --- src/uu/df/src/df.rs | 53 ++++++++++++++++++++++++++-------------- tests/by-util/test_df.rs | 15 ++++++++++++ 2 files changed, 50 insertions(+), 18 deletions(-) diff --git a/src/uu/df/src/df.rs b/src/uu/df/src/df.rs index d125e73d06f..97f1a2e6eea 100644 --- a/src/uu/df/src/df.rs +++ b/src/uu/df/src/df.rs @@ -111,6 +111,8 @@ enum OptionsError { /// An error getting the columns to display in the output table. ColumnError(ColumnError), + + FilesystemTypeBothSelectedAndExcluded(Vec), } impl fmt::Display for OptionsError { @@ -126,6 +128,16 @@ impl fmt::Display for OptionsError { "option --output: field {} used more than once", s.quote() ), + Self::FilesystemTypeBothSelectedAndExcluded(types) => { + for t in types { + eprintln!( + "{}: file system type {} both selected and excluded", + uucore::util_name(), + t.quote() + ); + } + Ok(()) + } } } } @@ -133,18 +145,39 @@ impl fmt::Display for OptionsError { impl Options { /// Convert command-line arguments into [`Options`]. fn from(matches: &ArgMatches) -> Result { + let include = matches.values_of_lossy(OPT_TYPE); + let exclude = matches.values_of_lossy(OPT_EXCLUDE_TYPE); + + if let (Some(include), Some(exclude)) = (&include, &exclude) { + if let Some(types) = Self::get_intersected_types(include, exclude) { + return Err(OptionsError::FilesystemTypeBothSelectedAndExcluded(types)); + } + } + Ok(Self { show_local_fs: matches.is_present(OPT_LOCAL), show_all_fs: matches.is_present(OPT_ALL), show_listed_fs: false, block_size: block_size_from_matches(matches) .map_err(|_| OptionsError::InvalidBlockSize)?, - include: matches.values_of_lossy(OPT_TYPE), - exclude: matches.values_of_lossy(OPT_EXCLUDE_TYPE), + include, + exclude, show_total: matches.is_present(OPT_TOTAL), columns: Column::from_matches(matches).map_err(OptionsError::ColumnError)?, }) } + + fn get_intersected_types(include: &[String], exclude: &[String]) -> Option> { + let mut intersected_types = Vec::new(); + + for t in include { + if exclude.contains(t) { + intersected_types.push(t.clone()); + } + } + + (!intersected_types.is_empty()).then(|| intersected_types) + } } /// Whether to display the mount info given the inclusion settings. @@ -708,22 +741,6 @@ mod tests { let m = mount_info("ext4", "/mnt/foo", false, false); assert!(is_included(&m, &opt)); } - - #[test] - fn test_include_and_exclude_match_both() { - // TODO The same filesystem type in both `include` and - // `exclude` should cause an error, but currently does - // not. - let include = Some(vec![String::from("ext4")]); - let exclude = Some(vec![String::from("ext4")]); - let opt = Options { - include, - exclude, - ..Default::default() - }; - let m = mount_info("ext4", "/mnt/foo", false, false); - assert!(!is_included(&m, &opt)); - } } mod filter_mount_list { diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index b0ee8a2b3a7..fa77a809657 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -95,6 +95,21 @@ fn test_exclude_type_option() { new_ucmd!().args(&["-x", "ext4", "-x", "ext3"]).succeeds(); } +#[test] +fn test_include_exclude_same_type() { + new_ucmd!() + .args(&["-t", "ext4", "-x", "ext4"]) + .fails() + .stderr_is("df: file system type 'ext4' both selected and excluded"); + new_ucmd!() + .args(&["-t", "ext4", "-x", "ext4", "-t", "ext3", "-x", "ext3"]) + .fails() + .stderr_is( + "df: file system type 'ext4' both selected and excluded\n\ + df: file system type 'ext3' both selected and excluded", + ); +} + #[test] fn test_total() { // Example output: From e894e40c56b2d1baf217a649f1b3b347a3565215 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kai=20L=C3=BCke?= Date: Wed, 6 Apr 2022 09:09:37 +0200 Subject: [PATCH 037/242] hashsum: add --no-names option from official b3sum tool (#3361) * hashsum: add --no-names option from official b3sum tool The official b3sum tool has a --no-names option for only printing the hashes, omitting the filenames. This is quite handy when used from scripts because it spares the postprocessing with "cut" or "awk". Since the installed b3sum symlink would also serve as a drop-in for the official tool, the --no-names option is expected to exist for compatibility. Add a --no-names option not only for b3sum but for hashsum in general (and maybe GNU coreutils will also feel inspired to add this option). Closes https://github.com/uutils/coreutils/issues/3360 --- src/uu/hashsum/src/hashsum.rs | 12 +++++++++++- tests/by-util/test_hashsum.rs | 12 +++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/uu/hashsum/src/hashsum.rs b/src/uu/hashsum/src/hashsum.rs index 722585033a8..244e4b9289c 100644 --- a/src/uu/hashsum/src/hashsum.rs +++ b/src/uu/hashsum/src/hashsum.rs @@ -7,7 +7,7 @@ // * For the full copyright and license information, please view the LICENSE // * file that was distributed with this source code. -// spell-checker:ignore (ToDO) algo, algoname, regexes, nread +// spell-checker:ignore (ToDO) algo, algoname, regexes, nread, nonames #[macro_use] extern crate clap; @@ -46,6 +46,7 @@ struct Options { binary: bool, check: bool, tag: bool, + nonames: bool, status: bool, quiet: bool, strict: bool, @@ -316,6 +317,7 @@ pub fn uumain(mut args: impl uucore::Args) -> UResult<()> { }; let check = matches.is_present("check"); let tag = matches.is_present("tag"); + let nonames = matches.is_present("no-names"); let status = matches.is_present("status"); let quiet = matches.is_present("quiet") || status; let strict = matches.is_present("strict"); @@ -328,6 +330,7 @@ pub fn uumain(mut args: impl uucore::Args) -> UResult<()> { binary, check, tag, + nonames, status, quiet, strict, @@ -370,6 +373,11 @@ pub fn uu_app_common<'a>() -> Command<'a> { .long("tag") .help("create a BSD-style checksum"), ) + .arg( + Arg::new("no-names") + .long("no-names") + .help("Omits filenames in the output (option not present in GNU/Coreutils)"), + ) .arg( Arg::new("text") .short('t') @@ -602,6 +610,8 @@ where .map_err_context(|| "failed to read input".to_string())?; if options.tag { println!("{} ({}) = {}", options.algoname, filename.display(), sum); + } else if options.nonames { + println!("{}", sum); } else { println!("{} {}{}", sum, binary_marker, filename.display()); } diff --git a/tests/by-util/test_hashsum.rs b/tests/by-util/test_hashsum.rs index 293270a777d..160798f36d9 100644 --- a/tests/by-util/test_hashsum.rs +++ b/tests/by-util/test_hashsum.rs @@ -1,4 +1,4 @@ -// spell-checker:ignore checkfile +// spell-checker:ignore checkfile, nonames macro_rules! get_hash( ($str:expr) => ( $str.split(' ').collect::>()[0] @@ -29,6 +29,16 @@ macro_rules! test_digest { get_hash!(ts.ucmd().arg(DIGEST_ARG).arg(BITS_ARG).pipe_in_fixture("input.txt").succeeds().no_stderr().stdout_str())); } + #[test] + fn test_nonames() { + let ts = TestScenario::new("hashsum"); + // EXPECTED_FILE has no newline character at the end + assert_eq!(format!("{0}\n{0}\n", ts.fixtures.read(EXPECTED_FILE)), + ts.ucmd().arg(DIGEST_ARG).arg(BITS_ARG).arg("--no-names").arg("input.txt").arg("-").pipe_in_fixture("input.txt") + .succeeds().no_stderr().stdout_str() + ); + } + #[test] fn test_check() { let ts = TestScenario::new("hashsum"); From bd95daf634d2a65a307f39164de692c1ea8162ac Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Wed, 6 Apr 2022 09:17:50 +0200 Subject: [PATCH 038/242] remaining-gnu-error.py: fix an error when mismatches --- util/remaining-gnu-error.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/remaining-gnu-error.py b/util/remaining-gnu-error.py index 5be7e784c13..ea745c658e3 100755 --- a/util/remaining-gnu-error.py +++ b/util/remaining-gnu-error.py @@ -37,7 +37,7 @@ a = a.replace(".pl", ".xpl") # the tests pass, we don't care anymore - if data[d][e] == "PASS": + if data[d][e] == "PASS" and a in list_of_files: list_of_files.remove(a) # Remove the factor tests and reverse the list (bigger first) From d48e533a57917eae6e7ab3c4f9aca5cc13ef4009 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Wed, 6 Apr 2022 09:24:20 +0200 Subject: [PATCH 039/242] remaining-gnu-error.py: fix an error when mismatche for real --- util/remaining-gnu-error.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/util/remaining-gnu-error.py b/util/remaining-gnu-error.py index ea745c658e3..0209c6e675a 100755 --- a/util/remaining-gnu-error.py +++ b/util/remaining-gnu-error.py @@ -37,8 +37,12 @@ a = a.replace(".pl", ".xpl") # the tests pass, we don't care anymore - if data[d][e] == "PASS" and a in list_of_files: - list_of_files.remove(a) + if data[d][e] == "PASS": + try: + list_of_files.remove(a) + except ValueError: + # Ignore the error + pass # Remove the factor tests and reverse the list (bigger first) tests = list(filter(lambda k: "factor" not in k, list_of_files)) From 97c6f6ac49a7c5f6ed30705d5f1d7dfbe5e1796a Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Tue, 5 Apr 2022 23:20:16 +0200 Subject: [PATCH 040/242] Update of the build-gnu tool to fix usage_vs_getopt.sh --- util/build-gnu.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/util/build-gnu.sh b/util/build-gnu.sh index 924d14d251c..ed572468f35 100755 --- a/util/build-gnu.sh +++ b/util/build-gnu.sh @@ -171,13 +171,20 @@ sed -i "s/ {ERR_SUBST=>\"s\/(unrecognized|unknown) option \[-' \]\*foobar\[' \] # Remove the check whether a util was built. Otherwise tests against utils like "arch" are not run. sed -i "s|require_built_ |# require_built_ |g" init.cfg +# usage_vs_getopt.sh is heavily modified as it runs all the binaries # with the option -/ is used, clap is returning a better error than GNU's. Adjust the GNU test sed -i -e "s~ grep \" '\*/'\*\" err || framework_failure_~ grep \" '*-/'*\" err || framework_failure_~" tests/misc/usage_vs_getopt.sh sed -i -e "s~ sed -n \"1s/'\\\/'/'OPT'/p\" < err >> pat || framework_failure_~ sed -n \"1s/'-\\\/'/'OPT'/p\" < err >> pat || framework_failure_~" tests/misc/usage_vs_getopt.sh # Ignore some binaries (not built) # And change the default error code to 2 # see issue #3331 -sed -i -e "s/rcexp=1$/rcexp=2\n case \"\$prg\" in chcon|dir|runcon|vdir) return;; esac/" tests/misc/usage_vs_getopt.sh +sed -i -e "s/rcexp=1$/rcexp=2\n case \"\$prg\" in chcon|dir|runcon|vdir) return;; esac/" -e "s/rcexp=125 ;;/rcexp=2 ;;\ncp|pr|truncate ) rcexp=1;;\npr ) rcexp=130;;/" tests/misc/usage_vs_getopt.sh +# GNU has option=[SUFFIX], clap is +sed -i -e "s/cat opts/sed -i -e \"s| <.\*>$||g\" opts/" tests/misc/usage_vs_getopt.sh +# Strip empty lines for the diff - see https://github.com/uutils/coreutils/issues/3370 +sed -i -e "s~out 2>err1~out 2>err1\nsed '/^$/d' out > out\nsed '/^$/d' help > help~" tests/misc/usage_vs_getopt.sh +# for some reasons, some stuff are duplicated, strip that +sed -i -e "s/provoked error./provoked error\ncat pat |sort -u > pat/" tests/misc/usage_vs_getopt.sh # Update the GNU error message to match ours sed -i -e "s/ln: 'f' and 'f' are the same file/ln: failed to link 'f' to 'f': Same file/g" tests/ln/hard-backup.sh From 465c1c1c9d7c102b4d35eb8c228565dbf8d35910 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Wed, 6 Apr 2022 11:03:13 +0200 Subject: [PATCH 041/242] remaining-gnu-error.py: simplify the code --- util/remaining-gnu-error.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/util/remaining-gnu-error.py b/util/remaining-gnu-error.py index 0209c6e675a..5dbe120d490 100755 --- a/util/remaining-gnu-error.py +++ b/util/remaining-gnu-error.py @@ -15,11 +15,11 @@ "result.json", ) -tests = glob.glob(base + "/*/*.sh") -tests_pl = glob.glob(base + "/*/*.pl") -tests_xpl = glob.glob(base + "/*/*.xpl") -tests = tests + tests_pl + tests_xpl +types = ("/*/*.sh", "/*/*.pl", "/*/*.xpl") +tests = [] +for files in types: + tests.extend(glob.glob(base + files)) # sort by size list_of_files = sorted(tests, key=lambda x: os.stat(x).st_size) @@ -38,11 +38,7 @@ # the tests pass, we don't care anymore if data[d][e] == "PASS": - try: - list_of_files.remove(a) - except ValueError: - # Ignore the error - pass + list_of_files.remove(a) # Remove the factor tests and reverse the list (bigger first) tests = list(filter(lambda k: "factor" not in k, list_of_files)) From 2e996e59f30af4b4738a550086781687d612980b Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Wed, 6 Apr 2022 11:03:27 +0200 Subject: [PATCH 042/242] remaining-gnu-error.py: add missing slash --- util/remaining-gnu-error.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/remaining-gnu-error.py b/util/remaining-gnu-error.py index 5dbe120d490..edfb2a84624 100755 --- a/util/remaining-gnu-error.py +++ b/util/remaining-gnu-error.py @@ -30,7 +30,7 @@ for e in data[d]: # Not all the tests are .sh files, rename them if not. script = e.replace(".log", ".sh") - a = f"{base}{d}{script}" + a = f"{base}{d}/{script}" if not os.path.exists(a): a = a.replace(".sh", ".pl") if not os.path.exists(a): From 31faf86cdb94d652cc7a3dd9cfda60589d9bd58f Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Wed, 6 Apr 2022 11:49:00 +0200 Subject: [PATCH 043/242] Don't provide features for testing individual utilities With the Rust 2021 feature resolver, adding a feature like `--features=feat_os_unix` results in an error, because the individual crates do not have that feature. --- .github/workflows/CICD.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml index 08803afb14d..63ba9aab03a 100644 --- a/.github/workflows/CICD.yml +++ b/.github/workflows/CICD.yml @@ -759,7 +759,7 @@ jobs: with: use-cross: ${{ steps.vars.outputs.CARGO_USE_CROSS }} command: test - args: --target=${{ matrix.job.target }} ${{ steps.vars.outputs.CARGO_TEST_OPTIONS}} ${{ matrix.job.cargo-options }} ${{ steps.vars.outputs.CARGO_FEATURES_OPTION }} ${{ steps.dep_vars.outputs.CARGO_UTILITY_LIST_OPTIONS }} + args: --target=${{ matrix.job.target }} ${{ steps.vars.outputs.CARGO_TEST_OPTIONS}} ${{ matrix.job.cargo-options }} ${{ steps.dep_vars.outputs.CARGO_UTILITY_LIST_OPTIONS }} toolchain: ${{ env.RUST_MIN_SRV }} - name: Archive executable artifacts uses: actions/upload-artifact@v2 From 757b1611643cf31374c03159841012d3602a7915 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Wed, 6 Apr 2022 13:59:44 +0200 Subject: [PATCH 044/242] match more the GNU behavior on error code --- util/build-gnu.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/util/build-gnu.sh b/util/build-gnu.sh index ed572468f35..a4a33e8604f 100755 --- a/util/build-gnu.sh +++ b/util/build-gnu.sh @@ -177,8 +177,10 @@ sed -i -e "s~ grep \" '\*/'\*\" err || framework_failure_~ grep \" '*-/'*\" er sed -i -e "s~ sed -n \"1s/'\\\/'/'OPT'/p\" < err >> pat || framework_failure_~ sed -n \"1s/'-\\\/'/'OPT'/p\" < err >> pat || framework_failure_~" tests/misc/usage_vs_getopt.sh # Ignore some binaries (not built) # And change the default error code to 2 -# see issue #3331 -sed -i -e "s/rcexp=1$/rcexp=2\n case \"\$prg\" in chcon|dir|runcon|vdir) return;; esac/" -e "s/rcexp=125 ;;/rcexp=2 ;;\ncp|pr|truncate ) rcexp=1;;\npr ) rcexp=130;;/" tests/misc/usage_vs_getopt.sh +# see issue #3331 (clap limitation). +# Upstream returns 1 for most of the program. We do for cp, truncate & pr +# So, keep it as it +sed -i -e "s/rcexp=1$/rcexp=2\n case \"\$prg\" in chcon|dir|runcon|vdir) return;; esac/" -e "s/rcexp=125 ;;/rcexp=2 ;;\ncp|truncate|pr) rcexp=1;;/" tests/misc/usage_vs_getopt.sh # GNU has option=[SUFFIX], clap is sed -i -e "s/cat opts/sed -i -e \"s| <.\*>$||g\" opts/" tests/misc/usage_vs_getopt.sh # Strip empty lines for the diff - see https://github.com/uutils/coreutils/issues/3370 From aae298f9a4a3f4dacd21f5074d1a49306f51a7f0 Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Wed, 6 Apr 2022 23:23:35 +0200 Subject: [PATCH 045/242] Don't pass features when testing individual utils in uucore --- .github/workflows/CICD.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml index 63ba9aab03a..d4f34681c15 100644 --- a/.github/workflows/CICD.yml +++ b/.github/workflows/CICD.yml @@ -994,7 +994,7 @@ jobs: uses: actions-rs/cargo@v1 with: command: test - args: ${{ steps.vars.outputs.CARGO_FEATURES_OPTION }} --no-fail-fast -p uucore + args: --no-fail-fast -p uucore env: CARGO_INCREMENTAL: "0" RUSTC_WRAPPER: "" @@ -1016,7 +1016,7 @@ jobs: uses: actions-rs/cargo@v1 with: command: test - args: ${{ steps.vars.outputs.CARGO_FEATURES_OPTION }} --no-fail-fast ${{ steps.dep_vars.outputs.CARGO_UTILITY_LIST_OPTIONS }} + args: --no-fail-fast ${{ steps.dep_vars.outputs.CARGO_UTILITY_LIST_OPTIONS }} env: CARGO_INCREMENTAL: "0" RUSTC_WRAPPER: "" From 54b2fe700b7d587fd93fdc2c62755b4bf30c4315 Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Thu, 7 Apr 2022 11:05:20 +0200 Subject: [PATCH 046/242] fix regressed test due to lscolors update --- tests/by-util/test_ls.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/by-util/test_ls.rs b/tests/by-util/test_ls.rs index f60d53b6e5c..dd362208bb4 100644 --- a/tests/by-util/test_ls.rs +++ b/tests/by-util/test_ls.rs @@ -894,7 +894,7 @@ fn test_ls_long_symlink_color() { (Some([0, 0]), "ln-file1", None, "dir1/file1"), (Some([1, 1]), "ln-dir-invalid", Some([1, 1]), "dir1/dir2"), (Some([0, 0]), "ln-root", Some([0, 1]), "/"), - (Some([0, 0]), "ln-up2", Some([0, 1]), "../.."), + (Some([0, 0]), "ln-up2", None, "../.."), ]; // We are only interested in lines or the ls output that are symlinks. These start with "lrwx". @@ -912,6 +912,8 @@ fn test_ls_long_symlink_color() { while let Some((i, name, target)) = get_index_name_target(&mut result_lines) { // The unwraps within capture_colored_string will panic if the name/target's color // format is invalid. + dbg!(&name); + dbg!(&target); let (matched_name_color, matched_name) = capture_colored_string(&name); let (matched_target_color, matched_target) = capture_colored_string(&target); @@ -934,6 +936,7 @@ fn test_ls_long_symlink_color() { // Keep in mind an expected color `Option<&str>` of None can mean either that we // don't expect any color here, as in `expected_output[2], or don't know what specific // color to expect yet, as in expected_output[0:1]. + dbg!(&colors); assert_names_and_colors_are_equal( matched_name_color, expected_name_color, From 3c09c747dd4c38946245288b2cb1395cdc7279c1 Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Thu, 7 Apr 2022 15:12:21 +0200 Subject: [PATCH 047/242] docs: show platforms for each util --- docs/theme/head.hbs | 11 +- src/bin/uudoc.rs | 336 +++++++++++++++++++++++++++----------------- 2 files changed, 218 insertions(+), 129 deletions(-) diff --git a/docs/theme/head.hbs b/docs/theme/head.hbs index 31cc2dad5f6..f4c02148093 100644 --- a/docs/theme/head.hbs +++ b/docs/theme/head.hbs @@ -5,10 +5,17 @@ main { position: relative; } - .version { + .additional { position: absolute; - top: 1em; + top: 0em; right: 0; + display: flex; + gap: 5px; + align-items: center; + font-size: 1.3em; + } + .platforms { + font-size: 1.5em; } dd > p { margin-top: 0.2em; diff --git a/src/bin/uudoc.rs b/src/bin/uudoc.rs index 24c347fe7d2..53e31519f71 100644 --- a/src/bin/uudoc.rs +++ b/src/bin/uudoc.rs @@ -5,6 +5,7 @@ // spell-checker:ignore tldr use clap::Command; +use std::collections::HashMap; use std::ffi::OsString; use std::fs::File; use std::io::Cursor; @@ -29,6 +30,7 @@ fn main() -> io::Result<()> { x => x, }?; + println!("Writing initial info to SUMMARY.md"); let mut summary = File::create("docs/src/SUMMARY.md")?; let _ = write!( @@ -44,6 +46,40 @@ fn main() -> io::Result<()> { * [Multi-call binary](multicall.md)\n", ); + println!("Gathering utils per platform"); + let utils_per_platform = { + let mut map = HashMap::new(); + for platform in ["unix", "macos", "windows"] { + let platform_utils: Vec = String::from_utf8( + std::process::Command::new("./util/show-utils.sh") + .arg(format!("--features=feat_os_{}", platform)) + .output()? + .stdout, + ) + .unwrap() + .split(' ') + .map(ToString::to_string) + .collect(); + map.insert(platform, platform_utils); + } + + // Linux is a special case because it can support selinux + let platform_utils: Vec = String::from_utf8( + std::process::Command::new("./util/show-utils.sh") + .arg("--features=feat_os_unix feat_selinux") + .output()? + .stdout, + ) + .unwrap() + .split(' ') + .map(ToString::to_string) + .collect(); + map.insert("linux", platform_utils); + + map + }; + + println!("Writing to utils"); let mut utils = utils.entries().collect::>(); utils.sort(); for (&name, (_, command)) in utils { @@ -52,7 +88,14 @@ fn main() -> io::Result<()> { } let p = format!("docs/src/utils/{}.md", name); if let Ok(f) = File::create(&p) { - write_markdown(f, &mut command(), name, &mut tldr_zip)?; + MDWriter { + w: Box::new(f), + command: command(), + name, + tldr_zip: &mut tldr_zip, + utils_per_platform: &utils_per_platform, + } + .markdown()?; println!("Wrote to '{}'", p); } else { println!("Error writing to {}", p); @@ -62,150 +105,189 @@ fn main() -> io::Result<()> { Ok(()) } -fn write_markdown( - mut w: impl Write, - command: &mut Command, - name: &str, - tldr_zip: &mut zip::ZipArchive, -) -> io::Result<()> { - write!(w, "# {}\n\n", name)?; - write_version(&mut w, command)?; - write_usage(&mut w, command, name)?; - write_description(&mut w, command)?; - write_options(&mut w, command)?; - write_examples(&mut w, name, tldr_zip) +struct MDWriter<'a, 'b> { + w: Box, + command: Command<'a>, + name: &'a str, + tldr_zip: &'b mut ZipArchive>>, + utils_per_platform: &'b HashMap<&'b str, Vec>, } -fn write_version(w: &mut impl Write, command: &Command) -> io::Result<()> { - writeln!( - w, - "
version: {}
", - command.render_version().split_once(' ').unwrap().1 - ) -} +impl<'a, 'b> MDWriter<'a, 'b> { + fn markdown(&mut self) -> io::Result<()> { + write!(self.w, "# {}\n\n", self.name)?; + self.additional()?; + self.usage()?; + self.description()?; + self.options()?; + self.examples() + } -fn write_usage(w: &mut impl Write, command: &mut Command, name: &str) -> io::Result<()> { - writeln!(w, "\n```")?; - let mut usage: String = command - .render_usage() - .lines() - .skip(1) - .map(|l| l.trim()) - .filter(|l| !l.is_empty()) - .collect::>() - .join("\n"); - usage = usage.replace(uucore::execution_phrase(), name); - writeln!(w, "{}", usage)?; - writeln!(w, "```") -} + fn additional(&mut self) -> io::Result<()> { + writeln!(self.w, "
")?; + self.platforms()?; + self.version()?; + writeln!(self.w, "
") + } + + fn platforms(&mut self) -> io::Result<()> { + writeln!(self.w, "
")?; + for (feature, icon) in [ + ("linux", "linux"), + // freebsd is disabled for now because mdbook does not use font-awesome 5 yet. + // ("unix", "freebsd"), + ("macos", "apple"), + ("windows", "windows"), + ] { + if self.name.contains("sum") + || self.utils_per_platform[feature] + .iter() + .any(|u| u == self.name) + { + writeln!(self.w, "", icon)?; + } + } + writeln!(self.w, "
")?; -fn write_description(w: &mut impl Write, command: &Command) -> io::Result<()> { - if let Some(about) = command.get_long_about().or_else(|| command.get_about()) { - writeln!(w, "{}", about) - } else { Ok(()) } -} -fn write_examples( - w: &mut impl Write, - name: &str, - tldr_zip: &mut zip::ZipArchive, -) -> io::Result<()> { - let content = if let Some(f) = get_zip_content(tldr_zip, &format!("pages/common/{}.md", name)) { - f - } else if let Some(f) = get_zip_content(tldr_zip, &format!("pages/linux/{}.md", name)) { - f - } else { - return Ok(()); - }; + fn version(&mut self) -> io::Result<()> { + writeln!( + self.w, + "
v{}
", + self.command.render_version().split_once(' ').unwrap().1 + ) + } - writeln!(w, "## Examples")?; - writeln!(w)?; - for line in content.lines().skip_while(|l| !l.starts_with('-')) { - if let Some(l) = line.strip_prefix("- ") { - writeln!(w, "{}", l)?; - } else if line.starts_with('`') { - writeln!(w, "```shell\n{}\n```", line.trim_matches('`'))?; - } else if line.is_empty() { - writeln!(w)?; + fn usage(&mut self) -> io::Result<()> { + writeln!(self.w, "\n```")?; + let mut usage: String = self + .command + .render_usage() + .lines() + .skip(1) + .map(|l| l.trim()) + .filter(|l| !l.is_empty()) + .collect::>() + .join("\n"); + usage = usage.replace(uucore::execution_phrase(), self.name); + writeln!(self.w, "{}", usage)?; + writeln!(self.w, "```") + } + + fn description(&mut self) -> io::Result<()> { + if let Some(about) = self + .command + .get_long_about() + .or_else(|| self.command.get_about()) + { + writeln!(self.w, "{}", about) } else { - println!("Not sure what to do with this line:"); - println!("{}", line); + Ok(()) } } - writeln!(w)?; - writeln!( - w, - "> The examples are provided by the [tldr-pages project](https://tldr.sh) under the [CC BY 4.0 License](https://github.com/tldr-pages/tldr/blob/main/LICENSE.md)." - )?; - writeln!(w, ">")?; - writeln!( - w, - "> Please note that, as uutils is a work in progress, some examples might fail." - ) -} -fn get_zip_content(archive: &mut ZipArchive, name: &str) -> Option { - let mut s = String::new(); - archive.by_name(name).ok()?.read_to_string(&mut s).unwrap(); - Some(s) -} + fn examples(&mut self) -> io::Result<()> { + let content = if let Some(f) = + get_zip_content(self.tldr_zip, &format!("pages/common/{}.md", self.name)) + { + f + } else if let Some(f) = + get_zip_content(self.tldr_zip, &format!("pages/linux/{}.md", self.name)) + { + f + } else { + return Ok(()); + }; -fn write_options(w: &mut impl Write, command: &Command) -> io::Result<()> { - writeln!(w, "

Options

")?; - write!(w, "
")?; - for arg in command.get_arguments() { - write!(w, "
")?; - let mut first = true; - for l in arg.get_long_and_visible_aliases().unwrap_or_default() { - if !first { - write!(w, ", ")?; + writeln!(self.w, "## Examples")?; + writeln!(self.w)?; + for line in content.lines().skip_while(|l| !l.starts_with('-')) { + if let Some(l) = line.strip_prefix("- ") { + writeln!(self.w, "{}", l)?; + } else if line.starts_with('`') { + writeln!(self.w, "```shell\n{}\n```", line.trim_matches('`'))?; + } else if line.is_empty() { + writeln!(self.w)?; } else { - first = false; + println!("Not sure what to do with this line:"); + println!("{}", line); } - write!(w, "")?; - write!(w, "--{}", l)?; - if let Some(names) = arg.get_value_names() { - write!( - w, - "={}", - names - .iter() - .map(|x| format!("<{}>", x)) - .collect::>() - .join(" ") - )?; - } - write!(w, "")?; } - for s in arg.get_short_and_visible_aliases().unwrap_or_default() { - if !first { - write!(w, ", ")?; - } else { - first = false; + writeln!(self.w)?; + writeln!( + self.w, + "> The examples are provided by the [tldr-pages project](https://tldr.sh) under the [CC BY 4.0 License](https://github.com/tldr-pages/tldr/blob/main/LICENSE.md)." + )?; + writeln!(self.w, ">")?; + writeln!( + self.w, + "> Please note that, as uutils is a work in progress, some examples might fail." + ) + } + + fn options(&mut self) -> io::Result<()> { + writeln!(self.w, "

Options

")?; + write!(self.w, "
")?; + for arg in self.command.get_arguments() { + write!(self.w, "
")?; + let mut first = true; + for l in arg.get_long_and_visible_aliases().unwrap_or_default() { + if !first { + write!(self.w, ", ")?; + } else { + first = false; + } + write!(self.w, "")?; + write!(self.w, "--{}", l)?; + if let Some(names) = arg.get_value_names() { + write!( + self.w, + "={}", + names + .iter() + .map(|x| format!("<{}>", x)) + .collect::>() + .join(" ") + )?; + } + write!(self.w, "")?; } - write!(w, "")?; - write!(w, "-{}", s)?; - if let Some(names) = arg.get_value_names() { - write!( - w, - " {}", - names - .iter() - .map(|x| format!("<{}>", x)) - .collect::>() - .join(" ") - )?; + for s in arg.get_short_and_visible_aliases().unwrap_or_default() { + if !first { + write!(self.w, ", ")?; + } else { + first = false; + } + write!(self.w, "")?; + write!(self.w, "-{}", s)?; + if let Some(names) = arg.get_value_names() { + write!( + self.w, + " {}", + names + .iter() + .map(|x| format!("<{}>", x)) + .collect::>() + .join(" ") + )?; + } + write!(self.w, "")?; } - write!(w, "")?; + writeln!(self.w, "
")?; + writeln!( + self.w, + "
\n\n{}\n\n
", + arg.get_help().unwrap_or_default().replace('\n', "
") + )?; } - writeln!(w, "
")?; - writeln!( - w, - "
\n\n{}\n\n
", - arg.get_help().unwrap_or_default().replace('\n', "
") - )?; + writeln!(self.w, "
\n") } - writeln!(w, "\n") +} + +fn get_zip_content(archive: &mut ZipArchive, name: &str) -> Option { + let mut s = String::new(); + archive.by_name(name).ok()?.read_to_string(&mut s).unwrap(); + Some(s) } From 7192856da4d26bb182c9583be3cb45e22d895201 Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Sat, 9 Apr 2022 00:15:59 -0400 Subject: [PATCH 048/242] tests: print stdout in error msg for no_stdout() Fix a bug in which the error message displayed when using `CmdResult::no_stdout()` was incorrectly showing stderr when it should have been showing stdout. --- tests/common/util.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/common/util.rs b/tests/common/util.rs index 5e1424ca423..ae93af20dfa 100644 --- a/tests/common/util.rs +++ b/tests/common/util.rs @@ -221,7 +221,7 @@ impl CmdResult { assert!( self.stdout.is_empty(), "Expected stdout to be empty, but it's:\n{}", - self.stderr_str() + self.stdout_str() ); self } From a2cefd9b52ef12821b5b944f216d863b04e8943c Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sat, 9 Apr 2022 23:46:01 +0200 Subject: [PATCH 049/242] du: Return non zero error code when dealing with permissions errors Nd make the tests/du/no-x.sh & long-sloop.sh pass --- src/uu/du/src/du.rs | 9 +++++++-- tests/by-util/test_du.rs | 17 ++++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/uu/du/src/du.rs b/src/uu/du/src/du.rs index 5a2e3ada191..2c3dfceae21 100644 --- a/src/uu/du/src/du.rs +++ b/src/uu/du/src/du.rs @@ -31,7 +31,7 @@ use std::str::FromStr; use std::time::{Duration, UNIX_EPOCH}; use std::{error::Error, fmt::Display}; use uucore::display::{print_verbatim, Quotable}; -use uucore::error::{UError, UResult}; +use uucore::error::{set_exit_code, UError, UResult}; use uucore::format_usage; use uucore::parse_size::{parse_size, ParseSizeError}; use uucore::InvalidEncodingHandling; @@ -301,6 +301,7 @@ fn du( my_stat.path.quote(), e ); + set_exit_code(1); return Box::new(iter::once(my_stat)); } }; @@ -340,8 +341,12 @@ fn du( let description = format!("cannot access {}", entry.path().quote()); let error_message = "Permission denied"; show_error_custom_description!(description, "{}", error_message); + set_exit_code(1); + } + _ => { + set_exit_code(1); + show_error!("cannot access {}: {}", entry.path().quote(), error); } - _ => show_error!("cannot access {}: {}", entry.path().quote(), error), }, }, Err(error) => show_error!("{}", error), diff --git a/tests/by-util/test_du.rs b/tests/by-util/test_du.rs index b0506d07124..415a64ac753 100644 --- a/tests/by-util/test_du.rs +++ b/tests/by-util/test_du.rs @@ -429,7 +429,7 @@ fn test_du_no_permission() { ts.ccmd("chmod").arg("-r").arg(SUB_DIR_LINKS).succeeds(); - let result = ts.ucmd().arg(SUB_DIR_LINKS).run(); // TODO: replace with ".fails()" once `du` is fixed + let result = ts.ucmd().arg(SUB_DIR_LINKS).fails(); result.stderr_contains( "du: cannot read directory 'subdir/links': Permission denied (os error 13)", ); @@ -449,6 +449,21 @@ fn test_du_no_permission() { _du_no_permission(result.stdout_str()); } +#[cfg(not(target_os = "windows"))] +#[cfg(feature = "chmod")] +#[test] +fn test_du_no_exec_permission() { + let ts = TestScenario::new(util_name!()); + let at = &ts.fixtures; + + at.mkdir_all("d/no-x/y"); + + ts.ccmd("chmod").arg("u=rw").arg("d/no-x").succeeds(); + + let result = ts.ucmd().arg("d/no-x").fails(); + result.stderr_contains("du: cannot access 'd/no-x/y': Permission denied"); +} + #[cfg(target_vendor = "apple")] fn _du_no_permission(s: &str) { assert_eq!(s, "0\tsubdir/links\n"); From 79f12660178722487d898feb95d81eecdfe2b77c Mon Sep 17 00:00:00 2001 From: Marvin Schmidt Date: Wed, 9 Mar 2022 10:11:13 +0100 Subject: [PATCH 050/242] make: Remove MANDIR It's unused since commit 6cfed3bd ("make: no longer create INSTALLDIR_MAN") --- GNUmakefile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/GNUmakefile b/GNUmakefile index 281952736df..27b7fd254db 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -1,4 +1,4 @@ -# spell-checker:ignore (misc) testsuite runtest findstring (targets) busytest distclean manpages pkgs ; (vars/env) BINDIR BUILDDIR CARGOFLAGS DESTDIR DOCSDIR INSTALLDIR INSTALLEES MANDIR MULTICALL +# spell-checker:ignore (misc) testsuite runtest findstring (targets) busytest distclean manpages pkgs ; (vars/env) BINDIR BUILDDIR CARGOFLAGS DESTDIR DOCSDIR INSTALLDIR INSTALLEES MULTICALL # Config options PROFILE ?= debug @@ -23,7 +23,6 @@ CARGOFLAGS ?= PREFIX ?= /usr/local DESTDIR ?= BINDIR ?= /bin -MANDIR ?= /man/man1 INSTALLDIR_BIN=$(DESTDIR)$(PREFIX)$(BINDIR) From 66168bf06bca05542fe8c65154d6bd9ec642729c Mon Sep 17 00:00:00 2001 From: Marvin Schmidt Date: Wed, 9 Mar 2022 10:12:36 +0100 Subject: [PATCH 051/242] make: Include PREFIX in BINDIR --- GNUmakefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GNUmakefile b/GNUmakefile index 27b7fd254db..06c74b69450 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -22,9 +22,9 @@ CARGOFLAGS ?= # Install directories PREFIX ?= /usr/local DESTDIR ?= -BINDIR ?= /bin +BINDIR ?= $(PREFIX)/bin -INSTALLDIR_BIN=$(DESTDIR)$(PREFIX)$(BINDIR) +INSTALLDIR_BIN=$(DESTDIR)$(BINDIR) #prefix to apply to coreutils binary and all tool binaries PROG_PREFIX ?= From b00357a19cba38a37c7b3b0d15581f32d16394f4 Mon Sep 17 00:00:00 2001 From: Marvin Schmidt Date: Wed, 9 Mar 2022 10:12:43 +0100 Subject: [PATCH 052/242] make: Introduce DATAROOTDIR This makes it easier to install binaries into an arch-dependent directory (e.g. /usr/${host}/bin) while keeping arch-independent files like the shell completions under /usr/share by specifying e.g. PREFIX=/usr/${host} and DATAROOTDIR=/usr/share --- GNUmakefile | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/GNUmakefile b/GNUmakefile index 06c74b69450..35f56d9cfd1 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -23,6 +23,7 @@ CARGOFLAGS ?= PREFIX ?= /usr/local DESTDIR ?= BINDIR ?= $(PREFIX)/bin +DATAROOTDIR ?= $(PREFIX)/share INSTALLDIR_BIN=$(DESTDIR)$(BINDIR) @@ -327,13 +328,13 @@ else $(INSTALL) $(BUILDDIR)/$(prog) $(INSTALLDIR_BIN)/$(PROG_PREFIX)$(prog);) $(if $(findstring test,$(INSTALLEES)), $(INSTALL) $(BUILDDIR)/test $(INSTALLDIR_BIN)/$(PROG_PREFIX)[) endif - mkdir -p $(DESTDIR)$(PREFIX)/share/zsh/site-functions - mkdir -p $(DESTDIR)$(PREFIX)/share/bash-completion/completions - mkdir -p $(DESTDIR)$(PREFIX)/share/fish/vendor_completions.d + mkdir -p $(DESTDIR)$(DATAROOTDIR)/zsh/site-functions + mkdir -p $(DESTDIR)$(DATAROOTDIR)/bash-completion/completions + mkdir -p $(DESTDIR)$(DATAROOTDIR)/fish/vendor_completions.d $(foreach prog, $(INSTALLEES), \ - $(BUILDDIR)/coreutils completion $(prog) zsh > $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_$(PROG_PREFIX)$(prog); \ - $(BUILDDIR)/coreutils completion $(prog) bash > $(DESTDIR)$(PREFIX)/share/bash-completion/completions/$(PROG_PREFIX)$(prog); \ - $(BUILDDIR)/coreutils completion $(prog) fish > $(DESTDIR)$(PREFIX)/share/fish/vendor_completions.d/$(PROG_PREFIX)$(prog).fish; \ + $(BUILDDIR)/coreutils completion $(prog) zsh > $(DESTDIR)$(DATAROOTDIR)/zsh/site-functions/_$(PROG_PREFIX)$(prog); \ + $(BUILDDIR)/coreutils completion $(prog) bash > $(DESTDIR)$(DATAROOTDIR)/bash-completion/completions/$(PROG_PREFIX)$(prog); \ + $(BUILDDIR)/coreutils completion $(prog) fish > $(DESTDIR)$(DATAROOTDIR)/fish/vendor_completions.d/$(PROG_PREFIX)$(prog).fish; \ ) uninstall: @@ -342,8 +343,8 @@ ifeq (${MULTICALL}, y) endif rm -f $(addprefix $(INSTALLDIR_BIN)/$(PROG_PREFIX),$(PROGS)) rm -f $(INSTALLDIR_BIN)/$(PROG_PREFIX)[ - rm -f $(addprefix $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_$(PROG_PREFIX),$(PROGS)) - rm -f $(addprefix $(DESTDIR)$(PREFIX)/share/bash-completion/completions/$(PROG_PREFIX),$(PROGS)) - rm -f $(addprefix $(DESTDIR)$(PREFIX)/share/fish/vendor_completions.d/$(PROG_PREFIX),$(addsuffix .fish,$(PROGS))) + rm -f $(addprefix $(DESTDIR)$(DATAROOTDIR)/zsh/site-functions/_$(PROG_PREFIX),$(PROGS)) + rm -f $(addprefix $(DESTDIR)$(DATAROOTDIR)/bash-completion/completions/$(PROG_PREFIX),$(PROGS)) + rm -f $(addprefix $(DESTDIR)$(DATAROOTDIR)/fish/vendor_completions.d/$(PROG_PREFIX),$(addsuffix .fish,$(PROGS))) .PHONY: all build build-coreutils build-pkgs test distclean clean busytest install uninstall From cfc87b684cd11871ca56b0699e5f55192f40153b Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sun, 10 Apr 2022 18:28:20 +0200 Subject: [PATCH 053/242] Update GNUmakefile --- GNUmakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GNUmakefile b/GNUmakefile index 35f56d9cfd1..ade50214068 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -1,4 +1,4 @@ -# spell-checker:ignore (misc) testsuite runtest findstring (targets) busytest distclean manpages pkgs ; (vars/env) BINDIR BUILDDIR CARGOFLAGS DESTDIR DOCSDIR INSTALLDIR INSTALLEES MULTICALL +# spell-checker:ignore (misc) testsuite runtest findstring (targets) busytest distclean manpages pkgs ; (vars/env) BINDIR BUILDDIR CARGOFLAGS DESTDIR DOCSDIR INSTALLDIR INSTALLEES MULTICALL DATAROOTDIR # Config options PROFILE ?= debug From c5413167e25a8865d52b5edf5d24e8944ed8b89c Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Sat, 9 Apr 2022 12:40:52 -0400 Subject: [PATCH 054/242] df: correct --total argument used in unit test Add a missing dash to the `--total` argument applied in the `test_df_output` test case. Before this commit, the argument `-total` was treated as a path argument. After this commit, `--total` is treated as a command-line option that causes the total file usage to be displayed. --- tests/by-util/test_df.rs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index fa77a809657..a88212146cc 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -28,16 +28,18 @@ fn test_df_compatible_si() { #[test] fn test_df_output() { - // TODO These should fail because `-total` should have two dashes, - // not just one. But they don't fail. - if cfg!(target_os = "macos") { - new_ucmd!().arg("-H").arg("-total").succeeds(). - stdout_only("Filesystem Size Used Available Capacity Use% Mounted on \n"); + let expected = if cfg!(target_os = "macos") { + "Filesystem Size Used Available Capacity Use% Mounted on " } else { - new_ucmd!().arg("-H").arg("-total").succeeds().stdout_only( - "Filesystem Size Used Available Use% Mounted on \n", - ); - } + "Filesystem Size Used Available Use% Mounted on " + }; + let output = new_ucmd!() + .arg("-H") + .arg("--total") + .succeeds() + .stdout_move_str(); + let actual = output.lines().take(1).collect::>()[0]; + assert_eq!(actual, expected); } /// Test that the order of rows in the table does not change across executions. From 460bd6705069f6051137236d87b3bff957ac4325 Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Sat, 9 Apr 2022 00:17:32 -0400 Subject: [PATCH 055/242] df: show error when file argument does not exist For example: $ df not-a-file df: not-a-file: No such file or directory Fixes #3373. --- src/uu/df/src/df.rs | 25 +++++++++++++++++++------ tests/by-util/test_df.rs | 13 +++++++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/uu/df/src/df.rs b/src/uu/df/src/df.rs index 97f1a2e6eea..552ae1387a8 100644 --- a/src/uu/df/src/df.rs +++ b/src/uu/df/src/df.rs @@ -12,9 +12,9 @@ mod filesystem; mod table; use uucore::display::Quotable; -use uucore::error::{UError, UResult}; -use uucore::format_usage; +use uucore::error::{UError, UResult, USimpleError}; use uucore::fsext::{read_fs_list, MountInfo}; +use uucore::{format_usage, show}; use clap::{crate_version, Arg, ArgMatches, Command}; @@ -311,10 +311,17 @@ where // Convert each path into a `Filesystem`, which contains // both the mount information and usage information. - paths - .iter() - .filter_map(|p| Filesystem::from_path(&mounts, p)) - .collect() + let mut result = vec![]; + for path in paths { + match Filesystem::from_path(&mounts, path) { + Some(fs) => result.push(fs), + None => show!(USimpleError::new( + 1, + format!("{}: No such file or directory", path.as_ref().display()) + )), + } + } + result } #[derive(Debug)] @@ -361,6 +368,12 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } }; + // This can happen if paths are given as command-line arguments + // but none of the paths exist. + if filesystems.is_empty() { + return Ok(()); + } + // The running total of filesystem sizes and usage. // // This accumulator is computed in case we need to display the diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index a88212146cc..aba9f69f023 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -297,3 +297,16 @@ fn test_output_field_no_more_than_once() { .fails() .usage_error("option --output: field 'target' used more than once"); } + +#[test] +fn test_nonexistent_file() { + new_ucmd!() + .arg("does-not-exist") + .fails() + .stderr_only("df: does-not-exist: No such file or directory"); + new_ucmd!() + .args(&["--output=file", "does-not-exist", "."]) + .fails() + .stderr_is("df: does-not-exist: No such file or directory\n") + .stdout_is("File \n. \n"); +} From f7d53889e8b560633c18b4d9f0555090d1779131 Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Mon, 11 Apr 2022 16:03:36 +0200 Subject: [PATCH 056/242] Fix the platform icons not showing up in some browsers --- docs/theme/head.hbs | 4 ++-- src/bin/uudoc.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/theme/head.hbs b/docs/theme/head.hbs index f4c02148093..bb78156c94b 100644 --- a/docs/theme/head.hbs +++ b/docs/theme/head.hbs @@ -7,7 +7,7 @@ } .additional { position: absolute; - top: 0em; + top: 0.5em; right: 0; display: flex; gap: 5px; @@ -15,7 +15,7 @@ font-size: 1.3em; } .platforms { - font-size: 1.5em; + font-size: 2rem; } dd > p { margin-top: 0.2em; diff --git a/src/bin/uudoc.rs b/src/bin/uudoc.rs index 53e31519f71..14e71d651fa 100644 --- a/src/bin/uudoc.rs +++ b/src/bin/uudoc.rs @@ -144,7 +144,7 @@ impl<'a, 'b> MDWriter<'a, 'b> { .iter() .any(|u| u == self.name) { - writeln!(self.w, "", icon)?; + writeln!(self.w, "", icon)?; } } writeln!(self.w, "")?; From 8b719a859112cf7ae9adbb38cd5826a0d955c035 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Mon, 11 Apr 2022 22:50:01 +0200 Subject: [PATCH 057/242] du: add support for --exclude and --exclude-from (#3381) * du: add support for --exclude and --exclude-from And add an option --verbose (doesn't exist in GNU) --- Cargo.lock | 1 + src/uu/du/Cargo.toml | 2 + src/uu/du/src/du.rs | 230 ++++++++++++++++++++++++++++++--------- tests/by-util/test_du.rs | 174 ++++++++++++++++++++++++++++- 4 files changed, 354 insertions(+), 53 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e34fd2f0117..5b78da6512c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2402,6 +2402,7 @@ version = "0.0.13" dependencies = [ "chrono", "clap 3.1.6", + "glob", "uucore", "winapi 0.3.9", ] diff --git a/src/uu/du/Cargo.toml b/src/uu/du/Cargo.toml index 9da4be090fe..1760731e3d4 100644 --- a/src/uu/du/Cargo.toml +++ b/src/uu/du/Cargo.toml @@ -16,6 +16,8 @@ path = "src/du.rs" [dependencies] chrono = "^0.4.11" +# For the --exclude & --exclude-from options +glob = "0.3.0" clap = { version = "3.1", features = ["wrap_help", "cargo"] } uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } diff --git a/src/uu/du/src/du.rs b/src/uu/du/src/du.rs index 2c3dfceae21..ff7a5a5b77e 100644 --- a/src/uu/du/src/du.rs +++ b/src/uu/du/src/du.rs @@ -11,11 +11,15 @@ extern crate uucore; use chrono::prelude::DateTime; use chrono::Local; use clap::{crate_version, Arg, ArgMatches, Command}; +use glob::Pattern; use std::collections::HashSet; use std::env; use std::fs; +use std::fs::File; #[cfg(not(windows))] use std::fs::Metadata; +use std::io::BufRead; +use std::io::BufReader; use std::io::{ErrorKind, Result}; use std::iter; #[cfg(not(windows))] @@ -24,7 +28,6 @@ use std::os::unix::fs::MetadataExt; use std::os::windows::fs::MetadataExt; #[cfg(windows)] use std::os::windows::io::AsRawHandle; -#[cfg(windows)] use std::path::Path; use std::path::PathBuf; use std::str::FromStr; @@ -68,6 +71,9 @@ mod options { pub const ONE_FILE_SYSTEM: &str = "one-file-system"; pub const DEREFERENCE: &str = "dereference"; pub const INODES: &str = "inodes"; + pub const EXCLUDE: &str = "exclude"; + pub const EXCLUDE_FROM: &str = "exclude-from"; + pub const VERBOSE: &str = "verbose"; pub const FILE: &str = "FILE"; } @@ -80,6 +86,12 @@ Otherwise, units default to 1024 bytes (or 512 if POSIXLY_CORRECT is set). SIZE is an integer and optional unit (example: 10M is 10*1024*1024). Units are K, M, G, T, P, E, Z, Y (powers of 1024) or KB, MB,... (powers of 1000). + +PATTERN allows some advanced exclusions. For example, the following syntaxes +are supported: +? will match only one character +* will match zero or more characters +{a,b} will match a or b "; const USAGE: &str = "\ {} [OPTION]... [FILE]... @@ -97,6 +109,7 @@ struct Options { one_file_system: bool, dereference: bool, inodes: bool, + verbose: bool, } #[derive(PartialEq, Eq, Hash, Clone, Copy)] @@ -287,6 +300,7 @@ fn du( options: &Options, depth: usize, inodes: &mut HashSet, + exclude: &[Pattern], ) -> Box> { let mut stats = vec![]; let mut futures = vec![]; @@ -306,49 +320,68 @@ fn du( } }; - for f in read { + 'file_loop: for f in read { match f { - Ok(entry) => match Stat::new(entry.path(), options) { - Ok(this_stat) => { - if let Some(inode) = this_stat.inode { - if inodes.contains(&inode) { - continue; - } - inodes.insert(inode); - } - if this_stat.is_dir { - if options.one_file_system { - if let (Some(this_inode), Some(my_inode)) = - (this_stat.inode, my_stat.inode) + Ok(entry) => { + match Stat::new(entry.path(), options) { + Ok(this_stat) => { + // We have an exclude list + for pattern in exclude { + // Look at all patterns with both short and long paths + // if we have 'du foo' but search to exclude 'foo/bar' + // we need the full path + if pattern.matches(&this_stat.path.to_string_lossy()) + || pattern.matches(&entry.file_name().into_string().unwrap()) { - if this_inode.dev_id != my_inode.dev_id { - continue; + // if the directory is ignored, leave early + if options.verbose { + println!("{} ignored", &this_stat.path.quote()); } + // Go to the next file + continue 'file_loop; + } + } + + if let Some(inode) = this_stat.inode { + if inodes.contains(&inode) { + continue; } + inodes.insert(inode); } - futures.push(du(this_stat, options, depth + 1, inodes)); - } else { - my_stat.size += this_stat.size; - my_stat.blocks += this_stat.blocks; - my_stat.inodes += 1; - if options.all { - stats.push(this_stat); + if this_stat.is_dir { + if options.one_file_system { + if let (Some(this_inode), Some(my_inode)) = + (this_stat.inode, my_stat.inode) + { + if this_inode.dev_id != my_inode.dev_id { + continue; + } + } + } + futures.push(du(this_stat, options, depth + 1, inodes, exclude)); + } else { + my_stat.size += this_stat.size; + my_stat.blocks += this_stat.blocks; + my_stat.inodes += 1; + if options.all { + stats.push(this_stat); + } } } + Err(error) => match error.kind() { + ErrorKind::PermissionDenied => { + let description = format!("cannot access {}", entry.path().quote()); + let error_message = "Permission denied"; + show_error_custom_description!(description, "{}", error_message); + set_exit_code(1); + } + _ => { + set_exit_code(1); + show_error!("cannot access {}: {}", entry.path().quote(), error); + } + }, } - Err(error) => match error.kind() { - ErrorKind::PermissionDenied => { - let description = format!("cannot access {}", entry.path().quote()); - let error_message = "Permission denied"; - show_error_custom_description!(description, "{}", error_message); - set_exit_code(1); - } - _ => { - set_exit_code(1); - show_error!("cannot access {}: {}", entry.path().quote(), error); - } - }, - }, + } Err(error) => show_error!("{}", error), } } @@ -406,6 +439,7 @@ enum DuError { SummarizeDepthConflict(String), InvalidTimeStyleArg(String), InvalidTimeArg(String), + InvalidGlob(String), } impl Display for DuError { @@ -436,6 +470,7 @@ Try '{} --help' for more information.", 'birth' and 'creation' arguments are not supported on this platform.", s.quote() ), + DuError::InvalidGlob(s) => write!(f, "Invalid exclude syntax: {}", s), } } } @@ -448,11 +483,75 @@ impl UError for DuError { Self::InvalidMaxDepthArg(_) | Self::SummarizeDepthConflict(_) | Self::InvalidTimeStyleArg(_) - | Self::InvalidTimeArg(_) => 1, + | Self::InvalidTimeArg(_) + | Self::InvalidGlob(_) => 1, } } } +// Read a file and return each line in a vector of String +fn file_as_vec(filename: impl AsRef) -> Vec { + let file = File::open(filename).expect("no such file"); + let buf = BufReader::new(file); + + buf.lines() + .map(|l| l.expect("Could not parse line")) + .collect() +} + +// Given the --exclude-from and/or --exclude arguments, returns the globset lists +// to ignore the files +fn get_glob_ignore(matches: &ArgMatches) -> UResult> { + let mut excludes_from = if matches.is_present(options::EXCLUDE_FROM) { + match matches.values_of(options::EXCLUDE_FROM) { + Some(all_files) => { + let mut exclusion = Vec::::new(); + // Read the exclude lists from all the files + // and add them into a vector of string + let files: Vec = all_files.clone().map(|v| v.to_owned()).collect(); + for f in files { + exclusion.extend(file_as_vec(&f)); + } + exclusion + } + None => Vec::::new(), + } + } else { + Vec::::new() + }; + + let mut excludes = if matches.is_present(options::EXCLUDE) { + match matches.values_of(options::EXCLUDE) { + Some(v) => { + // Read the various arguments + v.clone().map(|v| v.to_owned()).collect() + } + None => Vec::::new(), + } + } else { + Vec::::new() + }; + + // Merge the two lines + excludes.append(&mut excludes_from); + if !&excludes.is_empty() { + let mut builder = Vec::new(); + // Create the `Vec` of excludes + for f in excludes { + if matches.is_present(options::VERBOSE) { + println!("adding {:?} to the exclude list ", &f); + } + match Pattern::new(&f) { + Ok(glob) => builder.push(glob), + Err(err) => return Err(DuError::InvalidGlob(err.to_string()).into()), + }; + } + Ok(builder) + } else { + Ok(Vec::new()) + } +} + #[uucore::main] #[allow(clippy::cognitive_complexity)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { @@ -475,6 +574,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { one_file_system: matches.is_present(options::ONE_FILE_SYSTEM), dereference: matches.is_present(options::DEREFERENCE), inodes: matches.is_present(options::INODES), + verbose: matches.is_present(options::VERBOSE), }; let files = match matches.value_of(options::FILE) { @@ -529,8 +629,25 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { "\n" }; + let excludes = get_glob_ignore(&matches)?; + let mut grand_total = 0; - for path_string in files { + 'loop_file: for path_string in files { + // Skip if we don't want to ignore anything + if !&excludes.is_empty() { + for pattern in &excludes { + { + if pattern.matches(path_string) { + // if the directory is ignored, leave early + if options.verbose { + println!("{} ignored", path_string.quote()); + } + continue 'loop_file; + } + } + } + } + let path = PathBuf::from(&path_string); match Stat::new(path, &options) { Ok(stat) => { @@ -538,7 +655,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { if let Some(inode) = stat.inode { inodes.insert(inode); } - let iter = du(stat, &options, 0, &mut inodes); + let iter = du(stat, &options, 0, &mut inodes, &excludes); let (_, len) = iter.size_hint(); let len = len.unwrap(); for (index, stat) in iter.enumerate() { @@ -763,19 +880,28 @@ pub fn uu_app<'a>() -> Command<'a> { .help("exclude entries smaller than SIZE if positive, \ or entries greater than SIZE if negative") ) - // .arg( - // Arg::new("") - // .short('x') - // .long("exclude-from") - // .value_name("FILE") - // .help("exclude files that match any pattern in FILE") - // ) - // .arg( - // Arg::new("exclude") - // .long("exclude") - // .value_name("PATTERN") - // .help("exclude files that match PATTERN") - // ) + .arg( + Arg::new(options::VERBOSE) + .short('v') + .long("verbose") + .help("verbose mode (option not present in GNU/Coreutils)") + ) + .arg( + Arg::new(options::EXCLUDE) + .long(options::EXCLUDE) + .value_name("PATTERN") + .help("exclude files that match PATTERN") + .multiple_occurrences(true) + ) + .arg( + Arg::new(options::EXCLUDE_FROM) + .short('X') + .long("exclude-from") + .value_name("FILE") + .help("exclude files that match any pattern in FILE") + .multiple_occurrences(true) + + ) .arg( Arg::new(options::TIME) .long(options::TIME) diff --git a/tests/by-util/test_du.rs b/tests/by-util/test_du.rs index 415a64ac753..1deddb77fd1 100644 --- a/tests/by-util/test_du.rs +++ b/tests/by-util/test_du.rs @@ -3,7 +3,11 @@ // * For the full copyright and license information, please view the LICENSE // * file that was distributed with this source code. -// spell-checker:ignore (paths) sublink subwords +// spell-checker:ignore (paths) sublink subwords azerty azeaze xcwww azeaz amaz azea qzerty tazerty +#[cfg(not(windows))] +use regex::Regex; +#[cfg(not(windows))] +use std::io::Write; use crate::common::util::*; @@ -602,3 +606,171 @@ fn test_du_bytes() { ))] result.stdout_contains("21529\t./subdir\n"); } + +#[test] +fn test_du_exclude() { + let ts = TestScenario::new(util_name!()); + let at = &ts.fixtures; + + at.symlink_dir(SUB_DEEPER_DIR, SUB_DIR_LINKS_DEEPER_SYM_DIR); + at.mkdir_all(SUB_DIR_LINKS); + + ts.ucmd() + .arg("--exclude=subdir") + .arg(SUB_DEEPER_DIR) + .succeeds() + .stdout_contains("subdir/deeper/deeper_dir"); + ts.ucmd() + .arg("--exclude=subdir") + .arg("subdir") + .succeeds() + .stdout_is(""); + ts.ucmd() + .arg("--exclude=subdir") + .arg("--verbose") + .arg("subdir") + .succeeds() + .stdout_contains("'subdir' ignored"); +} + +#[test] +// Disable on Windows because we are looking for / +// And the tests would be more complex if we have to support \ too +#[cfg(not(target_os = "windows"))] +fn test_du_exclude_2() { + let ts = TestScenario::new(util_name!()); + let at = &ts.fixtures; + + at.mkdir_all("azerty/xcwww/azeaze"); + + let result = ts.ucmd().arg("azerty").succeeds(); + + let path_regexp = r"(.*)azerty/xcwww/azeaze(.*)azerty/xcwww(.*)azerty"; + let re = Regex::new(path_regexp).unwrap(); + assert!(re.is_match(result.stdout_str().replace('\n', "").trim())); + + // Exact match + ts.ucmd() + .arg("--exclude=azeaze") + .arg("azerty") + .succeeds() + .stdout_does_not_contain("azerty/xcwww/azeaze"); + // Partial match and NOT a glob + ts.ucmd() + .arg("--exclude=azeaz") + .arg("azerty") + .succeeds() + .stdout_contains("azerty/xcwww/azeaze"); + // Partial match and a various glob + ts.ucmd() + .arg("--exclude=azea?") + .arg("azerty") + .succeeds() + .stdout_contains("azerty/xcwww/azeaze"); + ts.ucmd() + .arg("--exclude=azea{z,b}") + .arg("azerty") + .succeeds() + .stdout_contains("azerty/xcwww/azeaze"); + ts.ucmd() + .arg("--exclude=azea*") + .arg("azerty") + .succeeds() + .stdout_does_not_contain("azerty/xcwww/azeaze"); + ts.ucmd() + .arg("--exclude=azeaz?") + .arg("azerty") + .succeeds() + .stdout_does_not_contain("azerty/xcwww/azeaze"); +} + +#[test] +// Disable on Windows because we are looking for / +// And the tests would be more complex if we have to support \ too +#[cfg(not(target_os = "windows"))] +fn test_du_exclude_mix() { + let ts = TestScenario::new(util_name!()); + let at = &ts.fixtures; + + let mut file1 = at.make_file("file-ignore1"); + file1.write_all(b"azeaze").unwrap(); + let mut file2 = at.make_file("file-ignore2"); + file2.write_all(b"amaz?ng").unwrap(); + + at.mkdir_all("azerty/xcwww/azeaze"); + at.mkdir_all("azerty/xcwww/qzerty"); + at.mkdir_all("azerty/xcwww/amazing"); + + ts.ucmd() + .arg("azerty") + .succeeds() + .stdout_contains("azerty/xcwww/azeaze"); + ts.ucmd() + .arg("--exclude=azeaze") + .arg("azerty") + .succeeds() + .stdout_does_not_contain("azerty/xcwww/azeaze"); + + // Just exclude one file name + let result = ts.ucmd().arg("--exclude=qzerty").arg("azerty").succeeds(); + assert!(!result.stdout_str().contains("qzerty")); + assert!(result.stdout_str().contains("azerty")); + assert!(result.stdout_str().contains("xcwww")); + + // Exclude from file + let result = ts + .ucmd() + .arg("--exclude-from=file-ignore1") + .arg("azerty") + .succeeds(); + assert!(!result.stdout_str().contains("azeaze")); + assert!(result.stdout_str().contains("qzerty")); + assert!(result.stdout_str().contains("xcwww")); + + // Mix two files and string + let result = ts + .ucmd() + .arg("--exclude=qzerty") + .arg("--exclude-from=file-ignore1") + .arg("--exclude-from=file-ignore2") + .arg("azerty") + .succeeds(); + assert!(!result.stdout_str().contains("amazing")); + assert!(!result.stdout_str().contains("qzerty")); + assert!(!result.stdout_str().contains("azeaze")); + assert!(result.stdout_str().contains("xcwww")); +} + +#[test] +fn test_du_exclude_several_components() { + let ts = TestScenario::new(util_name!()); + let at = &ts.fixtures; + + at.mkdir_all("a/b/c"); + at.mkdir_all("a/x/y"); + at.mkdir_all("a/u/y"); + + // Exact match + let result = ts + .ucmd() + .arg("--exclude=a/u") + .arg("--exclude=a/b") + .arg("a") + .succeeds(); + assert!(!result.stdout_str().contains("a/u")); + assert!(!result.stdout_str().contains("a/b")); +} + +#[test] +fn test_du_exclude_invalid_syntax() { + let ts = TestScenario::new(util_name!()); + let at = &ts.fixtures; + + at.mkdir_all("azerty/xcwww/azeaze"); + + ts.ucmd() + .arg("--exclude=a[ze") + .arg("azerty") + .fails() + .stderr_contains("du: Invalid exclude syntax"); +} From af32f7a1178ea8a58f97be733f6639409b5719b4 Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Sat, 9 Apr 2022 15:10:10 +0200 Subject: [PATCH 058/242] Dont use `from_*` method names that take `self` This was reported as an error in Clippy 1.60. --- src/uu/factor/src/miller_rabin.rs | 2 +- src/uu/factor/src/numeric/montgomery.rs | 20 +++++++++---------- src/uu/factor/src/rho.rs | 2 +- .../num_format/formatters/base_conv/mod.rs | 16 +++++++-------- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/uu/factor/src/miller_rabin.rs b/src/uu/factor/src/miller_rabin.rs index b5a01735afc..8906abf59f0 100644 --- a/src/uu/factor/src/miller_rabin.rs +++ b/src/uu/factor/src/miller_rabin.rs @@ -69,7 +69,7 @@ pub(crate) fn test(m: A) -> Result { continue; } - let a = m.from_u64(_a); + let a = m.to_mod(_a); // x = a^r mod n let mut x = m.pow(a, r); diff --git a/src/uu/factor/src/numeric/montgomery.rs b/src/uu/factor/src/numeric/montgomery.rs index 504e6a09b19..2a6782a02f4 100644 --- a/src/uu/factor/src/numeric/montgomery.rs +++ b/src/uu/factor/src/numeric/montgomery.rs @@ -16,7 +16,7 @@ pub(crate) trait Arithmetic: Copy + Sized { fn new(m: u64) -> Self; fn modulus(&self) -> u64; - fn from_u64(&self, n: u64) -> Self::ModInt; + fn to_mod(&self, n: u64) -> Self::ModInt; fn to_u64(&self, n: Self::ModInt) -> u64; fn add(&self, a: Self::ModInt, b: Self::ModInt) -> Self::ModInt; fn mul(&self, a: Self::ModInt, b: Self::ModInt) -> Self::ModInt; @@ -47,13 +47,13 @@ pub(crate) trait Arithmetic: Copy + Sized { } fn one(&self) -> Self::ModInt { - self.from_u64(1) + self.to_mod(1) } fn minus_one(&self) -> Self::ModInt { - self.from_u64(self.modulus() - 1) + self.to_mod(self.modulus() - 1) } fn zero(&self) -> Self::ModInt { - self.from_u64(0) + self.to_mod(0) } } @@ -113,7 +113,7 @@ impl Arithmetic for Montgomery { self.n.as_u64() } - fn from_u64(&self, x: u64) -> Self::ModInt { + fn to_mod(&self, x: u64) -> Self::ModInt { // TODO: optimise! debug_assert!(x < self.n.as_u64()); let r = T::from_double_width( @@ -189,9 +189,9 @@ mod tests { let n = 2 * n + 1; let m = Montgomery::::new(n); for x in 0..n { - let m_x = m.from_u64(x); + let m_x = m.to_mod(x); for y in 0..=x { - let m_y = m.from_u64(y); + let m_y = m.to_mod(y); println!("{n:?}, {x:?}, {y:?}", n = n, x = x, y = y); assert_eq!((x + y) % n, m.to_u64(m.add(m_x, m_y))); } @@ -205,9 +205,9 @@ mod tests { let n = 2 * n + 1; let m = Montgomery::::new(n); for x in 0..n { - let m_x = m.from_u64(x); + let m_x = m.to_mod(x); for y in 0..=x { - let m_y = m.from_u64(y); + let m_y = m.to_mod(y); assert_eq!((x * y) % n, m.to_u64(m.mul(m_x, m_y))); } } @@ -220,7 +220,7 @@ mod tests { let n = 2 * n + 1; let m = Montgomery::::new(n); for x in 0..n { - let x_ = m.from_u64(x); + let x_ = m.to_mod(x); assert_eq!(x, m.to_u64(x_)); } } diff --git a/src/uu/factor/src/rho.rs b/src/uu/factor/src/rho.rs index b28e88e91e1..e7aa00b4d9f 100644 --- a/src/uu/factor/src/rho.rs +++ b/src/uu/factor/src/rho.rs @@ -18,7 +18,7 @@ pub(crate) fn find_divisor(n: A) -> u64 { let mut rand = { let range = Uniform::new(1, n.modulus()); let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); - move || n.from_u64(range.sample(&mut rng)) + move || n.to_mod(range.sample(&mut rng)) }; let quadratic = |a, b| move |x| n.add(n.mul(a, n.mul(x, x)), b); diff --git a/src/uucore/src/lib/features/tokenize/num_format/formatters/base_conv/mod.rs b/src/uucore/src/lib/features/tokenize/num_format/formatters/base_conv/mod.rs index e6b1ea770b5..3df9f7129bc 100644 --- a/src/uucore/src/lib/features/tokenize/num_format/formatters/base_conv/mod.rs +++ b/src/uucore/src/lib/features/tokenize/num_format/formatters/base_conv/mod.rs @@ -179,7 +179,7 @@ pub fn str_to_arrnum(src: &str, radix_def_src: &dyn RadixDef) -> Vec { let mut intermed_in: Vec = Vec::new(); for c in src.chars() { #[allow(clippy::single_match)] - match radix_def_src.from_char(c) { + match radix_def_src.parse_char(c) { Some(u) => { intermed_in.push(u); } @@ -193,7 +193,7 @@ pub fn arrnum_to_str(src: &[u8], radix_def_dest: &dyn RadixDef) -> String { let mut str_out = String::new(); for u in src.iter() { #[allow(clippy::single_match)] - match radix_def_dest.from_u8(*u) { + match radix_def_dest.format_u8(*u) { Some(c) => { str_out.push(c); } @@ -219,8 +219,8 @@ pub fn base_conv_str( pub trait RadixDef { fn get_max(&self) -> u8; - fn from_char(&self, x: char) -> Option; - fn from_u8(&self, x: u8) -> Option; + fn parse_char(&self, x: char) -> Option; + fn format_u8(&self, x: u8) -> Option; } pub struct RadixTen; @@ -232,13 +232,13 @@ impl RadixDef for RadixTen { fn get_max(&self) -> u8 { 10 } - fn from_char(&self, c: char) -> Option { + fn parse_char(&self, c: char) -> Option { match c { '0'..='9' => Some(c as u8 - ZERO_ASC), _ => None, } } - fn from_u8(&self, u: u8) -> Option { + fn format_u8(&self, u: u8) -> Option { match u { 0..=9 => Some((ZERO_ASC + u) as char), _ => None, @@ -250,7 +250,7 @@ impl RadixDef for RadixHex { fn get_max(&self) -> u8 { 16 } - fn from_char(&self, c: char) -> Option { + fn parse_char(&self, c: char) -> Option { match c { '0'..='9' => Some(c as u8 - ZERO_ASC), 'A'..='F' => Some(c as u8 + 10 - UPPER_A_ASC), @@ -258,7 +258,7 @@ impl RadixDef for RadixHex { _ => None, } } - fn from_u8(&self, u: u8) -> Option { + fn format_u8(&self, u: u8) -> Option { match u { 0..=9 => Some((ZERO_ASC + u) as char), 10..=15 => Some((UPPER_A_ASC + (u - 10)) as char), From 1d76c965708e731cb23206a1993d0a38b9090f48 Mon Sep 17 00:00:00 2001 From: Ashe Leclerc Date: Sun, 10 Apr 2022 06:14:01 +0200 Subject: [PATCH 059/242] mv: add OverwriteMode match in specific case Check OverwriteMode and act depending on its value, specifically in the the case of overwriting a non-directory with a directory(#3337) --- src/uu/mv/src/mv.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/uu/mv/src/mv.rs b/src/uu/mv/src/mv.rs index 60cff5dfbc2..6642a2eb8b5 100644 --- a/src/uu/mv/src/mv.rs +++ b/src/uu/mv/src/mv.rs @@ -258,6 +258,16 @@ fn exec(files: &[OsString], b: &Behavior) -> UResult<()> { move_files_into_dir(&[source.clone()], target, b) } } else if target.exists() && source.is_dir() { + match b.overwrite { + OverwriteMode::NoClobber => return Ok(()), + OverwriteMode::Interactive => { + println!("{}: overwrite {}? ", uucore::util_name(), target.quote()); + if !read_yes() { + return Ok(()); + } + } + OverwriteMode::Force => {} + }; Err(MvError::NonDirectoryToDirectory( source.quote().to_string(), target.quote().to_string(), From 76a74c65ab1464bef5a77030c09f1e844541e773 Mon Sep 17 00:00:00 2001 From: Ashe Leclerc Date: Sun, 10 Apr 2022 19:11:52 +0200 Subject: [PATCH 060/242] tests/mv: test interactive mvError test -i flag in case of overwriting a non-directory with a directory --- tests/by-util/test_mv.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/by-util/test_mv.rs b/tests/by-util/test_mv.rs index a0bd0209d68..fc0f9c18e7f 100644 --- a/tests/by-util/test_mv.rs +++ b/tests/by-util/test_mv.rs @@ -748,6 +748,19 @@ fn test_mv_errors() { .fails() .stderr_str() .is_empty()); + + // $ at.mkdir dir && at.touch file + // $ mv -i dir file + // err == mv: cannot overwrite non-directory 'file' with directory 'dir' + assert!(!scene + .ucmd() + .arg("-i") + .arg(dir) + .arg(file_a) + .pipe_in("y") + .fails() + .stderr_str() + .is_empty()); } #[test] From d2289d268ac17fb19672e4f5b48021f9f4d2a1d9 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Mon, 4 Apr 2022 10:51:11 +0200 Subject: [PATCH 061/242] df: fix too low values in I* columns Fixes #3349 --- src/uu/df/src/table.rs | 84 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 75 insertions(+), 9 deletions(-) diff --git a/src/uu/df/src/table.rs b/src/uu/df/src/table.rs index 0f4daa0e11a..a0874bc6e4b 100644 --- a/src/uu/df/src/table.rs +++ b/src/uu/df/src/table.rs @@ -212,18 +212,20 @@ impl<'a> DisplayRow<'a> { Self { row, options } } - /// Get a string giving the scaled version of the input number. + /// Get a human readable string giving the scaled version of the input number. /// /// The scaling factor is defined in the `options` field. /// + /// This function is supposed to be used by scaled_bytes() and scaled_inodes() only. + /// /// # Errors /// /// If the scaling factor is not 1000, 1024, or a negative number. - fn scaled(&self, size: u64) -> Result { + fn scaled_human_readable(&self, size: u64) -> Result { let number_prefix = match self.options.block_size { BlockSize::HumanReadableDecimal => NumberPrefix::decimal(size as f64), BlockSize::HumanReadableBinary => NumberPrefix::binary(size as f64), - BlockSize::Bytes(d) => return Ok((size / d).to_string()), + _ => unreachable!(), }; match number_prefix { NumberPrefix::Standalone(bytes) => Ok(bytes.to_string()), @@ -231,6 +233,36 @@ impl<'a> DisplayRow<'a> { } } + /// Get a string giving the scaled version of the input number. + /// + /// The scaling factor is defined in the `options` field. + /// + /// # Errors + /// + /// If the scaling factor is not 1000, 1024, or a negative number. + fn scaled_bytes(&self, size: u64) -> Result { + if let BlockSize::Bytes(d) = self.options.block_size { + Ok((size / d).to_string()) + } else { + self.scaled_human_readable(size) + } + } + + /// Get a string giving the scaled version of the input number. + /// + /// The scaling factor is defined in the `options` field. + /// + /// # Errors + /// + /// If the scaling factor is not 1000, 1024, or a negative number. + fn scaled_inodes(&self, size: u64) -> Result { + if let BlockSize::Bytes(_) = self.options.block_size { + Ok(size.to_string()) + } else { + self.scaled_human_readable(size) + } + } + /// Convert a float between 0 and 1 into a percentage string. /// /// If `None`, return the string `"-"` instead. @@ -247,16 +279,18 @@ impl fmt::Display for DisplayRow<'_> { for column in &self.options.columns { match column { Column::Source => write!(f, "{0: <16} ", self.row.fs_device)?, - Column::Size => write!(f, "{0: >12} ", self.scaled(self.row.bytes)?)?, - Column::Used => write!(f, "{0: >12} ", self.scaled(self.row.bytes_used)?)?, - Column::Avail => write!(f, "{0: >12} ", self.scaled(self.row.bytes_avail)?)?, + Column::Size => write!(f, "{0: >12} ", self.scaled_bytes(self.row.bytes)?)?, + Column::Used => write!(f, "{0: >12} ", self.scaled_bytes(self.row.bytes_used)?)?, + Column::Avail => write!(f, "{0: >12} ", self.scaled_bytes(self.row.bytes_avail)?)?, Column::Pcent => { write!(f, "{0: >5} ", DisplayRow::percentage(self.row.bytes_usage))?; } Column::Target => write!(f, "{0: <16}", self.row.fs_mount)?, - Column::Itotal => write!(f, "{0: >12} ", self.scaled(self.row.inodes)?)?, - Column::Iused => write!(f, "{0: >12} ", self.scaled(self.row.inodes_used)?)?, - Column::Iavail => write!(f, "{0: >12} ", self.scaled(self.row.inodes_free)?)?, + Column::Itotal => write!(f, "{0: >12} ", self.scaled_inodes(self.row.inodes)?)?, + Column::Iused => write!(f, "{0: >12} ", self.scaled_inodes(self.row.inodes_used)?)?, + Column::Iavail => { + write!(f, "{0: >12} ", self.scaled_inodes(self.row.inodes_free)?)?; + } Column::Ipcent => { write!(f, "{0: >5} ", DisplayRow::percentage(self.row.inodes_usage))?; } @@ -509,6 +543,38 @@ mod tests { ); } + #[test] + fn test_row_display_bytes_and_inodes() { + let options = Options { + columns: vec![Column::Size, Column::Itotal], + block_size: BlockSize::Bytes(100), + ..Default::default() + }; + let row = Row { + file: Some("/path/to/file".to_string()), + fs_device: "my_device".to_string(), + fs_type: "my_type".to_string(), + fs_mount: "my_mount".to_string(), + + bytes: 100, + bytes_used: 25, + bytes_avail: 75, + bytes_usage: Some(0.25), + + #[cfg(target_os = "macos")] + bytes_capacity: Some(0.5), + + inodes: 10, + inodes_used: 2, + inodes_free: 8, + inodes_usage: Some(0.2), + }; + assert_eq!( + DisplayRow::new(&row, &options).to_string(), + " 1 10 " + ); + } + #[test] fn test_row_display_human_readable_si() { let options = Options { From 07317f3d9f2ccb78e882656dd48c77ae2536099a Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Tue, 12 Apr 2022 16:40:48 +0200 Subject: [PATCH 062/242] df: remove unnecessary return of Result --- src/uu/df/src/table.rs | 40 ++++++++++++++-------------------------- 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/src/uu/df/src/table.rs b/src/uu/df/src/table.rs index a0874bc6e4b..fc2db1dabe2 100644 --- a/src/uu/df/src/table.rs +++ b/src/uu/df/src/table.rs @@ -216,33 +216,25 @@ impl<'a> DisplayRow<'a> { /// /// The scaling factor is defined in the `options` field. /// - /// This function is supposed to be used by scaled_bytes() and scaled_inodes() only. - /// - /// # Errors - /// - /// If the scaling factor is not 1000, 1024, or a negative number. - fn scaled_human_readable(&self, size: u64) -> Result { + /// This function is supposed to be used by `scaled_bytes()` and `scaled_inodes()` only. + fn scaled_human_readable(&self, size: u64) -> String { let number_prefix = match self.options.block_size { BlockSize::HumanReadableDecimal => NumberPrefix::decimal(size as f64), BlockSize::HumanReadableBinary => NumberPrefix::binary(size as f64), _ => unreachable!(), }; match number_prefix { - NumberPrefix::Standalone(bytes) => Ok(bytes.to_string()), - NumberPrefix::Prefixed(prefix, bytes) => Ok(format!("{:.1}{}", bytes, prefix.symbol())), + NumberPrefix::Standalone(bytes) => bytes.to_string(), + NumberPrefix::Prefixed(prefix, bytes) => format!("{:.1}{}", bytes, prefix.symbol()), } } /// Get a string giving the scaled version of the input number. /// /// The scaling factor is defined in the `options` field. - /// - /// # Errors - /// - /// If the scaling factor is not 1000, 1024, or a negative number. - fn scaled_bytes(&self, size: u64) -> Result { + fn scaled_bytes(&self, size: u64) -> String { if let BlockSize::Bytes(d) = self.options.block_size { - Ok((size / d).to_string()) + (size / d).to_string() } else { self.scaled_human_readable(size) } @@ -251,13 +243,9 @@ impl<'a> DisplayRow<'a> { /// Get a string giving the scaled version of the input number. /// /// The scaling factor is defined in the `options` field. - /// - /// # Errors - /// - /// If the scaling factor is not 1000, 1024, or a negative number. - fn scaled_inodes(&self, size: u64) -> Result { + fn scaled_inodes(&self, size: u64) -> String { if let BlockSize::Bytes(_) = self.options.block_size { - Ok(size.to_string()) + size.to_string() } else { self.scaled_human_readable(size) } @@ -279,17 +267,17 @@ impl fmt::Display for DisplayRow<'_> { for column in &self.options.columns { match column { Column::Source => write!(f, "{0: <16} ", self.row.fs_device)?, - Column::Size => write!(f, "{0: >12} ", self.scaled_bytes(self.row.bytes)?)?, - Column::Used => write!(f, "{0: >12} ", self.scaled_bytes(self.row.bytes_used)?)?, - Column::Avail => write!(f, "{0: >12} ", self.scaled_bytes(self.row.bytes_avail)?)?, + Column::Size => write!(f, "{0: >12} ", self.scaled_bytes(self.row.bytes))?, + Column::Used => write!(f, "{0: >12} ", self.scaled_bytes(self.row.bytes_used))?, + Column::Avail => write!(f, "{0: >12} ", self.scaled_bytes(self.row.bytes_avail))?, Column::Pcent => { write!(f, "{0: >5} ", DisplayRow::percentage(self.row.bytes_usage))?; } Column::Target => write!(f, "{0: <16}", self.row.fs_mount)?, - Column::Itotal => write!(f, "{0: >12} ", self.scaled_inodes(self.row.inodes)?)?, - Column::Iused => write!(f, "{0: >12} ", self.scaled_inodes(self.row.inodes_used)?)?, + Column::Itotal => write!(f, "{0: >12} ", self.scaled_inodes(self.row.inodes))?, + Column::Iused => write!(f, "{0: >12} ", self.scaled_inodes(self.row.inodes_used))?, Column::Iavail => { - write!(f, "{0: >12} ", self.scaled_inodes(self.row.inodes_free)?)?; + write!(f, "{0: >12} ", self.scaled_inodes(self.row.inodes_free))?; } Column::Ipcent => { write!(f, "{0: >5} ", DisplayRow::percentage(self.row.inodes_usage))?; From 57b8caf1d06829380ebc7d73ebd1ddf33dc9d8ea Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Tue, 12 Apr 2022 20:39:00 +0200 Subject: [PATCH 063/242] mv: move the tests in a separate function --- tests/by-util/test_mv.rs | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/tests/by-util/test_mv.rs b/tests/by-util/test_mv.rs index fc0f9c18e7f..97e56bf6a53 100644 --- a/tests/by-util/test_mv.rs +++ b/tests/by-util/test_mv.rs @@ -748,19 +748,6 @@ fn test_mv_errors() { .fails() .stderr_str() .is_empty()); - - // $ at.mkdir dir && at.touch file - // $ mv -i dir file - // err == mv: cannot overwrite non-directory 'file' with directory 'dir' - assert!(!scene - .ucmd() - .arg("-i") - .arg(dir) - .arg(file_a) - .pipe_in("y") - .fails() - .stderr_str() - .is_empty()); } #[test] @@ -813,6 +800,29 @@ fn test_mv_permission_error() { .stderr_contains("Permission denied"); } +#[test] +fn test_mv_interactive_error() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + let dir = "test_mv_errors_dir"; + let file_a = "test_mv_errors_file_a"; + at.mkdir(dir); + at.touch(file_a); + + // $ at.mkdir dir && at.touch file + // $ mv -i dir file + // err == mv: cannot overwrite non-directory 'file' with directory 'dir' + assert!(!scene + .ucmd() + .arg("-i") + .arg(dir) + .arg(file_a) + .pipe_in("y") + .fails() + .stderr_str() + .is_empty()); +} + // Todo: // $ at.touch a b From 920633c0ea3522240c85916b7508587cc4f08dab Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Tue, 12 Apr 2022 22:37:38 +0200 Subject: [PATCH 064/242] mv: trigger an error when doing mv dir1 dir2 dir2 --- src/uu/mv/src/mv.rs | 18 +++++++++++++++++- tests/by-util/test_mv.rs | 18 ++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/uu/mv/src/mv.rs b/src/uu/mv/src/mv.rs index 6642a2eb8b5..1c2390f8024 100644 --- a/src/uu/mv/src/mv.rs +++ b/src/uu/mv/src/mv.rs @@ -285,7 +285,23 @@ fn exec(files: &[OsString], b: &Behavior) -> UResult<()> { )); } let target_dir = paths.last().unwrap(); - move_files_into_dir(&paths[..paths.len() - 1], target_dir, b) + let sources = &paths[..paths.len() - 1]; + + // Check if we have mv dir1 dir2 dir2 + // And generate an error if this is the case + if sources.contains(target_dir) { + return Err(USimpleError::new( + 1, + format!( + "cannot move {} to a subdirectory of itself, '{}/{}'", + target_dir.quote(), + target_dir.display(), + target_dir.display() + ), + )); + } + + move_files_into_dir(sources, target_dir, b) } } } diff --git a/tests/by-util/test_mv.rs b/tests/by-util/test_mv.rs index 97e56bf6a53..314fd3a7faf 100644 --- a/tests/by-util/test_mv.rs +++ b/tests/by-util/test_mv.rs @@ -823,6 +823,24 @@ fn test_mv_interactive_error() { .is_empty()); } +#[test] +fn test_mv_info_self() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + let dir1 = "dir1"; + let dir2 = "dir2"; + at.mkdir(dir1); + at.mkdir(dir2); + + scene + .ucmd() + .arg(dir1) + .arg(dir2) + .arg(dir2) + .fails() + .stderr_contains("mv: cannot move 'dir2' to a subdirectory of itself, 'dir2/dir2'"); +} + // Todo: // $ at.touch a b From 92f01a79dd1dd8274fe0cc47837676f68721073f Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Wed, 13 Apr 2022 09:26:20 +0200 Subject: [PATCH 065/242] Clippy on Windows: also ignore the self warning --- src/uu/tail/src/platform/windows.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/uu/tail/src/platform/windows.rs b/src/uu/tail/src/platform/windows.rs index c63040a2a75..b5c139bbd44 100644 --- a/src/uu/tail/src/platform/windows.rs +++ b/src/uu/tail/src/platform/windows.rs @@ -34,6 +34,7 @@ impl ProcessChecker { } } + #[allow(clippy::wrong_self_convention)] pub fn is_dead(&mut self) -> bool { if !self.dead { self.dead = unsafe { From 4afe0a77aa9d430cc812e116203b8e4cc353bed2 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Wed, 13 Apr 2022 10:47:32 +0200 Subject: [PATCH 066/242] mkdir.rs: Fix a clippy warning on clippy::ptr-arg ``` error: writing `&mut Vec` instead of `&mut [_]` involves a new object where a slice will do --> src\uu\mkdir\src/mkdir.rs:72:33 | 72 | fn strip_minus_from_mode(_args: &mut Vec) -> bool { | ^^^^^^^^^^^^^^^^ help: change this to: `&mut [String]` | = note: `-D clippy::ptr-arg` implied by `-D warnings` = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg ``` --- src/uu/mkdir/src/mkdir.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/uu/mkdir/src/mkdir.rs b/src/uu/mkdir/src/mkdir.rs index 7c8d4e4137f..12369b21065 100644 --- a/src/uu/mkdir/src/mkdir.rs +++ b/src/uu/mkdir/src/mkdir.rs @@ -69,7 +69,7 @@ fn get_mode(matches: &ArgMatches, mode_had_minus_prefix: bool) -> Result) -> bool { +fn strip_minus_from_mode(_args: &mut [String]) -> bool { false } From 31664843874d20299b01152cd7eeca22fc634e25 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 9 Apr 2022 07:31:22 +0000 Subject: [PATCH 067/242] build(deps): bump rlimit from 0.4.0 to 0.8.3 Bumps [rlimit](https://github.com/Nugine/rlimit) from 0.4.0 to 0.8.3. - [Release notes](https://github.com/Nugine/rlimit/releases) - [Changelog](https://github.com/Nugine/rlimit/blob/master/CHANGELOG.md) - [Commits](https://github.com/Nugine/rlimit/compare/v0.4.0...v0.8.3) --- updated-dependencies: - dependency-name: rlimit dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 5 ++--- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5b78da6512c..1dccbaafbca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1685,11 +1685,10 @@ dependencies = [ [[package]] name = "rlimit" -version = "0.4.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b02d62c38353a6fce45c25ca19783e25dd5f495ca681c674a4ee15aa4c1536" +checksum = "f7278a1ec8bfd4a4e07515c589f5ff7b309a373f987393aef44813d9dcf87aa3" dependencies = [ - "cfg-if 0.1.10", "libc", ] diff --git a/Cargo.toml b/Cargo.toml index c2737d475da..e79b7e9326e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -384,7 +384,7 @@ atty = "0.2" hex-literal = "0.3.1" [target.'cfg(target_os = "linux")'.dev-dependencies] -rlimit = "0.4.0" +rlimit = "0.8.3" [target.'cfg(unix)'.dev-dependencies] nix = "0.23.1" From 991672a030dabce7a1c8ec8781f5ac4cf0c104fb Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Tue, 12 Apr 2022 09:18:29 +0200 Subject: [PATCH 068/242] Adjust rlimit usage with the new version --- tests/common/util.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/common/util.rs b/tests/common/util.rs index ae93af20dfa..bf7143bb582 100644 --- a/tests/common/util.rs +++ b/tests/common/util.rs @@ -3,13 +3,13 @@ // * For the full copyright and license information, please view the LICENSE // * file that was distributed with this source code. -//spell-checker: ignore (linux) rlimit prlimit Rlim coreutil ggroups +//spell-checker: ignore (linux) rlimit prlimit coreutil ggroups #![allow(dead_code)] use pretty_assertions::assert_eq; #[cfg(target_os = "linux")] -use rlimit::{prlimit, rlim}; +use rlimit::prlimit; #[cfg(unix)] use std::borrow::Cow; use std::env; @@ -893,7 +893,7 @@ pub struct UCommand { stderr: Option, bytes_into_stdin: Option>, #[cfg(target_os = "linux")] - limits: Vec<(rlimit::Resource, rlim, rlim)>, + limits: Vec<(rlimit::Resource, u64, u64)>, } impl UCommand { @@ -1046,8 +1046,8 @@ impl UCommand { pub fn with_limit( &mut self, resource: rlimit::Resource, - soft_limit: rlim, - hard_limit: rlim, + soft_limit: u64, + hard_limit: u64, ) -> &mut Self { self.limits.push((resource, soft_limit, hard_limit)); self From 56e8dda60628bece67d12ecbb66744f7072a54cc Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Mon, 4 Apr 2022 15:16:31 +0200 Subject: [PATCH 069/242] df: fix calculation of IUse% Fixes #3355 --- src/uu/df/src/table.rs | 5 +++-- tests/by-util/test_df.rs | 32 +++++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/uu/df/src/table.rs b/src/uu/df/src/table.rs index fc2db1dabe2..3e0ae853f88 100644 --- a/src/uu/df/src/table.rs +++ b/src/uu/df/src/table.rs @@ -154,6 +154,7 @@ impl From for Row { .. } = fs.usage; let bused = blocks - bfree; + let fused = files - ffree; Self { file: fs.file, fs_device: dev_name, @@ -177,12 +178,12 @@ impl From for Row { Some(bavail as f64 / ((bused + bavail) as f64)) }, inodes: files, - inodes_used: files - ffree, + inodes_used: fused, inodes_free: ffree, inodes_usage: if files == 0 { None } else { - Some(ffree as f64 / files as f64) + Some(fused as f64 / files as f64) }, } } diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index aba9f69f023..1a31109a340 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -1,4 +1,4 @@ -// spell-checker:ignore udev pcent +// spell-checker:ignore udev pcent iuse itotal iused ipcent use crate::common::util::*; #[test] @@ -179,6 +179,36 @@ fn test_use_percentage() { } } +#[test] +fn test_iuse_percentage() { + let output = new_ucmd!() + .args(&["--total", "--output=itotal,iused,ipcent"]) + .succeeds() + .stdout_move_str(); + + // Skip the header line. + let lines: Vec<&str> = output.lines().skip(1).collect(); + + for line in lines { + let mut iter = line.split_whitespace(); + let reported_inodes = iter.next().unwrap().parse::().unwrap(); + let reported_iused = iter.next().unwrap().parse::().unwrap(); + let reported_percentage = iter.next().unwrap(); + + if reported_percentage == "-" { + assert_eq!(0.0, reported_inodes); + assert_eq!(0.0, reported_iused); + } else { + let reported_percentage = reported_percentage[..reported_percentage.len() - 1] + .parse::() + .unwrap(); + let computed_percentage = (100.0 * (reported_iused / reported_inodes)).ceil() as u8; + + assert_eq!(computed_percentage, reported_percentage); + } + } +} + #[test] fn test_block_size_1024() { fn get_header(block_size: u64) -> String { From 2bed02b70a18996cb83f6dfd507288ac7eb856ff Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Wed, 13 Apr 2022 10:55:35 +0200 Subject: [PATCH 070/242] Revert the force set of the rustc nightly version --- .github/workflows/CICD.yml | 8 ++++---- .github/workflows/GnuTests.yml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml index d4f34681c15..0cc2ba50b98 100644 --- a/.github/workflows/CICD.yml +++ b/.github/workflows/CICD.yml @@ -67,7 +67,7 @@ jobs: - name: Install `rust` toolchain uses: actions-rs/toolchain@v1 with: - toolchain: nightly-2022-03-21 + toolchain: nightly default: true profile: minimal - name: Install `cargo-udeps` @@ -86,7 +86,7 @@ jobs: fault_type="${{ steps.vars.outputs.FAULT_TYPE }}" fault_prefix=$(echo "$fault_type" | tr '[:lower:]' '[:upper:]') # - cargo +nightly-2022-03-21 udeps ${{ steps.vars.outputs.CARGO_FEATURES_OPTION }} --all-targets &> udeps.log || cat udeps.log + cargo +nightly udeps ${{ steps.vars.outputs.CARGO_FEATURES_OPTION }} --all-targets &> udeps.log || cat udeps.log grep --ignore-case "all deps seem to have been used" udeps.log || { printf "%s\n" "::${fault_type} ::${fault_prefix}: \`cargo udeps\`: style violation (unused dependency found)" ; fault=true ; } if [ -n "${{ steps.vars.outputs.FAIL_ON_FAULT }}" ] && [ -n "$fault" ]; then exit 1 ; fi @@ -483,7 +483,7 @@ jobs: - name: Install `rust` toolchain uses: actions-rs/toolchain@v1 with: - toolchain: nightly-2022-03-21 + toolchain: nightly default: true profile: minimal # minimal component installation (ie, no documentation) - name: Test @@ -935,7 +935,7 @@ jobs: ## VARs setup outputs() { step_id="vars"; for var in "$@" ; do echo steps.${step_id}.outputs.${var}="${!var}"; echo ::set-output name=${var}::${!var}; done; } # toolchain - TOOLCHAIN="nightly-2022-03-21" ## default to "nightly" toolchain (required for certain required unstable compiler flags) ## !maint: refactor when stable channel has needed support + TOOLCHAIN="nightly" ## default to "nightly" toolchain (required for certain required unstable compiler flags) ## !maint: refactor when stable channel has needed support # * specify gnu-type TOOLCHAIN for windows; `grcov` requires gnu-style code coverage data files case ${{ matrix.job.os }} in windows-*) TOOLCHAIN="$TOOLCHAIN-x86_64-pc-windows-gnu" ;; esac; # * use requested TOOLCHAIN if specified diff --git a/.github/workflows/GnuTests.yml b/.github/workflows/GnuTests.yml index 579bea4c03e..b10772ec218 100644 --- a/.github/workflows/GnuTests.yml +++ b/.github/workflows/GnuTests.yml @@ -221,7 +221,7 @@ jobs: - name: Install `rust` toolchain uses: actions-rs/toolchain@v1 with: - toolchain: nightly-2022-03-21 + toolchain: nightly default: true profile: minimal # minimal component installation (ie, no documentation) components: rustfmt From 90b80617b9c2954aa91257acdbafa0d90e3d0d8e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 3 Apr 2022 10:51:48 +0000 Subject: [PATCH 071/242] build(deps): bump os_display from 0.1.2 to 0.1.3 Bumps [os_display](https://github.com/blyxxyz/os_display) from 0.1.2 to 0.1.3. - [Release notes](https://github.com/blyxxyz/os_display/releases) - [Changelog](https://github.com/blyxxyz/os_display/blob/master/CHANGELOG.md) - [Commits](https://github.com/blyxxyz/os_display/compare/v0.1.2...v0.1.3) --- updated-dependencies: - dependency-name: os_display dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- src/uucore/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1dccbaafbca..af4f208c09d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1314,9 +1314,9 @@ dependencies = [ [[package]] name = "os_display" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "748cc1d0dc55247316a5bedd8dc8c5478c8a0c2e2001176b38ce7c0ed732c7a5" +checksum = "7a6229bad892b46b0dcfaaeb18ad0d2e56400f5aaea05b768bde96e73676cf75" dependencies = [ "unicode-width", ] diff --git a/src/uucore/Cargo.toml b/src/uucore/Cargo.toml index 4a145481f39..0f28d9acb19 100644 --- a/src/uucore/Cargo.toml +++ b/src/uucore/Cargo.toml @@ -31,7 +31,7 @@ data-encoding-macro = { version="0.1.12", optional=true } z85 = { version="3.0.3", optional=true } libc = { version="0.2.121", optional=true } once_cell = "1.10.0" -os_display = "0.1.0" +os_display = "0.1.3" [target.'cfg(unix)'.dependencies] walkdir = { version="2.3.2", optional=true } From 29fcb8653b2f04cf5b86bd5b38d8a1983bcd612c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 9 Apr 2022 07:39:19 +0000 Subject: [PATCH 072/242] build(deps): bump nom from 7.1.0 to 7.1.1 Bumps [nom](https://github.com/Geal/nom) from 7.1.0 to 7.1.1. - [Release notes](https://github.com/Geal/nom/releases) - [Changelog](https://github.com/Geal/nom/blob/main/CHANGELOG.md) - [Commits](https://github.com/Geal/nom/compare/7.1.0...7.1.1) --- updated-dependencies: - dependency-name: nom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 5 ++--- src/uu/tr/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1dccbaafbca..b3f04ef3741 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1204,13 +1204,12 @@ dependencies = [ [[package]] name = "nom" -version = "7.1.0" +version = "7.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d11e1ef389c76fe5b81bcaf2ea32cf88b62bc494e19f493d0b30e7a930109" +checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" dependencies = [ "memchr 2.4.1", "minimal-lexical", - "version_check", ] [[package]] diff --git a/src/uu/tr/Cargo.toml b/src/uu/tr/Cargo.toml index 1bfb4becc11..9d757e2766b 100644 --- a/src/uu/tr/Cargo.toml +++ b/src/uu/tr/Cargo.toml @@ -15,7 +15,7 @@ edition = "2021" path = "src/tr.rs" [dependencies] -nom = "7.1.0" +nom = "7.1.1" clap = { version = "3.1", features = ["wrap_help", "cargo"] } uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } From a644233ea20c3de8375a5d1ad9806d52d727a1e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Apr 2022 12:55:41 +0000 Subject: [PATCH 073/242] build(deps): bump regex from 1.5.4 to 1.5.5 Bumps [regex](https://github.com/rust-lang/regex) from 1.5.4 to 1.5.5. - [Release notes](https://github.com/rust-lang/regex/releases) - [Changelog](https://github.com/rust-lang/regex/blob/master/CHANGELOG.md) - [Commits](https://github.com/rust-lang/regex/compare/1.5.4...1.5.5) --- updated-dependencies: - dependency-name: regex dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- src/uu/csplit/Cargo.toml | 2 +- src/uu/hashsum/Cargo.toml | 2 +- src/uu/nl/Cargo.toml | 2 +- src/uu/pr/Cargo.toml | 2 +- src/uu/ptx/Cargo.toml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1dccbaafbca..387f40f1c4d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1632,9 +1632,9 @@ checksum = "ef445213a92fdddc4bc69d9111156d20ffd50704a86ad82b372aab701a0d3a9a" [[package]] name = "regex" -version = "1.5.4" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" dependencies = [ "aho-corasick", "memchr 2.4.1", diff --git a/Cargo.toml b/Cargo.toml index e79b7e9326e..bf53d61023e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -373,7 +373,7 @@ glob = "0.3.0" libc = "0.2" pretty_assertions = "1" rand = "0.8" -regex = "1.0" +regex = "1.5" sha1 = { version="0.10", features=["std"] } tempfile = "3" time = "0.1" diff --git a/src/uu/csplit/Cargo.toml b/src/uu/csplit/Cargo.toml index bb263ec49c6..6c86900a3b6 100644 --- a/src/uu/csplit/Cargo.toml +++ b/src/uu/csplit/Cargo.toml @@ -17,7 +17,7 @@ path = "src/csplit.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } thiserror = "1.0" -regex = "1.0.0" +regex = "1.5.5" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["entries", "fs"] } [[bin]] diff --git a/src/uu/hashsum/Cargo.toml b/src/uu/hashsum/Cargo.toml index f23a3068f93..c38c8499a33 100644 --- a/src/uu/hashsum/Cargo.toml +++ b/src/uu/hashsum/Cargo.toml @@ -20,7 +20,7 @@ clap = { version = "3.1", features = ["wrap_help", "cargo"] } hex = "0.4.3" memchr = "2" md-5 = "0.10.1" -regex = "1.0.1" +regex = "1.5.5" sha1 = "0.10.1" sha2 = "0.10.2" sha3 = "0.10.1" diff --git a/src/uu/nl/Cargo.toml b/src/uu/nl/Cargo.toml index 397cc3861f2..35357b422d8 100644 --- a/src/uu/nl/Cargo.toml +++ b/src/uu/nl/Cargo.toml @@ -16,7 +16,7 @@ path = "src/nl.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -regex = "1.0.1" +regex = "1.5.5" uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } [[bin]] diff --git a/src/uu/pr/Cargo.toml b/src/uu/pr/Cargo.toml index f2ded14b4f7..78fa9e28eb9 100644 --- a/src/uu/pr/Cargo.toml +++ b/src/uu/pr/Cargo.toml @@ -20,7 +20,7 @@ uucore = { version=">=0.0.7", package="uucore", path="../../uucore", features=[" chrono = "0.4.19" quick-error = "2.0.1" itertools = "0.10.0" -regex = "1.0" +regex = "1.5" [[bin]] name = "pr" diff --git a/src/uu/ptx/Cargo.toml b/src/uu/ptx/Cargo.toml index d1058d78b18..be76d8df45d 100644 --- a/src/uu/ptx/Cargo.toml +++ b/src/uu/ptx/Cargo.toml @@ -16,7 +16,7 @@ path = "src/ptx.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -regex = "1.0.1" +regex = "1.5.5" uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } [[bin]] From a791541e1c303c46db1d712703464e56a1a99f97 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Apr 2022 21:23:48 +0000 Subject: [PATCH 074/242] build(deps): bump selinux from 0.2.5 to 0.2.7 Bumps [selinux](https://github.com/koutheir/selinux) from 0.2.5 to 0.2.7. - [Release notes](https://github.com/koutheir/selinux/releases) - [Changelog](https://github.com/koutheir/selinux/blob/master/CHANGELOG.md) - [Commits](https://github.com/koutheir/selinux/commits) --- updated-dependencies: - dependency-name: selinux dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1dccbaafbca..bbf5f0c3624 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1314,9 +1314,9 @@ dependencies = [ [[package]] name = "os_display" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "748cc1d0dc55247316a5bedd8dc8c5478c8a0c2e2001176b38ce7c0ed732c7a5" +checksum = "7a6229bad892b46b0dcfaaeb18ad0d2e56400f5aaea05b768bde96e73676cf75" dependencies = [ "unicode-width", ] @@ -1753,9 +1753,9 @@ dependencies = [ [[package]] name = "selinux" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09715d6b4356e916047e61e4dce40a67ac93036851957b91713d3d9c282d1548" +checksum = "0c4534fb886814d0015bcc290979263692213627bdf8ed4091746bb1c77acb0d" dependencies = [ "bitflags", "libc", From 4e1f2aec476e86df2d465c5fc8cea582bf8f955f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Apr 2022 21:24:09 +0000 Subject: [PATCH 075/242] build(deps): bump byte-unit from 4.0.13 to 4.0.14 Bumps [byte-unit](https://github.com/magiclen/byte-unit) from 4.0.13 to 4.0.14. - [Release notes](https://github.com/magiclen/byte-unit/releases) - [Commits](https://github.com/magiclen/byte-unit/compare/v4.0.13...v4.0.14) --- updated-dependencies: - dependency-name: byte-unit dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1dccbaafbca..b653617cc4a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -181,9 +181,9 @@ checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" [[package]] name = "byte-unit" -version = "4.0.13" +version = "4.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "956ffc5b0ec7d7a6949e3f21fd63ba5af4cffdc2ba1e0b7bf62b481458c4ae7f" +checksum = "95ebf10dda65f19ff0f42ea15572a359ed60d7fc74fdc984d90310937be0014b" dependencies = [ "utf8-width", ] @@ -1314,9 +1314,9 @@ dependencies = [ [[package]] name = "os_display" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "748cc1d0dc55247316a5bedd8dc8c5478c8a0c2e2001176b38ce7c0ed732c7a5" +checksum = "7a6229bad892b46b0dcfaaeb18ad0d2e56400f5aaea05b768bde96e73676cf75" dependencies = [ "unicode-width", ] From b20446490e26c8d466f671d9cb506398a0db56eb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Apr 2022 07:17:20 +0000 Subject: [PATCH 076/242] build(deps): bump zip from 0.5.13 to 0.6.0 Bumps [zip](https://github.com/zip-rs/zip) from 0.5.13 to 0.6.0. - [Release notes](https://github.com/zip-rs/zip/releases) - [Commits](https://github.com/zip-rs/zip/commits/v0.6) --- updated-dependencies: - dependency-name: zip dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 9 ++++----- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index acf2a176d99..f492d31b8f5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1752,9 +1752,9 @@ dependencies = [ [[package]] name = "selinux" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09715d6b4356e916047e61e4dce40a67ac93036851957b91713d3d9c282d1548" +checksum = "0c4534fb886814d0015bcc290979263692213627bdf8ed4091746bb1c77acb0d" dependencies = [ "bitflags", "libc", @@ -3442,12 +3442,11 @@ checksum = "af896e93db81340b74b65f74276a99b210c086f3d34ed0abf433182a462af856" [[package]] name = "zip" -version = "0.5.13" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93ab48844d61251bb3835145c521d88aa4031d7139e8485990f60ca911fa0815" +checksum = "e6fa4aa90e99fb8d701bda16fb040d8ed2f9c7176fb44de750e880a74b580315" dependencies = [ "byteorder", "crc32fast", "flate2", - "thiserror", ] diff --git a/Cargo.toml b/Cargo.toml index bf53d61023e..12959ad35ad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -253,7 +253,7 @@ textwrap = { version="0.15", features=["terminal_size"] } uucore = { version=">=0.0.11", package="uucore", path="src/uucore" } selinux = { version="0.2", optional = true } ureq = "2.4.0" -zip = { version = "0.5.13", default_features=false, features=["deflate"] } +zip = { version = "0.6.0", default_features=false, features=["deflate"] } # * uutils uu_test = { optional=true, version="0.0.13", package="uu_test", path="src/uu/test" } # From 4820e7ee7630fffc007367575b22ee404548dc2a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Apr 2022 07:17:35 +0000 Subject: [PATCH 077/242] build(deps): bump clap from 3.1.6 to 3.1.8 Bumps [clap](https://github.com/clap-rs/clap) from 3.1.6 to 3.1.8. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/v3.1.6...v3.1.8) --- updated-dependencies: - dependency-name: clap dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 212 ++++++++++++++++++++++++++--------------------------- 1 file changed, 106 insertions(+), 106 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index acf2a176d99..573bccbc590 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -274,9 +274,9 @@ dependencies = [ [[package]] name = "clap" -version = "3.1.6" +version = "3.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8c93436c21e4698bacadf42917db28b23017027a4deccb35dbe47a7e7840123" +checksum = "71c47df61d9e16dc010b55dba1952a57d8c215dbb533fd13cdd13369aac73b1c" dependencies = [ "atty", "bitflags", @@ -295,7 +295,7 @@ version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df6f3613c0a3cddfd78b41b10203eb322cb29b600cbdf808a7d3db95691b8e25" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", ] [[package]] @@ -325,7 +325,7 @@ version = "0.0.13" dependencies = [ "atty", "chrono", - "clap 3.1.6", + "clap 3.1.8", "clap_complete", "conv", "filetime", @@ -1752,9 +1752,9 @@ dependencies = [ [[package]] name = "selinux" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09715d6b4356e916047e61e4dce40a67ac93036851957b91713d3d9c282d1548" +checksum = "0c4534fb886814d0015bcc290979263692213627bdf8ed4091746bb1c77acb0d" dependencies = [ "bitflags", "libc", @@ -2196,7 +2196,7 @@ checksum = "7cf7d77f457ef8dfa11e4cd5933c5ddb5dc52a94664071951219a97710f0a32b" name = "uu_arch" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "platform-info", "uucore", ] @@ -2205,7 +2205,7 @@ dependencies = [ name = "uu_base32" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2221,7 +2221,7 @@ dependencies = [ name = "uu_basename" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2229,7 +2229,7 @@ dependencies = [ name = "uu_basenc" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uu_base32", "uucore", ] @@ -2239,7 +2239,7 @@ name = "uu_cat" version = "0.0.13" dependencies = [ "atty", - "clap 3.1.6", + "clap 3.1.8", "nix", "thiserror", "unix_socket", @@ -2250,7 +2250,7 @@ dependencies = [ name = "uu_chcon" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "fts-sys", "libc", "selinux", @@ -2262,7 +2262,7 @@ dependencies = [ name = "uu_chgrp" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2270,7 +2270,7 @@ dependencies = [ name = "uu_chmod" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "libc", "uucore", ] @@ -2279,7 +2279,7 @@ dependencies = [ name = "uu_chown" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2287,7 +2287,7 @@ dependencies = [ name = "uu_chroot" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2295,7 +2295,7 @@ dependencies = [ name = "uu_cksum" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2303,7 +2303,7 @@ dependencies = [ name = "uu_comm" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2311,7 +2311,7 @@ dependencies = [ name = "uu_cp" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "exacl", "filetime", "ioctl-sys", @@ -2328,7 +2328,7 @@ dependencies = [ name = "uu_csplit" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "regex", "thiserror", "uucore", @@ -2340,7 +2340,7 @@ version = "0.0.13" dependencies = [ "atty", "bstr", - "clap 3.1.6", + "clap 3.1.8", "memchr 2.4.1", "uucore", ] @@ -2350,7 +2350,7 @@ name = "uu_date" version = "0.0.13" dependencies = [ "chrono", - "clap 3.1.6", + "clap 3.1.8", "libc", "uucore", "winapi 0.3.9", @@ -2361,7 +2361,7 @@ name = "uu_dd" version = "0.0.13" dependencies = [ "byte-unit", - "clap 3.1.6", + "clap 3.1.8", "gcd", "libc", "signal-hook", @@ -2372,7 +2372,7 @@ dependencies = [ name = "uu_df" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "number_prefix", "uucore", ] @@ -2381,7 +2381,7 @@ dependencies = [ name = "uu_dircolors" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "glob", "uucore", ] @@ -2390,7 +2390,7 @@ dependencies = [ name = "uu_dirname" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2399,7 +2399,7 @@ name = "uu_du" version = "0.0.13" dependencies = [ "chrono", - "clap 3.1.6", + "clap 3.1.8", "glob", "uucore", "winapi 0.3.9", @@ -2409,7 +2409,7 @@ dependencies = [ name = "uu_echo" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2417,7 +2417,7 @@ dependencies = [ name = "uu_env" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "rust-ini", "uucore", ] @@ -2426,7 +2426,7 @@ dependencies = [ name = "uu_expand" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "unicode-width", "uucore", ] @@ -2435,7 +2435,7 @@ dependencies = [ name = "uu_expr" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "num-bigint", "num-traits", "onig", @@ -2446,7 +2446,7 @@ dependencies = [ name = "uu_factor" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "coz", "num-traits", "paste", @@ -2460,7 +2460,7 @@ dependencies = [ name = "uu_false" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2468,7 +2468,7 @@ dependencies = [ name = "uu_fmt" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "unicode-width", "uucore", ] @@ -2477,7 +2477,7 @@ dependencies = [ name = "uu_fold" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2485,7 +2485,7 @@ dependencies = [ name = "uu_groups" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2495,7 +2495,7 @@ version = "0.0.13" dependencies = [ "blake2b_simd", "blake3", - "clap 3.1.6", + "clap 3.1.8", "digest", "hex", "md-5", @@ -2511,7 +2511,7 @@ dependencies = [ name = "uu_head" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "memchr 2.4.1", "uucore", ] @@ -2520,7 +2520,7 @@ dependencies = [ name = "uu_hostid" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "libc", "uucore", ] @@ -2529,7 +2529,7 @@ dependencies = [ name = "uu_hostname" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "hostname", "uucore", "winapi 0.3.9", @@ -2539,7 +2539,7 @@ dependencies = [ name = "uu_id" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "selinux", "uucore", ] @@ -2548,7 +2548,7 @@ dependencies = [ name = "uu_install" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "file_diff", "filetime", "libc", @@ -2559,7 +2559,7 @@ dependencies = [ name = "uu_join" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "memchr 2.4.1", "uucore", ] @@ -2568,7 +2568,7 @@ dependencies = [ name = "uu_kill" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "libc", "uucore", ] @@ -2577,7 +2577,7 @@ dependencies = [ name = "uu_link" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2585,7 +2585,7 @@ dependencies = [ name = "uu_ln" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2593,7 +2593,7 @@ dependencies = [ name = "uu_logname" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "libc", "uucore", ] @@ -2604,7 +2604,7 @@ version = "0.0.13" dependencies = [ "atty", "chrono", - "clap 3.1.6", + "clap 3.1.8", "glob", "lazy_static", "lscolors", @@ -2621,7 +2621,7 @@ dependencies = [ name = "uu_mkdir" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2629,7 +2629,7 @@ dependencies = [ name = "uu_mkfifo" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "libc", "uucore", ] @@ -2638,7 +2638,7 @@ dependencies = [ name = "uu_mknod" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "libc", "uucore", ] @@ -2647,7 +2647,7 @@ dependencies = [ name = "uu_mktemp" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "rand", "tempfile", "uucore", @@ -2658,7 +2658,7 @@ name = "uu_more" version = "0.0.13" dependencies = [ "atty", - "clap 3.1.6", + "clap 3.1.8", "crossterm", "nix", "unicode-segmentation", @@ -2670,7 +2670,7 @@ dependencies = [ name = "uu_mv" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "fs_extra", "uucore", ] @@ -2679,7 +2679,7 @@ dependencies = [ name = "uu_nice" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "libc", "nix", "uucore", @@ -2689,7 +2689,7 @@ dependencies = [ name = "uu_nl" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "regex", "uucore", ] @@ -2699,7 +2699,7 @@ name = "uu_nohup" version = "0.0.13" dependencies = [ "atty", - "clap 3.1.6", + "clap 3.1.8", "libc", "uucore", ] @@ -2708,7 +2708,7 @@ dependencies = [ name = "uu_nproc" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "libc", "num_cpus", "uucore", @@ -2718,7 +2718,7 @@ dependencies = [ name = "uu_numfmt" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2727,7 +2727,7 @@ name = "uu_od" version = "0.0.13" dependencies = [ "byteorder", - "clap 3.1.6", + "clap 3.1.8", "half", "uucore", ] @@ -2736,7 +2736,7 @@ dependencies = [ name = "uu_paste" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2744,7 +2744,7 @@ dependencies = [ name = "uu_pathchk" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "libc", "uucore", ] @@ -2753,7 +2753,7 @@ dependencies = [ name = "uu_pinky" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2762,7 +2762,7 @@ name = "uu_pr" version = "0.0.13" dependencies = [ "chrono", - "clap 3.1.6", + "clap 3.1.8", "itertools", "quick-error", "regex", @@ -2773,7 +2773,7 @@ dependencies = [ name = "uu_printenv" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2781,7 +2781,7 @@ dependencies = [ name = "uu_printf" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2789,7 +2789,7 @@ dependencies = [ name = "uu_ptx" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "regex", "uucore", ] @@ -2798,7 +2798,7 @@ dependencies = [ name = "uu_pwd" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2806,7 +2806,7 @@ dependencies = [ name = "uu_readlink" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2814,7 +2814,7 @@ dependencies = [ name = "uu_realpath" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2822,7 +2822,7 @@ dependencies = [ name = "uu_relpath" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2830,7 +2830,7 @@ dependencies = [ name = "uu_rm" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "remove_dir_all", "uucore", "walkdir", @@ -2841,7 +2841,7 @@ dependencies = [ name = "uu_rmdir" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "libc", "uucore", ] @@ -2850,7 +2850,7 @@ dependencies = [ name = "uu_runcon" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "libc", "selinux", "thiserror", @@ -2862,7 +2862,7 @@ name = "uu_seq" version = "0.0.13" dependencies = [ "bigdecimal", - "clap 3.1.6", + "clap 3.1.8", "num-bigint", "num-traits", "uucore", @@ -2872,7 +2872,7 @@ dependencies = [ name = "uu_shred" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "rand", "uucore", ] @@ -2881,7 +2881,7 @@ dependencies = [ name = "uu_shuf" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "rand", "rand_core", "uucore", @@ -2891,7 +2891,7 @@ dependencies = [ name = "uu_sleep" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2900,7 +2900,7 @@ name = "uu_sort" version = "0.0.13" dependencies = [ "binary-heap-plus", - "clap 3.1.6", + "clap 3.1.8", "compare", "ctrlc", "fnv", @@ -2918,7 +2918,7 @@ dependencies = [ name = "uu_split" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "memchr 2.4.1", "uucore", ] @@ -2927,7 +2927,7 @@ dependencies = [ name = "uu_stat" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2935,7 +2935,7 @@ dependencies = [ name = "uu_stdbuf" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "tempfile", "uu_stdbuf_libstdbuf", "uucore", @@ -2955,7 +2955,7 @@ dependencies = [ name = "uu_sum" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -2963,7 +2963,7 @@ dependencies = [ name = "uu_sync" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "libc", "uucore", "winapi 0.3.9", @@ -2973,7 +2973,7 @@ dependencies = [ name = "uu_tac" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "memchr 2.4.1", "memmap2", "regex", @@ -2984,7 +2984,7 @@ dependencies = [ name = "uu_tail" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "libc", "nix", "uucore", @@ -2995,7 +2995,7 @@ dependencies = [ name = "uu_tee" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "libc", "retain_mut", "uucore", @@ -3005,7 +3005,7 @@ dependencies = [ name = "uu_test" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "libc", "redox_syscall", "uucore", @@ -3015,7 +3015,7 @@ dependencies = [ name = "uu_timeout" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "libc", "nix", "uucore", @@ -3025,7 +3025,7 @@ dependencies = [ name = "uu_touch" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "filetime", "time", "uucore", @@ -3036,7 +3036,7 @@ dependencies = [ name = "uu_tr" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "nom", "uucore", ] @@ -3045,7 +3045,7 @@ dependencies = [ name = "uu_true" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -3053,7 +3053,7 @@ dependencies = [ name = "uu_truncate" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -3061,7 +3061,7 @@ dependencies = [ name = "uu_tsort" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -3070,7 +3070,7 @@ name = "uu_tty" version = "0.0.13" dependencies = [ "atty", - "clap 3.1.6", + "clap 3.1.8", "libc", "uucore", ] @@ -3079,7 +3079,7 @@ dependencies = [ name = "uu_uname" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "platform-info", "uucore", ] @@ -3088,7 +3088,7 @@ dependencies = [ name = "uu_unexpand" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "unicode-width", "uucore", ] @@ -3097,7 +3097,7 @@ dependencies = [ name = "uu_uniq" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "strum", "strum_macros", "uucore", @@ -3107,7 +3107,7 @@ dependencies = [ name = "uu_unlink" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -3116,7 +3116,7 @@ name = "uu_uptime" version = "0.0.13" dependencies = [ "chrono", - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -3124,7 +3124,7 @@ dependencies = [ name = "uu_users" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -3133,7 +3133,7 @@ name = "uu_wc" version = "0.0.13" dependencies = [ "bytecount", - "clap 3.1.6", + "clap 3.1.8", "libc", "nix", "unicode-width", @@ -3145,7 +3145,7 @@ dependencies = [ name = "uu_who" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "uucore", ] @@ -3153,7 +3153,7 @@ dependencies = [ name = "uu_whoami" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "libc", "uucore", "winapi 0.3.9", @@ -3163,7 +3163,7 @@ dependencies = [ name = "uu_yes" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "nix", "uucore", ] @@ -3172,7 +3172,7 @@ dependencies = [ name = "uucore" version = "0.0.13" dependencies = [ - "clap 3.1.6", + "clap 3.1.8", "data-encoding", "data-encoding-macro", "dns-lookup", From a5477960a577bc27d3db01cc0b9a65c251ee38b0 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Mon, 21 Mar 2022 16:45:30 +0100 Subject: [PATCH 078/242] df: show error if specified type doesn't exist Fixes #3252. As a side effect, "df -H -total" will now fail, too, as expected. --- src/uu/df/src/df.rs | 27 ++++++++++++++++++--------- tests/by-util/test_df.rs | 19 ++++++++++++++++++- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/uu/df/src/df.rs b/src/uu/df/src/df.rs index 552ae1387a8..a7520117dcd 100644 --- a/src/uu/df/src/df.rs +++ b/src/uu/df/src/df.rs @@ -358,22 +358,31 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } let opt = Options::from(&matches).map_err(DfError::OptionsError)?; - // Get the list of filesystems to display in the output table. let filesystems: Vec = match matches.values_of(OPT_PATHS) { - None => get_all_filesystems(&opt), + None => { + let filesystems = get_all_filesystems(&opt); + + if filesystems.is_empty() { + return Err(USimpleError::new(1, "No file systems processed")); + } + + filesystems + } Some(paths) => { let paths: Vec<&str> = paths.collect(); - get_named_filesystems(&paths) + let filesystems = get_named_filesystems(&paths); + + // This can happen if paths are given as command-line arguments + // but none of the paths exist. + if filesystems.is_empty() { + return Ok(()); + } + + filesystems } }; - // This can happen if paths are given as command-line arguments - // but none of the paths exist. - if filesystems.is_empty() { - return Ok(()); - } - // The running total of filesystem sizes and usage. // // This accumulator is computed in case we need to display the diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index 1a31109a340..d91f1ac36dd 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -42,6 +42,13 @@ fn test_df_output() { assert_eq!(actual, expected); } +#[test] +fn test_total_option_with_single_dash() { + // These should fail because `-total` should have two dashes, + // not just one. + new_ucmd!().arg("-total").fails(); +} + /// Test that the order of rows in the table does not change across executions. #[test] fn test_order_same() { @@ -89,7 +96,17 @@ fn test_output_option_without_equals_sign() { #[test] fn test_type_option() { - new_ucmd!().args(&["-t", "ext4", "-t", "ext3"]).succeeds(); + let fs_types = new_ucmd!() + .arg("--output=fstype") + .succeeds() + .stdout_move_str(); + let fs_type = fs_types.lines().nth(1).unwrap().trim(); + + new_ucmd!().args(&["-t", fs_type]).succeeds(); + new_ucmd!() + .args(&["-t", fs_type, "-t", "nonexisting"]) + .succeeds(); + new_ucmd!().args(&["-t", "nonexisting"]).fails(); } #[test] From 9036e92fa0b0a754c316adc1928f39710deb865c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Apr 2022 11:10:20 +0000 Subject: [PATCH 079/242] build(deps): bump redox_syscall from 0.2.12 to 0.2.13 Bumps redox_syscall from 0.2.12 to 0.2.13. --- updated-dependencies: - dependency-name: redox_syscall dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9a281523c72..7b17eaafa13 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1607,9 +1607,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae183fc1b06c149f0c1793e1eb447c8b04bfe46d48e9e48bfb8d2d7ed64ecf0" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" dependencies = [ "bitflags", ] From fae0065276c8d80d39c66254eecdfe26fb11bcc6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Apr 2022 11:14:49 +0000 Subject: [PATCH 080/242] build(deps): bump remove_dir_all from 0.5.3 to 0.7.0 Bumps [remove_dir_all](https://github.com/XAMPPRocky/remove_dir_all) from 0.5.3 to 0.7.0. - [Release notes](https://github.com/XAMPPRocky/remove_dir_all/releases) - [Changelog](https://github.com/XAMPPRocky/remove_dir_all/blob/master/CHANGELOG.md) - [Commits](https://github.com/XAMPPRocky/remove_dir_all/compare/remove_dir_all@0.5.3...v0.7.0) --- updated-dependencies: - dependency-name: remove_dir_all dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 17 +++++++++++++++-- src/uu/rm/Cargo.toml | 2 +- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9a281523c72..e860b01cf1a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1661,6 +1661,19 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "remove_dir_all" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "882f368737489ea543bc5c340e6f3d34a28c39980bd9a979e47322b26f60ac40" +dependencies = [ + "libc", + "log", + "num_cpus", + "rayon", + "winapi 0.3.9", +] + [[package]] name = "retain_mut" version = "0.1.2" @@ -1942,7 +1955,7 @@ dependencies = [ "fastrand", "libc", "redox_syscall", - "remove_dir_all", + "remove_dir_all 0.5.3", "winapi 0.3.9", ] @@ -2831,7 +2844,7 @@ name = "uu_rm" version = "0.0.13" dependencies = [ "clap 3.1.8", - "remove_dir_all", + "remove_dir_all 0.7.0", "uucore", "walkdir", "winapi 0.3.9", diff --git a/src/uu/rm/Cargo.toml b/src/uu/rm/Cargo.toml index 630f3a294fe..77d221e394a 100644 --- a/src/uu/rm/Cargo.toml +++ b/src/uu/rm/Cargo.toml @@ -17,7 +17,7 @@ path = "src/rm.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } walkdir = "2.2" -remove_dir_all = "0.5.1" +remove_dir_all = "0.7.0" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["fs"] } [target.'cfg(windows)'.dependencies] From f74f3911e25c01e5127471ecec43f8cf4e4898d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Apr 2022 20:01:46 +0000 Subject: [PATCH 081/242] build(deps): bump rayon from 1.5.1 to 1.5.2 Bumps [rayon](https://github.com/rayon-rs/rayon) from 1.5.1 to 1.5.2. - [Release notes](https://github.com/rayon-rs/rayon/releases) - [Changelog](https://github.com/rayon-rs/rayon/blob/master/RELEASES.md) - [Commits](https://github.com/rayon-rs/rayon/commits) --- updated-dependencies: - dependency-name: rayon dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9a281523c72..bc7431baaf3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1582,9 +1582,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" +checksum = "fd249e82c21598a9a426a4e00dd7adc1d640b22445ec8545feef801d1a74c221" dependencies = [ "autocfg", "crossbeam-deque", @@ -1594,22 +1594,21 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.9.1" +version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" +checksum = "9f51245e1e62e1f1629cbfec37b5793bbabcaeb90f30e94d2ba03564687353e4" dependencies = [ "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "lazy_static", "num_cpus", ] [[package]] name = "redox_syscall" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae183fc1b06c149f0c1793e1eb447c8b04bfe46d48e9e48bfb8d2d7ed64ecf0" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" dependencies = [ "bitflags", ] From c2e214bd9917419ffb0f711c55cc4eb1bf787619 Mon Sep 17 00:00:00 2001 From: gmnsii <95436780+gmnsii@users.noreply.github.com> Date: Fri, 15 Apr 2022 08:30:40 -0700 Subject: [PATCH 082/242] Add dir and vdir utils (based on ls) Fix issue #3163 They are basically ls with some different options. --- .../cspell.dictionaries/people.wordlist.txt | 1 + .../cspell.dictionaries/shell.wordlist.txt | 1 + Cargo.lock | 22 + Cargo.toml | 4 + GNUmakefile | 2 + src/uu/dir/Cargo.toml | 25 + src/uu/dir/LICENSE | 1 + src/uu/dir/src/dir.rs | 70 + src/uu/dir/src/main.rs | 1 + src/uu/ls/src/ls.rs | 1231 ++++++++--------- src/uu/ls/src/quoting_style.rs | 4 +- src/uu/vdir/Cargo.toml | 25 + src/uu/vdir/LICENSE | 1 + src/uu/vdir/src/main.rs | 1 + src/uu/vdir/src/vdir.rs | 68 + tests/by-util/test_dir.rs | 55 + tests/by-util/test_vdir.rs | 55 + util/build-gnu.sh | 2 +- 18 files changed, 950 insertions(+), 619 deletions(-) create mode 100644 src/uu/dir/Cargo.toml create mode 120000 src/uu/dir/LICENSE create mode 100644 src/uu/dir/src/dir.rs create mode 100644 src/uu/dir/src/main.rs create mode 100644 src/uu/vdir/Cargo.toml create mode 120000 src/uu/vdir/LICENSE create mode 100644 src/uu/vdir/src/main.rs create mode 100644 src/uu/vdir/src/vdir.rs create mode 100644 tests/by-util/test_dir.rs create mode 100644 tests/by-util/test_vdir.rs diff --git a/.vscode/cspell.dictionaries/people.wordlist.txt b/.vscode/cspell.dictionaries/people.wordlist.txt index 40573383613..8fe38d88538 100644 --- a/.vscode/cspell.dictionaries/people.wordlist.txt +++ b/.vscode/cspell.dictionaries/people.wordlist.txt @@ -179,3 +179,4 @@ Smigle00 anonymousknight kwantam nicoo +gmnsii diff --git a/.vscode/cspell.dictionaries/shell.wordlist.txt b/.vscode/cspell.dictionaries/shell.wordlist.txt index 4ed281efbff..16d7b25e997 100644 --- a/.vscode/cspell.dictionaries/shell.wordlist.txt +++ b/.vscode/cspell.dictionaries/shell.wordlist.txt @@ -93,6 +93,7 @@ rollup sed selinuxenabled sestatus +vdir wslpath xargs diff --git a/Cargo.lock b/Cargo.lock index bc7431baaf3..c1dec695dfa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -368,6 +368,7 @@ dependencies = [ "uu_date", "uu_dd", "uu_df", + "uu_dir", "uu_dircolors", "uu_dirname", "uu_du", @@ -445,6 +446,7 @@ dependencies = [ "uu_unlink", "uu_uptime", "uu_users", + "uu_vdir", "uu_wc", "uu_who", "uu_whoami", @@ -2376,6 +2378,16 @@ dependencies = [ "uucore", ] +[[package]] +name = "uu_dir" +version = "0.0.13" +dependencies = [ + "clap 3.1.8", + "selinux", + "uu_ls", + "uucore", +] + [[package]] name = "uu_dircolors" version = "0.0.13" @@ -3127,6 +3139,16 @@ dependencies = [ "uucore", ] +[[package]] +name = "uu_vdir" +version = "0.0.13" +dependencies = [ + "clap 3.1.8", + "selinux", + "uu_ls", + "uucore", +] + [[package]] name = "uu_wc" version = "0.0.13" diff --git a/Cargo.toml b/Cargo.toml index 12959ad35ad..f5932b1cf6a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,6 +45,7 @@ feat_common_core = [ "cut", "date", "df", + "dir", "dircolors", "dirname", "dd", @@ -100,6 +101,7 @@ feat_common_core = [ "unexpand", "uniq", "unlink", + "vdir", "wc", "yes", ] @@ -276,6 +278,7 @@ cut = { optional=true, version="0.0.13", package="uu_cut", path="src/uu/cut date = { optional=true, version="0.0.13", package="uu_date", path="src/uu/date" } dd = { optional=true, version="0.0.13", package="uu_dd", path="src/uu/dd" } df = { optional=true, version="0.0.13", package="uu_df", path="src/uu/df" } +dir = { optional=true, version="0.0.13", package="uu_dir", path="src/uu/dir" } dircolors= { optional=true, version="0.0.13", package="uu_dircolors", path="src/uu/dircolors" } dirname = { optional=true, version="0.0.13", package="uu_dirname", path="src/uu/dirname" } du = { optional=true, version="0.0.13", package="uu_du", path="src/uu/du" } @@ -352,6 +355,7 @@ uniq = { optional=true, version="0.0.13", package="uu_uniq", path="src/uu/un unlink = { optional=true, version="0.0.13", package="uu_unlink", path="src/uu/unlink" } uptime = { optional=true, version="0.0.13", package="uu_uptime", path="src/uu/uptime" } users = { optional=true, version="0.0.13", package="uu_users", path="src/uu/users" } +vdir = { optional=true, version="0.0.13", package="uu_vdir", path="src/uu/vdir" } wc = { optional=true, version="0.0.13", package="uu_wc", path="src/uu/wc" } who = { optional=true, version="0.0.13", package="uu_who", path="src/uu/who" } whoami = { optional=true, version="0.0.13", package="uu_whoami", path="src/uu/whoami" } diff --git a/GNUmakefile b/GNUmakefile index ade50214068..d3c26ce8026 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -65,6 +65,7 @@ PROGS := \ date \ dd \ df \ + dir \ dircolors \ dirname \ echo \ @@ -118,6 +119,7 @@ PROGS := \ tsort \ unexpand \ uniq \ + vdir \ wc \ whoami \ yes diff --git a/src/uu/dir/Cargo.toml b/src/uu/dir/Cargo.toml new file mode 100644 index 00000000000..542abdc630e --- /dev/null +++ b/src/uu/dir/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "uu_dir" +version = "0.0.13" +authors = ["uutils developers"] +license = "MIT" +description = "shortcut to ls -C -b" + +homepage = "https://github.com/uutils/coreutils" +repository = "https://github.com/uutils/coreutils/tree/main/src/uu/ls" +keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] +categories = ["command-line-utilities"] +edition = "2021" + +[lib] +path = "src/dir.rs" + +[dependencies] +clap = { version = "3.1", features = ["wrap_help", "cargo", "env"] } +uucore = { version = ">=0.0.8", package = "uucore", path = "../../uucore", features = ["entries", "fs"] } +selinux = { version="0.2", optional = true } +uu_ls = {path="../ls"} + +[[bin]] +name = "dir" +path = "src/main.rs" diff --git a/src/uu/dir/LICENSE b/src/uu/dir/LICENSE new file mode 120000 index 00000000000..5853aaea53b --- /dev/null +++ b/src/uu/dir/LICENSE @@ -0,0 +1 @@ +../../../LICENSE \ No newline at end of file diff --git a/src/uu/dir/src/dir.rs b/src/uu/dir/src/dir.rs new file mode 100644 index 00000000000..74907472668 --- /dev/null +++ b/src/uu/dir/src/dir.rs @@ -0,0 +1,70 @@ +// * This file is part of the uutils coreutils package. +// * +// * (c) gmnsii +// * +// * For the full copyright and license information, please view the LICENSE file +// * that was distributed with this source code. + +use clap::Command; +use std::path::Path; +use uu_ls::quoting_style::{Quotes, QuotingStyle}; +use uu_ls::{options, Config, Format}; +use uucore::error::UResult; + +#[uucore::main] +pub fn uumain(args: impl uucore::Args) -> UResult<()> { + let command = uu_ls::uu_app(); + + let matches = command.get_matches_from(args); + + let mut default_quoting_style = false; + let mut default_format_style = false; + + // We check if any options on formatting or quoting style have been given. + // If not, we will use dir default formatting and quoting style options + + if !matches.is_present(options::QUOTING_STYLE) + && !matches.is_present(options::quoting::C) + && !matches.is_present(options::quoting::ESCAPE) + && !matches.is_present(options::quoting::LITERAL) + { + default_quoting_style = true; + } + if !matches.is_present(options::FORMAT) + && !matches.is_present(options::format::ACROSS) + && !matches.is_present(options::format::COLUMNS) + && !matches.is_present(options::format::COMMAS) + && !matches.is_present(options::format::LONG) + && !matches.is_present(options::format::LONG_NO_GROUP) + && !matches.is_present(options::format::LONG_NO_OWNER) + && !matches.is_present(options::format::LONG_NUMERIC_UID_GID) + && !matches.is_present(options::format::ONE_LINE) + { + default_format_style = true; + } + + let mut config = Config::from(&matches)?; + + if default_quoting_style { + config.quoting_style = QuotingStyle::C { + quotes: Quotes::None, + }; + } + if default_format_style { + config.format = Format::Columns; + } + + let locs = matches + .values_of_os(options::PATHS) + .map(|v| v.map(Path::new).collect()) + .unwrap_or_else(|| vec![Path::new(".")]); + + uu_ls::list(locs, &config) +} + +// To avoid code duplication, we reuse ls uu_app function which has the same +// arguments. However, coreutils won't compile if one of the utils is missing +// an uu_app function, so we need this dummy one. +pub fn uu_app<'a>() -> Command<'a> { + Command::new(uucore::util_name()) +} diff --git a/src/uu/dir/src/main.rs b/src/uu/dir/src/main.rs new file mode 100644 index 00000000000..c5b5b6363d8 --- /dev/null +++ b/src/uu/dir/src/main.rs @@ -0,0 +1 @@ +uucore::bin!(uu_dir); diff --git a/src/uu/ls/src/ls.rs b/src/uu/ls/src/ls.rs index 7782830393b..a55f29e238d 100644 --- a/src/uu/ls/src/ls.rs +++ b/src/uu/ls/src/ls.rs @@ -13,7 +13,8 @@ extern crate uucore; #[macro_use] extern crate lazy_static; -mod quoting_style; +// dir and vdir also need access to the quoting_style module +pub mod quoting_style; use clap::{crate_version, Arg, Command}; use glob::Pattern; @@ -242,7 +243,7 @@ impl Display for LsError { } #[derive(PartialEq, Eq)] -enum Format { +pub enum Format { Columns, Long, OneLine, @@ -304,8 +305,9 @@ enum IndicatorStyle { Classify, } -struct Config { - format: Format, +pub struct Config { + // Dir and vdir needs access to this field + pub format: Format, files: Files, sort: Sort, recursive: bool, @@ -322,7 +324,8 @@ struct Config { alloc_size: bool, block_size: Option, width: u16, - quoting_style: QuotingStyle, + // Dir and vdir needs access to this field + pub quoting_style: QuotingStyle, indicator_style: IndicatorStyle, time_style: TimeStyle, context: bool, @@ -355,7 +358,7 @@ struct PaddingCollection { impl Config { #[allow(clippy::cognitive_complexity)] - fn from(options: &clap::ArgMatches) -> UResult { + pub fn from(options: &clap::ArgMatches) -> UResult { let context = options.is_present(options::CONTEXT); let (mut format, opt) = if let Some(format_) = options.value_of(options::FORMAT) { ( @@ -800,615 +803,611 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app<'a>() -> Command<'a> { Command::new(uucore::util_name()) .version(crate_version!()) - .override_usage(format_usage(USAGE)) - .about( - "By default, ls will list the files and contents of any directories on \ - the command line, expect that it will ignore files and directories \ - whose names start with '.'.", - ) - .infer_long_args(true) - .arg( - Arg::new(options::HELP) - .long(options::HELP) - .help("Print help information.") - ) - // Format arguments - .arg( - Arg::new(options::FORMAT) - .long(options::FORMAT) - .help("Set the display format.") - .takes_value(true) - .possible_values(&[ - "long", - "verbose", - "single-column", - "columns", - "vertical", - "across", - "horizontal", - "commas", - ]) - .hide_possible_values(true) - .require_equals(true) - .overrides_with_all(&[ - options::FORMAT, - options::format::COLUMNS, - options::format::LONG, - options::format::ACROSS, - options::format::COLUMNS, - ]), - ) - .arg( - Arg::new(options::format::COLUMNS) - .short('C') - .help("Display the files in columns.") - .overrides_with_all(&[ - options::FORMAT, - options::format::COLUMNS, - options::format::LONG, - options::format::ACROSS, - options::format::COLUMNS, - ]), - ) - .arg( - Arg::new(options::format::LONG) - .short('l') - .long(options::format::LONG) - .help("Display detailed information.") - .overrides_with_all(&[ - options::FORMAT, - options::format::COLUMNS, - options::format::LONG, - options::format::ACROSS, - options::format::COLUMNS, - ]), - ) - .arg( - Arg::new(options::format::ACROSS) - .short('x') - .help("List entries in rows instead of in columns.") - .overrides_with_all(&[ - options::FORMAT, - options::format::COLUMNS, - options::format::LONG, - options::format::ACROSS, - options::format::COLUMNS, - ]), - ) - .arg( - Arg::new(options::format::COMMAS) - .short('m') - .help("List entries separated by commas.") - .overrides_with_all(&[ - options::FORMAT, - options::format::COLUMNS, - options::format::LONG, - options::format::ACROSS, - options::format::COLUMNS, - ]), - ) - // The next four arguments do not override with the other format - // options, see the comment in Config::from for the reason. - // Ideally, they would use Arg::override_with, with their own name - // but that doesn't seem to work in all cases. Example: - // ls -1g1 - // even though `ls -11` and `ls -1 -g -1` work. - .arg( - Arg::new(options::format::ONE_LINE) - .short('1') - .help("List one file per line.") - .multiple_occurrences(true), - ) - .arg( - Arg::new(options::format::LONG_NO_GROUP) - .short('o') - .help( - "Long format without group information. \ - Identical to --format=long with --no-group.", - ) - .multiple_occurrences(true), - ) - .arg( - Arg::new(options::format::LONG_NO_OWNER) - .short('g') - .help("Long format without owner information.") - .multiple_occurrences(true), - ) - .arg( - Arg::new(options::format::LONG_NUMERIC_UID_GID) - .short('n') - .long(options::format::LONG_NUMERIC_UID_GID) - .help("-l with numeric UIDs and GIDs.") - .multiple_occurrences(true), - ) - // Quoting style - .arg( - Arg::new(options::QUOTING_STYLE) - .long(options::QUOTING_STYLE) - .takes_value(true) - .help("Set quoting style.") - .possible_values(&[ - "literal", - "shell", - "shell-always", - "shell-escape", - "shell-escape-always", - "c", - "escape", - ]) - .overrides_with_all(&[ - options::QUOTING_STYLE, - options::quoting::LITERAL, - options::quoting::ESCAPE, - options::quoting::C, - ]), - ) - .arg( - Arg::new(options::quoting::LITERAL) - .short('N') - .long(options::quoting::LITERAL) - .help("Use literal quoting style. Equivalent to `--quoting-style=literal`") - .overrides_with_all(&[ - options::QUOTING_STYLE, - options::quoting::LITERAL, - options::quoting::ESCAPE, - options::quoting::C, - ]), - ) - .arg( - Arg::new(options::quoting::ESCAPE) - .short('b') - .long(options::quoting::ESCAPE) - .help("Use escape quoting style. Equivalent to `--quoting-style=escape`") - .overrides_with_all(&[ - options::QUOTING_STYLE, - options::quoting::LITERAL, - options::quoting::ESCAPE, - options::quoting::C, - ]), - ) - .arg( - Arg::new(options::quoting::C) - .short('Q') - .long(options::quoting::C) - .help("Use C quoting style. Equivalent to `--quoting-style=c`") - .overrides_with_all(&[ - options::QUOTING_STYLE, - options::quoting::LITERAL, - options::quoting::ESCAPE, - options::quoting::C, - ]), - ) - // Control characters - .arg( - Arg::new(options::HIDE_CONTROL_CHARS) - .short('q') - .long(options::HIDE_CONTROL_CHARS) - .help("Replace control characters with '?' if they are not escaped.") - .overrides_with_all(&[options::HIDE_CONTROL_CHARS, options::SHOW_CONTROL_CHARS]), - ) - .arg( - Arg::new(options::SHOW_CONTROL_CHARS) - .long(options::SHOW_CONTROL_CHARS) - .help("Show control characters 'as is' if they are not escaped.") - .overrides_with_all(&[options::HIDE_CONTROL_CHARS, options::SHOW_CONTROL_CHARS]), - ) - // Time arguments - .arg( - Arg::new(options::TIME) - .long(options::TIME) - .help( - "Show time in :\n\ - \taccess time (-u): atime, access, use;\n\ - \tchange time (-t): ctime, status.\n\ - \tbirth time: birth, creation;", - ) - .value_name("field") - .takes_value(true) - .possible_values(&[ - "atime", "access", "use", "ctime", "status", "birth", "creation", - ]) - .hide_possible_values(true) - .require_equals(true) - .overrides_with_all(&[options::TIME, options::time::ACCESS, options::time::CHANGE]), - ) - .arg( - Arg::new(options::time::CHANGE) - .short('c') - .help( - "If the long listing format (e.g., -l, -o) is being used, print the status \ - change time (the 'ctime' in the inode) instead of the modification time. When \ - explicitly sorting by time (--sort=time or -t) or when not using a long listing \ - format, sort according to the status change time.", - ) - .overrides_with_all(&[options::TIME, options::time::ACCESS, options::time::CHANGE]), - ) - .arg( - Arg::new(options::time::ACCESS) - .short('u') - .help( - "If the long listing format (e.g., -l, -o) is being used, print the status \ - access time instead of the modification time. When explicitly sorting by time \ - (--sort=time or -t) or when not using a long listing format, sort according to the \ - access time.", - ) - .overrides_with_all(&[options::TIME, options::time::ACCESS, options::time::CHANGE]), - ) - // Hide and ignore - .arg( - Arg::new(options::HIDE) - .long(options::HIDE) - .takes_value(true) - .multiple_occurrences(true) - .value_name("PATTERN") - .help( - "do not list implied entries matching shell PATTERN (overridden by -a or -A)", - ), - ) - .arg( - Arg::new(options::IGNORE) - .short('I') - .long(options::IGNORE) - .takes_value(true) - .multiple_occurrences(true) - .value_name("PATTERN") - .help("do not list implied entries matching shell PATTERN"), - ) - .arg( - Arg::new(options::IGNORE_BACKUPS) - .short('B') - .long(options::IGNORE_BACKUPS) - .help("Ignore entries which end with ~."), - ) - // Sort arguments - .arg( - Arg::new(options::SORT) - .long(options::SORT) - .help("Sort by : name, none (-U), time (-t), size (-S) or extension (-X)") - .value_name("field") - .takes_value(true) - .possible_values(&["name", "none", "time", "size", "version", "extension"]) - .require_equals(true) - .overrides_with_all(&[ - options::SORT, - options::sort::SIZE, - options::sort::TIME, - options::sort::NONE, - options::sort::VERSION, - options::sort::EXTENSION, - ]), - ) - .arg( - Arg::new(options::sort::SIZE) - .short('S') - .help("Sort by file size, largest first.") - .overrides_with_all(&[ - options::SORT, - options::sort::SIZE, - options::sort::TIME, - options::sort::NONE, - options::sort::VERSION, - options::sort::EXTENSION, - ]), - ) - .arg( - Arg::new(options::sort::TIME) - .short('t') - .help("Sort by modification time (the 'mtime' in the inode), newest first.") - .overrides_with_all(&[ - options::SORT, - options::sort::SIZE, - options::sort::TIME, - options::sort::NONE, - options::sort::VERSION, - options::sort::EXTENSION, - ]), - ) - .arg( - Arg::new(options::sort::VERSION) - .short('v') - .help("Natural sort of (version) numbers in the filenames.") - .overrides_with_all(&[ - options::SORT, - options::sort::SIZE, - options::sort::TIME, - options::sort::NONE, - options::sort::VERSION, - options::sort::EXTENSION, - ]), - ) - .arg( - Arg::new(options::sort::EXTENSION) - .short('X') - .help("Sort alphabetically by entry extension.") - .overrides_with_all(&[ - options::SORT, - options::sort::SIZE, - options::sort::TIME, - options::sort::NONE, - options::sort::VERSION, - options::sort::EXTENSION, - ]), - ) - .arg( - Arg::new(options::sort::NONE) - .short('U') - .help( - "Do not sort; list the files in whatever order they are stored in the \ - directory. This is especially useful when listing very large directories, \ - since not doing any sorting can be noticeably faster.", - ) - .overrides_with_all(&[ - options::SORT, - options::sort::SIZE, - options::sort::TIME, - options::sort::NONE, - options::sort::VERSION, - options::sort::EXTENSION, - ]), - ) - // Dereferencing - .arg( - Arg::new(options::dereference::ALL) - .short('L') - .long(options::dereference::ALL) - .help( - "When showing file information for a symbolic link, show information for the \ - file the link references rather than the link itself.", - ) - .overrides_with_all(&[ - options::dereference::ALL, - options::dereference::DIR_ARGS, - options::dereference::ARGS, - ]), - ) - .arg( - Arg::new(options::dereference::DIR_ARGS) - .long(options::dereference::DIR_ARGS) - .help( - "Do not dereference symlinks except when they link to directories and are \ - given as command line arguments.", - ) - .overrides_with_all(&[ - options::dereference::ALL, - options::dereference::DIR_ARGS, - options::dereference::ARGS, - ]), - ) - .arg( - Arg::new(options::dereference::ARGS) - .short('H') - .long(options::dereference::ARGS) - .help("Do not dereference symlinks except when given as command line arguments.") - .overrides_with_all(&[ - options::dereference::ALL, - options::dereference::DIR_ARGS, - options::dereference::ARGS, - ]), - ) - // Long format options - .arg( - Arg::new(options::NO_GROUP) - .long(options::NO_GROUP) - .short('G') - .help("Do not show group in long format."), - ) - .arg(Arg::new(options::AUTHOR).long(options::AUTHOR).help( - "Show author in long format. \ - On the supported platforms, the author always matches the file owner.", - )) - // Other Flags - .arg( - Arg::new(options::files::ALL) - .short('a') - .long(options::files::ALL) - // Overrides -A (as the order matters) - .overrides_with(options::files::ALMOST_ALL) - .multiple_occurrences(true) - .help("Do not ignore hidden files (files with names that start with '.')."), - ) - .arg( - Arg::new(options::files::ALMOST_ALL) - .short('A') - .long(options::files::ALMOST_ALL) - // Overrides -a (as the order matters) - .overrides_with(options::files::ALL) - .multiple_occurrences(true) - .help( - "In a directory, do not ignore all file names that start with '.', \ -only ignore '.' and '..'.", - ), - ) - .arg( - Arg::new(options::DIRECTORY) - .short('d') - .long(options::DIRECTORY) - .help( - "Only list the names of directories, rather than listing directory contents. \ - This will not follow symbolic links unless one of `--dereference-command-line \ - (-H)`, `--dereference (-L)`, or `--dereference-command-line-symlink-to-dir` is \ - specified.", - ), - ) - .arg( - Arg::new(options::size::HUMAN_READABLE) - .short('h') - .long(options::size::HUMAN_READABLE) - .help("Print human readable file sizes (e.g. 1K 234M 56G).") - .overrides_with(options::size::SI), - ) - .arg( - Arg::new(options::size::KIBIBYTES) - .short('k') - .long(options::size::KIBIBYTES) - .help("default to 1024-byte blocks for file system usage; used only with -s and per directory totals"), - ) - .arg( - Arg::new(options::size::SI) - .long(options::size::SI) - .help("Print human readable file sizes using powers of 1000 instead of 1024."), - ) - .arg( - Arg::new(options::size::BLOCK_SIZE) - .long(options::size::BLOCK_SIZE) - .takes_value(true) - .require_equals(true) - .value_name("BLOCK_SIZE") - .help("scale sizes by BLOCK_SIZE when printing them"), - ) - .arg( - Arg::new(options::INODE) - .short('i') - .long(options::INODE) - .help("print the index number of each file"), - ) - .arg( - Arg::new(options::REVERSE) - .short('r') - .long(options::REVERSE) - .help( - "Reverse whatever the sorting method is e.g., list files in reverse \ - alphabetical order, youngest first, smallest first, or whatever.", - ), - ) - .arg( - Arg::new(options::RECURSIVE) - .short('R') - .long(options::RECURSIVE) - .help("List the contents of all directories recursively."), - ) - .arg( - Arg::new(options::WIDTH) - .long(options::WIDTH) - .short('w') - .help("Assume that the terminal is COLS columns wide.") - .value_name("COLS") - .takes_value(true), - ) - .arg( - Arg::new(options::size::ALLOCATION_SIZE) - .short('s') - .long(options::size::ALLOCATION_SIZE) - .help("print the allocated size of each file, in blocks"), - ) - .arg( - Arg::new(options::COLOR) - .long(options::COLOR) - .help("Color output based on file type.") - .takes_value(true) - .possible_values(&[ - "always", "yes", "force", "auto", "tty", "if-tty", "never", "no", "none", - ]) - .require_equals(true) - .min_values(0), - ) - .arg( - Arg::new(options::INDICATOR_STYLE) - .long(options::INDICATOR_STYLE) - .help( - "Append indicator with style WORD to entry names: \ - none (default), slash (-p), file-type (--file-type), classify (-F)", - ) - .takes_value(true) - .possible_values(&["none", "slash", "file-type", "classify"]) - .overrides_with_all(&[ - options::indicator_style::FILE_TYPE, - options::indicator_style::SLASH, - options::indicator_style::CLASSIFY, - options::INDICATOR_STYLE, - ]), - ) - .arg( - // The --classify flag can take an optional when argument to - // control its behavior from version 9 of GNU coreutils. - // There is currently an inconsistency where GNU coreutils allows only - // the long form of the flag to take the argument while we allow it - // for both the long and short form of the flag. - Arg::new(options::indicator_style::CLASSIFY) - .short('F') - .long(options::indicator_style::CLASSIFY) - .help( - "Append a character to each file name indicating the file type. Also, for \ - regular files that are executable, append '*'. The file type indicators are \ - '/' for directories, '@' for symbolic links, '|' for FIFOs, '=' for sockets, \ - '>' for doors, and nothing for regular files. when may be omitted, or one of:\n\ - \tnone - Do not classify. This is the default.\n\ - \tauto - Only classify if standard output is a terminal.\n\ - \talways - Always classify.\n\ - Specifying --classify and no when is equivalent to --classify=always. This will not follow\ - symbolic links listed on the command line unless the --dereference-command-line (-H),\ - --dereference (-L), or --dereference-command-line-symlink-to-dir options are specified.", - ) - .takes_value(true) - .value_name("when") - .possible_values(&[ - "always", "yes", "force", "auto", "tty", "if-tty", "never", "no", "none", - ]) - .default_missing_value("always") - .require_equals(true) - .min_values(0) - .overrides_with_all(&[ - options::indicator_style::FILE_TYPE, - options::indicator_style::SLASH, - options::indicator_style::CLASSIFY, - options::INDICATOR_STYLE, - ]), - ) - .arg( - Arg::new(options::indicator_style::FILE_TYPE) - .long(options::indicator_style::FILE_TYPE) - .help("Same as --classify, but do not append '*'") - .overrides_with_all(&[ - options::indicator_style::FILE_TYPE, - options::indicator_style::SLASH, - options::indicator_style::CLASSIFY, - options::INDICATOR_STYLE, - ]), - ) - .arg( - Arg::new(options::indicator_style::SLASH) - .short('p') - .help("Append / indicator to directories.") - .overrides_with_all(&[ - options::indicator_style::FILE_TYPE, - options::indicator_style::SLASH, - options::indicator_style::CLASSIFY, - options::INDICATOR_STYLE, - ]), - ) - .arg( - //This still needs support for posix-*, +FORMAT - Arg::new(options::TIME_STYLE) - .long(options::TIME_STYLE) - .help("time/date format with -l; see TIME_STYLE below") - .value_name("TIME_STYLE") - .env("TIME_STYLE") - .possible_values(&["full-iso", "long-iso", "iso", "locale"]) - .overrides_with_all(&[options::TIME_STYLE]), - ) - .arg( - Arg::new(options::FULL_TIME) - .long(options::FULL_TIME) - .overrides_with(options::FULL_TIME) - .help("like -l --time-style=full-iso"), - ) - .arg( - Arg::new(options::CONTEXT) - .short('Z') - .long(options::CONTEXT) - .help(CONTEXT_HELP_TEXT), - ) - // Positional arguments - .arg( - Arg::new(options::PATHS) - .multiple_occurrences(true) - .takes_value(true) - .allow_invalid_utf8(true), - ) - .after_help( - "The TIME_STYLE argument can be full-iso, long-iso, iso. \ - Also the TIME_STYLE environment variable sets the default style to use.", - ) + .override_usage(format_usage(USAGE)) + .about("List directory contents. Ignore files and directories starting with a '.' by default") + .infer_long_args(true) + .arg( + Arg::new(options::HELP) + .long(options::HELP) + .help("Print help information.") + ) + // Format arguments + .arg( + Arg::new(options::FORMAT) + .long(options::FORMAT) + .help("Set the display format.") + .takes_value(true) + .possible_values(&[ + "long", + "verbose", + "single-column", + "columns", + "vertical", + "across", + "horizontal", + "commas", + ]) + .hide_possible_values(true) + .require_equals(true) + .overrides_with_all(&[ + options::FORMAT, + options::format::COLUMNS, + options::format::LONG, + options::format::ACROSS, + options::format::COLUMNS, + ]), + ) + .arg( + Arg::new(options::format::COLUMNS) + .short('C') + .help("Display the files in columns.") + .overrides_with_all(&[ + options::FORMAT, + options::format::COLUMNS, + options::format::LONG, + options::format::ACROSS, + options::format::COLUMNS, + ]), + ) + .arg( + Arg::new(options::format::LONG) + .short('l') + .long(options::format::LONG) + .help("Display detailed information.") + .overrides_with_all(&[ + options::FORMAT, + options::format::COLUMNS, + options::format::LONG, + options::format::ACROSS, + options::format::COLUMNS, + ]), + ) + .arg( + Arg::new(options::format::ACROSS) + .short('x') + .help("List entries in rows instead of in columns.") + .overrides_with_all(&[ + options::FORMAT, + options::format::COLUMNS, + options::format::LONG, + options::format::ACROSS, + options::format::COLUMNS, + ]), + ) + .arg( + Arg::new(options::format::COMMAS) + .short('m') + .help("List entries separated by commas.") + .overrides_with_all(&[ + options::FORMAT, + options::format::COLUMNS, + options::format::LONG, + options::format::ACROSS, + options::format::COLUMNS, + ]), + ) + // The next four arguments do not override with the other format + // options, see the comment in Config::from for the reason. + // Ideally, they would use Arg::override_with, with their own name + // but that doesn't seem to work in all cases. Example: + // ls -1g1 + // even though `ls -11` and `ls -1 -g -1` work. + .arg( + Arg::new(options::format::ONE_LINE) + .short('1') + .help("List one file per line.") + .multiple_occurrences(true), + ) + .arg( + Arg::new(options::format::LONG_NO_GROUP) + .short('o') + .help( + "Long format without group information. \ + Identical to --format=long with --no-group.", + ) + .multiple_occurrences(true), + ) + .arg( + Arg::new(options::format::LONG_NO_OWNER) + .short('g') + .help("Long format without owner information.") + .multiple_occurrences(true), + ) + .arg( + Arg::new(options::format::LONG_NUMERIC_UID_GID) + .short('n') + .long(options::format::LONG_NUMERIC_UID_GID) + .help("-l with numeric UIDs and GIDs.") + .multiple_occurrences(true), + ) + // Quoting style + .arg( + Arg::new(options::QUOTING_STYLE) + .long(options::QUOTING_STYLE) + .takes_value(true) + .help("Set quoting style.") + .possible_values(&[ + "literal", + "shell", + "shell-always", + "shell-escape", + "shell-escape-always", + "c", + "escape", + ]) + .overrides_with_all(&[ + options::QUOTING_STYLE, + options::quoting::LITERAL, + options::quoting::ESCAPE, + options::quoting::C, + ]), + ) + .arg( + Arg::new(options::quoting::LITERAL) + .short('N') + .long(options::quoting::LITERAL) + .help("Use literal quoting style. Equivalent to `--quoting-style=literal`") + .overrides_with_all(&[ + options::QUOTING_STYLE, + options::quoting::LITERAL, + options::quoting::ESCAPE, + options::quoting::C, + ]), + ) + .arg( + Arg::new(options::quoting::ESCAPE) + .short('b') + .long(options::quoting::ESCAPE) + .help("Use escape quoting style. Equivalent to `--quoting-style=escape`") + .overrides_with_all(&[ + options::QUOTING_STYLE, + options::quoting::LITERAL, + options::quoting::ESCAPE, + options::quoting::C, + ]), + ) + .arg( + Arg::new(options::quoting::C) + .short('Q') + .long(options::quoting::C) + .help("Use C quoting style. Equivalent to `--quoting-style=c`") + .overrides_with_all(&[ + options::QUOTING_STYLE, + options::quoting::LITERAL, + options::quoting::ESCAPE, + options::quoting::C, + ]), + ) + // Control characters + .arg( + Arg::new(options::HIDE_CONTROL_CHARS) + .short('q') + .long(options::HIDE_CONTROL_CHARS) + .help("Replace control characters with '?' if they are not escaped.") + .overrides_with_all(&[options::HIDE_CONTROL_CHARS, options::SHOW_CONTROL_CHARS]), + ) + .arg( + Arg::new(options::SHOW_CONTROL_CHARS) + .long(options::SHOW_CONTROL_CHARS) + .help("Show control characters 'as is' if they are not escaped.") + .overrides_with_all(&[options::HIDE_CONTROL_CHARS, options::SHOW_CONTROL_CHARS]), + ) + // Time arguments + .arg( + Arg::new(options::TIME) + .long(options::TIME) + .help( + "Show time in :\n\ + \taccess time (-u): atime, access, use;\n\ + \tchange time (-t): ctime, status.\n\ + \tbirth time: birth, creation;", + ) + .value_name("field") + .takes_value(true) + .possible_values(&[ + "atime", "access", "use", "ctime", "status", "birth", "creation", + ]) + .hide_possible_values(true) + .require_equals(true) + .overrides_with_all(&[options::TIME, options::time::ACCESS, options::time::CHANGE]), + ) + .arg( + Arg::new(options::time::CHANGE) + .short('c') + .help( + "If the long listing format (e.g., -l, -o) is being used, print the status \ + change time (the 'ctime' in the inode) instead of the modification time. When \ + explicitly sorting by time (--sort=time or -t) or when not using a long listing \ + format, sort according to the status change time.", + ) + .overrides_with_all(&[options::TIME, options::time::ACCESS, options::time::CHANGE]), + ) + .arg( + Arg::new(options::time::ACCESS) + .short('u') + .help( + "If the long listing format (e.g., -l, -o) is being used, print the status \ + access time instead of the modification time. When explicitly sorting by time \ + (--sort=time or -t) or when not using a long listing format, sort according to the \ + access time.", + ) + .overrides_with_all(&[options::TIME, options::time::ACCESS, options::time::CHANGE]), + ) + // Hide and ignore + .arg( + Arg::new(options::HIDE) + .long(options::HIDE) + .takes_value(true) + .multiple_occurrences(true) + .value_name("PATTERN") + .help( + "do not list implied entries matching shell PATTERN (overridden by -a or -A)", + ), + ) + .arg( + Arg::new(options::IGNORE) + .short('I') + .long(options::IGNORE) + .takes_value(true) + .multiple_occurrences(true) + .value_name("PATTERN") + .help("do not list implied entries matching shell PATTERN"), + ) + .arg( + Arg::new(options::IGNORE_BACKUPS) + .short('B') + .long(options::IGNORE_BACKUPS) + .help("Ignore entries which end with ~."), + ) + // Sort arguments + .arg( + Arg::new(options::SORT) + .long(options::SORT) + .help("Sort by : name, none (-U), time (-t), size (-S) or extension (-X)") + .value_name("field") + .takes_value(true) + .possible_values(&["name", "none", "time", "size", "version", "extension"]) + .require_equals(true) + .overrides_with_all(&[ + options::SORT, + options::sort::SIZE, + options::sort::TIME, + options::sort::NONE, + options::sort::VERSION, + options::sort::EXTENSION, + ]), + ) + .arg( + Arg::new(options::sort::SIZE) + .short('S') + .help("Sort by file size, largest first.") + .overrides_with_all(&[ + options::SORT, + options::sort::SIZE, + options::sort::TIME, + options::sort::NONE, + options::sort::VERSION, + options::sort::EXTENSION, + ]), + ) + .arg( + Arg::new(options::sort::TIME) + .short('t') + .help("Sort by modification time (the 'mtime' in the inode), newest first.") + .overrides_with_all(&[ + options::SORT, + options::sort::SIZE, + options::sort::TIME, + options::sort::NONE, + options::sort::VERSION, + options::sort::EXTENSION, + ]), + ) + .arg( + Arg::new(options::sort::VERSION) + .short('v') + .help("Natural sort of (version) numbers in the filenames.") + .overrides_with_all(&[ + options::SORT, + options::sort::SIZE, + options::sort::TIME, + options::sort::NONE, + options::sort::VERSION, + options::sort::EXTENSION, + ]), + ) + .arg( + Arg::new(options::sort::EXTENSION) + .short('X') + .help("Sort alphabetically by entry extension.") + .overrides_with_all(&[ + options::SORT, + options::sort::SIZE, + options::sort::TIME, + options::sort::NONE, + options::sort::VERSION, + options::sort::EXTENSION, + ]), + ) + .arg( + Arg::new(options::sort::NONE) + .short('U') + .help( + "Do not sort; list the files in whatever order they are stored in the \ + directory. This is especially useful when listing very large directories, \ + since not doing any sorting can be noticeably faster.", + ) + .overrides_with_all(&[ + options::SORT, + options::sort::SIZE, + options::sort::TIME, + options::sort::NONE, + options::sort::VERSION, + options::sort::EXTENSION, + ]), + ) + // Dereferencing + .arg( + Arg::new(options::dereference::ALL) + .short('L') + .long(options::dereference::ALL) + .help( + "When showing file information for a symbolic link, show information for the \ + file the link references rather than the link itself.", + ) + .overrides_with_all(&[ + options::dereference::ALL, + options::dereference::DIR_ARGS, + options::dereference::ARGS, + ]), + ) + .arg( + Arg::new(options::dereference::DIR_ARGS) + .long(options::dereference::DIR_ARGS) + .help( + "Do not dereference symlinks except when they link to directories and are \ + given as command line arguments.", + ) + .overrides_with_all(&[ + options::dereference::ALL, + options::dereference::DIR_ARGS, + options::dereference::ARGS, + ]), + ) + .arg( + Arg::new(options::dereference::ARGS) + .short('H') + .long(options::dereference::ARGS) + .help("Do not dereference symlinks except when given as command line arguments.") + .overrides_with_all(&[ + options::dereference::ALL, + options::dereference::DIR_ARGS, + options::dereference::ARGS, + ]), + ) + // Long format options + .arg( + Arg::new(options::NO_GROUP) + .long(options::NO_GROUP) + .short('G') + .help("Do not show group in long format."), + ) + .arg(Arg::new(options::AUTHOR).long(options::AUTHOR).help( + "Show author in long format. \ + On the supported platforms, the author always matches the file owner.", + )) + // Other Flags + .arg( + Arg::new(options::files::ALL) + .short('a') + .long(options::files::ALL) + // Overrides -A (as the order matters) + .overrides_with(options::files::ALMOST_ALL) + .multiple_occurrences(true) + .help("Do not ignore hidden files (files with names that start with '.')."), + ) + .arg( + Arg::new(options::files::ALMOST_ALL) + .short('A') + .long(options::files::ALMOST_ALL) + // Overrides -a (as the order matters) + .overrides_with(options::files::ALL) + .multiple_occurrences(true) + .help( + "In a directory, do not ignore all file names that start with '.', \ + only ignore '.' and '..'.", + ), + ) + .arg( + Arg::new(options::DIRECTORY) + .short('d') + .long(options::DIRECTORY) + .help( + "Only list the names of directories, rather than listing directory contents. \ + This will not follow symbolic links unless one of `--dereference-command-line \ + (-H)`, `--dereference (-L)`, or `--dereference-command-line-symlink-to-dir` is \ + specified.", + ), + ) + .arg( + Arg::new(options::size::HUMAN_READABLE) + .short('h') + .long(options::size::HUMAN_READABLE) + .help("Print human readable file sizes (e.g. 1K 234M 56G).") + .overrides_with(options::size::SI), + ) + .arg( + Arg::new(options::size::KIBIBYTES) + .short('k') + .long(options::size::KIBIBYTES) + .help("default to 1024-byte blocks for file system usage; used only with -s and per directory totals"), + ) + .arg( + Arg::new(options::size::SI) + .long(options::size::SI) + .help("Print human readable file sizes using powers of 1000 instead of 1024."), + ) + .arg( + Arg::new(options::size::BLOCK_SIZE) + .long(options::size::BLOCK_SIZE) + .takes_value(true) + .require_equals(true) + .value_name("BLOCK_SIZE") + .help("scale sizes by BLOCK_SIZE when printing them"), + ) + .arg( + Arg::new(options::INODE) + .short('i') + .long(options::INODE) + .help("print the index number of each file"), + ) + .arg( + Arg::new(options::REVERSE) + .short('r') + .long(options::REVERSE) + .help( + "Reverse whatever the sorting method is e.g., list files in reverse \ + alphabetical order, youngest first, smallest first, or whatever.", + ), + ) + .arg( + Arg::new(options::RECURSIVE) + .short('R') + .long(options::RECURSIVE) + .help("List the contents of all directories recursively."), + ) + .arg( + Arg::new(options::WIDTH) + .long(options::WIDTH) + .short('w') + .help("Assume that the terminal is COLS columns wide.") + .value_name("COLS") + .takes_value(true), + ) + .arg( + Arg::new(options::size::ALLOCATION_SIZE) + .short('s') + .long(options::size::ALLOCATION_SIZE) + .help("print the allocated size of each file, in blocks"), + ) + .arg( + Arg::new(options::COLOR) + .long(options::COLOR) + .help("Color output based on file type.") + .takes_value(true) + .possible_values(&[ + "always", "yes", "force", "auto", "tty", "if-tty", "never", "no", "none", + ]) + .require_equals(true) + .min_values(0), + ) + .arg( + Arg::new(options::INDICATOR_STYLE) + .long(options::INDICATOR_STYLE) + .help( + "Append indicator with style WORD to entry names: \ + none (default), slash (-p), file-type (--file-type), classify (-F)", + ) + .takes_value(true) + .possible_values(&["none", "slash", "file-type", "classify"]) + .overrides_with_all(&[ + options::indicator_style::FILE_TYPE, + options::indicator_style::SLASH, + options::indicator_style::CLASSIFY, + options::INDICATOR_STYLE, + ]), + ) + .arg( + // The --classify flag can take an optional when argument to + // control its behavior from version 9 of GNU coreutils. + // There is currently an inconsistency where GNU coreutils allows only + // the long form of the flag to take the argument while we allow it + // for both the long and short form of the flag. + Arg::new(options::indicator_style::CLASSIFY) + .short('F') + .long(options::indicator_style::CLASSIFY) + .help( + "Append a character to each file name indicating the file type. Also, for \ + regular files that are executable, append '*'. The file type indicators are \ + '/' for directories, '@' for symbolic links, '|' for FIFOs, '=' for sockets, \ + '>' for doors, and nothing for regular files. when may be omitted, or one of:\n\ + \tnone - Do not classify. This is the default.\n\ + \tauto - Only classify if standard output is a terminal.\n\ + \talways - Always classify.\n\ + Specifying --classify and no when is equivalent to --classify=always. This will not follow\ + symbolic links listed on the command line unless the --dereference-command-line (-H),\ + --dereference (-L), or --dereference-command-line-symlink-to-dir options are specified.", + ) + .takes_value(true) + .value_name("when") + .possible_values(&[ + "always", "yes", "force", "auto", "tty", "if-tty", "never", "no", "none", + ]) + .default_missing_value("always") + .require_equals(true) + .min_values(0) + .overrides_with_all(&[ + options::indicator_style::FILE_TYPE, + options::indicator_style::SLASH, + options::indicator_style::CLASSIFY, + options::INDICATOR_STYLE, + ]), + ) + .arg( + Arg::new(options::indicator_style::FILE_TYPE) + .long(options::indicator_style::FILE_TYPE) + .help("Same as --classify, but do not append '*'") + .overrides_with_all(&[ + options::indicator_style::FILE_TYPE, + options::indicator_style::SLASH, + options::indicator_style::CLASSIFY, + options::INDICATOR_STYLE, + ]), + ) + .arg( + Arg::new(options::indicator_style::SLASH) + .short('p') + .help("Append / indicator to directories.") + .overrides_with_all(&[ + options::indicator_style::FILE_TYPE, + options::indicator_style::SLASH, + options::indicator_style::CLASSIFY, + options::INDICATOR_STYLE, + ]), + ) + .arg( + //This still needs support for posix-*, +FORMAT + Arg::new(options::TIME_STYLE) + .long(options::TIME_STYLE) + .help("time/date format with -l; see TIME_STYLE below") + .value_name("TIME_STYLE") + .env("TIME_STYLE") + .possible_values(&["full-iso", "long-iso", "iso", "locale"]) + .overrides_with_all(&[options::TIME_STYLE]), + ) + .arg( + Arg::new(options::FULL_TIME) + .long(options::FULL_TIME) + .overrides_with(options::FULL_TIME) + .help("like -l --time-style=full-iso"), + ) + .arg( + Arg::new(options::CONTEXT) + .short('Z') + .long(options::CONTEXT) + .help(CONTEXT_HELP_TEXT), + ) + // Positional arguments + .arg( + Arg::new(options::PATHS) + .multiple_occurrences(true) + .takes_value(true) + .allow_invalid_utf8(true), + ) + .after_help( + "The TIME_STYLE argument can be full-iso, long-iso, iso. \ + Also the TIME_STYLE environment variable sets the default style to use.", + ) } /// Represents a Path along with it's associated data. @@ -1543,7 +1542,7 @@ impl PathData { } } -fn list(locs: Vec<&Path>, config: &Config) -> UResult<()> { +pub fn list(locs: Vec<&Path>, config: &Config) -> UResult<()> { let mut files = Vec::::new(); let mut dirs = Vec::::new(); let mut out = BufWriter::new(stdout()); diff --git a/src/uu/ls/src/quoting_style.rs b/src/uu/ls/src/quoting_style.rs index 4900dc566b7..9ff68927302 100644 --- a/src/uu/ls/src/quoting_style.rs +++ b/src/uu/ls/src/quoting_style.rs @@ -6,7 +6,7 @@ use std::ffi::OsStr; const SPECIAL_SHELL_CHARS_START: &[char] = &['~', '#']; const SPECIAL_SHELL_CHARS: &str = "`$&*()|[]{};\\'\"<>?! "; -pub(super) enum QuotingStyle { +pub enum QuotingStyle { Shell { escape: bool, always_quote: bool, @@ -21,7 +21,7 @@ pub(super) enum QuotingStyle { } #[derive(Clone, Copy)] -pub(super) enum Quotes { +pub enum Quotes { None, Single, Double, diff --git a/src/uu/vdir/Cargo.toml b/src/uu/vdir/Cargo.toml new file mode 100644 index 00000000000..10dc07a255d --- /dev/null +++ b/src/uu/vdir/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "uu_vdir" +version = "0.0.13" +authors = ["uutils developers"] +license = "MIT" +description = "shortcut to ls -l -b" + +homepage = "https://github.com/uutils/coreutils" +repository = "https://github.com/uutils/coreutils/tree/main/src/uu/ls" +keywords = ["coreutils", "uutils", "cross-platform", "cli", "utility"] +categories = ["command-line-utilities"] +edition = "2021" + +[lib] +path = "src/vdir.rs" + +[dependencies] +clap = { version = "3.1", features = ["wrap_help", "cargo", "env"] } +uucore = { version = ">=0.0.8", package = "uucore", path = "../../uucore", features = ["entries", "fs"] } +selinux = { version="0.2", optional = true } +uu_ls = {path="../ls"} + +[[bin]] +name = "vdir" +path = "src/main.rs" diff --git a/src/uu/vdir/LICENSE b/src/uu/vdir/LICENSE new file mode 120000 index 00000000000..5853aaea53b --- /dev/null +++ b/src/uu/vdir/LICENSE @@ -0,0 +1 @@ +../../../LICENSE \ No newline at end of file diff --git a/src/uu/vdir/src/main.rs b/src/uu/vdir/src/main.rs new file mode 100644 index 00000000000..9d9ba9de0c3 --- /dev/null +++ b/src/uu/vdir/src/main.rs @@ -0,0 +1 @@ +uucore::bin!(uu_vdir); diff --git a/src/uu/vdir/src/vdir.rs b/src/uu/vdir/src/vdir.rs new file mode 100644 index 00000000000..b2af0b332ad --- /dev/null +++ b/src/uu/vdir/src/vdir.rs @@ -0,0 +1,68 @@ +// * This file is part of the uutils coreutils package. +// * +// * (c) gmnsii +// * +// * For the full copyright and license information, please view the LICENSE file +// * that was distributed with this source code. + +use clap::Command; +use std::path::Path; +use uu_ls::quoting_style::{Quotes, QuotingStyle}; +use uu_ls::{options, Config, Format}; +use uucore::error::UResult; + +#[uucore::main] +pub fn uumain(args: impl uucore::Args) -> UResult<()> { + let command = uu_ls::uu_app(); + let matches = command.get_matches_from(args); + + let mut default_quoting_style = false; + let mut default_format_style = false; + + // We check if any options on formatting or quoting style have been given. + // If not, we will use dir default formatting and quoting style options + + if !matches.is_present(options::QUOTING_STYLE) + && !matches.is_present(options::quoting::C) + && !matches.is_present(options::quoting::ESCAPE) + && !matches.is_present(options::quoting::LITERAL) + { + default_quoting_style = true; + } + if !matches.is_present(options::FORMAT) + && !matches.is_present(options::format::ACROSS) + && !matches.is_present(options::format::COLUMNS) + && !matches.is_present(options::format::COMMAS) + && !matches.is_present(options::format::LONG) + && !matches.is_present(options::format::LONG_NO_GROUP) + && !matches.is_present(options::format::LONG_NO_OWNER) + && !matches.is_present(options::format::LONG_NUMERIC_UID_GID) + && !matches.is_present(options::format::ONE_LINE) + { + default_format_style = true; + } + + let mut config = Config::from(&matches)?; + + if default_quoting_style { + config.quoting_style = QuotingStyle::C { + quotes: Quotes::None, + }; + } + if default_format_style { + config.format = Format::Long; + } + + let locs = matches + .values_of_os(options::PATHS) + .map(|v| v.map(Path::new).collect()) + .unwrap_or_else(|| vec![Path::new(".")]); + uu_ls::list(locs, &config) +} + +// To avoid code duplication, we reuse ls uu_app function which has the same +// arguments. However, coreutils won't compile if one of the utils is missing +// an uu_app function, so we need this dummy one. +pub fn uu_app<'a>() -> Command<'a> { + Command::new(uucore::util_name()) +} diff --git a/tests/by-util/test_dir.rs b/tests/by-util/test_dir.rs new file mode 100644 index 00000000000..3ec416bb2ac --- /dev/null +++ b/tests/by-util/test_dir.rs @@ -0,0 +1,55 @@ +#[cfg(not(windows))] +extern crate libc; +extern crate regex; +#[cfg(not(windows))] +extern crate tempfile; +#[cfg(unix)] +extern crate unix_socket; + +use self::regex::Regex; +use crate::common::util::*; + +/* + * As dir use the same functions than ls, we don't have to retest them here. + * We just test the default and the long output +*/ + +#[test] +fn test_dir() { + new_ucmd!().succeeds(); +} + +#[test] +fn test_default_output() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + at.mkdir("some-dir1"); + at.touch("some-file1"); + + scene.ucmd().succeeds().stdout_contains("some-file1"); + + scene + .ucmd() + .succeeds() + .stdout_does_not_match(&Regex::new("[rwx][^some-file1]").unwrap()); +} + +#[test] +fn test_long_output() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + at.mkdir("some-dir1"); + at.touch("some-file1"); + + scene + .ucmd() + .arg("-l") + .succeeds() + .stdout_contains("some-file1"); + + scene + .ucmd() + .arg("-l") + .succeeds() + .stdout_matches(&Regex::new("[rwx][^some-file1]").unwrap()); +} diff --git a/tests/by-util/test_vdir.rs b/tests/by-util/test_vdir.rs new file mode 100644 index 00000000000..01c54009595 --- /dev/null +++ b/tests/by-util/test_vdir.rs @@ -0,0 +1,55 @@ +#[cfg(not(windows))] +extern crate libc; +extern crate regex; +#[cfg(not(windows))] +extern crate tempfile; +#[cfg(unix)] +extern crate unix_socket; + +use self::regex::Regex; +use crate::common::util::*; + +/* + * As vdir use the same functions than ls, we don't have to retest them here. + * We just test the default and the column output +*/ + +#[test] +fn test_vdir() { + new_ucmd!().succeeds(); +} + +#[test] +fn test_default_output() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + at.mkdir("some-dir1"); + at.touch("some-file1"); + + scene.ucmd().succeeds().stdout_contains("some-file1"); + + scene + .ucmd() + .succeeds() + .stdout_matches(&Regex::new("[rwx][^some-file1]").unwrap()); +} + +#[test] +fn test_column_output() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + at.mkdir("some-dir1"); + at.touch("some-file1"); + + scene + .ucmd() + .arg("-C") + .succeeds() + .stdout_contains("some-file1"); + + scene + .ucmd() + .arg("-C") + .succeeds() + .stdout_does_not_match(&Regex::new("[rwx][^some-file1]").unwrap()); +} diff --git a/util/build-gnu.sh b/util/build-gnu.sh index a4a33e8604f..0aad35ff1d9 100755 --- a/util/build-gnu.sh +++ b/util/build-gnu.sh @@ -180,7 +180,7 @@ sed -i -e "s~ sed -n \"1s/'\\\/'/'OPT'/p\" < err >> pat || framework_failure_~ # see issue #3331 (clap limitation). # Upstream returns 1 for most of the program. We do for cp, truncate & pr # So, keep it as it -sed -i -e "s/rcexp=1$/rcexp=2\n case \"\$prg\" in chcon|dir|runcon|vdir) return;; esac/" -e "s/rcexp=125 ;;/rcexp=2 ;;\ncp|truncate|pr) rcexp=1;;/" tests/misc/usage_vs_getopt.sh +sed -i -e "s/rcexp=1$/rcexp=2\n case \"\$prg\" in chcon|runcon) return;; esac/" -e "s/rcexp=125 ;;/rcexp=2 ;;\ncp|truncate|pr) rcexp=1;;/" tests/misc/usage_vs_getopt.sh # GNU has option=[SUFFIX], clap is sed -i -e "s/cat opts/sed -i -e \"s| <.\*>$||g\" opts/" tests/misc/usage_vs_getopt.sh # Strip empty lines for the diff - see https://github.com/uutils/coreutils/issues/3370 From 666452544942e08ea0e08410f8a802fc20993045 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Sat, 16 Apr 2022 15:31:38 +0200 Subject: [PATCH 083/242] df: remove obsolete "show_listed_fs" options field --- src/uu/df/src/df.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/uu/df/src/df.rs b/src/uu/df/src/df.rs index a7520117dcd..889ade9a19b 100644 --- a/src/uu/df/src/df.rs +++ b/src/uu/df/src/df.rs @@ -61,7 +61,6 @@ static OUTPUT_FIELD_LIST: [&str; 12] = [ struct Options { show_local_fs: bool, show_all_fs: bool, - show_listed_fs: bool, block_size: BlockSize, /// Optional list of filesystem types to include in the output table. @@ -88,7 +87,6 @@ impl Default for Options { Self { show_local_fs: Default::default(), show_all_fs: Default::default(), - show_listed_fs: Default::default(), block_size: Default::default(), include: Default::default(), exclude: Default::default(), @@ -157,7 +155,6 @@ impl Options { Ok(Self { show_local_fs: matches.is_present(OPT_LOCAL), show_all_fs: matches.is_present(OPT_ALL), - show_listed_fs: false, block_size: block_size_from_matches(matches) .map_err(|_| OptionsError::InvalidBlockSize)?, include, @@ -188,7 +185,7 @@ fn is_included(mi: &MountInfo, opt: &Options) -> bool { } // Don't show pseudo filesystems unless `--all` has been given. - if mi.dummy && !opt.show_all_fs && !opt.show_listed_fs { + if mi.dummy && !opt.show_all_fs { return false; } @@ -394,7 +391,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { // If the filesystem is not empty, or if the options require // showing all filesystems, then print the data as a row in // the output table. - if opt.show_all_fs || opt.show_listed_fs || filesystem.usage.blocks > 0 { + if opt.show_all_fs || filesystem.usage.blocks > 0 { let row = Row::from(filesystem); println!("{}", DisplayRow::new(&row, &opt)); total += row; @@ -667,7 +664,6 @@ mod tests { fn test_dummy_included() { let opt = Options { show_all_fs: true, - show_listed_fs: true, ..Default::default() }; let m = mount_info("ext4", "/mnt/foo", false, true); From 85d113ab79f5b59ae7fa6426391ebcf48539e73d Mon Sep 17 00:00:00 2001 From: gmnsii <95436780+gmnsii@users.noreply.github.com> Date: Sat, 16 Apr 2022 07:51:24 -0700 Subject: [PATCH 084/242] df: -h -H shouldn't cause an error #3366 --- src/uu/df/src/df.rs | 4 ++-- tests/by-util/test_df.rs | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/uu/df/src/df.rs b/src/uu/df/src/df.rs index a7520117dcd..3de605364ea 100644 --- a/src/uu/df/src/df.rs +++ b/src/uu/df/src/df.rs @@ -443,14 +443,14 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(OPT_HUMAN_READABLE_BINARY) .short('h') .long("human-readable") - .conflicts_with(OPT_HUMAN_READABLE_DECIMAL) + .overrides_with(OPT_HUMAN_READABLE_DECIMAL) .help("print sizes in human readable format (e.g., 1K 234M 2G)"), ) .arg( Arg::new(OPT_HUMAN_READABLE_DECIMAL) .short('H') .long("si") - .conflicts_with(OPT_HUMAN_READABLE_BINARY) + .overrides_with(OPT_HUMAN_READABLE_DECIMAL) .help("likewise, but use powers of 1000 not 1024"), ) .arg( diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index d91f1ac36dd..a76cf5fd7f7 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -26,6 +26,12 @@ fn test_df_compatible_si() { new_ucmd!().arg("-aH").succeeds(); } +#[test] +fn test_df_overriding() { + new_ucmd!().arg("-hH").succeeds(); + new_ucmd!().arg("-Hh").succeeds(); +} + #[test] fn test_df_output() { let expected = if cfg!(target_os = "macos") { @@ -42,6 +48,22 @@ fn test_df_output() { assert_eq!(actual, expected); } +#[test] +fn test_df_output_overridden() { + let expected = if cfg!(target_os = "macos") { + "Filesystem Size Used Available Capacity Use% Mounted on " + } else { + "Filesystem Size Used Available Use% Mounted on " + }; + let output = new_ucmd!() + .arg("-hH") + .arg("--total") + .succeeds() + .stdout_move_str(); + let actual = output.lines().take(1).collect::>()[0]; + assert_eq!(actual, expected); +} + #[test] fn test_total_option_with_single_dash() { // These should fail because `-total` should have two dashes, From 34a1b233425f1578e1eb0c9aef7de082858909e5 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sun, 17 Apr 2022 08:59:42 +0200 Subject: [PATCH 085/242] add more information about the GNU compat (#3410) * add more information about the GNU compat Co-authored-by: Terts Diepraam --- README.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0683e42f83d..f10edc12569 100644 --- a/README.md +++ b/README.md @@ -398,7 +398,15 @@ To contribute to uutils, please see [CONTRIBUTING](CONTRIBUTING.md). ## Utilities -| Done | Semi-Done | To Do | +Please note that this is not fully accurate: +* Some new options can be added / removed in the GNU implementation; +* Some error management might be missing; +* Some behaviors might be different. + +See https://github.com/uutils/coreutils/issues/3336 for the main meta bugs +(many are missing). + +| Done | WIP | To Do | |-----------|-----------|--------| | arch | cp | stty | | base32 | date | | @@ -417,8 +425,8 @@ To contribute to uutils, please see [CONTRIBUTING](CONTRIBUTING.md). | cut | tac | | | dircolors | tail | | | dirname | test | | -| du | | | -| echo | | | +| du | dir | | +| echo | vdir | | | env | | | | expand | | | | factor | | | From c9bf31f97e105659ee61804b3fd687bc7da2bfd8 Mon Sep 17 00:00:00 2001 From: gmnsii Date: Sun, 17 Apr 2022 01:52:05 -0700 Subject: [PATCH 086/242] Args override themselves and conflicting arguments --- src/uu/df/src/df.rs | 25 +++++++++++++++++++------ tests/by-util/test_df.rs | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/src/uu/df/src/df.rs b/src/uu/df/src/df.rs index 3de605364ea..512941fb85d 100644 --- a/src/uu/df/src/df.rs +++ b/src/uu/df/src/df.rs @@ -349,6 +349,7 @@ impl fmt::Display for DfError { #[uucore::main] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uu_app().get_matches_from(args); + #[cfg(windows)] { if matches.is_present(OPT_INODES) { @@ -422,6 +423,7 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(OPT_ALL) .short('a') .long("all") + .overrides_with(OPT_ALL) .help("include dummy file systems"), ) .arg( @@ -429,47 +431,56 @@ pub fn uu_app<'a>() -> Command<'a> { .short('B') .long("block-size") .takes_value(true) + .overrides_with_all(&[OPT_KILO, OPT_BLOCKSIZE]) .help( "scale sizes by SIZE before printing them; e.g.\ - '-BM' prints sizes in units of 1,048,576 bytes", + '-BM' prints sizes in units of 1,048,576 bytes", ), ) .arg( Arg::new(OPT_TOTAL) .long("total") + .overrides_with(OPT_TOTAL) .help("produce a grand total"), ) .arg( Arg::new(OPT_HUMAN_READABLE_BINARY) .short('h') .long("human-readable") - .overrides_with(OPT_HUMAN_READABLE_DECIMAL) + .overrides_with_all(&[OPT_HUMAN_READABLE_DECIMAL, OPT_HUMAN_READABLE_BINARY]) .help("print sizes in human readable format (e.g., 1K 234M 2G)"), ) .arg( Arg::new(OPT_HUMAN_READABLE_DECIMAL) .short('H') .long("si") - .overrides_with(OPT_HUMAN_READABLE_DECIMAL) + .overrides_with_all(&[OPT_HUMAN_READABLE_BINARY, OPT_HUMAN_READABLE_DECIMAL]) .help("likewise, but use powers of 1000 not 1024"), ) .arg( Arg::new(OPT_INODES) .short('i') .long("inodes") + .overrides_with(OPT_INODES) .help("list inode information instead of block usage"), ) - .arg(Arg::new(OPT_KILO).short('k').help("like --block-size=1K")) + .arg( + Arg::new(OPT_KILO) + .short('k') + .help("like --block-size=1K") + .overrides_with_all(&[OPT_BLOCKSIZE, OPT_KILO]), + ) .arg( Arg::new(OPT_LOCAL) .short('l') .long("local") + .overrides_with(OPT_LOCAL) .help("limit listing to local file systems"), ) .arg( Arg::new(OPT_NO_SYNC) .long("no-sync") - .conflicts_with(OPT_SYNC) + .overrides_with_all(&[OPT_SYNC, OPT_NO_SYNC]) .help("do not invoke sync before getting usage info (default)"), ) .arg( @@ -493,12 +504,13 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(OPT_PORTABILITY) .short('P') .long("portability") + .overrides_with(OPT_PORTABILITY) .help("use the POSIX output format"), ) .arg( Arg::new(OPT_SYNC) .long("sync") - .conflicts_with(OPT_NO_SYNC) + .overrides_with_all(&[OPT_NO_SYNC, OPT_SYNC]) .help("invoke sync before getting usage info"), ) .arg( @@ -514,6 +526,7 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(OPT_PRINT_TYPE) .short('T') .long("print-type") + .overrides_with(OPT_PRINT_TYPE) .help("print file system type"), ) .arg( diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index a76cf5fd7f7..dee5d327c65 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -27,9 +27,41 @@ fn test_df_compatible_si() { } #[test] -fn test_df_overriding() { +fn test_df_arguments_override_themselves() { + new_ucmd!().args(&["--help", "--help"]).succeeds(); + new_ucmd!().arg("-aa").succeeds(); + new_ucmd!() + .args(&["--block-size=3000", "--block-size=1000"]) + .succeeds(); + new_ucmd!().args(&["--total", "--total"]).succeeds(); + new_ucmd!().arg("-hh").succeeds(); + new_ucmd!().arg("-HH").succeeds(); + new_ucmd!().arg("-ii").succeeds(); + new_ucmd!().arg("-kk").succeeds(); + new_ucmd!().arg("-ll").succeeds(); + new_ucmd!().args(&["--no-sync", "--no-sync"]).succeeds(); + new_ucmd!().arg("-PP").succeeds(); + new_ucmd!().args(&["--sync", "--sync"]).succeeds(); + new_ucmd!().arg("-TT").succeeds(); +} + +#[test] +fn test_df_conflicts_overriding() { new_ucmd!().arg("-hH").succeeds(); new_ucmd!().arg("-Hh").succeeds(); + new_ucmd!().args(&["--no-sync", "--sync"]).succeeds(); + new_ucmd!().args(&["--sync", "--no-sync"]).succeeds(); + new_ucmd!().args(&["-k", "--block-size=3000"]).succeeds(); + new_ucmd!().args(&["--block-size=3000", "-k"]).succeeds(); +} + +#[test] +fn test_df_output_arg() { + new_ucmd!().args(&["--output=source", "-iPT"]).fails(); + new_ucmd!().args(&["-iPT", "--output=source"]).fails(); + new_ucmd!() + .args(&["--output=source", "--output=source"]) + .fails(); } #[test] From a0528550618d45ed988dad1c5a78109d76dfe521 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Fri, 8 Apr 2022 07:45:36 +0200 Subject: [PATCH 087/242] df: fix incorrect whitespace between columns Fixes #3194 --- src/uu/df/src/columns.rs | 27 +++ src/uu/df/src/df.rs | 27 +-- src/uu/df/src/table.rs | 370 +++++++++++++++++++++++++++------------ tests/by-util/test_df.rs | 71 +++++--- 4 files changed, 335 insertions(+), 160 deletions(-) diff --git a/src/uu/df/src/columns.rs b/src/uu/df/src/columns.rs index 91c52ed2e4f..bd8cab43861 100644 --- a/src/uu/df/src/columns.rs +++ b/src/uu/df/src/columns.rs @@ -183,4 +183,31 @@ impl Column { _ => Err(()), } } + + /// Return the alignment of the specified column. + pub(crate) fn alignment(column: &Self) -> Alignment { + match column { + Self::Source | Self::Target | Self::File | Self::Fstype => Alignment::Left, + _ => Alignment::Right, + } + } + + /// Return the minimum width of the specified column. + pub(crate) fn min_width(column: &Self) -> usize { + match column { + // 14 = length of "Filesystem" plus 4 spaces + Self::Source => 14, + // the shortest headers have a length of 4 chars so we use that as the minimum width + _ => 4, + } + } +} + +/// A column's alignment. +/// +/// We define our own `Alignment` enum instead of using `std::fmt::Alignment` because df doesn't +/// have centered columns and hence a `Center` variant is not needed. +pub(crate) enum Alignment { + Left, + Right, } diff --git a/src/uu/df/src/df.rs b/src/uu/df/src/df.rs index 889ade9a19b..5cdd7a5aac6 100644 --- a/src/uu/df/src/df.rs +++ b/src/uu/df/src/df.rs @@ -25,7 +25,7 @@ use std::path::Path; use crate::blocks::{block_size_from_matches, BlockSize}; use crate::columns::{Column, ColumnError}; use crate::filesystem::Filesystem; -use crate::table::{DisplayRow, Header, Row}; +use crate::table::Table; static ABOUT: &str = "Show information about the file system on which each FILE resides,\n\ or all file systems by default."; @@ -380,27 +380,14 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } }; - // The running total of filesystem sizes and usage. - // - // This accumulator is computed in case we need to display the - // total counts in the last row of the table. - let mut total = Row::new("total"); - - println!("{}", Header::new(&opt)); - for filesystem in filesystems { - // If the filesystem is not empty, or if the options require - // showing all filesystems, then print the data as a row in - // the output table. - if opt.show_all_fs || filesystem.usage.blocks > 0 { - let row = Row::from(filesystem); - println!("{}", DisplayRow::new(&row, &opt)); - total += row; - } - } - if opt.show_total { - println!("{}", DisplayRow::new(&total, &opt)); + // This can happen if paths are given as command-line arguments + // but none of the paths exist. + if filesystems.is_empty() { + return Ok(()); } + println!("{}", Table::new(&opt, filesystems)); + Ok(()) } diff --git a/src/uu/df/src/table.rs b/src/uu/df/src/table.rs index 3e0ae853f88..698da2bdb48 100644 --- a/src/uu/df/src/table.rs +++ b/src/uu/df/src/table.rs @@ -5,13 +5,11 @@ // spell-checker:ignore tmpfs Pcent Itotal Iused Iavail Ipcent //! The filesystem usage data table. //! -//! A table comprises a header row ([`Header`]) and a collection of -//! data rows ([`Row`]), one per filesystem. To display a [`Row`], -//! combine it with [`Options`] in the [`DisplayRow`] struct; the -//! [`DisplayRow`] implements [`std::fmt::Display`]. +//! A table ([`Table`]) comprises a header row ([`Header`]) and a +//! collection of data rows ([`Row`]), one per filesystem. use number_prefix::NumberPrefix; -use crate::columns::Column; +use crate::columns::{Alignment, Column}; use crate::filesystem::Filesystem; use crate::{BlockSize, Options}; use uucore::fsext::{FsUsage, MountInfo}; @@ -189,14 +187,14 @@ impl From for Row { } } -/// A displayable wrapper around a [`Row`]. +/// A formatter for [`Row`]. /// -/// The `options` control how the information in the row gets displayed. -pub(crate) struct DisplayRow<'a> { +/// The `options` control how the information in the row gets formatted. +pub(crate) struct RowFormatter<'a> { /// The data in this row. row: &'a Row, - /// Options that control how to display the data. + /// Options that control how to format the data. options: &'a Options, // TODO We don't need all of the command-line options here. Some // of the command-line options indicate which rows to include or @@ -207,7 +205,7 @@ pub(crate) struct DisplayRow<'a> { // `df.rs` module. } -impl<'a> DisplayRow<'a> { +impl<'a> RowFormatter<'a> { /// Instantiate this struct. pub(crate) fn new(row: &'a Row, options: &'a Options) -> Self { Self { row, options } @@ -261,84 +259,163 @@ impl<'a> DisplayRow<'a> { Some(x) => format!("{:.0}%", (100.0 * x).ceil()), } } -} -impl fmt::Display for DisplayRow<'_> { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + /// Returns formatted row data. + fn get_values(&self) -> Vec { + let mut strings = Vec::new(); + for column in &self.options.columns { - match column { - Column::Source => write!(f, "{0: <16} ", self.row.fs_device)?, - Column::Size => write!(f, "{0: >12} ", self.scaled_bytes(self.row.bytes))?, - Column::Used => write!(f, "{0: >12} ", self.scaled_bytes(self.row.bytes_used))?, - Column::Avail => write!(f, "{0: >12} ", self.scaled_bytes(self.row.bytes_avail))?, - Column::Pcent => { - write!(f, "{0: >5} ", DisplayRow::percentage(self.row.bytes_usage))?; - } - Column::Target => write!(f, "{0: <16}", self.row.fs_mount)?, - Column::Itotal => write!(f, "{0: >12} ", self.scaled_inodes(self.row.inodes))?, - Column::Iused => write!(f, "{0: >12} ", self.scaled_inodes(self.row.inodes_used))?, - Column::Iavail => { - write!(f, "{0: >12} ", self.scaled_inodes(self.row.inodes_free))?; - } - Column::Ipcent => { - write!(f, "{0: >5} ", DisplayRow::percentage(self.row.inodes_usage))?; - } - Column::File => { - write!(f, "{0: <16}", self.row.file.as_ref().unwrap_or(&"-".into()))?; - } - Column::Fstype => write!(f, "{0: <5} ", self.row.fs_type)?, + let string = match column { + Column::Source => self.row.fs_device.to_string(), + Column::Size => self.scaled_bytes(self.row.bytes), + Column::Used => self.scaled_bytes(self.row.bytes_used), + Column::Avail => self.scaled_bytes(self.row.bytes_avail), + Column::Pcent => Self::percentage(self.row.bytes_usage), + + Column::Target => self.row.fs_mount.to_string(), + Column::Itotal => self.scaled_inodes(self.row.inodes), + Column::Iused => self.scaled_inodes(self.row.inodes_used), + Column::Iavail => self.scaled_inodes(self.row.inodes_free), + Column::Ipcent => Self::percentage(self.row.inodes_usage), + Column::File => self.row.file.as_ref().unwrap_or(&"-".into()).to_string(), + + Column::Fstype => self.row.fs_type.to_string(), #[cfg(target_os = "macos")] - Column::Capacity => write!( - f, - "{0: >12} ", - DisplayRow::percentage(self.row.bytes_capacity) - )?, - } + Column::Capacity => Self::percentage(self.row.bytes_capacity), + }; + + strings.push(string); } - Ok(()) + + strings } } -/// The header row. -/// -/// The `options` control which columns are displayed. -pub(crate) struct Header<'a> { - /// Options that control which columns are displayed. - options: &'a Options, +/// The data of the header row. +struct Header {} + +impl Header { + /// Return the headers for the specified columns. + /// + /// The `options` control which column headers are returned. + fn get_headers(options: &Options) -> Vec { + let mut headers = Vec::new(); + + for column in &options.columns { + let header = match column { + Column::Source => String::from("Filesystem"), + Column::Size => options.block_size.to_string(), + Column::Used => String::from("Used"), + Column::Avail => String::from("Available"), + Column::Pcent => String::from("Use%"), + Column::Target => String::from("Mounted on"), + Column::Itotal => String::from("Inodes"), + Column::Iused => String::from("IUsed"), + Column::Iavail => String::from("IFree"), + Column::Ipcent => String::from("IUse%"), + Column::File => String::from("File"), + Column::Fstype => String::from("Type"), + #[cfg(target_os = "macos")] + Column::Capacity => String::from("Capacity"), + }; + + headers.push(header); + } + + headers + } } -impl<'a> Header<'a> { - /// Instantiate this struct. - pub(crate) fn new(options: &'a Options) -> Self { - Self { options } +/// The output table. +pub(crate) struct Table { + alignments: Vec, + rows: Vec>, + widths: Vec, +} + +impl Table { + pub(crate) fn new(options: &Options, filesystems: Vec) -> Self { + let headers = Header::get_headers(options); + let mut widths: Vec<_> = options + .columns + .iter() + .enumerate() + .map(|(i, col)| Column::min_width(col).max(headers[i].len())) + .collect(); + + let mut rows = vec![headers]; + + // The running total of filesystem sizes and usage. + // + // This accumulator is computed in case we need to display the + // total counts in the last row of the table. + let mut total = Row::new("total"); + + for filesystem in filesystems { + // If the filesystem is not empty, or if the options require + // showing all filesystems, then print the data as a row in + // the output table. + if options.show_all_fs || filesystem.usage.blocks > 0 { + let row = Row::from(filesystem); + let fmt = RowFormatter::new(&row, options); + let values = fmt.get_values(); + total += row; + + for (i, value) in values.iter().enumerate() { + if value.len() > widths[i] { + widths[i] = value.len(); + } + } + + rows.push(values); + } + } + + if options.show_total { + let total_row = RowFormatter::new(&total, options); + rows.push(total_row.get_values()); + } + + Self { + rows, + widths, + alignments: Self::get_alignments(&options.columns), + } + } + + fn get_alignments(columns: &Vec) -> Vec { + let mut alignments = Vec::new(); + + for column in columns { + alignments.push(Column::alignment(column)); + } + + alignments } } -impl fmt::Display for Header<'_> { +impl fmt::Display for Table { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - for column in &self.options.columns { - match column { - Column::Source => write!(f, "{0: <16} ", "Filesystem")?, - // `Display` is implemented for `BlockSize`, but - // `Display` only works when formatting an object into - // an empty format, `{}`. So we use `format!()` first - // to create the string, then use `write!()` to align - // the string and pad with spaces. - Column::Size => write!(f, "{0: >12} ", format!("{}", self.options.block_size))?, - Column::Used => write!(f, "{0: >12} ", "Used")?, - Column::Avail => write!(f, "{0: >12} ", "Available")?, - Column::Pcent => write!(f, "{0: >5} ", "Use%")?, - Column::Target => write!(f, "{0: <16} ", "Mounted on")?, - Column::Itotal => write!(f, "{0: >12} ", "Inodes")?, - Column::Iused => write!(f, "{0: >12} ", "IUsed")?, - Column::Iavail => write!(f, "{0: >12} ", "IFree")?, - Column::Ipcent => write!(f, "{0: >5} ", "IUse%")?, - Column::File => write!(f, "{0: <16}", "File")?, - Column::Fstype => write!(f, "{0: <5} ", "Type")?, - #[cfg(target_os = "macos")] - Column::Capacity => write!(f, "{0: >12} ", "Capacity")?, + let mut row_iter = self.rows.iter().peekable(); + while let Some(row) = row_iter.next() { + let mut col_iter = row.iter().enumerate().peekable(); + while let Some((i, elem)) = col_iter.next() { + match self.alignments[i] { + Alignment::Left => write!(f, "{: write!(f, "{:>width$}", elem, width = self.widths[i])?, + } + + if col_iter.peek().is_some() { + // column separator + write!(f, " ")?; + } + } + + if row_iter.peek().is_some() { + writeln!(f)?; } } + Ok(()) } } @@ -347,7 +424,7 @@ impl fmt::Display for Header<'_> { mod tests { use crate::columns::Column; - use crate::table::{DisplayRow, Header, Row}; + use crate::table::{Header, Row, RowFormatter}; use crate::{BlockSize, Options}; const COLUMNS_WITH_FS_TYPE: [Column; 7] = [ @@ -369,76 +446,119 @@ mod tests { ]; #[test] - fn test_header_display() { + fn test_default_header() { let options = Default::default(); assert_eq!( - Header::new(&options).to_string(), - "Filesystem 1K-blocks Used Available Use% Mounted on " + Header::get_headers(&options), + vec!( + "Filesystem", + "1K-blocks", + "Used", + "Available", + "Use%", + "Mounted on" + ) ); } #[test] - fn test_header_display_fs_type() { + fn test_header_with_fs_type() { let options = Options { columns: COLUMNS_WITH_FS_TYPE.to_vec(), ..Default::default() }; assert_eq!( - Header::new(&options).to_string(), - "Filesystem Type 1K-blocks Used Available Use% Mounted on " + Header::get_headers(&options), + vec!( + "Filesystem", + "Type", + "1K-blocks", + "Used", + "Available", + "Use%", + "Mounted on" + ) ); } #[test] - fn test_header_display_inode() { + fn test_header_with_inodes() { let options = Options { columns: COLUMNS_WITH_INODES.to_vec(), ..Default::default() }; assert_eq!( - Header::new(&options).to_string(), - "Filesystem Inodes IUsed IFree IUse% Mounted on " + Header::get_headers(&options), + vec!( + "Filesystem", + "Inodes", + "IUsed", + "IFree", + "IUse%", + "Mounted on" + ) ); } #[test] - fn test_header_display_block_size_1024() { + fn test_header_with_block_size_1024() { let options = Options { block_size: BlockSize::Bytes(3 * 1024), ..Default::default() }; assert_eq!( - Header::new(&options).to_string(), - "Filesystem 3K-blocks Used Available Use% Mounted on " + Header::get_headers(&options), + vec!( + "Filesystem", + "3K-blocks", + "Used", + "Available", + "Use%", + "Mounted on" + ) ); } #[test] - fn test_header_display_human_readable_binary() { + fn test_header_with_human_readable_binary() { let options = Options { block_size: BlockSize::HumanReadableBinary, ..Default::default() }; assert_eq!( - Header::new(&options).to_string(), - "Filesystem Size Used Available Use% Mounted on " + Header::get_headers(&options), + vec!( + "Filesystem", + "Size", + "Used", + "Available", + "Use%", + "Mounted on" + ) ); } #[test] - fn test_header_display_human_readable_si() { + fn test_header_with_human_readable_si() { let options = Options { block_size: BlockSize::HumanReadableDecimal, ..Default::default() }; assert_eq!( - Header::new(&options).to_string(), - "Filesystem Size Used Available Use% Mounted on " + Header::get_headers(&options), + vec!( + "Filesystem", + "Size", + "Used", + "Available", + "Use%", + "Mounted on" + ) ); } #[test] - fn test_row_display() { + fn test_row_formatter() { let options = Options { block_size: BlockSize::Bytes(1), ..Default::default() @@ -462,14 +582,15 @@ mod tests { inodes_free: 8, inodes_usage: Some(0.2), }; + let fmt = RowFormatter::new(&row, &options); assert_eq!( - DisplayRow::new(&row, &options).to_string(), - "my_device 100 25 75 25% my_mount " + fmt.get_values(), + vec!("my_device", "100", "25", "75", "25%", "my_mount") ); } #[test] - fn test_row_display_fs_type() { + fn test_row_formatter_with_fs_type() { let options = Options { columns: COLUMNS_WITH_FS_TYPE.to_vec(), block_size: BlockSize::Bytes(1), @@ -494,14 +615,15 @@ mod tests { inodes_free: 8, inodes_usage: Some(0.2), }; + let fmt = RowFormatter::new(&row, &options); assert_eq!( - DisplayRow::new(&row, &options).to_string(), - "my_device my_type 100 25 75 25% my_mount " + fmt.get_values(), + vec!("my_device", "my_type", "100", "25", "75", "25%", "my_mount") ); } #[test] - fn test_row_display_inodes() { + fn test_row_formatter_with_inodes() { let options = Options { columns: COLUMNS_WITH_INODES.to_vec(), block_size: BlockSize::Bytes(1), @@ -526,14 +648,15 @@ mod tests { inodes_free: 8, inodes_usage: Some(0.2), }; + let fmt = RowFormatter::new(&row, &options); assert_eq!( - DisplayRow::new(&row, &options).to_string(), - "my_device 10 2 8 20% my_mount " + fmt.get_values(), + vec!("my_device", "10", "2", "8", "20%", "my_mount") ); } #[test] - fn test_row_display_bytes_and_inodes() { + fn test_row_formatter_with_bytes_and_inodes() { let options = Options { columns: vec![Column::Size, Column::Itotal], block_size: BlockSize::Bytes(100), @@ -558,14 +681,12 @@ mod tests { inodes_free: 8, inodes_usage: Some(0.2), }; - assert_eq!( - DisplayRow::new(&row, &options).to_string(), - " 1 10 " - ); + let fmt = RowFormatter::new(&row, &options); + assert_eq!(fmt.get_values(), vec!("1", "10")); } #[test] - fn test_row_display_human_readable_si() { + fn test_row_formatter_with_human_readable_si() { let options = Options { block_size: BlockSize::HumanReadableDecimal, columns: COLUMNS_WITH_FS_TYPE.to_vec(), @@ -590,14 +711,23 @@ mod tests { inodes_free: 8, inodes_usage: Some(0.2), }; + let fmt = RowFormatter::new(&row, &options); assert_eq!( - DisplayRow::new(&row, &options).to_string(), - "my_device my_type 4.0k 1.0k 3.0k 25% my_mount " + fmt.get_values(), + vec!( + "my_device", + "my_type", + "4.0k", + "1.0k", + "3.0k", + "25%", + "my_mount" + ) ); } #[test] - fn test_row_display_human_readable_binary() { + fn test_row_formatter_with_human_readable_binary() { let options = Options { block_size: BlockSize::HumanReadableBinary, columns: COLUMNS_WITH_FS_TYPE.to_vec(), @@ -622,14 +752,23 @@ mod tests { inodes_free: 8, inodes_usage: Some(0.2), }; + let fmt = RowFormatter::new(&row, &options); assert_eq!( - DisplayRow::new(&row, &options).to_string(), - "my_device my_type 4.0Ki 1.0Ki 3.0Ki 25% my_mount " + fmt.get_values(), + vec!( + "my_device", + "my_type", + "4.0Ki", + "1.0Ki", + "3.0Ki", + "25%", + "my_mount" + ) ); } #[test] - fn test_row_display_round_up_usage() { + fn test_row_formatter_with_round_up_usage() { let options = Options { block_size: BlockSize::Bytes(1), ..Default::default() @@ -653,9 +792,10 @@ mod tests { inodes_free: 8, inodes_usage: Some(0.2), }; + let fmt = RowFormatter::new(&row, &options); assert_eq!( - DisplayRow::new(&row, &options).to_string(), - "my_device 100 25 75 26% my_mount " + fmt.get_values(), + vec!("my_device", "100", "25", "75", "26%", "my_mount") ); } } diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index d91f1ac36dd..e8d1290906a 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -29,9 +29,26 @@ fn test_df_compatible_si() { #[test] fn test_df_output() { let expected = if cfg!(target_os = "macos") { - "Filesystem Size Used Available Capacity Use% Mounted on " + vec![ + "Filesystem", + "Size", + "Used", + "Available", + "Capacity", + "Use%", + "Mounted", + "on", + ] } else { - "Filesystem Size Used Available Use% Mounted on " + vec![ + "Filesystem", + "Size", + "Used", + "Available", + "Use%", + "Mounted", + "on", + ] }; let output = new_ucmd!() .arg("-H") @@ -39,6 +56,7 @@ fn test_df_output() { .succeeds() .stdout_move_str(); let actual = output.lines().take(1).collect::>()[0]; + let actual = actual.split_whitespace().collect::>(); assert_eq!(actual, expected); } @@ -253,23 +271,26 @@ fn test_block_size_1024() { assert_eq!(get_header(34 * 1024 * 1024 * 1024), "34G-blocks"); } -// TODO The spacing does not match GNU df. Also we need to remove -// trailing spaces from the heading row. #[test] fn test_output_selects_columns() { let output = new_ucmd!() .args(&["--output=source"]) .succeeds() .stdout_move_str(); - assert_eq!(output.lines().next().unwrap(), "Filesystem "); + assert_eq!(output.lines().next().unwrap().trim_end(), "Filesystem"); let output = new_ucmd!() .args(&["--output=source,target"]) .succeeds() .stdout_move_str(); assert_eq!( - output.lines().next().unwrap(), - "Filesystem Mounted on " + output + .lines() + .next() + .unwrap() + .split_whitespace() + .collect::>(), + vec!["Filesystem", "Mounted", "on"] ); let output = new_ucmd!() @@ -277,8 +298,13 @@ fn test_output_selects_columns() { .succeeds() .stdout_move_str(); assert_eq!( - output.lines().next().unwrap(), - "Filesystem Mounted on Used " + output + .lines() + .next() + .unwrap() + .split_whitespace() + .collect::>(), + vec!["Filesystem", "Mounted", "on", "Used"] ); } @@ -289,12 +315,16 @@ fn test_output_multiple_occurrences() { .succeeds() .stdout_move_str(); assert_eq!( - output.lines().next().unwrap(), - "Filesystem Mounted on " + output + .lines() + .next() + .unwrap() + .split_whitespace() + .collect::>(), + vec!["Filesystem", "Mounted", "on"] ); } -// TODO Fix the spacing. #[test] fn test_output_file_all_filesystems() { // When run with no positional arguments, `df` lets "-" represent @@ -304,13 +334,12 @@ fn test_output_file_all_filesystems() { .succeeds() .stdout_move_str(); let mut lines = output.lines(); - assert_eq!(lines.next().unwrap(), "File "); + assert_eq!(lines.next().unwrap(), "File"); for line in lines { - assert_eq!(line, "- "); + assert_eq!(line, "- "); } } -// TODO Fix the spacing. #[test] fn test_output_file_specific_files() { // Create three files. @@ -326,15 +355,7 @@ fn test_output_file_specific_files() { .succeeds() .stdout_move_str(); let actual: Vec<&str> = output.lines().collect(); - assert_eq!( - actual, - vec![ - "File ", - "a ", - "b ", - "c " - ] - ); + assert_eq!(actual, vec!["File", "a ", "b ", "c "]); } #[test] @@ -355,5 +376,5 @@ fn test_nonexistent_file() { .args(&["--output=file", "does-not-exist", "."]) .fails() .stderr_is("df: does-not-exist: No such file or directory\n") - .stdout_is("File \n. \n"); + .stdout_is("File\n. \n"); } From 487c874204ed45209f6f9c095a3f11106ab67e14 Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Sun, 17 Apr 2022 16:32:01 +0200 Subject: [PATCH 088/242] uniq: print warning when both `-D` and `-c` are passed --- src/uu/uniq/src/uniq.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/uu/uniq/src/uniq.rs b/src/uu/uniq/src/uniq.rs index 020de023000..32e0783ce88 100644 --- a/src/uu/uniq/src/uniq.rs +++ b/src/uu/uniq/src/uniq.rs @@ -12,7 +12,7 @@ use std::path::Path; use std::str::FromStr; use strum_macros::{AsRefStr, EnumString}; use uucore::display::Quotable; -use uucore::error::{FromIo, UResult, USimpleError}; +use uucore::error::{FromIo, UResult, USimpleError, UUsageError}; use uucore::format_usage; static ABOUT: &str = "Report or omit repeated lines."; @@ -284,6 +284,14 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { ignore_case: matches.is_present(options::IGNORE_CASE), zero_terminated: matches.is_present(options::ZERO_TERMINATED), }; + + if uniq.show_counts && uniq.all_repeated { + return Err(UUsageError::new( + 1, + "printing all duplicated lines and repeat counts is meaningless", + )); + } + uniq.print_uniq( &mut open_input_file(&in_file_name)?, &mut open_output_file(&out_file_name)?, From 87f06637a91a05645cbf664e4953967d193f0287 Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Sun, 17 Apr 2022 16:33:31 +0200 Subject: [PATCH 089/242] tests/uniq: add GNU tests as Rust tests tests/uniq: fix and uncomment test case 120 --- tests/by-util/test_uniq.rs | 711 +++++++++++++++++++++++++++++++++++++ 1 file changed, 711 insertions(+) diff --git a/tests/by-util/test_uniq.rs b/tests/by-util/test_uniq.rs index cd013891b95..b3f5fcd68fe 100644 --- a/tests/by-util/test_uniq.rs +++ b/tests/by-util/test_uniq.rs @@ -1,3 +1,4 @@ +// spell-checker:ignore nabcd use crate::common::util::*; static INPUT: &str = "sorted.txt"; @@ -194,3 +195,713 @@ fn test_group_separate() { .run() .stdout_is_fixture("group.expected"); } + +#[test] +fn test_case2() { + new_ucmd!().pipe_in("a\na\n").run().stdout_is("a\n"); +} + +struct TestCase { + name: &'static str, + args: &'static [&'static str], + input: &'static str, + stdout: Option<&'static str>, + stderr: Option<&'static str>, + exit: Option, +} + +#[test] +fn gnu_tests() { + let cases = [ + TestCase { + name: "1", + args: &[], + input: "", + stdout: Some(""), + stderr: None, + exit: None, + }, + TestCase { + name: "2", + args: &[], + input: "a\na\n", + stdout: Some("a\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "3", + args: &[], + input: "a\na", + stdout: Some("a\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "4", + args: &[], + input: "a\nb", + stdout: Some("a\nb\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "5", + args: &[], + input: "a\na\nb", + stdout: Some("a\nb\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "6", + args: &[], + input: "b\na\na\n", + stdout: Some("b\na\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "7", + args: &[], + input: "a\nb\nc\n", + stdout: Some("a\nb\nc\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "2z", + args: &["-z"], + input: "a\na\n", + stdout: Some("a\na\n\0"), + stderr: None, + exit: None, + }, + TestCase { + name: "3z", + args: &["-z"], + input: "a\na", + stdout: Some("a\na\0"), + stderr: None, + exit: None, + }, + TestCase { + name: "4z", + args: &["-z"], + input: "a\nb", + stdout: Some("a\nb\0"), + stderr: None, + exit: None, + }, + TestCase { + name: "5z", + args: &["-z"], + input: "a\na\nb", + stdout: Some("a\na\nb\0"), + stderr: None, + exit: None, + }, + TestCase { + name: "10z", + args: &["-z", "-f1"], + input: "a\nb\n\0c\nb\n\0", + stdout: Some("a\nb\n\0"), + stderr: None, + exit: None, + }, + TestCase { + name: "20z", + args: &["-dz"], + input: "a\na\n", + stdout: Some(""), + stderr: None, + exit: None, + }, + TestCase { + name: "8", + args: &[], + input: "ö\nv\n", + stdout: Some("ö\nv\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "9", + args: &["-u"], + input: "a\na\n", + stdout: Some(""), + stderr: None, + exit: None, + }, + TestCase { + name: "10", + args: &["-u"], + input: "a\nb\n", + stdout: Some("a\nb\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "11", + args: &["-u"], + input: "a\nb\na\n", + stdout: Some("a\nb\na\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "12", + args: &["-u"], + input: "a\na\n", + stdout: Some(""), + stderr: None, + exit: None, + }, + TestCase { + name: "13", + args: &["-u"], + input: "a\na\n", + stdout: Some(""), + stderr: None, + exit: None, + }, + TestCase { + name: "20", + args: &["-d"], + input: "a\na\n", + stdout: Some("a\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "21", + args: &["-d"], + input: "a\nb\n", + stdout: Some(""), + stderr: None, + exit: None, + }, + TestCase { + name: "22", + args: &["-d"], + input: "a\nb\na\n", + stdout: Some(""), + stderr: None, + exit: None, + }, + TestCase { + name: "23", + args: &["-d"], + input: "a\na\nb\n", + stdout: Some("a\n"), + stderr: None, + exit: None, + }, + // // Obsolete syntax for "-f 1" + // TestCase { + // name: "obs30", + // args: &["-1"], + // input: "a a\nb a\n", + // stdout: Some("a a\n"), + // stderr: None, + // exit: None, + // }, + TestCase { + name: "31", + args: &["-f", "1"], + input: "a a\nb a\n", + stdout: Some("a a\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "32", + args: &["-f", "1"], + input: "a a\nb b\n", + stdout: Some("a a\nb b\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "33", + args: &["-f", "1"], + input: "a a a\nb a c\n", + stdout: Some("a a a\nb a c\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "34", + args: &["-f", "1"], + input: "b a\na a\n", + stdout: Some("b a\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "35", + args: &["-f", "2"], + input: "a a c\nb a c\n", + stdout: Some("a a c\n"), + stderr: None, + exit: None, + }, + // // Obsolete syntax for "-s 1" + // TestCase { + // name: "obs-plus40", + // args: &["+1"], + // input: "aaa\naaa\n", + // stdout: Some("aaa\n"), + // stderr: None, + // exit: None, + // }, + // TestCase { + // name: "obs-plus41", + // args: &["+1"], + // input: "baa\naaa\n", + // stdout: Some("baa\n"), + // stderr: None, + // exit: None, + // }, + TestCase { + name: "42", + args: &["-s", "1"], + input: "aaa\naaa\n", + stdout: Some("aaa\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "43", + args: &["-s", "2"], + input: "baa\naaa\n", + stdout: Some("baa\n"), + stderr: None, + exit: None, + }, + // // Obsolete syntax for "-s 1" + // TestCase { + // name: "obs-plus44", + // args: &["+1", "--"], + // input: "aaa\naaa\n", + // stdout: Some("aaa\n"), + // stderr: None, + // exit: None, + // }, + // TestCase { + // name: "obs-plus45", + // args: &["+1", "--"], + // input: "baa\naaa\n", + // stdout: Some("baa\n"), + // stderr: None, + // exit: None, + // }, + TestCase { + name: "50", + args: &["-f", "1", "-s", "1"], + input: "a aaa\nb ab\n", + stdout: Some("a aaa\nb ab\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "51", + args: &["-f", "1", "-s", "1"], + input: "a aaa\nb aaa\n", + stdout: Some("a aaa\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "52", + args: &["-s", "1", "-f", "1"], + input: "a aaa\nb ab\n", + stdout: Some("a aaa\nb ab\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "53", + args: &["-s", "1", "-f", "1"], + input: "a aaa\nb aaa\n", + stdout: Some("a aaa\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "54", + args: &["-s", "4"], + input: "abc\nabcd\n", + stdout: Some("abc\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "55", + args: &["-s", "0"], + input: "abc\nabcd\n", + stdout: Some("abc\nabcd\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "56", + args: &["-s", "0"], + input: "abc\n", + stdout: Some("abc\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "57", + args: &["-w", "0"], + input: "abc\nabcd\n", + stdout: Some("abc\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "60", + args: &["-w", "1"], + input: "a a\nb a\n", + stdout: Some("a a\nb a\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "61", + args: &["-w", "3"], + input: "a a\nb a\n", + stdout: Some("a a\nb a\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "62", + args: &["-w", "1", "-f", "1"], + input: "a a a\nb a c\n", + stdout: Some("a a a\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "63", + args: &["-f", "1", "-w", "1"], + input: "a a a\nb a c\n", + stdout: Some("a a a\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "64", + args: &["-f", "1", "-w", "4"], + input: "a a a\nb a c\n", + stdout: Some("a a a\nb a c\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "65", + args: &["-f", "1", "-w", "3"], + input: "a a a\nb a c\n", + stdout: Some("a a a\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "90", + args: &[], + input: "a\0a\na\n", + stdout: Some("a\0a\na\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "91", + args: &[], + input: "a\ta\na a\n", + stdout: Some("a\ta\na a\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "92", + args: &["-f", "1"], + input: "a\ta\na a\n", + stdout: Some("a\ta\na a\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "93", + args: &["-f", "2"], + input: "a\ta a\na a a\n", + stdout: Some("a\ta a\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "94", + args: &["-f", "1"], + input: "a\ta\na\ta\n", + stdout: Some("a\ta\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "101", + args: &["-c"], + input: "a\nb\n", + stdout: Some(" 1 a\n 1 b\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "102", + args: &["-c"], + input: "a\na\n", + stdout: Some(" 2 a\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "110", + args: &["-D"], + input: "a\na\n", + stdout: Some("a\na\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "111", + args: &["-D", "-w1"], + input: "a a\na b\n", + stdout: Some("a a\na b\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "112", + args: &["-D", "-c"], + input: "a a\na b\n", + stdout: Some(""), + stderr: Some("uniq: printing all duplicated lines and repeat counts is meaningless"), + exit: Some(1), + }, + TestCase { + name: "113", + args: &["--all-repeated=separate"], + input: "a\na\n", + stdout: Some("a\na\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "114", + args: &["--all-repeated=separate"], + input: "a\na\nb\nc\nc\n", + stdout: Some("a\na\n\nc\nc\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "115", + args: &["--all-repeated=separate"], + input: "a\na\nb\nb\nc\n", + stdout: Some("a\na\n\nb\nb\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "116", + args: &["--all-repeated=prepend"], + input: "a\na\n", + stdout: Some("\na\na\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "117", + args: &["--all-repeated=prepend"], + input: "a\na\nb\nc\nc\n", + stdout: Some("\na\na\n\nc\nc\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "118", + args: &["--all-repeated=prepend"], + input: "a\nb\n", + stdout: Some(""), + stderr: None, + exit: None, + }, + // \x08 is the backspace char + TestCase { + name: "120", + args: &["-d", "-u"], + input: "a\na\n\x08", + stdout: Some(""), + stderr: None, + exit: None, + }, + TestCase { + name: "123", + args: &["--zero-terminated"], + input: "a\na\nb", + stdout: Some("a\na\nb\0"), + stderr: None, + exit: None, + }, + TestCase { + name: "124", + args: &["--zero-terminated"], + input: "a\0a\0b", + stdout: Some("a\0b\0"), + stderr: None, + exit: None, + }, + TestCase { + name: "125", + args: &[], + input: "A\na\n", + stdout: Some("A\na\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "126", + args: &["-i"], + input: "A\na\n", + stdout: Some("A\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "127", + args: &["--ignore-case"], + input: "A\na\n", + stdout: Some("A\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "128", + args: &["--group=prepend"], + input: "a\na\nb\n", + stdout: Some("\na\na\n\nb\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "129", + args: &["--group=append"], + input: "a\na\nb\n", + stdout: Some("a\na\n\nb\n\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "130", + args: &["--group=separate"], + input: "a\na\nb\n", + stdout: Some("a\na\n\nb\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "131", + args: &["--group"], + input: "a\na\nb\n", + stdout: Some("a\na\n\nb\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "132", + args: &["--group=both"], + input: "a\na\nb\n", + stdout: Some("\na\na\n\nb\n\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "133", + args: &["--group=prepend"], + input: "a\na\n", + stdout: Some("\na\na\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "134", + args: &["--group=append"], + input: "a\na\n", + stdout: Some("a\na\n\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "135", + args: &["--group=separate"], + input: "a\na\n", + stdout: Some("a\na\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "136", + args: &["--group"], + input: "a\na\n", + stdout: Some("a\na\n"), + stderr: None, + exit: None, + }, + TestCase { + name: "137", + args: &["--group=prepend"], + input: "", + stdout: Some(""), + stderr: None, + exit: None, + }, + TestCase { + name: "138", + args: &["--group=append"], + input: "", + stdout: Some(""), + stderr: None, + exit: None, + }, + TestCase { + name: "139", + args: &["--group=separate"], + input: "", + stdout: Some(""), + stderr: None, + exit: None, + }, + TestCase { + name: "140", + args: &["--group=both"], + input: "", + stdout: Some(""), + stderr: None, + exit: None, + }, + ]; + + for case in cases { + eprintln!("Test {}", case.name); + let result = new_ucmd!().args(case.args).run_piped_stdin(case.input); + if let Some(stdout) = case.stdout { + result.stdout_is(stdout); + } + if let Some(stderr) = case.stderr { + result.stderr_contains(stderr); + } + if let Some(exit) = case.exit { + result.code_is(exit); + } + } +} From 62d96db16b278b6bd088cff943116fec46cae029 Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Sun, 17 Apr 2022 21:33:51 +0200 Subject: [PATCH 090/242] docs: don't download the tldr archive (#3415) The ureq dependency is causing compilation errors on various platforms (see #3184, #3216, #3375). Hence we remove that dependency and do not automatically download the archive anymore. Instead, we ask the user to download it separately when the archive is not found. --- Cargo.lock | 252 ----------------------------------------------- Cargo.toml | 1 - docs/.gitignore | 1 + src/bin/uudoc.rs | 89 +++++++++-------- 4 files changed, 47 insertions(+), 296 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c1dec695dfa..d832e547c2e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -73,12 +73,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" -[[package]] -name = "base64" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" - [[package]] name = "bigdecimal" version = "0.3.0" @@ -173,12 +167,6 @@ dependencies = [ "regex-automata", ] -[[package]] -name = "bumpalo" -version = "3.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" - [[package]] name = "byte-unit" version = "4.0.14" @@ -240,12 +228,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "chunked_transfer" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff857943da45f546682664a79488be82e69e43c1a7a2307679ab9afb3a66d2e" - [[package]] name = "clang-sys" version = "1.3.0" @@ -347,7 +329,6 @@ dependencies = [ "time", "unindent", "unix_socket", - "ureq", "users", "uu_arch", "uu_base32", @@ -838,16 +819,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "form_urlencoded" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" -dependencies = [ - "matches", - "percent-encoding", -] - [[package]] name = "fs_extra" version = "1.2.0" @@ -968,17 +939,6 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" -[[package]] -name = "idna" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - [[package]] name = "if_rust_version" version = "1.0.0" @@ -1019,15 +979,6 @@ dependencies = [ "either", ] -[[package]] -name = "js-sys" -version = "0.3.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a38fc24e30fd564ce974c02bf1d337caddff65be6cc4735a1f7eab22a7440f04" -dependencies = [ - "wasm-bindgen", -] - [[package]] name = "keccak" version = "0.1.0" @@ -1105,12 +1056,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" -[[package]] -name = "matches" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" - [[package]] name = "md-5" version = "0.10.1" @@ -1399,12 +1344,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" -[[package]] -name = "percent-encoding" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" - [[package]] name = "phf" version = "0.10.1" @@ -1668,21 +1607,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53552c6c49e1e13f1a203ef0080ab3bbef0beb570a528993e83df057a9d9bba1" -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin", - "untrusted", - "web-sys", - "winapi 0.3.9", -] - [[package]] name = "rlimit" version = "0.8.3" @@ -1708,18 +1632,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" -[[package]] -name = "rustls" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b323592e3164322f5b193dc4302e4e36cd8d37158a712d664efae1a5c2791700" -dependencies = [ - "log", - "ring", - "sct", - "webpki", -] - [[package]] name = "rustversion" version = "1.0.6" @@ -1741,16 +1653,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -[[package]] -name = "sct" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "selinux" version = "0.2.7" @@ -1873,12 +1775,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -2051,33 +1947,12 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "tinyvec" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" - [[package]] name = "typenum" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" -[[package]] -name = "unicode-bidi" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" - [[package]] name = "unicode-linebreak" version = "0.1.2" @@ -2087,15 +1962,6 @@ dependencies = [ "regex", ] -[[package]] -name = "unicode-normalization" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" -dependencies = [ - "tinyvec", -] - [[package]] name = "unicode-segmentation" version = "1.9.0" @@ -2136,41 +2002,6 @@ dependencies = [ "libc", ] -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "ureq" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9399fa2f927a3d327187cbd201480cee55bee6ac5d3c77dd27f0c6814cff16d5" -dependencies = [ - "base64", - "chunked_transfer", - "flate2", - "log", - "once_cell", - "rustls", - "url", - "webpki", - "webpki-roots", -] - -[[package]] -name = "url" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" -dependencies = [ - "form_urlencoded", - "idna", - "matches", - "percent-encoding", -] - [[package]] name = "users" version = "0.10.0" @@ -3257,89 +3088,6 @@ version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" -[[package]] -name = "wasm-bindgen" -version = "0.2.79" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.79" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca" -dependencies = [ - "bumpalo", - "lazy_static", - "log", - "proc-macro2", - "quote 1.0.14", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.79" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01" -dependencies = [ - "quote 1.0.14", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.79" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc" -dependencies = [ - "proc-macro2", - "quote 1.0.14", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.79" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2" - -[[package]] -name = "web-sys" -version = "0.3.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c060b319f29dd25724f09a2ba1418f142f539b2be99fbf4d2d5a8f7330afb8eb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "webpki-roots" -version = "0.22.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "552ceb903e957524388c4d3475725ff2c8b7960922063af6ce53c9a43da07449" -dependencies = [ - "webpki", -] - [[package]] name = "which" version = "4.2.2" diff --git a/Cargo.toml b/Cargo.toml index f5932b1cf6a..41532cd4527 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -254,7 +254,6 @@ lazy_static = { version="1.3" } textwrap = { version="0.15", features=["terminal_size"] } uucore = { version=">=0.0.11", package="uucore", path="src/uucore" } selinux = { version="0.2", optional = true } -ureq = "2.4.0" zip = { version = "0.6.0", default_features=false, features=["deflate"] } # * uutils uu_test = { optional=true, version="0.0.13", package="uu_test", path="src/uu/test" } diff --git a/docs/.gitignore b/docs/.gitignore index f2b5c71685b..c669da8f672 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -1,3 +1,4 @@ book src/utils src/SUMMARY.md +tldr.zip \ No newline at end of file diff --git a/src/bin/uudoc.rs b/src/bin/uudoc.rs index 14e71d651fa..150849e6f10 100644 --- a/src/bin/uudoc.rs +++ b/src/bin/uudoc.rs @@ -8,21 +8,23 @@ use clap::Command; use std::collections::HashMap; use std::ffi::OsString; use std::fs::File; -use std::io::Cursor; use std::io::{self, Read, Seek, Write}; use zip::ZipArchive; include!(concat!(env!("OUT_DIR"), "/uutils_map.rs")); fn main() -> io::Result<()> { - println!("Downloading tldr archive"); - let mut zip_reader = ureq::get("https://tldr.sh/assets/tldr.zip") - .call() - .unwrap() - .into_reader(); - let mut buffer = Vec::new(); - zip_reader.read_to_end(&mut buffer).unwrap(); - let mut tldr_zip = ZipArchive::new(Cursor::new(buffer)).unwrap(); + let mut tldr_zip = File::open("docs/tldr.zip") + .ok() + .and_then(|f| ZipArchive::new(f).ok()); + + if tldr_zip.is_none() { + println!("Warning: No tldr archive found, so the documentation will not include examples."); + println!("To include examples in the documentation, download the tldr archive and put it in the docs/ folder."); + println!(); + println!(" curl https://tldr.sh/assets/tldr.zip -o docs/tldr.zip"); + println!(); + } let utils = util_map::>>(); match std::fs::create_dir("docs/src/utils/") { @@ -109,7 +111,7 @@ struct MDWriter<'a, 'b> { w: Box, command: Command<'a>, name: &'a str, - tldr_zip: &'b mut ZipArchive>>, + tldr_zip: &'b mut Option>, utils_per_platform: &'b HashMap<&'b str, Vec>, } @@ -189,42 +191,43 @@ impl<'a, 'b> MDWriter<'a, 'b> { } fn examples(&mut self) -> io::Result<()> { - let content = if let Some(f) = - get_zip_content(self.tldr_zip, &format!("pages/common/{}.md", self.name)) - { - f - } else if let Some(f) = - get_zip_content(self.tldr_zip, &format!("pages/linux/{}.md", self.name)) - { - f - } else { - return Ok(()); - }; - - writeln!(self.w, "## Examples")?; - writeln!(self.w)?; - for line in content.lines().skip_while(|l| !l.starts_with('-')) { - if let Some(l) = line.strip_prefix("- ") { - writeln!(self.w, "{}", l)?; - } else if line.starts_with('`') { - writeln!(self.w, "```shell\n{}\n```", line.trim_matches('`'))?; - } else if line.is_empty() { - writeln!(self.w)?; + if let Some(zip) = self.tldr_zip { + let content = if let Some(f) = + get_zip_content(zip, &format!("pages/common/{}.md", self.name)) + { + f + } else if let Some(f) = get_zip_content(zip, &format!("pages/linux/{}.md", self.name)) { + f } else { - println!("Not sure what to do with this line:"); - println!("{}", line); + return Ok(()); + }; + + writeln!(self.w, "## Examples")?; + writeln!(self.w)?; + for line in content.lines().skip_while(|l| !l.starts_with('-')) { + if let Some(l) = line.strip_prefix("- ") { + writeln!(self.w, "{}", l)?; + } else if line.starts_with('`') { + writeln!(self.w, "```shell\n{}\n```", line.trim_matches('`'))?; + } else if line.is_empty() { + writeln!(self.w)?; + } else { + println!("Not sure what to do with this line:"); + println!("{}", line); + } } + writeln!(self.w)?; + writeln!( + self.w, + "> The examples are provided by the [tldr-pages project](https://tldr.sh) under the [CC BY 4.0 License](https://github.com/tldr-pages/tldr/blob/main/LICENSE.md)." + )?; + writeln!(self.w, ">")?; + writeln!( + self.w, + "> Please note that, as uutils is a work in progress, some examples might fail." + )?; } - writeln!(self.w)?; - writeln!( - self.w, - "> The examples are provided by the [tldr-pages project](https://tldr.sh) under the [CC BY 4.0 License](https://github.com/tldr-pages/tldr/blob/main/LICENSE.md)." - )?; - writeln!(self.w, ">")?; - writeln!( - self.w, - "> Please note that, as uutils is a work in progress, some examples might fail." - ) + Ok(()) } fn options(&mut self) -> io::Result<()> { From 1eb76129664f96fc36c6db1331d1dc9ff88e7bb3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 17 Apr 2022 19:41:07 +0000 Subject: [PATCH 091/242] build(deps): bump crossterm from 0.23.1 to 0.23.2 Bumps [crossterm](https://github.com/crossterm-rs/crossterm) from 0.23.1 to 0.23.2. - [Release notes](https://github.com/crossterm-rs/crossterm/releases) - [Changelog](https://github.com/crossterm-rs/crossterm/blob/master/CHANGELOG.md) - [Commits](https://github.com/crossterm-rs/crossterm/commits) --- updated-dependencies: - dependency-name: crossterm dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d832e547c2e..222b4df5ffe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -604,9 +604,9 @@ dependencies = [ [[package]] name = "crossterm" -version = "0.23.1" +version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fd7173631a4e9e2ca8b32ae2fad58aab9843ea5aaf56642661937d87e28a3e" +checksum = "a2102ea4f781910f8a5b98dd061f4c2023f479ce7bb1236330099ceb5a93cf17" dependencies = [ "bitflags", "crossterm_winapi", @@ -862,7 +862,7 @@ checksum = "418d37c8b1d42553c93648be529cb70f920d3baf8ef469b74b9638df426e0b4c" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi", + "wasi 0.10.2+wasi-snapshot-preview1", ] [[package]] @@ -1116,14 +1116,15 @@ dependencies = [ [[package]] name = "mio" -version = "0.7.14" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" +checksum = "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9" dependencies = [ "libc", "log", "miow", "ntapi", + "wasi 0.11.0+wasi-snapshot-preview1", "winapi 0.3.9", ] @@ -1729,9 +1730,9 @@ dependencies = [ [[package]] name = "signal-hook-mio" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29fd5867f1c4f2c5be079aee7a2adf1152ebb04a4bc4d341f504b7dece607ed4" +checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af" dependencies = [ "libc", "mio", @@ -3088,6 +3089,12 @@ version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "which" version = "4.2.2" From 6da73e6a6dc48303cb6db368299cc0c77eaa5459 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sun, 17 Apr 2022 22:24:44 +0200 Subject: [PATCH 092/242] install: When install --strip-program=foor fails, remove the target file Should fix: tests/install/strip-program.sh --- src/uu/install/src/install.rs | 8 +++++++- tests/by-util/test_install.rs | 14 ++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/uu/install/src/install.rs b/src/uu/install/src/install.rs index e3154aa5136..a0339ec2f27 100644 --- a/src/uu/install/src/install.rs +++ b/src/uu/install/src/install.rs @@ -594,13 +594,19 @@ fn copy(from: &Path, to: &Path, b: &Behavior) -> UResult<()> { match process::Command::new(&b.strip_program).arg(to).output() { Ok(o) => { if !o.status.success() { + // Follow GNU's behavior: if strip fails, removes the target + let _ = fs::remove_file(to); return Err(InstallError::StripProgramFailed( String::from_utf8(o.stderr).unwrap_or_default(), ) .into()); } } - Err(e) => return Err(InstallError::StripProgramFailed(e.to_string()).into()), + Err(e) => { + // Follow GNU's behavior: if strip fails, removes the target + let _ = fs::remove_file(to); + return Err(InstallError::StripProgramFailed(e.to_string()).into()); + } } } diff --git a/tests/by-util/test_install.rs b/tests/by-util/test_install.rs index 0c775d14537..b35a45991da 100644 --- a/tests/by-util/test_install.rs +++ b/tests/by-util/test_install.rs @@ -607,7 +607,11 @@ fn test_install_and_strip_with_program() { #[test] #[cfg(not(windows))] fn test_install_and_strip_with_invalid_program() { - new_ucmd!() + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + scene + .ucmd() .arg("-s") .arg("--strip-program") .arg("/bin/date") @@ -615,12 +619,17 @@ fn test_install_and_strip_with_invalid_program() { .arg(STRIP_TARGET_FILE) .fails() .stderr_contains("strip program failed"); + assert!(!at.file_exists(STRIP_TARGET_FILE)); } #[test] #[cfg(not(windows))] fn test_install_and_strip_with_non_existent_program() { - new_ucmd!() + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + scene + .ucmd() .arg("-s") .arg("--strip-program") .arg("/usr/bin/non_existent_program") @@ -628,6 +637,7 @@ fn test_install_and_strip_with_non_existent_program() { .arg(STRIP_TARGET_FILE) .fails() .stderr_contains("No such file or directory"); + assert!(!at.file_exists(STRIP_TARGET_FILE)); } #[test] From 9813f48ed8488b12075d090eea69058977c3c5e2 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Mon, 18 Apr 2022 00:34:42 +0200 Subject: [PATCH 093/242] GNU/Coreutils: update the reference to 9.1 --- .github/workflows/GnuTests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/GnuTests.yml b/.github/workflows/GnuTests.yml index b10772ec218..f233f46d02e 100644 --- a/.github/workflows/GnuTests.yml +++ b/.github/workflows/GnuTests.yml @@ -216,7 +216,7 @@ jobs: with: repository: 'coreutils/coreutils' path: 'gnu' - ref: 'v9.0' + ref: 'v9.1' submodules: recursive - name: Install `rust` toolchain uses: actions-rs/toolchain@v1 From b93fb8de700bc4681079c62749f84fa3650788ee Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Mon, 18 Apr 2022 14:54:54 +0200 Subject: [PATCH 094/242] update another ref to coreutils 9.1 --- .github/workflows/GnuTests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/GnuTests.yml b/.github/workflows/GnuTests.yml index f233f46d02e..d306092c6f5 100644 --- a/.github/workflows/GnuTests.yml +++ b/.github/workflows/GnuTests.yml @@ -25,7 +25,7 @@ jobs: outputs path_GNU path_GNU_tests path_reference path_UUTILS # repo_default_branch="${{ github.event.repository.default_branch }}" - repo_GNU_ref="v9.0" + repo_GNU_ref="v9.1" repo_reference_branch="${{ github.event.repository.default_branch }}" outputs repo_default_branch repo_GNU_ref repo_reference_branch # From 7910eca71b7d6984cab5a645f19800965935174b Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Mon, 18 Apr 2022 00:30:21 +0200 Subject: [PATCH 095/242] install: verbose - list all created directories $ install -Dv source_file1 sub3/a/b/c/file install: creating directory 'sub3' install: creating directory 'sub3/a' install: creating directory 'sub3/a/b' install: creating directory 'sub3/a/b/c' 'source_file1' -> 'sub3/a/b/c/file' --- src/uu/install/src/install.rs | 13 +++++++++++++ tests/by-util/test_install.rs | 28 +++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/uu/install/src/install.rs b/src/uu/install/src/install.rs index a0339ec2f27..808898cfb20 100644 --- a/src/uu/install/src/install.rs +++ b/src/uu/install/src/install.rs @@ -464,6 +464,19 @@ fn standard(mut paths: Vec, b: &Behavior) -> UResult<()> { } else { if let Some(parent) = target.parent() { if !parent.exists() && b.create_leading { + if b.verbose { + let mut result = PathBuf::new(); + // When creating directories with -Dv, show directory creations step + // by step + for part in parent.components() { + result.push(part.as_os_str()); + if !Path::new(part.as_os_str()).is_dir() { + // Don't display when the directory already exists + println!("install: creating directory {}", result.quote()); + } + } + } + if let Err(e) = fs::create_dir_all(parent) { return Err(InstallError::CreateDirFailed(parent.to_path_buf(), e).into()); } diff --git a/tests/by-util/test_install.rs b/tests/by-util/test_install.rs index b35a45991da..a0e18c19ac1 100644 --- a/tests/by-util/test_install.rs +++ b/tests/by-util/test_install.rs @@ -1,4 +1,4 @@ -// spell-checker:ignore (words) helloworld objdump +// spell-checker:ignore (words) helloworld objdump n'source use crate::common::util::*; use filetime::FileTime; @@ -1174,3 +1174,29 @@ fn test_install_dir_dot() { assert!(at.dir_exists("dir4/cal")); assert!(at.dir_exists("dir5/cali")); } + +#[test] +fn test_install_dir_req_verbose() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + let file_1 = "source_file1"; + let dest_dir = "sub4"; + at.touch(file_1); + scene + .ucmd() + .arg("-Dv") + .arg(file_1) + .arg("sub3/a/b/c/file") + .succeeds() + .stdout_contains("install: creating directory 'sub3'\ninstall: creating directory 'sub3/a'\ninstall: creating directory 'sub3/a/b'\ninstall: creating directory 'sub3/a/b/c'\n'source_file1' -> 'sub3/a/b/c/file'"); + + at.mkdir(dest_dir); + scene + .ucmd() + .arg("-Dv") + .arg(file_1) + .arg("sub4/a/b/c/file") + .succeeds() + .stdout_contains("install: creating directory 'sub4/a'\ninstall: creating directory 'sub4/a/b'\ninstall: creating directory 'sub4/a/b/c'\n'source_file1' -> 'sub4/a/b/c/file'"); +} From 0d7f99a21f0eb0e560d48e7db1890e024add76cd Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Tue, 19 Apr 2022 07:46:00 +0200 Subject: [PATCH 096/242] df: fix broken "test_df_output_overridden" test --- tests/by-util/test_df.rs | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index 859f7b5cc2e..223dc4efcb1 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -101,9 +101,26 @@ fn test_df_output() { #[test] fn test_df_output_overridden() { let expected = if cfg!(target_os = "macos") { - "Filesystem Size Used Available Capacity Use% Mounted on " + vec![ + "Filesystem", + "Size", + "Used", + "Available", + "Capacity", + "Use%", + "Mounted", + "on", + ] } else { - "Filesystem Size Used Available Use% Mounted on " + vec![ + "Filesystem", + "Size", + "Used", + "Available", + "Use%", + "Mounted", + "on", + ] }; let output = new_ucmd!() .arg("-hH") @@ -111,6 +128,7 @@ fn test_df_output_overridden() { .succeeds() .stdout_move_str(); let actual = output.lines().take(1).collect::>()[0]; + let actual = actual.split_whitespace().collect::>(); assert_eq!(actual, expected); } From 576ec49fa51a8294818dacd81453c4eb9ccece38 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Mon, 18 Apr 2022 14:30:20 +0200 Subject: [PATCH 097/242] df: remove trailing spaces in rightmost column --- src/uu/df/src/table.rs | 13 +++++++++++-- tests/by-util/test_df.rs | 8 ++++---- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/uu/df/src/table.rs b/src/uu/df/src/table.rs index 698da2bdb48..a9a8d010aa2 100644 --- a/src/uu/df/src/table.rs +++ b/src/uu/df/src/table.rs @@ -400,12 +400,21 @@ impl fmt::Display for Table { while let Some(row) = row_iter.next() { let mut col_iter = row.iter().enumerate().peekable(); while let Some((i, elem)) = col_iter.next() { + let is_last_col = col_iter.peek().is_none(); + match self.alignments[i] { - Alignment::Left => write!(f, "{: { + if is_last_col { + // no trailing spaces in last column + write!(f, "{}", elem)?; + } else { + write!(f, "{: write!(f, "{:>width$}", elem, width = self.widths[i])?, } - if col_iter.peek().is_some() { + if !is_last_col { // column separator write!(f, " ")?; } diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index 223dc4efcb1..2304304127f 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -349,7 +349,7 @@ fn test_output_selects_columns() { .args(&["--output=source"]) .succeeds() .stdout_move_str(); - assert_eq!(output.lines().next().unwrap().trim_end(), "Filesystem"); + assert_eq!(output.lines().next().unwrap(), "Filesystem"); let output = new_ucmd!() .args(&["--output=source,target"]) @@ -408,7 +408,7 @@ fn test_output_file_all_filesystems() { let mut lines = output.lines(); assert_eq!(lines.next().unwrap(), "File"); for line in lines { - assert_eq!(line, "- "); + assert_eq!(line, "-"); } } @@ -427,7 +427,7 @@ fn test_output_file_specific_files() { .succeeds() .stdout_move_str(); let actual: Vec<&str> = output.lines().collect(); - assert_eq!(actual, vec!["File", "a ", "b ", "c "]); + assert_eq!(actual, vec!["File", "a", "b", "c"]); } #[test] @@ -448,5 +448,5 @@ fn test_nonexistent_file() { .args(&["--output=file", "does-not-exist", "."]) .fails() .stderr_is("df: does-not-exist: No such file or directory\n") - .stdout_is("File\n. \n"); + .stdout_is("File\n.\n"); } From cc4b28780bf03e086b2b634c2e6dd74c4f1622af Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Fri, 15 Apr 2022 15:26:17 +0200 Subject: [PATCH 098/242] df: show error if all types are excluded Fixes #3409 --- src/uu/df/src/df.rs | 3 ++- tests/by-util/test_df.rs | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/uu/df/src/df.rs b/src/uu/df/src/df.rs index ce6804770cb..b4f3457c432 100644 --- a/src/uu/df/src/df.rs +++ b/src/uu/df/src/df.rs @@ -287,6 +287,7 @@ fn get_all_filesystems(opt: &Options) -> Vec { mounts .into_iter() .filter_map(|m| Filesystem::new(m, None)) + .filter(|fs| opt.show_all_fs || fs.usage.blocks > 0) .collect() } @@ -362,7 +363,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { let filesystems = get_all_filesystems(&opt); if filesystems.is_empty() { - return Err(USimpleError::new(1, "No file systems processed")); + return Err(USimpleError::new(1, "no file systems processed")); } filesystems diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index 223dc4efcb1..ca829601867 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -1,4 +1,6 @@ // spell-checker:ignore udev pcent iuse itotal iused ipcent +use std::collections::HashSet; + use crate::common::util::*; #[test] @@ -204,6 +206,27 @@ fn test_exclude_type_option() { new_ucmd!().args(&["-x", "ext4", "-x", "ext3"]).succeeds(); } +#[test] +fn test_exclude_all_types() { + let fs_types = new_ucmd!() + .arg("--output=fstype") + .succeeds() + .stdout_move_str(); + let fs_types: HashSet<_> = fs_types.lines().skip(1).collect(); + + let mut args = Vec::new(); + + for fs_type in fs_types { + args.push("-x"); + args.push(fs_type.trim_end()); + } + + new_ucmd!() + .args(&args) + .fails() + .stderr_contains("no file systems processed"); +} + #[test] fn test_include_exclude_same_type() { new_ucmd!() From 9de407b1f0be3ccb7d451eedeae11eaae3fa10fe Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Tue, 19 Apr 2022 10:40:10 +0200 Subject: [PATCH 099/242] df: fix "File" column width for unicode filenames Fixes #3425 --- Cargo.lock | 1 + src/uu/df/Cargo.toml | 1 + src/uu/df/src/table.rs | 5 +++-- tests/by-util/test_df.rs | 15 +++++++++++++++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d832e547c2e..eda10a194eb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2206,6 +2206,7 @@ version = "0.0.13" dependencies = [ "clap 3.1.8", "number_prefix", + "unicode-width", "uucore", ] diff --git a/src/uu/df/Cargo.toml b/src/uu/df/Cargo.toml index c6a1c570bbd..1020b71bb46 100644 --- a/src/uu/df/Cargo.toml +++ b/src/uu/df/Cargo.toml @@ -18,6 +18,7 @@ path = "src/df.rs" clap = { version = "3.1", features = ["wrap_help", "cargo"] } number_prefix = "0.4" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["libc", "fsext"] } +unicode-width = "0.1.9" [[bin]] name = "df" diff --git a/src/uu/df/src/table.rs b/src/uu/df/src/table.rs index 698da2bdb48..6b64ce02c24 100644 --- a/src/uu/df/src/table.rs +++ b/src/uu/df/src/table.rs @@ -8,6 +8,7 @@ //! A table ([`Table`]) comprises a header row ([`Header`]) and a //! collection of data rows ([`Row`]), one per filesystem. use number_prefix::NumberPrefix; +use unicode_width::UnicodeWidthStr; use crate::columns::{Alignment, Column}; use crate::filesystem::Filesystem; @@ -362,8 +363,8 @@ impl Table { total += row; for (i, value) in values.iter().enumerate() { - if value.len() > widths[i] { - widths[i] = value.len(); + if UnicodeWidthStr::width(value.as_str()) > widths[i] { + widths[i] = UnicodeWidthStr::width(value.as_str()); } } diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index 223dc4efcb1..f9e826decaa 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -165,6 +165,7 @@ fn test_output_mp_repeat() { assert_eq!(3, output1.len()); assert_eq!(output1[1], output1[2]); } + #[test] fn test_output_conflict_options() { for option in ["-i", "-T", "-P"] { @@ -430,6 +431,20 @@ fn test_output_file_specific_files() { assert_eq!(actual, vec!["File", "a ", "b ", "c "]); } +#[test] +fn test_file_column_width_if_filename_contains_unicode_chars() { + let (at, mut ucmd) = at_and_ucmd!(); + at.touch("äöü.txt"); + + let output = ucmd + .args(&["--output=file,target", "äöü.txt"]) + .succeeds() + .stdout_move_str(); + let actual = output.lines().next().unwrap(); + // expected width: 7 chars (length of äöü.txt) + 1 char (column separator) + assert_eq!(actual, "File Mounted on"); +} + #[test] fn test_output_field_no_more_than_once() { new_ucmd!() From bfaf7616e26d4a8f7bef55075c7db7724d19ac6f Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Tue, 19 Apr 2022 17:20:37 +0200 Subject: [PATCH 100/242] Improve the GNU doc when a test uses $fail --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f10edc12569..f6df9fdcfe5 100644 --- a/README.md +++ b/README.md @@ -385,6 +385,7 @@ To improve the GNU compatibility, the following process is recommended: 1. Start to modify `` to understand what is wrong. Examples: 1. Add `set -v` to have the bash verbose mode 1. Add `echo $?` where needed + 1. When the variable `fail` is used in the test, `echo $fail` to see when the test started to fail 1. Bump the content of the output (ex: `cat err`) 1. ... 1. Or, if the test is simple, extract the relevant information to create a new test case running both GNU & Rust implementation From 45b29d287fb057844689884e67e3524be46ee4fc Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Wed, 20 Apr 2022 08:37:53 +0200 Subject: [PATCH 101/242] Remove an old comment We have windows stable in the CI: https://github.com/uutils/coreutils/runs/6082164374?check_suite_focus=true And no longer Redox: https://github.com/uutils/coreutils/pull/2550 --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index f6df9fdcfe5..2dfffa01742 100644 --- a/README.md +++ b/README.md @@ -52,8 +52,6 @@ Both can also be generated locally, the instructions for that can be found in th uutils follows Rust's release channels and is tested against stable, beta and nightly. The current oldest supported version of the Rust compiler is `1.56`. -On both Windows and Redox, only the nightly version is tested currently. - ## Building There are currently two methods to build the uutils binaries: either Cargo From 5e7d58650dd8f790a0857fa34e9d99bd07961678 Mon Sep 17 00:00:00 2001 From: Justin Tracey Date: Thu, 17 Feb 2022 00:58:34 -0500 Subject: [PATCH 102/242] fix null pointer derefs The code for creating a Passwd from the fields of the raw syscall result assumed that the syscall would return valid C strings in all non-error cases. This is not true, and at least one platform (Android) will populate the fields with null pointers where they are not supported. To fix this and prevent the error from happening again, this commit changes `cstr2string(ptr)` to check for a null pointer, and return an `Option`, with `None` being the null pointer case. While arguably it should be the caller's job to check for a null pointer before calling (since the safety precondition is that the pointer is to a valid C string), relying on the type checker to force remembering this edge case is safer in the long run. --- src/uu/id/src/id.rs | 18 ++++++++++----- src/uu/pinky/src/pinky.rs | 32 ++++++++++++++++++-------- src/uucore/src/lib/features/entries.rs | 23 ++++++++++-------- tests/by-util/test_pinky.rs | 7 ++++-- 4 files changed, 53 insertions(+), 27 deletions(-) diff --git a/src/uu/id/src/id.rs b/src/uu/id/src/id.rs index 3bb9ce8c932..714ade0359f 100644 --- a/src/uu/id/src/id.rs +++ b/src/uu/id/src/id.rs @@ -508,15 +508,15 @@ fn pline(possible_uid: Option) { println!( "{}:{}:{}:{}:{}:{}:{}:{}:{}:{}", pw.name, - pw.user_passwd, + pw.user_passwd.unwrap_or_default(), pw.uid, pw.gid, - pw.user_access_class, + pw.user_access_class.unwrap_or_default(), pw.passwd_change_time, pw.expiration, - pw.user_info, - pw.user_dir, - pw.user_shell + pw.user_info.unwrap_or_default(), + pw.user_dir.unwrap_or_default(), + pw.user_shell.unwrap_or_default() ); } @@ -527,7 +527,13 @@ fn pline(possible_uid: Option) { println!( "{}:{}:{}:{}:{}:{}:{}", - pw.name, pw.user_passwd, pw.uid, pw.gid, pw.user_info, pw.user_dir, pw.user_shell + pw.name, + pw.user_passwd.unwrap_or_default(), + pw.uid, + pw.gid, + pw.user_info.unwrap_or_default(), + pw.user_dir.unwrap_or_default(), + pw.user_shell.unwrap_or_default() ); } diff --git a/src/uu/pinky/src/pinky.rs b/src/uu/pinky/src/pinky.rs index 437c20cf530..5029caa2472 100644 --- a/src/uu/pinky/src/pinky.rs +++ b/src/uu/pinky/src/pinky.rs @@ -245,12 +245,16 @@ fn time_string(ut: &Utmpx) -> String { time::strftime("%b %e %H:%M", &ut.login_time()).unwrap() // LC_ALL=C } -fn gecos_to_fullname(pw: &Passwd) -> String { - let mut gecos = pw.user_info.clone(); +fn gecos_to_fullname(pw: &Passwd) -> Option { + let mut gecos = if let Some(gecos) = &pw.user_info { + gecos.clone() + } else { + return None; + }; if let Some(n) = gecos.find(',') { gecos.truncate(n); } - gecos.replace('&', &pw.name.capitalize()) + Some(gecos.replace('&', &pw.name.capitalize())) } impl Pinky { @@ -278,8 +282,13 @@ impl Pinky { print!("{1:<8.0$}", utmpx::UT_NAMESIZE, ut.user()); if self.include_fullname { - if let Ok(pw) = Passwd::locate(ut.user().as_ref()) { - print!(" {:<19.19}", gecos_to_fullname(&pw)); + let fullname = if let Ok(pw) = Passwd::locate(ut.user().as_ref()) { + gecos_to_fullname(&pw) + } else { + None + }; + if let Some(fullname) = fullname { + print!(" {:<19.19}", fullname); } else { print!(" {:19}", " ???"); } @@ -341,13 +350,16 @@ impl Pinky { for u in &self.names { print!("Login name: {:<28}In real life: ", u); if let Ok(pw) = Passwd::locate(u.as_str()) { - println!(" {}", gecos_to_fullname(&pw)); + let fullname = gecos_to_fullname(&pw).unwrap_or_default(); + let user_dir = pw.user_dir.unwrap_or_default(); + let user_shell = pw.user_shell.unwrap_or_default(); + println!(" {}", fullname); if self.include_home_and_shell { - print!("Directory: {:<29}", pw.user_dir); - println!("Shell: {}", pw.user_shell); + print!("Directory: {:<29}", user_dir); + println!("Shell: {}", user_shell); } if self.include_project { - let mut p = PathBuf::from(&pw.user_dir); + let mut p = PathBuf::from(&user_dir); p.push(".project"); if let Ok(f) = File::open(p) { print!("Project: "); @@ -355,7 +367,7 @@ impl Pinky { } } if self.include_plan { - let mut p = PathBuf::from(&pw.user_dir); + let mut p = PathBuf::from(&user_dir); p.push(".plan"); if let Ok(f) = File::open(p) { println!("Plan:"); diff --git a/src/uucore/src/lib/features/entries.rs b/src/uucore/src/lib/features/entries.rs index 0366355d49a..03c5a56cfe7 100644 --- a/src/uucore/src/lib/features/entries.rs +++ b/src/uucore/src/lib/features/entries.rs @@ -147,16 +147,16 @@ pub struct Passwd { /// AKA passwd.pw_gid pub gid: gid_t, /// AKA passwd.pw_gecos - pub user_info: String, + pub user_info: Option, /// AKA passwd.pw_shell - pub user_shell: String, + pub user_shell: Option, /// AKA passwd.pw_dir - pub user_dir: String, + pub user_dir: Option, /// AKA passwd.pw_passwd - pub user_passwd: String, + pub user_passwd: Option, /// AKA passwd.pw_class #[cfg(any(target_os = "freebsd", target_vendor = "apple"))] - pub user_access_class: String, + pub user_access_class: Option, /// AKA passwd.pw_change #[cfg(any(target_os = "freebsd", target_vendor = "apple"))] pub passwd_change_time: time_t, @@ -166,8 +166,13 @@ pub struct Passwd { } /// SAFETY: ptr must point to a valid C string. -unsafe fn cstr2string(ptr: *const c_char) -> String { - CStr::from_ptr(ptr).to_string_lossy().into_owned() +/// Returns None if ptr is null. +unsafe fn cstr2string(ptr: *const c_char) -> Option { + if !ptr.is_null() { + Some(CStr::from_ptr(ptr).to_string_lossy().into_owned()) + } else { + None + } } impl Passwd { @@ -175,7 +180,7 @@ impl Passwd { /// the function runs. That means PW_LOCK must be held. unsafe fn from_raw(raw: passwd) -> Self { Self { - name: cstr2string(raw.pw_name), + name: cstr2string(raw.pw_name).expect("passwd without name"), uid: raw.pw_uid, gid: raw.pw_gid, user_info: cstr2string(raw.pw_gecos), @@ -243,7 +248,7 @@ impl Group { /// the function runs. That means PW_LOCK must be held. unsafe fn from_raw(raw: group) -> Self { Self { - name: cstr2string(raw.gr_name), + name: cstr2string(raw.gr_name).expect("group without name"), gid: raw.gr_gid, } } diff --git a/tests/by-util/test_pinky.rs b/tests/by-util/test_pinky.rs index c036d449f98..1da93ee42b2 100644 --- a/tests/by-util/test_pinky.rs +++ b/tests/by-util/test_pinky.rs @@ -24,11 +24,14 @@ fn test_capitalize() { fn test_long_format() { let login = "root"; let pw: Passwd = Passwd::locate(login).unwrap(); - let real_name = pw.user_info.replace('&', &pw.name.capitalize()); + let user_info = pw.user_info.unwrap_or_default(); + let user_dir = pw.user_dir.unwrap_or_default(); + let user_shell = pw.user_shell.unwrap_or_default(); + let real_name = user_info.replace('&', &pw.name.capitalize()); let ts = TestScenario::new(util_name!()); ts.ucmd().arg("-l").arg(login).succeeds().stdout_is(format!( "Login name: {:<28}In real life: {}\nDirectory: {:<29}Shell: {}\n\n", - login, real_name, pw.user_dir, pw.user_shell + login, real_name, user_dir, user_shell )); ts.ucmd() From 2a0d58d060eb51ee482e7e8a764f36bda21105e5 Mon Sep 17 00:00:00 2001 From: Justin Tracey Date: Wed, 9 Feb 2022 13:08:28 -0500 Subject: [PATCH 103/242] get android builds to compile and pass tests --- Cargo.lock | 4 +- Cargo.toml | 17 ++++++-- src/uu/chroot/src/chroot.rs | 2 +- src/uu/cp/Cargo.toml | 2 +- src/uu/cp/src/cp.rs | 20 ++++++---- src/uu/dd/Cargo.toml | 2 +- src/uu/dd/src/dd.rs | 10 ++--- src/uu/dd/src/parseargs.rs | 16 ++++---- src/uu/dd/src/parseargs/unit_tests.rs | 6 +-- src/uu/id/src/id.rs | 12 +++--- src/uu/ls/src/ls.rs | 2 +- src/uu/nohup/src/nohup.rs | 2 +- src/uu/nproc/src/nproc.rs | 2 +- src/uu/stdbuf/src/stdbuf.rs | 2 + src/uu/sync/src/sync.rs | 20 ++++++---- src/uu/touch/src/touch.rs | 6 ++- src/uu/uname/src/uname.rs | 2 + src/uu/wc/src/count_fast.rs | 2 +- src/uu/who/src/who.rs | 2 +- src/uucore/src/lib/features.rs | 1 + src/uucore/src/lib/features/fsext.rs | 45 ++++++++++++++-------- src/uucore/src/lib/features/signals.rs | 2 +- src/uucore/src/lib/features/utmpx.rs | 4 +- src/uucore/src/lib/lib.rs | 1 + tests/by-util/test_cat.rs | 8 ++-- tests/by-util/test_chgrp.rs | 33 ++++++++-------- tests/by-util/test_chown.rs | 10 +++-- tests/by-util/test_chroot.rs | 1 + tests/by-util/test_cp.rs | 40 ++++++++++--------- tests/by-util/test_date.rs | 2 +- tests/by-util/test_dd.rs | 10 ++--- tests/by-util/test_du.rs | 28 +++++++------- tests/by-util/test_id.rs | 9 +++-- tests/by-util/test_install.rs | 20 ++++++---- tests/by-util/test_link.rs | 1 + tests/by-util/test_ln.rs | 6 +-- tests/by-util/test_ls.rs | 14 ++++--- tests/by-util/test_mv.rs | 2 +- tests/by-util/test_nice.rs | 2 + tests/by-util/test_nohup.rs | 7 +++- tests/by-util/test_sort.rs | 4 +- tests/by-util/test_stat.rs | 11 +++--- tests/by-util/test_uname.rs | 5 +++ tests/by-util/test_wc.rs | 6 +-- tests/common/util.rs | 6 +-- tests/fixtures/install/helloworld_android | Bin 0 -> 437072 bytes tests/fixtures/install/helloworld_linux | Bin 3343560 -> 464928 bytes 47 files changed, 244 insertions(+), 165 deletions(-) create mode 100755 tests/fixtures/install/helloworld_android diff --git a/Cargo.lock b/Cargo.lock index d832e547c2e..ff031935347 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -791,9 +791,9 @@ checksum = "31a7a908b8f32538a2143e59a6e4e2508988832d5d4d6f7c156b3cbc762643a5" [[package]] name = "filetime" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" +checksum = "c0408e2626025178a6a7f7ffc05a25bc47103229f19c113755de7bf63816290c" dependencies = [ "cfg-if 1.0.0", "libc", diff --git a/Cargo.toml b/Cargo.toml index 41532cd4527..17f68600833 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ # coreutils (uutils) # * see the repository LICENSE, README, and CONTRIBUTING files for more information -# spell-checker:ignore (libs) libselinux +# spell-checker:ignore (libs) libselinux gethostid [package] name = "coreutils" @@ -120,6 +120,7 @@ feat_Tier1 = [ # "feat_os_macos" == set of utilities which can be built/run on the MacOS platform feat_os_macos = [ "feat_os_unix", ## == a modern/usual *nix platform + "feat_require_hostid", ] # "feat_os_unix" == set of utilities which can be built/run on modern/usual *nix platforms feat_os_unix = [ @@ -140,12 +141,19 @@ feat_os_unix_gnueabihf = [ # "feat_require_unix", "feat_require_unix_utmpx", + "feat_require_hostid", ] # "feat_os_unix_musl" == set of utilities which can be built/run on targets binding to the "musl" library (ref: ) feat_os_unix_musl = [ "feat_Tier1", # "feat_require_unix", + "feat_require_hostid", +] +feat_os_unix_android = [ + "feat_Tier1", + # + "feat_require_unix", ] # "feat_selinux" == set of utilities providing support for SELinux Security Context if enabled with `--features feat_selinux`. # NOTE: @@ -172,7 +180,6 @@ feat_require_unix = [ "chown", "chroot", "groups", - "hostid", "id", "install", "kill", @@ -195,6 +202,10 @@ feat_require_unix_utmpx = [ "users", "who", ] +# "feat_require_hostid" == set of utilities requiring gethostid in libc (only some unixes provide) +feat_require_hostid = [ + "hostid", +] # "feat_require_selinux" == set of utilities depending on SELinux. feat_require_selinux = [ "chcon", @@ -386,7 +397,7 @@ walkdir = "2.2" atty = "0.2" hex-literal = "0.3.1" -[target.'cfg(target_os = "linux")'.dev-dependencies] +[target.'cfg(any(target_os = "linux", target_os = "android"))'.dev-dependencies] rlimit = "0.8.3" [target.'cfg(unix)'.dev-dependencies] diff --git a/src/uu/chroot/src/chroot.rs b/src/uu/chroot/src/chroot.rs index 713336104a5..e54cc3f8fe8 100644 --- a/src/uu/chroot/src/chroot.rs +++ b/src/uu/chroot/src/chroot.rs @@ -208,7 +208,7 @@ fn set_groups(groups: &[libc::gid_t]) -> libc::c_int { unsafe { setgroups(groups.len() as libc::c_int, groups.as_ptr()) } } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] fn set_groups(groups: &[libc::gid_t]) -> libc::c_int { unsafe { setgroups(groups.len() as libc::size_t, groups.as_ptr()) } } diff --git a/src/uu/cp/Cargo.toml b/src/uu/cp/Cargo.toml index b60006df1dd..1aab9c37bf5 100644 --- a/src/uu/cp/Cargo.toml +++ b/src/uu/cp/Cargo.toml @@ -27,7 +27,7 @@ selinux = { version="0.2", optional=true } uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["entries", "fs", "perms", "mode"] } walkdir = "2.2" -[target.'cfg(target_os = "linux")'.dependencies] +[target.'cfg(any(target_os = "linux", target_os = "android"))'.dependencies] ioctl-sys = "0.8" [target.'cfg(target_os = "windows")'.dependencies] diff --git a/src/uu/cp/src/cp.rs b/src/uu/cp/src/cp.rs index d69bb705b93..df9cb029310 100644 --- a/src/uu/cp/src/cp.rs +++ b/src/uu/cp/src/cp.rs @@ -10,7 +10,7 @@ // spell-checker:ignore (ToDO) ficlone linkgs lstat nlink nlinks pathbuf reflink strs xattrs symlinked -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] #[macro_use] extern crate ioctl_sys; #[macro_use] @@ -49,7 +49,7 @@ use std::mem; use std::os::unix::ffi::OsStrExt; #[cfg(unix)] use std::os::unix::fs::{FileTypeExt, PermissionsExt}; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] use std::os::unix::io::AsRawFd; #[cfg(windows)] use std::os::windows::ffi::OsStrExt; @@ -61,7 +61,7 @@ use uucore::error::{set_exit_code, ExitCode, UError, UResult}; use uucore::fs::{canonicalize, MissingHandling, ResolveMode}; use walkdir::WalkDir; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] ioctl!(write ficlone with 0x94, 9; std::os::raw::c_int); quick_error! { @@ -686,11 +686,15 @@ impl Options { } } } else { - #[cfg(any(target_os = "linux", target_os = "macos"))] + #[cfg(any(target_os = "linux", target_os = "android", target_os = "macos"))] { ReflinkMode::Auto } - #[cfg(not(any(target_os = "linux", target_os = "macos")))] + #[cfg(not(any( + target_os = "linux", + target_os = "android", + target_os = "macos" + )))] { ReflinkMode::Never } @@ -1467,14 +1471,14 @@ fn copy_helper( } else if source_is_symlink { copy_link(source, dest, symlinked_files)?; } else if options.reflink_mode != ReflinkMode::Never { - #[cfg(not(any(target_os = "linux", target_os = "macos")))] + #[cfg(not(any(target_os = "linux", target_os = "android", target_os = "macos")))] return Err("--reflink is only supported on linux and macOS" .to_string() .into()); #[cfg(target_os = "macos")] copy_on_write_macos(source, dest, options.reflink_mode, context)?; - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] copy_on_write_linux(source, dest, options.reflink_mode, context)?; } else { fs::copy(source, dest).context(context)?; @@ -1528,7 +1532,7 @@ fn copy_link( } /// Copies `source` to `dest` using copy-on-write if possible. -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] fn copy_on_write_linux( source: &Path, dest: &Path, diff --git a/src/uu/dd/Cargo.toml b/src/uu/dd/Cargo.toml index d311c97336c..c805685adc8 100644 --- a/src/uu/dd/Cargo.toml +++ b/src/uu/dd/Cargo.toml @@ -21,7 +21,7 @@ gcd = "2.0" libc = "0.2" uucore = { version=">=0.0.8", package="uucore", path="../../uucore" } -[target.'cfg(target_os = "linux")'.dependencies] +[target.'cfg(any(target_os = "linux", target_os = "android"))'.dependencies] signal-hook = "0.3.9" [[bin]] diff --git a/src/uu/dd/src/dd.rs b/src/uu/dd/src/dd.rs index 3b9bb02d874..3f1a54b1cf9 100644 --- a/src/uu/dd/src/dd.rs +++ b/src/uu/dd/src/dd.rs @@ -26,7 +26,7 @@ use std::cmp; use std::env; use std::fs::{File, OpenOptions}; use std::io::{self, Read, Seek, Write}; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] use std::os::unix::fs::OpenOptionsExt; use std::path::Path; use std::sync::mpsc; @@ -88,7 +88,7 @@ impl Input { } } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] fn make_linux_iflags(iflags: &IFlags) -> Option { let mut flag = 0; @@ -140,7 +140,7 @@ impl Input { let mut opts = OpenOptions::new(); opts.read(true); - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] if let Some(libc_flags) = make_linux_iflags(&iflags) { opts.custom_flags(libc_flags); } @@ -455,7 +455,7 @@ where } } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] fn make_linux_oflags(oflags: &OFlags) -> Option { let mut flag = 0; @@ -504,7 +504,7 @@ impl OutputTrait for Output { .create_new(cflags.excl) .append(oflags.append); - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] if let Some(libc_flags) = make_linux_oflags(oflags) { opts.custom_flags(libc_flags); } diff --git a/src/uu/dd/src/parseargs.rs b/src/uu/dd/src/parseargs.rs index 4bc65bc1c4f..0a2fae99a22 100644 --- a/src/uu/dd/src/parseargs.rs +++ b/src/uu/dd/src/parseargs.rs @@ -235,7 +235,7 @@ impl std::str::FromStr for Flag { "direct" => // Ok(Self::Direct), { - if cfg!(target_os = "linux") { + if cfg!(any(target_os = "linux", target_os = "android")) { Ok(Self::Direct) } else { Err(ParseError::Unimplemented(s.to_string())) @@ -244,7 +244,7 @@ impl std::str::FromStr for Flag { "directory" => // Ok(Self::Directory), { - if cfg!(target_os = "linux") { + if cfg!(any(target_os = "linux", target_os = "android")) { Ok(Self::Directory) } else { Err(ParseError::Unimplemented(s.to_string())) @@ -253,7 +253,7 @@ impl std::str::FromStr for Flag { "dsync" => // Ok(Self::Dsync), { - if cfg!(target_os = "linux") { + if cfg!(any(target_os = "linux", target_os = "android")) { Ok(Self::Dsync) } else { Err(ParseError::Unimplemented(s.to_string())) @@ -262,7 +262,7 @@ impl std::str::FromStr for Flag { "sync" => // Ok(Self::Sync), { - if cfg!(target_os = "linux") { + if cfg!(any(target_os = "linux", target_os = "android")) { Ok(Self::Sync) } else { Err(ParseError::Unimplemented(s.to_string())) @@ -276,7 +276,7 @@ impl std::str::FromStr for Flag { "nonblock" => // Ok(Self::NonBlock), { - if cfg!(target_os = "linux") { + if cfg!(any(target_os = "linux", target_os = "android")) { Ok(Self::NonBlock) } else { Err(ParseError::Unimplemented(s.to_string())) @@ -285,7 +285,7 @@ impl std::str::FromStr for Flag { "noatime" => // Ok(Self::NoATime), { - if cfg!(target_os = "linux") { + if cfg!(any(target_os = "linux", target_os = "android")) { Ok(Self::NoATime) } else { Err(ParseError::Unimplemented(s.to_string())) @@ -294,7 +294,7 @@ impl std::str::FromStr for Flag { "noctty" => // Ok(Self::NoCtty), { - if cfg!(target_os = "linux") { + if cfg!(any(target_os = "linux", target_os = "android")) { Ok(Self::NoCtty) } else { Err(ParseError::Unimplemented(s.to_string())) @@ -303,7 +303,7 @@ impl std::str::FromStr for Flag { "nofollow" => // Ok(Self::NoFollow), { - if cfg!(target_os = "linux") { + if cfg!(any(target_os = "linux", target_os = "android")) { Ok(Self::NoFollow) } else { Err(ParseError::Unimplemented(s.to_string())) diff --git a/src/uu/dd/src/parseargs/unit_tests.rs b/src/uu/dd/src/parseargs/unit_tests.rs index 95e783c58b2..9d834987376 100644 --- a/src/uu/dd/src/parseargs/unit_tests.rs +++ b/src/uu/dd/src/parseargs/unit_tests.rs @@ -4,7 +4,7 @@ use super::*; use crate::StatusLevel; -#[cfg(not(target_os = "linux"))] +#[cfg(not(any(target_os = "linux", target_os = "android")))] #[test] fn unimplemented_flags_should_error_non_linux() { let mut succeeded = Vec::new(); @@ -617,7 +617,7 @@ fn parse_oflag_tokens() { } } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] #[test] fn parse_iflag_tokens_linux() { let exp = vec![ @@ -645,7 +645,7 @@ fn parse_iflag_tokens_linux() { } } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] #[test] fn parse_oflag_tokens_linux() { let exp = vec![ diff --git a/src/uu/id/src/id.rs b/src/uu/id/src/id.rs index 714ade0359f..cc23ce19f86 100644 --- a/src/uu/id/src/id.rs +++ b/src/uu/id/src/id.rs @@ -201,7 +201,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { if state.cflag { if state.selinux_supported { // print SElinux context and exit - #[cfg(all(target_os = "linux", feature = "selinux"))] + #[cfg(all(any(target_os = "linux", target_os = "android"), feature = "selinux"))] if let Ok(context) = selinux::SecurityContext::current(false) { let bytes = context.as_bytes(); print!("{}{}", String::from_utf8_lossy(bytes), line_ending); @@ -520,7 +520,7 @@ fn pline(possible_uid: Option) { ); } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] fn pline(possible_uid: Option) { let uid = possible_uid.unwrap_or_else(getuid); let pw = Passwd::locate(uid).unwrap(); @@ -537,10 +537,10 @@ fn pline(possible_uid: Option) { ); } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] fn auditid() {} -#[cfg(not(target_os = "linux"))] +#[cfg(not(any(target_os = "linux", target_os = "android")))] fn auditid() { #[allow(deprecated)] let mut auditinfo: audit::c_auditinfo_addr_t = unsafe { std::mem::uninitialized() }; @@ -620,7 +620,7 @@ fn id_print(state: &mut State, groups: &[u32]) { .join(",") ); - #[cfg(all(target_os = "linux", feature = "selinux"))] + #[cfg(all(any(target_os = "linux", target_os = "android"), feature = "selinux"))] if state.selinux_supported && !state.user_specified && std::env::var_os("POSIXLY_CORRECT").is_none() @@ -633,7 +633,7 @@ fn id_print(state: &mut State, groups: &[u32]) { } } -#[cfg(not(target_os = "linux"))] +#[cfg(not(any(target_os = "linux", target_os = "android")))] mod audit { use super::libc::{c_int, c_uint, dev_t, pid_t, uid_t}; diff --git a/src/uu/ls/src/ls.rs b/src/uu/ls/src/ls.rs index a55f29e238d..17eec91ec2f 100644 --- a/src/uu/ls/src/ls.rs +++ b/src/uu/ls/src/ls.rs @@ -2370,7 +2370,7 @@ fn display_len_or_rdev(metadata: &Metadata, config: &Config) -> SizeOrDeviceId { return SizeOrDeviceId::Device(major.to_string(), minor.to_string()); } } - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] { let ft = metadata.file_type(); if ft.is_char_device() || ft.is_block_device() { diff --git a/src/uu/nohup/src/nohup.rs b/src/uu/nohup/src/nohup.rs index cfafb6b5bee..0d67ad466ef 100644 --- a/src/uu/nohup/src/nohup.rs +++ b/src/uu/nohup/src/nohup.rs @@ -213,7 +213,7 @@ extern "C" { fn _vprocmgr_detach_from_console(flags: u32) -> *const libc::c_int; } -#[cfg(any(target_os = "linux", target_os = "freebsd"))] +#[cfg(any(target_os = "linux", target_os = "android", target_os = "freebsd"))] unsafe fn _vprocmgr_detach_from_console(_: u32) -> *const libc::c_int { std::ptr::null() } diff --git a/src/uu/nproc/src/nproc.rs b/src/uu/nproc/src/nproc.rs index 87fe9a4e733..cbabde2928d 100644 --- a/src/uu/nproc/src/nproc.rs +++ b/src/uu/nproc/src/nproc.rs @@ -13,7 +13,7 @@ use uucore::display::Quotable; use uucore::error::{UResult, USimpleError}; use uucore::format_usage; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] pub const _SC_NPROCESSORS_CONF: libc::c_int = 83; #[cfg(target_vendor = "apple")] pub const _SC_NPROCESSORS_CONF: libc::c_int = libc::_SC_NPROCESSORS_CONF; diff --git a/src/uu/stdbuf/src/stdbuf.rs b/src/uu/stdbuf/src/stdbuf.rs index 5e0e7178978..816c8671799 100644 --- a/src/uu/stdbuf/src/stdbuf.rs +++ b/src/uu/stdbuf/src/stdbuf.rs @@ -78,6 +78,7 @@ struct ProgramOptionsError(String); #[cfg(any( target_os = "linux", + target_os = "android", target_os = "freebsd", target_os = "netbsd", target_os = "dragonflybsd" @@ -93,6 +94,7 @@ fn preload_strings() -> (&'static str, &'static str) { #[cfg(not(any( target_os = "linux", + target_os = "android", target_os = "freebsd", target_os = "netbsd", target_os = "dragonflybsd", diff --git a/src/uu/sync/src/sync.rs b/src/uu/sync/src/sync.rs index f9c18d50080..9baf9b182d0 100644 --- a/src/uu/sync/src/sync.rs +++ b/src/uu/sync/src/sync.rs @@ -27,17 +27,21 @@ static ARG_FILES: &str = "files"; #[cfg(unix)] mod platform { use super::libc; - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] use std::fs::File; - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] use std::os::unix::io::AsRawFd; pub unsafe fn do_sync() -> isize { + // see https://github.com/rust-lang/libc/pull/2161 + #[cfg(target_os = "android")] + libc::syscall(libc::SYS_sync); + #[cfg(not(target_os = "android"))] libc::sync(); 0 } - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] pub unsafe fn do_syncfs(files: Vec) -> isize { for path in files { let f = File::open(&path).unwrap(); @@ -47,7 +51,7 @@ mod platform { 0 } - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] pub unsafe fn do_fdatasync(files: Vec) -> isize { for path in files { let f = File::open(&path).unwrap(); @@ -179,10 +183,10 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { #[allow(clippy::if_same_then_else)] if matches.is_present(options::FILE_SYSTEM) { - #[cfg(any(target_os = "linux", target_os = "windows"))] + #[cfg(any(target_os = "linux", target_os = "android", target_os = "windows"))] syncfs(files); } else if matches.is_present(options::DATA) { - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] fdatasync(files); } else { sync(); @@ -221,12 +225,12 @@ fn sync() -> isize { unsafe { platform::do_sync() } } -#[cfg(any(target_os = "linux", target_os = "windows"))] +#[cfg(any(target_os = "linux", target_os = "android", target_os = "windows"))] fn syncfs(files: Vec) -> isize { unsafe { platform::do_syncfs(files) } } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] fn fdatasync(files: Vec) -> isize { unsafe { platform::do_fdatasync(files) } } diff --git a/src/uu/touch/src/touch.rs b/src/uu/touch/src/touch.rs index 8649175746e..ff08a1b592f 100644 --- a/src/uu/touch/src/touch.rs +++ b/src/uu/touch/src/touch.rs @@ -320,10 +320,14 @@ fn parse_timestamp(s: &str) -> UResult { /// On Windows, uses GetFinalPathNameByHandleW to attempt to get the path /// from the stdout handle. fn pathbuf_from_stdout() -> UResult { - #[cfg(unix)] + #[cfg(all(unix, not(target_os = "android")))] { Ok(PathBuf::from("/dev/stdout")) } + #[cfg(target_os = "android")] + { + Ok(PathBuf::from("/proc/self/fd/1")) + } #[cfg(windows)] { use std::os::windows::prelude::AsRawHandle; diff --git a/src/uu/uname/src/uname.rs b/src/uu/uname/src/uname.rs index bff03304753..f7b578c27bf 100644 --- a/src/uu/uname/src/uname.rs +++ b/src/uu/uname/src/uname.rs @@ -36,6 +36,8 @@ pub mod options { const HOST_OS: &str = "GNU/Linux"; #[cfg(all(target_os = "linux", not(any(target_env = "gnu", target_env = ""))))] const HOST_OS: &str = "Linux"; +#[cfg(target_os = "android")] +const HOST_OS: &str = "Android"; #[cfg(target_os = "windows")] const HOST_OS: &str = "Windows NT"; #[cfg(target_os = "freebsd")] diff --git a/src/uu/wc/src/count_fast.rs b/src/uu/wc/src/count_fast.rs index 4515cd3d706..f0aa311a011 100644 --- a/src/uu/wc/src/count_fast.rs +++ b/src/uu/wc/src/count_fast.rs @@ -37,7 +37,7 @@ fn count_bytes_using_splice(fd: &impl AsRawFd) -> Result { let null_rdev = stat::fstat(null_file.as_raw_fd()) .map_err(|_| 0_usize)? .st_rdev; - if (stat::major(null_rdev), stat::minor(null_rdev)) != (1, 3) { + if unsafe { (libc::major(null_rdev), libc::minor(null_rdev)) } != (1, 3) { // This is not a proper /dev/null, writing to it is probably bad // Bit of an edge case, but it has been known to happen return Err(0); diff --git a/src/uu/who/src/who.rs b/src/uu/who/src/who.rs index 98ef06f4766..6e21ac91257 100644 --- a/src/uu/who/src/who.rs +++ b/src/uu/who/src/who.rs @@ -40,7 +40,7 @@ mod options { static ABOUT: &str = "Print information about users who are currently logged in."; const USAGE: &str = "{} [OPTION]... [ FILE | ARG1 ARG2 ]"; -#[cfg(any(target_os = "linux"))] +#[cfg(target_os = "linux")] static RUNLEVEL_HELP: &str = "print current runlevel"; #[cfg(not(target_os = "linux"))] static RUNLEVEL_HELP: &str = "print current runlevel (This is meaningless on non Linux)"; diff --git a/src/uucore/src/lib/features.rs b/src/uucore/src/lib/features.rs index b1b87a61338..2e5aea1e2af 100644 --- a/src/uucore/src/lib/features.rs +++ b/src/uucore/src/lib/features.rs @@ -34,6 +34,7 @@ pub mod process; pub mod signals; #[cfg(all( unix, + not(target_os = "android"), not(target_os = "fuchsia"), not(target_os = "redox"), not(target_env = "musl"), diff --git a/src/uucore/src/lib/features/fsext.rs b/src/uucore/src/lib/features/fsext.rs index 6845ca3ca9c..eeaf5406137 100644 --- a/src/uucore/src/lib/features/fsext.rs +++ b/src/uucore/src/lib/features/fsext.rs @@ -15,9 +15,9 @@ extern crate time; pub use crate::*; // import macros from `../../macros.rs` -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] const LINUX_MTAB: &str = "/etc/mtab"; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] const LINUX_MOUNTINFO: &str = "/proc/self/mountinfo"; static MOUNT_OPT_BIND: &str = "bind"; #[cfg(windows)] @@ -75,7 +75,8 @@ use std::convert::{AsRef, From}; target_os = "freebsd", target_os = "netbsd", target_os = "openbsd", - target_os = "linux" + target_os = "linux", + target_os = "android", ))] use std::ffi::CStr; #[cfg(not(windows))] @@ -88,8 +89,8 @@ use std::time::UNIX_EPOCH; #[cfg(any( target_os = "linux", - target_vendor = "apple", target_os = "android", + target_vendor = "apple", target_os = "freebsd", target_os = "openbsd" ))] @@ -106,8 +107,8 @@ pub use libc::statvfs as StatFs; #[cfg(any( target_os = "linux", - target_vendor = "apple", target_os = "android", + target_vendor = "apple", target_os = "freebsd", target_os = "openbsd", target_os = "redox" @@ -208,7 +209,7 @@ impl MountInfo { } } - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] fn new(file_name: &str, raw: &[&str]) -> Option { match file_name { // spell-checker:ignore (word) noatime @@ -382,9 +383,9 @@ extern "C" { fn get_mount_info(mount_buffer_p: *mut *mut StatFs, flags: c_int) -> c_int; } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] use std::fs::File; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] use std::io::{BufRead, BufReader}; #[cfg(any( target_vendor = "apple", @@ -403,7 +404,7 @@ use std::ptr; use std::slice; /// Read file system list. pub fn read_fs_list() -> Vec { - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] { let (file_name, f) = File::open(LINUX_MOUNTINFO) .map(|f| (LINUX_MOUNTINFO, f)) @@ -611,17 +612,27 @@ impl FsMeta for StatFs { fn free_file_nodes(&self) -> u64 { self.f_ffree as u64 } - #[cfg(any(target_os = "linux", target_vendor = "apple", target_os = "freebsd"))] + #[cfg(any( + target_os = "linux", + target_os = "android", + target_vendor = "apple", + target_os = "freebsd" + ))] fn fs_type(&self) -> i64 { self.f_type as i64 } - #[cfg(not(any(target_os = "linux", target_vendor = "apple", target_os = "freebsd")))] + #[cfg(not(any( + target_os = "linux", + target_os = "android", + target_vendor = "apple", + target_os = "freebsd" + )))] fn fs_type(&self) -> i64 { // FIXME: statvfs doesn't have an equivalent, so we need to do something else unimplemented!() } - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] fn io_size(&self) -> u64 { self.f_frsize as u64 } @@ -634,6 +645,7 @@ impl FsMeta for StatFs { target_vendor = "apple", target_os = "freebsd", target_os = "linux", + target_os = "android", target_os = "netbsd" )))] fn io_size(&self) -> u64 { @@ -650,24 +662,26 @@ impl FsMeta for StatFs { target_vendor = "apple", target_os = "freebsd", target_os = "linux", + target_os = "android", target_os = "openbsd" ))] fn fsid(&self) -> u64 { let f_fsid: &[u32; 2] = - unsafe { &*(&self.f_fsid as *const libc::fsid_t as *const [u32; 2]) }; + unsafe { &*(&self.f_fsid as *const nix::sys::statfs::fsid_t as *const [u32; 2]) }; (u64::from(f_fsid[0])) << 32 | u64::from(f_fsid[1]) } #[cfg(not(any( target_vendor = "apple", target_os = "freebsd", target_os = "linux", + target_os = "android", target_os = "openbsd" )))] fn fsid(&self) -> u64 { self.f_fsid as u64 } - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] fn namelen(&self) -> u64 { self.f_namelen as u64 } @@ -684,6 +698,7 @@ impl FsMeta for StatFs { target_vendor = "apple", target_os = "freebsd", target_os = "linux", + target_os = "android", target_os = "netbsd", target_os = "openbsd" )))] @@ -903,7 +918,7 @@ mod tests { } #[test] - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] fn test_mountinfo() { // spell-checker:ignore (word) relatime let info = MountInfo::new( diff --git a/src/uucore/src/lib/features/signals.rs b/src/uucore/src/lib/features/signals.rs index e6d2e7763b1..e7b20e7d874 100644 --- a/src/uucore/src/lib/features/signals.rs +++ b/src/uucore/src/lib/features/signals.rs @@ -23,7 +23,7 @@ Linux Programmer's Manual */ -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] pub static ALL_SIGNALS: [&str; 32] = [ "EXIT", "HUP", "INT", "QUIT", "ILL", "TRAP", "ABRT", "BUS", "FPE", "KILL", "USR1", "SEGV", "USR2", "PIPE", "ALRM", "TERM", "STKFLT", "CHLD", "CONT", "STOP", "TSTP", "TTIN", "TTOU", diff --git a/src/uucore/src/lib/features/utmpx.rs b/src/uucore/src/lib/features/utmpx.rs index 2a0e2810b02..302d03d71ef 100644 --- a/src/uucore/src/lib/features/utmpx.rs +++ b/src/uucore/src/lib/features/utmpx.rs @@ -198,14 +198,14 @@ impl Utmpx { /// A.K.A. ut.ut_exit /// /// Return (e_termination, e_exit) - #[cfg(any(target_os = "linux", target_os = "android"))] + #[cfg(target_os = "linux")] pub fn exit_status(&self) -> (i16, i16) { (self.inner.ut_exit.e_termination, self.inner.ut_exit.e_exit) } /// A.K.A. ut.ut_exit /// /// Return (0, 0) on Non-Linux platform - #[cfg(not(any(target_os = "linux", target_os = "android")))] + #[cfg(not(target_os = "linux"))] pub fn exit_status(&self) -> (i16, i16) { (0, 0) } diff --git a/src/uucore/src/lib/lib.rs b/src/uucore/src/lib/lib.rs index 8f3d045ebc5..ad8f81259e6 100644 --- a/src/uucore/src/lib/lib.rs +++ b/src/uucore/src/lib/lib.rs @@ -62,6 +62,7 @@ pub use crate::features::process; pub use crate::features::signals; #[cfg(all( unix, + not(target_os = "android"), not(target_os = "fuchsia"), not(target_os = "redox"), not(target_env = "musl"), diff --git a/tests/by-util/test_cat.rs b/tests/by-util/test_cat.rs index 96c77a40ea6..d4541d690a4 100644 --- a/tests/by-util/test_cat.rs +++ b/tests/by-util/test_cat.rs @@ -5,7 +5,7 @@ use std::fs::OpenOptions; #[cfg(unix)] use std::io::Read; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] use rlimit::Resource; #[test] @@ -93,7 +93,7 @@ fn test_fifo_symlink() { } #[test] -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] fn test_closes_file_descriptors() { // Each file creates a pipe, which has two file descriptors. // If they are not closed then five is certainly too many. @@ -396,10 +396,10 @@ fn test_squeeze_blank_before_numbering() { #[cfg(unix)] fn test_dev_random() { let mut buf = [0; 2048]; - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] const DEV_RANDOM: &str = "/dev/urandom"; - #[cfg(not(target_os = "linux"))] + #[cfg(not(any(target_os = "linux", target_os = "android")))] const DEV_RANDOM: &str = "/dev/random"; let mut proc = new_ucmd!().args(&[DEV_RANDOM]).run_no_wait(); diff --git a/tests/by-util/test_chgrp.rs b/tests/by-util/test_chgrp.rs index 1d89caca73f..33ec2c6c984 100644 --- a/tests/by-util/test_chgrp.rs +++ b/tests/by-util/test_chgrp.rs @@ -8,7 +8,7 @@ fn test_invalid_option() { new_ucmd!().arg("-w").arg("/").fails(); } -static DIR: &str = "/tmp"; +static DIR: &str = "/dev"; // we should always get both arguments, regardless of whether --reference was used #[test] @@ -49,11 +49,13 @@ fn test_invalid_group() { #[test] fn test_1() { if get_effective_gid() != 0 { - new_ucmd!() - .arg("bin") - .arg(DIR) - .fails() - .stderr_is("chgrp: changing group of '/tmp': Operation not permitted (os error 1)"); + new_ucmd!().arg("bin").arg(DIR).fails().stderr_contains( + // linux fails with "Operation not permitted (os error 1)" + // because of insufficient permissions, + // android fails with "Permission denied (os error 13)" + // because it can't resolve /proc (even though it can resolve /proc/self/) + "chgrp: changing group of '/dev': ", + ); } } @@ -76,7 +78,7 @@ fn test_preserve_root() { // It's weird that on OS X, `realpath /etc/..` returns '/private' for d in [ "/", - "/////tmp///../../../../", + "/////dev///../../../../", "../../../../../../../../../../../../../../", "./../../../../../../../../../../../../../../", ] { @@ -94,7 +96,7 @@ fn test_preserve_root_symlink() { let file = "test_chgrp_symlink2root"; for d in [ "/", - "////tmp//../../../../", + "////dev//../../../../", "..//../../..//../..//../../../../../../../../", ".//../../../../../../..//../../../../../../../", ] { @@ -108,7 +110,7 @@ fn test_preserve_root_symlink() { } let (at, mut ucmd) = at_and_ucmd!(); - at.symlink_file("///usr", file); + at.symlink_file("///dev", file); ucmd.arg("--preserve-root") .arg("-HR") .arg("bin").arg(format!(".//{}/..//..//../../", file)) @@ -116,15 +118,12 @@ fn test_preserve_root_symlink() { .stderr_is("chgrp: it is dangerous to operate recursively on '/'\nchgrp: use --no-preserve-root to override this failsafe"); let (at, mut ucmd) = at_and_ucmd!(); - at.symlink_file("/", "/tmp/__root__"); + at.symlink_file("/", "__root__"); ucmd.arg("--preserve-root") .arg("-R") - .arg("bin").arg("/tmp/__root__/.") + .arg("bin").arg("__root__/.") .fails() .stderr_is("chgrp: it is dangerous to operate recursively on '/'\nchgrp: use --no-preserve-root to override this failsafe"); - - use std::fs; - fs::remove_file("/tmp/__root__").unwrap(); } #[test] @@ -156,7 +155,7 @@ fn test_reference() { } #[test] -#[cfg(any(target_os = "linux", target_vendor = "apple"))] +#[cfg(any(target_os = "linux", target_os = "android", target_vendor = "apple"))] fn test_reference_multi_no_equal() { new_ucmd!() .arg("-v") @@ -170,7 +169,7 @@ fn test_reference_multi_no_equal() { } #[test] -#[cfg(any(target_os = "linux", target_vendor = "apple"))] +#[cfg(any(target_os = "linux", target_os = "android", target_vendor = "apple"))] fn test_reference_last() { new_ucmd!() .arg("-v") @@ -212,7 +211,7 @@ fn test_big_p() { } #[test] -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] fn test_big_h() { if get_effective_gid() != 0 { assert!( diff --git a/tests/by-util/test_chown.rs b/tests/by-util/test_chown.rs index 0857e5659a9..4470260f439 100644 --- a/tests/by-util/test_chown.rs +++ b/tests/by-util/test_chown.rs @@ -1,7 +1,7 @@ // spell-checker:ignore (words) agroupthatdoesntexist auserthatdoesntexist cuuser groupname notexisting passgrp use crate::common::util::*; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] use rust_users::get_effective_uid; extern crate chown; @@ -617,7 +617,7 @@ fn test_root_preserve() { result.stderr_contains(&"chown: it is dangerous to operate recursively"); } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] #[test] fn test_big_p() { if get_effective_uid() != 0 { @@ -627,7 +627,11 @@ fn test_big_p() { .arg("/proc/self/cwd") .fails() .stderr_contains( - "chown: changing ownership of '/proc/self/cwd': Operation not permitted (os error 1)", + // linux fails with "Operation not permitted (os error 1)" + // because of insufficient permissions, + // android fails with "Permission denied (os error 13)" + // because it can't resolve /proc (even though it can resolve /proc/self/) + "chown: changing ownership of '/proc/self/cwd': ", ); } } diff --git a/tests/by-util/test_chroot.rs b/tests/by-util/test_chroot.rs index 3e5c22679b5..6c9237ac3a4 100644 --- a/tests/by-util/test_chroot.rs +++ b/tests/by-util/test_chroot.rs @@ -14,6 +14,7 @@ fn test_missing_operand() { } #[test] +#[cfg(not(target_os = "android"))] fn test_enter_chroot_fails() { // NOTE: since #2689 this test also ensures that we don't regress #2687 let (at, mut ucmd) = at_and_ucmd!(); diff --git a/tests/by-util/test_cp.rs b/tests/by-util/test_cp.rs index 7bb11306d31..079e966be3b 100644 --- a/tests/by-util/test_cp.rs +++ b/tests/by-util/test_cp.rs @@ -14,15 +14,15 @@ use std::os::unix::fs::PermissionsExt; #[cfg(windows)] use std::os::windows::fs::symlink_file; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] use filetime::FileTime; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] use rlimit::Resource; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] use std::fs as std_fs; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] use std::thread::sleep; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] use std::time::Duration; static TEST_EXISTING_FILE: &str = "existing_file.txt"; @@ -38,11 +38,11 @@ static TEST_COPY_FROM_FOLDER: &str = "hello_dir_with_file/"; static TEST_COPY_FROM_FOLDER_FILE: &str = "hello_dir_with_file/hello_world.txt"; static TEST_COPY_TO_FOLDER_NEW: &str = "hello_dir_new"; static TEST_COPY_TO_FOLDER_NEW_FILE: &str = "hello_dir_new/hello_world.txt"; -#[cfg(any(target_os = "linux", target_os = "freebsd"))] +#[cfg(any(target_os = "linux", target_os = "android", target_os = "freebsd"))] static TEST_MOUNT_COPY_FROM_FOLDER: &str = "dir_with_mount"; -#[cfg(any(target_os = "linux", target_os = "freebsd"))] +#[cfg(any(target_os = "linux", target_os = "android", target_os = "freebsd"))] static TEST_MOUNT_MOUNTPOINT: &str = "mount"; -#[cfg(any(target_os = "linux", target_os = "freebsd"))] +#[cfg(any(target_os = "linux", target_os = "android", target_os = "freebsd"))] static TEST_MOUNT_OTHER_FILESYSTEM_FILE: &str = "mount/DO_NOT_copy_me.txt"; #[cfg(unix)] static TEST_NONEXISTENT_FILE: &str = "nonexistent_file.txt"; @@ -1062,7 +1062,7 @@ fn test_cp_archive() { } #[test] -#[cfg(unix)] +#[cfg(all(unix, not(target_os = "android")))] fn test_cp_archive_recursive() { let (at, mut ucmd) = at_and_ucmd!(); @@ -1132,7 +1132,7 @@ fn test_cp_archive_recursive() { } #[test] -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] fn test_cp_preserve_timestamps() { let (at, mut ucmd) = at_and_ucmd!(); let ts = time::now().to_timespec(); @@ -1165,7 +1165,7 @@ fn test_cp_preserve_timestamps() { } #[test] -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] fn test_cp_no_preserve_timestamps() { let (at, mut ucmd) = at_and_ucmd!(); let ts = time::now().to_timespec(); @@ -1206,7 +1206,7 @@ fn test_cp_no_preserve_timestamps() { } #[test] -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] fn test_cp_target_file_dev_null() { let (at, mut ucmd) = at_and_ucmd!(); let file1 = "/dev/null"; @@ -1219,7 +1219,7 @@ fn test_cp_target_file_dev_null() { } #[test] -#[cfg(any(target_os = "linux", target_os = "freebsd"))] +#[cfg(any(target_os = "linux", target_os = "android", target_os = "freebsd"))] fn test_cp_one_file_system() { use crate::common::util::AtPath; use walkdir::WalkDir; @@ -1283,7 +1283,7 @@ fn test_cp_one_file_system() { } #[test] -#[cfg(any(target_os = "linux", target_os = "macos"))] +#[cfg(any(target_os = "linux", target_os = "android", target_os = "macos"))] fn test_cp_reflink_always() { let (at, mut ucmd) = at_and_ucmd!(); let result = ucmd @@ -1301,7 +1301,7 @@ fn test_cp_reflink_always() { } #[test] -#[cfg(any(target_os = "linux", target_os = "macos"))] +#[cfg(any(target_os = "linux", target_os = "android", target_os = "macos"))] fn test_cp_reflink_auto() { let (at, mut ucmd) = at_and_ucmd!(); ucmd.arg("--reflink=auto") @@ -1314,7 +1314,7 @@ fn test_cp_reflink_auto() { } #[test] -#[cfg(any(target_os = "linux", target_os = "macos"))] +#[cfg(any(target_os = "linux", target_os = "android", target_os = "macos"))] fn test_cp_reflink_never() { let (at, mut ucmd) = at_and_ucmd!(); ucmd.arg("--reflink=never") @@ -1327,7 +1327,7 @@ fn test_cp_reflink_never() { } #[test] -#[cfg(any(target_os = "linux", target_os = "macos"))] +#[cfg(any(target_os = "linux", target_os = "android", target_os = "macos"))] fn test_cp_reflink_bad() { let (_, mut ucmd) = at_and_ucmd!(); let _result = ucmd @@ -1339,7 +1339,7 @@ fn test_cp_reflink_bad() { } #[test] -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] fn test_cp_reflink_insufficient_permission() { let (at, mut ucmd) = at_and_ucmd!(); @@ -1355,7 +1355,7 @@ fn test_cp_reflink_insufficient_permission() { .stderr_only("cp: 'unreadable' -> 'existing_file.txt': Permission denied (os error 13)"); } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] #[test] fn test_closes_file_descriptors() { new_ucmd!() @@ -1520,6 +1520,7 @@ fn test_cp_archive_on_nonexistent_file() { } #[test] +#[cfg(not(target_os = "android"))] fn test_cp_link_backup() { let (at, mut ucmd) = at_and_ucmd!(); at.touch("file2"); @@ -1613,6 +1614,7 @@ fn test_cp_overriding_arguments() { ("--force", "--remove-destination"), ("--interactive", "--no-clobber"), ("--link", "--symbolic-link"), + #[cfg(not(target_os = "android"))] ("--symbolic-link", "--link"), ("--dereference", "--no-dereference"), ("--no-dereference", "--dereference"), diff --git a/tests/by-util/test_date.rs b/tests/by-util/test_date.rs index a04de9b5994..81b176ce92f 100644 --- a/tests/by-util/test_date.rs +++ b/tests/by-util/test_date.rs @@ -149,7 +149,7 @@ fn test_date_set_invalid() { } #[test] -#[cfg(all(unix, not(target_os = "macos")))] +#[cfg(all(unix, not(any(target_os = "android", target_os = "macos"))))] fn test_date_set_permissions_error() { if !(get_effective_uid() == 0 || uucore::os::is_wsl_1()) { let result = new_ucmd!() diff --git a/tests/by-util/test_dd.rs b/tests/by-util/test_dd.rs index 71049a2afe3..3cc5346b787 100644 --- a/tests/by-util/test_dd.rs +++ b/tests/by-util/test_dd.rs @@ -32,7 +32,7 @@ macro_rules! assert_fixture_exists { }}; } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] macro_rules! assert_fixture_not_exists { ($fname:expr) => {{ let fpath = PathBuf::from(format!("./fixtures/dd/{}", $fname)); @@ -261,7 +261,7 @@ fn test_final_stats_unspec() { new_ucmd!().run().stderr_only(&output).success(); } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] #[test] fn test_excl_causes_failure_when_present() { let fname = "this-file-exists-excl.txt"; @@ -272,7 +272,7 @@ fn test_excl_causes_failure_when_present() { .fails(); } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] #[test] fn test_noatime_does_not_update_infile_atime() { // NOTE: Not all environments support tracking access time. If this @@ -292,7 +292,7 @@ fn test_noatime_does_not_update_infile_atime() { assert_eq!(pre_atime, post_atime); } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] #[test] fn test_noatime_does_not_update_ofile_atime() { // NOTE: Not all environments support tracking access time. If this @@ -312,7 +312,7 @@ fn test_noatime_does_not_update_ofile_atime() { assert_eq!(pre_atime, post_atime); } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] #[test] fn test_nocreat_causes_failure_when_outfile_not_present() { let fname = "this-file-does-not-exist.txt"; diff --git a/tests/by-util/test_du.rs b/tests/by-util/test_du.rs index 1deddb77fd1..254e751665c 100644 --- a/tests/by-util/test_du.rs +++ b/tests/by-util/test_du.rs @@ -47,7 +47,7 @@ fn test_du_basics_subdir() { let result = ts.ucmd().arg(SUB_DIR).succeeds(); - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] { let result_reference = unwrap_or_return!(expected_result(&ts, &[SUB_DIR])); if result_reference.succeeded() { @@ -122,7 +122,7 @@ fn test_du_soft_link() { let result = ts.ucmd().arg(SUB_DIR_LINKS).succeeds(); - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] { let result_reference = unwrap_or_return!(expected_result(&ts, &[SUB_DIR_LINKS])); if result_reference.succeeded() { @@ -160,6 +160,7 @@ fn _du_soft_link(s: &str) { } } +#[cfg(not(target_os = "android"))] #[test] fn test_du_hard_link() { let ts = TestScenario::new(util_name!()); @@ -213,7 +214,7 @@ fn test_du_d_flag() { let result = ts.ucmd().arg("-d1").succeeds(); - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] { let result_reference = unwrap_or_return!(expected_result(&ts, &["-d1"])); if result_reference.succeeded() { @@ -259,7 +260,7 @@ fn test_du_dereference() { let result = ts.ucmd().arg("-L").arg(SUB_DIR_LINKS).succeeds(); - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] { let result_reference = unwrap_or_return!(expected_result(&ts, &["-L", SUB_DIR_LINKS])); @@ -303,13 +304,13 @@ fn test_du_inodes_basic() { let ts = TestScenario::new(util_name!()); let result = ts.ucmd().arg("--inodes").succeeds(); - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] { let result_reference = unwrap_or_return!(expected_result(&ts, &["--inodes"])); assert_eq!(result.stdout_str(), result_reference.stdout_str()); } - #[cfg(not(target_os = "linux"))] + #[cfg(not(any(target_os = "linux", target_os = "android")))] _du_inodes_basic(result.stdout_str()); } @@ -357,7 +358,7 @@ fn test_du_inodes() { result.stdout_contains("3\t./subdir/links\n"); result.stdout_contains("3\t.\n"); - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] { let result_reference = unwrap_or_return!(expected_result(&ts, &["--separate-dirs", "--inodes"])); @@ -438,7 +439,7 @@ fn test_du_no_permission() { "du: cannot read directory 'subdir/links': Permission denied (os error 13)", ); - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] { let result_reference = unwrap_or_return!(expected_result(&ts, &[SUB_DIR_LINKS])); if result_reference @@ -483,7 +484,7 @@ fn test_du_one_file_system() { let result = ts.ucmd().arg("-x").arg(SUB_DIR).succeeds(); - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] { let result_reference = unwrap_or_return!(expected_result(&ts, &["-x", SUB_DIR])); if result_reference.succeeded() { @@ -518,13 +519,13 @@ fn test_du_apparent_size() { let ts = TestScenario::new(util_name!()); let result = ts.ucmd().arg("--apparent-size").succeeds(); - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] { let result_reference = unwrap_or_return!(expected_result(&ts, &["--apparent-size"])); assert_eq!(result.stdout_str(), result_reference.stdout_str()); } - #[cfg(not(target_os = "linux"))] + #[cfg(not(any(target_os = "linux", target_os = "android")))] _du_apparent_size(result.stdout_str()); } @@ -586,7 +587,7 @@ fn test_du_bytes() { let ts = TestScenario::new(util_name!()); let result = ts.ucmd().arg("--bytes").succeeds(); - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] { let result_reference = unwrap_or_return!(expected_result(&ts, &["--bytes"])); assert_eq!(result.stdout_str(), result_reference.stdout_str()); @@ -602,7 +603,8 @@ fn test_du_bytes() { not(target_vendor = "apple"), not(target_os = "windows"), not(target_os = "freebsd"), - not(target_os = "linux") + not(target_os = "linux"), + not(target_os = "android"), ))] result.stdout_contains("21529\t./subdir\n"); } diff --git a/tests/by-util/test_id.rs b/tests/by-util/test_id.rs index 8606678e910..b791dbfd087 100644 --- a/tests/by-util/test_id.rs +++ b/tests/by-util/test_id.rs @@ -139,7 +139,7 @@ fn test_id_real() { } #[test] -#[cfg(all(unix, not(target_os = "linux")))] +#[cfg(all(unix, not(any(target_os = "linux", target_os = "android"))))] fn test_id_pretty_print() { // `-p` is BSD only and not supported on GNU's `id` let username = whoami(); @@ -159,7 +159,7 @@ fn test_id_pretty_print() { } #[test] -#[cfg(all(unix, not(target_os = "linux")))] +#[cfg(all(unix, not(any(target_os = "linux", target_os = "android"))))] fn test_id_password_style() { // `-P` is BSD only and not supported on GNU's `id` let username = whoami(); @@ -437,7 +437,10 @@ fn test_id_no_specified_user_posixly() { result.success(); } - #[cfg(all(target_os = "linux", feature = "feat_selinux"))] + #[cfg(all( + any(target_os = "linux", target_os = "android"), + feature = "feat_selinux" + ))] { use selinux::{self, KernelSupport}; if selinux::kernel_support() == KernelSupport::Unsupported { diff --git a/tests/by-util/test_install.rs b/tests/by-util/test_install.rs index a0e18c19ac1..dca04ac5682 100644 --- a/tests/by-util/test_install.rs +++ b/tests/by-util/test_install.rs @@ -6,7 +6,7 @@ use rust_users::*; use std::os::unix::fs::PermissionsExt; #[cfg(not(any(windows, target_os = "freebsd")))] use std::process::Command; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] use std::thread::sleep; #[test] @@ -98,7 +98,11 @@ fn test_install_ancestors_mode_directories() { let ancestor2 = "ancestor1/ancestor2"; let target_dir = "ancestor1/ancestor2/target_dir"; let directories_arg = "-d"; - let mode_arg = "--mode=700"; + let mode_arg = "--mode=200"; + let probe = "probe"; + + at.mkdir(probe); + let default_perms = at.metadata(probe).permissions().mode(); ucmd.args(&[mode_arg, directories_arg, target_dir]) .succeeds() @@ -108,11 +112,11 @@ fn test_install_ancestors_mode_directories() { assert!(at.dir_exists(ancestor2)); assert!(at.dir_exists(target_dir)); - assert_ne!(0o40_700_u32, at.metadata(ancestor1).permissions().mode()); - assert_ne!(0o40_700_u32, at.metadata(ancestor2).permissions().mode()); + assert_eq!(default_perms, at.metadata(ancestor1).permissions().mode()); + assert_eq!(default_perms, at.metadata(ancestor2).permissions().mode()); // Expected mode only on the target_dir. - assert_eq!(0o40_700_u32, at.metadata(target_dir).permissions().mode()); + assert_eq!(0o40_200_u32, at.metadata(target_dir).permissions().mode()); } #[test] @@ -386,7 +390,7 @@ fn test_install_copy_file() { } #[test] -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] fn test_install_target_file_dev_null() { let (at, mut ucmd) = at_and_ucmd!(); @@ -487,7 +491,7 @@ fn test_install_copy_then_compare_file() { } #[test] -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] fn test_install_copy_then_compare_file_with_extra_mode() { let scene = TestScenario::new(util_name!()); let at = &scene.fixtures; @@ -549,6 +553,8 @@ const STRIP_SOURCE_FILE_SYMBOL: &str = "main"; fn strip_source_file() -> &'static str { if cfg!(target_os = "macos") { "helloworld_macos" + } else if cfg!(target_arch = "arm") || cfg!(target_arch = "aarch64") { + "helloworld_android" } else { "helloworld_linux" } diff --git a/tests/by-util/test_link.rs b/tests/by-util/test_link.rs index 6e98f1d64fe..9f6a2ee5ffa 100644 --- a/tests/by-util/test_link.rs +++ b/tests/by-util/test_link.rs @@ -1,5 +1,6 @@ use crate::common::util::*; +#[cfg(not(target_os = "android"))] #[test] fn test_link_existing_file() { let (at, mut ucmd) = at_and_ucmd!(); diff --git a/tests/by-util/test_ln.rs b/tests/by-util/test_ln.rs index 0dcde3b35fd..980225260d1 100644 --- a/tests/by-util/test_ln.rs +++ b/tests/by-util/test_ln.rs @@ -360,7 +360,7 @@ fn test_symlink_verbose() { scene .ucmd() - .args(&["-v", file_a, file_b]) + .args(&["-s", "-v", file_a, file_b]) .succeeds() .stdout_only(format!("'{}' -> '{}'\n", file_b, file_a)); @@ -368,7 +368,7 @@ fn test_symlink_verbose() { scene .ucmd() - .args(&["-v", "-b", file_a, file_b]) + .args(&["-s", "-v", "-b", file_a, file_b]) .succeeds() .stdout_only(format!( "'{}' -> '{}' (backup: '{}~')\n", @@ -639,7 +639,7 @@ fn test_backup_force() { assert!(at.file_exists("b~")); scene .ucmd() - .args(&["-f", "--b=simple", "a", "b"]) + .args(&["-s", "-f", "--b=simple", "a", "b"]) .succeeds() .no_stderr(); assert!(at.file_exists("a")); diff --git a/tests/by-util/test_ls.rs b/tests/by-util/test_ls.rs index f979d1e140c..72217a403bd 100644 --- a/tests/by-util/test_ls.rs +++ b/tests/by-util/test_ls.rs @@ -314,7 +314,7 @@ fn test_ls_devices() { .stdout_matches(&Regex::new("[^ ] 3, 2 [^ ]").unwrap()); } - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] { scene .ucmd() @@ -327,11 +327,15 @@ fn test_ls_devices() { // Tests display alignment against a file (stdout is a link to a tty) #[cfg(unix)] { + #[cfg(not(target_os = "android"))] + let stdout = "/dev/stdout"; + #[cfg(target_os = "android")] + let stdout = "/proc/self/fd/1"; let res = scene .ucmd() .arg("-alL") .arg("/dev/null") - .arg("/dev/stdout") + .arg(stdout) .succeeds(); let null_len = String::from_utf8(res.stdout().to_owned()) @@ -350,7 +354,7 @@ fn test_ls_devices() { .lines() .nth(1) .unwrap() - .strip_suffix("/dev/stdout") + .strip_suffix(stdout) .unwrap() .len(); @@ -1546,9 +1550,9 @@ fn test_ls_order_time() { at.open("test-4").metadata().unwrap().accessed().unwrap(); // It seems to be dependent on the platform whether the access time is actually set - #[cfg(unix)] + #[cfg(all(unix, not(target_os = "android")))] result.stdout_only("test-3\ntest-4\ntest-2\ntest-1\n"); - #[cfg(windows)] + #[cfg(any(windows, target_os = "android"))] result.stdout_only("test-4\ntest-3\ntest-2\ntest-1\n"); } diff --git a/tests/by-util/test_mv.rs b/tests/by-util/test_mv.rs index 314fd3a7faf..c4ec03d95be 100644 --- a/tests/by-util/test_mv.rs +++ b/tests/by-util/test_mv.rs @@ -783,7 +783,7 @@ fn test_mv_verbose() { } #[test] -#[cfg(target_os = "linux")] // mkdir does not support -m on windows. Freebsd doesn't return a permission error either. +#[cfg(any(target_os = "linux", target_os = "android"))] // mkdir does not support -m on windows. Freebsd doesn't return a permission error either. fn test_mv_permission_error() { let scene = TestScenario::new("mkdir"); let folder1 = "bar"; diff --git a/tests/by-util/test_nice.rs b/tests/by-util/test_nice.rs index 4a77ae24eaf..2b53ed4377e 100644 --- a/tests/by-util/test_nice.rs +++ b/tests/by-util/test_nice.rs @@ -1,6 +1,7 @@ use crate::common::util::*; #[test] +#[cfg(not(target_os = "android"))] fn test_get_current_niceness() { // NOTE: this assumes the test suite is being run with a default niceness // of 0, which may not necessarily be true @@ -8,6 +9,7 @@ fn test_get_current_niceness() { } #[test] +#[cfg(not(target_os = "android"))] fn test_negative_adjustment() { // This assumes the test suite is run as a normal (non-root) user, and as // such attempting to set a negative niceness value will be rejected by diff --git a/tests/by-util/test_nohup.rs b/tests/by-util/test_nohup.rs index b98ae007ca8..8d848131ce2 100644 --- a/tests/by-util/test_nohup.rs +++ b/tests/by-util/test_nohup.rs @@ -6,7 +6,12 @@ use std::thread::sleep; // All that can be tested is the side-effects. #[test] -#[cfg(any(target_os = "linux", target_os = "freebsd", target_vendor = "apple"))] +#[cfg(any( + target_os = "linux", + target_os = "android", + target_os = "freebsd", + target_vendor = "apple" +))] fn test_nohup_multiple_args_and_flags() { let (at, mut ucmd) = at_and_ucmd!(); diff --git a/tests/by-util/test_sort.rs b/tests/by-util/test_sort.rs index 4975ceff430..24846d20706 100644 --- a/tests/by-util/test_sort.rs +++ b/tests/by-util/test_sort.rs @@ -872,7 +872,7 @@ fn sort_empty_chunk() { } #[test] -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] fn test_compress() { new_ucmd!() .args(&[ @@ -888,7 +888,7 @@ fn test_compress() { } #[test] -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] fn test_compress_merge() { new_ucmd!() .args(&[ diff --git a/tests/by-util/test_stat.rs b/tests/by-util/test_stat.rs index b8445543f7d..90ad2d12aaa 100644 --- a/tests/by-util/test_stat.rs +++ b/tests/by-util/test_stat.rs @@ -113,14 +113,14 @@ fn test_invalid_option() { #[cfg(unix)] const NORMAL_FORMAT_STR: &str = "%a %A %b %B %d %D %f %F %g %G %h %i %m %n %o %s %u %U %x %X %y %Y %z %Z"; // avoid "%w %W" (birth/creation) due to `stat` limitations and linux kernel & rust version capability variations -#[cfg(any(target_os = "linux"))] +#[cfg(any(target_os = "linux", target_os = "android"))] const DEV_FORMAT_STR: &str = "%a %A %b %B %d %D %f %F %g %G %h %i %m %n %o %s (%t/%T) %u %U %w %W %x %X %y %Y %z %Z"; #[cfg(target_os = "linux")] const FS_FORMAT_STR: &str = "%b %c %i %l %n %s %S %t %T"; // avoid "%a %d %f" which can cause test failure due to race conditions #[test] -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] fn test_terse_fs_format() { let args = ["-f", "-t", "/proc"]; let ts = TestScenario::new(util_name!()); @@ -238,6 +238,7 @@ fn test_symlinks() { // arbitrarily chosen symlinks with hope that the CI environment provides at least one of them for file in [ "/bin/sh", + "/data/data/com.termux/files/usr/bin/sh", // spell-checker:disable-line "/bin/sudoedit", "/usr/bin/ex", "/etc/localtime", @@ -259,7 +260,7 @@ fn test_symlinks() { } } -#[cfg(any(target_os = "linux", target_vendor = "apple"))] +#[cfg(any(target_os = "linux", target_os = "android", target_vendor = "apple"))] #[test] fn test_char() { // TODO: "(%t) (%x) (%w)" deviate from GNU stat for `character special file` on macOS @@ -268,13 +269,13 @@ fn test_char() { // >"(f) (2021-05-20 23:08:03.455598000 +0200) (-)\n" let args = [ "-c", - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] DEV_FORMAT_STR, #[cfg(target_os = "linux")] "/dev/pts/ptmx", #[cfg(any(target_vendor = "apple"))] "%a %A %b %B %d %D %f %F %g %G %h %i %m %n %o %s (/%T) %u %U %W %X %y %Y %z %Z", - #[cfg(any(target_vendor = "apple"))] + #[cfg(any(target_os = "android", target_vendor = "apple"))] "/dev/ptmx", ]; let ts = TestScenario::new(util_name!()); diff --git a/tests/by-util/test_uname.rs b/tests/by-util/test_uname.rs index adcaa1072d7..5e78ddc1388 100644 --- a/tests/by-util/test_uname.rs +++ b/tests/by-util/test_uname.rs @@ -53,6 +53,11 @@ fn test_uname_kernel() { #[test] fn test_uname_operating_system() { + #[cfg(target_os = "android")] + new_ucmd!() + .arg("--operating-system") + .succeeds() + .stdout_is("Android\n"); #[cfg(target_vendor = "apple")] new_ucmd!() .arg("--operating-system") diff --git a/tests/by-util/test_wc.rs b/tests/by-util/test_wc.rs index 3537f902dfe..12ad3003bb3 100644 --- a/tests/by-util/test_wc.rs +++ b/tests/by-util/test_wc.rs @@ -262,10 +262,10 @@ fn test_read_from_nonexistent_file() { } #[test] -#[cfg(all(unix, not(target_os = "macos")))] +#[cfg(any(target_os = "linux", target_os = "android"))] fn test_files_from_pseudo_filesystem() { - let result = new_ucmd!().arg("-c").arg("/proc/version").succeeds(); - assert_ne!(result.stdout_str(), "0 /proc/version\n"); + let result = new_ucmd!().arg("-c").arg("/proc/cpuinfo").succeeds(); + assert_ne!(result.stdout_str(), "0 /proc/cpuinfo\n"); } #[test] diff --git a/tests/common/util.rs b/tests/common/util.rs index bf7143bb582..dc6aa78e727 100644 --- a/tests/common/util.rs +++ b/tests/common/util.rs @@ -892,7 +892,7 @@ pub struct UCommand { stdout: Option, stderr: Option, bytes_into_stdin: Option>, - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] limits: Vec<(rlimit::Resource, u64, u64)>, } @@ -938,7 +938,7 @@ impl UCommand { stdin: None, stdout: None, stderr: None, - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] limits: vec![], }; @@ -1042,7 +1042,7 @@ impl UCommand { self } - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] pub fn with_limit( &mut self, resource: rlimit::Resource, diff --git a/tests/fixtures/install/helloworld_android b/tests/fixtures/install/helloworld_android new file mode 100755 index 0000000000000000000000000000000000000000..ffb3e6aebed8e659d60f4d9099cb4d2fdada1e44 GIT binary patch literal 437072 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
k_zZLmT8jbrJhUDv zZ-RZO8#)cGgjRnQ?r`1I%Lpg5Vhqy~@S%T%eds8(A9@8k0_`8i^#_rU69^xUr(T77 z9Cv&R*W-8$N+02wgu0N*|8c$(S_d6~MxcYxPN)~dzJ6#g zlpI33eHZqirQbvRp>^L!xW9`ryPy&1473|6{RroAUFjV18=ChM_yfN1ABYF^($8TZTK5aYdkd}q zxDM`mFC)A-p8XZ#37v=5K`;Fp#-N@mjQXGzP~|q11Lzdo4ME*F9)?yzC!uxF8E6DrdH@q6=m3-) zMtOh^;CLE32AzYd;L1I?Pk`eK)gqDeVgDfPLhGQF(8|~~LAV#5fIaBBB!D+7IoAUV@H5Yo11Y zp+4vWGy+u$QNEyV=m>NScAW1ONhOZ^p+0E+v#<;Gbi*$6JamAbhmJv|=U^9_3tfP! zP{o6C2K7MCJ&*81hoC;_B`6;5C&M2^enYGN0(PLzzeYMh6Hrow`UZ7DCtebX7di*6 zfqMTAk3c~yph;-;-y@#Tkx#=8G=in51!(>kaD6et^Cg6X>X&gnbPzKaeD#I&eG~D4 zUcf|p25fd_k)ha2?e5-$-xh73dJO`wGe>bO1UJ9fQ*6 zAt#|KbO!2$&OvLSb-#uEBZ%J{hzE|Rph@U7vh`N*U@U zzOLYgjzBA+^@@emLAzI3NCdifHJ(s~_BnB@4?1@p!U^@PML3~j&^hR&%R=Ps2nSS! zmfm0?UT6ih23iRXLI>92!Dr|wvZ>>k)4+(go^)4nwP; zb5I}DsUqI=JhU4cycv^ksN)ud3z~r9)pTU!R>Tupw+YunyWNN%v>)0DorLy52R9>r z&`Zz>=w;{}bZQIil*7N<5FV%s^+0Q&RnWv%*n>`aUw_6?S>9Od!b`cXF1XZ>V_&6$cGA~Gt|8k=?qOkgU~T( z66)FoJJ1kx02fT~B~es{~< zdimXO51o52{Mn0ie-`BmdI?$uE$v2mfS!YPLg%3aP`WvFA;Ou%L^!uzSm)TFkzD+x zpNacWjw#u@wc2r`@`Csgi5_X!q3DpyIB(c6crAA3!Bq;_M%{$)SpZiI2&KFOAL_mm zN~*FdUw{|X?_PXdhtWP!zBfyu+}P-K!}#RldF_bhyfYdcF(i$8mmCKVQR# z?;_4e(0|DEJlkkEM!|jHd^o1Tt5@I{z7g*V+#w>aEATvUWd&XVeg)yBVK6qjUkgru z?>&`k@dv*Q9;c3LvMS#vo|oRA_5t|?ho0YEI9~;S=ro1q4?X_^i!8Nu5$7vwuZ|}c z2}%A6d>Y&Z4)crUhuT56P8{HQl(UU;bd#F9yFXd#qKHT5vvG^pQLtxE2r1weEfxy!QdLE0m#r zyia_AKGux|RM@UV*`%DMV`{iABfqL41| z^VG-+=^_1pyuAy2)YY~3y=NwnnIzm3K*S~p)+C@}K_zW06N1Vm3SwG4$|>Q}8ZND( z)Z!7FaOr6vXcuT+VjL;S+nx1j0`rcJ37$zm&nCdt{s`dpJDKC+muLN2 zoA!K$%1bD3`33r9mp8=qoDPca0?I4*VLSNlov&nPSh0F9TykG8df;3167>3qJ#D#* z?tbw0|I*f3k=9H7c>{Po@Hqk`u{)%$n3VsMyj*k#r%{b^*c5+>?r7j+KBitN>0Qe%{Ub`WBD;)R|wNhgH1>SXkGv$Y=CmQZc-^tN2hk$$gC-^boyA$x$&Kcl4 zfhXgK>Sd&(6O=dbUGkBh3O)?@{$F*5i(Vn{)dv`7r}^Vq|0!Sc8oUxc&wN+}e0>u5 zYT&z*z&8Vb!-aeLwHx>a;M;8a_)E{HSmOsi@L<>ViJLEG7;rEDg`dLw5nN+(UxE(? zo|^y{&S>BxfHw#^$$DB!dC70=IVlvqL~jA`GT^xu#Qr1r3g8a{hu!g);M~_SfBbD% zeD3s^81QF=?OFE@0WUw?b=;?bF9M#}?gij0lHh0dz`p>V$d3`gYm(3z5Bw}}_1S%? z?sVX1fTJQw`Lsmzj&!ak8a2Sz0MAi9=Oy?y;LiY`Dwt>7`+*+@?&Y7_e*^e#;M;_s zL{1kdU;n$V?PT`EE(1^G*9hP{lHiXAz8ko=ef4)b@GVK`ECRk0_z3mOd8xmvfgb{1 zBUqCDZlgSWwCjA|4}2u>VGb>QSmOs?2z-SA3G`Hcf%4VIl9#LhgL@%Y%7yE`1Ro8& z8F(UpN`R;QzAGQ*ICQ-DqPYY({}}p`<6TerBFb|>b6;wI2k<4pz2g;}`(&mn2|kz6 z%o^Y&BI41T3!?uz^<=-CeX{6e_GWBU$% zlmxyA_zK`*$Uw*1=c?V+z_%s9#iz}{j{&dbd*ZsQdiyCK{ddPda_pn(y#d_B9KSH` z-`Mt9}uq5y$z$YZY z)vp@h3xGe!_e4KO?d+g@H|0T06BjQQ=yPone{oSE*)=zhR+X4Iy z;D;07hk)0-)fKL*aV2kerE>vzED1cbANu)DSNsvcbIx{!j|aXx34A*6d(Od=gnljp zKJZ<1Isv{K_%Yz?6X2VHAAS#2OI3mW(%dJR-(0u=53ys3`yQ`dmCrbpALTMm7GmFH1q+; zEOOvW1i+5Ca$OC4C-{V&<1gvSX5g`_lvv4+sXc4Gezp3wpYlU1NLW<8PqDvj2EVL| zGg9#b{EypTf@+3k(QJe#XsCV1z6f3jeB1Z+Khip0>TfCV-8{xXUTSU38 zSuGO1B>Tr_`#vubnDyXIe~zf;49Q0k9^%YW+~-Wl+UsI+a->jUTy)ziMwV@J!&Pm#9}r`2@;` zsoWWd+9(CSXb<)SI?S*7PuhpC0Ds_qA6H^T$bPB)^}w5d#k>28t-_@ z3kPzhul|?yTyyuw#2tjc2>drL_gmL`;7?`To+XKIso$HyA9;np(|oqZ4}4e>_%YyB zz{P&|WsM*BBH*wg{t`T8kPXj>Lml}8F9*L=@FaXGq;L@Shz;mvvB|hv1z6SVW0h93I4bi8(Bw-#j10OtzMm=!RQxGdfxiNx! z?3x?j8bSH~66B-yJmv1XQ$qQe+j+Q-%02$t9N@cwC+g!8;9Gzv+T9x9JCne-0Y3md zNA#VS|qAUX}#D8~8oI z6Zv<{q2qH8w!e*`{VK=1w!_~4mc?bBul?$sZ)zZ-ZE`~{-piO0J7_y*;rl%G|(M{do)N6g}? zy$z4=-*ogn75HeuotN4f27CcaAKTG2N ztYtdIpBl=CEs67$^94Juw+;A%z%#&cU+Uj};B$am^E}D<(J9K;Jl>VB7aaIhjcWq^ zaO2-O%(JDP=j$*~MgZRdy!R#Tm2IC(!CSxFZx#u!#69=0R|fHG5#?vULoS)xy{BhG zO5%F?eBb9>ozeI(8hH61y23XDKa&K$ z8~B49b|%s}2D~{5{0#8L|J4;gcc<%A8@Fl?SX(0Dgd~jaUg&N?01fC%}NzTJ|P`>{}SO4V@@I%1E335FJ zy!m7j{Re&uc#7LNpO*fA7JUN#pgoSM?zl$)&pp+3Js%Hz81PdGbfyD83*5C4Di-}k zz)t~BoR6!4A4`CXADe;i2X6Ies*@k#Bo2w*e#$e+*&V}o&-Uc4+6LJE3v+39XSTxnztOiO7Jt)k7mk) zZ^JK*^AdE_kHI*Q1K)A%meUWxM>}wffBe=<@Dku7z;6)1W0&UuZwBtjC+=@80iJob zs~*$=1+Vtae_KQC7L_K>0cntVR;XCux8b5Gz4!>D)EA6zNJ(J<^ zQDYmN$Di}~{jz&W_oMN&70bUb0e|HCj@%r+yLnfZ{3%~Td5P$G{1I;+hb4dTYFoRG zXB+Su;G?PTjz{?Wfxnmp{|(@qlfavSKa&KWk&h1oTX%1PrUU5{IDUXmhX%!ZXYs-Ge5|&PlS&E9!>%u4}3B3QV$*VZ#wWDz%OW= zA0zJ-;8k@Gbg{$hfiFq|-vPV~_(;)p=7;2T2>9YO+T**|f7Je6<2^%pX?oXoQV>cQ z_%YRUUcw&?`~vWSE|5>bM?3H_;=56a)MA9hgwAmze!UxFV3z6f~G1@dW)ANU;LBLz=rPxVr+ zwd*DFbujP+)Y}rTXNR0!z7kkZ!tT z2)Wz+`9yw<_#AeUyF%rklKyn?%WetqFqlu*pVi=Ja0jVb{?Yhr?#Z}fYNvVFJ0UK# z8~nqQ;&!DIzoZ{;P+rAdB}>ovt(WA~417KC2?8XUcbTKm=S!4JKSxu3hVn&r{iO3n z?Mw%649;Gmjc4^wR~lqLRj!xsU#6B=H*eC{|DK0w=`~n)a8$0gwh*I}-yHnH58JJm z6DLr)=AmMHB`O~tFSq<+)t$q;k}uk)2Ct5nTSnYnAH|#1yffGnXx=1ZJ@LVQSg8I&JRU@ z0r-oiVVgw%zICn~oXKTNOn5cmowpzGaf&bKC{G|HD$)+h;Hh7o9+a~LG69WXqC@&%G(`!PPzJD zN_ov=^o#Go<4*k&C;sUSKzPb;7`6mC(!b#4&)Mw|S8&ejo)6;l2~YQKmVBEvQ}nVO zytw{$jPnq9qbnUbUl*t6JztEEQ*}96#m-hT|OQ5 z#5v;Q5`CTbzqs1bi|;!4m)KuR-nw@)=1F8K`bQmnCm(2-#!vaSHS}BMP4V^}y;Ydr zzNesjH!TtRYRPkh-Ot2vISEmsy9E5r-^b_SdvNwf8$V&+AUxf>ned!rZ(it(=jHz) z@Gd;>=;a0nFJYf7dd=W9Z(y&b@q9Nm zUFk_U;`0LVQZ_s5#9a=aXMew%^6-z*N70$wxm^9;M)~3`*anr~bm{&a18>n*r$19V z>)PpIDCFjTD^}3$hcrLoA-U8~C`p8FNtqi*3 zC-19!2jjck4;eu{-Mcx9F&eCSwa;mf^D2-2+x0jnQae07*}O57XK8#M{G;*yRc3xn zJK}FfkTrUN&y?{!n7YZ<$7Jgtcs1Z53KM+iN0-E#4qhhDVyPA0pD&HK0=(7Wl}R7_ zZFc8@W$)c}(vm-T2fjf*m-zl4|K{R#u|vne`{RTB=PU7RYaDNl#Vk#QE%VFkRKM zUK(c&^&VVq=NSg~IQ2O1isx}Sc6m2=Q@=w#mHP7&2QT4VQuI!NSNgAZer3EL3FouI z%SdCL{4UR+;d^j-oSr2IcisqZGD`PV4Id%(d{{6z~SFujB~9lSBC9K5@e2#7N72O@JbWT3!U{qba#M%_(`7$OAqdM@DuVeh4%({BgvPn<$LhY4qn1JkY)eV z!3A%d@b<;~i9NK>S9R~E{3)Kjqw=4{>2%Uh(J29M%+v5$cpKt$EWbhHTtNB$8lLSW zy{vZ16XV{V^dYjMi>?!rXI%@M_de6gM?4-voQ_Xs* ze;GZHGtUlsknh3SPW=S?Cq9k_Z_5Yd?F#QU2hWLrjsR9lc|GO1nwQr(<(D|G7XAwG zrw`}6U3{sC<9quZ_ixnx4)7nmhVxOiKO^2x?4Yf$$0(0cUZwUYJLL&>L44M|o3l78 zrOcDyCz?$mKUrT+e8o6YA-=rPTh4Z{Mzzrs}h?lZg_0*0ApGRF=L z{JwpkIdbtafAr#V6WPL}q@ui0qr<_MZf(tb<<{0oyKZg$5x?IYY9g^0O!Raw(>iYV zt*s{l*>%4-XliCaw+wci4VXIP&wjl=FynQ>FzaiAFNGqnG8MSYX zJlsmXh}vuGmECeO;H#s4zVGqy(+n3HX%SSgrY*IoML2qEtZn_QcIr-~n$|Z1{<@Q? z;ns%PjE!+Ieb)>z{UZN1kap5dYeRatwXGlR>@!w7?aQeT91p3L<-LaOVogIYv#X(3 zcvl;^ly}0*rTk=j`&w@qZeM0B;LB$mt^D_@T^HKh2Q&o2t?&PDQ{$zNTckehq7R*E zckrr?=X^w<(fTLaP(R>#W}LppIozSo82$o%tDhdeb+kA3b#EUnUO8iJ2xRA5efgMi zitjvYB@!EJ3M`%^>vu6S9%}KvwE^Crpx-Cq`J41J*94kyl}cmqu#vvzbu*EmFVqxU zyJ1k!XZptWm;%goW-dCR@3B4Mf&+eYQw-cDcz3!N^{9IWS+=7`?b*Ef#64=A+l|j6 z6M2hqH)e-hzaBEJD}l{jY9jOc&^F)OhElKC)}>1HjU7~^$|wB`=A-*-#?|+Wa0j>s zxfh5xQWR}V9cRs}@>$`6mAs)je@KccT?zm4uFs3CB7`w~Zuyu=q4esoFZ=ab{h`ZS zbV*AnUD_AAyicS5Imp#Z(~G+ly>M~=ojw?!xnb64pv7CXmSXCc4uTf%KUi}qJKsyI z{A=`&xB8dZ_vk<#d&pb%<8K2t>M!GkL;uxOFCfy!xFcZQzDzGc?TGLa4btS0zUTImnB zqQ5&Nvm!p#-j}frAJAqwG7WYMR{PF9epLODO#SHi9h8?NhpG$hJLdKbw`Mgyc69Vi zBiotz$})4VW|@iPK)VXsZhg_NTsEUc^}k5{_eCEXKI#^I*uJ9-I_kg5+Ze+Q&Y0t4 z9Bq%Mit)_7Hr$%llkq&B_H4Y}SAFMdUiC#Pt#)U$RMDQ=pTMW@ttCg%cdPySw)P!r z;|lt4UVZqSEte4Ve2<5o-KcRwU+a_b`hiyl-Fah7P5Cd7&(F=dFgjblEZiCc$M@d1 zk6LxUZPytG|GJAmPdf5;_-Em)>Y#hE4V-leG=9)Q<2{xC*eU<(zu0a3sH6T{l$Xs) zjZ~C`?0nT zy}Oit|A9vyxVmXJn#k*~X>JT|X_?`}rr7ps05tFJZg#}bAIo-#Z^&IdX+TD9dpj9Z zb6`MS<&#A%>XU5BKxFbq@cP#WBLnvZk1Sy<4cM=bkX;P@N$h{6hu&uB#h@4JQQVTx z{G7!6%)gj^U@P-;sWU${_kPTOXKFZUBEPfvBt5k4Vatr7s4rMK&Cp z>Wm|wwkdm}!BSi2D$%*%Ko9?1y~93=f6}{h>C9)7=-rhaJf0yObiR}BI{GdecdPu1 zHVq$ow-?%FpT|bb`P_#h;d~y$E5R>SB9fO z)@$P%`+60;P#fsrj!MSlXAN(?$UFwFdF;bh+d4O{<@`nIT*ul;-Kgfb^mZEhqB^%* zdXriA(9Vwa$XZ8eTWx4u8cPGTESX8Ka>51ufLF0CDx(jQ=id*QOxC8u!M(RKuh6^J z@Vhza@ZHnV%eK^;a;0NengSR9&*1-sx9I9)Oywwv+a zDtnHL+rt6a!#~i5?BNHm29JzEzg>G+jxEqwy!O1(GnO*w#h@2@;^Xb%tN?oD_eGx6 z+_^Uif4s}J&S@1RG4>5kpV%|R{i_b&DlEpWYv;{4fA0xple>uj zcsLGTB99sSwuCKtbo`b~WOoP9AMxjHwef0lyZlAQS%y8nRiBJ|DxYz?jD5NnJFPL^ ztxwj~GTCqJ^bdY!&$s`{y#MHeXm_3W?_Id`yyu+Cn)g%q)Vi|B=|^xi>*gi=&=6@J z;)!(B(veHxUFP7qW3ucb^ST~BW?~bTVrR$ll!8t8SsYI{ZAfF!%UW86o@uY)^O^vms!WV2lTgg5YL z$4ulbo2Wj^9?OnA=Jwa|+hyNve<4`+C$2n*#_#!b^-=x$68b6qd;h04AKQ!lN7}w1 zUI(MGp(auWe`5o%-}pOPgHDcO&-C4J^qoyb(HSY`rLx|p^smFit?Av&k*Gshc zY4&$>8ISz`;e4KE|3Ay;ulA!eV~xKlihiV*pBz)s&3F9*zP}6Jkk6RX8OGPd>Ot7e zU;TEVN8O>U`Z3j4n7$>xmYe4FGdETgjbF(BKPj#7`4<*nZ09p);WGA{lWF7ctog@% z!KSwZPpngZWj_YKOcLp|@>dd;9w2eZtm{0pf!{R{o9C<-qee#6Rj2Wjug zK7&Rz1$yRB`Y83LhbeoaPbR;6c7#ahCoK$4CdjLA&%ct%#mzpjiY`D zJjqqG{x-L4jM_hLLi1~(@sjBYjX>S&)PEaUXP^iBeHqmoX!|7nXhODcT^(+%fH!57 z&0boyPIOOZn9@e#9%rd@&X-<2j`wU|;NUyp1Q~xLa>pj{-?W3(DSn&Y+kxJ7Cy5(` z=gt{ZdsY3qoc7cki4WC{rw?EC^{lQiW@{O3{@9r6cP!4JTrY~&!@mou_z-MHG!$l|CyZ(TYn8)veJcLwVgI%O8DEQ>f! zsLsWkmry49Uv*&b(9Tre3z5e}cpbg!wRIuCxsm?W`TaeSQ_t$L{?JzW+H*|ElJ%7z zwU?ekFK#KHJ4U|P2Gh;r^>5&pc=H?N=<0>WsX6!`jI;Xv_8mw0B>&~?iiUy2S$%a^ zZL-Itbt1$Xv#P!Q@T7@(k!oT(CA2X=lu=#g%YHqBwWNtYt-LvS*AtIVJ-X`gvZtD9 z>$Pr`)3Ps`Xo&cm)~Sr0;izoMGn8epKB#^4J|EjsXU%`Xdxsx&Ve`RV`FQZI6M_fB zyM$LQnAJ}2yZ$UVZEuakrXKyh13Tz}9d=+%9@s&_=ubL6>>|FWC-kQRJ9s8_!=T}m z?{(@==DRz_|8QXQJ+PlTuxbzNB?q?E1KZ}n4tiiOIIt!U>_-kP-QUqJsR!1WhkIZa zKjFh<4~*cqg*V>=Bdx-MReNA79oSY6Y=r|m=z%e(t-4Jfm~5%|pU&RK<;yo6*l-Vw zn1zKm*#n#Jz~*~kUvps99@tC=w$%fh?!XRuV0R0KJezbS*ula#~3e z_;BF2CV@`|9!>(E5B&2<;MKrKCxLGTPTFxN9X|+6I-V=I=8=9|`aSjNl}Tu%GpDXd z0v`^1Koa<5;C+(7=L1g{oHncZ?zSnLY0W9YE>1Z5#6^2PkGNvssBJg*9yQUIQI~#| ziS`WHbDDVhk+%DN(Uuv0{PqC;drDOPmg1b>#4nqRpVW*EOq(<5(LMgOrXR5`ypR2h z62JZ_F@#`7s5B5eU#MP-1{dz+Q|N(A#hpU9zSa*YYpc##B8$b-sc^!*Vg_@ zGd53nR)0Qfe?`9W5Bw(jef->tD@}B+4WCQO_B{VcB$ZYE)!g&cMh_ zc*faSO%Cy6@t^^}?E!p6`FE8&Y`Ee-7JuZkXWY^9aeh1NkL71(jWPk z+hoP0eV=jS3+(y--0F$t(4JxfilxNhQ#P^ane2U+@?CzjeAeH#wy&+|ZeFUT4PpUZ z+Bo61(cNxC<56s3Z<2OI^H2L7pB#QHgZ|H;uNZ$VZO&vrD|xBimp*N~sh!*1Sg%(-&nZ`PW&_qr}?+9c|x54$y* z=SyqahyOCqmsVXL#E(LMO6JZVb12=6o^R=3dXr*;W6`frdARj8^iy?*Uw>P4C3WAV z4b^RchFkYcsB_(s)Qu983=J^_@>|^XGM_kMXvA&N1<;v|Y=#djD!3imPlD5nb)sU3 zS@^c^$#wtvc#mgS`+79d*XnV!Hy;}vVt$I&Y5b~Co{4Jg_Ly$5#xx6hbA`9vM7?cJ z+7^y#-lYL|`(gDT9f8Njcz8=*ZskdQ>IX4@>B%i&e{Im_6F}?Yr z^?R4g<4u&Som%`6w;k5WPVLAyPV8Izz5wUeq3DGN(xM;UpUxc3V6OJS4)u)QfUFf) z%Yj$tu|X@o%{eT;<=bcvc7pxZXCE{*WVIf?cloeLHa7sj9H?B!wcK+l1H&JF5LmkI z%LC1hF!jHgr0xLfs?I&s$qv|cTB*bTDcsROo$@4g(wsW?QK!PGbAdXSXA#pw9`_}w zbMXPYoqwjz9;Z%>I*<2L90b4id}{ReB=z2L>P@HK22Z`+{72FpbR)+8a%_@%C!Bf{ zG%jqcc+p6EoQ>}YQ?GGo_vrOW>K(mAz4G4p^;W%Z(Vl)E{kqysNG}dx?6vsqn?B=ZiKasrSSs>XmoH z23z$^^uLqTtMJqdvQ{>2y_LDSbloFg2}PIWlY_y2e(~4Rq80O4t7ZiX=I8sOr?0yu zTK?H!bbh{{@8kIl@L9}f3ZLWn?8avipWXQk^O+hwU5wvR9p3d=etPuu*l_FP`5DpE zFHhJx?=NQ8{HJ>Cl%GK2{sR+`MVY_*_A-Ar-YL8Ty#2g=yv_D<`p`V(4(8wO%)=7q z<7DRLr0B)RCPta3)?Q0=K8}XkQ0%|GIE8tgPW=q%^nhMZ==Ne>_l|yvd95{6^IEZ+ zCzJ4QB)lWr`|x^aUjG1H)_i{ba(g~6O;Ts5!|!Ln)jVE2$ezcKB*7i%;I0FAhBLQ5 zqRyYN7n;X&lhjFf>O4ms?>xSFfHRNZ2}bWrQt#q7?D_vJ^(s8`_%UpTHIIu;>+MPE zz2nrYqMmmi^M7WYd7K&@o21?ePd(`y{~y|BH?bG7t>ImbFHhQO@Y{Uoacq;>)i^3`XKWL2ViU1v`TcTe=lvhF zuMLBL`i0w~xy%jIBY4N0GAi)P+>iCE93nvhh*P67*Z^vZX8B;rBlb$wDnaUiV z!d$+CIej~Gy9C=nQe1J0Z5te3@V{^^AG&=xdkgY{T4n^Om%`ld7R|-~nVaHIcXL*< zeR)me@MXw1c`@g|U%i?0#utM{*GH|iXJ!BT{ z1*W>=z&%b|fizQk?Pcc36PKCDzcV*h4+-zggNHM^nd^y_m&V{_2-_G+=nKB$xsy&m zW3-W2o^id248PtSQGY{4VfIXw)6_>lK4Urbf-iO+TQ0ElplM~lR3P5FV?Ith^2e{u zqmOwe@+502eQY^POt)A6@R;M;chV1wW_@RxCw#rqHP$rZ3u|cqdd?8iKDTPnSif(+ z@|a%i7B0Bn-#dNCw}W@hBqwbw@>5)nn0Vjf(B47ww)if;-k&yk263g+fykiWgv^mU zuLwW&8(*I$#ku8=TkY=X+-{IPSMWk-*mhr^YX4>v?J>q5?Nx6Ig8NND`W*9UMuuta zeb^M>lUnh%v=QOxWaeuL`;@N}&n2NZdWWyR;I+$4-)o7-b58px_WDun4O}1I;+F$^ zf_Q8Refv6nwd!`OFZeBW8!x+T)U|ExH$EZSJxpYN56Y3vuKkRc zp4G-n&RE=bujo6<+mH5riYEk^A1Ta}Zp@eN(ah2?d*)!B@|%W0+nVE%TUsmHOthSN zRg8|+%rcQZ{>-Kv_F`3i!v(<}rf;yDxiiSw17{`+gM#-AKYF08ee~Ls;ph+j;avt< z%J%krzkRL2#{P7cIpW&b=n3{?XqG(#Mu@5*+I&BBd=kuTk8YJTsOMH#z% zx$=Jvx9DuEjF`XbV=s0b0tY+2L*=5Qd3J|~PBC=$fn&%qF~kTY%V*z1mg#247TOA) z_@ef7t-*oD&ewo0F{W4CevG323D&HiLSxpl@OIXa!+Co{k(vJbn@=t`+jDw^x99Z< zTjvKSkdt(6Zhvwvmn|(UTUJ>Z3xr!ACSG!YKFWS)V=K!Tt7Os$pK{2ZN?a>vGG65n zuKS2{Z(?J)Ddv@O&JaVU@~OGd7mX9r2W+KstGS+ELu`f|N&9R=ag^Ya83&j%kfo~l||mEukK#>kG$6OKXO~Ea$1iQi>gP~uc7myBdM)FC8lS| ztlmUMN#58*$vTJjm~%TaOMKD(y`_I0Ij`8<$E>n&vyX=jd(~dRtb~$73 zf5n8C2N0hP(%x6^an7`#U`t?5T^$CIsz|C^rUMHOwrO?rwmV;K3zjM=xUk zq7~t%_8_l9{FVz9zNpHXW2J@I)29Rds{b2bg!}4!(bqf2;xqV}A6v2)Kb7qp)HIWr zn96h(Ka+S+cj#_uZ66)fn$Fp6HsdM6wgc)5Z;aDyN~IepSMQlZ?%0`c-dZY>M+LCM-YiIe5|#xFY|=$=9E*|I6Z+o2T4{ zd~QWfw;-?a_^ZYEtK*{W0sGwWpTQsHGp{J;G*-cR*3qKHA3R;O^ZkD0Y!EBI>G86c z$u-*H%0p+<@xEZYy?t5f^rZn>=Tl9q^m3fJ9RIXmUGF+u?<^R(7J_9vF!@40;%d^9 zeZ;?IH-5pVXh;{GxfWS!>0)NxU;f>u)z<6smJbu+_QB1{h45Rs;O{XnL%z_#v7Bqm zH&dHaiAP(x6Mf9Wjqp`=OKVsZnLdKf$p$H=b`l$4eEq8*WK0MAnbkVCQ%p~5R3$vS zg??#%uH{{hzU;scvvvN8NDHzbgq{yXzb`|-rEB*>r$0JK&QE^b-5yJNY^FPY=H^ z;i%3WyyfZxzH9zO@T8-s>4$#n{8BXTd9M6uTKhdmo7lIF@YVlrGIF2i%lI|E-nld6 zQJfAuv#u%dL+!yA27MX%!~0dQOY67F`rXiX<)8|9AbaheF?`4w!^{)EemeZ$i(hU_ zy`@F|nI-$OD>zTitXu7z54ZIi)N9~VdF0tx`jb^x@2R(!dcwEc?oZqOn)1j+ z=xDp2r9;QnHau3`_t*Y@)rGY6K4Wq9?b=gxXC|iy`vKY z>V63w>4ZU7>&aUV229gF`tSidAwRAPosgXOfX6u#x^`K9FORM*#SSgL*#63g^y4Gm zRp>$FK`E-tw1l^kIMh zgG=G1&2MZpKBdO2JS*{flV`lA8L#F`9ef{h;=t1eeemx0KD>V%Hc5G;w^}+PeVhRP zpRpmQ>A!wUPu1Uh(b3-nm;9XlV_myP9^rGGw|UBCJA|u#DQ`WGd6CQf_zO54x;U_| zaf@wF;_Kzq&qc=7XGLamj(OEar;I+ymysS@zM^wZxJB#SOkX5;@%RDOfO8ws6Kj3W z@khQ2A8LvJTYd~@Z>}H1U6>aiUgnF;g=e|YJwMb$+gW$;MGIc*hA*`&%=%>eQd`LR zvgp%+N zOuphwd`9_Z0mhX$Ch@L||5bK*-ZlW%#1|SpVGi zWwYJ3zeeA+R}r4hCC9Mm!QY6a3LiP&!@Z^)`TyE~k%OXrSI{WV>Z{9Std)%A?9XjK zS^jZswlA_0{x@I89jku6mUjHM7;8>ru_-vY+_(KidgaYak<}3MnTXoMpNWBZQtY=qk3U1sF#AR3a2j)1I(#{Ob#wI2vllA6vLn~J9D5}nU@81BLl5K! zJP+@+XL8Q~*YR66Lu*eJ^yJeuu|}U^jXup9-N+iffHj&NftQ=E)A||Azw5+nPmgAf zmEpJlkg?jap?-DRQ?(7pmv;72v~Qi^Dkt)9+CS0m2|l$pSiT?Q{RO_Makae_#fPEYQ6=&^j38YYohANHo5!5$?&Zf-;MsP32t=u zPeJqnyhM6$LQl5jYYwlJBUJTdxW$dRY(U=|hx($}$Q=`SqZ^T&A^7wO@xz()U3;Pj z;9({5e42Xl<=eQw=KAgOYZ77jUOURaJ>vj#>|A+U=s?ta2Lu`1Cwktwwfm;X>{|9V z;maZ?>C0ZuTo={a@^Huh+*kCggAlN*M&STK|Xg6!W_Qy`F}Yk;w9@vi1lJD>qR|!6GERFImdL@ zkRtXu4XNSnC)4X~-Y@k<8aMf{K|XvZe5SHJ3cX#QDASy>@GUH!%K3(19)Z5Ykbtd9i)S2O03dk;v?@ zkC=l$GDLI8;-hJOX_Bc~Ex#l+HCoL*mOSos&;RAEt+6*vB=7oE?xLqetDtonI>8}> zBNM56`X}A+2}04>)xqfbtJ9*$V9k))!R(v-kt;WJp6?rfVE=}vahq=M+cWDH(AQq@ z(OWi8`zZMIRX&51Y2LV>(y=h>Y25D9r$Ms&n|zT4@Kfur@Ed@i)_TR9`j@SC`)&8{ z#)t2?U+1^?L~DY3uW;f3+L!t22IA|wd;fo8tQ&|4F8kaw>%x3jEGr#(xPGp?_u0fc z`>?b3asAwG;AL5UZdU%6h}sPJ#>HkOyyMJBd!_e>{rTuY>!dC#l^>b_^f{RES+P#7GJ0@U;j$>Y!lBcIht2w zj^te&e>4vtDxch^$@n4UFK<18E*kbS<>a!C^_iwgMJ6(Y_^$G5v&l_A!2YI`{OL+^ zv$z!H2#QPe8BM%!kjX*-OmB2f=TzKFyk&8!)X^ zZ!b9-q90$NALL%2dpy-dmeIa)$r_=Xg-oNV#6VKR?D4|yOO~1=l-Da)5ttsJBBKgkEuUMZ{TP1b=AX`|My-qka4tPvcm(t=g*y0Z!ghta)?A>JepAY|=!JhzK z@tgaU13LPYRriR~r(Xh>FQ@*o#sdozfp7F8~^^0`1gee#u2kAB5obZ z_c?oN*N=1dENje`Zjo^fxz?WLQEXfeez2v##@=tgNW5Dxt1X{kJTC&@ug-zDdG3F? zJo}&Oa5-^2ONUw4M_D@DuagchXYVQ<9#C01Z329h4s7uEKKK34t>sw>p=#|lT$@0= zD?baJkX;yp+`9AKji-G1u8z51NxWn@`c#JPS%uzDLhmP`_u{#HY3|xa=Cj9Gz&u<{ z8ylE=LFj3ZGXt5Z%&;#Zowke(d zH-r0IWbC%J3Rz~*mzBsj5BbKJo4L%*JmfryGUchph{K>0+UM2VW)w`MK9RaO+%}v*;@;!`p`#d_VfrfW3(CgF5elc$SFP ze|rz~0{&)_JrFwlKi>oW^E<35>_yx){Ga&!Y4<>FoFglaQN$i7hdmHuw9a<08S!;- zt9)VT|CrDCTE@7RJ8RjmoVe6K%%A!W{>=FQkUv=o{OR-mGJj?}{P{`(f4<=Gr^4mW zzDwsUW`)BAnI+-qow zo(dNdqTVMD*Ah0Rk;^gZ-5_IFdz^rk5|-Ndsg zw09sTwx_3A*mU)VL2A1Mov!v(52~PEJvMwR_f8bUT|IC9m<>NS3k~yGIiMB(^ro52 z_cN3=F}JJPm*}3s2-WXnUa9n@SI=iHSe|7{x$stfp7mibIiCF6!OTxd?-lu1qIVG5 z6*{A5U4OzKF4(h+a|6D+ZOmrfciR|38#*^>t}xLVjA0{jP4VPy&csf`4~;R}-`v?m zd{(@9hjEYPocPRIeuMWGILC?KHl{wgj&sR{U-tD%JHVb?=eLjZY?HOVwEV@s9{I$` zt9PY^pBh9y#TPg$FJwRR^FLn~`Ia#^V$1S1PFI$ii{<`Mll+%{z$?9~AK1iiIj$Ok1MOBcuqto8DXJKWaU1 z=gIK zvdNR)i~WubB?be|CgEV~KuPh5JR_0ZEg=F-!-N+LbmpHz;o;x`|k zlW5!dD;amcy4ReuP778$#Dcx(g;nN6+;z3ifm_e=VV(_V{^c_l(b0u5`ZO=q+;9!^ zc}teLQ#urbcO!Db(QCu_O_!O4lG$6_b;OS<{dZ*k0DAS#x$CSL!W!gwZtge6^iJzj zt><#*4eA3H_jCm|$L+?xTkQcFqg{Nf?7=z|WzHika=_PyL(n-uU;t`n|(`nwa&rxvN z$x|bqx?THjm!5QVBD@mqz0{qnK2g4s&olTG@?m6WB@fv*!P7>P!;6hkoI&UJ%=_x# zF!Ho=c-~lwZ@U{0>p`Etfxi4EG%|9CdcEFj?|pdg*T=jQ>RsKyoDZTC8R!d7`W%pf zj_CIWokyjvUdI_!bp|@Z(~^^yp(8bvsc%p5IZJmL8*nx--r>xCIXniNpWq zg)>iF{00YZ#g<2z))4c=UZc|H2Me*w@VovC*fu^Z`8mC`x4FX zmB?rf{d4DWh;=~oSZ6lM3(Dghc`W)`iB8eSb3Xdohc$5Q|27MU=zDkj`(DaI|Y?7iT6og5L>TwpQOGeAhfvjKlqXJFs+qC+!b<@e=)UajyYacY#k-7i~X9e0(Bz zP_Kk9JkxFaDds~lveh_3K@$yJYer85U;K_Xx0j+j$=hJejn^c|C*PKj?0_YoYaRLI zb(K#gILYJ_@|#!41+wIjgKr=?^uCZp4vvn5cn;R>^wHuy@dz*Pmx|vG?>FkZ!}}t> zi#OuE+Unu>C_Z$?)eToCTpf{Za``D)$bPuLB@1g0luS2}MI*7cVf4|(|0H?ryRJhX z%ZGHxgBW*d8|_+i=!YXCQ)yRr&9YSvKPC?8ERzY`^|$7X^pUk~DPxq5_hwFQ#9!#c z{JFjdxx&n!vE1z&0>6vcvyR<~&xV~BZ>>4u$YL+DILVwC67*YhBFETsVyS0NAs62(`xE%i8kY~*W3%J3kDwQ? zX&%m9I3_RTtIlEVN;*#DuCr&!eF*vbiE@|k?49?n+$WNsBOlzAZ-6`_$+sRkzXDwH z%}X-BUD;`VyYkii7N0f0hf()-bYKr_`$op^>Xxfhu8#dbmG{3wKPexOH}_gTwY-NC z>vZLP%4f^_d(@xH7_|Pm{tM?*t!C-6LbG%!@5;guF_|{*7rC)A`6G?^C4CCWI}Vvv zAGjf_&eB3JUXPS;^mL$4KE4UD`pRjOLgYBVHZr2Neu7VXc*T*qLO11aCoOZ@)3`<$`#z}d zW*YYIA@=e<_VRVm$iBfu(`TB3w2|bv!&hGfSwuSX_IhYY$Md_JBa`_a%B4<%oUD18 z0JHqGvMVir>~Z2NIm9w8Sk6!jw%QA;6fCXoVK1!y%193FDTm|h4*cWpUG~Sn3lW1* z&h~MCXnyWM?gtQCXc&MEz|Pk4d09ia;I#IT_<6CRzR2-3vv6<`IRfNO5Q-eQ0L zc2Co1IJv!hSYxj6WuzTIp9Z2AZ>`-hsGU80`Beu7X`lRIV3qD|E)429v8iTPj6H_V ztbZFaeOIwhzucFe|ITn9>@%6-(aO`NKz*CQvuJXi9PuzVBpd&4DbKI@KCyE0P#5Mh z=VLtAmwX{>KVL%q4b*MTG&iXInbhHYh-ZT68EN*jc|rl~Hg-Y&|Iffz9AK4jCa8A}cCqV3VzH_5JvRuTA$AIrA5G_3tiD)iXvY-FFjiLwdMpO4PYZygz_*I3Zm zc|2n^FO+84&k5uB&bC|U>Pc}Krx$nbJDeY(hl=xNaA&`9)A;Br_Fqevhqo^y z55Jc9%;}+qa~9wBlc|+A2Uy1x8>#G0&My1sA0MBPZVX}E<R&GP{svrn zGgo#w@A@v!<(19^;q?~wF~U6=DB9jQls!;ty_NT_cIMLNEc!i@d?r0BrV82{r83V3j!*tk??+4+EB6H_d^y^}3?PeO_PxpmLm)Cu!=G z^ZI4xaTRAN@%%-_*svwC3ypjpB|n1uM41}52ezXQUw;O;Gue~s>{K|!8`2p6=qkpi z+{!Zi1kr9(uG8Eb$GlE{`wtkK%I$N#eodT-TR3(eZ9nTg?|Ggbae!RFDsbI1j<(cd zE9cM7QPTNczq+ki>UAZub5@?D0d~40#OQCgxhs*c5C006VL-Q@Iea$9UGkLlaus&!_Mv_u=7gEvge^ zjx;_DjJnvW9TV`8R9A6I)s-!5r0%b&+qBOgIkPViA=ftlzvypllfNJsuAFu+-ygfh zM83}%>5{iNH|dp1YELNI*e}@98t@mKZVyHeJQY}+tK4z+9E$O1UL1cn)KbsAWZ8Jd z!(+t4>$|6HKLGr|yA%07etSFjvd-U?9&HT-3M9|+^S+iCeQ2OBWvOO+m z54Q#ij&VmrXZ4(K*B#-z`W<@~o5Q>}$WrrPpAFQPymA}4d(z$9Sbn~!WoCf;B;4^? z#eJajcTJ|f;(`x06+^oi+QkKm+be#5`n)M1e`S|D7M`12`k%;2wB=X2v(-ie!N+}n3mVeD!0 zRW_y2j}-cmQt;aUO5b^UPf7vL3|Xtahxlm4&Cy|<=}R``yymylW;<=R(`EyAWA2u` zoVJUIYiQll9BZC39euhFy}B3u`X}`49?oCyj-GKR?FuJY%KO=hvxPy+G<$7zfiOkw{C~N zXx{Eue(6+l=cYt2K8*kF+^u!{_}3?F|F4{L-1hcv(HL>-DxIOf#{YOAx2AEQiA?G< zIPx}YVdGZr2G0&e-rf|5R?%kTZQOq%2WP(Wa5fH$#ESg|6M)Yja#cj}%eUTCE)Vj2 z6WSH&(WaMEqHn$2J-Xp3)6zbL{Gd@8(V5g8Vx9N-$qDsGX8%yJS|#@ zow?c}+WcoerGJ83b%y#Q1x>bG4Uq?7x5Feukc{FMK_dxZjfS z)5sQH`r|p)m8>thl4U=9?S9xE&R>8Xo~`E?)guqiCQi~Wb2)!nk)8LaHK&bdvbz8O z;@(?L%?D#=?)8z>yci*ki8@P}0Eo2?TPe9*B&%(zX zx4;)!PR^-)-=KfpA;t*Z8}-~}jYs1ML)XH6!xt&`;O+&Nxpt%UH0C!2H-c9VeQV6! z&FJzUkBi2zUAg3;gm^19hg~eq>SjM*$nbe3^F?FOxa0@zpKfZZ@V(UUdT>`<8QxVj zj{K^i&f%)ood70Vrufd^wBB*2fPExqQQQlnjXHRe2VMM^y3<$tqMDz=7v6W)jnDh; zwPE(0#QovXN!onVnnPK2wYQNU$(>EZc*VC6G_;2gb?fl^+jv%r`+O8@K0{*!_C<5& zAt(2rHR?zk`v3mjA$+woD>wf{z&?kC2L(~i-sUpz^2Cpb?_4?S<|EUJqTi%#=JsKp zX%jg;${%S8n8@tPt0O08lZ&nX5A_$ckMb9gBO85xEB7@25MWN2RuTYeVxz_tlye7z zwLL$d@y3RZE67bTHyl9DF`fYx3xs(_Ch-cj>Bzvx_>>zW8SJI+^wG+{mtQea?X`1P zgLxO@{<6+U8Uo)bY`?mDRJKlidUKO6;>zGoctp-pr>~Ed_ zNiqrlV`8)o-FDY?i>J{4gJVmtaCurx4nFIj?k(3S|K7Q`{O>PWxl-qX%nO}`U>~h} z%U6#xH7_`2@SFUCj=XH_hjnkcjQzv&;MDV}a^>02lpkmLMhSOv9lCv>8=+1mcaV&8 zk9qFj@Fj_JGM_GakJ;^)kNWZfRzPDG_n56c-v3Ycn9I*N_n7ftEV*3b9`nVs)-&cl z{vNZx^F8LoJIrO+c=L@5J8_Bl&wxJ={03spu3jv~XJ;No z%uM`1=N?0qbB{sxOm`xB!{1Kh_TFK@578ZlVrSg$c>nZQ>hKJmWV(~suZQTDbmu+p z|991$Zk_MIlP`~5>3j$NF3%nK`>?O>9r*k4uj${%-GTov{2|4a8&ZAS%dyQ9IHL)o zKWf8%rhT|&EcEtb%Nj4ommsIVjb}?)@l&3I5X-jj66iT8ilMkRv=hJF`|RP*TK=Yw zJi-s2w)LUC-Q!DObITn+LVjyCwrT;tSIeis&y`OhKR&qevmJf~<2!R*T9kiU6=}aI zh+RvM#$Ld$7;9QxpSS7iu0HRN$vKzLTkqV1@}UQ6JDJa`b3|9J@2|4^t$oo6Y*RCS zX5}Z`3%Cbe@cO`|{QjT#z-8#A{NK;x(_J>v?oX9x-}EENlzu(OXLtH;%{ln?FW6q~ z|J^zGD*cF;GY4*^T>i4kW6SM1F_1PiPhWE4HkLm&T+ajQj*U-c9SmCcl@+()PG}u_ z$d?pzo=qRMwuzqhWewyuXVISFUX$+i>b`oz@j$elbx!Mk!<#x2sC-KM*L(YznwG24 zHFS&r-dt_xMrYOC%=`!jvZ`a$i50Vlqt0cYM~=kJ=etkO)sRoD`^ECtf4>ZgE^{czjwV|k z5zrW||3{*H7&AK9&Gd0$ukpK%`Um{=zZk#;>|XZb;L>~wExFL7_$ zoi?AcCi+3lcVTD(XF}LM^6dxVn~|>0xhZhPbS9;k(V>Cl@|TA5s@peAYiir`5OMGP zN#xM=ho%!3%U53XQJ&4f8h!mz;BvvkQB*EB@>W{=bl$qm%bf1MWI*#oXl6ry;X+be4N#=&O8F?qgpUr#;NQGCaqAN}h# zue9x!H9z3X#qRb#ckT1ex)8wE9x6N2@qCU?BeM%{vhI>c+aWW5RR4p}lG&yX8&f2i zVP6`s6JD7Ob7e*yOJ>yJg!U6;!-tp`W(XwO@z0Gg(d<^>60B^qM$Su#6+dg6={0|;muH08v ze|b&`Yv{t2^dZ;B|2!a`QQk(3#Ep-H zxTC-tQP5t&`>1bm`_n$|8~a-DOV;4OzKH+&qFFPVyQl-Wi<%cXS!}H5%N&VF|2X^m zN9xyh)Za^eol*Zo^-X@f{g3MCu7-<4%@K?KIWvf+|&>-kw^KC4C-RcPyL?Bnij*x z$#(I(^u4<#MoZCSTSqhNu0U_4%k{+4To@Zq_?dI;Mn{ib+c*i@k4!VsMb>$WbJr8! z)xGN}|Bn8%D-JKM=N)*S zjc&qrtXShedlGxWbMmr)`FLBt(H~578vQGCY~W3N-^2MUYmJ_fUaEOujnlfHWk19C zP3F{bXlYJY@(cuf{Qc|ZIpa@*hUTr>$zEyuj(X0LbXWAmm%+V=8)Mtu`FA~a%!T$> zKH6^ARlPFS;SkTNPkVgeUBN4YcMYd5&m}A%kG*x?7dfZ+Z83T;7d##^vhazp`dY z@2+eOiub=qIYwl|Llf#*5hy70OBOd9A{f_&H9c%6mcxA1*9v^YdO~4!< zvFH*$;sdl>q32b?$3l42{D-1wrSvZxh&11AqQ8SKdObROgjpCS&XB#@KJzL9w+g)A zknvV5@P~Xa7#fJ=R#u#qHvimt!ywA4# zfBLSi^KRdQw3lehzXh$u_nPP<^xbLqh}z}A?gn=Zb>PUpzY_OlZN0soHaq#U_uqo7 z?KLAl2hTDGbB0Hj@;s5J*sG?|2bXRQbmMrzP-I-?@W>F(R;$3vVXj*G@h0)~Zk_$# zYaD%fcD;>fKa)SmJ>IiV>3_+NuF(tRMUY{ugFZi|z)KTVwt2Uj2W< zQtU&P3AgfpLSKCSUjvaCbKTxUWY+a$Jy%RkwzLRa`T_dcIy+p@a(}pBCVkYJuk+;X z>{ILYEX!1KqS=Et_y<;3VT*KU?-l1haS{2O${$t?!TW5QHl9tRb2Qx}`_{vX9~VVM z^BHKC5!==NOlyf^i;4BzyJxb&<8pE%%E_4GJeR?`YvDXMqhB!0y+Qlj9v{nD3$p5- zJHcL$@$0!;iqons_3!_(_U`dfSJ&SE_d5eJlM94vNDz|{(IkM1fD$DqlYj~lZza`Q zTN9wI3E+jJt)LzPaej(%b!1dQn(?^G zV@r%hYTK+!|&{Cth0JADC4-MV+NP_1QGMYGK_8fC$*&Nm}l{;$3=376b;g7zTH~-V{z5dVK8Sh(fM?3Gh z4P$)KyRCcSN3j7RBY20&x$}~EU-BQTMdP8NL#N4i`yH9A@k`XXdX3(DO}u-V+{Rx| z1LGD8#?a8ar^$b?k2X>t#;yVW>C^jeYs+b1eP;LP)zjpU?xU?M=nr!>W{mX($E5pW zK75NgqkYsQRd#P24$sVDTib@m(dLuF4&yvZ%!e(twDnwOgw7|Pgc9=V9ErMnGx zafbT8z=QF9wA`4?9*c9c4MyMyw(XZ5wbGw2uO4zD{V3_bAzkG-iQ$~qjsfgW+_m%& zvsdreC+?eiL%)7JL8ID-z`s}CAAWL@ZV8)8f)D=nG<131rrWKj$$#6*Kb3c4&{A(= z^WNKH;`_AiW4`R={9kj1@4&mfpZwW?GRqI8)ZiUA=0m}KXUy@U-+B6HUsyQIm?Zj! zsS~-_C{~@F$#s0b#rv!}X;z&S)$@+JuxR`llT=srI;n?$MDaYk&9 z)6cxHXhzzkalPtCsUP7@`V}^emLwQo)W1uU%6--TotIqaztO+5lIs6=`sgFVTK z^I~TlSJ>k?33`l0KB{kH`WU-8Nn@vdWGVegjPaL`*PYaree3J?VIB1(a~j@NoPy!p z>lzx}V9QzYkJb=_cnCLcBxY!mPn6E5wU#)0Fh|c+`R^m!e}e2jBwLJZU2bA& zsPG@1l=$+#mn*nK=6h;e33>$a=Z%+ThyRRqKr!fz{=`l-jbKha^AKMq*?o+M@k=J% zyEW(Klt9kQ?5A0Sw9a#$$h()P;$~X=p$#@}4h}PZY~!l2ux0Hm)^Z=?p>PrTy5 z+YLPFgr2nNr+r)aUG_-TXZhfBV-t4}t>2FCsfpcPcv-PE{;oHTKmSIv?EW>>mz`Vl z^^hlFo6`SGU<%j!!TEIWH!p)v3L^Ptht+Z)fc|A)`UG-<@9m*)^kB(Od8<7+9F>pWgv5KSxVDnd}OS-vW<7{ zx0!)D&6O2Zdgp$V_7yYvHV@pl+ti$a=3B67idH{@=86+sbDsQI7#rX@V^a-$XKWTx zuKHT*GOA$(P&uc{h!%9mgMK`$Q0?^;)@aR z1vK3>oHxhc<;`);8PV6`ANrwr>hO=r?`rjh^3GUWBB|--KV&$#%uJ!q=hASbIFRw^kgC6LaRn`xA2p-#3+& z&Y2AzYtBi~+K~Z*S3Tw=yum7SAv!(jrUQfVabS3r|1Sv`=KJ^T-m3bSAanV)`j0KZ z04K*LAfD_U`)n>_r*nLl&0|goHTWen0>zoIl*;;tclkV{khbEKp`?luT80HvnwdZ1c zXjt(b&9N67Tva^|?dpM7x8mj=jm0nD!}n2mBR|WSbIyA8Gt%{*RE^d{;5#zHSq~p2 zUu&5|CzCaynsrflT4T)G^bq}bzO@G5n?zfUcMa(d{T#kc z?n59?2u zh)2}#WIC0AWAgZ(;H_Ng^3t73tYer_tx8aegG;JKfl&*>HY-G3O|n&-B|W%Q#x&48G1dn@MdJ zh(6#F1}DjX_0OPAHQ&PT*xwTEo|q5z_*v@UeHHd zz;ft&ALVNPmAK}@;lZmp?@#Er4?|z)xB6hM*)B71sq`CgBSysI)vV!V_L_Lqj!W5_ zUp&%BpwZXW+ph;NOK*qf;#J9*)6x6NUi8+Sve&g;-erk5M~plput_}gCG)L%UxM$i zQrXF$r=5YG<N4m&IfBj;abI8uO^qO4x%vfvXWX%Q1#AE*pU0UZnTQ8?Ctg*z#%|(~`0ej$% z&jwsvKpQoj!#U+UDeu^CH9ndr4e$+Xi*=_a5BvRHtcP`9;ybqUugn|DIrk?l{vA-> zvmJc3es;j)bII3y)4J#6ze>LITfE+opz?v1NFAg?EalqVTd=6%&SgD-OETL*qUz+dYu@xQjkq{@4yP zW%VlVJmzqx`{1PdM&0cmLp&glIS?C?8FdkdXdwIO^UZ-x1NnrJ;~nhfgHzHinBi0- z#@*tWV9V~Xg}gBP{1);(m(8s34);`qvH7;p-T}@_I@tera4!@erPYG}CS?!MZZp5P zkT-^NI**xdwLOM&+jQFIjozkoJ`J=}2mJGz)iWpCB3PLwoHC^ zxa&$%`7L;Qi>?zq#sMP_7%6-kd^`5Ea>W4hO|)z;CAL3^Vmw;u9T$-94P9)fJ7cN% zNU7DlGsl>wZ!vZa+`@fO_+$|Hc-RM&`vx_s?O6t~D(mW|>3)9|_ui_BSs+4}PEWLe8$wX{|xx{#wXn5L7i9t7=``G)4<1>8? z_62CYoOmHmABk5A-x>7DN1x`_ZJAa&(CBudJM^<@p?+psIyuQm_JgDh= zj8Qf9zE6GOUtRahY2UBQ>8a*U_V;P$0mY7`o&EG{g~!;n4BfVnI^sik>4Y5@U)7@C zX~{g-X!`;r^XE_Ow76S$T}N;SF_XK9Bk>2w!j~)?89yqhyDg=aMz>_+JoYOw>=AKn zPM;nze|wa7B0uC#a0&Qi!>jjw^C$njl;5wqN2Pqken;<%{Aq?U`FGjIMc#P%?&8?; z-8rur-34y1KM2njeK))5O62tH`kQ--;Jf8!T67HQ2Z()m9&ip3U!jw6jWU1aKdE{0 zFMKO@l-^i8M4s+8j9-@B)V*L)&-kkBrbmId26&~!TO4oSM z3-~!kS~Tr~HH{0$`Ww%`@Db!$dUO%LZ=|gp*T85h{Skb{U+V;p`V?g^DEOW3f&BLn z11lpWz8nPphZYdk-y9hAOnkWUz{ItUYsRi=+-#;qSMyynv7vF?^6Vz{^WcJoJyH6) z$4rer4SdOhE(@MFB;U?1+BrbH(U8E_tVf^ zbd>E__m6Abo|GNLaaaVr70W5vr5MhPwc7Ng7#IH;U(QnZ$mqPu z;6xiO%ro69%7GRexG&Iw{OLsYsGV_YXAbMjoGm4LkvUQ3n`3kCSg~bVgu2!}q>VhTar(7Cv>cD9&I6cMpuaj^)Nc)e_?|RmW=lEXFx7u;=*w6c%A26>) zD}(ebVns(>&<_8e4HJyY(i@EK%$8t(8t;ZHLN`;QSrTj+$truxW}fW&W>{o;>a+U zycg6rra?dA5{v(#s}bEvom=7SHKdF0C8J&NnRE%|Z#XBhM(r5O8Z|zM87hKA8-h|u4K)qW9`VFn%$J+N{^oXS$5NH#@fdD zW`aNx)on>KKjtSPp9wJ|1pfY%KwA)LgnV)_qV3^`91&B8N2_@=vVXu z!?mj!-^uM6E1CQ0(Zv@88uKn#+4w!)0GNyJMG)9_r5nIeeG`Ak-(ZhW?4>TZJ8(OF z{s(-va+opo{U6`lGvAW=DbY1~4>W2G%!3v~=+9jI@>S;mXKja>^Z$VVRHr}dn^UKC zB6W;Jox_wcv#nbH1$IjDWP(J#8PZe`=jkK&v9aW@PY-48$;XMKL3 zF%^Hj&)M1;-Qfh`x-Re0!?{euCm`*zNzoK#}@tSZ%cmrE6P1c z{=ZXp3uOiS-zdADvhR=fP3;ZKfwLDsna992(MKD9?)od1g=n|}8itNnO|7o~`?N*% zRXr8O*-d5e@ip+Uk9j3Iv)7ghUG71l1<+RY7S*$+*8g%^lr`lL{n}4EBcQ41BY8Xz zxDNwYa_nkg9dJ(wwZc>C|9a9iho2+;Fg&GpG+(Z!E!D4p$Dil7=C$AwW2L==cp!>T zS-9+PO<5VU{5xG)QO&Dr=GZKBt7_&|4!$)PGZ!_#)J_L!pIqFW9i}bGxKd);t9+O? z)!w-JCmWZiUmrbA8Nmwk=^($BJ4_cbk2J@7n5UBGvN!HUUg!-!?nx94Kqh>MEYSLW zMDhTca*X_^wavO@$FUq6Xc3hX2sUTT$C&+O*Oh#qEkt(N)M6Fta!#L(DDG^ zl3~xHH?2o+(wedm+LW4EQO)x$@co3VQkt|UdHdm;d!9w^Hk*T@+t6*!C;c7hy9HYB zMK3&$@(xYkByaDex{~vV?RXx)-!i}3bBJ}W8QFV~^=Y2sD!>m1;D@*Ra|eKNIKX(U zK&~F9>;ZV-5N$T27fV0f{`8Imbjp#q$LJzuuSPa+Wmz0RXz&i0x z`FiQ}S(ePb;=#nZft7CQ`br-WDoai`F2o;eWGHH%=~`uTCt3S~k4e*7?WD=4#=ABF z)2BPZv}Zg!4nMsMtXTV_ZMc>_dAkvKMt7p2^^1=s>Nxv|B4kY};~}|;Ua*PJF1=Gd z9=%Iz>>A?8G^6hp#FoD>1|E^_TaM13zAUwAEuZw7TYCo9+}5)hx;CJ5D1RILT*~*; z>Kt4CXY#Z2YCj0xR@?} zK47cAx<8cYuP0h$_gAs^=fS&I_0iwe6IY`Xd7}H^nNq&B?@)hLHo3q1kVQ^^XMe5! zrda)zj-Iqve5ZWNh1Q<%xAs}T#S?a#_~O~*^lFv$gr50aS_=H<2|bmZZtp>VZm0RM zJy-1JA!cOZD{4Bg?0FRG7k*q7CR$f+-%h@`t%nd~tq^ZxZk7wApGgpZf* z0dj8DW^j+H7G2O|j=r!I9;;(LE;QOc0{{E!jmPi0 z9)Df_%Rk~6ev6+a-C2^~iELMnuh2eV;&*ex=j+&cU*G2|l3eG%;S=?jr21dipJ)a1 zMSep&l3-YJ#g3sNTN`(Kib_8<7h@N#ta;EEly7J?^R))r4y(vOsb?U$Jb5%QqAQFf2oH1PxY5tecl<9R6g0i?JnxdU#j8$&-=8k zzC3M`zgHc{r|og-)tvB^8pc)C1l|c>DZ;_yD>d+G`AQA**RZZSu{@G}rDVI4+#Q8q zjO=;ataU`|Y~n82aMFKBdMD}0w3BVo;gc0MpY--AE5sjAetm`b0~X=aC!aF>j4Z!C z(a7;BE4(kwDknd_LVN(_!>95p8^s5(6CXaur>qdaKfzSlG?mBiZybJq<9pTVq7HX) zi!Glr*5ohqDf{=QzPeA@JFb&HWnVUD)+F&>=~wiVT%KI#zcFWSPpbdloijHl!I1x( z#@q3mD`PFsOY(pFET1>;Y~Q)t@M-StJNLP|Nj`VUb*sKg-6a3HmAcgvPWbF4 z*DdQ+H#tU}{1Fu+PBx>HJmfm*mxzw!_$5y2#Y4wzzr<7HwP{`r#jbafha_{GC&+Gp zGB%xP=CnKP6#nhI?O|V|?c82%@273G=S3e$_Ca2|${6PO0{s5Z#NU-3#(Cy8eoMc} z-h_3eM6+)6lb;c`IO5{i?=N;^`FDuWlr0-R}6ISmMh7Z2W((0@C)qY<-zC*!;Vd-DmL8ILsDPY37C;2ccGxj*r;m$f%l z;8PK2&!xWY8@k5A-vd1@{5g9S{vOH*fAyoUKCDgZgO9aOedxqix&Yg#XW8pb9^Q#M zU4LFl>d)`LtUuh}Ic0d_YAN7gz^wZ+}t0bJC?*nI@$(@jq-Y<|T z>0d#n;P)i_zf4A6medEQ(Ly2exBZ*)USK`=-1Q9 z{lbs)w6c=@y=4FC`Fh!LyHB%D zJ64w@_35%c`oz5pYpgUEQdq~TSjT2*9m_MiMfW_`-yQaPEBnV6@xJyl*eXxR8T5q8 z@H4((%{hIqwL_C|JIldsrHgaJe%Qdek``G~Y$;6tu#v3f)9)R$SaGsOGp0EU) zPSIUPFcVuc`^eCLkbdmg{kzM+L;A|yySa;)k%*_)!M=3!IJ~(mdVQy}Fcm=Kq@}_8*_sE?7m-NWD z6Tf!w);_g{JNL4~N~buBw3+;tUL{|N27FWH?;`xHGU#|=^u%G5>!h!q_m(`is))FB z{g?k%=aLP?9&g}&buBOzd*_sT@Rj5H+d)67`Cm?3DU93EYi2R-Ga3IY;DgKIhs&^^ z&frbx#2w{G{&d27W54Hq>|E??>Td`3@#K5#x^v|4!h=f^YlHYlbUbn_VeedO+fr+$ z8AH73#&xAXF&6JYe&9>~yr(eDiq)OU+b9*@RKL&6c~?AGh=0QLao9MqeNH%A?*RCg z-b-I+b*#iU!n?48`i1{U{H{mGojJ`jCnt{>^JjBM4}I6e+{!Pc4ElFbp7p+NZ~}Xb zJkHjN$ge0cHjN{1Jhaf;7CMKoF;o2FHQqdEUj$#4+I-n8zRc(R(BjLTjc=Oiq1lB~ zFRGv{?}QA7@48h_eEF<39>|?sqgZF**gRs|Ggy5>*WLhr>BJ$o`_y(h<(0?zYWH^9 zNTa{w$MXgS{gs_mb7c{5T8K+BA5pd>@A$A{d#_>i1W!qGCjmnjH=7dTzhFofw zErbs4JbYwC1L#QE*t1FHg3GEOyMVG2F7O4%pKWZ?J7O)h3#S(38YEMwDn=%zD$m4$Xi4W`$>mbmttZF=p2UMuM5+tBM!-kXh4Gc|PeISG2{oUs*} z)k7=xRaSqzXBwN*MN4FjO_$>Fw5zvVo-{WKTnRpLzJhJ!zb;KXy2ko^O<6Q$tTSQ;h>=_3*_+Y z2Hs8R&94vG_`E*k>+$Of&IgkDbx~H|{916Ip}4;%@u8lBPd;x-_QprP1ru_ie;K^Y z+j`HH8G+>SNks;o$9RmVpN&ay=W;gdz@5+U-f;bt)ws@P-(?UW;hwTFQ&pIP+=0DXDHgdczmh zolV`cr1H8)`i14;?5_p0s#@nLQ*G-^H$HnzL(}56xK> z3knA}H}b|}D7jy6F#g%J)kU9@)5pOZqLuDXwJ^6=G0zK-OZX_@Kja|>1>?HuR9wEO zPj3JVc{0Q^dgPo6-a(m395iB~h0^FxYMK$tvE{EH+1}|cvg{|4YkE&(9PRD|&)$9S z3+FD%>D`D1;2Z>wN2Vm|$WvVFzKc=^+7cM}`?(WCDEp^rGnIp%iZ-=(t@BUF4- zI(o>+B2NixZ-3U_R^E`ohTgziBt`euF7fcDiou#2&QHY8*!Z95NJA4klJ6>Xq)gw^ z#X9=NUqML zzgj!}^m%r#b#?`B6F!WrZH2d9GBZPqZb;~VlDo@UXH`$@>^rPS7W^B(Cj62<{ZTkN^nrk|PdIr_Dn;|oTAP)uM~Pjt~Dw%(HYQ}cD+P?8uCl> z#L7p$MXn(q*~2?CPJY`=J0G8`?)~ITRz8b9iH^UNHL6JK=mPjXe7|Ro*KPNWxMFil zjLNO|XUsvDE?Rj5{>{^ji(1a}1((xK5MHT3zWi4b-IB}S?UWbZqtWBx8>jqBMZVzc z6~-p{289#KL;w9myvcmNS)8oIYwsz|Bq&>v88O|P} zz3~k*Ep*kasTV=N0D5C|p{;xTKbr=T%Z*K$Ptrr@>8(90Le>ilkp!~~r*{<=YmaXVj zwhBGuqXEs?FM(T#{%Wp#nGVu^>C}rh!jIBH4Can>5RK)R=^$?N?LGRt1HQ^ZZ>+z-s7#(84HfqM*gB~1`BD7&`SC5A-iz{1 zrFZYK3Bj+|iMQZM&4rb`liJr@P&v(o%bl{U>-iTYbO7-L^QKKaX_bRlqVz@cTyUj- zZ^tK6`nNrQV=5;-){> z{?hryzACXtPt32@3qL=Q}nj!7@_P- zV|>9>>6^6MRgT|p(wx+MeD*x#9(sf3<$IKOUh@hMXT09}ajsv^OVC>Lk*w@f-U!$FJY1<2Qa>-{UvZ;g2z26Fz!KGJlL` zpDKN)_xjnw_!#sdf;~YpM!dNbT7F8q4&S=je{Be!Kx)++*V=zRA!2Jl{AxqxNqCrX`=*Pka%s ztKqe4DJ$KrCS(ME=d=OdZr<_hOCG3>@Wyv0!N=gefp_GzkN7gY=MOtQ-h!()SuLK` z++eO-bCvmF>l$t1NoPG;KtE;Ah~$?A*MfHg^=q&jX`HNeSuogNu4Y{IR`x=40L>Lg zUODv2u=^o<9{}OUSGR(nsCHuxN!c}wnSW^i)OdSWi;^V_PMq=Wr633fjFzb}LhF1wS;Z@?Gki^{(aF0WDE z;*sZ!;ADP((OxK%y-@Nvy$(IKrdP0Eh`0-7I|#5x@k<}pxb7fdcEKofu`6kOxl9oh zPjHW-=$X^xi`SLkOnw-BWfrpQ`!05tI$X8LN5ZwP^g{dD#o~rtVM4 zzY6@K;P(>v-3or2f%VcwMo_-76WG5DG}GGIWBCt(<3e+wrNcYCC|o6rqwYaP_nijU zPAfkRb8_E(4cUEN^aZ%A#*tQ2N2Kcx4K@vb~Nkm2Ye*tahe|R>+pEl6BW7^hta+9^Lw&iZ+p$wY~F{TQClNm@k)5sXdJEbS=*fxy0z66Y&NjRKCUV z>~d`*`lQt~2d<4r3;P}m?yA1aM~KPV*O-JS+Vu+iu2<@`BmBpLKRUP7&R>QHLeY3e zvW+B}E(Pb?<+ctFtR8s!eugL5<${z;J$<>B@pieu@IXr1>C4qH4=ns90uQ^;Dfq!p zoOzu(e(2$e@fg-;`B8RxYyO~jizio|h9?`)yDeBx_6-Zas6^W~FL=(e%kQ+yC(XCQ z^~5k^o~9VwgTnr2ox5nR+T&fonS|9=7X5Ueo*rS&R;+S!ZF(fNVf97to7%GEl<{MK zVAWgNcfAPf--&wMgO?wY;ML^xymU%l20CwYSr7Zmi@k9DliEls z??D&0$}jG_{JVB}jonk|*j9g8Gfv=b%e1XoiM(L1aaFy&yoarNvwGz@pJ3`o=~Ko3_vPcK}(ry0YR{)u`u@)=RRuh?GLov7C$or8KUU$MOc-tQ96 zgxO=OUO}&V$eliUt;R^yn}vVD3)oXtcV@4;r|>-dddh#s<&^)7%Z}smmy*-Qla|Ka z#Bt0|>GRU@baq^e-md-sv*_-(_VTqT=N!QCwb;R#$(ydJ7s>7_UyEjREY*{(y^u3P z-A&RtOpWF=_jU@C66k-(bz)9`2^X^fZ6rFUn&Tw5R(41!j7?gQI~@gziG+K#!TUmrRqwGmRnO zejT>%#bInd_%j}^$Ql{ooHJuK_G;%1_>}R!;FaJ$8=Ro`t~Ad6Wfw+{TI*NJ*$Ll( zeCRZry@#E@^pt$;`@Q0Wd(jUb!6aj#^{4@WpN%i$e->S)PCD&-(!Qv?rOaA zm5~8A?;K5r=Nh5QliUU7vBqGN%U8TS$5=d*_2=i%@^?$_UGnqP(f&Gj&bzM+H#YI6 za|j=!qQ(>>@K+P7O^`FRfK zO9PDVZ}VF`|1Jo>n^9-lWpf`Lue1X4(%aWOJCm8d_frfBgiSo&&5Z`o95P`KJTHBi-0#(QAlriS8Fw(ZB8IkvD?8 z;V1H5);eBAAGill`O|aA8+#(J=P2~@n7r+cKbvr#-4)089zSF7o#!kA>;~MEtcbL5`{Jlh|sC zkz=n@N z6xc&P4_oy6n02ET{A451{MOl;@GfLcd)SrYZ|#pvNIL&hTqNgw;xA@asC8(<_od36 zVx9j9XVFk=n&>VXX&lxg%WL38))wn*b_a5s@pz~3$%LLd!O~OHEg!X4;Kv5$;wmq3 zQCQnLu#q*ukE`Iv)y!R`HKh28$FYA&hRGV3fVuSZFtf7~FxN8A3pn!^oOW<@@C!4) z?gq!&?~a^PIC{xro!~stOtE|##6x$G=h=M6W3~7~D33Gx&|vbtc{|qClDCgL#ah2p zSg&;EwvTuV&U*eA{_D5yrf^Xv_GkX@{J(cRwg6bfRth<7sh#VAwHmq$FX1k zsCeia@&fSDgQmM(aUZk^ZbfptM5m(Y~6>Hc|d}+jo;>S{(Klg{>Ph{dM zWa4UMrNy5Y`j)I@oT~;|ezld#QyJX}QvUQ0sDrFrg{-8`%T}Fl_+I{z>f{*RtI(g7 zr!qP_Q2qwuoHSfcoy)8`Jyspwov&3L=e?|b zisbgw=!2T0ny=!)7eB)nhj!P}zFoHGt-bM0so15{piKdMr16k{BJt4L8=&cCTSn-d z`Dxl3Wcw#Zm?vR#>P41b2u=4uQ|ZCtsd2~&{EI^$(H`+8EIn5|FF!x=>N?WHq>o3g z7chqBgKrD-MsrZ}FJjL_;(DFXnIEH$!z&juW?^?fYi-O227U#V755EnYJpd_!}qr% zkBEVCT^v2Kf&I}1$fJzxES^&~GF%I8pE@zcq-o!VQc9`a^b z_;;A#Ppoy}Ka)A|o^Z9`@GcSd<=wzy+`6}8|EG+#9_PTP(-Z%#^;mY_?LAh0Y|S#! zFfHofqdke_don)6N=o2UoOKF5tSf%uGm{v#1>o}v_0;x$Z2D?j_`Rq!wVz09Q`+-N z1BVUBILgJ8w$Z7}UIAE3pW(myrSVt4w0F42hP9m-1(a#~r446#;(x4>{~q+f-gg(5 z-G>gM_b+%8Q2CbMHGW?+*|!jT=AFEjiTHjQfq9JKPVwKsH zC?lWnadsKym)8~JGtb@n`9@&c-HK(1&ct`}JAehWX|0cc$@-ifr;t5C4)Q>{NWs5x zAMoE2`iyiLD-An>wGXD<6KU*wWmBn1PGj%u@fd9lNoj)JqW?C0{om2+e>myC)4m7W z;EA?qKL>xCF#A8@QIM1;cr*1s34Tql{|&wVxAgkIqu2j%um2u+AQ^r^um3Z9{jcfu zzoFOvmR|pN^!gv}^7HGQNt^pVz*oM!Xbj-)h=cUb=&ezkei)61S@;nqjm%s$d;lF|gfLI0EZsU_(@ z_bqmPcB$TxOx(dqq5J~oaH>7$wcbQGa))W7+qxeT9%aNL1UMNA(Mns#D zi{&FZtf^uOcLjKh!}?vqJ!F2DahI};?*j6TV(yd>libDp`2HW_gfiy+)0JhxS@cIZ zM3!@>h<3KHE{3@iy$(E#pO?q(JR^a}5&G@|$1Tun*bBU2@J!K`szJ>ce zcN(#~9%3ve5u56h%BXo5d(EBDa=JTk=c{FH%f?+5Tr%K_V*EK{wI5s^%-%Y^_{;;o zwjV9`#eTwltjM^O;J*C+LG<=biTgOiLmBju`#vvff98XpEuWR|cHaB$$Twr*bIn+( z-su`=#_n3jISKQ#;r<=msq;k3x{S&n`Qh6$hFLM|1=oabdPCvk-zVTIUWh?jn0wMS z+>>shuI@>nXybg^m}JJzQ5zT2Ml&>~Z%;*l{X_!q<5wE750h}-4{Y|TFRBk&ec^pC zFqfOL!GgKcj4j&;%;{t2lwnIXh-a$i;dV3ztPsS(rEi8yy4*94ty?v zhqlm$llHBJiLuS1FGu&g0}W&P1;SOtto`ir-HF&yihnSiy}dWEWPks_ca~Sb5N5s} z=B=|k^KS_LF#65lk6vPo=VPaAGrD_jO1z1z_k?yb&*O7U;(hTB?7+H`4EofuJ;jPK zbpiLwsvnx&TJu-tz>0=xdsnQQ7QUOZD|YhxwQ2iS?3fn0sVo+z{$A?t1I7Vx=v?Uz zRA8T5Ph6$wE&YL25$wEy*kj|$VspFSo)*2hEcWz-EhSwm%VGx~G6Gw=ADMRW1L6Sk z-PvTsqR$Xxi}$FzZW$5mg72RmzNKXSkIPyQ%%S`X5U=MSr zUcaAl1r9@>I{kL9Ydmnsh^-wn=;f|wvVvZGgLua*7V-Pq4y4Ws9$I+W(#U?ZEmF#y zZ@zZ7KmM)VhxWLaMjoNeO3JJp6x{bvM)1>i_tFm+jtm}a2mhu4#r}T|ToQR^KyjqX z7n=wVA|(A3bmO3&e+- zvG_9{=?P0abIM|&*~H2pRTjgaY}Wx`YoF0YJE`c1er%PIXRat-Zh9B4VE zV94)B{({>7{4ZdsetdgMarCv6;sEr)$EaQY=Ca?X19$#f_JQ*0H&ffa_z+bj@&nif zc1561C$vgkYiuG8U$K|+6WHe-XHT_LG)gxXFMyuhKhWOh`HX*N2cCmYgYKza@|Jgy z-;3U|1v*7mUQs-b^2^yrw7hDU9Wp9_-y3BYT4hyk_5ZA$D{Z=`!$TVLGRATvf|7)f4JUs?+OAuKY(l<5_FYr1>>p!cVXUuDhZ* z2YxrP<%d6EFTlH`V}V~lJK+~R#lu)i-l^u)dk&gZQ?}FsIY_9o{gr*kc;s z(A@X%zr#JsiV5YrlJ|6#4{Q&6YuS~#PZNu?2kqQ&MRCfr#^fk--N6Mr%r}J30`KeD zW!TkKPiI+SaQG*6!UJy5dvk$Y`mESnxufe!oE?7eQD`%WAQd*!%>z})tNCW^2I$lB3&wd|73Xoo{jwu

RrSsE?{=W2K&c(8_NfJbOJ3@+F3JzztVACG}6HTS=RYc>2Pc(I26 z1zxG)c5t(X`yOu?Qx>G?KL)%-b1wi_#8U1durHFr6T#J*yPQW^tl=VE?aD@i&758r}vj*Kh~8Lc=~fhH4E5!1rjl5S$Z9#Xk(ZOmqJkxL(6E!IfJ1 z%m?Rc;qL)AYyOvkw`q7KxJ|>&;IB2j4V-;fik=Se91Z(^0)K1i9Sg40+y{bJYIqp9 zS;IdAw`zDM_$v)Zz&VRj>E8=3(bD@fIA3#r2|Pk`-vBPv+&=P`;tYOkG=;MooE*ye46vZ@fvboL()Gv zkMx(N8^3Vyba467bYnXaho%nuC8lfcnzt8x1bga5cDYdb+XE@m~-2Y3`qZy&6916!OPDaJA!qEchOG{?4k& zGVmfW9gGSdyQgg3E47H$HK~{|zj<#Wy>6uehT#OtGu{m!8J>f^!B^ zr4s%DaO(wWUF$Kq`IJv-T33BM56%a>vKar~dm zMAv_Dnz78mad17DX0PIVbTIV~cKu&pM1GjuoaMNm$wLL$%}*MH)qx47!oLY_14E|5 zON$9V(%zSr{LCTZF!)f%ee}7^@4?LuKIJ^(=lp=%K29ouKJX;Rebf-@>yk8ky@B{@ z&L@8G<^ z;Ce90C@ea&{xQVol>bG;sGm#I?D;tK{TW;VcFVKxaMB0YIN@i4OU9-dhdbdng3HIH z+4FnC7hMQ_;Nu%fa0eD1~g=lq3RUyp$o zf#*8z{YH?ViK+Uo1($(c`uBksfomQAGe<%Xo5;Bi{s=5*bYLr$e)%XKewJoD;^3{| zk~=wPlxDjhc?tB^q#JM1V1z%$gTuc{H&&ZAz8zdfaQG8W+(mk#eHhJVLI-EMpK_xrQGiV%UK|o-#!A%SsxdlJ%;+x@UOvg zM#y#l1T1HSPIl5e=ThR+@ZDfJi!{}7Pk`mD(bWz z!@b85|1VPRmx3$G)9m#O%5w=g|B5u@?@stn!EInSzO%+d|CK5KcYwo_(~Oml|4rbM zDJlQ`Cs4mrQ~s|9mtCFKRla`*2Yl%UEMiD~?gfVrNjFCJvGKr(#CIxZw){4p0nYyk z=aDjP{1>o4oBqdV<6YoI*pvUA!yjco#XpMNKo$Rs;Id27jgK7nL6?!gjmSg#0VQw1 z6&~nu+@A*D*hqJFMTS7!ocy(td%&qz1=3%%f8H@~Hfd5ymay~Ou8cr5*6Hr`}C`M5Cd`_helPJGkAb$?1XPJ}PT z|A$~X7xswc2mGV?l;_a&uJ!5>3kd&Uy1oB^`<@8pOL^~h{9l3K3iL`hUUKk5VA0W1 z@)!T_iF-!6@h2z!i|?R5GQIYCJnnac<^11d$NhK&iJYxsSfS{-7A$9iUH7NKa&Fgk z-v^fSg0A}}i~P`EyY535fq$N^&Nxc`ZUW1B>=q~fC%|%kTbi}FzX$fy9$h@+QS$4` zGu(sAz{s0ibe$mt9pZ0yK zBHf{6F>_{FcetI;Z|V1~*e*3CDfF3i!Kkx-BmVpZh!x{n8De1121W1Z zFHye39C?QS$uHx6VY)HG@&6_n*;1EU|2q6N);DNBLkTbIW8=Xcxce18-1q}{l7`;{ z>+6&K*Rvmu5=fTge=0bx;Xi?^|CWmHQ?Pq}P|_=Z6MO;vjYI!kU^(|nwp4!7n<*dq zlTrt702>dbOXF7V-~0o4@QV~bU9^$%*7)gFu$;Gb!=JZ__P}`2jsF?2oNFUG72iz| zBIhLsIr#T)cX!{}17G}3clSqo;H&=G-F9(c(%+P~ZX;r|n`-d;}q2!7Svt9szy zCuyJXW2IAH|4(~w0%zG>)_LC~Rct{Bi-3b-;Ef_W+&TNAIHuEGoiu5>i(bHWZqC|O zNp;=gR#h*IyyjI@MnIy25=YU1IN&QPZa6Mz)KM9iF*-WRsACiyO!4CFKJu`5ob4+k*bL zCjC31#XnQcf1cX|*3Xmh;WE$v4fNg6&oT6?p{pNh|4Tkh`8hojJzf#NZm!Yd4dH!I7{>uh^eZu}#OaCnBkJe}#y84m)Zf($C)}Xf=^lKXQ@BJnH z{i3DudGp-AqCbu=>H8A>xdZ+1?Ms?phyJcc`X7hB;hU-&UEljv=$mWwgV4uo^oODI z8vUr0{-pfFWFh_iWzg1%CB0ulzZ3c%=+8ILt&I1-Xi51g%KIg>wYt=kEQS6S=m&WJ zO@{to(089)>V2o7|10egA3?rW^W|xO&2!$r#?Wrg2lFHSdmHrH8>(-v?|musm)Gbm z=zD7PE1};~qwj_OPc{1O(7#fn?}vV{M*k-CU)1P_pdWMZr2LOUe`<}sp`iUW`X=a0 zwf+sEUsa=D2>tpR{bkT^snJ`|AFa_}1^v`-o|OO1(4SSKzZ?1mHTox^S8MdILFYC4 zkDxEr=)Z)1O^tp`$^5I)&xHQr8r_F}ca1&-{d+a~4D`b_`W*C9tv_E5{frv@TIhdS zqwj;hxkmpG^qCs{3()s7e?F5gk@>cDj`C{sv)0%zzGO0gU-Q?T4;9V&`8f3b(4Qvh zpb@VX_fPlxu`d5$0C2S_CCdo8s1M6&HG`n}NND@hd< z{rHbkKk}>i?K9Bgds)%f{5^HWPqSKI_d>5y-j1ZF{ZIWk{2}kJK1$PXgs%K+rT%{a zeZx;o+W%~FdfSU8=V>nVPfni4capLBk@mh6`o=$Gzh2Vy{R4S^?^5rvW`F<8yU71P zEcH%ML1}LReaE*h^?uMieV+wLb5M7T?m(G0&eiVm*IgN!!e{DfhIpS|Da#rpg#z`MrH0My^P=BvDfq-g8n(? zo6sKuII8li724$@`4Hpz4E6p~dKaN9|5|ze6VP9OM*Hsx{c-4TfF?VY-{DWXruXk_ z^w&avQ|MQA=_=IbE-%@-3H1xOD=r=&WvG)G&LVtUW{&WO|-%+D8==*B) zTcO`nqu&o5{q$tM{;M0V>Aku3d>gv*XO;T>DD*w|Pu~9s^nEq@3sA(oqeg!fbmf;U z>HjU`UH!=XdYz1aZT`L)T6|lt=OvkM4?*Am!sVVUL7|;(=J)N(V|~JxL-(G)-1|cF z{PZ&AA6@P}*X$qP3jN@1%Ua&ce0Xo;`R6cy#P|7SX8vqL-$QxT`S8_`=E052y>;{a zoela=pzr_mW##87^Y6aL(Vq#G;YZs0Ug)i#narQhWPZI0`Uds*Kji&tzPug! zz0mJA>EDE)UHo1tUd`{nYtZk0Dz;d>|4j4#&q;rnAL-veZqSe3sh;Zn^umX@%N<`< ze)v-V=QW<+-k{Gn=+`yqZ->6&1pbp$SjOw^&<~tk*76JJmt5w2fqp&Jkn(=)73^;> zULO1FefYyXhkm|!?)?S($Lg}yfAIbp=!c;_^ZYBJdpPZ|ZL9pg1^N!sKhHdWEA;)) zm3-@Gc6eZZqsg){vIs%-t#FszaN3_y%rx)GoPML!|wZr<=(EG z*VJbX+B&n``zrJNzX<(>_>5A9Jiie`y1Q%iCFlpfNS_z-{MVsx|loz8d|F(Bl6pFNnPNJ{AK98v9Pw9OL^gXASwLF3P459BhwLCt5UIG0u^9wdg^~cvk_m~e= z|GowK0n)4Uk@P!7QjC-dRE8}yGf=wF1sgaZO?{AOf7tZL zGrorMfB%}^H=6v9Lf^BCKF+-V8fd{JSb}~MT-kqvevs#HFwd9K*YsTcUwA>vJN)nH z-%#(TLcbbX@C^Rey#K7PgT7^Xoc?ZT!8%}?sr2uK7Tg2aL`5HcHSOVY*d~kCja+BKUkx0c`g0(17VcoO!RrCwm#^D^jF_-UrKYVY^Sa{#lx%{+fU z^gI4`srSX^`SUnf9{%W(Ip2{aer$^otGsN&lYowm#n_ z{ZZ%#pdW9ZeBUsdz_aqO-4 zJd62k-aiZd;HSX&s(A+OyXr90N2WT(%uMIwolq#*6yUEvh{~3cW@9W&e`=fB0vp?-Q@>{Ts7i zg+ELA%(oAk`o7@jc+vbknZN()S1U@=gH_w0Kes{O+@No5&?g%7*#`Zk4LWPkcQxoy zgTC0H|L+FpntGIzpFw2=LY>N4f;14^n0KmeD+fBgE#8=_4Hq3KB5n@XtvC^tp}iAcwO(e z4gFSV3wxBO8#?}V_M6S?dXF{p@jUd+FTbw$8ngbsTWHST$MC+KzrP7B_&<`r&`ZC; zd}e>B^80+~`g!(7==yo}P5+JcSKHrT^+(k2**brz@2^7NQ=^~oUiJg%$C>(`gubu# z{2QQeW`D2tpWlFfnEmgPdH-?mqdfSvH<6Yzn16yKcT-~ywrQ*vL263 zXu(0w&HKLtEqKV%zw&w9AF7My#ierQW;D`vLTg z=dV-#cv9YN&=1z=1iJSGhll0GS(9eUuTl$A*Qvc6`z6X1&$k0ciA9%%ez27wS$y)m7@ZFCvF(0^v z_FSjaKLlOpFK_)z`lH5Q{zvG0m=6_y`U>Rf4}as5iWMQ{|E|zDGj4p6&hN)Q%6w+M zFdbF>zU1%eKlqEM8Tuh;!KVCPL%$HlMX)SC+tA++ZLKZ!e)0)A{abt7&zHc}dX%RB zC-lRQ)AAoF|I?A*KFoRl87BSXk;e&6*k4_%-+v17v^qa|9QuyuE%ziwgrxs@7;(Xz zd$)Q2`N-Gm=j$&ZZ>;n0pYvqo8#R9Wwa|5b_(Rb3_Q%NA>ipqd$k*!p<@Lgtm>(JM zXF?19l>FSltbPvkz3-{$XY`&s_52yV&ykCT`FRq557lVN@3sd0vIgDjuW#-Yqpe$(Ayx837_4CV{+n3Mx`sX%x`vyU5iWrPExt46N>9=?IW>joQO8sGLgM3EA zJlRQjH_HaarL5T68SEtKM$zjRYlCu>oG%7zIVmfu*WW2FkxnJv8WroC>pO#FG)gW@ zeJ7twi0XSOK@~k3s;VUC*E32Sk`4dqtaL5X?d_gmoSj!~q=D3>*WX^--Wlmn`fo2A z?WD!I_04|P8*J|+qn*Kd@X&gj`CWr_cYPxtZ0?>K*CDf$7D8?nU*LDp`Fh zHuIkPut~FfYsJRK@ZxZ^k@o}ND^f4do}ZoD1uSjw#V3MjaMSTKH*N3a{XPI}S+Tv{ z@2^~1-#I+Yi<@>G>!xH|{h5B_OffpYzM1TR_jc2*XKo5c#ny1NV~1;zUj&5}<%t&+ zzMTduGmE!pK5=F~aeKEOK0GzN*35T3X`XFOTJK5MQpL@ZJ8^r! zU8~&=*Xnq$W5`{*U1!&B*V(n(b$0D`o!yRg>N@TIbDehoxlTv99aGYEI?C;srf$bH z?Ru@F)Q;KbcFZ(4YR?vSw$==CJC>x^F=}4NXm}mljn`3z7q{!;b<8xcW2Si>GtKLm zX?{nYeXCur-?4-HR(r&KtKIj$*PbnYM<4ipdq(KNV7=_uA|&y29+xC`C(h=*Q#e+@fkWXA*w zgZ5+w#kke+VOKLcCTSRURHdWF9doZ^+J+rlTG%no!j5Scb!-KZ)vij^afn47^CIdP zjL2>GUeqx_k=LHek=IcdzdbP`zuluz2PYUY;4tDYysvF-U)~-vw=9cMk;iKw79bFwn`xP+N5ucwMuPP}Ar{N&-=Nf3BtWQPIM%JrNmn9L4uE7@7I zt;56fTfIQm>MrYJaJ(jzh z#YO+tvxiO{Ayppc%nRT1vdGOHCmdI|D^+;-`M_uG^ zI(77>GxdAB++O>ArgOi4q)2zq$)s>0$;S<2I1(>%JwMCh*wXo^>uz>_%U?ggwXq$< zDqH!ia@E=KxZhtzT(O>Pth`Jno0NNte@zC9%0I>pN<&6KrY|91$e~V3Ku(iPsA&q4*4YPiK`|>9L9~xz235x#a{4S!Ue*Z=Cr}p}V zg128%sJC|`)mPGA=9f13c~LrHUM9YsWnk;q+AyOcdNfAG_U;DbdrJKsSEel2`~6H- zN56mgv|1xK9oCYb`lA!O8!NJmY8CNHScSr4xY8_1-1<04MeMlUBY8e@Hr6+pY8%PR zFZcV$`TsD2C#lV>S|*c3Ao&;D)b8B+`3-6<+d5*XdbOl_^pTw=IkVrjxuK=GS!t8O za;;X?rn1a0CZm#-Ab+H4Qx6fFttXpPR zQ^GkomX+s4?3z=jR(Wq$<)_xeRL_1Qy4}=1EyC1_ir5PBJhSuqrY3VY3|qC=({s2b zqP>3qr1~peY=$HqUMiT3w+!`Kp3GTB;}M-l)tr)9Z`)~U+kqSAK~WaX1sS!ss9BAg z8Wz1^k8R3%wo&X9vI4}6XtzG-)R{pCf~C^K4a?x$JmC#4-mZW(FLVLaCy zyFFU9<#1IyO(n$b_m3KJ?)HJVRkrjw_Odc6?c5Fu8-~nDZF7#x$hk~ax4p|M8NB8w z`u$^@n}yo6Wqx>m;AWAXghdc#o;`hXctLBVqn-&BSZ-n`#8hv4ZQlmwYN3UA#_M!Ct~aopGq!!mbW+u=ZI(ti)hcRRue`SIp*(@&XG2p zda3l!DNd$(L&~H`Lnm@F*G@f{^+rQxjNx=cP!FZU4HiegZEahL7dwlyzs^W8DWhoiR8lvO zeqY}=6vKHaPqw(1)Hc)EJP@=3)l(Y^(-%~xI$m$sQ-^Rq0n#^qJ|1!t`jCb$3>Fa zvA$9Sma6;}RbqV`ZuhdZ(OedCi)(%1mVOy{Avf}swkoPETj5^SmiEbIt0jfu%eKsp zFWXWG+w!{d?2v)k9TFhB>%ERb!nU}gLo{!92)5!|4zVI$m2m>~zST zoDR`9GMaWzb<7o~Lo(=ejJOlE=eW}$8f=fn!K;s24RbrBv~GtsxKpF#x0kuwA-i@v z7N6Ups-0H{)b7qsZBK^|%yZh)!t>e-!}HoZkk=u~^g6U#U9WX0g?y{sj7}v^hl0Sj z+Uwizkox)^5?Xg!V zC;+1l1z^-+nm`Q4cCj7G;f~`m>Nu674z)}awr5Y&p(l(wx-;rH(mPbcamSg|p{j{H zCQ96)W$if6*YVX%`V<+_--`U-l*xg?$o`)>z#C_*-u`fRXKNRQ()var=6GZQEA12*jAgLwTpIVQ zo)ZiPquuSD0b;(v_8N9}O6{QaRj~Z2ZRKg?bJ4Ym*ft%{^{=}^p4@3YqyI?r)C;@> zVObKzrMc#-j&kZ()OdVz^wkB`<$fCI>#0_Y(5Ni4yu?QP6S#3uCKDZyJ#SWMw8Y|3 z%_iF|f+Vn<+~XcomRgFpf5p7>=aVfeV`XJ%*=d?5Rvx;s7GLb2JUq;G4h4^BX~-qP z)}!RMk=Y3fID0ZqqQO(zki3y~Dcg;d>zr&J;4_SLumAJ*y-b@w)!I^Nhp1SD%J zDBR3ReV1!7;dg85sYj*);rjMK-`?wWh>A1|y{z;dCqqY~S0vNx5vhZ(F6cBJxs!!` zW}XJ6XSspd2p+LwRkJD9F48oyf-ukR#P#yY>V8C88|&U?YEU%t4aY|JQ+la~`e&jI z94jxqWOQ!ZW#V~sCW*p$h$XdBu&xbi$B$H6Z&G9-7e@9D_AjbdPUe_Vg!)tkH8dJuH!l#q3@;BZBpbW3 zm%3iY9$MNZf=|a1dt;;Wja6ZHiDKARAJN+GZld;N>pOIOuzKjkvBLwUQ*Eo=QQY`h zUKCjxl~FQT_q9Bos-L89_EC`AM~|I4eMT2amA%BlPS|y@7|yc9pJ?^3GJ6&adf+rD z0^dP3mlTtMspS|eJM)3=iZ#r~H;U0d^=5*_8OGd*dm`JnlE?_fu3Xbh>~K3wT;@Yr zq(N@P{Ce};Q)Ar{LlGN1iIUh(9gZ#JVrsm#9CT3?GQ0~$c9F-FimcStQ)w(>{YRt+ zZVQ#Qw#O(gx8V@_{lmkp%O^LFpt=_E>s-=cC3QxtPk{H+m(R;zMKd!-NdTS8%7p$rAEsHIEf|5A%tN-0&ly7HiA*wgPD+X;+(sw$akWl<5u2{lX8 zGB5L{zT9rhsyhzhn~twmT3~HfWb7o4QQpb2+%9$|s+_484vnysDYnf!r&gyl`B)n{ zc>ss!Bx#xIy?ip2{t+wC;c8pf4pS=6M^XXJ=Ez2tC%Kyjj+a_N)EraJr@gE9h-zf1 zpOa$H8TzS>k)##J4NaTvw3k9nVW~7!$Baf~N)vlP8hk2PbP=>;ow<_DQ&(x;DC&r8;j&mnZ zv2KlGW~JdLClleHwhc;qmztU%|A2-K%$JPa-$M;lIxcEqr@2S?9eY@ZLD^J;{_z;l z1T$-2zuMMj`^4bl*rtq2UfEqdB4!s8rX}+2oJ&E9%oN**ta*~m*N&+{(6j0&f}EAj zozdk3uYY6bF`6hJ zv+dYPr^W@8m+*TPTGz(gLmgcKPd*Ach08YUTHR@^+pOk<`k%5K{A z(|@?J+4Zq!pDY@Oqr$RK(2M;A*1@&w)&H@cYnY4v10FJFYuMX*&W_q!wZ4IkS_Z?N zdqcHRf8q_~I79=cpkMgDXNOK11`Ru;f7X_P*e|rUmfAH|+XU;4Q8?uBEw(nu2V^>V z;5)7CM0;9JntL`AB*9|>8$#@zf+Ww}##ZHo?VH%t!J$|0aTtxd_+st;GM_z#oYJz?X!`P%@pXkJGtJv8G z{y(Q4Z15O)o?^jTSb6DiqYfKPpf|(Jvod?u(m*pJeuAlLhPtFo@*p-ocH_y6Z(EB4 zo5-?c>7OoMwp#$;VX{Lp;-a{S3xxj}I4RTIPe*n}a4Bv;f&+ryFA+yPlU z&0kd7jrroWSK5s1Uc6ht)Uq|Qe7Oo(sg=Zd16W~UH*N!dyYt3V5KYcS5er|GP21S7 znoO;@^lT@==C=SDrCCwmX?5e&PKripR9vVr;oBx#{K|X)5|TJByfiBsQc!=N4SJld z%6?s8%~Uz(Cz{_`(F_)6yMakBd7%%JT7^Qg} zg=uD^y^FliD2Rm16c+~csPnXA_L?-MAaG^ZEl}#C7LJ=T&5lx93WWnOsat)B zgX2FL$AnoP5MwPct^oqHHLU;@CstI_tI6e!VUnAk3mwe%Vmyg+OF8CF4^W2#*?5bs zJBsORediKwoQF7BvZcokf&`{RQ|}nI=UvBUGqoXWW^*j3IyxMkPm~{tXs~4OZ*0$!~uaIY3NpG`mePws=_zj zB$oi=$tuP+%1EK%F3M5Kp@ZVu!5xtEC#&3~tGx-A>*n6n+BNhVR`>!eh5|v;#1Xj# z2w+;86&Ocg3mV`_jQLTsbK9fYDs{XD`~3+R!8}FVS(t_BuiYp_Z{M6q9qj2WX@IJd zc)-j0*jd9C<^ZL7{djQ znIH#{Zy6S0hCiJXkZW1$vALRjjTx5)Rj`sYEIh}<94k*U|LR9=Dp$ZIO71sURKY#C zmS&|Fu4|Bmm~CQN39uGQL`lXVAIOji7-e^7t74X0?cv{O!x(65@xf$+GaXn4uvi|w^P~( z0?aB7AuLzeZ?w4(FsC*G+%9I@Lr&AP`d=d_nAD3ClYL>AI_=;QaX5)9p3gyu zQHMS$V$F?B-M+NqW!$l2jr1wDSfh%eka`s~&&Gv9;ByYkA2kr_3wqFtu_OsWlfjo2 zjk6xgcr0GBgHsb&7}fP+@C>gzkU1%y>7XoFB}WoiTAmksnt9kegAoR4#Yj1=NDZd<-nuk}}gn+m$S=?wsQZY=hk;tGI|H?B!=qfDD2w3PvoK<7GU)eRrptGNCk>rpzP@qBVI`SG>GtOg24=P zENNRm*9E^aFqb+sCsJVLH}RJ$;dg&xzqcA4Cb&yoU2o{o?6gW52*X~mk)-Q z0Nd~5Xdx1WaMoIHd!B-J!KL4}Yq^9#R&FFah^3H}!**_MZCnQVeN`zdy&WG ztUyGex6IkeBOC!Yw}FC`jjjk?r14xp@#2AvRedl!X{-Vr>}cqakWL0-1gy*wczJO) zt5tZq*&V*~y+j;J`iaFYjX^We^c`Q?y`jRj>Em~Za>CNF2s$>+_U4B}eOFq>r#PRj zu{S5Klj1*WhNkOVi+WZ_b%;M;H@(8VKI4Ja)2BNZ7Em)YJ?`xe=y0a*+VVL+0>MFjBaxW!-mqrSi)*pi*)FPMHM!0$4t!Tf&h&lM)9tTJ7!sO85C@RY>*e{ z@n_p8`XzyE#LLMXi*h(!xx;7fMPNaAcxYng;2TE7yBdejz;lx_%7K9f6vDBL1Y~h7 z2#Cj7#MQ(Fv^vNu@y1o;J0+)&oFKD9HvtUJ#gTboor0Eq%h?+Q;4^q0P)im}|6XIJ z7z$9*6f}XBEr?MPGLYf!hyYKZ;Ejgo2PI&qNBMAcQ&!kfwQg$hp6UtVFxPiTC)p%` z697JGK1r%d(gS8NS_)v81IvZ^)FWkk(^YjYShjUrap}Z*N^q`i+vC2EHc&3?yWour z59=dgD~WdGvvyG^Y96+oO|UAdKqFo&E)6zKc5-bO3~mecUKu#}y6=#E~mv{xK(Tty+E~Bgm*y>q&<5noN#C{!Bk_%hggTB zq+Ym613U)MmQM3Lyl%L?;thysUCS>c4Qr{B&@p<6BZNd#+#!h7+sNL#fp1_Im~@_? z1{8po0HIQ7xq%UwwhBDG#gNE8w7U2{lwtk=V5Y--M_(^s1DXNhUVvJ`()Ya%zOv1~ z&B<3fT?Mq6r!F44&63Z@xOVW*Alj*J1z(KYj}@CM_|=`?QIc?vLhi#^hFnGOqH5OF zuU=Yal53C#<`~u=ct*$Ax4~Z!4Q(=4C#m!&L8T`F>(~mg#)#6S0CK}zysqL9ZkRZL z4<9&e4K5->;Cu8wvw#9ttM(I+iX$J{58#u4s4T36*L^@7LiSZ;Q7Iy1*Vp&eu)Z*n zb0QKHv;n{rj8N9+MMB3MEx;3F#?bEQ3F!PsQ_TrvC>B_R0Z zs6dKE^bRBZyc*^Yd0uAO0M!ujF!#;DbyaL63VzuEL0;h|z#N@SO~JQ~wT+w{>&Vt6 zqRdVK3i^iaXv-PmgO=;E!KZjtqZbH$Ac-t=;nI)iw~#!HRJ_g|tdsgS7`bdaT2chU z={|3`@qTY`LEI+~07&vxlT7;?z3?TVw3_opz+(z*uI2BS`%uYCQBeb=XjuNRb z=zg8Xssi*g=@U5?#`dvX%;r(C_}C;Aev+XVE>bKVYvnGgULz1LCSaiOIbsKAH0GLf z?Z|p6BoE`sft3KhmuFy!X}&-u_14&%ba_*^Qy>V)Cd)$wSfGP9D}Md8i%@US5ob?6S3-YhO)XGbn8u z)JxtzHy94jtFxPy)Nvs9kC`?OK9-7Y5a=OH?$T!guk<%IE}ZXsnD!Ar43B~s6CDra z@M!;nJdAHq#S@ZS#lfO4i=2R)UXC~;@I_Fs=H2Y|Gk;t*@`j(ZV#4mgQ4-BDjOVEN zo*0$B3X|ZUmS72y8W?tZDJO@?ObdyjW+O|hZ6?eeWqoT$ntvdXg!QR#9W6AftaQQ+ z5W$O>PvgeRq*Do}gi1LJ0Sg*j$dF7#p1!(Ob5xCeq$PBXC|xy9Q1*I`DrI%Tl+YlR zDyb-&w?^0!Y_X&y(9J1G;VcdAe*_MIh2a@@ZDbFD7ROYDlhy1nb~4IXET$nL%4}4! z*pBQ!660lO$J4>_24_#N93e~gdhQp%LdtE<5EW<$B93N(Rb4Ih=~XxOdzkQ$KC%YPUe*5yEGZ_6uxCpGgyqWTQ{U`5 zG8?-twGeB=ZOx048KTN83_**wh+vqz$(7f+QH*~$$<|QltFAe>F-*BacrQA%x_a!y zt)~IJJbc><#o9U8AgrkjNM@1gEL>~=Tptl+JcBPB;N$JGb0gyRxWUgF(|~P55HQn>*=#J0j6&@#(>|kd28r zaFbauUgzP&f(Vyh#1Y`h7FmcgdFtgkqiDwCxG@Z0;&=#R@nu33Kve6h`Fk9U@UEU* z9Y~CvSlA*_(MLc8POwFJr>b*!`1s196K7X>oscV_<=7k(Zh&}wjtz8tUBK}+6|86_ zt%lzrH}3xEQUFoS(T3qjIbQvfMA)2UDBTS3EAXkJQU{k7(F7WG9v0kI+UcBHnvk;(Q0!iW+f>S<7XLz9QdlpO;&(W@iB?H~k#m*IpQ4ErHM+=AB0YPQ6i_#%k zk#b3aagMwa24?o_#pVTG4+!CkL=A-2f=ETW}Nsw9<2>}X4dmm4HvNzoQ_?H14>)1~P6x0!a5&82tF4cRzdsg3DXe3Rw*RX8hx;_K z1<6A~6(r78=TpF~BRgkn0>2q=ovUqE>EdYOvO|KQ&7NZP61t!Fm_02RX&iG{CrzUESD$s(e!AN-yn&II1C7N31RbG0xBM&2e|qi`I|dJRoZ}H) zV`tK_0FUVOsp%ae`ohk_YY!x9MKR_94MDr&=8Y{jE^jthLJ>cW*MN~bPJ8^LtKcrdr9ebb z*yPQT1Ob9TG9<2#JO>ecSCT0qr342}of6E(l*$#FWp7k#Dgn0S89-KHfN?Qt8gt24 zf>Zd#GS5Iyz=jaG0^+`F`QtcW9Ww}tzHKR$_nBP+S^MRBu_4zq@d?HQ5<`DtZKOqG zFgnu)+A^HPIHNKVae{R}w`RwZUA8Cq=tN6$T#6 z@wieG+@LYU<9f%cWbwT8$9{A8jZlqr z&ui(3v?A%??&x3=5?l_%^pM&6bWlwvHCo1s?7|-e4&L#(*&v>FCa>HDPo4&wK(_f}rBM z<|a5h5q&~QKrIlj87E|spgDCw6JhBbeYF}Ni2As8Y%YbnJ7t8MWPgs=d0tvE zI++rtm?`81NxhlmW*m3Nx#{hZdi491S(wNHjkVserV4Am+Q3lP|$;dRcqKbIk__v92N?e-N$-sm=&S#}8Qvt@uFZ028 zdJ}o?RB};{|LT`o7x;YP#>MW=Ib~sIF>hD5@uDUkV<^qG1!`9WN>g462N&0)6&PjC zde4V*Uu(()&g&l-uYb-4;%(TRPHHaH;|YxlB{dc0W?gEk_r1pfZZ;7`I1w0r|wYi{ff=$fqb|N4-=4=%KV46kAdfC4?aN!65 zT1fDo0-fEw#kGfPT-?~Uq2C|dRA{BW8Mpww6{Zb7!G#k-cg?$d;}+CxqG}$8Uxj>Q zPQF!bdZo050#0MfWv>WbOwVa7(n9pn^KBUzJ~hkjn3^@NLYOsx_N7!)ati`^&XU`! zudC!v;MGatEo|gD3vW-}uENI<1ByqjgN&QDw*ZajEWUjJsL>wJuEB_5AKRq#`-T_Y z9~^kT@-bMLG3s4zyx=b=<1%bDaa>px$QsRX={?>ja)a$-TSm-ia1HZ0XI@7g>RZ*R zaj;3%GjbE)!vy-Nb|GM60k+IWVPOX;hW$W{%v*={fhj9p*F$51a^2FfEfpI%bAK~a zqQGAQyto3yBfvM@c^Bd*2Ca9#>Cpk>t9+Ez<=^1-?l)B{c=3tDGSSIF^5uYuIMeXF zm~)I!>o(`=^jhJNPPTS-N6bxQ_%x5bG&*N==5ps1S$;k*&oB#Zc-$SebD`hQFb3YC zUK2sbEVN>u%{6MafmxyxNv<9u`Qc(HqY2>>-Wmq@Ld^HGxjBsU4UxB zC4f){^WFfW_Qs>eO{`-2eRI;QBYu3ftvyeZ(P&*9!EezY#6(m<&6zC--lKq-D+8?d zEhK=ZqxK!VxP2s#XVZb)oY|=ppbE+~0lf})79W%8IR+6<+zu4>v@vHBj2PMVLHtEj zjfY|k?8{WR3z86Qe0%$Hd=}y8artChN@kf}-cewBI7Sj=`eR^kfx=2Qtk&cYP4<;@|lEmH+pEFS_ z)P&ZgjBxV4007Q*tg0z8T}q44UlJAFMYrN$Bv})5Yfx-oc`Q4g=^bF>)E9#dtm;fJ zVTBfDQCV=!^96rxQtVU~rh~DgQ?`cqLDw@Om5dt462AH;EJ`D0?2R;dJ#I3bL5E3u#AXE%C2s^Lv z@d|V{DOjf&Kz6`()M{U46)TT*5tQ2wQvV5sk^(eDd}UFo3u?Da=`9-^7Jd~_^wno?R8(v>j0GqV=+)pmupt%!jqct^)qT9{PYGM*>l2V- zfEX2SCU>y!(h6rkZuZI8$8biU9BEl-0Rom|afruF>0mZyDy*(;z>7`bhkS)TFL{aX<@_?DszC*83!XyAI&edjyve@K0~&*{qeM^Oj&SA>1ca?2 z*4lJ34wfDUlD-cY1u%)3bF=CkZ6+7i&vBOHus?0RU@oV%RyIJEZc{#E(#(Bd6?7wR zS9864J{jF5jK&e^F#1pT;o(<%OjguQ^KW8^%P6~mkARo}+vR)cLG`vaXHxOJv$=yHdc!aNN=nTT zqv30e*=+7c!byq!h%VL4(MbD68y`fqmSs-bgbF|?E5b#>ZRmrhp019s8L|ZdR~NA~ z@Qh3MxhBoZ1%xIUM?ecKd@jLI-;?Q^l?yf|S&rNgqgoM@u2#jBXNDV3iKT{^ znZs@yew8l=vl?R>!ZBgJ zj5RgpN_afz=`*R;j9eU*i->m#^F%f!0Mfu~*s@e}{F>&>CQ{ibWRvYl%aXvwFcvQX zd{~IGX%4?V>ZDybB!U-Jff)xa4bx!U3&gQv->Rt8k)$4MD~>wHHOq|PZpNN9!0&X>TN#n=^62SyG z9I=3_trbhw%6Oe{8+0<<-neLio|c)-LRC8e5#{`FGdAEP$MVX764ySeg>@M=;7E=P zFRIgQuyb<_mr-+f?SLL5Y^I+DmIDKe(?(ez@Syf~u)Th6Q!yXh)R06KQ5FEAfwgFD zfa(dN-OX_l1fK$7kJ|z_hSY>?3o5UfX@BlLZz3)B7;Fyk-#Hh-n|6@dsmcV}%V4a& zniiuY7OZpMW3GREADOagBVx@= zn_b9Vc2Xgd)`?K!M+Zq)iEunGH#5}hj`^Vn?bK~TF) zsoWJS)9;T(U31r-sGpR8o2G=ysqEwfeF>CFqk!6VS>XgEjHc8puI5ySE*@Ojf&jPzHhrSF zcM6IkoL5z-B zO>9kZ{G_>D;fE$BNqFq2Mn;W2OYIr`{>2g4f&(S>IFzGq&{uDDG|wonx!Eua7(5p% z3xo#|ejISJCbsk=Tqd0wanOUQo8VtyO7p{eW0JT_nYBJv!Zb)Rw`fBao|b;N2R_(*TfZMJJgNL};Y|~R+eJGwSa?zd`^|~MN9soODnu4wP!$M) z5n7}gCbUNMXwwc{3pOoJq^ete*juCVZhX%^IPiA)@Au4iaYs>;JhcMu)XuU zoAO66qq{4lg&pRd~QvV*Mfre0Me8LcH4X?e1p# zOC=BQEJ{6T7pK0aT@r<2T2Z2N z$?66p`G~l>hdrElX7d%Z6}UJ?TvqD&4XtomG7h>bEQXt?_p2GBF!@m7-46eMz$=RoHYG}yMrRwfof z`9$Kgy>nT4W)mR@IoLr857u7X}F=c82@H@cs2 zp(w#h4H=0EPc;2%EUyk|xx5danFAOc0Y`i^tR}FnHXlU#WurUM7}_r((x%oqi}kc5 zM4ScS9NM6`OaOONqcTn?p59jq9kM{X1bR3WC+7Aa!Jn0}_z^6!+uG>ddB;5P%oratE>?z~9J{_nTYetR`>*ak7CZ zWfLnK8FkDyu#C(BAwtmZ)t%%QbzLWHHvv-sQl%W?73_yes%yGvp*{>3NPbul;2DkH zai6893l)cXtnxao?6pC%IP2pGq5dE5p(2G-k~0A>Hz=L^n!4}%f*O<*Y|UJv+n~H9 z?#muL(HJs?Mt~90-3X(Uk_tBf4~)&N4xlB^jgX5Y5o-~Y4C?P#)L20!nYX3`;Spp> z3FuUxm?Bq{m*TFI8lRHN#OXA4-n`uU8fjuBHPg|(sw(J=5T?;TftbYNC7f7gf+DnX z-JEq$j0YJch2|KGj$-0@jLbbNOJGs}JRzRye2YsuzB^+B*+Y$EjI%Lw$~;2aq6)8& zR`;zjMhIOs9%J=L)>v!-yam1u<^pIx=bbDrGpw1n8o51YyyhCl^Iq_n86SpHR>qXC zdEK{QhR?cWW5oP;sf!Y-oXTQaRm*&;c|6G+!6{7C;}Up-2pC)ID*BshK`kXTDfeD< z#-Zm5Q>hy4<43Z0xq32(_|pR1P0U0-Gt4Dcy7_z#D@z7^j?w4xlJ= z&l2w{_Qg;5Ea_64)Kwv%dny4CAGOb9x_waU3t9?@))U+z#dfCHVbn{qi z5jbVeGXyio=B{8i`?_vq9#`%CXK>q9N-f`+4uuVWs!T71 z_087iY7DvH*~i)Mx!-?6DplL@$F-`pgqE!n40NGg8BC#F$5y`G3+ALJQ3=?1gi#fU zCMki$=3|55Df}63pW6E!03m^X?)ML61VY`eb4P%s$-RfrqXFRVpq0dil6oLY99asnw9s@6A984-FzTG74gk6J_*+PCQcL=bxZ(Eh6(H85{ZRCK6%}p zYp+c3)Z5-p&dD9xXK|MpBXNz!=F|j~RhN!EGuTQHrYcKc8$0?8IDJA3;4Ol8z!(T~ zuMDvC&2S1Cs$e3qkAwkRn$!ZlxenGj<>KgQFG=koiH$9gfW}7>YmCATiQ6a^rgB*y zS79P$vUP0+o5M-x;XF#3AanwJI7(w3v6)z(WHCDXXQQ`}#;qwVZ$<-NaP0;h@FxEM%WvuP?>mD99 z@tJXmb5dgPA}`$U(x)?MXEVc5WY+STmCX!Kkt@vxOks3a_=3iSrXh^VK5M3C6z&N! zU1(5Fz%$(1+PDlv=4OFq_=SXf9y6X$r+D#ZEF9(v-W@zsJpj9|$5D|GBJah#z~BUycvmuu@=^z50$kr zJM4~f@yAq8LeqH#fwPGXsV9#yP*y{-2R~SAl;%>DS!&btoLGavwcuIiqHID1qNZn{ z4V>L#17EC_<3|T4PM%pA+y54(>3%&)5yBN|`duOq2_Umdn005hJ`8?-siqHobe7OY{EKsfR2({&<+6A-$dB3msJ^0A+zSk~8 zHwO$+jLnb8A36L02<8(*L+mLwdmOS8z^HMnQr%X!;2rM(vpDN3w^Rn7ndt+HcM^j? z2Oh-U_YD&`T@9k@S3)x(Xx8CGbw`_Mwx+LFHJ{Y(3Ntvj3@^Q?IIE0pUG9hU0zUa5 zcncm9wzi<8s$O^`%Z+xDy9yJ(UC5SSYcq?f2#F%Eq>`rv`!(H(=3D`MB~Lt+6S&+PzJrUHZF<0NC$qAO)tA zUWK<*Pue}M_m9?M4RCux-%aRM2_dDzi4s3qucNuf87;%AaOYP()CFGrL_I{z6@sc~ z^jD8?(e=^Bl$k&dI0ta%*dez}Ionz5W}IPy2`y+?5P<)JlB3TeMisG#WpV1LtLkE> zW^?rodX@qwD=;#$LZNR}5A*^t%BJy`qhX3w2jf$ zQfLgUIyujIZJQR)!&%%A2j9{?wxs!*0`|-S8=MDa@qDr;3eRz(5+m&ez9Qg@3Ala~$v2U8E`EMj0*QoFlWCvy}kQm_$uV4x$h+Sns_08*9fguo3*rJj2vL=*dl{- zfa%hXs3g*TL`M-L6OllrYa&Xni%T&f72&Xfr1C;_@m1?!oK+Waf{jnOMoZuvtWHk} z^jk_W5o~Y;IjyT+U778VmB8gZ#wRQVf;Ns36X;Ra11o~&S<_`7pt>&rH5r7=7y38`#Ebx>iH|{D9$1yl1HqTTMWdf3sxo#jAPz|mKL{fUTL=E1K(5;d&9-$sLifW7v%nh8@`}SU3Q=*+t*2PW7(-Rh-iPSyYGm0$CWh z6MKOyD(mY7vZy$Vt}NtaZUjnqE?D6zR#V)}Y)fI&RUt}&BnSZ|K){di(6%cKAr5QS z5ynxNeaT#xD_5fqg2CL`aJRg@wq*!P@)%3l>+!oJbLK z-{si*!O!E&E1d!>WWCKcYgDg}7iD$=gapEWz=^8pe^pb|(6bo&8jE~)UZN9oCZ`x zT04PIk&mmpOF)Qfl6gM?}?THrWk^30w_h6F~TZ8BYe~Xvbt_~Re)Cj zoYTtamMEiB_(+Ja0PGRq#;`rcm{^q%>TzgJ=F`|B9A7`bzO!;^En%V;`K(#p0FeN! zLn3#B1S8?o47AjYLNig7T2aKh*`%Y7n-f@Q6BPDb>m`-%zF?;{XkgFqyD zdIFEyZbsu(1EVUeKqc&PTx?wNr%v3QSaoRp_L$>p<0fovZ1JB1iWTuw(F>t#WIX`V zjq)!``s0gs$10gGhibz_z|mS~^W_j6Ko->z)>Vr!YeWb8+LGS`oJ)OD0mK9YO7;dk z#PJvq>z_KNDdzAd8LLdfjp>Bv3e=7htk;00N1S^H%pnZKW9{a?HwWzk)d3u+*a2p8 z1v8@=ap&>^%<1audCyF?I;E(hrngTCWqN)zg0to9e6~%5@flcUPov~ ziJ*pFz{zu%23!QHY0_1-`7$v4!PRGAj`pk1z})w*J_92^>B^v*VYUS)05`C`o-wDC zDtk~|V3KTeT~^`$QXiE$xJK!bt7x(S@hHUlf@ZU$ z=q6t|I~H>9;#weaqXk&m7=&DTJ{V78>y)yQ0c}+hAWU&wSDsJiB_RHQdzO@-nUyBS zqA?cP>yqBmR)7+XduJG>U}C{~X%2TR)EP$>HE~#viAl*gDyaw8T>wt)3LqW4#CXjT zXdCqdF;a=@gM+l~xD(Ej@gC2 zg0=vhi%w{4<>rSWaw2-j^V!>o4rBowwonyVVv9H>Dx}8Ix{$V^yul8 zGlNrSPn>4_fS*O|C%C!5;UJ|uzyd>El9Xacp-qQ*fV2bdH1Wd1UaM=yPBHgtqe^$z zH&8DVj%PK=D@dzu=3ecm!larF5^jka0G<&P3)Evg(HF_1nx>27F%}kH{TvI% z(!vGuIDoOOKus2zV->8)B6*CFJQf(23TS4bdMrM+&H=1BBkKeSK0l{Du{4P=%-vZlLlEUatbAOCECi2UwG$FCriuh^I!L zJm$8Qj#JBcy9(%5p*BiDexBwS21l^9L1J)`=PjXIi`py!z(Cx}0Rci4#l?D>({{9> z)42W<=iIj37|WoPfFmeIu~fxcYC0zagFMcuCN``rz{L6H^p3t%R$Xqy)b)t;7Qqw< zHQ*M&+5&!6zr_kO+^ve7xGP8a4HW=1TLCc7#l$4Oi<=nF88YthS<-Eo%}HwJoA8C` zFNw!e0s}Ab$9phQ6u3ZynW?+Gg?J7}DaHc~Qltd)@`>ZM+|?oZ#z5QY6@#s{eAF8N zfgsilxVB@Sm2OKAdu7Lfq1XoI?b;8;I(+olKuOR?$4;Cc*rAxrZXD9U^rs1zP^_#t zxU(Q)KYC>4*e1O7uCn~tUO9Ez9-O-U#A#;`@n|5n6)T25e9X{yuCK}qwzWDMZVb<< zcjSh8g*6Dp>V!g6nRoJ|a-9^b$#JPyQ37$3Xd*f2A{NgOj0`by8CUv>YV2rRmcuAk zhcm}ThRYQT6;u+V?ZKreSXr@cOi_>G--CV1xs~-sM=X#nfJT#SnNU+hc=h?Z>)WT5 zmDAA?$jB=S_oy~E7RVTx=XyS=@`2UZmkuTpj#xhln)AwPcIWDy2bz5~rYidb8$(B| zlw|?RUao>#7})-mJ7v`l>_|^KdBr^0UOBLa5h+iXE=F1T$<1S{RV!E0gX%nwg|KyS zb10y{4s;a-ckbevGd#c=(xJItbE=DXMKg^JZb2EY32quQm@)p@|T{lKtj%a-krQgFe#@ zhec6lhi>+OO$Z(Rs&H*`A~nZ;!74?fI@|@aYvqyx8-BZcdpHmCfq)=w!S^Zf=(CYScg*hP%Mz^Y|;@&Z31UrQfDr&nt`Ar#oJi0^(LEO z?YmKN&QJ;lh;@ghwoXEbP;Ey&D21sp-%8AjF~Po#-CUJ}Ot4kT z`OXv~AFCqNXDMJX*gk6NLZi?O?_kB;E0vFAuT+L(CC|rKgF!X76l*!qXIHOOmdaIa zt6T<0zUaiE7acp?oBQV)-jv^K`F%Yf`TpixA6CE|3d%1icF;3r|~Q0%6kRBlDD+S`c(aU^A|#xAL$eMInS@W zC*^MK=-*4yS>~r|$5%jC?>+P_y`KEu^yKO-U9M2Ct-bg7xA%JTd)wc&-+P03kM8K* z@y=^{cl^g|dLQ}2s`vDmNvb#2-@A9YcgL%idpAyAQ)4Udy_sKWlRUcndzO25zj|5q z1El(?+VKNWPvBSHdlm1!YQ}r-;`tNJd-w3(Ju}|>FT5lDBKh6Rd-w9*ugE}{pQ_yd z4lQk!_wt`z?&WV@?mfh3nOE{tjoTmaxytYO&n@?kf9G=VjCw==SLOG<+I#o$-hI6H zK*xI@sJ*xKo6Ehew=DOf+Iuorf=)y?>+j@ O$?w_KQ(dMc`Tqe-j&Ixm literal 3343560 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

(6Z1AL4Pd|5P{K1EbPrsMG8=s?*TKwVIlpMgh6Z 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

p!&vJ*PQ(+;Zrq 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 z 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%0A8=q*T>YVbql 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

X)X#FYQ0)MPYY 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 z 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¨<*#f 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

{ z8^4o!%U}9fYy7IbS~wpdl}X5~3y>sn`wF7#Xn~6MLS`KBVj1>0IKYPAU$Y-4zrW^( zt^RiwAkhh=bp%2O;Cq!LDBO+b`_4{9dcmZF1w`Q31K@IngT?vY`XuaDy|;NM^L4Y6 zS^lU9(4rG_Q^GX6K9fe|4xh+eWvgsn*V4+I0!E2as1Ba)gQj)eDktrAnWQ!@j(=VQ~oEc}RLO zamHa`eRYmF?5oNwBcuBah(q*ISk!%>opFJH7wOFI6~v)^fmR&iQA#}Wj3e0R!lLvTsYkd8^K7noC?O83pt&E8){zS+v?Hf zcX(G~NSBKnyFd zM;)dqh?~d*fXGi5g9^qzf5fn0uXnSx-ycZX zs2wn8p;Kf2a?TESZ*(^syx=gv04&0Z?jvK`n+=mrv)S%#-fVo`Y&IALpmQXk7T~eC zZj2#vX}OAEY;Cp(?;GcC%sEa#yI}uzPqC?cfss0!S!hLq7z|LzRdCJp$cqj2_r9xk z{eGGOX%KTSPJ%i6ZPoux?+TWe6f_q?S0zeF!j;xWy+Qe2w^#}ruQO;aInW@WA7hXP zX11q#BP4roV`c;Q>Gz9HBk12S5|GABU^l!qJ^IH~H0Ev#a&_QbOVJVle`}!+tDGF% z$UxO`Tgqlc&_&q$B?@Y*hO?wJw!SuPV#6SMmq&LHShQvddMb8@oTPfku(4@@RI!Ke zo&7?FAC!#Lh2*&=i8W1^%&tmMczC_?d&qTY2LeC1(r6LJ`8ofUi76 zO&Y3RJ3p!R60cqgmVbyw45=BH^P$?C&QIE4`J6xt;a3Z>Uc_>D9I9SBKdE-2jtNGe z&gSX(KoRGi}7onVe7x(VpD6oE>l6DDvY?$r@!JjH8uG2G4eSWw7F zvh*?5lkr7FuycZ}^lW=4m|~B$UTdppr-bHVfk1(Y@i}^qo+>b1yYhUCJph*}UjEW2 z7QyNF)Jhd|kLWj6xKG4dh8$5BE^KNJ0jRkEo#n^(@d|%H3W26D$RJQ7xy)EpZlrPt)oK@(3C27Vu{!nSiWk7zdzlW*%Y_|m*fC+X( zaZpzg5e~M6;rvwk)hnnHp)@fu2#^i~Y8ir{Cgcbb;Ay{-CDfQ2rnsb5HFIml0u@y7 zd2*pwS<+NF#jLxk64Y7P;fi9O1_f%7wVF3oPBDnAs>D=7)S6EOg&&2)NSYblN%+rX z;#gWNggQlQCiHubDTBCaD%J1I#GBBj%fLT4VrLNjw zB6yPsej^m<#rz@{sq=cj1U1W|+X!|5u<;P&o`1U_zQ5f{MDWP>_ltu! zPZp&)Z*}HnBuzFxf*T^Wbv?P;7=WTEC@eUxFJM$!^{RMZGUOXR^R<4g#}f+ChRG$U*{v8tCg-NwbO^UFiayO+9ZwPdO7?X41Sf%_c8UEVwC zxB$uECpaBfMS#D~PP(0La-SL~io2(Wi;LH*vm-7nAoy4YSxpu&kG*ekT%Esg{21t8 zs|rnDWSC8n)G$)Qtcq*eTJB~p`(k(C_2oH7_RIX&f=TtB*1f|fLv036tmngmIOD40 z4!fHK$n>^2&sVc@8>r|dq_LR>`J_QEwr|hO#*Mwcc}~_+3dkvjF2dtm%h-8+wxiBl zUG?*x#bLFJ+)e8?cTY_d+S_Y#)QlNu1YUiU``Vr+iZI{Rl*O3s45|>P1vc0QicIWo5VO>`uj`9o6cYD^}e)b+~`Q-`v zT?~w?55jy#?t_n`%6%mRXO&2*4i|&D8n2zTE=zz2)x_PDRvsIsP;(VF=)NPRDJk4} zSmVCOB!M{X1WWDmHd>JZDC;riA8^`oe2<~EcO>pH{2)JvTk?E?iuX1A(~^+ioiOcU z<|CXa1PU?+8r)uiRo#@zp?g}O;M`rD2GIwEw!?C*$8IN>??$#6MQ`Nfk#9g0HJtH) z$Z$WlGPuS2x+X7AP8SAz+>}$bx|AfOsD@*5hH-@il-3FxL{@7NDaeXj5z!hIZtP$| zH-|w5nq329X;;cMN;J@*`~-MARK0LUT(~Hzj+Y^r6y*)#)JNCVZd6g)362pjjlju)T zx^CuL;l;S^XL5%je<0J~ksE3W(I1#~vJcXHA5R@2{A4R$->%!_D~ujuA2A0M09 zw+BXk40{uIKRyEg)968sIp8kv&LiIw>zmkSB4>aIBaq1oi)i{a(udq9uSrxQ$PK^+ zofo=imednD=~Cim1VUXxrhHh2+*dQ=q|+VjUaxP9j(%R`r7ZSq4b2 z813Hdl68bOldfx+>!;or;t(c)be4hb0aCLfv_*Csx)6%vw0i(QOC0-f=+fCdS0!os zVyOrw43S=_i{88xPdUQDL;zR>Q$32uDO$}iLV?0X0egiH0Kr|E(JE3my<9RFbD=Np z*k^ml{2ZP^Hb+Fv2(bjz5(^ZI$ahyjcF$5a{my0~aZ3asg%tp7)<`sW1$Tu@y*T97 z1EZ8F^#EuguNmtRAUrLSr#t5_oEM7)Sm0pZo#sUau(~}w%ocgC@bTR_f92%jrK8h} z#|`h4`R?Aa@VA*KUO%~eab|Y*73tjxwje9FB4mQ715d-|G~;C4eX)B3ofE+TT@!%@ zujPp zDu&4pFEdyrvcSB+t}D9(2CGQHS#5sL^*@JOMfjbG)>$snhw;CPi_ zu|@ltbAcf2#SHR^$Z@oO53_d>RcuzG3Ef>VLXN*!8U3+ej_a3Z>E4irkisen=ww3t zTV3D~Sgj62q|^%oH*kl%G&{~nwHih7HD2HcUb9keZ+RE_Ky~2=J5q*$B;W)l!xY$1 z*5*n-5nXP7UvxPj`16NGoqO&pu}Ga?Jo63QgUrj7I8 zER`J;BGO3#q{s;R$5xEJ&er%5QMtdt>O^kbk=fTHWs-d@Bgi66o_;n;nF_n`@)+!R|EG zWMn0J;=X^!NQxcP+DU^R=q)YawtZxnnGEl_=6RneY zGjqLB7h_kCb#V<3D#H0sgfH|i{Qo&S{6+_*3d6?9y3tdyC3lVRlD;&;cR)4{&YlOG z4dDFvVWB!rG_(A=mmR)OSXn_cO)#9udn5P#7+MZNNi5NFcbX<$pmJcg^e#Jn z8*fII*4sMkHXHQ^2SH9Z5K)N_P8K&`#j?8Q^#ny=1!GV(1GEU}MJ^@oMD-7RgQEt$ zb6rgt9$-`joL3>aav{h}_Ab(U8s518A86QKG1$U9Mbl&rz&;GnMrtDkl$g}2EEB9E zgRRU+g!TZQfo2(8#hH%dde0l;_}TCkky3zM);vnUZ0FXz`y@ZX(+%Ls5HoKbldLii4Nc<)-Saw}jvEic%nkCe%VywQ zN10ol=z~!!gK`#@EFgFxO##^(6fvZ^D+3*K;cX7=^PxWL=jL&F(0ThyC+pg!eC)2V zH=Fj2WGm?gR#_O?V$d(RT$f^5cNes|2FYQynckzl3&0gQJlxuFfps$nyAhgTa5v_d z)V}GPn9}phv+A3_*#s9)5H+iiU(5Mcjq(fdFi z53O74z;D8++$eJs_5{qV;X4-_A^1{0p1G>1f$Q`nov!)v`F9xk$oqB#>C@{d_ERzo zD?(=_Wl>U(`Z{WY?)8Pd%OQu}yb|0~vc!g6z~n+|BrxjYpzWNJYbu_cG&a~@BL0_+ zPgn?MR(*epdOS+opL!w{MBjoK3iJT6eacLHFRA-@aoj64YDb2aDT-npLcjMs&MSpcMr?l&}C9Gh5kIU9^eOfoEZeC4H_}8qbP8GQX0N_ZT zdw{nJ+XH6l&RKko8tj#3YT_|K3>dUZ5L1!-Gy{xb`?#)hAtW_%gLq~2jS04z`s#`T zI<+XSAr7s;^u_Gjd3EcX-wLOJS86`K-GBMG(yM!VXQ4;FXkCJ10bYX#oy*!3-H4#L z+Ddxj2Xz7n0+2UkS(gE>XlsvzYtdQJEDg;CGjXP^;NNxI>e{_YbQK8pPhx^z+r&@PgKa}9@M_} zrj11*WQY3!|2b%O;8y)&2Kt^LA~61}G?aoZ{ep?wq~A|aGMp_xw72_I5P4Ozqw3

rCm7t?k1Qup0BF`IHEjBeA086u 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 Date: Wed, 23 Mar 2022 19:32:27 -0400 Subject: [PATCH 104/242] address libc weirdness on 32 bit android --- src/uu/tail/src/platform/unix.rs | 2 +- src/uu/wc/src/count_fast.rs | 6 +++--- src/uu/yes/src/splice.rs | 2 +- src/uucore/src/lib/features/entries.rs | 6 ++++++ tests/common/util.rs | 2 +- 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/uu/tail/src/platform/unix.rs b/src/uu/tail/src/platform/unix.rs index e01d5e4442b..7ddf6edd036 100644 --- a/src/uu/tail/src/platform/unix.rs +++ b/src/uu/tail/src/platform/unix.rs @@ -54,7 +54,7 @@ pub fn stdin_is_pipe_or_fifo() -> bool { fd >= 0 // GNU tail checks fd >= 0 && match fstat(fd) { Ok(stat) => { - let mode = stat.st_mode; + let mode = stat.st_mode as libc::mode_t; // NOTE: This is probably not the most correct way to check this (mode & S_IFIFO != 0) || (mode & S_IFSOCK != 0) } diff --git a/src/uu/wc/src/count_fast.rs b/src/uu/wc/src/count_fast.rs index f0aa311a011..555225a067d 100644 --- a/src/uu/wc/src/count_fast.rs +++ b/src/uu/wc/src/count_fast.rs @@ -36,7 +36,7 @@ fn count_bytes_using_splice(fd: &impl AsRawFd) -> Result { .map_err(|_| 0_usize)?; let null_rdev = stat::fstat(null_file.as_raw_fd()) .map_err(|_| 0_usize)? - .st_rdev; + .st_rdev as libc::dev_t; if unsafe { (libc::major(null_rdev), libc::minor(null_rdev)) } != (1, 3) { // This is not a proper /dev/null, writing to it is probably bad // Bit of an edge case, but it has been known to happen @@ -86,14 +86,14 @@ pub(crate) fn count_bytes_fast(handle: &mut T) -> (usize, Opti // The second case happens for files in pseudo-filesystems. For // example with /proc/version and /sys/kernel/profiling. So, // if it is 0 we don't report that and instead do a full read. - if (stat.st_mode & S_IFREG) != 0 && stat.st_size > 0 { + if (stat.st_mode as libc::mode_t & S_IFREG) != 0 && stat.st_size > 0 { return (stat.st_size as usize, None); } #[cfg(any(target_os = "linux", target_os = "android"))] { // Else, if we're on Linux and our file is a FIFO pipe // (or stdin), we use splice to count the number of bytes. - if (stat.st_mode & S_IFIFO) != 0 { + if (stat.st_mode as libc::mode_t & S_IFIFO) != 0 { match count_bytes_using_splice(handle) { Ok(n) => return (n, None), Err(n) => byte_count = n, diff --git a/src/uu/yes/src/splice.rs b/src/uu/yes/src/splice.rs index f77a09ed6f1..a0d41e06fa9 100644 --- a/src/uu/yes/src/splice.rs +++ b/src/uu/yes/src/splice.rs @@ -23,7 +23,7 @@ use nix::{errno::Errno, libc::S_IFIFO, sys::stat::fstat}; use uucore::pipes::{pipe, splice_exact, vmsplice}; pub(crate) fn splice_data(bytes: &[u8], out: &impl AsRawFd) -> Result<()> { - let is_pipe = fstat(out.as_raw_fd())?.st_mode & S_IFIFO != 0; + let is_pipe = fstat(out.as_raw_fd())?.st_mode as nix::libc::mode_t & S_IFIFO != 0; if is_pipe { loop { diff --git a/src/uucore/src/lib/features/entries.rs b/src/uucore/src/lib/features/entries.rs index 03c5a56cfe7..561de888bd2 100644 --- a/src/uucore/src/lib/features/entries.rs +++ b/src/uucore/src/lib/features/entries.rs @@ -183,7 +183,13 @@ impl Passwd { name: cstr2string(raw.pw_name).expect("passwd without name"), uid: raw.pw_uid, gid: raw.pw_gid, + #[cfg(not(all( + target_os = "android", + any(target_arch = "x86", target_arch = "arm") + )))] user_info: cstr2string(raw.pw_gecos), + #[cfg(all(target_os = "android", any(target_arch = "x86", target_arch = "arm")))] + user_info: None, user_shell: cstr2string(raw.pw_shell), user_dir: cstr2string(raw.pw_dir), user_passwd: cstr2string(raw.pw_passwd), diff --git a/tests/common/util.rs b/tests/common/util.rs index dc6aa78e727..8912a484a33 100644 --- a/tests/common/util.rs +++ b/tests/common/util.rs @@ -670,7 +670,7 @@ impl AtPath { let name = CString::new(self.plus_as_string(fifo)).unwrap(); let mut stat: libc::stat = std::mem::zeroed(); if libc::stat(name.as_ptr(), &mut stat) >= 0 { - libc::S_IFIFO & stat.st_mode != 0 + libc::S_IFIFO & stat.st_mode as libc::mode_t != 0 } else { false } From 4caeb2ff1d84b83fbaaa9762280e93ce0633a5c7 Mon Sep 17 00:00:00 2001 From: Justin Tracey Date: Fri, 25 Mar 2022 18:57:24 -0400 Subject: [PATCH 105/242] add Android to CICD --- .github/workflows/CICD.yml | 55 ++++++++++++++ util/android-commands.sh | 152 +++++++++++++++++++++++++++++++++++++ 2 files changed, 207 insertions(+) create mode 100755 util/android-commands.sh diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml index 0cc2ba50b98..967e77b60d1 100644 --- a/.github/workflows/CICD.yml +++ b/.github/workflows/CICD.yml @@ -844,6 +844,61 @@ jobs: n_fails=$(echo "$output" | grep "^FAIL:\s" | wc --lines) if [ $n_fails -gt 0 ] ; then echo "::warning ::${n_fails}+ test failures" ; fi + test_android: + name: Test Android builds + needs: [ min_version, deps ] + runs-on: macos-latest + strategy: + fail-fast: false + matrix: + api-level: [28] + target: [default] + arch: [x86] # , arm64-v8a + env: + TERMUX: v0.118.0 + steps: + - uses: actions/checkout@v2 + - name: AVD cache + uses: actions/cache@v2 + id: avd-cache + with: + path: | + ~/.android/avd/* + ~/.android/avd/*/snapshots/* + ~/.android/adb* + key: avd-${{ matrix.api-level }}-${{ matrix.arch }}+termux-${{ env.TERMUX }} + - name: Create and cache emulator image + if: steps.avd-cache.outputs.cache-hit != 'true' + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: ${{ matrix.api-level }} + target: ${{ matrix.target }} + arch: ${{ matrix.arch }} + ram-size: 2048M + disk-size: 5120M + force-avd-creation: true + emulator-options: -no-snapshot-load -noaudio -no-boot-anim -camera-back none + script: | + wget https://github.com/termux/termux-app/releases/download/${{ env.TERMUX }}/termux-app_${{ env.TERMUX }}+github-debug_${{ matrix.arch }}.apk + util/android-commands.sh snapshot termux-app_${{ env.TERMUX }}+github-debug_${{ matrix.arch }}.apk + adb -s emulator-5554 emu avd snapshot save ${{ matrix.api-level }}-${{ matrix.arch }}+termux-${{ env.TERMUX }} + echo "Emulator image created." + pkill -9 qemu-system-x86_64 + - name: Build and Test on Android + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: ${{ matrix.api-level }} + target: ${{ matrix.target }} + arch: ${{ matrix.arch }} + ram-size: 2048M + disk-size: 5120M + force-avd-creation: false + emulator-options: -no-snapshot-save -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -snapshot ${{ matrix.api-level }}-${{ matrix.arch }}+termux-${{ env.TERMUX }} + script: | + util/android-commands.sh sync + util/android-commands.sh build + util/android-commands.sh tests + test_freebsd: name: Tests/FreeBSD test suite needs: [ min_version, deps ] diff --git a/util/android-commands.sh b/util/android-commands.sh new file mode 100755 index 00000000000..2a4fca41672 --- /dev/null +++ b/util/android-commands.sh @@ -0,0 +1,152 @@ +# spell-checker:ignore termux keyevent sdcard binutils unmatch adb's dumpsys logcat pkill + +# There are three shells: the host's, adb, and termux. Only adb lets us run +# commands directly on the emulated device, only termux provides a GNU +# environment on the emulated device (to e.g. run cargo). So we use adb to +# launch termux, then to send keystrokes to it while it's running. +# This means that the commands sent to termux are first parsed as arguments in +# this shell, then as arguments in the adb shell, before finally being used as +# text inputs to the app. Hence, the "'wrapping'" on those commands. +# There's no way to get any feedback from termux, so every time we run a +# command on it, we make sure it ends by creating a unique *.probe file at the +# end of the command. The contents of the file are used as a return code: 0 on +# success, some other number for errors (an empty file is basically the same as +# 0). Note that the return codes are text, not raw bytes. + + +this_repo="$(dirname $(dirname -- "$(readlink -- "${0}")"))" + +help () { + echo \ +"Usage: $0 COMMAND [ARG] + +where COMMAND is one of: + snapshot APK install APK and dependencies on an emulator to prep a snapshot + (you can, but probably don't want to, run this for physical + devices -- just set up termux and the dependencies yourself) + sync [REPO] push the repo at REPO to the device, deleting and restoring all + symlinks (locally) in the process; by default, REPO is: + $this_repo + build run \`cargo build --features feat_os_unix_android\` on the + device, then pull the output as build.log + tests run \`cargo test --features feat_os_unix_android\` on the + device, then pull the output as tests.log + +If you have multiple devices, use the ANDROID_SERIAL environment variable to +specify which to connect to." +} + +hit_enter() { + adb shell input keyevent 66 +} + +launch_termux() { + echo "launching termux" + if ! adb shell 'am start -n com.termux/.HomeActivity' ; then + echo "failed to launch termux" + exit 1 + fi + # the emulator can sometimes be a little slow to launch the app + while ! adb shell 'ls /sdcard/launch.probe' 2>/dev/null; do + echo "waiting for launch.probe" + sleep 5 + adb shell input text 'touch\ /sdcard/launch.probe' && hit_enter + done + echo "found launch.probe" + adb shell 'rm /sdcard/launch.probe' && echo "removed launch.probe" +} + +run_termux_command() { + command="$1" # text of the escaped command, including creating the probe! + probe="$2" # unique file that indicates the command is complete + launch_termux + adb shell input text "$command" && hit_enter + while ! adb shell "ls $probe" 2>/dev/null; do echo "waiting for $probe"; sleep 30; done + return_code=$(adb shell "cat $probe") + adb shell "rm $probe" + echo "return code: $return_code" + return $return_code +} + +snapshot () { + apk="$1" + echo "running snapshot" + adb install -g "$apk" + probe='/sdcard/pkg.probe' + command="'yes | pkg install rust binutils openssl -y; touch $probe'" + run_termux_command "$command" "$probe" + echo "snapshot complete" + adb shell input text "exit" && hit_enter && hit_enter +} + +sync () { + repo="$1" + echo "running sync $1" + # android doesn't allow symlinks on shared dirs, and adb can't selectively push files + symlinks=$(find "$repo" -type l) + # dash doesn't support process substitution :( + echo $symlinks | sort >symlinks + git -C "$repo" diff --name-status | cut -f 2 >modified + modified_links=$(join symlinks modified) + if [ ! -z "$modified_links" ]; then + echo "You have modified symlinks. Either stash or commit them, then try again: $modified_links" + exit 1 + fi + if ! git ls-files --error-unmatch $symlinks >/dev/null; then + echo "You have untracked symlinks. Either remove or commit them, then try again." + exit 1 + fi + rm $symlinks + # adb's shell user only has access to shared dirs... + adb push "$repo" /sdcard/coreutils + git -C "$repo" checkout $symlinks + # ...but shared dirs can't build, so move it home as termux + probe='/sdcard/mv.probe' + command="'cp -r /sdcard/coreutils ~/; touch $probe'" + run_termux_command "$command" "$probe" +} + +build () { + probe='/sdcard/build.probe' + command="'cd ~/coreutils && cargo build --features feat_os_unix_android 2>/sdcard/build.log; echo \$? >$probe'" + echo "running build" + run_termux_command "$command" "$probe" + return_code=$? + adb pull /sdcard/build.log . + cat build.log + return $return_code +} + +tests () { + probe='/sdcard/tests.probe' + command="'cd ~/coreutils && cargo test --features feat_os_unix_android --no-fail-fast >/sdcard/tests.log 2>&1; echo \$? >$probe'" + run_termux_command "$command" "$probe" + return_code=$? + adb pull /sdcard/tests.log . + cat tests.log + return $return_code +} + +#adb logcat & +exit_code=0 + +if [ $# -eq 1 ]; then + case "$1" in + sync) sync "$this_repo"; exit_code=$?;; + build) build; exit_code=$?;; + tests) tests; exit_code=$?;; + *) help;; + esac +elif [ $# -eq 2 ]; then + case "$1" in + snapshot) snapshot "$2"; exit_code=$?;; + sync) sync "$2"; exit_code=$?;; + *) help; exit 1;; + esac +else + help + exit_code=1 +fi + +#pkill adb +exit $exit_code From 67a01a5d79c94edf252106d70cb2fe747a418ce3 Mon Sep 17 00:00:00 2001 From: Justin Tracey Date: Sat, 16 Apr 2022 00:56:14 -0400 Subject: [PATCH 106/242] preserve LD_PRELOAD in the test env --- tests/common/util.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/common/util.rs b/tests/common/util.rs index 8912a484a33..5a669fcd438 100644 --- a/tests/common/util.rs +++ b/tests/common/util.rs @@ -913,19 +913,21 @@ impl UCommand { let mut cmd = Command::new(bin_path); cmd.current_dir(curdir.as_ref()); if env_clear { + cmd.env_clear(); if cfg!(windows) { // spell-checker:ignore (dll) rsaenh // %SYSTEMROOT% is required on Windows to initialize crypto provider // ... and crypto provider is required for std::rand // From `procmon`: RegQueryValue HKLM\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\Microsoft Strong Cryptographic Provider\Image Path // SUCCESS Type: REG_SZ, Length: 66, Data: %SystemRoot%\system32\rsaenh.dll" - for (key, _) in env::vars_os() { - if key.as_os_str() != "SYSTEMROOT" { - cmd.env_remove(key); - } + if let Some(systemroot) = env::var_os("SYSTEMROOT") { + cmd.env("SYSTEMROOT", systemroot); } } else { - cmd.env_clear(); + // if someone is setting LD_PRELOAD, there's probably a good reason for it + if let Some(ld_preload) = env::var_os("LD_PRELOAD") { + cmd.env("LD_PRELOAD", ld_preload); + } } } cmd From 4c5f586e339cfedfe52c9505e7250cc26c0f71e2 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Wed, 20 Apr 2022 19:01:57 +0200 Subject: [PATCH 107/242] Allow 0.10.2+wasi-snapshot-preview1 of wasi for getrandom --- deny.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/deny.toml b/deny.toml index dea3503de15..749a0d85bc6 100644 --- a/deny.toml +++ b/deny.toml @@ -61,6 +61,8 @@ highlight = "all" # introduces it. # spell-checker: disable skip = [ + # getrandom + { name = "wasi", version="0.10.2+wasi-snapshot-preview1" }, # blake2d_simd { name = "arrayvec", version = "=0.7.2" }, # flimit/unix_socket From ddb87d500ff3cb6f8c957ac9e3906da67d54455f Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Wed, 20 Apr 2022 19:10:20 +0200 Subject: [PATCH 108/242] Allow v0.5.3 of remove_all_dir for tempfile --- deny.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/deny.toml b/deny.toml index dea3503de15..c33f9b4eaa6 100644 --- a/deny.toml +++ b/deny.toml @@ -76,6 +76,8 @@ skip = [ { name = "cpp_common", version = "=0.4.0" }, # quickcheck { name = "env_logger", version = "=0.8.4" }, + # tempfile + { name = "remove_dir_all", version = "=0.5.3" }, # cpp_* { name = "memchr", version = "=1.0.2" }, { name = "quote", version = "=0.3.15" }, From 8d1e340d803d98c706768a2b05551a1dfe0e4fc1 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Thu, 21 Apr 2022 15:24:52 +0200 Subject: [PATCH 109/242] df: remove unreachable code --- src/uu/df/src/df.rs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/uu/df/src/df.rs b/src/uu/df/src/df.rs index b4f3457c432..8a479142262 100644 --- a/src/uu/df/src/df.rs +++ b/src/uu/df/src/df.rs @@ -382,12 +382,6 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } }; - // This can happen if paths are given as command-line arguments - // but none of the paths exist. - if filesystems.is_empty() { - return Ok(()); - } - println!("{}", Table::new(&opt, filesystems)); Ok(()) From 2d4552cce49ba51c5f90035934fc77ec765b05ed Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Fri, 15 Apr 2022 08:05:24 +0200 Subject: [PATCH 110/242] df: respect -t arg when specific file is provided Fixes #3325 --- src/uu/df/src/df.rs | 36 ++++++++++++++++++++++-------------- tests/by-util/test_df.rs | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 15 deletions(-) diff --git a/src/uu/df/src/df.rs b/src/uu/df/src/df.rs index b4f3457c432..2b9c929c7cc 100644 --- a/src/uu/df/src/df.rs +++ b/src/uu/df/src/df.rs @@ -292,7 +292,7 @@ fn get_all_filesystems(opt: &Options) -> Vec { } /// For each path, get the filesystem that contains that path. -fn get_named_filesystems

(paths: &[P]) -> Vec +fn get_named_filesystems

(paths: &[P], opt: &Options) -> Vec where P: AsRef, { @@ -302,21 +302,35 @@ where // considered. The "lofs" filesystem is a loopback // filesystem present on Solaris and FreeBSD systems. It // is similar to a symbolic link. - let mounts: Vec = read_fs_list() + let mounts: Vec = filter_mount_list(read_fs_list(), opt) .into_iter() .filter(|mi| mi.fs_type != "lofs" && !mi.dummy) .collect(); + let mut result = vec![]; + + // this happens if the file system type doesn't exist + if mounts.is_empty() { + show!(USimpleError::new(1, "no file systems processed")); + return result; + } + // Convert each path into a `Filesystem`, which contains // both the mount information and usage information. - let mut result = vec![]; for path in paths { match Filesystem::from_path(&mounts, path) { Some(fs) => result.push(fs), - None => show!(USimpleError::new( - 1, - format!("{}: No such file or directory", path.as_ref().display()) - )), + None => { + // this happens if specified file system type != file system type of the file + if path.as_ref().exists() { + show!(USimpleError::new(1, "no file systems processed")); + } else { + show!(USimpleError::new( + 1, + format!("{}: No such file or directory", path.as_ref().display()) + )); + } + } } } result @@ -370,7 +384,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } Some(paths) => { let paths: Vec<&str> = paths.collect(); - let filesystems = get_named_filesystems(&paths); + let filesystems = get_named_filesystems(&paths, &opt); // This can happen if paths are given as command-line arguments // but none of the paths exist. @@ -382,12 +396,6 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } }; - // This can happen if paths are given as command-line arguments - // but none of the paths exist. - if filesystems.is_empty() { - return Ok(()); - } - println!("{}", Table::new(&opt, filesystems)); Ok(()) diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index 3de3c677b02..54c41e229a5 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -199,7 +199,42 @@ fn test_type_option() { new_ucmd!() .args(&["-t", fs_type, "-t", "nonexisting"]) .succeeds(); - new_ucmd!().args(&["-t", "nonexisting"]).fails(); + new_ucmd!() + .args(&["-t", "nonexisting"]) + .fails() + .stderr_contains("no file systems processed"); +} + +#[test] +fn test_type_option_with_file() { + let fs_type = new_ucmd!() + .args(&["--output=fstype", "."]) + .succeeds() + .stdout_move_str(); + let fs_type = fs_type.lines().nth(1).unwrap().trim(); + + new_ucmd!().args(&["-t", fs_type, "."]).succeeds(); + new_ucmd!() + .args(&["-t", "nonexisting", "."]) + .fails() + .stderr_contains("no file systems processed"); + + let fs_types = new_ucmd!() + .arg("--output=fstype") + .succeeds() + .stdout_move_str(); + let fs_types: Vec<_> = fs_types + .lines() + .skip(1) + .filter(|t| t.trim() != fs_type && t.trim() != "") + .collect(); + + if !fs_types.is_empty() { + new_ucmd!() + .args(&["-t", fs_types[0], "."]) + .fails() + .stderr_contains("no file systems processed"); + } } #[test] From 88c2b445e539762f07131480b6312da05c01da8b Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Fri, 22 Apr 2022 17:17:17 +0200 Subject: [PATCH 111/242] Add "nix" to Cargo.toml --- src/uucore/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/uucore/Cargo.toml b/src/uucore/Cargo.toml index 0f28d9acb19..34fcdc10319 100644 --- a/src/uucore/Cargo.toml +++ b/src/uucore/Cargo.toml @@ -51,7 +51,7 @@ default = [] encoding = ["data-encoding", "data-encoding-macro", "z85", "thiserror"] entries = ["libc"] fs = ["libc", "nix", "winapi-util"] -fsext = ["libc", "time"] +fsext = ["libc", "nix", "time"] lines = [] memo = ["itertools"] mode = ["libc"] From 78dc90124ed44437abe17a52b81eb3e4be6f26e1 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Sat, 23 Apr 2022 16:56:06 +0200 Subject: [PATCH 112/242] df: simplify get_header() in test_block_size_1024 --- tests/by-util/test_df.rs | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index 54c41e229a5..0f47b8dbf7b 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -378,19 +378,11 @@ fn test_iuse_percentage() { #[test] fn test_block_size_1024() { fn get_header(block_size: u64) -> String { - // TODO When #3057 is resolved, we should just use - // - // new_ucmd!().arg("--output=size").succeeds().stdout_move_str(); - // - // instead of parsing the entire `df` table as a string. let output = new_ucmd!() - .args(&["-B", &format!("{}", block_size)]) + .args(&["-B", &format!("{}", block_size), "--output=size"]) .succeeds() .stdout_move_str(); - let first_line = output.lines().next().unwrap(); - let mut column_labels = first_line.split_whitespace(); - let size_column_label = column_labels.nth(1).unwrap(); - size_column_label.into() + output.lines().next().unwrap().to_string() } assert_eq!(get_header(1024), "1K-blocks"); From 0f13de4e1a4aa073e2afc810b74bb57868b21e91 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Sat, 23 Apr 2022 16:44:48 +0200 Subject: [PATCH 113/242] df: allow sizes with a suffix for --block-size Fixes #3416 --- src/uu/df/src/blocks.rs | 7 ++++--- tests/by-util/test_df.rs | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/uu/df/src/blocks.rs b/src/uu/df/src/blocks.rs index 0943c9447b5..7783e563634 100644 --- a/src/uu/df/src/blocks.rs +++ b/src/uu/df/src/blocks.rs @@ -6,7 +6,8 @@ use crate::{OPT_BLOCKSIZE, OPT_HUMAN_READABLE_BINARY, OPT_HUMAN_READABLE_DECIMAL}; use clap::ArgMatches; use std::fmt; -use std::num::ParseIntError; + +use uucore::parse_size::{parse_size, ParseSizeError}; /// The first ten powers of 1024. const IEC_BASES: [u128; 10] = [ @@ -107,14 +108,14 @@ impl Default for BlockSize { } } -pub(crate) fn block_size_from_matches(matches: &ArgMatches) -> Result { +pub(crate) fn block_size_from_matches(matches: &ArgMatches) -> Result { if matches.is_present(OPT_HUMAN_READABLE_BINARY) { Ok(BlockSize::HumanReadableBinary) } else if matches.is_present(OPT_HUMAN_READABLE_DECIMAL) { Ok(BlockSize::HumanReadableDecimal) } else if matches.is_present(OPT_BLOCKSIZE) { let s = matches.value_of(OPT_BLOCKSIZE).unwrap(); - Ok(BlockSize::Bytes(s.parse()?)) + Ok(BlockSize::Bytes(parse_size(s)?)) } else { Ok(Default::default()) } diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index 0f47b8dbf7b..31432f7005d 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -394,6 +394,31 @@ fn test_block_size_1024() { assert_eq!(get_header(34 * 1024 * 1024 * 1024), "34G-blocks"); } +#[test] +fn test_block_size_with_suffix() { + fn get_header(block_size: &str) -> String { + let output = new_ucmd!() + .args(&["-B", block_size, "--output=size"]) + .succeeds() + .stdout_move_str(); + output.lines().next().unwrap().to_string() + } + + assert_eq!(get_header("K"), "1K-blocks"); + assert_eq!(get_header("M"), "1M-blocks"); + assert_eq!(get_header("G"), "1G-blocks"); + assert_eq!(get_header("1K"), "1K-blocks"); + assert_eq!(get_header("1M"), "1M-blocks"); + assert_eq!(get_header("1G"), "1G-blocks"); + assert_eq!(get_header("1KiB"), "1K-blocks"); + assert_eq!(get_header("1MiB"), "1M-blocks"); + assert_eq!(get_header("1GiB"), "1G-blocks"); + // TODO enable the following asserts when #3193 is resolved + //assert_eq!(get_header("1KB"), "1kB-blocks"); + //assert_eq!(get_header("1MB"), "1MB-blocks"); + //assert_eq!(get_header("1GB"), "1GB-blocks"); +} + #[test] fn test_output_selects_columns() { let output = new_ucmd!() From 181ebd3996f17acb7ff446b2e2fb5d1a3fa28fcb Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sun, 24 Apr 2022 20:39:39 +0200 Subject: [PATCH 114/242] Revert "df: remove trailing spaces in rightmost column" --- src/uu/df/src/table.rs | 13 ++----------- tests/by-util/test_df.rs | 8 ++++---- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/src/uu/df/src/table.rs b/src/uu/df/src/table.rs index abac3b54968..6b64ce02c24 100644 --- a/src/uu/df/src/table.rs +++ b/src/uu/df/src/table.rs @@ -401,21 +401,12 @@ impl fmt::Display for Table { while let Some(row) = row_iter.next() { let mut col_iter = row.iter().enumerate().peekable(); while let Some((i, elem)) = col_iter.next() { - let is_last_col = col_iter.peek().is_none(); - match self.alignments[i] { - Alignment::Left => { - if is_last_col { - // no trailing spaces in last column - write!(f, "{}", elem)?; - } else { - write!(f, "{: write!(f, "{: write!(f, "{:>width$}", elem, width = self.widths[i])?, } - if !is_last_col { + if col_iter.peek().is_some() { // column separator write!(f, " ")?; } diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index 31432f7005d..61ddcec5d2c 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -425,7 +425,7 @@ fn test_output_selects_columns() { .args(&["--output=source"]) .succeeds() .stdout_move_str(); - assert_eq!(output.lines().next().unwrap(), "Filesystem"); + assert_eq!(output.lines().next().unwrap().trim_end(), "Filesystem"); let output = new_ucmd!() .args(&["--output=source,target"]) @@ -484,7 +484,7 @@ fn test_output_file_all_filesystems() { let mut lines = output.lines(); assert_eq!(lines.next().unwrap(), "File"); for line in lines { - assert_eq!(line, "-"); + assert_eq!(line, "- "); } } @@ -503,7 +503,7 @@ fn test_output_file_specific_files() { .succeeds() .stdout_move_str(); let actual: Vec<&str> = output.lines().collect(); - assert_eq!(actual, vec!["File", "a", "b", "c"]); + assert_eq!(actual, vec!["File", "a ", "b ", "c "]); } #[test] @@ -538,5 +538,5 @@ fn test_nonexistent_file() { .args(&["--output=file", "does-not-exist", "."]) .fails() .stderr_is("df: does-not-exist: No such file or directory\n") - .stdout_is("File\n.\n"); + .stdout_is("File\n. \n"); } From 363a2a5611d01fa1df50578310819411c39a3117 Mon Sep 17 00:00:00 2001 From: Ryan Zoeller Date: Sun, 24 Apr 2022 15:48:16 -0500 Subject: [PATCH 115/242] Upgrade nix to 0.24.1, ctrlc to 3.2.2 Limit nix features, which should help compile times slightly. Replace usage of deprecated nix functionality with std equivalent. --- Cargo.lock | 10 ++++------ Cargo.toml | 2 +- src/uu/cat/Cargo.toml | 2 +- src/uu/more/Cargo.toml | 2 +- src/uu/nice/Cargo.toml | 2 +- src/uu/tail/Cargo.toml | 2 +- src/uu/timeout/Cargo.toml | 2 +- src/uu/wc/Cargo.toml | 2 +- src/uu/yes/Cargo.toml | 2 +- src/uucore/Cargo.toml | 4 +++- src/uucore/src/lib/features/pipes.rs | 6 ++++-- 11 files changed, 19 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8b7a42339a2..a733800e943 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -649,9 +649,9 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.2.1" +version = "3.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19c6cedffdc8c03a3346d723eb20bd85a13362bb96dc2ac000842c6381ec7bf" +checksum = "b37feaa84e6861e00a1f5e5aa8da3ee56d605c9992d33e082786754828e20865" dependencies = [ "nix", "winapi 0.3.9", @@ -1139,15 +1139,13 @@ dependencies = [ [[package]] name = "nix" -version = "0.23.1" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f866317acbd3a240710c63f065ffb1e4fd466259045ccb504130b7f668f35c6" +checksum = "8f17df307904acd05aa8e32e97bb20f2a0df1728bbc2d771ae8f9a90463441e9" dependencies = [ "bitflags", - "cc", "cfg-if 1.0.0", "libc", - "memoffset", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 17f68600833..0aa2861f1d2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -401,7 +401,7 @@ hex-literal = "0.3.1" rlimit = "0.8.3" [target.'cfg(unix)'.dev-dependencies] -nix = "0.23.1" +nix = { version = "0.24.1", default-features = false, features = ["process", "signal", "user"] } rust-users = { version="0.10", package="users" } unix_socket = "0.5.0" diff --git a/src/uu/cat/Cargo.toml b/src/uu/cat/Cargo.toml index ddf129bdbc8..cdd15d50199 100644 --- a/src/uu/cat/Cargo.toml +++ b/src/uu/cat/Cargo.toml @@ -22,7 +22,7 @@ uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=[ [target.'cfg(unix)'.dependencies] unix_socket = "0.5.0" -nix = "0.23.1" +nix = { version = "0.24.1", default-features = false } [[bin]] name = "cat" diff --git a/src/uu/more/Cargo.toml b/src/uu/more/Cargo.toml index 9cc69f3c5df..d28ec4377bc 100644 --- a/src/uu/more/Cargo.toml +++ b/src/uu/more/Cargo.toml @@ -23,7 +23,7 @@ unicode-width = "0.1.7" unicode-segmentation = "1.9.0" [target.'cfg(all(unix, not(target_os = "fuchsia")))'.dependencies] -nix = "0.23.1" +nix = { version = "0.24.1", default-features = false } [[bin]] name = "more" diff --git a/src/uu/nice/Cargo.toml b/src/uu/nice/Cargo.toml index eeec708af4d..cc3a189f847 100644 --- a/src/uu/nice/Cargo.toml +++ b/src/uu/nice/Cargo.toml @@ -17,7 +17,7 @@ path = "src/nice.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } libc = "0.2.121" -nix = "0.23.1" +nix = { version = "0.24.1", default-features = false } uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } [[bin]] diff --git a/src/uu/tail/Cargo.toml b/src/uu/tail/Cargo.toml index 0df4e2d78df..2e8fd38397e 100644 --- a/src/uu/tail/Cargo.toml +++ b/src/uu/tail/Cargo.toml @@ -23,7 +23,7 @@ uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=[ winapi = { version="0.3", features=["fileapi", "handleapi", "processthreadsapi", "synchapi", "winbase"] } [target.'cfg(unix)'.dependencies] -nix = "0.23.1" +nix = { version = "0.24.1", default-features = false } [[bin]] name = "tail" diff --git a/src/uu/timeout/Cargo.toml b/src/uu/timeout/Cargo.toml index 930185320ed..2ccd934194d 100644 --- a/src/uu/timeout/Cargo.toml +++ b/src/uu/timeout/Cargo.toml @@ -17,7 +17,7 @@ path = "src/timeout.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } libc = "0.2.121" -nix = "0.23.1" +nix = { version = "0.24.1", default-features = false, features = ["signal"] } uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["process", "signals"] } [[bin]] diff --git a/src/uu/wc/Cargo.toml b/src/uu/wc/Cargo.toml index d8b58938862..bd819f244af 100644 --- a/src/uu/wc/Cargo.toml +++ b/src/uu/wc/Cargo.toml @@ -22,7 +22,7 @@ utf-8 = "0.7.6" unicode-width = "0.1.8" [target.'cfg(unix)'.dependencies] -nix = "0.23.1" +nix = { version = "0.24.1", default-features = false } libc = "0.2" [[bin]] diff --git a/src/uu/yes/Cargo.toml b/src/uu/yes/Cargo.toml index d756f28f99e..54675eba7d8 100644 --- a/src/uu/yes/Cargo.toml +++ b/src/uu/yes/Cargo.toml @@ -19,7 +19,7 @@ clap = { version = "3.1", features = ["wrap_help", "cargo"] } uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["pipes"] } [target.'cfg(any(target_os = "linux", target_os = "android"))'.dependencies] -nix = "0.23.1" +nix = { version = "0.24.1", default-features = false } [[bin]] name = "yes" diff --git a/src/uucore/Cargo.toml b/src/uucore/Cargo.toml index 34fcdc10319..2cf5dafb953 100644 --- a/src/uucore/Cargo.toml +++ b/src/uucore/Cargo.toml @@ -1,3 +1,5 @@ +# spell-checker:ignore (features) zerocopy + [package] name = "uucore" version = "0.0.13" @@ -35,7 +37,7 @@ os_display = "0.1.3" [target.'cfg(unix)'.dependencies] walkdir = { version="2.3.2", optional=true } -nix = { version="0.23.1", optional=true } +nix = { version = "0.24.1", optional = true, default-features = false, features = ["fs", "uio", "zerocopy"] } [dev-dependencies] clap = "3.1" diff --git a/src/uucore/src/lib/features/pipes.rs b/src/uucore/src/lib/features/pipes.rs index 87cbe9bf221..a76322de8e8 100644 --- a/src/uucore/src/lib/features/pipes.rs +++ b/src/uucore/src/lib/features/pipes.rs @@ -1,11 +1,13 @@ /// Thin pipe-related wrappers around functions from the `nix` crate. use std::fs::File; #[cfg(any(target_os = "linux", target_os = "android"))] +use std::io::IoSlice; +#[cfg(any(target_os = "linux", target_os = "android"))] use std::os::unix::io::AsRawFd; use std::os::unix::io::FromRawFd; #[cfg(any(target_os = "linux", target_os = "android"))] -use nix::{fcntl::SpliceFFlags, sys::uio::IoVec}; +use nix::fcntl::SpliceFFlags; pub use nix::{Error, Result}; @@ -63,7 +65,7 @@ pub fn splice_exact(source: &impl AsRawFd, target: &impl AsRawFd, len: usize) -> pub fn vmsplice(target: &impl AsRawFd, bytes: &[u8]) -> Result { nix::fcntl::vmsplice( target.as_raw_fd(), - &[IoVec::from_slice(bytes)], + &[IoSlice::new(bytes)], SpliceFFlags::empty(), ) } From a10f234854a9de793c8d0aa461b628bd05432407 Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Sun, 24 Apr 2022 23:18:04 +0200 Subject: [PATCH 116/242] uudoc: require a feature to build This is used to not build uudoc by default. See https://github.com/uutils/coreutils/issues/3411 --- Cargo.toml | 4 +++- build.rs | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 17f68600833..061a79c2d3c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -254,6 +254,7 @@ feat_os_windows_legacy = [ ## # * bypass/override ~ translate 'test' feature name to avoid dependency collision with rust core 'test' crate (o/w surfaces as compiler errors during testing) test = [ "uu_test" ] +uudoc = [ "zip" ] [workspace] @@ -265,7 +266,7 @@ lazy_static = { version="1.3" } textwrap = { version="0.15", features=["terminal_size"] } uucore = { version=">=0.0.11", package="uucore", path="src/uucore" } selinux = { version="0.2", optional = true } -zip = { version = "0.6.0", default_features=false, features=["deflate"] } +zip = { version = "0.6.0", optional=true, default_features=false, features=["deflate"] } # * uutils uu_test = { optional=true, version="0.0.13", package="uu_test", path="src/uu/test" } # @@ -415,3 +416,4 @@ path = "src/bin/coreutils.rs" [[bin]] name = "uudoc" path = "src/bin/uudoc.rs" +required-features = ["uudoc"] diff --git a/build.rs b/build.rs index 50b8cfa3fc7..3df8d891d58 100644 --- a/build.rs +++ b/build.rs @@ -28,8 +28,9 @@ pub fn main() { if val == "1" && key.starts_with(ENV_FEATURE_PREFIX) { let krate = key[ENV_FEATURE_PREFIX.len()..].to_lowercase(); match krate.as_ref() { - "default" | "macos" | "unix" | "windows" | "selinux" => continue, // common/standard feature names + "default" | "macos" | "unix" | "windows" | "selinux" | "zip" => continue, // common/standard feature names "nightly" | "test_unimplemented" => continue, // crate-local custom features + "uudoc" => continue, // is not a utility "test" => continue, // over-ridden with 'uu_test' to avoid collision with rust core crate 'test' s if s.starts_with(FEATURE_PREFIX) => continue, // crate feature sets _ => {} // util feature name From 8f8aa61e6a505c831985da1cfd4d14640299e957 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Apr 2022 20:49:10 +0000 Subject: [PATCH 117/242] build(deps): bump z85 from 3.0.4 to 3.0.5 Bumps [z85](https://github.com/decafbad/z85) from 3.0.4 to 3.0.5. - [Release notes](https://github.com/decafbad/z85/releases) - [Commits](https://github.com/decafbad/z85/commits) --- updated-dependencies: - dependency-name: z85 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- src/uucore/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8b7a42339a2..3a1f5604e1a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3226,9 +3226,9 @@ dependencies = [ [[package]] name = "z85" -version = "3.0.4" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af896e93db81340b74b65f74276a99b210c086f3d34ed0abf433182a462af856" +checksum = "2a599daf1b507819c1121f0bf87fa37eb19daac6aff3aefefd4e6e2e0f2020fc" [[package]] name = "zip" diff --git a/src/uucore/Cargo.toml b/src/uucore/Cargo.toml index 34fcdc10319..25322e9371a 100644 --- a/src/uucore/Cargo.toml +++ b/src/uucore/Cargo.toml @@ -28,7 +28,7 @@ time = { version="<= 0.1.43", optional=true } # * "problem" dependencies (pinned) data-encoding = { version="2.1", optional=true } data-encoding-macro = { version="0.1.12", optional=true } -z85 = { version="3.0.3", optional=true } +z85 = { version="3.0.5", optional=true } libc = { version="0.2.121", optional=true } once_cell = "1.10.0" os_display = "0.1.3" From 681f5c88e2b38b30f3e111e6ef6a3fe0ec70f7fb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Apr 2022 19:35:08 +0000 Subject: [PATCH 118/242] build(deps): bump strum_macros from 0.23.1 to 0.24.0 Bumps [strum_macros](https://github.com/Peternator7/strum) from 0.23.1 to 0.24.0. - [Release notes](https://github.com/Peternator7/strum/releases) - [Changelog](https://github.com/Peternator7/strum/blob/master/CHANGELOG.md) - [Commits](https://github.com/Peternator7/strum/commits) --- updated-dependencies: - dependency-name: strum_macros dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 11 ++++------- src/uu/uniq/Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8b7a42339a2..ed3e62cc6c6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -894,12 +894,9 @@ checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" [[package]] name = "heck" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] +checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" [[package]] name = "hermit-abi" @@ -1815,9 +1812,9 @@ checksum = "e96acfc1b70604b8b2f1ffa4c57e59176c7dbb05d556c71ecd2f5498a1dee7f8" [[package]] name = "strum_macros" -version = "0.23.1" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb0dc7ee9c15cea6199cde9a127fa16a4c5819af85395457ad72d68edc85a38" +checksum = "6878079b17446e4d3eba6192bb0a2950d5b14f0ed8424b852310e5a94345d0ef" dependencies = [ "heck", "proc-macro2", diff --git a/src/uu/uniq/Cargo.toml b/src/uu/uniq/Cargo.toml index 1d534140bdb..cfb83513da6 100644 --- a/src/uu/uniq/Cargo.toml +++ b/src/uu/uniq/Cargo.toml @@ -17,7 +17,7 @@ path = "src/uniq.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } strum = "0.24.0" -strum_macros = "0.23.1" +strum_macros = "0.24.0" uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } [[bin]] From f3e5f31279e578d08adc68aca7ce25d593db4af3 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Wed, 20 Apr 2022 18:50:24 +0200 Subject: [PATCH 119/242] remove an old skipped crate for nix 0.21.0 --- deny.toml | 2 -- 1 file changed, 2 deletions(-) diff --git a/deny.toml b/deny.toml index 8b305787081..04c64082268 100644 --- a/deny.toml +++ b/deny.toml @@ -84,8 +84,6 @@ skip = [ { name = "memchr", version = "=1.0.2" }, { name = "quote", version = "=0.3.15" }, { name = "unicode-xid", version = "=0.0.4" }, - # exacl - { name = "nix", version = "=0.21.0" }, ] # spell-checker: enable From 186199c5d731b423d8b9f53f7ee8d11bf102d4b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Apr 2022 21:08:13 +0000 Subject: [PATCH 120/242] build(deps): bump rand from 0.8.4 to 0.8.5 Bumps [rand](https://github.com/rust-random/rand) from 0.8.4 to 0.8.5. - [Release notes](https://github.com/rust-random/rand/releases) - [Changelog](https://github.com/rust-random/rand/blob/master/CHANGELOG.md) - [Commits](https://github.com/rust-random/rand/compare/0.8.4...0.8.5) --- updated-dependencies: - dependency-name: rand dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8deb428a0a4..2768f352434 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1479,14 +1479,13 @@ dependencies = [ [[package]] name = "rand" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", - "rand_hc", ] [[package]] @@ -1508,15 +1507,6 @@ dependencies = [ "getrandom", ] -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core", -] - [[package]] name = "rayon" version = "1.5.2" From 6fde02ecf67a3abbb6f7f67912d20fdfd0a879a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Apr 2022 21:08:43 +0000 Subject: [PATCH 121/242] build(deps): bump clap_complete from 3.1.1 to 3.1.2 Bumps [clap_complete](https://github.com/clap-rs/clap) from 3.1.1 to 3.1.2. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v3.1.1...clap_complete-v3.1.2) --- updated-dependencies: - dependency-name: clap_complete dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 230 +++++++++++++++++++++++++++-------------------------- 1 file changed, 118 insertions(+), 112 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2768f352434..3bdfd1cfc95 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -256,15 +256,15 @@ dependencies = [ [[package]] name = "clap" -version = "3.1.8" +version = "3.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71c47df61d9e16dc010b55dba1952a57d8c215dbb533fd13cdd13369aac73b1c" +checksum = "7c167e37342afc5f33fd87bbc870cedd020d2a6dffa05d45ccd9241fbdd146db" dependencies = [ "atty", "bitflags", + "clap_lex", "indexmap", "lazy_static", - "os_str_bytes", "strsim 0.10.0", "termcolor", "terminal_size", @@ -273,11 +273,20 @@ dependencies = [ [[package]] name = "clap_complete" -version = "3.1.1" +version = "3.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df6f3613c0a3cddfd78b41b10203eb322cb29b600cbdf808a7d3db95691b8e25" +checksum = "1506b87ee866f7a53a5131f7b31fba656170d797e873d0609884cfd56b8bbda8" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", +] + +[[package]] +name = "clap_lex" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "189ddd3b5d32a70b35e7686054371742a937b0d99128e76dde6340210e966669" +dependencies = [ + "os_str_bytes", ] [[package]] @@ -307,7 +316,7 @@ version = "0.0.13" dependencies = [ "atty", "chrono", - "clap 3.1.8", + "clap 3.1.12", "clap_complete", "conv", "filetime", @@ -1268,9 +1277,6 @@ name = "os_str_bytes" version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" -dependencies = [ - "memchr 2.4.1", -] [[package]] name = "ouroboros" @@ -2027,7 +2033,7 @@ checksum = "7cf7d77f457ef8dfa11e4cd5933c5ddb5dc52a94664071951219a97710f0a32b" name = "uu_arch" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "platform-info", "uucore", ] @@ -2036,7 +2042,7 @@ dependencies = [ name = "uu_base32" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2052,7 +2058,7 @@ dependencies = [ name = "uu_basename" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2060,7 +2066,7 @@ dependencies = [ name = "uu_basenc" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uu_base32", "uucore", ] @@ -2070,7 +2076,7 @@ name = "uu_cat" version = "0.0.13" dependencies = [ "atty", - "clap 3.1.8", + "clap 3.1.12", "nix", "thiserror", "unix_socket", @@ -2081,7 +2087,7 @@ dependencies = [ name = "uu_chcon" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "fts-sys", "libc", "selinux", @@ -2093,7 +2099,7 @@ dependencies = [ name = "uu_chgrp" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2101,7 +2107,7 @@ dependencies = [ name = "uu_chmod" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "libc", "uucore", ] @@ -2110,7 +2116,7 @@ dependencies = [ name = "uu_chown" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2118,7 +2124,7 @@ dependencies = [ name = "uu_chroot" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2126,7 +2132,7 @@ dependencies = [ name = "uu_cksum" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2134,7 +2140,7 @@ dependencies = [ name = "uu_comm" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2142,7 +2148,7 @@ dependencies = [ name = "uu_cp" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "exacl", "filetime", "ioctl-sys", @@ -2159,7 +2165,7 @@ dependencies = [ name = "uu_csplit" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "regex", "thiserror", "uucore", @@ -2171,7 +2177,7 @@ version = "0.0.13" dependencies = [ "atty", "bstr", - "clap 3.1.8", + "clap 3.1.12", "memchr 2.4.1", "uucore", ] @@ -2181,7 +2187,7 @@ name = "uu_date" version = "0.0.13" dependencies = [ "chrono", - "clap 3.1.8", + "clap 3.1.12", "libc", "uucore", "winapi 0.3.9", @@ -2192,7 +2198,7 @@ name = "uu_dd" version = "0.0.13" dependencies = [ "byte-unit", - "clap 3.1.8", + "clap 3.1.12", "gcd", "libc", "signal-hook", @@ -2203,7 +2209,7 @@ dependencies = [ name = "uu_df" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "number_prefix", "unicode-width", "uucore", @@ -2213,7 +2219,7 @@ dependencies = [ name = "uu_dir" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "selinux", "uu_ls", "uucore", @@ -2223,7 +2229,7 @@ dependencies = [ name = "uu_dircolors" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "glob", "uucore", ] @@ -2232,7 +2238,7 @@ dependencies = [ name = "uu_dirname" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2241,7 +2247,7 @@ name = "uu_du" version = "0.0.13" dependencies = [ "chrono", - "clap 3.1.8", + "clap 3.1.12", "glob", "uucore", "winapi 0.3.9", @@ -2251,7 +2257,7 @@ dependencies = [ name = "uu_echo" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2259,7 +2265,7 @@ dependencies = [ name = "uu_env" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "rust-ini", "uucore", ] @@ -2268,7 +2274,7 @@ dependencies = [ name = "uu_expand" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "unicode-width", "uucore", ] @@ -2277,7 +2283,7 @@ dependencies = [ name = "uu_expr" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "num-bigint", "num-traits", "onig", @@ -2288,7 +2294,7 @@ dependencies = [ name = "uu_factor" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "coz", "num-traits", "paste", @@ -2302,7 +2308,7 @@ dependencies = [ name = "uu_false" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2310,7 +2316,7 @@ dependencies = [ name = "uu_fmt" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "unicode-width", "uucore", ] @@ -2319,7 +2325,7 @@ dependencies = [ name = "uu_fold" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2327,7 +2333,7 @@ dependencies = [ name = "uu_groups" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2337,7 +2343,7 @@ version = "0.0.13" dependencies = [ "blake2b_simd", "blake3", - "clap 3.1.8", + "clap 3.1.12", "digest", "hex", "md-5", @@ -2353,7 +2359,7 @@ dependencies = [ name = "uu_head" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "memchr 2.4.1", "uucore", ] @@ -2362,7 +2368,7 @@ dependencies = [ name = "uu_hostid" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "libc", "uucore", ] @@ -2371,7 +2377,7 @@ dependencies = [ name = "uu_hostname" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "hostname", "uucore", "winapi 0.3.9", @@ -2381,7 +2387,7 @@ dependencies = [ name = "uu_id" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "selinux", "uucore", ] @@ -2390,7 +2396,7 @@ dependencies = [ name = "uu_install" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "file_diff", "filetime", "libc", @@ -2401,7 +2407,7 @@ dependencies = [ name = "uu_join" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "memchr 2.4.1", "uucore", ] @@ -2410,7 +2416,7 @@ dependencies = [ name = "uu_kill" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "libc", "uucore", ] @@ -2419,7 +2425,7 @@ dependencies = [ name = "uu_link" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2427,7 +2433,7 @@ dependencies = [ name = "uu_ln" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2435,7 +2441,7 @@ dependencies = [ name = "uu_logname" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "libc", "uucore", ] @@ -2446,7 +2452,7 @@ version = "0.0.13" dependencies = [ "atty", "chrono", - "clap 3.1.8", + "clap 3.1.12", "glob", "lazy_static", "lscolors", @@ -2463,7 +2469,7 @@ dependencies = [ name = "uu_mkdir" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2471,7 +2477,7 @@ dependencies = [ name = "uu_mkfifo" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "libc", "uucore", ] @@ -2480,7 +2486,7 @@ dependencies = [ name = "uu_mknod" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "libc", "uucore", ] @@ -2489,7 +2495,7 @@ dependencies = [ name = "uu_mktemp" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "rand", "tempfile", "uucore", @@ -2500,7 +2506,7 @@ name = "uu_more" version = "0.0.13" dependencies = [ "atty", - "clap 3.1.8", + "clap 3.1.12", "crossterm", "nix", "unicode-segmentation", @@ -2512,7 +2518,7 @@ dependencies = [ name = "uu_mv" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "fs_extra", "uucore", ] @@ -2521,7 +2527,7 @@ dependencies = [ name = "uu_nice" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "libc", "nix", "uucore", @@ -2531,7 +2537,7 @@ dependencies = [ name = "uu_nl" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "regex", "uucore", ] @@ -2541,7 +2547,7 @@ name = "uu_nohup" version = "0.0.13" dependencies = [ "atty", - "clap 3.1.8", + "clap 3.1.12", "libc", "uucore", ] @@ -2550,7 +2556,7 @@ dependencies = [ name = "uu_nproc" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "libc", "num_cpus", "uucore", @@ -2560,7 +2566,7 @@ dependencies = [ name = "uu_numfmt" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2569,7 +2575,7 @@ name = "uu_od" version = "0.0.13" dependencies = [ "byteorder", - "clap 3.1.8", + "clap 3.1.12", "half", "uucore", ] @@ -2578,7 +2584,7 @@ dependencies = [ name = "uu_paste" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2586,7 +2592,7 @@ dependencies = [ name = "uu_pathchk" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "libc", "uucore", ] @@ -2595,7 +2601,7 @@ dependencies = [ name = "uu_pinky" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2604,7 +2610,7 @@ name = "uu_pr" version = "0.0.13" dependencies = [ "chrono", - "clap 3.1.8", + "clap 3.1.12", "itertools", "quick-error", "regex", @@ -2615,7 +2621,7 @@ dependencies = [ name = "uu_printenv" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2623,7 +2629,7 @@ dependencies = [ name = "uu_printf" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2631,7 +2637,7 @@ dependencies = [ name = "uu_ptx" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "regex", "uucore", ] @@ -2640,7 +2646,7 @@ dependencies = [ name = "uu_pwd" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2648,7 +2654,7 @@ dependencies = [ name = "uu_readlink" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2656,7 +2662,7 @@ dependencies = [ name = "uu_realpath" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2664,7 +2670,7 @@ dependencies = [ name = "uu_relpath" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2672,7 +2678,7 @@ dependencies = [ name = "uu_rm" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "remove_dir_all 0.7.0", "uucore", "walkdir", @@ -2683,7 +2689,7 @@ dependencies = [ name = "uu_rmdir" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "libc", "uucore", ] @@ -2692,7 +2698,7 @@ dependencies = [ name = "uu_runcon" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "libc", "selinux", "thiserror", @@ -2704,7 +2710,7 @@ name = "uu_seq" version = "0.0.13" dependencies = [ "bigdecimal", - "clap 3.1.8", + "clap 3.1.12", "num-bigint", "num-traits", "uucore", @@ -2714,7 +2720,7 @@ dependencies = [ name = "uu_shred" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "rand", "uucore", ] @@ -2723,7 +2729,7 @@ dependencies = [ name = "uu_shuf" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "rand", "rand_core", "uucore", @@ -2733,7 +2739,7 @@ dependencies = [ name = "uu_sleep" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2742,7 +2748,7 @@ name = "uu_sort" version = "0.0.13" dependencies = [ "binary-heap-plus", - "clap 3.1.8", + "clap 3.1.12", "compare", "ctrlc", "fnv", @@ -2760,7 +2766,7 @@ dependencies = [ name = "uu_split" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "memchr 2.4.1", "uucore", ] @@ -2769,7 +2775,7 @@ dependencies = [ name = "uu_stat" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2777,7 +2783,7 @@ dependencies = [ name = "uu_stdbuf" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "tempfile", "uu_stdbuf_libstdbuf", "uucore", @@ -2797,7 +2803,7 @@ dependencies = [ name = "uu_sum" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2805,7 +2811,7 @@ dependencies = [ name = "uu_sync" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "libc", "uucore", "winapi 0.3.9", @@ -2815,7 +2821,7 @@ dependencies = [ name = "uu_tac" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "memchr 2.4.1", "memmap2", "regex", @@ -2826,7 +2832,7 @@ dependencies = [ name = "uu_tail" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "libc", "nix", "uucore", @@ -2837,7 +2843,7 @@ dependencies = [ name = "uu_tee" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "libc", "retain_mut", "uucore", @@ -2847,7 +2853,7 @@ dependencies = [ name = "uu_test" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "libc", "redox_syscall", "uucore", @@ -2857,7 +2863,7 @@ dependencies = [ name = "uu_timeout" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "libc", "nix", "uucore", @@ -2867,7 +2873,7 @@ dependencies = [ name = "uu_touch" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "filetime", "time", "uucore", @@ -2878,7 +2884,7 @@ dependencies = [ name = "uu_tr" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "nom", "uucore", ] @@ -2887,7 +2893,7 @@ dependencies = [ name = "uu_true" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2895,7 +2901,7 @@ dependencies = [ name = "uu_truncate" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2903,7 +2909,7 @@ dependencies = [ name = "uu_tsort" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2912,7 +2918,7 @@ name = "uu_tty" version = "0.0.13" dependencies = [ "atty", - "clap 3.1.8", + "clap 3.1.12", "libc", "uucore", ] @@ -2921,7 +2927,7 @@ dependencies = [ name = "uu_uname" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "platform-info", "uucore", ] @@ -2930,7 +2936,7 @@ dependencies = [ name = "uu_unexpand" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "unicode-width", "uucore", ] @@ -2939,7 +2945,7 @@ dependencies = [ name = "uu_uniq" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "strum", "strum_macros", "uucore", @@ -2949,7 +2955,7 @@ dependencies = [ name = "uu_unlink" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2958,7 +2964,7 @@ name = "uu_uptime" version = "0.0.13" dependencies = [ "chrono", - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2966,7 +2972,7 @@ dependencies = [ name = "uu_users" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -2974,7 +2980,7 @@ dependencies = [ name = "uu_vdir" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "selinux", "uu_ls", "uucore", @@ -2985,7 +2991,7 @@ name = "uu_wc" version = "0.0.13" dependencies = [ "bytecount", - "clap 3.1.8", + "clap 3.1.12", "libc", "nix", "unicode-width", @@ -2997,7 +3003,7 @@ dependencies = [ name = "uu_who" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "uucore", ] @@ -3005,7 +3011,7 @@ dependencies = [ name = "uu_whoami" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "libc", "uucore", "winapi 0.3.9", @@ -3015,7 +3021,7 @@ dependencies = [ name = "uu_yes" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "nix", "uucore", ] @@ -3024,7 +3030,7 @@ dependencies = [ name = "uucore" version = "0.0.13" dependencies = [ - "clap 3.1.8", + "clap 3.1.12", "data-encoding", "data-encoding-macro", "dns-lookup", From 3cee681e822cd4faa0357f20d1af3a5586134534 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Apr 2022 07:15:58 +0000 Subject: [PATCH 122/242] build(deps): bump libc from 0.2.121 to 0.2.124 Bumps [libc](https://github.com/rust-lang/libc) from 0.2.121 to 0.2.124. - [Release notes](https://github.com/rust-lang/libc/releases) - [Commits](https://github.com/rust-lang/libc/compare/0.2.121...0.2.124) --- updated-dependencies: - dependency-name: libc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- src/uu/chmod/Cargo.toml | 2 +- src/uu/cp/Cargo.toml | 2 +- src/uu/hostid/Cargo.toml | 2 +- src/uu/kill/Cargo.toml | 2 +- src/uu/logname/Cargo.toml | 2 +- src/uu/mkfifo/Cargo.toml | 2 +- src/uu/mknod/Cargo.toml | 2 +- src/uu/nice/Cargo.toml | 2 +- src/uu/nohup/Cargo.toml | 2 +- src/uu/nproc/Cargo.toml | 2 +- src/uu/pathchk/Cargo.toml | 2 +- src/uu/rmdir/Cargo.toml | 2 +- src/uu/sync/Cargo.toml | 2 +- src/uu/tail/Cargo.toml | 2 +- src/uu/tee/Cargo.toml | 2 +- src/uu/test/Cargo.toml | 2 +- src/uu/timeout/Cargo.toml | 2 +- src/uu/tty/Cargo.toml | 2 +- src/uu/whoami/Cargo.toml | 2 +- src/uucore/Cargo.toml | 2 +- 21 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3bdfd1cfc95..dbea8ccd463 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1015,9 +1015,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.121" +version = "0.2.124" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f" +checksum = "21a41fed9d98f27ab1c6d161da622a4fa35e8a54a8adc24bbf3ddd0ef70b0e50" [[package]] name = "libloading" diff --git a/src/uu/chmod/Cargo.toml b/src/uu/chmod/Cargo.toml index 66ba427360d..9fab6011e5d 100644 --- a/src/uu/chmod/Cargo.toml +++ b/src/uu/chmod/Cargo.toml @@ -16,7 +16,7 @@ path = "src/chmod.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.121" +libc = "0.2.124" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["fs", "mode"] } [[bin]] diff --git a/src/uu/cp/Cargo.toml b/src/uu/cp/Cargo.toml index 1aab9c37bf5..9e1141650dd 100644 --- a/src/uu/cp/Cargo.toml +++ b/src/uu/cp/Cargo.toml @@ -21,7 +21,7 @@ path = "src/cp.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } filetime = "0.2" -libc = "0.2.121" +libc = "0.2.124" quick-error = "2.0.1" selinux = { version="0.2", optional=true } uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["entries", "fs", "perms", "mode"] } diff --git a/src/uu/hostid/Cargo.toml b/src/uu/hostid/Cargo.toml index f9c2555d443..0a2948459b1 100644 --- a/src/uu/hostid/Cargo.toml +++ b/src/uu/hostid/Cargo.toml @@ -16,7 +16,7 @@ path = "src/hostid.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.121" +libc = "0.2.124" uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } [[bin]] diff --git a/src/uu/kill/Cargo.toml b/src/uu/kill/Cargo.toml index 561209eb374..354ad1d3f24 100644 --- a/src/uu/kill/Cargo.toml +++ b/src/uu/kill/Cargo.toml @@ -16,7 +16,7 @@ path = "src/kill.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.121" +libc = "0.2.124" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["signals"] } [[bin]] diff --git a/src/uu/logname/Cargo.toml b/src/uu/logname/Cargo.toml index 34ca9355a82..22b976dd6a1 100644 --- a/src/uu/logname/Cargo.toml +++ b/src/uu/logname/Cargo.toml @@ -15,7 +15,7 @@ edition = "2021" path = "src/logname.rs" [dependencies] -libc = "0.2.121" +libc = "0.2.124" clap = { version = "3.1", features = ["wrap_help", "cargo"] } uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } diff --git a/src/uu/mkfifo/Cargo.toml b/src/uu/mkfifo/Cargo.toml index bb2ced83e5e..a6c801747e1 100644 --- a/src/uu/mkfifo/Cargo.toml +++ b/src/uu/mkfifo/Cargo.toml @@ -16,7 +16,7 @@ path = "src/mkfifo.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.121" +libc = "0.2.124" uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } [[bin]] diff --git a/src/uu/mknod/Cargo.toml b/src/uu/mknod/Cargo.toml index 2f9a5cea00e..53cc623137a 100644 --- a/src/uu/mknod/Cargo.toml +++ b/src/uu/mknod/Cargo.toml @@ -17,7 +17,7 @@ path = "src/mknod.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "^0.2.121" +libc = "^0.2.124" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["mode"] } [[bin]] diff --git a/src/uu/nice/Cargo.toml b/src/uu/nice/Cargo.toml index cc3a189f847..ab4b6c70012 100644 --- a/src/uu/nice/Cargo.toml +++ b/src/uu/nice/Cargo.toml @@ -16,7 +16,7 @@ path = "src/nice.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.121" +libc = "0.2.124" nix = { version = "0.24.1", default-features = false } uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } diff --git a/src/uu/nohup/Cargo.toml b/src/uu/nohup/Cargo.toml index fb2aed6348e..26e5fd7aecb 100644 --- a/src/uu/nohup/Cargo.toml +++ b/src/uu/nohup/Cargo.toml @@ -16,7 +16,7 @@ path = "src/nohup.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.121" +libc = "0.2.124" atty = "0.2" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["fs"] } diff --git a/src/uu/nproc/Cargo.toml b/src/uu/nproc/Cargo.toml index 7980f5c2ad3..80c1cb38bdb 100644 --- a/src/uu/nproc/Cargo.toml +++ b/src/uu/nproc/Cargo.toml @@ -15,7 +15,7 @@ edition = "2021" path = "src/nproc.rs" [dependencies] -libc = "0.2.121" +libc = "0.2.124" num_cpus = "1.10" clap = { version = "3.1", features = ["wrap_help", "cargo"] } uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["fs"] } diff --git a/src/uu/pathchk/Cargo.toml b/src/uu/pathchk/Cargo.toml index 09a14e0a692..44cab8559a0 100644 --- a/src/uu/pathchk/Cargo.toml +++ b/src/uu/pathchk/Cargo.toml @@ -16,7 +16,7 @@ path = "src/pathchk.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.121" +libc = "0.2.124" uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } [[bin]] diff --git a/src/uu/rmdir/Cargo.toml b/src/uu/rmdir/Cargo.toml index 5a6ccee6dc6..b61def5adeb 100644 --- a/src/uu/rmdir/Cargo.toml +++ b/src/uu/rmdir/Cargo.toml @@ -17,7 +17,7 @@ path = "src/rmdir.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } -libc = "0.2.121" +libc = "0.2.124" [[bin]] name = "rmdir" diff --git a/src/uu/sync/Cargo.toml b/src/uu/sync/Cargo.toml index a4d66aff541..ece7a5930ce 100644 --- a/src/uu/sync/Cargo.toml +++ b/src/uu/sync/Cargo.toml @@ -16,7 +16,7 @@ path = "src/sync.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.121" +libc = "0.2.124" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["wide"] } winapi = { version = "0.3", features = ["errhandlingapi", "fileapi", "handleapi", "std", "winbase", "winerror"] } diff --git a/src/uu/tail/Cargo.toml b/src/uu/tail/Cargo.toml index 2e8fd38397e..eebbf960629 100644 --- a/src/uu/tail/Cargo.toml +++ b/src/uu/tail/Cargo.toml @@ -16,7 +16,7 @@ path = "src/tail.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.121" +libc = "0.2.124" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["ringbuffer", "lines"] } [target.'cfg(windows)'.dependencies] diff --git a/src/uu/tee/Cargo.toml b/src/uu/tee/Cargo.toml index 80af45ea6a8..d018ee4a74e 100644 --- a/src/uu/tee/Cargo.toml +++ b/src/uu/tee/Cargo.toml @@ -16,7 +16,7 @@ path = "src/tee.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.121" +libc = "0.2.124" retain_mut = "=0.1.2" # ToDO: [2021-01-01; rivy; maint/MinSRV] ~ v0.1.5 uses const generics which aren't stabilized until rust v1.51.0 uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["libc"] } diff --git a/src/uu/test/Cargo.toml b/src/uu/test/Cargo.toml index 6e2f4f78935..6bd1cfc90e4 100644 --- a/src/uu/test/Cargo.toml +++ b/src/uu/test/Cargo.toml @@ -16,7 +16,7 @@ path = "src/test.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.121" +libc = "0.2.124" uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } [target.'cfg(target_os = "redox")'.dependencies] diff --git a/src/uu/timeout/Cargo.toml b/src/uu/timeout/Cargo.toml index 2ccd934194d..e555cb1b759 100644 --- a/src/uu/timeout/Cargo.toml +++ b/src/uu/timeout/Cargo.toml @@ -16,7 +16,7 @@ path = "src/timeout.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.121" +libc = "0.2.124" nix = { version = "0.24.1", default-features = false, features = ["signal"] } uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["process", "signals"] } diff --git a/src/uu/tty/Cargo.toml b/src/uu/tty/Cargo.toml index c27309008be..2f34385581c 100644 --- a/src/uu/tty/Cargo.toml +++ b/src/uu/tty/Cargo.toml @@ -16,7 +16,7 @@ path = "src/tty.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.121" +libc = "0.2.124" atty = "0.2" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["fs"] } diff --git a/src/uu/whoami/Cargo.toml b/src/uu/whoami/Cargo.toml index 2400801a49a..2655fe892b4 100644 --- a/src/uu/whoami/Cargo.toml +++ b/src/uu/whoami/Cargo.toml @@ -22,7 +22,7 @@ uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=[ winapi = { version = "0.3", features = ["lmcons"] } [target.'cfg(unix)'.dependencies] -libc = "0.2.121" +libc = "0.2.124" [[bin]] name = "whoami" diff --git a/src/uucore/Cargo.toml b/src/uucore/Cargo.toml index 8d90ecd44c8..6f74b238a04 100644 --- a/src/uucore/Cargo.toml +++ b/src/uucore/Cargo.toml @@ -31,7 +31,7 @@ time = { version="<= 0.1.43", optional=true } data-encoding = { version="2.1", optional=true } data-encoding-macro = { version="0.1.12", optional=true } z85 = { version="3.0.5", optional=true } -libc = { version="0.2.121", optional=true } +libc = { version="0.2.124", optional=true } once_cell = "1.10.0" os_display = "0.1.3" From 7a7311f5f6cfa2a48ec969cc25aeca519a05b929 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Apr 2022 10:36:05 +0000 Subject: [PATCH 123/242] build(deps): bump pretty_assertions from 1.0.0 to 1.2.1 Bumps [pretty_assertions](https://github.com/colin-kiegel/rust-pretty-assertions) from 1.0.0 to 1.2.1. - [Release notes](https://github.com/colin-kiegel/rust-pretty-assertions/releases) - [Changelog](https://github.com/colin-kiegel/rust-pretty-assertions/blob/main/CHANGELOG.md) - [Commits](https://github.com/colin-kiegel/rust-pretty-assertions/compare/v1.0.0...v1.2.1) --- updated-dependencies: - dependency-name: pretty_assertions dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3bdfd1cfc95..c6c75814750 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1408,9 +1408,9 @@ checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" [[package]] name = "pretty_assertions" -version = "1.0.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0cfe1b2403f172ba0f234e500906ee0a3e493fb81092dac23ebefe129301cc" +checksum = "c89f989ac94207d048d92db058e4f6ec7342b0971fc58d1271ca148b799b3563" dependencies = [ "ansi_term", "ctor", From 38a8fa6a776c4c251370b662ff79cc1b7731a5c3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 27 Apr 2022 06:44:04 +0000 Subject: [PATCH 124/242] build(deps): bump retain_mut from 0.1.2 to 0.1.7 Bumps [retain_mut](https://github.com/upsuper/retain_mut) from 0.1.2 to 0.1.7. - [Release notes](https://github.com/upsuper/retain_mut/releases) - [Commits](https://github.com/upsuper/retain_mut/commits) --- updated-dependencies: - dependency-name: retain_mut dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- src/uu/tee/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 191ad8923ff..a24abb9369d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1608,9 +1608,9 @@ dependencies = [ [[package]] name = "retain_mut" -version = "0.1.2" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53552c6c49e1e13f1a203ef0080ab3bbef0beb570a528993e83df057a9d9bba1" +checksum = "8c31b5c4033f8fdde8700e4657be2c497e7288f01515be52168c631e2e4d4086" [[package]] name = "rlimit" diff --git a/src/uu/tee/Cargo.toml b/src/uu/tee/Cargo.toml index d018ee4a74e..7257d9854b2 100644 --- a/src/uu/tee/Cargo.toml +++ b/src/uu/tee/Cargo.toml @@ -17,7 +17,7 @@ path = "src/tee.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } libc = "0.2.124" -retain_mut = "=0.1.2" # ToDO: [2021-01-01; rivy; maint/MinSRV] ~ v0.1.5 uses const generics which aren't stabilized until rust v1.51.0 +retain_mut = "=0.1.7" # ToDO: [2021-01-01; rivy; maint/MinSRV] ~ v0.1.5 uses const generics which aren't stabilized until rust v1.51.0 uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["libc"] } [[bin]] From 88752ecc3eefd4b8206f6f55ecd318a94d90fe81 Mon Sep 17 00:00:00 2001 From: ndd7xv Date: Tue, 26 Apr 2022 20:02:59 -0400 Subject: [PATCH 125/242] fix -h and --help discrepancies addresses https://github.com/uutils/coreutils/issues/3370 --- src/uu/cp/src/cp.rs | 68 +++++++++++++++++++-------------- src/uu/false/src/false.rs | 2 +- src/uu/pr/src/pr.rs | 2 +- src/uu/sort/src/sort.rs | 5 +-- src/uu/true/src/true.rs | 2 +- src/uu/unexpand/src/unexpand.rs | 2 +- util/build-gnu.sh | 2 - 7 files changed, 46 insertions(+), 37 deletions(-) diff --git a/src/uu/cp/src/cp.rs b/src/uu/cp/src/cp.rs index df9cb029310..913cf2769ec 100644 --- a/src/uu/cp/src/cp.rs +++ b/src/uu/cp/src/cp.rs @@ -469,37 +469,49 @@ pub fn uu_app<'a>() -> Command<'a> { #[uucore::main] pub fn uumain(args: impl uucore::Args) -> UResult<()> { - let matches = uu_app() - .after_help(&*format!( - "{}\n{}", - LONG_HELP, - backup_control::BACKUP_CONTROL_LONG_HELP - )) - .try_get_matches_from(args)?; - - let options = Options::from_matches(&matches)?; - - if options.overwrite == OverwriteMode::NoClobber && options.backup != BackupMode::NoBackup { - show_usage_error!("options --backup and --no-clobber are mutually exclusive"); - return Err(ExitCode(EXIT_ERR).into()); - } - - let paths: Vec = matches - .values_of(options::PATHS) - .map(|v| v.map(ToString::to_string).collect()) - .unwrap_or_default(); + let after_help = &*format!( + "{}\n{}", + LONG_HELP, + backup_control::BACKUP_CONTROL_LONG_HELP + ); + let matches = uu_app().after_help(after_help).try_get_matches_from(args); - let (sources, target) = parse_path_args(&paths, &options)?; + // The error is parsed here because we do not want version or help being printed to stderr. + if let Err(e) = matches { + let mut app = uu_app().after_help(after_help); - if let Err(error) = copy(&sources, &target, &options) { - match error { - // Error::NotAllFilesCopied is non-fatal, but the error - // code should still be EXIT_ERR as does GNU cp - Error::NotAllFilesCopied => {} - // Else we caught a fatal bubbled-up error, log it to stderr - _ => show_error!("{}", error), + match e.kind() { + clap::ErrorKind::DisplayHelp => { + app.print_help()?; + } + clap::ErrorKind::DisplayVersion => println!("{}", app.render_version()), + _ => return Err(Box::new(e)), }; - set_exit_code(EXIT_ERR); + } else if let Ok(matches) = matches { + let options = Options::from_matches(&matches)?; + + if options.overwrite == OverwriteMode::NoClobber && options.backup != BackupMode::NoBackup { + show_usage_error!("options --backup and --no-clobber are mutually exclusive"); + return Err(ExitCode(EXIT_ERR).into()); + } + + let paths: Vec = matches + .values_of(options::PATHS) + .map(|v| v.map(ToString::to_string).collect()) + .unwrap_or_default(); + + let (sources, target) = parse_path_args(&paths, &options)?; + + if let Err(error) = copy(&sources, &target, &options) { + match error { + // Error::NotAllFilesCopied is non-fatal, but the error + // code should still be EXIT_ERR as does GNU cp + Error::NotAllFilesCopied => {} + // Else we caught a fatal bubbled-up error, log it to stderr + _ => show_error!("{}", error), + }; + set_exit_code(EXIT_ERR); + } } Ok(()) diff --git a/src/uu/false/src/false.rs b/src/uu/false/src/false.rs index 687235f70df..0ee6128b252 100644 --- a/src/uu/false/src/false.rs +++ b/src/uu/false/src/false.rs @@ -28,7 +28,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { if let Ok(matches) = command.try_get_matches_from_mut(args) { let error = if matches.index_of("help").is_some() { - command.print_long_help() + command.print_help() } else if matches.index_of("version").is_some() { writeln!(std::io::stdout(), "{}", command.render_version()) } else { diff --git a/src/uu/pr/src/pr.rs b/src/uu/pr/src/pr.rs index e18d29730db..ca12f0be008 100644 --- a/src/uu/pr/src/pr.rs +++ b/src/uu/pr/src/pr.rs @@ -399,7 +399,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } if matches.is_present(options::HELP) { - command.print_long_help()?; + command.print_help()?; return Ok(()); } diff --git a/src/uu/sort/src/sort.rs b/src/uu/sort/src/sort.rs index 77d81c54ce5..141a7dd2cc0 100644 --- a/src/uu/sort/src/sort.rs +++ b/src/uu/sort/src/sort.rs @@ -1272,6 +1272,7 @@ pub fn uu_app<'a>() -> Command<'a> { Command::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) + .after_help(LONG_HELP_KEYS) .override_usage(format_usage(USAGE)) .infer_long_args(true) .arg( @@ -1421,7 +1422,6 @@ pub fn uu_app<'a>() -> Command<'a> { .short('k') .long(options::KEY) .help("sort by a key") - .long_help(LONG_HELP_KEYS) .multiple_occurrences(true) .number_of_values(1) .takes_value(true), @@ -1466,8 +1466,7 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new(options::COMPRESS_PROG) .long(options::COMPRESS_PROG) - .help("compress temporary files with PROG, decompress with PROG -d") - .long_help("PROG has to take input from stdin and output to stdout") + .help("compress temporary files with PROG, decompress with PROG -d; PROG has to take input from stdin and output to stdout") .value_name("PROG"), ) .arg( diff --git a/src/uu/true/src/true.rs b/src/uu/true/src/true.rs index 57c3d2af51a..7742e9ee1c6 100644 --- a/src/uu/true/src/true.rs +++ b/src/uu/true/src/true.rs @@ -22,7 +22,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { if let Ok(matches) = command.try_get_matches_from_mut(args) { let error = if matches.index_of("help").is_some() { - command.print_long_help() + command.print_help() } else if matches.index_of("version").is_some() { writeln!(std::io::stdout(), "{}", command.render_version()) } else { diff --git a/src/uu/unexpand/src/unexpand.rs b/src/uu/unexpand/src/unexpand.rs index 910ff91d372..70a763f3b91 100644 --- a/src/uu/unexpand/src/unexpand.rs +++ b/src/uu/unexpand/src/unexpand.rs @@ -127,7 +127,7 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(options::TABS) .short('t') .long(options::TABS) - .long_help("use comma separated LIST of tab positions or have tabs N characters apart instead of 8 (enables -a)") + .help("use comma separated LIST of tab positions or have tabs N characters apart instead of 8 (enables -a)") .takes_value(true) ) .arg( diff --git a/util/build-gnu.sh b/util/build-gnu.sh index 0aad35ff1d9..6f0ec32f70a 100755 --- a/util/build-gnu.sh +++ b/util/build-gnu.sh @@ -183,8 +183,6 @@ sed -i -e "s~ sed -n \"1s/'\\\/'/'OPT'/p\" < err >> pat || framework_failure_~ sed -i -e "s/rcexp=1$/rcexp=2\n case \"\$prg\" in chcon|runcon) return;; esac/" -e "s/rcexp=125 ;;/rcexp=2 ;;\ncp|truncate|pr) rcexp=1;;/" tests/misc/usage_vs_getopt.sh # GNU has option=[SUFFIX], clap is sed -i -e "s/cat opts/sed -i -e \"s| <.\*>$||g\" opts/" tests/misc/usage_vs_getopt.sh -# Strip empty lines for the diff - see https://github.com/uutils/coreutils/issues/3370 -sed -i -e "s~out 2>err1~out 2>err1\nsed '/^$/d' out > out\nsed '/^$/d' help > help~" tests/misc/usage_vs_getopt.sh # for some reasons, some stuff are duplicated, strip that sed -i -e "s/provoked error./provoked error\ncat pat |sort -u > pat/" tests/misc/usage_vs_getopt.sh From c6ad2441424d546c6ade98d9f5b9f27926e4c30c Mon Sep 17 00:00:00 2001 From: Michael Kefeder Date: Thu, 28 Apr 2022 16:46:10 +0200 Subject: [PATCH 126/242] tests/ptx: verify output width is handled correctly --- tests/by-util/test_ptx.rs | 16 +++++++++++++ .../gnu_ext_disabled_output_width_50.expected | 24 +++++++++++++++++++ .../gnu_ext_disabled_output_width_70.expected | 24 +++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 tests/fixtures/ptx/gnu_ext_disabled_output_width_50.expected create mode 100644 tests/fixtures/ptx/gnu_ext_disabled_output_width_70.expected diff --git a/tests/by-util/test_ptx.rs b/tests/by-util/test_ptx.rs index c17d473f543..e990cac73f2 100644 --- a/tests/by-util/test_ptx.rs +++ b/tests/by-util/test_ptx.rs @@ -71,3 +71,19 @@ fn gnu_ext_disabled_ignore_and_only_file() { .succeeds() .stdout_only_fixture("gnu_ext_disabled_ignore_and_only_file.expected"); } + +#[test] +fn gnu_ext_disabled_output_width_50() { + new_ucmd!() + .args(&["-G", "-w", "50", "input"]) + .succeeds() + .stdout_only_fixture("gnu_ext_disabled_output_width_50.expected"); +} + +#[test] +fn gnu_ext_disabled_output_width_70() { + new_ucmd!() + .args(&["-G", "-w", "70", "input"]) + .succeeds() + .stdout_only_fixture("gnu_ext_disabled_output_width_70.expected"); +} diff --git a/tests/fixtures/ptx/gnu_ext_disabled_output_width_50.expected b/tests/fixtures/ptx/gnu_ext_disabled_output_width_50.expected new file mode 100644 index 00000000000..c71b0508c20 --- /dev/null +++ b/tests/fixtures/ptx/gnu_ext_disabled_output_width_50.expected @@ -0,0 +1,24 @@ +.xx "" "" """quotes"", for roff" "" +.xx "" "and some other like" "%a, b#, c$c" "" +.xx "" "maybe" "also~or^" "" +.xx "%a, b#, c$c" "" "and some other like" "" +.xx "" "oh," "and back\slash" "" +.xx "" "some other like %a," "b#, c$c" "and" +.xx "" "oh, and" "back\slash" "" +.xx "" "other like %a, b#," "c$c" "and some" +.xx "" "let's check special" "characters:" "" +.xx "characters:" "let's" "check special" "" +.xx "" """quotes""," "for roff" "" +.xx "" "{brackets}" "for tex" "" +.xx "" "" "hello world!" "" +.xx "characters:" "" "let's check special" "" +.xx "" "and some other" "like %a, b#, c$c" "" +.xx "" "" "maybe also~or^" "" +.xx "" "" "oh, and back\slash" "" +.xx "" "and some" "other like %a, b#, c$c" "" +.xx "" """quotes"", for" "roff" "" +.xx "b#, c$c" "and" "some other like %a," "" +.xx "" "let's check" "special characters:" "" +.xx "" "{brackets} for" "tex" "" +.xx "" "hello" "world!" "" +.xx "" "" "{brackets} for tex" "" diff --git a/tests/fixtures/ptx/gnu_ext_disabled_output_width_70.expected b/tests/fixtures/ptx/gnu_ext_disabled_output_width_70.expected new file mode 100644 index 00000000000..3886e087d8c --- /dev/null +++ b/tests/fixtures/ptx/gnu_ext_disabled_output_width_70.expected @@ -0,0 +1,24 @@ +.xx "" "" """quotes"", for roff" "" +.xx "" "and some other like" "%a, b#, c$c" "" +.xx "" "maybe" "also~or^" "" +.xx "" "" "and some other like %a, b#, c$c" "" +.xx "" "oh," "and back\slash" "" +.xx "" "and some other like %a," "b#, c$c" "" +.xx "" "oh, and" "back\slash" "" +.xx "" "and some other like %a, b#," "c$c" "" +.xx "" "let's check special" "characters:" "" +.xx "" "let's" "check special characters:" "" +.xx "" """quotes""," "for roff" "" +.xx "" "{brackets}" "for tex" "" +.xx "" "" "hello world!" "" +.xx "" "" "let's check special characters:" "" +.xx "" "and some other" "like %a, b#, c$c" "" +.xx "" "" "maybe also~or^" "" +.xx "" "" "oh, and back\slash" "" +.xx "" "and some" "other like %a, b#, c$c" "" +.xx "" """quotes"", for" "roff" "" +.xx "" "and" "some other like %a, b#, c$c" "" +.xx "" "let's check" "special characters:" "" +.xx "" "{brackets} for" "tex" "" +.xx "" "hello" "world!" "" +.xx "" "" "{brackets} for tex" "" From b0567670d104c4b0595ec45f916c6235f5f6c087 Mon Sep 17 00:00:00 2001 From: Michael Kefeder Date: Thu, 28 Apr 2022 16:51:06 +0200 Subject: [PATCH 127/242] ptx: implement breakfile option --- src/uu/ptx/src/ptx.rs | 43 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/src/uu/ptx/src/ptx.rs b/src/uu/ptx/src/ptx.rs index 86a123530ec..64fe421ad83 100644 --- a/src/uu/ptx/src/ptx.rs +++ b/src/uu/ptx/src/ptx.rs @@ -88,6 +88,17 @@ fn read_word_filter_file( Ok(words) } +fn read_char_filter_file( + matches: &clap::ArgMatches, + option: &str, +) -> std::io::Result> { + let filename = matches.value_of(option).expect("parsing options failed!"); + let mut reader = File::open(filename)?; + let mut buffer = String::new(); + reader.read_to_string(&mut buffer)?; + Ok(buffer.chars().collect()) +} + #[derive(Debug)] struct WordFilter { only_specified: bool, @@ -113,9 +124,23 @@ impl WordFilter { } else { (false, HashSet::new()) }; - if matches.is_present(options::BREAK_FILE) { - return Err(PtxError::NotImplemented("-b").into()); - } + let break_set: Option> = if matches.is_present(options::BREAK_FILE) + && !matches.is_present(options::WORD_REGEXP) + { + let chars = + read_char_filter_file(matches, options::BREAK_FILE).map_err_context(String::new)?; + let mut hs: HashSet = if config.gnu_ext { + HashSet::new() // really only chars found in file + } else { + // GNU off means at least these are considered + [' ', '\t', '\n'].iter().cloned().collect() + }; + hs.extend(chars); + Some(hs) + } else { + // if -W takes precedence or default + None + }; // Ignore empty string regex from cmd-line-args let arg_reg: Option = if matches.is_present(options::WORD_REGEXP) { match matches.value_of(options::WORD_REGEXP) { @@ -134,7 +159,17 @@ impl WordFilter { let reg = match arg_reg { Some(arg_reg) => arg_reg, None => { - if config.gnu_ext { + if break_set.is_some() { + format!( + "[^{}]+", + break_set + .unwrap() + .into_iter() + .map(|c| c.to_string()) + .collect::>() + .join("") + ) + } else if config.gnu_ext { "\\w+".to_owned() } else { "[^ \t\n]+".to_owned() From adfe4b22893609c4478a9bf30b4846d57249deac Mon Sep 17 00:00:00 2001 From: naveen <172697+naveensrinivasan@users.noreply.github.com> Date: Fri, 29 Apr 2022 01:01:27 +0000 Subject: [PATCH 128/242] chore: Set permissions for GitHub actions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Restrict the GitHub token permissions only to the required ones; this way, even if the attackers will succeed in compromising your workflow, they won’t be able to do much. - Included permissions for the action. https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs [Keeping your GitHub Actions and workflows secure Part 1: Preventing pwn requests](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/) Signed-off-by: naveen <172697+naveensrinivasan@users.noreply.github.com> --- .github/workflows/GnuTests.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/GnuTests.yml b/.github/workflows/GnuTests.yml index d306092c6f5..7bc0f26d4d1 100644 --- a/.github/workflows/GnuTests.yml +++ b/.github/workflows/GnuTests.yml @@ -8,6 +8,10 @@ on: [push, pull_request] jobs: gnu: + permissions: + actions: read # for dawidd6/action-download-artifact to query and download artifacts + contents: read # for actions/checkout to fetch code + pull-requests: read # for dawidd6/action-download-artifact to query commit hash name: Run GNU tests runs-on: ubuntu-latest steps: From 994dedd6d97ff0cedc9b190e355f1e612c497638 Mon Sep 17 00:00:00 2001 From: Michael Kefeder Date: Fri, 29 Apr 2022 10:15:06 +0200 Subject: [PATCH 129/242] tests/ptx: added breakfile option tests --- tests/by-util/test_ptx.rs | 16 ++++++++ tests/fixtures/ptx/break_file | 1 + .../ptx/gnu_ext_disabled_break_file.expected | 41 +++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 tests/fixtures/ptx/break_file create mode 100644 tests/fixtures/ptx/gnu_ext_disabled_break_file.expected diff --git a/tests/by-util/test_ptx.rs b/tests/by-util/test_ptx.rs index e990cac73f2..75c96e42e3b 100644 --- a/tests/by-util/test_ptx.rs +++ b/tests/by-util/test_ptx.rs @@ -87,3 +87,19 @@ fn gnu_ext_disabled_output_width_70() { .succeeds() .stdout_only_fixture("gnu_ext_disabled_output_width_70.expected"); } + +#[test] +fn gnu_ext_disabled_break_file() { + new_ucmd!() + .args(&["-G", "-b", "break_file", "input"]) + .succeeds() + .stdout_only_fixture("gnu_ext_disabled_break_file.expected"); +} + +#[test] +fn gnu_ext_disabled_empty_word_regexp_ignores_break_file() { + new_ucmd!() + .args(&["-G", "-b", "break_file", "-R", "-W", "", "input"]) + .succeeds() + .stdout_only_fixture("gnu_ext_disabled_rightward_no_ref.expected"); +} diff --git a/tests/fixtures/ptx/break_file b/tests/fixtures/ptx/break_file new file mode 100644 index 00000000000..4c992d40afe --- /dev/null +++ b/tests/fixtures/ptx/break_file @@ -0,0 +1 @@ +abc_e diff --git a/tests/fixtures/ptx/gnu_ext_disabled_break_file.expected b/tests/fixtures/ptx/gnu_ext_disabled_break_file.expected new file mode 100644 index 00000000000..7afce186134 --- /dev/null +++ b/tests/fixtures/ptx/gnu_ext_disabled_break_file.expected @@ -0,0 +1,41 @@ +.xx "" "" """quotes"", for roff" "" +.xx "" "and some other like %a, b" "#, c$c" "" +.xx "" "and some other like %a, b#, c" "$c" "" +.xx "" "and some other like" "%a, b#, c$c" "" +.xx "" "and some other like %a" ", b#, c$c" "" +.xx "" """quotes""," "for roff" "" +.xx "" "{brackets}" "for tex" "" +.xx "" "" "hello world!" "" +.xx "" "let's c" "heck special characters:" "" +.xx "" "let's check special c" "haracters:" "" +.xx "" "let's check spec" "ial characters:" "" +.xx "" "let's chec" "k special characters:" "" +.xx "" "{brac" "kets} for tex" "" +.xx "" "oh, and bac" "k\slash" "" +.xx "" "" "let's check special characters:" "" +.xx "" "let's check specia" "l characters:" "" +.xx "" "and some other" "like %a, b#, c$c" "" +.xx "" "he" "llo world!" "" +.xx "" "maybe a" "lso~or^" "" +.xx "" "" "maybe also~or^" "" +.xx "" "a" "nd some other like %a, b#, c$c" "" +.xx "" "oh, a" "nd back\slash" "" +.xx "" "" "oh, and back\slash" "" +.xx "" "and some" "other like %a, b#, c$c" "" +.xx "" "let's check special cha" "racters:" "" +.xx "" "{b" "rackets} for tex" "" +.xx "" "and some othe" "r like %a, b#, c$c" "" +.xx "" """quotes"", for" "roff" "" +.xx "" "let's check special characte" "rs:" "" +.xx "" """quote" "s"", for roff" "" +.xx "" "oh, and back\sla" "sh" "" +.xx "" "and" "some other like %a, b#, c$c" "" +.xx "" "let's check" "special characters:" "" +.xx "" "let's check special charac" "ters:" "" +.xx "" "{brackets} for" "tex" "" +.xx "" "le" "t's check special characters:" "" +.xx "" "{bracke" "ts} for tex" "" +.xx "" "hello" "world!" "" +.xx "" "{brackets} for te" "x" "" +.xx "" "ma" "ybe also~or^" "" +.xx "" "" "{brackets} for tex" "" From 4889128edefa9293a15e7c8febce35ede94ef1b0 Mon Sep 17 00:00:00 2001 From: Michael Kefeder Date: Fri, 29 Apr 2022 10:57:36 +0200 Subject: [PATCH 130/242] ptx: add documentation to read_char_filter_file function --- src/uu/ptx/src/ptx.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/uu/ptx/src/ptx.rs b/src/uu/ptx/src/ptx.rs index 64fe421ad83..c273b976cbb 100644 --- a/src/uu/ptx/src/ptx.rs +++ b/src/uu/ptx/src/ptx.rs @@ -88,6 +88,7 @@ fn read_word_filter_file( Ok(words) } +/// reads contents of file as unique set of characters to be used with the break-file option fn read_char_filter_file( matches: &clap::ArgMatches, option: &str, From 023fc96aab29a1df3b79ebd8de27afbe0850cf5f Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Thu, 28 Apr 2022 09:10:20 +0200 Subject: [PATCH 131/242] df: fix "Size" column header Fixes #3193 --- src/uu/df/src/blocks.rs | 107 +++++++++++++++++++++++++++------------ tests/by-util/test_df.rs | 7 ++- 2 files changed, 78 insertions(+), 36 deletions(-) diff --git a/src/uu/df/src/blocks.rs b/src/uu/df/src/blocks.rs index 7783e563634..efeae2a70d7 100644 --- a/src/uu/df/src/blocks.rs +++ b/src/uu/df/src/blocks.rs @@ -26,6 +26,22 @@ const IEC_BASES: [u128; 10] = [ /// Suffixes for the first nine multi-byte unit suffixes. const SUFFIXES: [char; 9] = ['B', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']; +const SI_BASES: [u128; 10] = [ + 1, + 1_000, + 1_000_000, + 1_000_000_000, + 1_000_000_000_000, + 1_000_000_000_000_000, + 1_000_000_000_000_000_000, + 1_000_000_000_000_000_000_000, + 1_000_000_000_000_000_000_000_000, + 1_000_000_000_000_000_000_000_000_000, +]; + +// we use "kB" instead of "KB" because of GNU df +const SI_SUFFIXES: [&str; 9] = ["B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]; + /// Convert a multiple of 1024 into a string like "12K" or "34M". /// /// # Examples @@ -57,6 +73,37 @@ fn to_magnitude_and_suffix_1024(n: u128) -> Result { Err(()) } +/// Convert a number, except multiples of 1024, into a string like "12kB" or "34MB". +/// +/// Powers of 1000 become "1kB", "1MB", "1GB", etc. +/// +/// The returned string has a maximum length of 5 chars, for example: "1.1kB", "999kB", "1MB". +fn to_magnitude_and_suffix_not_powers_of_1024(n: u128) -> Result { + let mut i = 0; + + while SI_BASES[i + 1] - SI_BASES[i] < n && i < SI_SUFFIXES.len() { + i += 1; + } + + let quot = n / SI_BASES[i]; + let rem = n % SI_BASES[i]; + let suffix = SI_SUFFIXES[i]; + + if rem == 0 { + Ok(format!("{}{}", quot, suffix)) + } else { + let tenths_place = rem / (SI_BASES[i] / 10); + + if rem % (SI_BASES[i] / 10) == 0 { + Ok(format!("{}.{}{}", quot, tenths_place, suffix)) + } else if tenths_place + 1 == 10 { + Ok(format!("{}{}", quot + 1, suffix)) + } else { + Ok(format!("{}.{}{}", quot, tenths_place + 1, suffix)) + } + } +} + /// Convert a number into a magnitude and a multi-byte unit suffix. /// /// # Errors @@ -66,8 +113,7 @@ fn to_magnitude_and_suffix(n: u128) -> Result { if n % 1024 == 0 { to_magnitude_and_suffix_1024(n) } else { - // TODO Implement this, probably using code from `numfmt`. - Ok("1kB".into()) + to_magnitude_and_suffix_not_powers_of_1024(n) } } @@ -153,36 +199,33 @@ mod tests { ); } - // TODO We have not yet implemented this behavior, but when we do, - // uncomment this test. - - // #[test] - // fn test_to_magnitude_and_suffix_not_powers_of_1024() { - // assert_eq!(to_magnitude_and_suffix(1).unwrap(), "1B"); - // assert_eq!(to_magnitude_and_suffix(999).unwrap(), "999B"); - - // assert_eq!(to_magnitude_and_suffix(1000).unwrap(), "1kB"); - // assert_eq!(to_magnitude_and_suffix(1001).unwrap(), "1.1kB"); - // assert_eq!(to_magnitude_and_suffix(1023).unwrap(), "1.1kB"); - // assert_eq!(to_magnitude_and_suffix(1025).unwrap(), "1.1kB"); - // assert_eq!(to_magnitude_and_suffix(999_000).unwrap(), "999kB"); - - // assert_eq!(to_magnitude_and_suffix(999_001).unwrap(), "1MB"); - // assert_eq!(to_magnitude_and_suffix(999_999).unwrap(), "1MB"); - // assert_eq!(to_magnitude_and_suffix(1_000_000).unwrap(), "1MB"); - // assert_eq!(to_magnitude_and_suffix(1_000_001).unwrap(), "1.1MB"); - // assert_eq!(to_magnitude_and_suffix(1_100_000).unwrap(), "1.1MB"); - // assert_eq!(to_magnitude_and_suffix(1_100_001).unwrap(), "1.2MB"); - // assert_eq!(to_magnitude_and_suffix(1_900_000).unwrap(), "1.9MB"); - // assert_eq!(to_magnitude_and_suffix(1_900_001).unwrap(), "2MB"); - // assert_eq!(to_magnitude_and_suffix(9_900_000).unwrap(), "9.9MB"); - // assert_eq!(to_magnitude_and_suffix(9_900_001).unwrap(), "10MB"); - // assert_eq!(to_magnitude_and_suffix(999_000_000).unwrap(), "999MB"); - - // assert_eq!(to_magnitude_and_suffix(999_000_001).unwrap(), "1GB"); - // assert_eq!(to_magnitude_and_suffix(1_000_000_000).unwrap(), "1GB"); - // // etc. - // } + #[test] + fn test_to_magnitude_and_suffix_not_powers_of_1024() { + assert_eq!(to_magnitude_and_suffix(1).unwrap(), "1B"); + assert_eq!(to_magnitude_and_suffix(999).unwrap(), "999B"); + + assert_eq!(to_magnitude_and_suffix(1000).unwrap(), "1kB"); + assert_eq!(to_magnitude_and_suffix(1001).unwrap(), "1.1kB"); + assert_eq!(to_magnitude_and_suffix(1023).unwrap(), "1.1kB"); + assert_eq!(to_magnitude_and_suffix(1025).unwrap(), "1.1kB"); + assert_eq!(to_magnitude_and_suffix(999_000).unwrap(), "999kB"); + + assert_eq!(to_magnitude_and_suffix(999_001).unwrap(), "1MB"); + assert_eq!(to_magnitude_and_suffix(999_999).unwrap(), "1MB"); + assert_eq!(to_magnitude_and_suffix(1_000_000).unwrap(), "1MB"); + assert_eq!(to_magnitude_and_suffix(1_000_001).unwrap(), "1.1MB"); + assert_eq!(to_magnitude_and_suffix(1_100_000).unwrap(), "1.1MB"); + assert_eq!(to_magnitude_and_suffix(1_100_001).unwrap(), "1.2MB"); + assert_eq!(to_magnitude_and_suffix(1_900_000).unwrap(), "1.9MB"); + assert_eq!(to_magnitude_and_suffix(1_900_001).unwrap(), "2MB"); + assert_eq!(to_magnitude_and_suffix(9_900_000).unwrap(), "9.9MB"); + assert_eq!(to_magnitude_and_suffix(9_900_001).unwrap(), "10MB"); + assert_eq!(to_magnitude_and_suffix(999_000_000).unwrap(), "999MB"); + + assert_eq!(to_magnitude_and_suffix(999_000_001).unwrap(), "1GB"); + assert_eq!(to_magnitude_and_suffix(1_000_000_000).unwrap(), "1GB"); + assert_eq!(to_magnitude_and_suffix(1_000_000_001).unwrap(), "1.1GB"); + } #[test] fn test_block_size_display() { diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index 61ddcec5d2c..ce820bb9282 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -413,10 +413,9 @@ fn test_block_size_with_suffix() { assert_eq!(get_header("1KiB"), "1K-blocks"); assert_eq!(get_header("1MiB"), "1M-blocks"); assert_eq!(get_header("1GiB"), "1G-blocks"); - // TODO enable the following asserts when #3193 is resolved - //assert_eq!(get_header("1KB"), "1kB-blocks"); - //assert_eq!(get_header("1MB"), "1MB-blocks"); - //assert_eq!(get_header("1GB"), "1GB-blocks"); + assert_eq!(get_header("1KB"), "1kB-blocks"); + assert_eq!(get_header("1MB"), "1MB-blocks"); + assert_eq!(get_header("1GB"), "1GB-blocks"); } #[test] From 83a64f4afed34f4d0c885ea00d4971cdd9ffdaeb Mon Sep 17 00:00:00 2001 From: Michael Kefeder Date: Sat, 30 Apr 2022 10:01:11 +0200 Subject: [PATCH 132/242] ptx: escape regular expression character class special chars --- src/uu/ptx/src/ptx.rs | 8 +++++++- tests/fixtures/ptx/break_file | 2 +- tests/fixtures/ptx/gnu_ext_disabled_break_file.expected | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/uu/ptx/src/ptx.rs b/src/uu/ptx/src/ptx.rs index c273b976cbb..c3bedb266d4 100644 --- a/src/uu/ptx/src/ptx.rs +++ b/src/uu/ptx/src/ptx.rs @@ -31,6 +31,8 @@ const ABOUT: &str = "\ Mandatory arguments to long options are mandatory for short options too.\n\ With no FILE, or when FILE is -, read standard input. Default is '-F /'."; +const REGEX_CHARCLASS: &str = "^-]\\"; + #[derive(Debug)] enum OutFormat { Dumb, @@ -166,7 +168,11 @@ impl WordFilter { break_set .unwrap() .into_iter() - .map(|c| c.to_string()) + .map(|c| if REGEX_CHARCLASS.contains(c) { + format!("\\{}", c) + } else { + c.to_string() + }) .collect::>() .join("") ) diff --git a/tests/fixtures/ptx/break_file b/tests/fixtures/ptx/break_file index 4c992d40afe..499598c207a 100644 --- a/tests/fixtures/ptx/break_file +++ b/tests/fixtures/ptx/break_file @@ -1 +1 @@ -abc_e +abc_e^-]\ diff --git a/tests/fixtures/ptx/gnu_ext_disabled_break_file.expected b/tests/fixtures/ptx/gnu_ext_disabled_break_file.expected index 7afce186134..7ea13471d74 100644 --- a/tests/fixtures/ptx/gnu_ext_disabled_break_file.expected +++ b/tests/fixtures/ptx/gnu_ext_disabled_break_file.expected @@ -29,6 +29,7 @@ .xx "" "let's check special characte" "rs:" "" .xx "" """quote" "s"", for roff" "" .xx "" "oh, and back\sla" "sh" "" +.xx "" "oh, and back\" "slash" "" .xx "" "and" "some other like %a, b#, c$c" "" .xx "" "let's check" "special characters:" "" .xx "" "let's check special charac" "ters:" "" From 95ba8c45b2898876fdd0b3b279d2729ba0a6cc2f Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Sun, 1 May 2022 13:48:51 +0200 Subject: [PATCH 133/242] dir, vdir: fix incorrect regex in tests --- tests/by-util/test_dir.rs | 4 ++-- tests/by-util/test_vdir.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/by-util/test_dir.rs b/tests/by-util/test_dir.rs index 3ec416bb2ac..8c586a62852 100644 --- a/tests/by-util/test_dir.rs +++ b/tests/by-util/test_dir.rs @@ -31,7 +31,7 @@ fn test_default_output() { scene .ucmd() .succeeds() - .stdout_does_not_match(&Regex::new("[rwx][^some-file1]").unwrap()); + .stdout_does_not_match(&Regex::new("[rwx-]{10}.*some-file1$").unwrap()); } #[test] @@ -51,5 +51,5 @@ fn test_long_output() { .ucmd() .arg("-l") .succeeds() - .stdout_matches(&Regex::new("[rwx][^some-file1]").unwrap()); + .stdout_matches(&Regex::new("[rwx-]{10}.*some-file1$").unwrap()); } diff --git a/tests/by-util/test_vdir.rs b/tests/by-util/test_vdir.rs index 01c54009595..41bce1c4002 100644 --- a/tests/by-util/test_vdir.rs +++ b/tests/by-util/test_vdir.rs @@ -31,7 +31,7 @@ fn test_default_output() { scene .ucmd() .succeeds() - .stdout_matches(&Regex::new("[rwx][^some-file1]").unwrap()); + .stdout_matches(&Regex::new("[rwx-]{10}.*some-file1$").unwrap()); } #[test] @@ -51,5 +51,5 @@ fn test_column_output() { .ucmd() .arg("-C") .succeeds() - .stdout_does_not_match(&Regex::new("[rwx][^some-file1]").unwrap()); + .stdout_does_not_match(&Regex::new("[rwx-]{10}.*some-file1$").unwrap()); } From ca670148f2bf1a247e784f732f241b8278d81291 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Wed, 27 Apr 2022 08:43:03 +0200 Subject: [PATCH 134/242] build(deps): bump time from 0.1.43 to 0.3.9 Bumps [time](https://github.com/time-rs/time) from 0.1.43 to 0.3.9. - [Release notes](https://github.com/time-rs/time/releases) - [Changelog](https://github.com/time-rs/time/blob/main/CHANGELOG.md) - [Commits](https://github.com/time-rs/time/compare/v0.1.43...v0.3.9) --- updated-dependencies: - dependency-name: time dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 29 +++-- Cargo.toml | 2 +- deny.toml | 3 + src/uu/install/Cargo.toml | 3 + src/uu/pinky/src/pinky.rs | 10 +- src/uu/touch/Cargo.toml | 2 +- src/uu/touch/src/touch.rs | 152 ++++++++++++++++++--------- src/uu/uptime/src/uptime.rs | 6 +- src/uu/who/src/who.rs | 10 +- src/uucore/Cargo.toml | 4 +- src/uucore/src/lib/features/fsext.rs | 12 ++- src/uucore/src/lib/features/utmpx.rs | 14 +-- tests/by-util/test_mv.rs | 6 +- tests/by-util/test_touch.rs | 86 ++++++++------- 14 files changed, 217 insertions(+), 122 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 191ad8923ff..497d7ab4244 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -224,7 +224,7 @@ dependencies = [ "libc", "num-integer", "num-traits", - "time", + "time 0.1.44", "winapi 0.3.9", ] @@ -335,7 +335,7 @@ dependencies = [ "sha1", "tempfile", "textwrap 0.15.0", - "time", + "time 0.3.9", "unindent", "unix_socket", "users", @@ -1213,6 +1213,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_threads" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aba1801fb138d8e85e11d0fc70baf4fe1cdfffda7c6cd34a854905df588e5ed0" +dependencies = [ + "libc", +] + [[package]] name = "number_prefix" version = "0.4.0" @@ -1944,16 +1953,17 @@ dependencies = [ [[package]] name = "time" -version = "0.1.43" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" dependencies = [ "libc", + "wasi", "winapi 0.3.9", ] [[package]] -name = "typenum" +< String { thread_local! { - static NOW: time::Tm = time::now() + static NOW: time::OffsetDateTime = time::OffsetDateTime::now_local().unwrap(); } NOW.with(|n| { - let duration = n.to_timespec().sec - when; + let duration = n.unix_timestamp() - when; if duration < 60 { // less than 1min " ".to_owned() @@ -242,7 +242,11 @@ fn idle_string(when: i64) -> String { } fn time_string(ut: &Utmpx) -> String { - time::strftime("%b %e %H:%M", &ut.login_time()).unwrap() // LC_ALL=C + // "%b %e %H:%M" + let time_format: Vec = + time::format_description::parse("[month repr:short] [day padding:space] [hour]:[minute]") + .unwrap(); + ut.login_time().format(&time_format).unwrap() // LC_ALL=C } fn gecos_to_fullname(pw: &Passwd) -> Option { diff --git a/src/uu/touch/Cargo.toml b/src/uu/touch/Cargo.toml index 646b65f50e0..aa747ae7859 100644 --- a/src/uu/touch/Cargo.toml +++ b/src/uu/touch/Cargo.toml @@ -17,7 +17,7 @@ path = "src/touch.rs" [dependencies] filetime = "0.2.1" clap = { version = "3.1", features = ["wrap_help", "cargo"] } -time = "0.1.40" +time = { version = "0.3", features = ["parsing", "formatting", "local-offset", "macros"] } uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["libc"] } [target.'cfg(target_os = "windows")'.dependencies] diff --git a/src/uu/touch/src/touch.rs b/src/uu/touch/src/touch.rs index ff08a1b592f..75cd38a7a43 100644 --- a/src/uu/touch/src/touch.rs +++ b/src/uu/touch/src/touch.rs @@ -17,6 +17,7 @@ use clap::{crate_version, Arg, ArgGroup, Command}; use filetime::*; use std::fs::{self, File}; use std::path::{Path, PathBuf}; +use time::macros::{format_description, time}; use uucore::display::Quotable; use uucore::error::{FromIo, UError, UResult, USimpleError}; use uucore::format_usage; @@ -41,14 +42,13 @@ pub mod options { static ARG_FILES: &str = "files"; -fn to_local(mut tm: time::Tm) -> time::Tm { - tm.tm_utcoff = time::now().tm_utcoff; - tm +fn to_local(tm: time::PrimitiveDateTime) -> time::OffsetDateTime { + // TODO: handle error getting now + tm.assume_offset(time::OffsetDateTime::now_local().unwrap().offset()) } -fn local_tm_to_filetime(tm: time::Tm) -> FileTime { - let ts = tm.to_timespec(); - FileTime::from_unix_time(ts.sec as i64, ts.nsec as u32) +fn local_dt_to_filetime(dt: time::OffsetDateTime) -> FileTime { + FileTime::from_unix_time(dt.unix_timestamp(), dt.nanosecond()) } #[uucore::main] @@ -62,7 +62,6 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { Try 'touch --help' for more information."##, ) })?; - let (mut atime, mut mtime) = if let Some(reference) = matches.value_of_os(options::sources::REFERENCE) { stat(Path::new(reference), !matches.is_present(options::NO_DEREF))? @@ -72,7 +71,7 @@ Try 'touch --help' for more information."##, } else if let Some(current) = matches.value_of(options::sources::CURRENT) { parse_timestamp(current)? } else { - local_tm_to_filetime(time::now()) + local_dt_to_filetime(time::OffsetDateTime::now_local().unwrap()) }; (timestamp, timestamp) }; @@ -248,38 +247,80 @@ fn stat(path: &Path, follow: bool) -> UResult<(FileTime, FileTime)> { )) } -fn parse_date(str: &str) -> UResult { +const POSIX_LOCALE_FORMAT: &[time::format_description::FormatItem] = format_description!( + "[weekday repr:short] [month repr:short] [day padding:space] [hour]:[minute]:[second] [year]" +); + +const ISO_8601_FORMAT: &[time::format_description::FormatItem] = + format_description!("[year]-[month]-[day]"); + +fn parse_date(s: &str) -> UResult { // This isn't actually compatible with GNU touch, but there doesn't seem to // be any simple specification for what format this parameter allows and I'm // not about to implement GNU parse_datetime. // http://git.savannah.gnu.org/gitweb/?p=gnulib.git;a=blob_plain;f=lib/parse-datetime.y - let formats = vec!["%c", "%F"]; - for f in formats { - if let Ok(tm) = time::strptime(str, f) { - return Ok(local_tm_to_filetime(to_local(tm))); - } + + // TODO: match on char count? + + // "The preferred date and time representation for the current locale." + // "(In the POSIX locale this is equivalent to %a %b %e %H:%M:%S %Y.)" + // time 0.1.43 parsed this as 'a b e T Y' + // which is equivalent to the POSIX locale: %a %b %e %H:%M:%S %Y + // Tue Dec 3 ... + // ("%c", POSIX_LOCALE_FORMAT), + if let Ok(parsed) = time::PrimitiveDateTime::parse(s, &POSIX_LOCALE_FORMAT) { + return Ok(local_dt_to_filetime(to_local(parsed))); } - if let Ok(tm) = time::strptime(str, "@%s") { - // Don't convert to local time in this case - seconds since epoch are not time-zone dependent - return Ok(local_tm_to_filetime(tm)); + // "Equivalent to %Y-%m-%d (the ISO 8601 date format). (C99)" + // ("%F", ISO_8601_FORMAT), + if let Ok(parsed) = time::Date::parse(s, &ISO_8601_FORMAT) { + return Ok(local_dt_to_filetime(to_local( + time::PrimitiveDateTime::new(parsed, time!(00:00)), + ))); } - Err(USimpleError::new( - 1, - format!("Unable to parse date: {}", str), - )) + // "@%s" is "The number of seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC). (TZ) (Calculated from mktime(tm).)" + if s.bytes().next() == Some(b'@') { + if let Ok(ts) = &s[1..].parse::() { + // Don't convert to local time in this case - seconds since epoch are not time-zone dependent + return Ok(local_dt_to_filetime( + time::OffsetDateTime::from_unix_timestamp(*ts).unwrap(), + )); + } + } + + Err(USimpleError::new(1, format!("Unable to parse date: {}", s))) } +// "%Y%m%d%H%M.%S" 15 chars +const YYYYMMDDHHMM_DOT_SS_FORMAT: &[time::format_description::FormatItem] = format_description!( + "[year repr:full][month repr:numerical padding:zero][day][hour][minute].[second]" +); + +// "%Y%m%d%H%M" 12 chars +const YYYYMMDDHHMM_FORMAT: &[time::format_description::FormatItem] = + format_description!("[year repr:full][month repr:numerical padding:zero][day][hour][minute]"); + +// "%y%m%d%H%M.%S" 13 chars +const YYMMDDHHMM_DOT_SS_FORMAT: &[time::format_description::FormatItem] = + format_description!("[year repr:last_two padding:none][month][day][hour][minute].[second]"); + +// "%y%m%d%H%M" 10 chars +const YYMMDDHHMM_FORMAT: &[time::format_description::FormatItem] = + format_description!("[year repr:last_two padding:none][month padding:zero][day padding:zero][hour repr:24 padding:zero][minute padding:zero]"); + fn parse_timestamp(s: &str) -> UResult { - let now = time::now(); - let (format, ts) = match s.chars().count() { - 15 => ("%Y%m%d%H%M.%S", s.to_owned()), - 12 => ("%Y%m%d%H%M", s.to_owned()), - 13 => ("%y%m%d%H%M.%S", s.to_owned()), - 10 => ("%y%m%d%H%M", s.to_owned()), - 11 => ("%Y%m%d%H%M.%S", format!("{}{}", now.tm_year + 1900, s)), - 8 => ("%Y%m%d%H%M", format!("{}{}", now.tm_year + 1900, s)), + // TODO: handle error + let now = time::OffsetDateTime::now_utc(); + + let (mut format, mut ts) = match s.chars().count() { + 15 => (YYYYMMDDHHMM_DOT_SS_FORMAT, s.to_owned()), + 12 => (YYYYMMDDHHMM_FORMAT, s.to_owned()), + 13 => (YYMMDDHHMM_DOT_SS_FORMAT, s.to_owned()), + 10 => (YYMMDDHHMM_FORMAT, s.to_owned()), + 11 => (YYYYMMDDHHMM_DOT_SS_FORMAT, format!("{}{}", now.year(), s)), + 8 => (YYYYMMDDHHMM_FORMAT, format!("{}{}", now.year(), s)), _ => { return Err(USimpleError::new( 1, @@ -287,30 +328,39 @@ fn parse_timestamp(s: &str) -> UResult { )) } }; - - let tm = time::strptime(&ts, format) - .map_err(|_| USimpleError::new(1, format!("invalid date format {}", s.quote())))?; - - let mut local = to_local(tm); - local.tm_isdst = -1; - let ft = local_tm_to_filetime(local); - - // We have to check that ft is valid time. Due to daylight saving - // time switch, local time can jump from 1:59 AM to 3:00 AM, - // in which case any time between 2:00 AM and 2:59 AM is not valid. - // Convert back to local time and see if we got the same value back. - let ts = time::Timespec { - sec: ft.unix_seconds(), - nsec: 0, - }; - let tm2 = time::at(ts); - if tm.tm_hour != tm2.tm_hour { - return Err(USimpleError::new( - 1, - format!("invalid date format {}", s.quote()), - )); + // workaround time returning Err(TryFromParsed(InsufficientInformation)) for year w/ + // repr:last_two + // https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=1ccfac7c07c5d1c7887a11decf0e1996 + if s.chars().count() == 10 { + format = YYYYMMDDHHMM_FORMAT; + ts = "20".to_owned() + &ts; + } else if s.chars().count() == 13 { + format = YYYYMMDDHHMM_DOT_SS_FORMAT; + ts = "20".to_owned() + &ts; } + let tm = time::PrimitiveDateTime::parse(&ts, &format) + .map_err(|_| USimpleError::new(1, format!("invalid date ts format {}", ts.quote())))?; + + let local = to_local(tm); + let ft = local_dt_to_filetime(local); + + // // We have to check that ft is valid time. Due to daylight saving + // // time switch, local time can jump from 1:59 AM to 3:00 AM, + // // in which case any time between 2:00 AM and 2:59 AM is not valid. + // // Convert back to local time and see if we got the same value back. + // let ts = time::Timespec { + // sec: ft.unix_seconds(), + // nsec: 0, + // }; + // let tm2 = time::at(ts); + // if tm.tm_hour != tm2.tm_hour { + // return Err(USimpleError::new( + // 1, + // format!("invalid date format {}", s.quote()), + // )); + // } + Ok(ft) } diff --git a/src/uu/uptime/src/uptime.rs b/src/uu/uptime/src/uptime.rs index a93344dbcd1..5c64cb5af17 100644 --- a/src/uu/uptime/src/uptime.rs +++ b/src/uu/uptime/src/uptime.rs @@ -111,9 +111,9 @@ fn process_utmpx() -> (Option, usize) { match line.record_type() { USER_PROCESS => nusers += 1, BOOT_TIME => { - let t = line.login_time().to_timespec(); - if t.sec > 0 { - boot_time = Some(t.sec as time_t); + let dt = line.login_time(); + if dt.second() > 0 { + boot_time = Some(dt.second() as time_t); } } _ => continue, diff --git a/src/uu/who/src/who.rs b/src/uu/who/src/who.rs index 6e21ac91257..47d96a38189 100644 --- a/src/uu/who/src/who.rs +++ b/src/uu/who/src/who.rs @@ -275,10 +275,10 @@ struct Who { fn idle_string<'a>(when: i64, boottime: i64) -> Cow<'a, str> { thread_local! { - static NOW: time::Tm = time::now() + static NOW: time::OffsetDateTime = time::OffsetDateTime::now_local().unwrap(); } NOW.with(|n| { - let now = n.to_timespec().sec; + let now = n.unix_timestamp(); if boottime < when && now - 24 * 3600 < when && when <= now { let seconds_idle = now - when; if seconds_idle < 60 { @@ -298,7 +298,11 @@ fn idle_string<'a>(when: i64, boottime: i64) -> Cow<'a, str> { } fn time_string(ut: &Utmpx) -> String { - time::strftime("%b %e %H:%M", &ut.login_time()).unwrap() // LC_ALL=C + // "%b %e %H:%M" + let time_format: Vec = + time::format_description::parse("[month repr:short] [day padding:space] [hour]:[minute]") + .unwrap(); + ut.login_time().format(&time_format).unwrap() // LC_ALL=C } #[inline] diff --git a/src/uucore/Cargo.toml b/src/uucore/Cargo.toml index 6f74b238a04..5b363376d24 100644 --- a/src/uucore/Cargo.toml +++ b/src/uucore/Cargo.toml @@ -26,7 +26,7 @@ wild = "2.0" # * optional itertools = { version="0.10.0", optional=true } thiserror = { version="1.0", optional=true } -time = { version="<= 0.1.43", optional=true } +time = { version="<= 0.3.10", optional=true, features = ["formatting", "local-offset", "macros"] } # * "problem" dependencies (pinned) data-encoding = { version="2.1", optional=true } data-encoding-macro = { version="0.1.12", optional=true } @@ -62,6 +62,6 @@ process = ["libc"] ringbuffer = [] signals = [] utf8 = [] -utmpx = ["time", "libc", "dns-lookup"] +utmpx = ["time", "time/macros", "libc", "dns-lookup"] wide = [] pipes = ["nix"] diff --git a/src/uucore/src/lib/features/fsext.rs b/src/uucore/src/lib/features/fsext.rs index eeaf5406137..838bfd4b5e0 100644 --- a/src/uucore/src/lib/features/fsext.rs +++ b/src/uucore/src/lib/features/fsext.rs @@ -12,6 +12,7 @@ // spell-checker:ignore (arch) bitrig ; (fs) cifs smbfs extern crate time; +use time::macros::format_description; pub use crate::*; // import macros from `../../macros.rs` @@ -63,7 +64,6 @@ fn LPWSTR2String(buf: &[u16]) -> String { String::from_utf16(&buf[..len]).unwrap() } -use self::time::Timespec; #[cfg(unix)] use libc::{ mode_t, strerror, S_IFBLK, S_IFCHR, S_IFDIR, S_IFIFO, S_IFLNK, S_IFMT, S_IFREG, S_IFSOCK, @@ -732,11 +732,17 @@ where } } +// match strftime "%Y-%m-%d %H:%M:%S.%f %z" +const PRETTY_DATETIME_FORMAT: &[time::format_description::FormatItem] = format_description!("[year]-[month]-[day padding:zero] [hour]:[minute]:[second].[subsecond] [offset_hour][offset_minute]"); + pub fn pretty_time(sec: i64, nsec: i64) -> String { // sec == seconds since UNIX_EPOCH // nsec == nanoseconds since (UNIX_EPOCH + sec) - let tm = time::at(Timespec::new(sec, nsec as i32)); - let res = time::strftime("%Y-%m-%d %H:%M:%S.%f %z", &tm).unwrap(); + let ts_nanos: i128 = (sec * 1_000_000_000 + nsec).into(); + // TODO: return errors to caller + let tm = time::OffsetDateTime::from_unix_timestamp_nanos(ts_nanos).unwrap(); + + let res = tm.format(&PRETTY_DATETIME_FORMAT).unwrap(); if res.ends_with(" -0000") { res.replace(" -0000", " +0000") } else { diff --git a/src/uucore/src/lib/features/utmpx.rs b/src/uucore/src/lib/features/utmpx.rs index 302d03d71ef..dc66eae097d 100644 --- a/src/uucore/src/lib/features/utmpx.rs +++ b/src/uucore/src/lib/features/utmpx.rs @@ -32,7 +32,6 @@ //! ``` pub extern crate time; -use self::time::{Timespec, Tm}; use std::ffi::CString; use std::io::Result as IOResult; @@ -189,11 +188,14 @@ impl Utmpx { chars2string!(self.inner.ut_line) } /// A.K.A. ut.ut_tv - pub fn login_time(&self) -> Tm { - time::at(Timespec::new( - self.inner.ut_tv.tv_sec as i64, - self.inner.ut_tv.tv_usec as i32, - )) + pub fn login_time(&self) -> time::OffsetDateTime { + let ts_nanos: i128 = (self.inner.ut_tv.tv_sec as i64 * 1_000_000_000 as i64 + + self.inner.ut_tv.tv_usec as i64 * 1_000 as i64) + .into(); + let local_offset = time::OffsetDateTime::now_local().unwrap().offset(); + time::OffsetDateTime::from_unix_timestamp_nanos(ts_nanos) + .unwrap() + .to_offset(local_offset) } /// A.K.A. ut.ut_exit /// diff --git a/tests/by-util/test_mv.rs b/tests/by-util/test_mv.rs index c4ec03d95be..06f4d5259a7 100644 --- a/tests/by-util/test_mv.rs +++ b/tests/by-util/test_mv.rs @@ -595,9 +595,9 @@ fn test_mv_update_option() { at.touch(file_a); at.touch(file_b); - let ts = time::now().to_timespec(); - let now = FileTime::from_unix_time(ts.sec as i64, ts.nsec as u32); - let later = FileTime::from_unix_time(ts.sec as i64 + 3600, ts.nsec as u32); + let ts = time::OffsetDateTime::now_local().unwrap(); + let now = FileTime::from_unix_time(ts.unix_timestamp(), ts.nanosecond()); + let later = FileTime::from_unix_time(ts.unix_timestamp() as i64 + 3600, ts.nanosecond() as u32); filetime::set_file_times(at.plus_as_string(file_a), now, now).unwrap(); filetime::set_file_times(at.plus_as_string(file_b), now, later).unwrap(); diff --git a/tests/by-util/test_touch.rs b/tests/by-util/test_touch.rs index 6e5d656c403..6de6358318b 100644 --- a/tests/by-util/test_touch.rs +++ b/tests/by-util/test_touch.rs @@ -4,6 +4,7 @@ extern crate touch; use self::touch::filetime::{self, FileTime}; extern crate time; +use time::macros::{datetime, format_description}; use crate::common::util::*; use std::fs::remove_file; @@ -32,11 +33,18 @@ fn set_file_times(at: &AtPath, path: &str, atime: FileTime, mtime: FileTime) { // Adjusts for local timezone fn str_to_filetime(format: &str, s: &str) -> FileTime { - let mut tm = time::strptime(s, format).unwrap(); - tm.tm_utcoff = time::now().tm_utcoff; - tm.tm_isdst = -1; // Unknown flag DST - let ts = tm.to_timespec(); - FileTime::from_unix_time(ts.sec as i64, ts.nsec as u32) + let format_description = match format { + "%y%m%d%H%M" => format_description!("[year repr:last_two][month][day][hour][minute]"), + "%y%m%d%H%M.%S" => { + format_description!("[year repr:last_two][month][day][hour][minute].[second]") + } + "%Y%m%d%H%M" => format_description!("[year][month][day][hour][minute]"), + "%Y%m%d%H%M.%S" => format_description!("[year][month][day][hour][minute].[second]"), + _ => panic!("unexpected dt format"), + }; + let tm = time::PrimitiveDateTime::parse(&s, &format_description).unwrap(); + let offset_dt = tm.assume_offset(time::OffsetDateTime::now_local().unwrap().offset()); + FileTime::from_unix_time(offset_dt.unix_timestamp(), tm.nanosecond()) } #[test] @@ -83,7 +91,10 @@ fn test_touch_set_mdhm_time() { let start_of_year = str_to_filetime( "%Y%m%d%H%M", - &format!("{}01010000", 1900 + time::now().tm_year), + &format!( + "{}01010000", + time::OffsetDateTime::now_local().unwrap().year() + ), ); let (atime, mtime) = get_file_times(&at, file); assert_eq!(atime, mtime); @@ -104,7 +115,7 @@ fn test_touch_set_mdhms_time() { let start_of_year = str_to_filetime( "%Y%m%d%H%M.%S", - &format!("{}01010000.00", 1900 + time::now().tm_year), + &format!("{}01010000.00", time::OffsetDateTime::now_utc().year()), ); let (atime, mtime) = get_file_times(&at, file); assert_eq!(atime, mtime); @@ -123,7 +134,7 @@ fn test_touch_set_ymdhm_time() { assert!(at.file_exists(file)); - let start_of_year = str_to_filetime("%y%m%d%H%M", "1501010000"); + let start_of_year = str_to_filetime("%Y%m%d%H%M", "201501010000"); let (atime, mtime) = get_file_times(&at, file); assert_eq!(atime, mtime); assert_eq!(atime.unix_seconds() - start_of_year.unix_seconds(), 45240); @@ -141,7 +152,7 @@ fn test_touch_set_ymdhms_time() { assert!(at.file_exists(file)); - let start_of_year = str_to_filetime("%y%m%d%H%M.%S", "1501010000.00"); + let start_of_year = str_to_filetime("%Y%m%d%H%M.%S", "201501010000.00"); let (atime, mtime) = get_file_times(&at, file); assert_eq!(atime, mtime); assert_eq!(atime.unix_seconds() - start_of_year.unix_seconds(), 45296); @@ -430,18 +441,18 @@ fn test_touch_mtime_dst_succeeds() { assert_eq!(target_time, mtime); } -// is_dst_switch_hour returns true if timespec ts is just before the switch -// to Daylight Saving Time. -// For example, in EST (UTC-5), Timespec { sec: 1583647200, nsec: 0 } -// for March 8 2020 01:00:00 AM -// is just before the switch because on that day clock jumps by 1 hour, -// so 1 minute after 01:59:00 is 03:00:00. -fn is_dst_switch_hour(ts: time::Timespec) -> bool { - let ts_after = ts + time::Duration::hours(1); - let tm = time::at(ts); - let tm_after = time::at(ts_after); - tm_after.tm_hour == tm.tm_hour + 2 -} +// // is_dst_switch_hour returns true if timespec ts is just before the switch +// // to Daylight Saving Time. +// // For example, in EST (UTC-5), Timespec { sec: 1583647200, nsec: 0 } +// // for March 8 2020 01:00:00 AM +// // is just before the switch because on that day clock jumps by 1 hour, +// // so 1 minute after 01:59:00 is 03:00:00. +// fn is_dst_switch_hour(ts: time::Timespec) -> bool { +// let ts_after = ts + time::Duration::hours(1); +// let tm = time::at(ts); +// let tm_after = time::at(ts_after); +// tm_after.tm_hour == tm.tm_hour + 2 +// } // get_dst_switch_hour returns date string for which touch -m -t fails. // For example, in EST (UTC-5), that will be "202003080200" so @@ -450,23 +461,24 @@ fn is_dst_switch_hour(ts: time::Timespec) -> bool { // In other locales it will be a different date/time, and in some locales // it doesn't exist at all, in which case this function will return None. fn get_dst_switch_hour() -> Option { - let now = time::now(); + let now = time::OffsetDateTime::now_local().unwrap(); + // Start from January 1, 2020, 00:00. - let mut tm = time::strptime("20200101-0000", "%Y%m%d-%H%M").unwrap(); - tm.tm_isdst = -1; - tm.tm_utcoff = now.tm_utcoff; - let mut ts = tm.to_timespec(); - // Loop through all hours in year 2020 until we find the hour just - // before the switch to DST. - for _i in 0..(366 * 24) { - if is_dst_switch_hour(ts) { - let mut tm = time::at(ts); - tm.tm_hour += 1; - let s = time::strftime("%Y%m%d%H%M", &tm).unwrap(); - return Some(s); - } - ts = ts + time::Duration::hours(1); - } + let tm = datetime!(2020-01-01 00:00 UTC); + tm.to_offset(now.offset()); + + // let mut ts = tm.to_timespec(); + // // Loop through all hours in year 2020 until we find the hour just + // // before the switch to DST. + // for _i in 0..(366 * 24) { + // // if is_dst_switch_hour(ts) { + // // let mut tm = time::at(ts); + // // tm.tm_hour += 1; + // // let s = time::strftime("%Y%m%d%H%M", &tm).unwrap(); + // // return Some(s); + // // } + // ts = ts + time::Duration::hours(1); + // } None } From f810b55d8660abf98e4d0aad1842a123b3160932 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sat, 23 Apr 2022 22:05:43 +0200 Subject: [PATCH 135/242] build in verbose mode (cfg isn't used) --- .github/workflows/CICD.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml index 967e77b60d1..fbe04a1db34 100644 --- a/.github/workflows/CICD.yml +++ b/.github/workflows/CICD.yml @@ -384,7 +384,7 @@ jobs: uses: actions-rs/cargo@v1 with: command: test - args: ${{ steps.vars.outputs.CARGO_FEATURES_OPTION }} -p uucore -p coreutils + args: -v ${{ steps.vars.outputs.CARGO_FEATURES_OPTION }} -p uucore -p coreutils env: RUSTFLAGS: "-Awarnings" From 3a576f2441bb29162576d49170f42241dc0e3581 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sat, 23 Apr 2022 21:32:35 +0200 Subject: [PATCH 136/242] time: Various fixes --- .cargo/config | 9 +++++++++ .github/workflows/CICD.yml | 2 +- Cargo.lock | 30 +++++++++++++++++++++++++--- src/uu/touch/src/touch.rs | 3 +-- src/uucore/src/lib/features/fsext.rs | 2 +- src/uucore/src/lib/features/utmpx.rs | 4 ++-- tests/by-util/test_cp.rs | 12 +++++------ tests/by-util/test_touch.rs | 26 ++++++++++++++++++++---- 8 files changed, 69 insertions(+), 19 deletions(-) diff --git a/.cargo/config b/.cargo/config index 0a8fd3d00ce..26008597f0c 100644 --- a/.cargo/config +++ b/.cargo/config @@ -9,3 +9,12 @@ rustflags = [ "-Wclippy::single_char_pattern", "-Wclippy::explicit_iter_loop", ] + +[build] +# See https://github.com/time-rs/time/issues/293#issuecomment-1005002386. The +# unsoundness here is not in the `time` library, but in the Rust stdlib, and as +# such it needs to be fixed there. +rustflags = "--cfg unsound_local_offset" + +[target.'cfg(target_os = "linux")'] +rustflags = ["--cfg", "unsound_local_offset"] diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml index fbe04a1db34..04acd4c1825 100644 --- a/.github/workflows/CICD.yml +++ b/.github/workflows/CICD.yml @@ -386,7 +386,7 @@ jobs: command: test args: -v ${{ steps.vars.outputs.CARGO_FEATURES_OPTION }} -p uucore -p coreutils env: - RUSTFLAGS: "-Awarnings" + RUSTFLAGS: "-Awarnings --cfg unsound_local_offset" deps: name: Dependencies diff --git a/Cargo.lock b/Cargo.lock index 497d7ab4244..69a83941b38 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -871,7 +871,7 @@ checksum = "418d37c8b1d42553c93648be529cb70f920d3baf8ef469b74b9638df426e0b4c" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi 0.10.2+wasi-snapshot-preview1", + "wasi 0.10.0+wasi-snapshot-preview1", ] [[package]] @@ -985,6 +985,12 @@ dependencies = [ "either", ] +[[package]] +name = "itoa" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" + [[package]] name = "keccak" version = "0.1.0" @@ -1958,12 +1964,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" dependencies = [ "libc", - "wasi", + "wasi 0.10.0+wasi-snapshot-preview1", "winapi 0.3.9", ] [[package]] -< time::OffsetDateTime { - let ts_nanos: i128 = (self.inner.ut_tv.tv_sec as i64 * 1_000_000_000 as i64 - + self.inner.ut_tv.tv_usec as i64 * 1_000 as i64) + let ts_nanos: i128 = (self.inner.ut_tv.tv_sec as i64 * 1_000_000_000_i64 + + self.inner.ut_tv.tv_usec as i64 * 1_000_i64) .into(); let local_offset = time::OffsetDateTime::now_local().unwrap().offset(); time::OffsetDateTime::from_unix_timestamp_nanos(ts_nanos) diff --git a/tests/by-util/test_cp.rs b/tests/by-util/test_cp.rs index 079e966be3b..90e85b76afb 100644 --- a/tests/by-util/test_cp.rs +++ b/tests/by-util/test_cp.rs @@ -1032,8 +1032,8 @@ fn test_cp_no_deref_folder_to_folder() { #[cfg(target_os = "linux")] fn test_cp_archive() { let (at, mut ucmd) = at_and_ucmd!(); - let ts = time::now().to_timespec(); - let previous = FileTime::from_unix_time(ts.sec as i64 - 3600, ts.nsec as u32); + let ts = time::OffsetDateTime::now_local().unwrap(); + let previous = FileTime::from_unix_time(ts.unix_timestamp() - 3600, ts.nanosecond() as u32); // set the file creation/modification an hour ago filetime::set_file_times( at.plus_as_string(TEST_HELLO_WORLD_SOURCE), @@ -1135,8 +1135,8 @@ fn test_cp_archive_recursive() { #[cfg(any(target_os = "linux", target_os = "android"))] fn test_cp_preserve_timestamps() { let (at, mut ucmd) = at_and_ucmd!(); - let ts = time::now().to_timespec(); - let previous = FileTime::from_unix_time(ts.sec as i64 - 3600, ts.nsec as u32); + let ts = time::OffsetDateTime::now_local().unwrap(); + let previous = FileTime::from_unix_time(ts.unix_timestamp() - 3600, ts.nanosecond()); // set the file creation/modification an hour ago filetime::set_file_times( at.plus_as_string(TEST_HELLO_WORLD_SOURCE), @@ -1168,8 +1168,8 @@ fn test_cp_preserve_timestamps() { #[cfg(any(target_os = "linux", target_os = "android"))] fn test_cp_no_preserve_timestamps() { let (at, mut ucmd) = at_and_ucmd!(); - let ts = time::now().to_timespec(); - let previous = FileTime::from_unix_time(ts.sec as i64 - 3600, ts.nsec as u32); + let ts = time::OffsetDateTime::now_local().unwrap(); + let previous = FileTime::from_unix_time(ts.unix_timestamp() - 3600, ts.nanosecond()); // set the file creation/modification an hour ago filetime::set_file_times( at.plus_as_string(TEST_HELLO_WORLD_SOURCE), diff --git a/tests/by-util/test_touch.rs b/tests/by-util/test_touch.rs index 6de6358318b..2c538d8b404 100644 --- a/tests/by-util/test_touch.rs +++ b/tests/by-util/test_touch.rs @@ -1,4 +1,10 @@ -// spell-checker:ignore (formats) cymdhm cymdhms mdhm mdhms ymdhm ymdhms +// spell-checker:ignore (formats) cymdhm cymdhms mdhm mdhms ymdhm ymdhms datetime mktime + +// This test relies on +// --cfg unsound_local_offset +// https://github.com/time-rs/time/blob/deb8161b84f355b31e39ce09e40c4d6ce3fea837/src/sys/local_offset_at/unix.rs#L112-L120= +// See https://github.com/time-rs/time/issues/293#issuecomment-946382614= +// Defined in .cargo/config extern crate touch; use self::touch::filetime::{self, FileTime}; @@ -42,8 +48,14 @@ fn str_to_filetime(format: &str, s: &str) -> FileTime { "%Y%m%d%H%M.%S" => format_description!("[year][month][day][hour][minute].[second]"), _ => panic!("unexpected dt format"), }; - let tm = time::PrimitiveDateTime::parse(&s, &format_description).unwrap(); - let offset_dt = tm.assume_offset(time::OffsetDateTime::now_local().unwrap().offset()); + let tm = time::PrimitiveDateTime::parse(s, &format_description).unwrap(); + let d = match time::OffsetDateTime::now_local() { + Ok(now) => now, + Err(e) => { + panic!("Error {} retrieving the OffsetDateTime::now_local", e); + } + }; + let offset_dt = tm.assume_offset(d.offset()); FileTime::from_unix_time(offset_dt.unix_timestamp(), tm.nanosecond()) } @@ -461,7 +473,13 @@ fn test_touch_mtime_dst_succeeds() { // In other locales it will be a different date/time, and in some locales // it doesn't exist at all, in which case this function will return None. fn get_dst_switch_hour() -> Option { - let now = time::OffsetDateTime::now_local().unwrap(); + //let now = time::OffsetDateTime::now_local().unwrap(); + let now = match time::OffsetDateTime::now_local() { + Ok(now) => now, + Err(e) => { + panic!("Error {} retrieving the OffsetDateTime::now_local", e); + } + }; // Start from January 1, 2020, 00:00. let tm = datetime!(2020-01-01 00:00 UTC); From e23dd687155c91e50d1c9f90dbfe7d9ef047657a Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sun, 24 Apr 2022 09:50:39 +0200 Subject: [PATCH 137/242] time: Force the display of the tz sign --- src/uucore/src/lib/features/fsext.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/uucore/src/lib/features/fsext.rs b/src/uucore/src/lib/features/fsext.rs index 75a0c2f9721..0d64661ee1c 100644 --- a/src/uucore/src/lib/features/fsext.rs +++ b/src/uucore/src/lib/features/fsext.rs @@ -733,7 +733,7 @@ where } // match strftime "%Y-%m-%d %H:%M:%S.%f %z" -const PRETTY_DATETIME_FORMAT: &[time::format_description::FormatItem] = format_description!("[year]-[month]-[day padding:zero] [hour]:[minute]:[second].[subsecond] [offset_hour][offset_minute]"); +const PRETTY_DATETIME_FORMAT: &[time::format_description::FormatItem] = format_description!("[year]-[month]-[day padding:zero] [hour]:[minute]:[second].[subsecond] [offset_hour sign:mandatory][offset_minute]"); pub fn pretty_time(sec: i64, nsec: i64) -> String { // sec == seconds since UNIX_EPOCH From 326dc5080d74dd79406fa828e1754d50e78e9e8e Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sun, 24 Apr 2022 09:50:58 +0200 Subject: [PATCH 138/242] stat: add a test to verify time easily --- tests/by-util/test_stat.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/by-util/test_stat.rs b/tests/by-util/test_stat.rs index 90ad2d12aaa..6140f50170f 100644 --- a/tests/by-util/test_stat.rs +++ b/tests/by-util/test_stat.rs @@ -283,6 +283,25 @@ fn test_char() { ts.ucmd().args(&args).succeeds().stdout_is(expected_stdout); } +#[cfg(any(target_os = "linux", target_os = "android", target_vendor = "apple"))] +#[test] +fn test_date() { + // Just test the date for the time 0.3 change + let args = [ + "-c", + #[cfg(any(target_os = "linux", target_os = "android"))] + "%z", + #[cfg(target_os = "linux")] + "/dev/pts/ptmx", + #[cfg(any(target_vendor = "apple"))] + "%z", + #[cfg(any(target_os = "android", target_vendor = "apple"))] + "/dev/ptmx", + ]; + let ts = TestScenario::new(util_name!()); + let expected_stdout = unwrap_or_return!(expected_result(&ts, &args)).stdout_move_str(); + ts.ucmd().args(&args).succeeds().stdout_is(expected_stdout); +} #[cfg(unix)] #[test] fn test_multi_files() { From 10eaaae2723f61f8588dabcb78df9ec57f7ce80c Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sun, 24 Apr 2022 09:51:15 +0200 Subject: [PATCH 139/242] time: take in account the local tz --- src/uucore/src/lib/features/fsext.rs | 29 ++++++++++++++++++++++++---- tests/by-util/test_stat.rs | 17 +++++++++++++++- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/uucore/src/lib/features/fsext.rs b/src/uucore/src/lib/features/fsext.rs index 0d64661ee1c..3f5b2b77cac 100644 --- a/src/uucore/src/lib/features/fsext.rs +++ b/src/uucore/src/lib/features/fsext.rs @@ -13,6 +13,7 @@ extern crate time; use time::macros::format_description; +use time::UtcOffset; pub use crate::*; // import macros from `../../macros.rs` @@ -733,16 +734,36 @@ where } // match strftime "%Y-%m-%d %H:%M:%S.%f %z" -const PRETTY_DATETIME_FORMAT: &[time::format_description::FormatItem] = format_description!("[year]-[month]-[day padding:zero] [hour]:[minute]:[second].[subsecond] [offset_hour sign:mandatory][offset_minute]"); +const PRETTY_DATETIME_FORMAT: &[time::format_description::FormatItem] = format_description!("[year]-[month]-[day padding:zero] [hour]:[minute]:[second].[subsecond digits:9] [offset_hour sign:mandatory][offset_minute]"); pub fn pretty_time(sec: i64, nsec: i64) -> String { // sec == seconds since UNIX_EPOCH // nsec == nanoseconds since (UNIX_EPOCH + sec) let ts_nanos: i128 = (sec * 1_000_000_000 + nsec).into(); - // TODO: return errors to caller - let tm = time::OffsetDateTime::from_unix_timestamp_nanos(ts_nanos).unwrap(); - let res = tm.format(&PRETTY_DATETIME_FORMAT).unwrap(); + // Return the date in UTC + let tm = match time::OffsetDateTime::from_unix_timestamp_nanos(ts_nanos) { + Ok(tm) => tm, + Err(e) => { + panic!("error: {}", e); + } + }; + + // Get the offset to convert to local time + // Because of DST (daylight saving), we get the local time back when + // the date was set + let local_offset = match UtcOffset::local_offset_at(tm) { + Ok(lo) => lo, + Err(e) => { + panic!("error: {}", e); + } + }; + + // Include the conversion to local time + let res = tm + .to_offset(local_offset) + .format(&PRETTY_DATETIME_FORMAT) + .unwrap(); if res.ends_with(" -0000") { res.replace(" -0000", " +0000") } else { diff --git a/tests/by-util/test_stat.rs b/tests/by-util/test_stat.rs index 6140f50170f..0871a48fe9f 100644 --- a/tests/by-util/test_stat.rs +++ b/tests/by-util/test_stat.rs @@ -292,7 +292,22 @@ fn test_date() { #[cfg(any(target_os = "linux", target_os = "android"))] "%z", #[cfg(target_os = "linux")] - "/dev/pts/ptmx", + "/bin/sh", + #[cfg(any(target_vendor = "apple"))] + "%z", + #[cfg(any(target_os = "android", target_vendor = "apple"))] + "/bin/sh", + ]; + let ts = TestScenario::new(util_name!()); + let expected_stdout = unwrap_or_return!(expected_result(&ts, &args)).stdout_move_str(); + ts.ucmd().args(&args).succeeds().stdout_is(expected_stdout); + // Just test the date for the time 0.3 change + let args = [ + "-c", + #[cfg(any(target_os = "linux", target_os = "android"))] + "%z", + #[cfg(target_os = "linux")] + "/dev/ptmx", #[cfg(any(target_vendor = "apple"))] "%z", #[cfg(any(target_os = "android", target_vendor = "apple"))] From 3b3585bbe548a5259944685f3114c84730155929 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Wed, 27 Apr 2022 08:43:59 +0200 Subject: [PATCH 140/242] add time 0.1.44 to cargo deny And no longer ignore RUSTSEC-2022-0013 --- deny.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deny.toml b/deny.toml index 1d790456f50..f659910e825 100644 --- a/deny.toml +++ b/deny.toml @@ -12,7 +12,6 @@ yanked = "warn" notice = "warn" ignore = [ "RUSTSEC-2020-0159", - "RUSTSEC-2022-0013", "RUSTSEC-2020-0071", #"RUSTSEC-0000-0000", ] @@ -87,6 +86,8 @@ skip = [ { name = "memchr", version = "=1.0.2" }, { name = "quote", version = "=0.3.15" }, { name = "unicode-xid", version = "=0.0.4" }, + # chrono + { name = "time", version = "=0.1.44" }, ] # spell-checker: enable From c009e1bed8a5b9c5eef667584fcf2b632dcdfaa2 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Thu, 28 Apr 2022 00:06:07 +0200 Subject: [PATCH 141/242] workaround the tests/touch/60-seconds test to skip leap second --- src/uu/touch/src/touch.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/uu/touch/src/touch.rs b/src/uu/touch/src/touch.rs index a3a344ad41b..e74aaa7001c 100644 --- a/src/uu/touch/src/touch.rs +++ b/src/uu/touch/src/touch.rs @@ -337,7 +337,12 @@ fn parse_timestamp(s: &str) -> UResult { format = YYYYMMDDHHMM_DOT_SS_FORMAT; ts = "20".to_owned() + &ts; } - + if (format == YYYYMMDDHHMM_DOT_SS_FORMAT || format == YYMMDDHHMM_DOT_SS_FORMAT) + && ts.ends_with(".60") + { + // Work around to disable leap seconds + ts = ts.replace(".60", ".59"); + } let tm = time::PrimitiveDateTime::parse(&ts, &format) .map_err(|_| USimpleError::new(1, format!("invalid date ts format {}", ts.quote())))?; From 2b11d773952fb45de8fa0a4360b67c160f24ed49 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Thu, 28 Apr 2022 08:22:48 +0200 Subject: [PATCH 142/242] time: Improve the l&f --- src/uu/touch/src/touch.rs | 24 ++++++++++++++++-------- src/uucore/Cargo.toml | 2 +- src/uucore/src/lib/features/fsext.rs | 7 ++++++- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/uu/touch/src/touch.rs b/src/uu/touch/src/touch.rs index e74aaa7001c..9a4c0fe5db0 100644 --- a/src/uu/touch/src/touch.rs +++ b/src/uu/touch/src/touch.rs @@ -247,7 +247,8 @@ fn stat(path: &Path, follow: bool) -> UResult<(FileTime, FileTime)> { } const POSIX_LOCALE_FORMAT: &[time::format_description::FormatItem] = format_description!( - "[weekday repr:short] [month repr:short] [day padding:space] [hour]:[minute]:[second] [year]" + "[weekday repr:short] [month repr:short] [day padding:space] \ + [hour]:[minute]:[second] [year]" ); const ISO_8601_FORMAT: &[time::format_description::FormatItem] = @@ -294,20 +295,27 @@ fn parse_date(s: &str) -> UResult { // "%Y%m%d%H%M.%S" 15 chars const YYYYMMDDHHMM_DOT_SS_FORMAT: &[time::format_description::FormatItem] = format_description!( - "[year repr:full][month repr:numerical padding:zero][day][hour][minute].[second]" + "[year repr:full][month repr:numerical padding:zero]\ + [day][hour][minute].[second]" ); // "%Y%m%d%H%M" 12 chars -const YYYYMMDDHHMM_FORMAT: &[time::format_description::FormatItem] = - format_description!("[year repr:full][month repr:numerical padding:zero][day][hour][minute]"); +const YYYYMMDDHHMM_FORMAT: &[time::format_description::FormatItem] = format_description!( + "[year repr:full][month repr:numerical padding:zero]\ + [day][hour][minute]" +); // "%y%m%d%H%M.%S" 13 chars -const YYMMDDHHMM_DOT_SS_FORMAT: &[time::format_description::FormatItem] = - format_description!("[year repr:last_two padding:none][month][day][hour][minute].[second]"); +const YYMMDDHHMM_DOT_SS_FORMAT: &[time::format_description::FormatItem] = format_description!( + "[year repr:last_two padding:none][month][day]\ + [hour][minute].[second]" +); // "%y%m%d%H%M" 10 chars -const YYMMDDHHMM_FORMAT: &[time::format_description::FormatItem] = - format_description!("[year repr:last_two padding:none][month padding:zero][day padding:zero][hour repr:24 padding:zero][minute padding:zero]"); +const YYMMDDHHMM_FORMAT: &[time::format_description::FormatItem] = format_description!( + "[year repr:last_two padding:none][month padding:zero][day padding:zero]\ + [hour repr:24 padding:zero][minute padding:zero]" +); fn parse_timestamp(s: &str) -> UResult { // TODO: handle error diff --git a/src/uucore/Cargo.toml b/src/uucore/Cargo.toml index 5b363376d24..c86a8cf0773 100644 --- a/src/uucore/Cargo.toml +++ b/src/uucore/Cargo.toml @@ -26,7 +26,7 @@ wild = "2.0" # * optional itertools = { version="0.10.0", optional=true } thiserror = { version="1.0", optional=true } -time = { version="<= 0.3.10", optional=true, features = ["formatting", "local-offset", "macros"] } +time = { version="<= 0.3", optional=true, features = ["formatting", "local-offset", "macros"] } # * "problem" dependencies (pinned) data-encoding = { version="2.1", optional=true } data-encoding-macro = { version="0.1.12", optional=true } diff --git a/src/uucore/src/lib/features/fsext.rs b/src/uucore/src/lib/features/fsext.rs index 3f5b2b77cac..3d7ca1c1f56 100644 --- a/src/uucore/src/lib/features/fsext.rs +++ b/src/uucore/src/lib/features/fsext.rs @@ -734,7 +734,12 @@ where } // match strftime "%Y-%m-%d %H:%M:%S.%f %z" -const PRETTY_DATETIME_FORMAT: &[time::format_description::FormatItem] = format_description!("[year]-[month]-[day padding:zero] [hour]:[minute]:[second].[subsecond digits:9] [offset_hour sign:mandatory][offset_minute]"); +const PRETTY_DATETIME_FORMAT: &[time::format_description::FormatItem] = format_description!( + "\ +[year]-[month]-[day padding:zero] \ +[hour]:[minute]:[second].[subsecond digits:9] \ +[offset_hour sign:mandatory][offset_minute]" +); pub fn pretty_time(sec: i64, nsec: i64) -> String { // sec == seconds since UNIX_EPOCH From 31c28eeaa98854797eb432aa6c890002c5133b0b Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Fri, 29 Apr 2022 10:28:49 +0200 Subject: [PATCH 143/242] fix gnu/tests/touch/60-seconds --- src/uu/touch/src/touch.rs | 18 ++++++++++++++---- tests/by-util/test_touch.rs | 18 ++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/uu/touch/src/touch.rs b/src/uu/touch/src/touch.rs index 9a4c0fe5db0..331867b5f13 100644 --- a/src/uu/touch/src/touch.rs +++ b/src/uu/touch/src/touch.rs @@ -17,6 +17,7 @@ use filetime::*; use std::fs::{self, File}; use std::path::{Path, PathBuf}; use time::macros::{format_description, time}; +use time::Duration; use uucore::display::Quotable; use uucore::error::{FromIo, UError, UResult, USimpleError}; use uucore::format_usage; @@ -345,16 +346,25 @@ fn parse_timestamp(s: &str) -> UResult { format = YYYYMMDDHHMM_DOT_SS_FORMAT; ts = "20".to_owned() + &ts; } - if (format == YYYYMMDDHHMM_DOT_SS_FORMAT || format == YYMMDDHHMM_DOT_SS_FORMAT) + + let leap_sec = if (format == YYYYMMDDHHMM_DOT_SS_FORMAT || format == YYMMDDHHMM_DOT_SS_FORMAT) && ts.ends_with(".60") { // Work around to disable leap seconds + // Used in gnu/tests/touch/60-seconds ts = ts.replace(".60", ".59"); - } + true + } else { + false + }; + let tm = time::PrimitiveDateTime::parse(&ts, &format) .map_err(|_| USimpleError::new(1, format!("invalid date ts format {}", ts.quote())))?; - - let local = to_local(tm); + let mut local = to_local(tm); + if leap_sec { + // We are dealing with a leap second, add it + local = local.saturating_add(Duration::SECOND); + } let ft = local_dt_to_filetime(local); // // We have to check that ft is valid time. Due to daylight saving diff --git a/tests/by-util/test_touch.rs b/tests/by-util/test_touch.rs index 2c538d8b404..d23fb090e1c 100644 --- a/tests/by-util/test_touch.rs +++ b/tests/by-util/test_touch.rs @@ -603,3 +603,21 @@ fn test_no_dereference_no_file() { .stderr_contains("setting times of 'not-a-file-1': No such file or directory") .stderr_contains("setting times of 'not-a-file-2': No such file or directory"); } + +#[test] +fn test_touch_leap_second() { + let (at, mut ucmd) = at_and_ucmd!(); + let file = "test_touch_leap_sec"; + + ucmd.args(&["-t", "197001010000.60", file]) + .succeeds() + .no_stderr(); + + assert!(at.file_exists(file)); + + let epoch = str_to_filetime("%Y%m%d%H%M", "197001010000"); + let (atime, mtime) = get_file_times(&at, file); + assert_eq!(atime, mtime); + assert_eq!(atime.unix_seconds() - epoch.unix_seconds(), 60); + assert_eq!(mtime.unix_seconds() - epoch.unix_seconds(), 60); +} From 9d81d6fef2729db4765529cf4b3b195a4b513626 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Fri, 29 Apr 2022 10:32:28 +0200 Subject: [PATCH 144/242] touch: add support of -d '1970-01-01 18:43:33.023456789' --- deny.toml | 2 +- src/uu/touch/src/touch.rs | 74 +++++++++++++++++++++++-------------- tests/by-util/test_touch.rs | 36 ++++++++++++++++++ 3 files changed, 84 insertions(+), 28 deletions(-) diff --git a/deny.toml b/deny.toml index f659910e825..8154bbf9059 100644 --- a/deny.toml +++ b/deny.toml @@ -64,7 +64,7 @@ highlight = "all" # spell-checker: disable skip = [ # getrandom - { name = "wasi", version="0.10.2+wasi-snapshot-preview1" }, + { name = "wasi", version="0.10.0+wasi-snapshot-preview1" }, # blake2d_simd { name = "arrayvec", version = "=0.7.2" }, # flimit/unix_socket diff --git a/src/uu/touch/src/touch.rs b/src/uu/touch/src/touch.rs index 331867b5f13..5264401ef43 100644 --- a/src/uu/touch/src/touch.rs +++ b/src/uu/touch/src/touch.rs @@ -6,7 +6,7 @@ // For the full copyright and license information, please view the LICENSE file // that was distributed with this source code. -// spell-checker:ignore (ToDO) filetime strptime utcoff strs datetime MMDDhhmm clapv PWSTR lpszfilepath hresult mktime YYYYMMDDHHMM YYMMDDHHMM DATETIME subsecond +// spell-checker:ignore (ToDO) filetime strptime utcoff strs datetime MMDDhhmm clapv PWSTR lpszfilepath hresult mktime YYYYMMDDHHMM YYMMDDHHMM DATETIME YYYYMMDDHHMMS pub extern crate filetime; #[macro_use] @@ -255,6 +255,41 @@ const POSIX_LOCALE_FORMAT: &[time::format_description::FormatItem] = format_desc const ISO_8601_FORMAT: &[time::format_description::FormatItem] = format_description!("[year]-[month]-[day]"); +// "%Y%m%d%H%M.%S" 15 chars +const YYYYMMDDHHMM_DOT_SS_FORMAT: &[time::format_description::FormatItem] = format_description!( + "[year repr:full][month repr:numerical padding:zero]\ + [day][hour][minute].[second]" +); + +// "%Y-%m-%d %H:%M:%S.%SS" 12 chars +const YYYYMMDDHHMMSS_FORMAT: &[time::format_description::FormatItem] = format_description!( + "[year repr:full]-[month repr:numerical padding:zero]-\ + [day] [hour]:[minute]:[second].[subsecond]" +); +// "%Y-%m-%d %H:%M:%S" 12 chars +const YYYYMMDDHHMMS_FORMAT: &[time::format_description::FormatItem] = format_description!( + "[year repr:full]-[month repr:numerical padding:zero]-\ + [day] [hour]:[minute]:[second]" +); + +// "%Y%m%d%H%M" 12 chars +const YYYYMMDDHHMM_FORMAT: &[time::format_description::FormatItem] = format_description!( + "[year repr:full][month repr:numerical padding:zero]\ + [day][hour][minute]" +); + +// "%y%m%d%H%M.%S" 13 chars +const YYMMDDHHMM_DOT_SS_FORMAT: &[time::format_description::FormatItem] = format_description!( + "[year repr:last_two padding:none][month][day]\ + [hour][minute].[second]" +); + +// "%y%m%d%H%M" 10 chars +const YYMMDDHHMM_FORMAT: &[time::format_description::FormatItem] = format_description!( + "[year repr:last_two padding:none][month padding:zero][day padding:zero]\ + [hour repr:24 padding:zero][minute padding:zero]" +); + fn parse_date(s: &str) -> UResult { // This isn't actually compatible with GNU touch, but there doesn't seem to // be any simple specification for what format this parameter allows and I'm @@ -269,8 +304,17 @@ fn parse_date(s: &str) -> UResult { // which is equivalent to the POSIX locale: %a %b %e %H:%M:%S %Y // Tue Dec 3 ... // ("%c", POSIX_LOCALE_FORMAT), - if let Ok(parsed) = time::PrimitiveDateTime::parse(s, &POSIX_LOCALE_FORMAT) { - return Ok(local_dt_to_filetime(to_local(parsed))); + // + // But also support other format found in the GNU tests like + // in tests/misc/stat-nanoseconds.sh + for fmt in [ + POSIX_LOCALE_FORMAT, + YYYYMMDDHHMMS_FORMAT, + YYYYMMDDHHMMSS_FORMAT, + ] { + if let Ok(parsed) = time::PrimitiveDateTime::parse(s, &fmt) { + return Ok(local_dt_to_filetime(to_local(parsed))); + } } // "Equivalent to %Y-%m-%d (the ISO 8601 date format). (C99)" @@ -294,30 +338,6 @@ fn parse_date(s: &str) -> UResult { Err(USimpleError::new(1, format!("Unable to parse date: {}", s))) } -// "%Y%m%d%H%M.%S" 15 chars -const YYYYMMDDHHMM_DOT_SS_FORMAT: &[time::format_description::FormatItem] = format_description!( - "[year repr:full][month repr:numerical padding:zero]\ - [day][hour][minute].[second]" -); - -// "%Y%m%d%H%M" 12 chars -const YYYYMMDDHHMM_FORMAT: &[time::format_description::FormatItem] = format_description!( - "[year repr:full][month repr:numerical padding:zero]\ - [day][hour][minute]" -); - -// "%y%m%d%H%M.%S" 13 chars -const YYMMDDHHMM_DOT_SS_FORMAT: &[time::format_description::FormatItem] = format_description!( - "[year repr:last_two padding:none][month][day]\ - [hour][minute].[second]" -); - -// "%y%m%d%H%M" 10 chars -const YYMMDDHHMM_FORMAT: &[time::format_description::FormatItem] = format_description!( - "[year repr:last_two padding:none][month padding:zero][day padding:zero]\ - [hour repr:24 padding:zero][minute padding:zero]" -); - fn parse_timestamp(s: &str) -> UResult { // TODO: handle error let now = time::OffsetDateTime::now_utc(); diff --git a/tests/by-util/test_touch.rs b/tests/by-util/test_touch.rs index d23fb090e1c..ed62692f4d8 100644 --- a/tests/by-util/test_touch.rs +++ b/tests/by-util/test_touch.rs @@ -427,6 +427,42 @@ fn test_touch_set_date3() { assert_eq!(mtime, expected); } +#[test] +fn test_touch_set_date4() { + let (at, mut ucmd) = at_and_ucmd!(); + let file = "test_touch_set_date"; + + ucmd.args(&["-d", "1970-01-01 18:43:33", file]) + .succeeds() + .no_stderr(); + + assert!(at.file_exists(file)); + + let expected = FileTime::from_unix_time(60213, 0); + let (atime, mtime) = get_file_times(&at, file); + assert_eq!(atime, mtime); + assert_eq!(atime, expected); + assert_eq!(mtime, expected); +} + +#[test] +fn test_touch_set_date5() { + let (at, mut ucmd) = at_and_ucmd!(); + let file = "test_touch_set_date"; + + ucmd.args(&["-d", "1970-01-01 18:43:33.023456789", file]) + .succeeds() + .no_stderr(); + + assert!(at.file_exists(file)); + + let expected = FileTime::from_unix_time(60213, 023456789); + let (atime, mtime) = get_file_times(&at, file); + assert_eq!(atime, mtime); + assert_eq!(atime, expected); + assert_eq!(mtime, expected); +} + #[test] fn test_touch_set_date_wrong_format() { let (_at, mut ucmd) = at_and_ucmd!(); From 417b4a22d093c225c78d4fffca17b8926a261912 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sun, 1 May 2022 17:07:29 +0200 Subject: [PATCH 145/242] GNU CI: show the new error --- .github/workflows/GnuTests.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.github/workflows/GnuTests.yml b/.github/workflows/GnuTests.yml index d306092c6f5..fedd6e4d535 100644 --- a/.github/workflows/GnuTests.yml +++ b/.github/workflows/GnuTests.yml @@ -170,6 +170,8 @@ jobs: REPO_DEFAULT_BRANCH='${{ steps.vars.outputs.repo_default_branch }}' if test -f "${REF_LOG_FILE}"; then echo "Reference SHA1/ID: $(sha1sum -- "${REF_SUMMARY_FILE}")" + REF_ERROR=$(sed -n "s/^FAIL: \([[:print:]]\+\).*/\1/p" "${REF_LOG_FILE}" | sort) + NEW_ERROR=$(sed -n "s/^FAIL: \([[:print:]]\+\).*/\1/p" '${{ steps.vars.outputs.path_GNU_tests }}/test-suite.log' | sort) REF_FAILING=$(sed -n "s/^FAIL: \([[:print:]]\+\).*/\1/p" "${REF_LOG_FILE}" | sort) NEW_FAILING=$(sed -n "s/^FAIL: \([[:print:]]\+\).*/\1/p" '${{ steps.vars.outputs.path_GNU_tests }}/test-suite.log' | sort) for LINE in ${REF_FAILING} @@ -186,6 +188,21 @@ jobs: have_new_failures="true" fi done + for LINE in ${REF_ERROR} + do + if ! grep -Fxq ${LINE}<<<"${NEW_ERROR}"; then + echo "::warning ::Congrats! The gnu test ${LINE} is no longer ERROR!" + fi + done + for LINE in ${NEW_ERROR} + do + if ! grep -Fxq ${LINE}<<<"${REF_ERROR}" + then + echo "::error ::GNU test failed: ${LINE}. ${LINE} is passing on '${{ steps.vars.outputs.repo_default_branch }}'. Maybe you have to rebase?" + have_new_failures="true" + fi + done + else echo "::warning ::Skipping test failure comparison; no prior reference test logs are available." fi From ae65dcc7d2affbf6b50145ed38f58e04f2bd1b86 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sun, 1 May 2022 17:07:29 +0200 Subject: [PATCH 146/242] GNU CI: show the new error --- .github/workflows/GnuTests.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.github/workflows/GnuTests.yml b/.github/workflows/GnuTests.yml index d306092c6f5..f2b0ddd4531 100644 --- a/.github/workflows/GnuTests.yml +++ b/.github/workflows/GnuTests.yml @@ -170,6 +170,8 @@ jobs: REPO_DEFAULT_BRANCH='${{ steps.vars.outputs.repo_default_branch }}' if test -f "${REF_LOG_FILE}"; then echo "Reference SHA1/ID: $(sha1sum -- "${REF_SUMMARY_FILE}")" + REF_ERROR=$(sed -n "s/^FAIL: \([[:print:]]\+\).*/\1/p" "${REF_LOG_FILE}" | sort) + NEW_ERROR=$(sed -n "s/^FAIL: \([[:print:]]\+\).*/\1/p" '${{ steps.vars.outputs.path_GNU_tests }}/test-suite.log' | sort) REF_FAILING=$(sed -n "s/^FAIL: \([[:print:]]\+\).*/\1/p" "${REF_LOG_FILE}" | sort) NEW_FAILING=$(sed -n "s/^FAIL: \([[:print:]]\+\).*/\1/p" '${{ steps.vars.outputs.path_GNU_tests }}/test-suite.log' | sort) for LINE in ${REF_FAILING} @@ -186,6 +188,21 @@ jobs: have_new_failures="true" fi done + for LINE in ${REF_ERROR} + do + if ! grep -Fxq ${LINE}<<<"${NEW_ERROR}"; then + echo "::warning ::Congrats! The gnu test ${LINE} is no longer ERROR!" + fi + done + for LINE in ${NEW_ERROR} + do + if ! grep -Fxq ${LINE}<<<"${REF_ERROR}" + then + echo "::error ::GNU test error: ${LINE}. ${LINE} is passing on '${{ steps.vars.outputs.repo_default_branch }}'. Maybe you have to rebase?" + have_new_failures="true" + fi + done + else echo "::warning ::Skipping test failure comparison; no prior reference test logs are available." fi From aa6aefbd64aa2acf2ce1644e1d003a6947d2790a Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Sun, 1 May 2022 12:03:02 -0400 Subject: [PATCH 147/242] mktemp: respect path given in template argument Fix a bug in `mktemp` where it was not respecting the path given by the positional argument. Previously, it would place the temporary file whose name is induced by a given template in the `/tmp` directory, like this: $ mktemp XXX /tmp/LJr $ mktemp d/XXX /tmp/d/IhS After this commit, it respects the directory given in the template argument: $ mktemp XXX LJr $ mktemp d/XXX d/IhS Fixes #3440. --- src/uu/mktemp/src/mktemp.rs | 44 +++++++++++++++++++---- tests/by-util/test_mktemp.rs | 68 ++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 7 deletions(-) diff --git a/src/uu/mktemp/src/mktemp.rs b/src/uu/mktemp/src/mktemp.rs index 54283b9afed..f999d667564 100644 --- a/src/uu/mktemp/src/mktemp.rs +++ b/src/uu/mktemp/src/mktemp.rs @@ -79,7 +79,11 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { let template = matches.value_of(ARG_TEMPLATE).unwrap(); let tmpdir = matches.value_of(OPT_TMPDIR).unwrap_or_default(); - let (template, mut tmpdir) = if matches.is_present(OPT_TMPDIR) + // Treat the template string as a path to get the directory + // containing the last component. + let path = PathBuf::from(template); + + let (template, tmpdir) = if matches.is_present(OPT_TMPDIR) && !PathBuf::from(tmpdir).is_dir() // if a temp dir is provided, it must be an actual path && tmpdir.contains("XXX") // If this is a template, it has to contain at least 3 X @@ -97,8 +101,24 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { let tmp = env::temp_dir(); (tmpdir, tmp) } else if !matches.is_present(OPT_TMPDIR) { - let tmp = env::temp_dir(); - (template, tmp) + // In this case, the command line was `mktemp -t XXX`, so we + // treat the argument `XXX` as though it were a filename + // regardless of whether it has path separators in it. + if matches.is_present(OPT_T) { + let tmp = env::temp_dir(); + (template, tmp) + // In this case, the command line was `mktemp XXX`, so we need + // to parse out the parent directory and the filename from the + // argument `XXX`, since it may be include path separators. + } else { + let tmp = match path.parent() { + None => PathBuf::from("."), + Some(d) => PathBuf::from(d), + }; + let filename = path.file_name(); + let template = filename.unwrap().to_str().unwrap(); + (template, tmp) + } } else { (template, PathBuf::from(tmpdir)) }; @@ -113,10 +133,6 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { return Err(MkTempError::InvalidTemplate(template.into()).into()); } - if matches.is_present(OPT_T) { - tmpdir = env::temp_dir(); - } - let res = if dry_run { dry_exec(tmpdir, prefix, rand, suffix) } else { @@ -272,5 +288,19 @@ fn exec(dir: &Path, prefix: &str, rand: usize, suffix: &str, make_dir: bool) -> .map_err(|e| MkTempError::PersistError(e.file.path().to_path_buf()))? .1 }; + + // Get just the last component of the path to the created + // temporary file or directory. + let filename = path.file_name(); + let filename = filename.unwrap().to_str().unwrap(); + + // Join the directory to the path to get the path to print. We + // cannot use the path returned by the `Builder` because it gives + // the absolute path and we need to return a filename that matches + // the template given on the command-line which might be a + // relative path. + let mut path = dir.to_path_buf(); + path.push(filename); + println_verbatim(path).map_err_context(|| "failed to print directory name".to_owned()) } diff --git a/tests/by-util/test_mktemp.rs b/tests/by-util/test_mktemp.rs index e824df0619a..13d7c8e2170 100644 --- a/tests/by-util/test_mktemp.rs +++ b/tests/by-util/test_mktemp.rs @@ -411,3 +411,71 @@ fn test_mktemp_directory_tmpdir() { result.no_stderr().stdout_contains("apt-key-gpghome."); assert!(PathBuf::from(result.stdout_str().trim()).is_dir()); } + +/// Decide whether a string matches a given template. +/// +/// In the template, the character `'X'` is treated as a wildcard, +/// that is, it matches anything. All other characters in `template` +/// and `s` must match exactly. +/// +/// # Examples +/// +/// ```rust,ignore +/// # These all match. +/// assert!(matches_template("abc", "abc")); +/// assert!(matches_template("aXc", "abc")); +/// assert!(matches_template("XXX", "abc")); +/// +/// # None of these match +/// assert!(matches_template("abc", "abcd")); +/// assert!(matches_template("abc", "ab")); +/// assert!(matches_template("aXc", "abd")); +/// assert!(matches_template("XXX", "abcd")); +/// ``` +/// +fn matches_template(template: &str, s: &str) -> bool { + if template.len() != s.len() { + return false; + } + for (a, b) in template.chars().zip(s.chars()) { + if !(a == 'X' || a == b) { + return false; + } + } + true +} + +/// An assertion that uses [`matches_template`] and adds a helpful error message. +macro_rules! assert_matches_template { + ($template:expr, $s:expr) => {{ + assert!( + matches_template($template, $s), + "\"{}\" != \"{}\"", + $template, + $s + ); + }}; +} + +/// Test that the file is created in the directory given by the template. +#[test] +fn test_respect_template() { + let (at, mut ucmd) = at_and_ucmd!(); + let template = "XXX"; + let result = ucmd.arg(template).succeeds(); + let filename = result.no_stderr().stdout_str().trim_end(); + assert_matches_template!(template, filename); + assert!(at.file_exists(filename)); +} + +/// Test that the file is created in the directory given by the template. +#[test] +fn test_respect_template_directory() { + let (at, mut ucmd) = at_and_ucmd!(); + at.mkdir("d"); + let template = "d/XXX"; + let result = ucmd.arg(template).succeeds(); + let filename = result.no_stderr().stdout_str().trim_end(); + assert_matches_template!(template, filename); + assert!(at.file_exists(filename)); +} From 0314f3ed8e6b0560fa67d2d6cf48133161334575 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sun, 1 May 2022 12:51:40 +0200 Subject: [PATCH 148/242] GNU testsuite: no need to rerun the GNU build At least, two use cases: * when hacking on test update * when we want to rebuild only Rust coreutils with the right option Indeed, the GNU code should not cache often in this case --- util/build-gnu.sh | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/util/build-gnu.sh b/util/build-gnu.sh index 6f0ec32f70a..83993fde93a 100755 --- a/util/build-gnu.sh +++ b/util/build-gnu.sh @@ -62,14 +62,23 @@ for binary in $(./build-aux/gen-lists-of-programs.sh --list-progs); do } done -./bootstrap -./configure --quiet --disable-gcc-warnings -#Add timeout to to protect against hangs -sed -i 's|^"\$@|/usr/bin/timeout 600 "\$@|' build-aux/test-driver -# Change the PATH in the Makefile to test the uutils coreutils instead of the GNU coreutils -sed -i "s/^[[:blank:]]*PATH=.*/ PATH='${UU_BUILD_DIR//\//\\/}\$(PATH_SEPARATOR)'\"\$\$PATH\" \\\/" Makefile -sed -i 's| tr | /usr/bin/tr |' tests/init.sh -make -j "$(nproc)" +if test -f gnu-built; then + echo "GNU build already found. Skip" + echo "'rm -f $(pwd)/gnu-built' to force the build" + echo "Note: the customization of the tests will still happen" + exit 0 +else + ./bootstrap + ./configure --quiet --disable-gcc-warnings + #Add timeout to to protect against hangs + sed -i 's|^"\$@|/usr/bin/timeout 600 "\$@|' build-aux/test-driver + # Change the PATH in the Makefile to test the uutils coreutils instead of the GNU coreutils + sed -i "s/^[[:blank:]]*PATH=.*/ PATH='${UU_BUILD_DIR//\//\\/}\$(PATH_SEPARATOR)'\"\$\$PATH\" \\\/" Makefile + sed -i 's| tr | /usr/bin/tr |' tests/init.sh + make -j "$(nproc)" + touch gnu-built +fi + # Handle generated factor tests t_first=00 t_max=36 From 2e60dce11a04c69b697b884020185e85fda14061 Mon Sep 17 00:00:00 2001 From: Hanif Ariffin Date: Fri, 4 Feb 2022 19:29:24 +0800 Subject: [PATCH 149/242] printf: Default left-justify integer conversion to 1 width When using left-justify with integer conversion (like `printf '%-o'`), default the minimum width to 1. Closes: https://github.com/uutils/coreutils/issues/3050 Signed-off-by: Hanif Ariffin --- src/uucore/src/lib/features/tokenize/sub.rs | 6 +++++- tests/by-util/test_printf.rs | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/uucore/src/lib/features/tokenize/sub.rs b/src/uucore/src/lib/features/tokenize/sub.rs index f8b5b5cafa5..216953a43bc 100644 --- a/src/uucore/src/lib/features/tokenize/sub.rs +++ b/src/uucore/src/lib/features/tokenize/sub.rs @@ -152,7 +152,11 @@ impl SubParser { if parser.min_width_is_asterisk { CanAsterisk::Asterisk } else { - CanAsterisk::Fixed(parser.min_width_tmp.map(|x| x.parse::().unwrap())) + CanAsterisk::Fixed( + parser + .min_width_tmp + .map(|x| x.parse::().unwrap_or(1)), + ) }, if parser.second_field_is_asterisk { CanAsterisk::Asterisk diff --git a/tests/by-util/test_printf.rs b/tests/by-util/test_printf.rs index d5be4cd1783..77f64750cbb 100644 --- a/tests/by-util/test_printf.rs +++ b/tests/by-util/test_printf.rs @@ -446,6 +446,14 @@ fn sub_any_specifiers_after_period() { .stdout_only("3"); } +#[test] +fn unspecified_left_justify_is_1_width() { + new_ucmd!() + .args(&["%-o"]) //spell-checker:disable-line + .succeeds() + .stdout_only("0"); +} + #[test] fn sub_any_specifiers_after_second_param() { new_ucmd!() From e991838ca8072b58ceccc3e9fd3b784cb0f61a71 Mon Sep 17 00:00:00 2001 From: Jan Scheer Date: Sun, 19 Sep 2021 22:24:11 +0200 Subject: [PATCH 150/242] tests/util: add a convenience wrapper to run a ucmd with root permissions --- tests/common/util.rs | 68 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/tests/common/util.rs b/tests/common/util.rs index 5a669fcd438..47f8eb84204 100644 --- a/tests/common/util.rs +++ b/tests/common/util.rs @@ -1362,6 +1362,58 @@ pub fn expected_result(ts: &TestScenario, args: &[&str]) -> std::result::Result< )) } +/// This is a convenience wrapper to run a ucmd with root permissions. +/// This runs 'sudo -E --non-interactive target/debug/coreutils util_name args` +/// This is primarily designed to run in the CICD environment where whoami is in $path +/// and where non-interactive sudo is possible. +/// To check if i) non-interactive sudo is possible and ii) if sudo works, this runs: +/// 'sudo -E --non-interactive whoami' first. +/// +/// Example: +/// +/// ```no_run +/// use crate::common::util::*; +/// #[test] +/// fn test_xyz() { +/// let ts = TestScenario::new("whoami"); +/// let expected = "root\n".to_string(); +/// if let Ok(result) = run_ucmd_as_root(&ts, &[]) { +/// result.stdout_is(expected); +/// } else { +/// print!("TEST SKIPPED"); +/// } +/// } +///``` +#[cfg(unix)] +pub fn run_ucmd_as_root( + ts: &TestScenario, + args: &[&str], +) -> std::result::Result { + if ts + .cmd_keepenv("sudo") + .env("LC_ALL", "C") + .arg("-E") + .arg("--non-interactive") + .arg("whoami") + .run() + .stdout_str() + .trim() + != "root" + { + Err("\"sudo whoami\" didn't return \"root\"".to_string()) + } else { + Ok(ts + .cmd_keepenv("sudo") + .env("LC_ALL", "C") + .arg("-E") + .arg("--non-interactive") + .arg(&ts.bin_path) + .arg(&ts.util_name) + .args(args) + .run()) + } +} + /// Sanity checks for test utils #[cfg(test)] mod tests { @@ -1712,4 +1764,20 @@ mod tests { std::assert_eq!(host_name_for("gwho"), "gwho"); } } + + #[test] + #[cfg(unix)] + fn test_run_ucmd_as_root() { + // We need non-interactive `sudo. + // CICD environment should allow non-interactive `sudo`. + // Return early if we can't guarantee non-interactive `sudo` + if !is_ci() { + return; + } + let ts = TestScenario::new("whoami"); + std::assert_eq!( + run_ucmd_as_root(&ts, &[]).unwrap().stdout_str().trim(), + "root" + ); + } } From de01b11a7d2a332153a2db948e4d8ef4f1f493c2 Mon Sep 17 00:00:00 2001 From: Jan Scheer Date: Mon, 20 Sep 2021 00:20:06 +0200 Subject: [PATCH 151/242] Update util.rs add feature for `whoami` --- tests/common/util.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/common/util.rs b/tests/common/util.rs index 47f8eb84204..a0eb124598c 100644 --- a/tests/common/util.rs +++ b/tests/common/util.rs @@ -1767,6 +1767,7 @@ mod tests { #[test] #[cfg(unix)] + #[cfg(feature = "whoami")] fn test_run_ucmd_as_root() { // We need non-interactive `sudo. // CICD environment should allow non-interactive `sudo`. From bab7ba8a527f441e6cccb543b5fc5f64cbef4e04 Mon Sep 17 00:00:00 2001 From: Jan Scheer Date: Tue, 21 Sep 2021 00:23:23 +0200 Subject: [PATCH 152/242] Update util.rs --- tests/common/util.rs | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/tests/common/util.rs b/tests/common/util.rs index a0eb124598c..05cc6937a21 100644 --- a/tests/common/util.rs +++ b/tests/common/util.rs @@ -1364,7 +1364,7 @@ pub fn expected_result(ts: &TestScenario, args: &[&str]) -> std::result::Result< /// This is a convenience wrapper to run a ucmd with root permissions. /// This runs 'sudo -E --non-interactive target/debug/coreutils util_name args` -/// This is primarily designed to run in the CICD environment where whoami is in $path +/// This is primarily designed to run in an environment where whoami is in $path /// and where non-interactive sudo is possible. /// To check if i) non-interactive sudo is possible and ii) if sudo works, this runs: /// 'sudo -E --non-interactive whoami' first. @@ -1389,6 +1389,7 @@ pub fn run_ucmd_as_root( ts: &TestScenario, args: &[&str], ) -> std::result::Result { + // Apparently CICD environment has no `sudo`? if ts .cmd_keepenv("sudo") .env("LC_ALL", "C") @@ -1769,16 +1770,18 @@ mod tests { #[cfg(unix)] #[cfg(feature = "whoami")] fn test_run_ucmd_as_root() { - // We need non-interactive `sudo. - // CICD environment should allow non-interactive `sudo`. - // Return early if we can't guarantee non-interactive `sudo` - if !is_ci() { - return; + // Skip test if we can't guarantee non-interactive `sudo`. + if let Ok(_status) = Command::new("sudo") + .args(&["-E", "-v", "--non-interactive"]) + .status() + { + let ts = TestScenario::new("whoami"); + std::assert_eq!( + run_ucmd_as_root(&ts, &[]).unwrap().stdout_str().trim(), + "root" + ); + } else { + print!("TEST SKIPPED"); } - let ts = TestScenario::new("whoami"); - std::assert_eq!( - run_ucmd_as_root(&ts, &[]).unwrap().stdout_str().trim(), - "root" - ); } } From eaad6c5286d435285fefea0a84913ecdbc0df356 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sun, 30 Jan 2022 10:05:05 +0100 Subject: [PATCH 153/242] more comment mostly to retrigger the ci :) --- tests/common/util.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/common/util.rs b/tests/common/util.rs index 05cc6937a21..34bdc72f3bf 100644 --- a/tests/common/util.rs +++ b/tests/common/util.rs @@ -1363,6 +1363,7 @@ pub fn expected_result(ts: &TestScenario, args: &[&str]) -> std::result::Result< } /// This is a convenience wrapper to run a ucmd with root permissions. +/// It can be used to test programs when being root is needed /// This runs 'sudo -E --non-interactive target/debug/coreutils util_name args` /// This is primarily designed to run in an environment where whoami is in $path /// and where non-interactive sudo is possible. From 3078ca8346fd15b89aab74916c048da877c33dfd Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sun, 1 May 2022 20:18:33 +0200 Subject: [PATCH 154/242] Add CHARCLASS to the spell ignore --- src/uu/ptx/src/ptx.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/uu/ptx/src/ptx.rs b/src/uu/ptx/src/ptx.rs index c3bedb266d4..2f253b58064 100644 --- a/src/uu/ptx/src/ptx.rs +++ b/src/uu/ptx/src/ptx.rs @@ -5,7 +5,7 @@ // * For the full copyright and license information, please view the LICENSE // * file that was distributed with this source code. -// spell-checker:ignore (ToDOs) corasick memchr Roff trunc oset iset +// spell-checker:ignore (ToDOs) corasick memchr Roff trunc oset iset CHARCLASS use clap::{crate_version, Arg, Command}; use regex::Regex; From 08816a4f0596636f3b763e99561a15260a919b03 Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Sun, 1 May 2022 16:51:25 -0400 Subject: [PATCH 155/242] fixup! mktemp: respect path given in template argument --- tests/by-util/test_mktemp.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/by-util/test_mktemp.rs b/tests/by-util/test_mktemp.rs index 13d7c8e2170..c28efc37b10 100644 --- a/tests/by-util/test_mktemp.rs +++ b/tests/by-util/test_mktemp.rs @@ -473,7 +473,10 @@ fn test_respect_template() { fn test_respect_template_directory() { let (at, mut ucmd) = at_and_ucmd!(); at.mkdir("d"); + #[cfg(not(windows))] let template = "d/XXX"; + #[cfg(windows)] + let template = r"d\XXX"; let result = ucmd.arg(template).succeeds(); let filename = result.no_stderr().stdout_str().trim_end(); assert_matches_template!(template, filename); From 0dc3eafaa43789acd73985eb4079f2a02f32b576 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 May 2022 06:36:27 +0000 Subject: [PATCH 156/242] build(deps): bump clap_complete from 3.1.2 to 3.1.3 Bumps [clap_complete](https://github.com/clap-rs/clap) from 3.1.2 to 3.1.3. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v3.1.2...clap_complete-v3.1.3) --- updated-dependencies: - dependency-name: clap_complete dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a24abb9369d..a9956622030 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -273,9 +273,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "3.1.2" +version = "3.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1506b87ee866f7a53a5131f7b31fba656170d797e873d0609884cfd56b8bbda8" +checksum = "1d7ca9141e27e6ebc52e3c378b0c07f3cea52db46ed1cc5861735fb697b56356" dependencies = [ "clap 3.1.12", ] From de6aa6de9b2df29c81b117dcabb8ef1c9ff2f5fb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 May 2022 06:36:41 +0000 Subject: [PATCH 157/242] build(deps): bump libc from 0.2.124 to 0.2.125 Bumps [libc](https://github.com/rust-lang/libc) from 0.2.124 to 0.2.125. - [Release notes](https://github.com/rust-lang/libc/releases) - [Commits](https://github.com/rust-lang/libc/compare/0.2.124...0.2.125) --- updated-dependencies: - dependency-name: libc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- src/uu/chmod/Cargo.toml | 2 +- src/uu/cp/Cargo.toml | 2 +- src/uu/hostid/Cargo.toml | 2 +- src/uu/kill/Cargo.toml | 2 +- src/uu/logname/Cargo.toml | 2 +- src/uu/mkfifo/Cargo.toml | 2 +- src/uu/mknod/Cargo.toml | 2 +- src/uu/nice/Cargo.toml | 2 +- src/uu/nohup/Cargo.toml | 2 +- src/uu/nproc/Cargo.toml | 2 +- src/uu/pathchk/Cargo.toml | 2 +- src/uu/rmdir/Cargo.toml | 2 +- src/uu/sync/Cargo.toml | 2 +- src/uu/tail/Cargo.toml | 2 +- src/uu/tee/Cargo.toml | 2 +- src/uu/test/Cargo.toml | 2 +- src/uu/timeout/Cargo.toml | 2 +- src/uu/tty/Cargo.toml | 2 +- src/uu/whoami/Cargo.toml | 2 +- src/uucore/Cargo.toml | 2 +- 21 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a24abb9369d..2a46b14ec00 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1015,9 +1015,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.124" +version = "0.2.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a41fed9d98f27ab1c6d161da622a4fa35e8a54a8adc24bbf3ddd0ef70b0e50" +checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" [[package]] name = "libloading" diff --git a/src/uu/chmod/Cargo.toml b/src/uu/chmod/Cargo.toml index 9fab6011e5d..df0b089fad8 100644 --- a/src/uu/chmod/Cargo.toml +++ b/src/uu/chmod/Cargo.toml @@ -16,7 +16,7 @@ path = "src/chmod.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.124" +libc = "0.2.125" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["fs", "mode"] } [[bin]] diff --git a/src/uu/cp/Cargo.toml b/src/uu/cp/Cargo.toml index 9e1141650dd..f9036101aae 100644 --- a/src/uu/cp/Cargo.toml +++ b/src/uu/cp/Cargo.toml @@ -21,7 +21,7 @@ path = "src/cp.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } filetime = "0.2" -libc = "0.2.124" +libc = "0.2.125" quick-error = "2.0.1" selinux = { version="0.2", optional=true } uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["entries", "fs", "perms", "mode"] } diff --git a/src/uu/hostid/Cargo.toml b/src/uu/hostid/Cargo.toml index 0a2948459b1..d29160b21cf 100644 --- a/src/uu/hostid/Cargo.toml +++ b/src/uu/hostid/Cargo.toml @@ -16,7 +16,7 @@ path = "src/hostid.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.124" +libc = "0.2.125" uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } [[bin]] diff --git a/src/uu/kill/Cargo.toml b/src/uu/kill/Cargo.toml index 354ad1d3f24..24347a90af5 100644 --- a/src/uu/kill/Cargo.toml +++ b/src/uu/kill/Cargo.toml @@ -16,7 +16,7 @@ path = "src/kill.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.124" +libc = "0.2.125" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["signals"] } [[bin]] diff --git a/src/uu/logname/Cargo.toml b/src/uu/logname/Cargo.toml index 22b976dd6a1..fe7f2f7386e 100644 --- a/src/uu/logname/Cargo.toml +++ b/src/uu/logname/Cargo.toml @@ -15,7 +15,7 @@ edition = "2021" path = "src/logname.rs" [dependencies] -libc = "0.2.124" +libc = "0.2.125" clap = { version = "3.1", features = ["wrap_help", "cargo"] } uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } diff --git a/src/uu/mkfifo/Cargo.toml b/src/uu/mkfifo/Cargo.toml index a6c801747e1..821d67d53db 100644 --- a/src/uu/mkfifo/Cargo.toml +++ b/src/uu/mkfifo/Cargo.toml @@ -16,7 +16,7 @@ path = "src/mkfifo.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.124" +libc = "0.2.125" uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } [[bin]] diff --git a/src/uu/mknod/Cargo.toml b/src/uu/mknod/Cargo.toml index 53cc623137a..88c9e3fb077 100644 --- a/src/uu/mknod/Cargo.toml +++ b/src/uu/mknod/Cargo.toml @@ -17,7 +17,7 @@ path = "src/mknod.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "^0.2.124" +libc = "^0.2.125" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["mode"] } [[bin]] diff --git a/src/uu/nice/Cargo.toml b/src/uu/nice/Cargo.toml index ab4b6c70012..9b6ca52bdb7 100644 --- a/src/uu/nice/Cargo.toml +++ b/src/uu/nice/Cargo.toml @@ -16,7 +16,7 @@ path = "src/nice.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.124" +libc = "0.2.125" nix = { version = "0.24.1", default-features = false } uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } diff --git a/src/uu/nohup/Cargo.toml b/src/uu/nohup/Cargo.toml index 26e5fd7aecb..ba38a7ecd8b 100644 --- a/src/uu/nohup/Cargo.toml +++ b/src/uu/nohup/Cargo.toml @@ -16,7 +16,7 @@ path = "src/nohup.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.124" +libc = "0.2.125" atty = "0.2" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["fs"] } diff --git a/src/uu/nproc/Cargo.toml b/src/uu/nproc/Cargo.toml index 80c1cb38bdb..f52f2d0db3f 100644 --- a/src/uu/nproc/Cargo.toml +++ b/src/uu/nproc/Cargo.toml @@ -15,7 +15,7 @@ edition = "2021" path = "src/nproc.rs" [dependencies] -libc = "0.2.124" +libc = "0.2.125" num_cpus = "1.10" clap = { version = "3.1", features = ["wrap_help", "cargo"] } uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["fs"] } diff --git a/src/uu/pathchk/Cargo.toml b/src/uu/pathchk/Cargo.toml index 44cab8559a0..dd8b8307648 100644 --- a/src/uu/pathchk/Cargo.toml +++ b/src/uu/pathchk/Cargo.toml @@ -16,7 +16,7 @@ path = "src/pathchk.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.124" +libc = "0.2.125" uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } [[bin]] diff --git a/src/uu/rmdir/Cargo.toml b/src/uu/rmdir/Cargo.toml index b61def5adeb..0894fa4110c 100644 --- a/src/uu/rmdir/Cargo.toml +++ b/src/uu/rmdir/Cargo.toml @@ -17,7 +17,7 @@ path = "src/rmdir.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } -libc = "0.2.124" +libc = "0.2.125" [[bin]] name = "rmdir" diff --git a/src/uu/sync/Cargo.toml b/src/uu/sync/Cargo.toml index ece7a5930ce..f6e57391dbe 100644 --- a/src/uu/sync/Cargo.toml +++ b/src/uu/sync/Cargo.toml @@ -16,7 +16,7 @@ path = "src/sync.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.124" +libc = "0.2.125" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["wide"] } winapi = { version = "0.3", features = ["errhandlingapi", "fileapi", "handleapi", "std", "winbase", "winerror"] } diff --git a/src/uu/tail/Cargo.toml b/src/uu/tail/Cargo.toml index eebbf960629..7006ddb67e8 100644 --- a/src/uu/tail/Cargo.toml +++ b/src/uu/tail/Cargo.toml @@ -16,7 +16,7 @@ path = "src/tail.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.124" +libc = "0.2.125" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["ringbuffer", "lines"] } [target.'cfg(windows)'.dependencies] diff --git a/src/uu/tee/Cargo.toml b/src/uu/tee/Cargo.toml index 7257d9854b2..07ee9e33bad 100644 --- a/src/uu/tee/Cargo.toml +++ b/src/uu/tee/Cargo.toml @@ -16,7 +16,7 @@ path = "src/tee.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.124" +libc = "0.2.125" retain_mut = "=0.1.7" # ToDO: [2021-01-01; rivy; maint/MinSRV] ~ v0.1.5 uses const generics which aren't stabilized until rust v1.51.0 uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["libc"] } diff --git a/src/uu/test/Cargo.toml b/src/uu/test/Cargo.toml index 6bd1cfc90e4..58f891541a7 100644 --- a/src/uu/test/Cargo.toml +++ b/src/uu/test/Cargo.toml @@ -16,7 +16,7 @@ path = "src/test.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.124" +libc = "0.2.125" uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } [target.'cfg(target_os = "redox")'.dependencies] diff --git a/src/uu/timeout/Cargo.toml b/src/uu/timeout/Cargo.toml index e555cb1b759..d285c3214ca 100644 --- a/src/uu/timeout/Cargo.toml +++ b/src/uu/timeout/Cargo.toml @@ -16,7 +16,7 @@ path = "src/timeout.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.124" +libc = "0.2.125" nix = { version = "0.24.1", default-features = false, features = ["signal"] } uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["process", "signals"] } diff --git a/src/uu/tty/Cargo.toml b/src/uu/tty/Cargo.toml index 2f34385581c..da6446ab036 100644 --- a/src/uu/tty/Cargo.toml +++ b/src/uu/tty/Cargo.toml @@ -16,7 +16,7 @@ path = "src/tty.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.124" +libc = "0.2.125" atty = "0.2" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["fs"] } diff --git a/src/uu/whoami/Cargo.toml b/src/uu/whoami/Cargo.toml index 2655fe892b4..253e2ba1bf1 100644 --- a/src/uu/whoami/Cargo.toml +++ b/src/uu/whoami/Cargo.toml @@ -22,7 +22,7 @@ uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=[ winapi = { version = "0.3", features = ["lmcons"] } [target.'cfg(unix)'.dependencies] -libc = "0.2.124" +libc = "0.2.125" [[bin]] name = "whoami" diff --git a/src/uucore/Cargo.toml b/src/uucore/Cargo.toml index 6f74b238a04..56e582bf820 100644 --- a/src/uucore/Cargo.toml +++ b/src/uucore/Cargo.toml @@ -31,7 +31,7 @@ time = { version="<= 0.1.43", optional=true } data-encoding = { version="2.1", optional=true } data-encoding-macro = { version="0.1.12", optional=true } z85 = { version="3.0.5", optional=true } -libc = { version="0.2.124", optional=true } +libc = { version="0.2.125", optional=true } once_cell = "1.10.0" os_display = "0.1.3" From a1e5f8e53f037c14ae356c4567ec459214622be2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 May 2022 13:03:18 +0000 Subject: [PATCH 158/242] build(deps): bump memchr from 2.4.1 to 2.5.0 Bumps [memchr](https://github.com/BurntSushi/memchr) from 2.4.1 to 2.5.0. - [Release notes](https://github.com/BurntSushi/memchr/releases) - [Commits](https://github.com/BurntSushi/memchr/compare/2.4.1...2.5.0) --- updated-dependencies: - dependency-name: memchr dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 30 +++++++++++++++--------------- src/uu/sort/Cargo.toml | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a24abb9369d..2f33f716a7f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -26,7 +26,7 @@ version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" dependencies = [ - "memchr 2.4.1", + "memchr 2.5.0", ] [[package]] @@ -163,7 +163,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" dependencies = [ "lazy_static", - "memchr 2.4.1", + "memchr 2.5.0", "regex-automata", ] @@ -1015,9 +1015,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.124" +version = "0.2.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a41fed9d98f27ab1c6d161da622a4fa35e8a54a8adc24bbf3ddd0ef70b0e50" +checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" [[package]] name = "libloading" @@ -1082,9 +1082,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memmap2" @@ -1160,7 +1160,7 @@ version = "7.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" dependencies = [ - "memchr 2.4.1", + "memchr 2.5.0", "minimal-lexical", ] @@ -1568,7 +1568,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" dependencies = [ "aho-corasick", - "memchr 2.4.1", + "memchr 2.5.0", "regex-syntax", ] @@ -2178,7 +2178,7 @@ dependencies = [ "atty", "bstr", "clap 3.1.12", - "memchr 2.4.1", + "memchr 2.5.0", "uucore", ] @@ -2347,7 +2347,7 @@ dependencies = [ "digest", "hex", "md-5", - "memchr 2.4.1", + "memchr 2.5.0", "regex", "sha1", "sha2", @@ -2360,7 +2360,7 @@ name = "uu_head" version = "0.0.13" dependencies = [ "clap 3.1.12", - "memchr 2.4.1", + "memchr 2.5.0", "uucore", ] @@ -2408,7 +2408,7 @@ name = "uu_join" version = "0.0.13" dependencies = [ "clap 3.1.12", - "memchr 2.4.1", + "memchr 2.5.0", "uucore", ] @@ -2753,7 +2753,7 @@ dependencies = [ "ctrlc", "fnv", "itertools", - "memchr 2.4.1", + "memchr 2.5.0", "ouroboros", "rand", "rayon", @@ -2767,7 +2767,7 @@ name = "uu_split" version = "0.0.13" dependencies = [ "clap 3.1.12", - "memchr 2.4.1", + "memchr 2.5.0", "uucore", ] @@ -2822,7 +2822,7 @@ name = "uu_tac" version = "0.0.13" dependencies = [ "clap 3.1.12", - "memchr 2.4.1", + "memchr 2.5.0", "memmap2", "regex", "uucore", diff --git a/src/uu/sort/Cargo.toml b/src/uu/sort/Cargo.toml index 69f7f746871..3c8be6a5007 100644 --- a/src/uu/sort/Cargo.toml +++ b/src/uu/sort/Cargo.toml @@ -21,7 +21,7 @@ compare = "0.1.0" ctrlc = { version = "3.0", features = ["termination"] } fnv = "1.0.7" itertools = "0.10.0" -memchr = "2.4.0" +memchr = "2.5.0" ouroboros = "0.15.0" rand = "0.8" rayon = "1.5" From 1acbc0009e6fb2c5b92d8df15eda4b8eb1858dd2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 May 2022 13:06:15 +0000 Subject: [PATCH 159/242] build(deps): bump thiserror from 1.0.30 to 1.0.31 Bumps [thiserror](https://github.com/dtolnay/thiserror) from 1.0.30 to 1.0.31. - [Release notes](https://github.com/dtolnay/thiserror/releases) - [Commits](https://github.com/dtolnay/thiserror/compare/1.0.30...1.0.31) --- updated-dependencies: - dependency-name: thiserror dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2a46b14ec00..14ba065c28c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -273,9 +273,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "3.1.2" +version = "3.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1506b87ee866f7a53a5131f7b31fba656170d797e873d0609884cfd56b8bbda8" +checksum = "1d7ca9141e27e6ebc52e3c378b0c07f3cea52db46ed1cc5861735fb697b56356" dependencies = [ "clap 3.1.12", ] @@ -1924,18 +1924,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" dependencies = [ "proc-macro2", "quote 1.0.14", From 15412f100a1fc14e72a4c48de495de9dec66a168 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Sat, 30 Apr 2022 15:36:50 +0200 Subject: [PATCH 160/242] df: show "block-size argument too large" error --- src/uu/df/src/df.rs | 21 +++++++++++++++------ tests/by-util/test_df.rs | 24 ++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/uu/df/src/df.rs b/src/uu/df/src/df.rs index 2b9c929c7cc..b86b11f372b 100644 --- a/src/uu/df/src/df.rs +++ b/src/uu/df/src/df.rs @@ -14,6 +14,7 @@ mod table; use uucore::display::Quotable; use uucore::error::{UError, UResult, USimpleError}; use uucore::fsext::{read_fs_list, MountInfo}; +use uucore::parse_size::ParseSizeError; use uucore::{format_usage, show}; use clap::{crate_version, Arg, ArgMatches, Command}; @@ -105,7 +106,8 @@ impl Default for Options { #[derive(Debug)] enum OptionsError { - InvalidBlockSize, + BlockSizeTooLarge(String), + InvalidBlockSize(String), /// An error getting the columns to display in the output table. ColumnError(ColumnError), @@ -116,11 +118,14 @@ enum OptionsError { impl fmt::Display for OptionsError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { - // TODO This should include the raw string provided as the argument. - // // TODO This needs to vary based on whether `--block-size` // or `-B` were provided. - Self::InvalidBlockSize => write!(f, "invalid --block-size argument"), + Self::BlockSizeTooLarge(s) => { + write!(f, "--block-size argument {} too large", s.quote()) + } + // TODO This needs to vary based on whether `--block-size` + // or `-B` were provided. + Self::InvalidBlockSize(s) => write!(f, "invalid --block-size argument {}", s), Self::ColumnError(ColumnError::MultipleColumns(s)) => write!( f, "option --output: field {} used more than once", @@ -155,8 +160,12 @@ impl Options { Ok(Self { show_local_fs: matches.is_present(OPT_LOCAL), show_all_fs: matches.is_present(OPT_ALL), - block_size: block_size_from_matches(matches) - .map_err(|_| OptionsError::InvalidBlockSize)?, + block_size: block_size_from_matches(matches).map_err(|e| match e { + ParseSizeError::SizeTooBig(_) => OptionsError::BlockSizeTooLarge( + matches.value_of(OPT_BLOCKSIZE).unwrap().to_string(), + ), + ParseSizeError::ParseFailure(s) => OptionsError::InvalidBlockSize(s), + })?, include, exclude, show_total: matches.is_present(OPT_TOTAL), diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index 61ddcec5d2c..90781eb64fc 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -419,6 +419,30 @@ fn test_block_size_with_suffix() { //assert_eq!(get_header("1GB"), "1GB-blocks"); } +#[test] +fn test_too_large_block_size() { + fn run_command(size: &str) { + new_ucmd!() + .arg(format!("--block-size={}", size)) + .fails() + .stderr_contains(format!("--block-size argument '{}' too large", size)); + } + + let too_large_sizes = vec!["1Y", "1Z"]; + + for size in too_large_sizes { + run_command(size); + } +} + +#[test] +fn test_invalid_block_size() { + new_ucmd!() + .arg("--block-size=x") + .fails() + .stderr_contains("invalid --block-size argument 'x'"); +} + #[test] fn test_output_selects_columns() { let output = new_ucmd!() From badf947f8a343d40a7660d5fc490e149340b56e5 Mon Sep 17 00:00:00 2001 From: anastygnome Date: Mon, 2 May 2022 08:28:23 +0200 Subject: [PATCH 161/242] Do not dereference symlink even when dangling (fix #3364) Fixes an issue with cp not copying symlinks in spite of the -P (no dereference option) Fix issue #3364 Performance improvements Avoid useless read from metadata and reuse previous dest information Signed-off-by: anastygnome --- src/uu/cp/src/cp.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/uu/cp/src/cp.rs b/src/uu/cp/src/cp.rs index 913cf2769ec..ce85b58bc4e 100644 --- a/src/uu/cp/src/cp.rs +++ b/src/uu/cp/src/cp.rs @@ -992,7 +992,9 @@ fn copy_directory( } // if no-dereference is enabled and this is a symlink, copy it as a file - if !options.dereference && fs::symlink_metadata(root).unwrap().file_type().is_symlink() { + if !options.dereference && fs::symlink_metadata(root).unwrap().file_type().is_symlink() + // replace by is_symlink in rust>=1.58 + { return copy_file(root, target, options, symlinked_files); } @@ -1036,6 +1038,7 @@ fn copy_directory( { let p = or_continue!(path); let is_symlink = fs::symlink_metadata(p.path())?.file_type().is_symlink(); + // replace by is_symlink in rust >=1.58 let path = current_dir.join(&p.path()); let local_to_root_parent = match root_parent { @@ -1288,7 +1291,7 @@ fn copy_file( // Fail if dest is a dangling symlink or a symlink this program created previously if fs::symlink_metadata(dest) - .map(|m| m.file_type().is_symlink()) + .map(|m| m.file_type().is_symlink()) // replace by is_symlink in rust>=1.58 .unwrap_or(false) { if FileInformation::from_path(dest, false) @@ -1301,7 +1304,7 @@ fn copy_file( dest.display() ))); } - if !dest.exists() { + if options.dereference && !dest.exists() { return Err(Error::Error(format!( "not writing through dangling symlink '{}'", dest.display() @@ -1535,7 +1538,7 @@ fn copy_link( } else { // we always need to remove the file to be able to create a symlink, // even if it is writeable. - if dest.exists() { + if dest.is_file() { fs::remove_file(dest)?; } dest.into() From 70c451fa61cb342b8a4646c4ad053ebe1ec0f608 Mon Sep 17 00:00:00 2001 From: anastygnome Date: Mon, 2 May 2022 08:20:46 +0200 Subject: [PATCH 162/242] Add test for copying dangling symlink copy with dereference Signed-off-by: anastygnome --- tests/by-util/test_cp.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/by-util/test_cp.rs b/tests/by-util/test_cp.rs index 079e966be3b..cdcaf276040 100644 --- a/tests/by-util/test_cp.rs +++ b/tests/by-util/test_cp.rs @@ -1506,6 +1506,18 @@ fn test_copy_through_dangling_symlink() { .stderr_only("cp: not writing through dangling symlink 'target'"); } +#[test] +fn test_copy_through_dangling_symlink_no_dereference() { + let (at, mut ucmd) = at_and_ucmd!(); + at.symlink_file("no-such-file", "dangle"); + ucmd.arg("-P") + .arg("dangle") + .arg("d2") + .succeeds() + .no_stderr() + .no_stdout(); +} + #[test] #[cfg(unix)] fn test_cp_archive_on_nonexistent_file() { From a4e3f37aaf3ab7f553276e02dd87d4feafdbf226 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 May 2022 21:30:25 +0000 Subject: [PATCH 163/242] build(deps): bump clap from 3.1.12 to 3.1.15 Bumps [clap](https://github.com/clap-rs/clap) from 3.1.12 to 3.1.15. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/v3.1.12...v3.1.15) --- updated-dependencies: - dependency-name: clap dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 216 ++++++++++++++++++++++++++--------------------------- 1 file changed, 108 insertions(+), 108 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3ad9da7ba27..ee06b62eba3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -256,9 +256,9 @@ dependencies = [ [[package]] name = "clap" -version = "3.1.12" +version = "3.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c167e37342afc5f33fd87bbc870cedd020d2a6dffa05d45ccd9241fbdd146db" +checksum = "85a35a599b11c089a7f49105658d089b8f2cf0882993c17daf6de15285c2c35d" dependencies = [ "atty", "bitflags", @@ -277,14 +277,14 @@ version = "3.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d7ca9141e27e6ebc52e3c378b0c07f3cea52db46ed1cc5861735fb697b56356" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", ] [[package]] name = "clap_lex" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "189ddd3b5d32a70b35e7686054371742a937b0d99128e76dde6340210e966669" +checksum = "a37c35f1112dad5e6e0b1adaff798507497a18fceeb30cceb3bae7d1427b9213" dependencies = [ "os_str_bytes", ] @@ -316,7 +316,7 @@ version = "0.0.13" dependencies = [ "atty", "chrono", - "clap 3.1.12", + "clap 3.1.15", "clap_complete", "conv", "filetime", @@ -2033,7 +2033,7 @@ checksum = "7cf7d77f457ef8dfa11e4cd5933c5ddb5dc52a94664071951219a97710f0a32b" name = "uu_arch" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "platform-info", "uucore", ] @@ -2042,7 +2042,7 @@ dependencies = [ name = "uu_base32" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2058,7 +2058,7 @@ dependencies = [ name = "uu_basename" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2066,7 +2066,7 @@ dependencies = [ name = "uu_basenc" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uu_base32", "uucore", ] @@ -2076,7 +2076,7 @@ name = "uu_cat" version = "0.0.13" dependencies = [ "atty", - "clap 3.1.12", + "clap 3.1.15", "nix", "thiserror", "unix_socket", @@ -2087,7 +2087,7 @@ dependencies = [ name = "uu_chcon" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "fts-sys", "libc", "selinux", @@ -2099,7 +2099,7 @@ dependencies = [ name = "uu_chgrp" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2107,7 +2107,7 @@ dependencies = [ name = "uu_chmod" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "libc", "uucore", ] @@ -2116,7 +2116,7 @@ dependencies = [ name = "uu_chown" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2124,7 +2124,7 @@ dependencies = [ name = "uu_chroot" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2132,7 +2132,7 @@ dependencies = [ name = "uu_cksum" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2140,7 +2140,7 @@ dependencies = [ name = "uu_comm" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2148,7 +2148,7 @@ dependencies = [ name = "uu_cp" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "exacl", "filetime", "ioctl-sys", @@ -2165,7 +2165,7 @@ dependencies = [ name = "uu_csplit" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "regex", "thiserror", "uucore", @@ -2177,7 +2177,7 @@ version = "0.0.13" dependencies = [ "atty", "bstr", - "clap 3.1.12", + "clap 3.1.15", "memchr 2.5.0", "uucore", ] @@ -2187,7 +2187,7 @@ name = "uu_date" version = "0.0.13" dependencies = [ "chrono", - "clap 3.1.12", + "clap 3.1.15", "libc", "uucore", "winapi 0.3.9", @@ -2198,7 +2198,7 @@ name = "uu_dd" version = "0.0.13" dependencies = [ "byte-unit", - "clap 3.1.12", + "clap 3.1.15", "gcd", "libc", "signal-hook", @@ -2209,7 +2209,7 @@ dependencies = [ name = "uu_df" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "number_prefix", "unicode-width", "uucore", @@ -2219,7 +2219,7 @@ dependencies = [ name = "uu_dir" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "selinux", "uu_ls", "uucore", @@ -2229,7 +2229,7 @@ dependencies = [ name = "uu_dircolors" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "glob", "uucore", ] @@ -2238,7 +2238,7 @@ dependencies = [ name = "uu_dirname" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2247,7 +2247,7 @@ name = "uu_du" version = "0.0.13" dependencies = [ "chrono", - "clap 3.1.12", + "clap 3.1.15", "glob", "uucore", "winapi 0.3.9", @@ -2257,7 +2257,7 @@ dependencies = [ name = "uu_echo" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2265,7 +2265,7 @@ dependencies = [ name = "uu_env" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "rust-ini", "uucore", ] @@ -2274,7 +2274,7 @@ dependencies = [ name = "uu_expand" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "unicode-width", "uucore", ] @@ -2283,7 +2283,7 @@ dependencies = [ name = "uu_expr" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "num-bigint", "num-traits", "onig", @@ -2294,7 +2294,7 @@ dependencies = [ name = "uu_factor" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "coz", "num-traits", "paste", @@ -2308,7 +2308,7 @@ dependencies = [ name = "uu_false" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2316,7 +2316,7 @@ dependencies = [ name = "uu_fmt" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "unicode-width", "uucore", ] @@ -2325,7 +2325,7 @@ dependencies = [ name = "uu_fold" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2333,7 +2333,7 @@ dependencies = [ name = "uu_groups" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2343,7 +2343,7 @@ version = "0.0.13" dependencies = [ "blake2b_simd", "blake3", - "clap 3.1.12", + "clap 3.1.15", "digest", "hex", "md-5", @@ -2359,7 +2359,7 @@ dependencies = [ name = "uu_head" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "memchr 2.5.0", "uucore", ] @@ -2368,7 +2368,7 @@ dependencies = [ name = "uu_hostid" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "libc", "uucore", ] @@ -2377,7 +2377,7 @@ dependencies = [ name = "uu_hostname" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "hostname", "uucore", "winapi 0.3.9", @@ -2387,7 +2387,7 @@ dependencies = [ name = "uu_id" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "selinux", "uucore", ] @@ -2396,7 +2396,7 @@ dependencies = [ name = "uu_install" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "file_diff", "filetime", "libc", @@ -2407,7 +2407,7 @@ dependencies = [ name = "uu_join" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "memchr 2.5.0", "uucore", ] @@ -2416,7 +2416,7 @@ dependencies = [ name = "uu_kill" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "libc", "uucore", ] @@ -2425,7 +2425,7 @@ dependencies = [ name = "uu_link" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2433,7 +2433,7 @@ dependencies = [ name = "uu_ln" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2441,7 +2441,7 @@ dependencies = [ name = "uu_logname" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "libc", "uucore", ] @@ -2452,7 +2452,7 @@ version = "0.0.13" dependencies = [ "atty", "chrono", - "clap 3.1.12", + "clap 3.1.15", "glob", "lazy_static", "lscolors", @@ -2469,7 +2469,7 @@ dependencies = [ name = "uu_mkdir" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2477,7 +2477,7 @@ dependencies = [ name = "uu_mkfifo" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "libc", "uucore", ] @@ -2486,7 +2486,7 @@ dependencies = [ name = "uu_mknod" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "libc", "uucore", ] @@ -2495,7 +2495,7 @@ dependencies = [ name = "uu_mktemp" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "rand", "tempfile", "uucore", @@ -2506,7 +2506,7 @@ name = "uu_more" version = "0.0.13" dependencies = [ "atty", - "clap 3.1.12", + "clap 3.1.15", "crossterm", "nix", "unicode-segmentation", @@ -2518,7 +2518,7 @@ dependencies = [ name = "uu_mv" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "fs_extra", "uucore", ] @@ -2527,7 +2527,7 @@ dependencies = [ name = "uu_nice" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "libc", "nix", "uucore", @@ -2537,7 +2537,7 @@ dependencies = [ name = "uu_nl" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "regex", "uucore", ] @@ -2547,7 +2547,7 @@ name = "uu_nohup" version = "0.0.13" dependencies = [ "atty", - "clap 3.1.12", + "clap 3.1.15", "libc", "uucore", ] @@ -2556,7 +2556,7 @@ dependencies = [ name = "uu_nproc" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "libc", "num_cpus", "uucore", @@ -2566,7 +2566,7 @@ dependencies = [ name = "uu_numfmt" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2575,7 +2575,7 @@ name = "uu_od" version = "0.0.13" dependencies = [ "byteorder", - "clap 3.1.12", + "clap 3.1.15", "half", "uucore", ] @@ -2584,7 +2584,7 @@ dependencies = [ name = "uu_paste" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2592,7 +2592,7 @@ dependencies = [ name = "uu_pathchk" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "libc", "uucore", ] @@ -2601,7 +2601,7 @@ dependencies = [ name = "uu_pinky" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2610,7 +2610,7 @@ name = "uu_pr" version = "0.0.13" dependencies = [ "chrono", - "clap 3.1.12", + "clap 3.1.15", "itertools", "quick-error", "regex", @@ -2621,7 +2621,7 @@ dependencies = [ name = "uu_printenv" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2629,7 +2629,7 @@ dependencies = [ name = "uu_printf" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2637,7 +2637,7 @@ dependencies = [ name = "uu_ptx" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "regex", "uucore", ] @@ -2646,7 +2646,7 @@ dependencies = [ name = "uu_pwd" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2654,7 +2654,7 @@ dependencies = [ name = "uu_readlink" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2662,7 +2662,7 @@ dependencies = [ name = "uu_realpath" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2670,7 +2670,7 @@ dependencies = [ name = "uu_relpath" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2678,7 +2678,7 @@ dependencies = [ name = "uu_rm" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "remove_dir_all 0.7.0", "uucore", "walkdir", @@ -2689,7 +2689,7 @@ dependencies = [ name = "uu_rmdir" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "libc", "uucore", ] @@ -2698,7 +2698,7 @@ dependencies = [ name = "uu_runcon" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "libc", "selinux", "thiserror", @@ -2710,7 +2710,7 @@ name = "uu_seq" version = "0.0.13" dependencies = [ "bigdecimal", - "clap 3.1.12", + "clap 3.1.15", "num-bigint", "num-traits", "uucore", @@ -2720,7 +2720,7 @@ dependencies = [ name = "uu_shred" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "rand", "uucore", ] @@ -2729,7 +2729,7 @@ dependencies = [ name = "uu_shuf" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "rand", "rand_core", "uucore", @@ -2739,7 +2739,7 @@ dependencies = [ name = "uu_sleep" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2748,7 +2748,7 @@ name = "uu_sort" version = "0.0.13" dependencies = [ "binary-heap-plus", - "clap 3.1.12", + "clap 3.1.15", "compare", "ctrlc", "fnv", @@ -2766,7 +2766,7 @@ dependencies = [ name = "uu_split" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "memchr 2.5.0", "uucore", ] @@ -2775,7 +2775,7 @@ dependencies = [ name = "uu_stat" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2783,7 +2783,7 @@ dependencies = [ name = "uu_stdbuf" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "tempfile", "uu_stdbuf_libstdbuf", "uucore", @@ -2803,7 +2803,7 @@ dependencies = [ name = "uu_sum" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2811,7 +2811,7 @@ dependencies = [ name = "uu_sync" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "libc", "uucore", "winapi 0.3.9", @@ -2821,7 +2821,7 @@ dependencies = [ name = "uu_tac" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "memchr 2.5.0", "memmap2", "regex", @@ -2832,7 +2832,7 @@ dependencies = [ name = "uu_tail" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "libc", "nix", "uucore", @@ -2843,7 +2843,7 @@ dependencies = [ name = "uu_tee" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "libc", "retain_mut", "uucore", @@ -2853,7 +2853,7 @@ dependencies = [ name = "uu_test" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "libc", "redox_syscall", "uucore", @@ -2863,7 +2863,7 @@ dependencies = [ name = "uu_timeout" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "libc", "nix", "uucore", @@ -2873,7 +2873,7 @@ dependencies = [ name = "uu_touch" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "filetime", "time", "uucore", @@ -2884,7 +2884,7 @@ dependencies = [ name = "uu_tr" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "nom", "uucore", ] @@ -2893,7 +2893,7 @@ dependencies = [ name = "uu_true" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2901,7 +2901,7 @@ dependencies = [ name = "uu_truncate" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2909,7 +2909,7 @@ dependencies = [ name = "uu_tsort" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2918,7 +2918,7 @@ name = "uu_tty" version = "0.0.13" dependencies = [ "atty", - "clap 3.1.12", + "clap 3.1.15", "libc", "uucore", ] @@ -2927,7 +2927,7 @@ dependencies = [ name = "uu_uname" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "platform-info", "uucore", ] @@ -2936,7 +2936,7 @@ dependencies = [ name = "uu_unexpand" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "unicode-width", "uucore", ] @@ -2945,7 +2945,7 @@ dependencies = [ name = "uu_uniq" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "strum", "strum_macros", "uucore", @@ -2955,7 +2955,7 @@ dependencies = [ name = "uu_unlink" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2964,7 +2964,7 @@ name = "uu_uptime" version = "0.0.13" dependencies = [ "chrono", - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2972,7 +2972,7 @@ dependencies = [ name = "uu_users" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -2980,7 +2980,7 @@ dependencies = [ name = "uu_vdir" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "selinux", "uu_ls", "uucore", @@ -2991,7 +2991,7 @@ name = "uu_wc" version = "0.0.13" dependencies = [ "bytecount", - "clap 3.1.12", + "clap 3.1.15", "libc", "nix", "unicode-width", @@ -3003,7 +3003,7 @@ dependencies = [ name = "uu_who" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "uucore", ] @@ -3011,7 +3011,7 @@ dependencies = [ name = "uu_whoami" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "libc", "uucore", "winapi 0.3.9", @@ -3021,7 +3021,7 @@ dependencies = [ name = "uu_yes" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "nix", "uucore", ] @@ -3030,7 +3030,7 @@ dependencies = [ name = "uucore" version = "0.0.13" dependencies = [ - "clap 3.1.12", + "clap 3.1.15", "data-encoding", "data-encoding-macro", "dns-lookup", From 3e30569c2f1c6dc30c904a2c2ecd893e0e5733e8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 May 2022 06:13:02 +0000 Subject: [PATCH 164/242] build(deps): bump xattr from 0.2.2 to 0.2.3 Bumps [xattr](https://github.com/Stebalien/xattr) from 0.2.2 to 0.2.3. - [Release notes](https://github.com/Stebalien/xattr/releases) - [Commits](https://github.com/Stebalien/xattr/commits) --- updated-dependencies: - dependency-name: xattr dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- src/uu/cp/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ee06b62eba3..b503b60d50b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3208,9 +3208,9 @@ checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" [[package]] name = "xattr" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c" +checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" dependencies = [ "libc", ] diff --git a/src/uu/cp/Cargo.toml b/src/uu/cp/Cargo.toml index f9036101aae..3f3c2e317f8 100644 --- a/src/uu/cp/Cargo.toml +++ b/src/uu/cp/Cargo.toml @@ -34,7 +34,7 @@ ioctl-sys = "0.8" winapi = { version="0.3", features=["fileapi"] } [target.'cfg(unix)'.dependencies] -xattr="0.2.1" +xattr="0.2.3" exacl= { version = "0.8.0", optional=true } [[bin]] From 9bd883169dcf7ae7142dca372c516c83114da73c Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Wed, 4 May 2022 09:37:09 +0200 Subject: [PATCH 165/242] df: set min width of "Used" column to 5 --- src/uu/df/src/columns.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/uu/df/src/columns.rs b/src/uu/df/src/columns.rs index bd8cab43861..70b660a0b6b 100644 --- a/src/uu/df/src/columns.rs +++ b/src/uu/df/src/columns.rs @@ -197,6 +197,7 @@ impl Column { match column { // 14 = length of "Filesystem" plus 4 spaces Self::Source => 14, + Self::Used => 5, // the shortest headers have a length of 4 chars so we use that as the minimum width _ => 4, } From 88a62c4922e61f5896a163997143fb2d9ce4d660 Mon Sep 17 00:00:00 2001 From: Ackerley Tng Date: Tue, 3 May 2022 08:22:05 -0700 Subject: [PATCH 166/242] du: use common error methods with show! instead of set_exit_code --- src/uu/du/src/du.rs | 30 ++++++++---------------------- tests/by-util/test_du.rs | 4 +--- 2 files changed, 9 insertions(+), 25 deletions(-) diff --git a/src/uu/du/src/du.rs b/src/uu/du/src/du.rs index ff7a5a5b77e..b29a938a460 100644 --- a/src/uu/du/src/du.rs +++ b/src/uu/du/src/du.rs @@ -20,7 +20,7 @@ use std::fs::File; use std::fs::Metadata; use std::io::BufRead; use std::io::BufReader; -use std::io::{ErrorKind, Result}; +use std::io::Result; use std::iter; #[cfg(not(windows))] use std::os::unix::fs::MetadataExt; @@ -34,7 +34,8 @@ use std::str::FromStr; use std::time::{Duration, UNIX_EPOCH}; use std::{error::Error, fmt::Display}; use uucore::display::{print_verbatim, Quotable}; -use uucore::error::{set_exit_code, UError, UResult}; +use uucore::error::FromIo; +use uucore::error::{UError, UResult}; use uucore::format_usage; use uucore::parse_size::{parse_size, ParseSizeError}; use uucore::InvalidEncodingHandling; @@ -102,7 +103,6 @@ const UNITS: [(char, u32); 6] = [('E', 6), ('P', 5), ('T', 4), ('G', 3), ('M', 2 struct Options { all: bool, - util_name: String, max_depth: Option, total: bool, separate_dirs: bool, @@ -309,13 +309,9 @@ fn du( let read = match fs::read_dir(&my_stat.path) { Ok(read) => read, Err(e) => { - eprintln!( - "{}: cannot read directory {}: {}", - options.util_name, - my_stat.path.quote(), - e + show!( + e.map_err_context(|| format!("cannot read directory {}", my_stat.path.quote())) ); - set_exit_code(1); return Box::new(iter::once(my_stat)); } }; @@ -368,18 +364,9 @@ fn du( } } } - Err(error) => match error.kind() { - ErrorKind::PermissionDenied => { - let description = format!("cannot access {}", entry.path().quote()); - let error_message = "Permission denied"; - show_error_custom_description!(description, "{}", error_message); - set_exit_code(1); - } - _ => { - set_exit_code(1); - show_error!("cannot access {}: {}", entry.path().quote(), error); - } - }, + Err(e) => show!( + e.map_err_context(|| format!("cannot access {}", entry.path().quote())) + ), } } Err(error) => show_error!("{}", error), @@ -567,7 +554,6 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { let options = Options { all: matches.is_present(options::ALL), - util_name: uucore::util_name().to_owned(), max_depth, total: matches.is_present(options::TOTAL), separate_dirs: matches.is_present(options::SEPARATE_DIRS), diff --git a/tests/by-util/test_du.rs b/tests/by-util/test_du.rs index 254e751665c..bf506c8b538 100644 --- a/tests/by-util/test_du.rs +++ b/tests/by-util/test_du.rs @@ -435,9 +435,7 @@ fn test_du_no_permission() { ts.ccmd("chmod").arg("-r").arg(SUB_DIR_LINKS).succeeds(); let result = ts.ucmd().arg(SUB_DIR_LINKS).fails(); - result.stderr_contains( - "du: cannot read directory 'subdir/links': Permission denied (os error 13)", - ); + result.stderr_contains("du: cannot read directory 'subdir/links': Permission denied"); #[cfg(any(target_os = "linux", target_os = "android"))] { From 7b84261df42278a23bed2239cc8cb93126503ec0 Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Sat, 30 Apr 2022 11:25:53 +0200 Subject: [PATCH 167/242] uucore/error: add custom exit codes for clap errors This allows us to use clap errors as UResult and specify the exit code for invalid arguments per util. --- src/uucore/src/lib/mods/error.rs | 73 +++++++++++++++++++++++++++++--- 1 file changed, 68 insertions(+), 5 deletions(-) diff --git a/src/uucore/src/lib/mods/error.rs b/src/uucore/src/lib/mods/error.rs index dbe4d5bc19d..1af6ef7815b 100644 --- a/src/uucore/src/lib/mods/error.rs +++ b/src/uucore/src/lib/mods/error.rs @@ -617,12 +617,75 @@ impl From for Box { } } -/// Implementations for clap::Error -impl UError for clap::Error { +/// A wrapper for `clap::Error` that implements [`UError`] +/// +/// Contains a custom error code. When `Display::fmt` is called on this struct +/// the [`clap::Error`] will be printed _directly to `stdout` or `stderr`_. +/// This is because `clap` only supports colored output when it prints directly. +/// +/// [`ClapErrorWrapper`] is generally created by calling the +/// [`UClapError::with_exit_code`] method on [`clap::Error`] or using the [`From`] +/// implementation from [`clap::Error`] to `Box`, which constructs +/// a [`ClapErrorWrapper`] with an exit code of `1`. +/// +/// ```rust +/// use uucore::error::{ClapErrorWrapper, UError, UClapError}; +/// let command = clap::Command::new("test"); +/// let result: Result<_, ClapErrorWrapper> = command.try_get_matches().with_exit_code(125); +/// +/// let command = clap::Command::new("test"); +/// let result: Result<_, Box> = command.try_get_matches().map_err(Into::into); +/// ``` +#[derive(Debug)] +pub struct ClapErrorWrapper { + code: i32, + error: clap::Error, +} + +/// Extension trait for `clap::Error` to adjust the exit code. +pub trait UClapError { + fn with_exit_code(self, code: i32) -> T; +} + +impl From for Box { + fn from(e: clap::Error) -> Self { + Box::new(ClapErrorWrapper { code: 1, error: e }) + } +} + +impl UClapError for clap::Error { + fn with_exit_code(self, code: i32) -> ClapErrorWrapper { + ClapErrorWrapper { code, error: self } + } +} + +impl UClapError> + for Result +{ + fn with_exit_code(self, code: i32) -> Result { + self.map_err(|e| e.with_exit_code(code)) + } +} + +impl UError for ClapErrorWrapper { fn code(&self) -> i32 { - match self.kind() { - clap::ErrorKind::DisplayHelp | clap::ErrorKind::DisplayVersion => 0, - _ => 1, + // If the error is a DisplayHelp or DisplayVersion variant, + // we don't want to apply the custom error code, but leave + // it 0. + if let clap::ErrorKind::DisplayHelp | clap::ErrorKind::DisplayVersion = self.error.kind() { + 0 + } else { + self.code } } } + +impl Error for ClapErrorWrapper {} + +// This is abuse of the Display trait +impl Display for ClapErrorWrapper { + fn fmt(&self, _f: &mut Formatter<'_>) -> Result<(), std::fmt::Error> { + self.error.print().unwrap(); + Ok(()) + } +} From 8df253da69a9826056a8f556e772a549a8900c3f Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Sat, 30 Apr 2022 11:28:22 +0200 Subject: [PATCH 168/242] cat: set exit code for invalid arguments to 1 instead of 2 --- src/uu/cat/src/cat.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/uu/cat/src/cat.rs b/src/uu/cat/src/cat.rs index edba1b8d070..67de917f7b5 100644 --- a/src/uu/cat/src/cat.rs +++ b/src/uu/cat/src/cat.rs @@ -188,7 +188,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { .collect_str(InvalidEncodingHandling::Ignore) .accept_any(); - let matches = uu_app().get_matches_from(args); + let matches = uu_app().try_get_matches_from(args)?; let number_mode = if matches.is_present(options::NUMBER_NONBLANK) { NumberingMode::NonEmpty From 1bb85acc71b8276c910d850ea79d98f5009c0691 Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Sat, 30 Apr 2022 22:45:17 +0200 Subject: [PATCH 169/242] nice: set exit code for clap errors to 125 --- src/uu/nice/src/nice.rs | 4 ++-- tests/by-util/test_nice.rs | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/uu/nice/src/nice.rs b/src/uu/nice/src/nice.rs index b75dd979e18..e78de828bc9 100644 --- a/src/uu/nice/src/nice.rs +++ b/src/uu/nice/src/nice.rs @@ -17,7 +17,7 @@ use std::ptr; use clap::{crate_version, Arg, Command}; use uucore::{ - error::{set_exit_code, UResult, USimpleError, UUsageError}, + error::{set_exit_code, UClapError, UResult, USimpleError, UUsageError}, format_usage, }; @@ -35,7 +35,7 @@ const USAGE: &str = "{} [OPTIONS] [COMMAND [ARGS]]"; #[uucore::main] pub fn uumain(args: impl uucore::Args) -> UResult<()> { - let matches = uu_app().get_matches_from(args); + let matches = uu_app().try_get_matches_from(args).with_exit_code(125)?; let mut niceness = unsafe { nix::errno::Errno::clear(); diff --git a/tests/by-util/test_nice.rs b/tests/by-util/test_nice.rs index 2b53ed4377e..036723cdefa 100644 --- a/tests/by-util/test_nice.rs +++ b/tests/by-util/test_nice.rs @@ -58,3 +58,8 @@ fn test_command_where_command_takes_n_flag() { .run() .stdout_is("a"); } + +#[test] +fn test_invalid_argument() { + new_ucmd!().arg("--invalid").fails().code_is(125); +} From 24097262589b7cdb48ab166407b1a35e11618337 Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Sun, 1 May 2022 20:51:25 +0200 Subject: [PATCH 170/242] base: set exit code to 1 for clap errors --- src/uu/base32/src/base_common.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/uu/base32/src/base_common.rs b/src/uu/base32/src/base_common.rs index 100c85b1f13..148bad2f833 100644 --- a/src/uu/base32/src/base_common.rs +++ b/src/uu/base32/src/base_common.rs @@ -90,7 +90,7 @@ pub fn parse_base_cmd_args(args: impl uucore::Args, about: &str, usage: &str) -> let arg_list = args .collect_str(InvalidEncodingHandling::ConvertLossy) .accept_any(); - Config::from(&command.get_matches_from(arg_list)) + Config::from(&command.try_get_matches_from(arg_list)?) } pub fn base_app<'a>(about: &'a str, usage: &'a str) -> Command<'a> { From c7b7f19559c84feafa9959495d4f1fb0e44d9935 Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Wed, 4 May 2022 19:10:28 +0200 Subject: [PATCH 171/242] cp: use new clap error mechanism --- src/uu/cp/src/cp.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/uu/cp/src/cp.rs b/src/uu/cp/src/cp.rs index ce85b58bc4e..1b47b782879 100644 --- a/src/uu/cp/src/cp.rs +++ b/src/uu/cp/src/cp.rs @@ -57,7 +57,7 @@ use std::path::{Path, PathBuf, StripPrefixError}; use std::str::FromStr; use std::string::ToString; use uucore::backup_control::{self, BackupMode}; -use uucore::error::{set_exit_code, ExitCode, UError, UResult}; +use uucore::error::{set_exit_code, ExitCode, UClapError, UError, UResult}; use uucore::fs::{canonicalize, MissingHandling, ResolveMode}; use walkdir::WalkDir; @@ -485,7 +485,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { app.print_help()?; } clap::ErrorKind::DisplayVersion => println!("{}", app.render_version()), - _ => return Err(Box::new(e)), + _ => return Err(Box::new(e.with_exit_code(1))), }; } else if let Ok(matches) = matches { let options = Options::from_matches(&matches)?; From 46e029f34c02a3ad0bb663d070bfb75a4ff9acb9 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Wed, 20 Apr 2022 08:06:24 +0200 Subject: [PATCH 172/242] df: refactor HumanReadable handling The refactoring consists of three parts: 1) Introduction of SizeFormat & HumanReadable enums 2) Addition of a size_format field to the options struct 3) Movement of header logic from BlockSize to Header --- src/uu/df/src/blocks.rs | 79 ++++++++++++++++++++++------------------- src/uu/df/src/df.rs | 12 +++++++ src/uu/df/src/table.rs | 47 ++++++++++++------------ 3 files changed, 80 insertions(+), 58 deletions(-) diff --git a/src/uu/df/src/blocks.rs b/src/uu/df/src/blocks.rs index efeae2a70d7..f4965047217 100644 --- a/src/uu/df/src/blocks.rs +++ b/src/uu/df/src/blocks.rs @@ -3,7 +3,7 @@ // * For the full copyright and license information, please view the LICENSE // * file that was distributed with this source code. //! Types for representing and displaying block sizes. -use crate::{OPT_BLOCKSIZE, OPT_HUMAN_READABLE_BINARY, OPT_HUMAN_READABLE_DECIMAL}; +use crate::OPT_BLOCKSIZE; use clap::ArgMatches; use std::fmt; @@ -117,35 +117,53 @@ fn to_magnitude_and_suffix(n: u128) -> Result { } } -/// A block size to use in condensing the display of a large number of bytes. -/// -/// The [`BlockSize::Bytes`] variant represents a static block -/// size. The [`BlockSize::HumanReadableDecimal`] and -/// [`BlockSize::HumanReadableBinary`] variants represent dynamic -/// block sizes: as the number of bytes increases, the divisor -/// increases as well (for example, from 1 to 1,000 to 1,000,000 and -/// so on in the case of [`BlockSize::HumanReadableDecimal`]). -/// -/// The default variant is `Bytes(1024)`. -pub(crate) enum BlockSize { - /// A fixed number of bytes. - /// - /// The number must be positive. - Bytes(u64), +/// A mode to use in condensing the display of a large number of bytes. +pub(crate) enum SizeFormat { + HumanReadable(HumanReadable), + StaticBlockSize, +} + +impl Default for SizeFormat { + fn default() -> Self { + Self::StaticBlockSize + } +} +/// A mode to use in condensing the human readable display of a large number +/// of bytes. +/// +/// The [`HumanReadable::Decimal`] and[`HumanReadable::Binary`] variants +/// represent dynamic block sizes: as the number of bytes increases, the +/// divisor increases as well (for example, from 1 to 1,000 to 1,000,000 +/// and so on in the case of [`HumanReadable::Decimal`]). +#[derive(Clone, Copy)] +pub(crate) enum HumanReadable { /// Use the largest divisor corresponding to a unit, like B, K, M, G, etc. /// /// This variant represents powers of 1,000. Contrast with - /// [`BlockSize::HumanReadableBinary`], which represents powers of + /// [`HumanReadable::Binary`], which represents powers of /// 1,024. - HumanReadableDecimal, + Decimal, /// Use the largest divisor corresponding to a unit, like B, K, M, G, etc. /// /// This variant represents powers of 1,024. Contrast with - /// [`BlockSize::HumanReadableDecimal`], which represents powers + /// [`HumanReadable::Decimal`], which represents powers /// of 1,000. - HumanReadableBinary, + Binary, +} + +/// A block size to use in condensing the display of a large number of bytes. +/// +/// The [`BlockSize::Bytes`] variant represents a static block +/// size. +/// +/// The default variant is `Bytes(1024)`. +pub(crate) enum BlockSize { + /// A fixed number of bytes. + /// + /// The number must be positive. + Bytes(u64), } impl Default for BlockSize { @@ -155,11 +173,7 @@ impl Default for BlockSize { } pub(crate) fn block_size_from_matches(matches: &ArgMatches) -> Result { - if matches.is_present(OPT_HUMAN_READABLE_BINARY) { - Ok(BlockSize::HumanReadableBinary) - } else if matches.is_present(OPT_HUMAN_READABLE_DECIMAL) { - Ok(BlockSize::HumanReadableDecimal) - } else if matches.is_present(OPT_BLOCKSIZE) { + if matches.is_present(OPT_BLOCKSIZE) { let s = matches.value_of(OPT_BLOCKSIZE).unwrap(); Ok(BlockSize::Bytes(parse_size(s)?)) } else { @@ -170,10 +184,8 @@ pub(crate) fn block_size_from_matches(matches: &ArgMatches) -> Result fmt::Result { match self { - Self::HumanReadableBinary => write!(f, "Size"), - Self::HumanReadableDecimal => write!(f, "Size"), Self::Bytes(n) => match to_magnitude_and_suffix(*n as u128) { - Ok(s) => write!(f, "{}-blocks", s), + Ok(s) => write!(f, "{}", s), Err(_) => Err(fmt::Error), }, } @@ -229,13 +241,8 @@ mod tests { #[test] fn test_block_size_display() { - assert_eq!(format!("{}", BlockSize::HumanReadableBinary), "Size"); - assert_eq!(format!("{}", BlockSize::HumanReadableDecimal), "Size"); - assert_eq!(format!("{}", BlockSize::Bytes(1024)), "1K-blocks"); - assert_eq!(format!("{}", BlockSize::Bytes(2 * 1024)), "2K-blocks"); - assert_eq!( - format!("{}", BlockSize::Bytes(3 * 1024 * 1024)), - "3M-blocks" - ); + assert_eq!(format!("{}", BlockSize::Bytes(1024)), "1K"); + assert_eq!(format!("{}", BlockSize::Bytes(2 * 1024)), "2K"); + assert_eq!(format!("{}", BlockSize::Bytes(3 * 1024 * 1024)), "3M"); } } diff --git a/src/uu/df/src/df.rs b/src/uu/df/src/df.rs index b86b11f372b..3443141987c 100644 --- a/src/uu/df/src/df.rs +++ b/src/uu/df/src/df.rs @@ -11,6 +11,7 @@ mod columns; mod filesystem; mod table; +use blocks::{HumanReadable, SizeFormat}; use uucore::display::Quotable; use uucore::error::{UError, UResult, USimpleError}; use uucore::fsext::{read_fs_list, MountInfo}; @@ -62,6 +63,7 @@ static OUTPUT_FIELD_LIST: [&str; 12] = [ struct Options { show_local_fs: bool, show_all_fs: bool, + size_format: SizeFormat, block_size: BlockSize, /// Optional list of filesystem types to include in the output table. @@ -89,6 +91,7 @@ impl Default for Options { show_local_fs: Default::default(), show_all_fs: Default::default(), block_size: Default::default(), + size_format: Default::default(), include: Default::default(), exclude: Default::default(), show_total: Default::default(), @@ -166,6 +169,15 @@ impl Options { ), ParseSizeError::ParseFailure(s) => OptionsError::InvalidBlockSize(s), })?, + size_format: { + if matches.is_present(OPT_HUMAN_READABLE_BINARY) { + SizeFormat::HumanReadable(HumanReadable::Binary) + } else if matches.is_present(OPT_HUMAN_READABLE_DECIMAL) { + SizeFormat::HumanReadable(HumanReadable::Decimal) + } else { + SizeFormat::StaticBlockSize + } + }, include, exclude, show_total: matches.is_present(OPT_TOTAL), diff --git a/src/uu/df/src/table.rs b/src/uu/df/src/table.rs index 6b64ce02c24..64c5033ed69 100644 --- a/src/uu/df/src/table.rs +++ b/src/uu/df/src/table.rs @@ -10,6 +10,7 @@ use number_prefix::NumberPrefix; use unicode_width::UnicodeWidthStr; +use crate::blocks::{HumanReadable, SizeFormat}; use crate::columns::{Alignment, Column}; use crate::filesystem::Filesystem; use crate::{BlockSize, Options}; @@ -213,15 +214,10 @@ impl<'a> RowFormatter<'a> { } /// Get a human readable string giving the scaled version of the input number. - /// - /// The scaling factor is defined in the `options` field. - /// - /// This function is supposed to be used by `scaled_bytes()` and `scaled_inodes()` only. - fn scaled_human_readable(&self, size: u64) -> String { - let number_prefix = match self.options.block_size { - BlockSize::HumanReadableDecimal => NumberPrefix::decimal(size as f64), - BlockSize::HumanReadableBinary => NumberPrefix::binary(size as f64), - _ => unreachable!(), + fn scaled_human_readable(&self, size: u64, human_readable: HumanReadable) -> String { + let number_prefix = match human_readable { + HumanReadable::Decimal => NumberPrefix::decimal(size as f64), + HumanReadable::Binary => NumberPrefix::binary(size as f64), }; match number_prefix { NumberPrefix::Standalone(bytes) => bytes.to_string(), @@ -233,10 +229,12 @@ impl<'a> RowFormatter<'a> { /// /// The scaling factor is defined in the `options` field. fn scaled_bytes(&self, size: u64) -> String { - if let BlockSize::Bytes(d) = self.options.block_size { - (size / d).to_string() - } else { - self.scaled_human_readable(size) + match self.options.size_format { + SizeFormat::HumanReadable(h) => self.scaled_human_readable(size, h), + SizeFormat::StaticBlockSize => { + let BlockSize::Bytes(d) = self.options.block_size; + (size / d).to_string() + } } } @@ -244,10 +242,9 @@ impl<'a> RowFormatter<'a> { /// /// The scaling factor is defined in the `options` field. fn scaled_inodes(&self, size: u64) -> String { - if let BlockSize::Bytes(_) = self.options.block_size { - size.to_string() - } else { - self.scaled_human_readable(size) + match self.options.size_format { + SizeFormat::HumanReadable(h) => self.scaled_human_readable(size, h), + SizeFormat::StaticBlockSize => size.to_string(), } } @@ -305,7 +302,12 @@ impl Header { for column in &options.columns { let header = match column { Column::Source => String::from("Filesystem"), - Column::Size => options.block_size.to_string(), + Column::Size => match options.size_format { + SizeFormat::HumanReadable(_) => String::from("Size"), + SizeFormat::StaticBlockSize => { + format!("{}-blocks", options.block_size) + } + }, Column::Used => String::from("Used"), Column::Avail => String::from("Available"), Column::Pcent => String::from("Use%"), @@ -424,6 +426,7 @@ impl fmt::Display for Table { #[cfg(test)] mod tests { + use crate::blocks::{HumanReadable, SizeFormat}; use crate::columns::Column; use crate::table::{Header, Row, RowFormatter}; use crate::{BlockSize, Options}; @@ -523,7 +526,7 @@ mod tests { #[test] fn test_header_with_human_readable_binary() { let options = Options { - block_size: BlockSize::HumanReadableBinary, + size_format: SizeFormat::HumanReadable(HumanReadable::Binary), ..Default::default() }; assert_eq!( @@ -542,7 +545,7 @@ mod tests { #[test] fn test_header_with_human_readable_si() { let options = Options { - block_size: BlockSize::HumanReadableDecimal, + size_format: SizeFormat::HumanReadable(HumanReadable::Decimal), ..Default::default() }; assert_eq!( @@ -689,7 +692,7 @@ mod tests { #[test] fn test_row_formatter_with_human_readable_si() { let options = Options { - block_size: BlockSize::HumanReadableDecimal, + size_format: SizeFormat::HumanReadable(HumanReadable::Decimal), columns: COLUMNS_WITH_FS_TYPE.to_vec(), ..Default::default() }; @@ -730,7 +733,7 @@ mod tests { #[test] fn test_row_formatter_with_human_readable_binary() { let options = Options { - block_size: BlockSize::HumanReadableBinary, + size_format: SizeFormat::HumanReadable(HumanReadable::Binary), columns: COLUMNS_WITH_FS_TYPE.to_vec(), ..Default::default() }; From 00a3ec2d1f68e1c6d11f6f1d27651d2e1ae6dbf0 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Wed, 4 May 2022 16:11:03 +0200 Subject: [PATCH 173/242] df: implement Default for Row for unit tests --- src/uu/df/src/table.rs | 113 +++++++++++++---------------------------- 1 file changed, 34 insertions(+), 79 deletions(-) diff --git a/src/uu/df/src/table.rs b/src/uu/df/src/table.rs index 6b64ce02c24..0d57bc93b74 100644 --- a/src/uu/df/src/table.rs +++ b/src/uu/df/src/table.rs @@ -446,6 +446,30 @@ mod tests { Column::Target, ]; + impl Default for Row { + fn default() -> Self { + Self { + file: Some("/path/to/file".to_string()), + fs_device: "my_device".to_string(), + fs_type: "my_type".to_string(), + fs_mount: "my_mount".to_string(), + + bytes: 100, + bytes_used: 25, + bytes_avail: 75, + bytes_usage: Some(0.25), + + #[cfg(target_os = "macos")] + bytes_capacity: Some(0.5), + + inodes: 10, + inodes_used: 2, + inodes_free: 8, + inodes_usage: Some(0.2), + } + } + } + #[test] fn test_default_header() { let options = Default::default(); @@ -565,9 +589,7 @@ mod tests { ..Default::default() }; let row = Row { - file: Some("/path/to/file".to_string()), fs_device: "my_device".to_string(), - fs_type: "my_type".to_string(), fs_mount: "my_mount".to_string(), bytes: 100, @@ -575,13 +597,7 @@ mod tests { bytes_avail: 75, bytes_usage: Some(0.25), - #[cfg(target_os = "macos")] - bytes_capacity: Some(0.5), - - inodes: 10, - inodes_used: 2, - inodes_free: 8, - inodes_usage: Some(0.2), + ..Default::default() }; let fmt = RowFormatter::new(&row, &options); assert_eq!( @@ -598,7 +614,6 @@ mod tests { ..Default::default() }; let row = Row { - file: Some("/path/to/file".to_string()), fs_device: "my_device".to_string(), fs_type: "my_type".to_string(), fs_mount: "my_mount".to_string(), @@ -608,13 +623,7 @@ mod tests { bytes_avail: 75, bytes_usage: Some(0.25), - #[cfg(target_os = "macos")] - bytes_capacity: Some(0.5), - - inodes: 10, - inodes_used: 2, - inodes_free: 8, - inodes_usage: Some(0.2), + ..Default::default() }; let fmt = RowFormatter::new(&row, &options); assert_eq!( @@ -631,23 +640,15 @@ mod tests { ..Default::default() }; let row = Row { - file: Some("/path/to/file".to_string()), fs_device: "my_device".to_string(), - fs_type: "my_type".to_string(), fs_mount: "my_mount".to_string(), - bytes: 100, - bytes_used: 25, - bytes_avail: 75, - bytes_usage: Some(0.25), - - #[cfg(target_os = "macos")] - bytes_capacity: Some(0.5), - inodes: 10, inodes_used: 2, inodes_free: 8, inodes_usage: Some(0.2), + + ..Default::default() }; let fmt = RowFormatter::new(&row, &options); assert_eq!( @@ -664,23 +665,9 @@ mod tests { ..Default::default() }; let row = Row { - file: Some("/path/to/file".to_string()), - fs_device: "my_device".to_string(), - fs_type: "my_type".to_string(), - fs_mount: "my_mount".to_string(), - bytes: 100, - bytes_used: 25, - bytes_avail: 75, - bytes_usage: Some(0.25), - - #[cfg(target_os = "macos")] - bytes_capacity: Some(0.5), - inodes: 10, - inodes_used: 2, - inodes_free: 8, - inodes_usage: Some(0.2), + ..Default::default() }; let fmt = RowFormatter::new(&row, &options); assert_eq!(fmt.get_values(), vec!("1", "10")); @@ -694,7 +681,6 @@ mod tests { ..Default::default() }; let row = Row { - file: Some("/path/to/file".to_string()), fs_device: "my_device".to_string(), fs_type: "my_type".to_string(), fs_mount: "my_mount".to_string(), @@ -704,13 +690,7 @@ mod tests { bytes_avail: 3000, bytes_usage: Some(0.25), - #[cfg(target_os = "macos")] - bytes_capacity: Some(0.5), - - inodes: 10, - inodes_used: 2, - inodes_free: 8, - inodes_usage: Some(0.2), + ..Default::default() }; let fmt = RowFormatter::new(&row, &options); assert_eq!( @@ -735,7 +715,6 @@ mod tests { ..Default::default() }; let row = Row { - file: Some("/path/to/file".to_string()), fs_device: "my_device".to_string(), fs_type: "my_type".to_string(), fs_mount: "my_mount".to_string(), @@ -745,13 +724,7 @@ mod tests { bytes_avail: 3072, bytes_usage: Some(0.25), - #[cfg(target_os = "macos")] - bytes_capacity: Some(0.5), - - inodes: 10, - inodes_used: 2, - inodes_free: 8, - inodes_usage: Some(0.2), + ..Default::default() }; let fmt = RowFormatter::new(&row, &options); assert_eq!( @@ -771,32 +744,14 @@ mod tests { #[test] fn test_row_formatter_with_round_up_usage() { let options = Options { - block_size: BlockSize::Bytes(1), + columns: vec![Column::Pcent], ..Default::default() }; let row = Row { - file: Some("/path/to/file".to_string()), - fs_device: "my_device".to_string(), - fs_type: "my_type".to_string(), - fs_mount: "my_mount".to_string(), - - bytes: 100, - bytes_used: 25, - bytes_avail: 75, bytes_usage: Some(0.251), - - #[cfg(target_os = "macos")] - bytes_capacity: Some(0.5), - - inodes: 10, - inodes_used: 2, - inodes_free: 8, - inodes_usage: Some(0.2), + ..Default::default() }; let fmt = RowFormatter::new(&row, &options); - assert_eq!( - fmt.get_values(), - vec!("my_device", "100", "25", "75", "26%", "my_mount") - ); + assert_eq!(fmt.get_values(), vec!("26%")); } } From 24f78ddb9ecf28eaa33ec0b37350bd9711d982d1 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Thu, 5 May 2022 13:55:38 +0200 Subject: [PATCH 174/242] docs: remove duplicate "at", add missing newline --- docs/src/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/index.md b/docs/src/index.md index 3ea5d913aff..c51fbb19811 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -5,7 +5,7 @@ utilities in [Rust](https://www.rust-lang.org). It is available for Linux, Windows, Mac and other platforms. The API reference for `uucore`, the library of functions shared between -various utils, is hosted at at +various utils, is hosted at [docs.rs](https://docs.rs/uucore/latest/uucore/). uutils is licensed under the [MIT License](https://github.com/uutils/coreutils/blob/main/LICENSE). @@ -17,4 +17,4 @@ uutils is licensed under the [MIT License](https://github.com/uutils/coreutils/b * [Discord](https://discord.gg/wQVJbvJ) > Note: This manual is automatically generated from the source code and is -> a work in progress. \ No newline at end of file +> a work in progress. From f5ffa9412940d4fe74b89d2931eb7ccf8198f8d0 Mon Sep 17 00:00:00 2001 From: Jan Scheer Date: Thu, 5 May 2022 19:53:38 +0200 Subject: [PATCH 175/242] test_stat: add tests for issues with stdin * add tests for: https://github.com/uutils/coreutils/issues/3485 * add test for: https://github.com/uutils/coreutils/pull/3280 --- tests/by-util/test_stat.rs | 55 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/tests/by-util/test_stat.rs b/tests/by-util/test_stat.rs index 90ad2d12aaa..53e83bef67b 100644 --- a/tests/by-util/test_stat.rs +++ b/tests/by-util/test_stat.rs @@ -311,3 +311,58 @@ fn test_printf() { let expected_stdout = unwrap_or_return!(expected_result(&ts, &args)).stdout_move_str(); ts.ucmd().args(&args).succeeds().stdout_is(expected_stdout); } + +#[cfg(unix)] +#[test] +#[cfg(disable_until_fixed)] +fn test_stdin_pipe_fifo1() { + // $ echo | stat - + // File: - + // Size: 0 Blocks: 0 IO Block: 4096 fifo + // use std::process::{Command, Stdio}; + new_ucmd!() + .arg("-") + .set_stdin(std::process::Stdio::piped()) + .run() + .no_stderr() + .stdout_contains("fifo") + .stdout_contains("File: -") + .succeeded(); +} + +#[cfg(unix)] +#[test] +#[cfg(disable_until_fixed)] +fn test_stdin_pipe_fifo2() { + // $ stat - + // File: - + // Size: 0 Blocks: 0 IO Block: 1024 character special file + new_ucmd!() + .arg("-") + .run() + .no_stderr() + .stdout_contains("character special file") + .stdout_contains("File: -") + .succeeded(); +} + +#[cfg(unix)] +#[test] +#[cfg(disable_until_fixed)] +fn test_stdin_redirect() { + // $ touch f && stat - < f + // File: - + // Size: 0 Blocks: 0 IO Block: 4096 regular empty file + + let ts = TestScenario::new(util_name!()); + let at = &ts.fixtures; + at.touch("f"); + new_ucmd!() + .arg("-") + .set_stdin(std::fs::File::open("f").unwrap()) + .run() + .no_stderr() + .stdout_contains("regular empty file") + .stdout_contains("File: -") + .succeeded(); +} From e70b99dad0b01758b71faf76a31094541f23112f Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Fri, 29 Apr 2022 10:32:28 +0200 Subject: [PATCH 176/242] touch: add support of -d '1970-01-01 18:43:33.023456789' --- src/uu/touch/src/touch.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/uu/touch/src/touch.rs b/src/uu/touch/src/touch.rs index 5264401ef43..1d90ed4d79d 100644 --- a/src/uu/touch/src/touch.rs +++ b/src/uu/touch/src/touch.rs @@ -6,7 +6,7 @@ // For the full copyright and license information, please view the LICENSE file // that was distributed with this source code. -// spell-checker:ignore (ToDO) filetime strptime utcoff strs datetime MMDDhhmm clapv PWSTR lpszfilepath hresult mktime YYYYMMDDHHMM YYMMDDHHMM DATETIME YYYYMMDDHHMMS +// spell-checker:ignore (ToDO) filetime strptime utcoff strs datetime MMDDhhmm clapv PWSTR lpszfilepath hresult mktime YYYYMMDDHHMM YYMMDDHHMM DATETIME YYYYMMDDHHMMS subsecond pub extern crate filetime; #[macro_use] From 65d0f5ba9f0ba9a4271d293fd0e7538c6a502783 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Mon, 2 May 2022 22:32:37 +0200 Subject: [PATCH 177/242] to_local: manage the error --- src/uu/touch/src/touch.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/uu/touch/src/touch.rs b/src/uu/touch/src/touch.rs index 1d90ed4d79d..8e8e4c45854 100644 --- a/src/uu/touch/src/touch.rs +++ b/src/uu/touch/src/touch.rs @@ -43,8 +43,13 @@ pub mod options { static ARG_FILES: &str = "files"; fn to_local(tm: time::PrimitiveDateTime) -> time::OffsetDateTime { - // TODO: handle error getting now - tm.assume_offset(time::OffsetDateTime::now_local().unwrap().offset()) + let offset = match time::OffsetDateTime::now_local() { + Ok(lo) => lo.offset(), + Err(e) => { + panic!("error: {}", e); + } + }; + tm.assume_offset(offset) } fn local_dt_to_filetime(dt: time::OffsetDateTime) -> FileTime { From e691330f02f02c6ac5fae05d82a24d75a22fb3e8 Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Thu, 5 May 2022 17:58:37 -0400 Subject: [PATCH 178/242] mktemp: return MkTempError from parse_template() Change the return type of the `parse_template()` helper function in the `mktemp` program so that it returns `Result<..., MkTempError>` instead of `UResult<...>`. This separates the lower level helper function from the higher level `UResult` abstraction and will make it easier to refactor this code in future commits. --- src/uu/mktemp/src/mktemp.rs | 69 ++++++++++++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 5 deletions(-) diff --git a/src/uu/mktemp/src/mktemp.rs b/src/uu/mktemp/src/mktemp.rs index f999d667564..b14318679fd 100644 --- a/src/uu/mktemp/src/mktemp.rs +++ b/src/uu/mktemp/src/mktemp.rs @@ -205,20 +205,41 @@ pub fn uu_app<'a>() -> Command<'a> { ) } +/// Parse a template string into prefix, suffix, and random components. +/// +/// `temp` is the template string, with three or more consecutive `X`s +/// representing a placeholder for randomly generated characters (for +/// example, `"abc_XXX.txt"`). If `temp` ends in an `X`, then a suffix +/// can be specified by `suffix` instead. +/// +/// # Errors +/// +/// * If there are fewer than three consecutive `X`s in `temp`. +/// * If `suffix` is a [`Some`] object but `temp` does not end in `X`. +/// * If the suffix (specified either way) contains a path separator. +/// +/// # Examples +/// +/// ```rust,ignore +/// assert_eq!(parse_template("XXX", None).unwrap(), ("", 3, "")); +/// assert_eq!(parse_template("abcXXX", None).unwrap(), ("abc", 3, "")); +/// assert_eq!(parse_template("XXXdef", None).unwrap(), ("", 3, "def")); +/// assert_eq!(parse_template("abcXXXdef", None).unwrap(), ("abc", 3, "def")); +/// ``` fn parse_template<'a>( temp: &'a str, suffix: Option<&'a str>, -) -> UResult<(&'a str, usize, &'a str)> { +) -> Result<(&'a str, usize, &'a str), MkTempError> { let right = match temp.rfind('X') { Some(r) => r + 1, - None => return Err(MkTempError::TooFewXs(temp.into()).into()), + None => return Err(MkTempError::TooFewXs(temp.into())), }; let left = temp[..right].rfind(|c| c != 'X').map_or(0, |i| i + 1); let prefix = &temp[..left]; let rand = right - left; if rand < 3 { - return Err(MkTempError::TooFewXs(temp.into()).into()); + return Err(MkTempError::TooFewXs(temp.into())); } let mut suf = &temp[right..]; @@ -227,12 +248,12 @@ fn parse_template<'a>( if suf.is_empty() { suf = s; } else { - return Err(MkTempError::MustEndInX(temp.into()).into()); + return Err(MkTempError::MustEndInX(temp.into())); } }; if suf.chars().any(is_separator) { - return Err(MkTempError::ContainsDirSeparator(suf.into()).into()); + return Err(MkTempError::ContainsDirSeparator(suf.into())); } Ok((prefix, rand, suf)) @@ -304,3 +325,41 @@ fn exec(dir: &Path, prefix: &str, rand: usize, suffix: &str, make_dir: bool) -> println_verbatim(path).map_err_context(|| "failed to print directory name".to_owned()) } + +#[cfg(test)] +mod tests { + use crate::parse_template; + + #[test] + fn test_parse_template_no_suffix() { + assert_eq!(parse_template("XXX", None).unwrap(), ("", 3, "")); + assert_eq!(parse_template("abcXXX", None).unwrap(), ("abc", 3, "")); + assert_eq!(parse_template("XXXdef", None).unwrap(), ("", 3, "def")); + assert_eq!( + parse_template("abcXXXdef", None).unwrap(), + ("abc", 3, "def") + ); + } + + #[test] + fn test_parse_template_suffix() { + assert_eq!(parse_template("XXX", Some("def")).unwrap(), ("", 3, "def")); + assert_eq!( + parse_template("abcXXX", Some("def")).unwrap(), + ("abc", 3, "def") + ); + } + + #[test] + fn test_parse_template_errors() { + // TODO This should be an error as well, but we are not + // catching it just yet. A future commit will correct this. + // + // assert!(parse_template("a/bXXX", None).is_err()); + // + assert!(parse_template("XXXa/b", None).is_err()); + assert!(parse_template("XX", None).is_err()); + assert!(parse_template("XXXabc", Some("def")).is_err()); + assert!(parse_template("XXX", Some("a/b")).is_err()); + } +} From 608b1afde51542222e8ab64c1681013249e083c2 Mon Sep 17 00:00:00 2001 From: naveensrinivasan <172697+naveensrinivasan@users.noreply.github.com> Date: Thu, 5 May 2022 19:38:10 -0500 Subject: [PATCH 179/242] chore: Included githubactions in the dependabot config This should help with keeping the GitHub actions updated on new releases. This will also help with keeping it secure. Dependabot helps in keeping the supply chain secure https://docs.github.com/en/code-security/dependabot GitHub actions up to date https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot https://github.com/ossf/scorecard/blob/main/docs/checks.md#dependency-update-tool Signed-off-by: naveensrinivasan <172697+naveensrinivasan@users.noreply.github.com> --- .github/dependabot.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ef7519b88e3..cfcddbb1434 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,3 +5,8 @@ updates: schedule: interval: "daily" open-pull-requests-limit: 5 + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 5 From be1f41e24cf2dba128abcb5ee181b58b07008741 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Fri, 6 May 2022 08:02:22 +0200 Subject: [PATCH 180/242] df: set names for arg values & add missing space --- src/uu/df/src/df.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/uu/df/src/df.rs b/src/uu/df/src/df.rs index 3443141987c..d9fb1be7bb8 100644 --- a/src/uu/df/src/df.rs +++ b/src/uu/df/src/df.rs @@ -445,6 +445,7 @@ pub fn uu_app<'a>() -> Command<'a> { .short('B') .long("block-size") .takes_value(true) + .value_name("SIZE") .overrides_with_all(&[OPT_KILO, OPT_BLOCKSIZE]) .help( "scale sizes by SIZE before printing them; e.g.\ @@ -501,6 +502,7 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(OPT_OUTPUT) .long("output") .takes_value(true) + .value_name("FIELD_LIST") .min_values(0) .require_equals(true) .use_value_delimiter(true) @@ -510,7 +512,7 @@ pub fn uu_app<'a>() -> Command<'a> { .default_values(&["source", "size", "used", "avail", "pcent", "target"]) .conflicts_with_all(&[OPT_INODES, OPT_PORTABILITY, OPT_PRINT_TYPE]) .help( - "use the output format defined by FIELD_LIST,\ + "use the output format defined by FIELD_LIST, \ or print all fields if FIELD_LIST is omitted.", ), ) @@ -533,6 +535,7 @@ pub fn uu_app<'a>() -> Command<'a> { .long("type") .allow_invalid_utf8(true) .takes_value(true) + .value_name("TYPE") .multiple_occurrences(true) .help("limit listing to file systems of type TYPE"), ) @@ -549,6 +552,7 @@ pub fn uu_app<'a>() -> Command<'a> { .long("exclude-type") .allow_invalid_utf8(true) .takes_value(true) + .value_name("TYPE") .use_value_delimiter(true) .multiple_occurrences(true) .help("limit listing to file systems not of type TYPE"), From 97c59d78578cf9402946b1bd4fad7777da496362 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 May 2022 06:29:14 +0000 Subject: [PATCH 181/242] build(deps): bump num-traits from 0.2.14 to 0.2.15 Bumps [num-traits](https://github.com/rust-num/num-traits) from 0.2.14 to 0.2.15. - [Release notes](https://github.com/rust-num/num-traits/releases) - [Changelog](https://github.com/rust-num/num-traits/blob/master/RELEASES.md) - [Commits](https://github.com/rust-num/num-traits/compare/num-traits-0.2.14...num-traits-0.2.15) --- updated-dependencies: - dependency-name: num-traits dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- src/uu/expr/Cargo.toml | 2 +- src/uu/factor/Cargo.toml | 4 ++-- src/uu/seq/Cargo.toml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b503b60d50b..4f73fe91e75 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1196,9 +1196,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", ] diff --git a/src/uu/expr/Cargo.toml b/src/uu/expr/Cargo.toml index c4a1bae4a80..9ea8008af84 100644 --- a/src/uu/expr/Cargo.toml +++ b/src/uu/expr/Cargo.toml @@ -17,7 +17,7 @@ path = "src/expr.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } num-bigint = "0.4.0" -num-traits = "0.2.14" +num-traits = "0.2.15" onig = { version = "~6.3", default-features = false } uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } diff --git a/src/uu/factor/Cargo.toml b/src/uu/factor/Cargo.toml index e1620ed907d..24261671800 100644 --- a/src/uu/factor/Cargo.toml +++ b/src/uu/factor/Cargo.toml @@ -12,12 +12,12 @@ categories = ["command-line-utilities"] edition = "2021" [build-dependencies] -num-traits = "0.2.13" # used in src/numerics.rs, which is included by build.rs +num-traits = "0.2.15" # used in src/numerics.rs, which is included by build.rs [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } coz = { version = "0.1.3", optional = true } -num-traits = "0.2.13" # Needs at least version 0.2.13 for "OverflowingAdd" +num-traits = "0.2.13" # Needs at least version 0.2.15 for "OverflowingAdd" rand = { version = "0.8", features = ["small_rng"] } smallvec = "1.7" # TODO(nicoo): Use `union` feature, requires Rust 1.49 or later. uucore = { version = ">=0.0.8", package = "uucore", path = "../../uucore" } diff --git a/src/uu/seq/Cargo.toml b/src/uu/seq/Cargo.toml index ad8bba5b645..67226093dfe 100644 --- a/src/uu/seq/Cargo.toml +++ b/src/uu/seq/Cargo.toml @@ -19,7 +19,7 @@ path = "src/seq.rs" bigdecimal = "0.3" clap = { version = "3.1", features = ["wrap_help", "cargo"] } num-bigint = "0.4.0" -num-traits = "0.2.14" +num-traits = "0.2.15" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["memo"] } [[bin]] From a60f6dc67eca2591639f7f6e90d4f21ae3602eb4 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Wed, 4 May 2022 22:36:21 +0200 Subject: [PATCH 182/242] Update num-traits for real --- src/uu/factor/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/uu/factor/Cargo.toml b/src/uu/factor/Cargo.toml index 24261671800..20a21ac001d 100644 --- a/src/uu/factor/Cargo.toml +++ b/src/uu/factor/Cargo.toml @@ -17,7 +17,7 @@ num-traits = "0.2.15" # used in src/numerics.rs, which is included by build.rs [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } coz = { version = "0.1.3", optional = true } -num-traits = "0.2.13" # Needs at least version 0.2.15 for "OverflowingAdd" +num-traits = "0.2.15" # Needs at least version 0.2.15 for "OverflowingAdd" rand = { version = "0.8", features = ["small_rng"] } smallvec = "1.7" # TODO(nicoo): Use `union` feature, requires Rust 1.49 or later. uucore = { version = ">=0.0.8", package = "uucore", path = "../../uucore" } From 06ef89b3d822dccbf0dfff1683486498c6fcfc6f Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Thu, 5 May 2022 22:48:37 +0200 Subject: [PATCH 183/242] touch: improve the -d option support of other dates --- src/uu/touch/src/touch.rs | 25 +++++++++++++++++-------- tests/by-util/test_touch.rs | 10 ++++++++-- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/uu/touch/src/touch.rs b/src/uu/touch/src/touch.rs index 8e8e4c45854..c082aed23cb 100644 --- a/src/uu/touch/src/touch.rs +++ b/src/uu/touch/src/touch.rs @@ -16,7 +16,7 @@ use clap::{crate_version, Arg, ArgGroup, Command}; use filetime::*; use std::fs::{self, File}; use std::path::{Path, PathBuf}; -use time::macros::{format_description, time}; +use time::macros::{format_description, offset, time}; use time::Duration; use uucore::display::Quotable; use uucore::error::{FromIo, UError, UResult, USimpleError}; @@ -42,6 +42,7 @@ pub mod options { static ARG_FILES: &str = "files"; +// Convert a date/time to a date with a TZ offset fn to_local(tm: time::PrimitiveDateTime) -> time::OffsetDateTime { let offset = match time::OffsetDateTime::now_local() { Ok(lo) => lo.offset(), @@ -52,10 +53,18 @@ fn to_local(tm: time::PrimitiveDateTime) -> time::OffsetDateTime { tm.assume_offset(offset) } +// Convert a date/time with a TZ offset into a FileTime fn local_dt_to_filetime(dt: time::OffsetDateTime) -> FileTime { FileTime::from_unix_time(dt.unix_timestamp(), dt.nanosecond()) } +// Convert a date/time, considering that the input is in UTC time +// Used for touch -d 1970-01-01 18:43:33.023456789 for example +fn dt_to_filename(tm: time::PrimitiveDateTime) -> FileTime { + let dt = tm.assume_offset(offset!(UTC)); + local_dt_to_filetime(dt) +} + #[uucore::main] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uu_app().get_matches_from(args); @@ -310,15 +319,15 @@ fn parse_date(s: &str) -> UResult { // Tue Dec 3 ... // ("%c", POSIX_LOCALE_FORMAT), // - // But also support other format found in the GNU tests like + if let Ok(parsed) = time::PrimitiveDateTime::parse(s, &POSIX_LOCALE_FORMAT) { + return Ok(local_dt_to_filetime(to_local(parsed))); + } + + // Also support other formats found in the GNU tests like // in tests/misc/stat-nanoseconds.sh - for fmt in [ - POSIX_LOCALE_FORMAT, - YYYYMMDDHHMMS_FORMAT, - YYYYMMDDHHMMSS_FORMAT, - ] { + for fmt in [YYYYMMDDHHMMS_FORMAT, YYYYMMDDHHMMSS_FORMAT] { if let Ok(parsed) = time::PrimitiveDateTime::parse(s, &fmt) { - return Ok(local_dt_to_filetime(to_local(parsed))); + return Ok(dt_to_filename(parsed)); } } diff --git a/tests/by-util/test_touch.rs b/tests/by-util/test_touch.rs index ed62692f4d8..9b8eebbf046 100644 --- a/tests/by-util/test_touch.rs +++ b/tests/by-util/test_touch.rs @@ -438,7 +438,7 @@ fn test_touch_set_date4() { assert!(at.file_exists(file)); - let expected = FileTime::from_unix_time(60213, 0); + let expected = FileTime::from_unix_time(67413, 0); let (atime, mtime) = get_file_times(&at, file); assert_eq!(atime, mtime); assert_eq!(atime, expected); @@ -456,7 +456,13 @@ fn test_touch_set_date5() { assert!(at.file_exists(file)); - let expected = FileTime::from_unix_time(60213, 023456789); + // Slightly different result on Windows for nano seconds + // TODO: investigate + #[cfg(windows)] + let expected = FileTime::from_unix_time(67413, 23456700); + #[cfg(not(windows))] + let expected = FileTime::from_unix_time(67413, 23456789); + let (atime, mtime) = get_file_times(&at, file); assert_eq!(atime, mtime); assert_eq!(atime, expected); From 5a3933a882ae0daec84bad9fc3c517e1bda58011 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Fri, 6 May 2022 15:37:52 +0200 Subject: [PATCH 184/242] df: fix "Size" header for multiples of 1000 & 1024 --- src/uu/df/src/blocks.rs | 11 +++++++++-- tests/by-util/test_df.rs | 5 +++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/uu/df/src/blocks.rs b/src/uu/df/src/blocks.rs index f4965047217..e964a208ac9 100644 --- a/src/uu/df/src/blocks.rs +++ b/src/uu/df/src/blocks.rs @@ -73,7 +73,7 @@ fn to_magnitude_and_suffix_1024(n: u128) -> Result { Err(()) } -/// Convert a number, except multiples of 1024, into a string like "12kB" or "34MB". +/// Convert a number into a string like "12kB" or "34MB". /// /// Powers of 1000 become "1kB", "1MB", "1GB", etc. /// @@ -110,7 +110,7 @@ fn to_magnitude_and_suffix_not_powers_of_1024(n: u128) -> Result { /// /// If the number is too large to represent. fn to_magnitude_and_suffix(n: u128) -> Result { - if n % 1024 == 0 { + if n % 1024 == 0 && n % 1000 != 0 { to_magnitude_and_suffix_1024(n) } else { to_magnitude_and_suffix_not_powers_of_1024(n) @@ -239,6 +239,13 @@ mod tests { assert_eq!(to_magnitude_and_suffix(1_000_000_001).unwrap(), "1.1GB"); } + #[test] + fn test_to_magnitude_and_suffix_multiples_of_1000_and_1024() { + assert_eq!(to_magnitude_and_suffix(128_000).unwrap(), "128kB"); + assert_eq!(to_magnitude_and_suffix(1000 * 1024).unwrap(), "1.1MB"); + assert_eq!(to_magnitude_and_suffix(1_000_000_000_000).unwrap(), "1TB"); + } + #[test] fn test_block_size_display() { assert_eq!(format!("{}", BlockSize::Bytes(1024)), "1K"); diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index f03a71a7b87..511956ec41d 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -392,6 +392,11 @@ fn test_block_size_1024() { assert_eq!(get_header(2 * 1024 * 1024), "2M-blocks"); assert_eq!(get_header(1024 * 1024 * 1024), "1G-blocks"); assert_eq!(get_header(34 * 1024 * 1024 * 1024), "34G-blocks"); + + // multiples of both 1024 and 1000 + assert_eq!(get_header(128_000), "128kB-blocks"); + assert_eq!(get_header(1000 * 1024), "1.1MB-blocks"); + assert_eq!(get_header(1_000_000_000_000), "1TB-blocks"); } #[test] From 39520a84ab7ca2515913b0621d91d60f05775fd7 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Fri, 6 May 2022 23:54:12 +0200 Subject: [PATCH 185/242] fix the GNU error detection --- .github/workflows/GnuTests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/GnuTests.yml b/.github/workflows/GnuTests.yml index f2b0ddd4531..3a152be22b6 100644 --- a/.github/workflows/GnuTests.yml +++ b/.github/workflows/GnuTests.yml @@ -170,8 +170,8 @@ jobs: REPO_DEFAULT_BRANCH='${{ steps.vars.outputs.repo_default_branch }}' if test -f "${REF_LOG_FILE}"; then echo "Reference SHA1/ID: $(sha1sum -- "${REF_SUMMARY_FILE}")" - REF_ERROR=$(sed -n "s/^FAIL: \([[:print:]]\+\).*/\1/p" "${REF_LOG_FILE}" | sort) - NEW_ERROR=$(sed -n "s/^FAIL: \([[:print:]]\+\).*/\1/p" '${{ steps.vars.outputs.path_GNU_tests }}/test-suite.log' | sort) + REF_ERROR=$(sed -n "s/^ERROR: \([[:print:]]\+\).*/\1/p" "${REF_LOG_FILE}" | sort) + NEW_ERROR=$(sed -n "s/^ERROR: \([[:print:]]\+\).*/\1/p" '${{ steps.vars.outputs.path_GNU_tests }}/test-suite.log' | sort) REF_FAILING=$(sed -n "s/^FAIL: \([[:print:]]\+\).*/\1/p" "${REF_LOG_FILE}" | sort) NEW_FAILING=$(sed -n "s/^FAIL: \([[:print:]]\+\).*/\1/p" '${{ steps.vars.outputs.path_GNU_tests }}/test-suite.log' | sort) for LINE in ${REF_FAILING} From a640ed64896b0fc5ff35362f1e2b27ead8d8c7f0 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Fri, 6 May 2022 23:54:12 +0200 Subject: [PATCH 186/242] fix the GNU error detection --- .github/workflows/GnuTests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/GnuTests.yml b/.github/workflows/GnuTests.yml index a20ddd8a8a3..c8d3c8b9472 100644 --- a/.github/workflows/GnuTests.yml +++ b/.github/workflows/GnuTests.yml @@ -174,8 +174,8 @@ jobs: REPO_DEFAULT_BRANCH='${{ steps.vars.outputs.repo_default_branch }}' if test -f "${REF_LOG_FILE}"; then echo "Reference SHA1/ID: $(sha1sum -- "${REF_SUMMARY_FILE}")" - REF_ERROR=$(sed -n "s/^FAIL: \([[:print:]]\+\).*/\1/p" "${REF_LOG_FILE}" | sort) - NEW_ERROR=$(sed -n "s/^FAIL: \([[:print:]]\+\).*/\1/p" '${{ steps.vars.outputs.path_GNU_tests }}/test-suite.log' | sort) + REF_ERROR=$(sed -n "s/^ERROR: \([[:print:]]\+\).*/\1/p" "${REF_LOG_FILE}" | sort) + NEW_ERROR=$(sed -n "s/^ERROR: \([[:print:]]\+\).*/\1/p" '${{ steps.vars.outputs.path_GNU_tests }}/test-suite.log' | sort) REF_FAILING=$(sed -n "s/^FAIL: \([[:print:]]\+\).*/\1/p" "${REF_LOG_FILE}" | sort) NEW_FAILING=$(sed -n "s/^FAIL: \([[:print:]]\+\).*/\1/p" '${{ steps.vars.outputs.path_GNU_tests }}/test-suite.log' | sort) for LINE in ${REF_FAILING} From 79e5d80e3eec820063d82725b7237ce92707b674 Mon Sep 17 00:00:00 2001 From: Jan Scheer Date: Fri, 6 May 2022 14:01:23 +0200 Subject: [PATCH 187/242] stat: improve handling of stdin/fifo (fix #3485) * fix https://github.com/uutils/coreutils/issues/3485 * improve the workaround from #3280 * add tests --- src/uu/stat/src/stat.rs | 79 +++++++++++++++++----------- src/uucore/src/lib/features/fsext.rs | 5 +- tests/by-util/test_stat.rs | 32 ++++++++--- 3 files changed, 76 insertions(+), 40 deletions(-) diff --git a/src/uu/stat/src/stat.rs b/src/uu/stat/src/stat.rs index cebc6c10823..41c9ae4a96e 100644 --- a/src/uu/stat/src/stat.rs +++ b/src/uu/stat/src/stat.rs @@ -19,7 +19,9 @@ use uucore::{entries, format_usage}; use clap::{crate_version, Arg, ArgMatches, Command}; use std::borrow::Cow; use std::convert::AsRef; +use std::ffi::{OsStr, OsString}; use std::os::unix::fs::{FileTypeExt, MetadataExt}; +use std::os::unix::prelude::OsStrExt; use std::path::Path; use std::{cmp, fs, iter}; @@ -221,7 +223,7 @@ pub struct Stater { follow: bool, show_fs: bool, from_user: bool, - files: Vec, + files: Vec, mount_list: Option>, default_tokens: Vec, default_dev_tokens: Vec, @@ -471,24 +473,10 @@ impl Stater { } fn new(matches: &ArgMatches) -> UResult { - let mut files: Vec = matches - .values_of(ARG_FILES) - .map(|v| v.map(ToString::to_string).collect()) + let files = matches + .values_of_os(ARG_FILES) + .map(|v| v.map(OsString::from).collect()) .unwrap_or_default(); - #[cfg(unix)] - if files.contains(&String::from("-")) { - let redirected_path = Path::new("/dev/stdin") - .canonicalize() - .expect("unable to canonicalize /dev/stdin") - .into_os_string() - .into_string() - .unwrap(); - for file in &mut files { - if file == "-" { - *file = redirected_path.clone(); - } - } - } let format_str = if matches.is_present(options::PRINTF) { matches .value_of(options::PRINTF) @@ -550,19 +538,37 @@ impl Stater { } fn exec(&self) -> i32 { + let mut stdin_is_fifo = false; + if cfg!(unix) { + if let Ok(md) = fs::metadata("/dev/stdin") { + stdin_is_fifo = md.file_type().is_fifo(); + } + } + let mut ret = 0; for f in &self.files { - ret |= self.do_stat(f.as_str()); + ret |= self.do_stat(f, stdin_is_fifo); } ret } - fn do_stat(&self, file: &str) -> i32 { + fn do_stat(&self, file: &OsStr, stdin_is_fifo: bool) -> i32 { + let display_name = file.to_string_lossy(); + let file: OsString = if cfg!(unix) && display_name.eq("-") { + if let Ok(p) = Path::new("/dev/stdin").canonicalize() { + p.into_os_string() + } else { + OsString::from("/dev/stdin") + } + } else { + OsString::from(file) + }; + if !self.show_fs { - let result = if self.follow { - fs::metadata(file) + let result = if self.follow || stdin_is_fifo && display_name.eq("-") { + fs::metadata(&file) } else { - fs::symlink_metadata(file) + fs::symlink_metadata(&file) }; match result { Ok(meta) => { @@ -658,28 +664,32 @@ impl Stater { // mount point 'm' => { - arg = self.find_mount_point(file).unwrap(); + arg = self.find_mount_point(&file).unwrap(); output_type = OutputType::Str; } // file name 'n' => { - arg = file.to_owned(); + arg = display_name.to_string(); output_type = OutputType::Str; } // quoted file name with dereference if symbolic link 'N' => { if file_type.is_symlink() { - let dst = match fs::read_link(file) { + let dst = match fs::read_link(&file) { Ok(path) => path, Err(e) => { println!("{}", e); return 1; } }; - arg = format!("{} -> {}", file.quote(), dst.quote()); + arg = format!( + "{} -> {}", + display_name.quote(), + dst.quote() + ); } else { - arg = file.to_string(); + arg = display_name.to_string(); } output_type = OutputType::Str; } @@ -771,12 +781,16 @@ impl Stater { } } Err(e) => { - show_error!("cannot stat {}: {}", file.quote(), e); + show_error!("cannot stat {}: {}", display_name.quote(), e); return 1; } } } else { - match statfs(file) { + #[cfg(unix)] + let p = file.as_bytes(); + #[cfg(not(unix))] + let p = file.into_string().unwrap(); + match statfs(p) { Ok(meta) => { let tokens = &self.default_tokens; @@ -829,7 +843,7 @@ impl Stater { } // file name 'n' => { - arg = file.to_owned(); + arg = display_name.to_string(); output_type = OutputType::Str; } // block size (for faster transfers) @@ -866,7 +880,7 @@ impl Stater { Err(e) => { show_error!( "cannot read file system information for {}: {}", - file.quote(), + display_name.quote(), e ); return 1; @@ -1028,6 +1042,7 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(ARG_FILES) .multiple_occurrences(true) .takes_value(true) + .allow_invalid_utf8(true) .min_values(1), ) } diff --git a/src/uucore/src/lib/features/fsext.rs b/src/uucore/src/lib/features/fsext.rs index eeaf5406137..511c1dd2c19 100644 --- a/src/uucore/src/lib/features/fsext.rs +++ b/src/uucore/src/lib/features/fsext.rs @@ -84,6 +84,7 @@ use std::ffi::CString; use std::io::Error as IOError; #[cfg(unix)] use std::mem; +#[cfg(not(unix))] use std::path::Path; use std::time::UNIX_EPOCH; @@ -708,9 +709,9 @@ impl FsMeta for StatFs { } #[cfg(unix)] -pub fn statfs>(path: P) -> Result +pub fn statfs

(path: P) -> Result where - Vec: From

, + P: Into>, { match CString::new(path) { Ok(p) => { diff --git a/tests/by-util/test_stat.rs b/tests/by-util/test_stat.rs index 53e83bef67b..c3ffb3be583 100644 --- a/tests/by-util/test_stat.rs +++ b/tests/by-util/test_stat.rs @@ -312,9 +312,21 @@ fn test_printf() { ts.ucmd().args(&args).succeeds().stdout_is(expected_stdout); } +#[test] #[cfg(unix)] +fn test_pipe_fifo() { + let (at, mut ucmd) = at_and_ucmd!(); + at.mkfifo("FIFO"); + ucmd.arg("FIFO") + .run() + .no_stderr() + .stdout_contains("fifo") + .stdout_contains("File: FIFO") + .succeeded(); +} + #[test] -#[cfg(disable_until_fixed)] +#[cfg(target_os = "linux")] fn test_stdin_pipe_fifo1() { // $ echo | stat - // File: - @@ -328,17 +340,26 @@ fn test_stdin_pipe_fifo1() { .stdout_contains("fifo") .stdout_contains("File: -") .succeeded(); + + new_ucmd!() + .args(&["-L", "-"]) + .set_stdin(std::process::Stdio::piped()) + .run() + .no_stderr() + .stdout_contains("fifo") + .stdout_contains("File: -") + .succeeded(); } -#[cfg(unix)] #[test] -#[cfg(disable_until_fixed)] +#[cfg(target_os = "linux")] fn test_stdin_pipe_fifo2() { // $ stat - // File: - // Size: 0 Blocks: 0 IO Block: 1024 character special file new_ucmd!() .arg("-") + .set_stdin(std::process::Stdio::null()) .run() .no_stderr() .stdout_contains("character special file") @@ -346,9 +367,8 @@ fn test_stdin_pipe_fifo2() { .succeeded(); } -#[cfg(unix)] #[test] -#[cfg(disable_until_fixed)] +#[cfg(target_os = "linux")] fn test_stdin_redirect() { // $ touch f && stat - < f // File: - @@ -359,7 +379,7 @@ fn test_stdin_redirect() { at.touch("f"); new_ucmd!() .arg("-") - .set_stdin(std::fs::File::open("f").unwrap()) + .set_stdin(std::fs::File::open(at.plus("f")).unwrap()) .run() .no_stderr() .stdout_contains("regular empty file") From f668b69a2caa4e257128442a9ee6fae082ba768f Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Thu, 5 May 2022 10:53:40 +0200 Subject: [PATCH 188/242] df: use blocksize of 512 if POSIXLY_CORRECT is set --- src/uu/df/src/blocks.rs | 19 +++++++++++++++++-- src/uu/df/src/df.rs | 8 ++++++++ tests/by-util/test_df.rs | 20 ++++++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/uu/df/src/blocks.rs b/src/uu/df/src/blocks.rs index e964a208ac9..bb6e06333ea 100644 --- a/src/uu/df/src/blocks.rs +++ b/src/uu/df/src/blocks.rs @@ -5,7 +5,7 @@ //! Types for representing and displaying block sizes. use crate::OPT_BLOCKSIZE; use clap::ArgMatches; -use std::fmt; +use std::{env, fmt}; use uucore::parse_size::{parse_size, ParseSizeError}; @@ -159,6 +159,7 @@ pub(crate) enum HumanReadable { /// size. /// /// The default variant is `Bytes(1024)`. +#[derive(Debug, PartialEq)] pub(crate) enum BlockSize { /// A fixed number of bytes. /// @@ -168,7 +169,11 @@ pub(crate) enum BlockSize { impl Default for BlockSize { fn default() -> Self { - Self::Bytes(1024) + if env::var("POSIXLY_CORRECT").is_ok() { + Self::Bytes(512) + } else { + Self::Bytes(1024) + } } } @@ -195,6 +200,8 @@ impl fmt::Display for BlockSize { #[cfg(test)] mod tests { + use std::env; + use crate::blocks::{to_magnitude_and_suffix, BlockSize}; #[test] @@ -252,4 +259,12 @@ mod tests { assert_eq!(format!("{}", BlockSize::Bytes(2 * 1024)), "2K"); assert_eq!(format!("{}", BlockSize::Bytes(3 * 1024 * 1024)), "3M"); } + + #[test] + fn test_default_block_size() { + assert_eq!(BlockSize::Bytes(1024), BlockSize::default()); + env::set_var("POSIXLY_CORRECT", "1"); + assert_eq!(BlockSize::Bytes(512), BlockSize::default()); + env::remove_var("POSIXLY_CORRECT"); + } } diff --git a/src/uu/df/src/df.rs b/src/uu/df/src/df.rs index d9fb1be7bb8..192cbcadf5c 100644 --- a/src/uu/df/src/df.rs +++ b/src/uu/df/src/df.rs @@ -32,6 +32,13 @@ use crate::table::Table; static ABOUT: &str = "Show information about the file system on which each FILE resides,\n\ or all file systems by default."; const USAGE: &str = "{} [OPTION]... [FILE]..."; +const LONG_HELP: &str = "Display values are in units of the first available SIZE from --block-size, +and the DF_BLOCK_SIZE, BLOCK_SIZE and BLOCKSIZE environment variables. +Otherwise, units default to 1024 bytes (or 512 if POSIXLY_CORRECT is set). + +SIZE is an integer and optional unit (example: 10M is 10*1024*1024). +Units are K, M, G, T, P, E, Z, Y (powers of 1024) or KB, MB,... (powers +of 1000)."; static OPT_HELP: &str = "help"; static OPT_ALL: &str = "all"; @@ -427,6 +434,7 @@ pub fn uu_app<'a>() -> Command<'a> { .version(crate_version!()) .about(ABOUT) .override_usage(format_usage(USAGE)) + .after_help(LONG_HELP) .infer_long_args(true) .arg( Arg::new(OPT_HELP) diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index 511956ec41d..81a9eef720a 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -375,6 +375,26 @@ fn test_iuse_percentage() { } } +#[test] +fn test_default_block_size() { + let output = new_ucmd!() + .arg("--output=size") + .succeeds() + .stdout_move_str(); + let header = output.lines().next().unwrap().to_string(); + + assert_eq!(header, "1K-blocks"); + + let output = new_ucmd!() + .arg("--output=size") + .env("POSIXLY_CORRECT", "1") + .succeeds() + .stdout_move_str(); + let header = output.lines().next().unwrap().to_string(); + + assert_eq!(header, "512B-blocks"); +} + #[test] fn test_block_size_1024() { fn get_header(block_size: u64) -> String { From 087d4b14fc205107d557d3300b63d29849888642 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sun, 8 May 2022 21:27:08 +0200 Subject: [PATCH 189/242] Do not use the Rust/touch for tests/ls/abmon-align.sh --- util/build-gnu.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/util/build-gnu.sh b/util/build-gnu.sh index 83993fde93a..942aa9d879f 100755 --- a/util/build-gnu.sh +++ b/util/build-gnu.sh @@ -137,7 +137,8 @@ sed -i 's|chmod |/usr/bin/chmod |' tests/du/inacc-dir.sh tests/tail-2/tail-n0f.s sed -i 's|sort |/usr/bin/sort |' tests/ls/hyperlink.sh tests/misc/test-N.sh sed -i 's|split |/usr/bin/split |' tests/misc/factor-parallel.sh sed -i 's|id -|/usr/bin/id -|' tests/misc/runcon-no-reorder.sh -sed -i 's|touch |/usr/bin/touch |' tests/cp/preserve-link.sh tests/cp/reflink-perm.sh tests/ls/block-size.sh tests/mv/update.sh tests/misc/ls-time.sh tests/misc/stat-nanoseconds.sh tests/misc/time-style.sh tests/misc/test-N.sh +# tests/ls/abmon-align.sh - https://github.com/uutils/coreutils/issues/3505 +sed -i 's|touch |/usr/bin/touch |' tests/cp/preserve-link.sh tests/cp/reflink-perm.sh tests/ls/block-size.sh tests/mv/update.sh tests/misc/ls-time.sh tests/misc/stat-nanoseconds.sh tests/misc/time-style.sh tests/misc/test-N.sh tests/ls/abmon-align.sh sed -i 's|ln -|/usr/bin/ln -|' tests/cp/link-deref.sh sed -i 's|cp |/usr/bin/cp |' tests/mv/hard-2.sh sed -i 's|paste |/usr/bin/paste |' tests/misc/od-endian.sh From d5569847bd682f0df1eab95316fa9c81afe83676 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sun, 8 May 2022 21:31:42 +0200 Subject: [PATCH 190/242] also support for tests/touch/no-rights.sh format --- src/uu/touch/src/touch.rs | 15 ++++++++++++++- tests/by-util/test_touch.rs | 19 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/uu/touch/src/touch.rs b/src/uu/touch/src/touch.rs index c082aed23cb..5444c8c1021 100644 --- a/src/uu/touch/src/touch.rs +++ b/src/uu/touch/src/touch.rs @@ -280,12 +280,20 @@ const YYYYMMDDHHMMSS_FORMAT: &[time::format_description::FormatItem] = format_de "[year repr:full]-[month repr:numerical padding:zero]-\ [day] [hour]:[minute]:[second].[subsecond]" ); + // "%Y-%m-%d %H:%M:%S" 12 chars const YYYYMMDDHHMMS_FORMAT: &[time::format_description::FormatItem] = format_description!( "[year repr:full]-[month repr:numerical padding:zero]-\ [day] [hour]:[minute]:[second]" ); +// "%Y-%m-%d %H:%M" 12 chars +// Used for example in tests/touch/no-rights.sh +const YYYY_MM_DD_HH_MM_FORMAT: &[time::format_description::FormatItem] = format_description!( + "[year repr:full]-[month repr:numerical padding:zero]-\ + [day] [hour]:[minute]" +); + // "%Y%m%d%H%M" 12 chars const YYYYMMDDHHMM_FORMAT: &[time::format_description::FormatItem] = format_description!( "[year repr:full][month repr:numerical padding:zero]\ @@ -325,7 +333,12 @@ fn parse_date(s: &str) -> UResult { // Also support other formats found in the GNU tests like // in tests/misc/stat-nanoseconds.sh - for fmt in [YYYYMMDDHHMMS_FORMAT, YYYYMMDDHHMMSS_FORMAT] { + // or tests/touch/no-rights.sh + for fmt in [ + YYYYMMDDHHMMS_FORMAT, + YYYYMMDDHHMMSS_FORMAT, + YYYY_MM_DD_HH_MM_FORMAT, + ] { if let Ok(parsed) = time::PrimitiveDateTime::parse(s, &fmt) { return Ok(dt_to_filename(parsed)); } diff --git a/tests/by-util/test_touch.rs b/tests/by-util/test_touch.rs index 9b8eebbf046..5417a0dbe29 100644 --- a/tests/by-util/test_touch.rs +++ b/tests/by-util/test_touch.rs @@ -469,6 +469,25 @@ fn test_touch_set_date5() { assert_eq!(mtime, expected); } +#[test] +fn test_touch_set_date6() { + let (at, mut ucmd) = at_and_ucmd!(); + let file = "test_touch_set_date"; + + ucmd.args(&["-d", "2000-01-01 00:00", file]) + .succeeds() + .no_stderr(); + + assert!(at.file_exists(file)); + + let expected = FileTime::from_unix_time(946684800, 0); + + let (atime, mtime) = get_file_times(&at, file); + assert_eq!(atime, mtime); + assert_eq!(atime, expected); + assert_eq!(mtime, expected); +} + #[test] fn test_touch_set_date_wrong_format() { let (_at, mut ucmd) = at_and_ucmd!(); From f65d72e334f73aedb38c6e149480733f433f0e8a Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sun, 8 May 2022 21:52:12 +0200 Subject: [PATCH 191/242] also support for tests/touch/relative.sh --- src/uu/touch/src/touch.rs | 8 ++++++++ tests/by-util/test_touch.rs | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/uu/touch/src/touch.rs b/src/uu/touch/src/touch.rs index 5444c8c1021..f71eb81d01b 100644 --- a/src/uu/touch/src/touch.rs +++ b/src/uu/touch/src/touch.rs @@ -312,6 +312,13 @@ const YYMMDDHHMM_FORMAT: &[time::format_description::FormatItem] = format_descri [hour repr:24 padding:zero][minute padding:zero]" ); +// "%Y-%m-%d %H:%M +offset" +// Used for example in tests/touch/relative.sh +const YYYYMMDDHHMM_OFFSET_FORMAT: &[time::format_description::FormatItem] = format_description!( + "[year]-[month]-[day] [hour repr:24]:[minute] \ + [offset_hour sign:mandatory][offset_minute]" +); + fn parse_date(s: &str) -> UResult { // This isn't actually compatible with GNU touch, but there doesn't seem to // be any simple specification for what format this parameter allows and I'm @@ -338,6 +345,7 @@ fn parse_date(s: &str) -> UResult { YYYYMMDDHHMMS_FORMAT, YYYYMMDDHHMMSS_FORMAT, YYYY_MM_DD_HH_MM_FORMAT, + YYYYMMDDHHMM_OFFSET_FORMAT, ] { if let Ok(parsed) = time::PrimitiveDateTime::parse(s, &fmt) { return Ok(dt_to_filename(parsed)); diff --git a/tests/by-util/test_touch.rs b/tests/by-util/test_touch.rs index 5417a0dbe29..346e279198a 100644 --- a/tests/by-util/test_touch.rs +++ b/tests/by-util/test_touch.rs @@ -488,6 +488,25 @@ fn test_touch_set_date6() { assert_eq!(mtime, expected); } +#[test] +fn test_touch_set_date7() { + let (at, mut ucmd) = at_and_ucmd!(); + let file = "test_touch_set_date"; + + ucmd.args(&["-d", "2004-01-16 12:00 +0000", file]) + .succeeds() + .no_stderr(); + + assert!(at.file_exists(file)); + + let expected = FileTime::from_unix_time(1074254400, 0); + + let (atime, mtime) = get_file_times(&at, file); + assert_eq!(atime, mtime); + assert_eq!(atime, expected); + assert_eq!(mtime, expected); +} + #[test] fn test_touch_set_date_wrong_format() { let (_at, mut ucmd) = at_and_ucmd!(); From ece9ccdbfb48fe2cc1e3de8c13be159ad7fda839 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Tue, 10 May 2022 13:49:29 +0200 Subject: [PATCH 192/242] Add missing \# interpreter line --- util/android-commands.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/util/android-commands.sh b/util/android-commands.sh index 2a4fca41672..0a245a0041d 100755 --- a/util/android-commands.sh +++ b/util/android-commands.sh @@ -1,3 +1,4 @@ +#!/bin/bash # spell-checker:ignore termux keyevent sdcard binutils unmatch adb's dumpsys logcat pkill # There are three shells: the host's, adb, and termux. Only adb lets us run From 7d8b1de213602e2476b5bf013bd871dc05d01071 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Tue, 10 May 2022 13:54:16 +0200 Subject: [PATCH 193/242] uniq: Disable one of the gnu test for failing too often See: https://github.com/uutils/coreutils/issues/3509 --- tests/by-util/test_uniq.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/by-util/test_uniq.rs b/tests/by-util/test_uniq.rs index b3f5fcd68fe..77ad10b3237 100644 --- a/tests/by-util/test_uniq.rs +++ b/tests/by-util/test_uniq.rs @@ -680,6 +680,9 @@ fn gnu_tests() { stderr: None, exit: None, }, + /* + Disable as it fails too often. See: + https://github.com/uutils/coreutils/issues/3509 TestCase { name: "112", args: &["-D", "-c"], @@ -687,7 +690,7 @@ fn gnu_tests() { stdout: Some(""), stderr: Some("uniq: printing all duplicated lines and repeat counts is meaningless"), exit: Some(1), - }, + },*/ TestCase { name: "113", args: &["--all-repeated=separate"], From 12d7d9846abc825e95e95b00d2ce00e50b22068b Mon Sep 17 00:00:00 2001 From: Jan Scheer Date: Tue, 10 May 2022 13:46:22 +0200 Subject: [PATCH 194/242] test/util: improve `run_ucmd_as_root` for CICD * ensure that `fn run_no_wait` is only invoked if the system running the test has `sudo` in $path Previously, if run inside CICD, calling `fn run_ucmd_as_root` would provoke `fn run_no_wait` to panic because there's no `sudo`. --- tests/common/util.rs | 87 +++++++++++++++++++++++++++----------------- 1 file changed, 53 insertions(+), 34 deletions(-) diff --git a/tests/common/util.rs b/tests/common/util.rs index 34bdc72f3bf..d601b90d841 100644 --- a/tests/common/util.rs +++ b/tests/common/util.rs @@ -1370,6 +1370,8 @@ pub fn expected_result(ts: &TestScenario, args: &[&str]) -> std::result::Result< /// To check if i) non-interactive sudo is possible and ii) if sudo works, this runs: /// 'sudo -E --non-interactive whoami' first. /// +/// This return an `Err()` if run inside CICD because there's no 'sudo'. +/// /// Example: /// /// ```no_run @@ -1381,7 +1383,7 @@ pub fn expected_result(ts: &TestScenario, args: &[&str]) -> std::result::Result< /// if let Ok(result) = run_ucmd_as_root(&ts, &[]) { /// result.stdout_is(expected); /// } else { -/// print!("TEST SKIPPED"); +/// println!("TEST SKIPPED"); /// } /// } ///``` @@ -1390,29 +1392,37 @@ pub fn run_ucmd_as_root( ts: &TestScenario, args: &[&str], ) -> std::result::Result { - // Apparently CICD environment has no `sudo`? - if ts - .cmd_keepenv("sudo") - .env("LC_ALL", "C") - .arg("-E") - .arg("--non-interactive") - .arg("whoami") - .run() - .stdout_str() - .trim() - != "root" - { - Err("\"sudo whoami\" didn't return \"root\"".to_string()) - } else { - Ok(ts - .cmd_keepenv("sudo") + if !is_ci() { + // check if we can run 'sudo' + log_info("run", "sudo -E --non-interactive whoami"); + match Command::new("sudo") .env("LC_ALL", "C") - .arg("-E") - .arg("--non-interactive") - .arg(&ts.bin_path) - .arg(&ts.util_name) - .args(args) - .run()) + .args(&["-E", "--non-interactive", "whoami"]) + .output() + { + Ok(output) if String::from_utf8_lossy(&output.stdout).eq("root\n") => { + // we can run sudo and we're root + // run ucmd as root: + Ok(ts + .cmd_keepenv("sudo") + .env("LC_ALL", "C") + .arg("-E") + .arg("--non-interactive") + .arg(&ts.bin_path) + .arg(&ts.util_name) + .args(args) + .run()) + } + Ok(output) + if String::from_utf8_lossy(&output.stderr).eq("sudo: a password is required\n") => + { + Err("Cannot run non-interactive sudo".to_string()) + } + Ok(_output) => Err("\"sudo whoami\" didn't return \"root\"".to_string()), + Err(e) => Err(format!("{}: {}", UUTILS_WARNING, e)), + } + } else { + Err(format!("{}: {}", UUTILS_INFO, "cannot run inside CI")) } } @@ -1771,18 +1781,27 @@ mod tests { #[cfg(unix)] #[cfg(feature = "whoami")] fn test_run_ucmd_as_root() { - // Skip test if we can't guarantee non-interactive `sudo`. - if let Ok(_status) = Command::new("sudo") - .args(&["-E", "-v", "--non-interactive"]) - .status() - { - let ts = TestScenario::new("whoami"); - std::assert_eq!( - run_ucmd_as_root(&ts, &[]).unwrap().stdout_str().trim(), - "root" - ); + if !is_ci() { + // Skip test if we can't guarantee non-interactive `sudo`, or if we're not "root" + if let Ok(output) = Command::new("sudo") + .env("LC_ALL", "C") + .args(&["-E", "--non-interactive", "whoami"]) + .output() + { + if output.status.success() && String::from_utf8_lossy(&output.stdout).eq("root\n") { + let ts = TestScenario::new("whoami"); + std::assert_eq!( + run_ucmd_as_root(&ts, &[]).unwrap().stdout_str().trim(), + "root" + ); + } else { + println!("TEST SKIPPED (we're not root)"); + } + } else { + println!("TEST SKIPPED (cannot run sudo)"); + } } else { - print!("TEST SKIPPED"); + println!("TEST SKIPPED (cannot run inside CI)"); } } } From eeec680c37bbc842723d59c2a7cc3c4b865e3225 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 May 2022 06:38:03 +0000 Subject: [PATCH 195/242] build(deps): bump codecov/codecov-action from 1 to 3 Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 1 to 3. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/master/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v1...v3) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/CICD.yml | 2 +- .github/workflows/GnuTests.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml index 04acd4c1825..ebe82e47aae 100644 --- a/.github/workflows/CICD.yml +++ b/.github/workflows/CICD.yml @@ -1100,7 +1100,7 @@ jobs: grcov . --output-type lcov --output-path "${COVERAGE_REPORT_FILE}" --branch --ignore build.rs --ignore "vendor/*" --ignore "/*" --ignore "[a-zA-Z]:/*" --excl-br-line "^\s*((debug_)?assert(_eq|_ne)?!|#\[derive\()" echo ::set-output name=report::${COVERAGE_REPORT_FILE} - name: Upload coverage results (to Codecov.io) - uses: codecov/codecov-action@v1 + uses: codecov/codecov-action@v3 # if: steps.vars.outputs.HAS_CODECOV_TOKEN with: # token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/GnuTests.yml b/.github/workflows/GnuTests.yml index c8d3c8b9472..75cb60d8967 100644 --- a/.github/workflows/GnuTests.yml +++ b/.github/workflows/GnuTests.yml @@ -293,7 +293,7 @@ jobs: grcov . --output-type lcov --output-path "${COVERAGE_REPORT_FILE}" --branch --ignore build.rs --ignore "vendor/*" --ignore "/*" --ignore "[a-zA-Z]:/*" --excl-br-line "^\s*((debug_)?assert(_eq|_ne)?!|#\[derive\()" echo ::set-output name=report::${COVERAGE_REPORT_FILE} - name: Upload coverage results (to Codecov.io) - uses: codecov/codecov-action@v2 + uses: codecov/codecov-action@v3 with: file: ${{ steps.coverage.outputs.report }} flags: gnutests From 376f6a158b17fdf4b469903877957f8d162d0fc5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 May 2022 06:38:05 +0000 Subject: [PATCH 196/242] build(deps): bump EndBug/add-and-commit from 7 to 9 Bumps [EndBug/add-and-commit](https://github.com/EndBug/add-and-commit) from 7 to 9. - [Release notes](https://github.com/EndBug/add-and-commit/releases) - [Changelog](https://github.com/EndBug/add-and-commit/blob/main/CHANGELOG.md) - [Commits](https://github.com/EndBug/add-and-commit/compare/v7...v9) --- updated-dependencies: - dependency-name: EndBug/add-and-commit dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/FixPR.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/FixPR.yml b/.github/workflows/FixPR.yml index 2a5382e2742..00e0a608da2 100644 --- a/.github/workflows/FixPR.yml +++ b/.github/workflows/FixPR.yml @@ -80,7 +80,7 @@ jobs: ## * using the 'stable' toolchain is necessary to avoid "unexpected '--filter-platform'" errors RUSTUP_TOOLCHAIN=stable cargo-tree tree --locked --all --no-dev-dependencies --no-indent --features ${{ matrix.job.features }} | grep -vE "$PWD" | sort --unique - name: Commit any changes (to '${{ env.BRANCH_TARGET }}') - uses: EndBug/add-and-commit@v7 + uses: EndBug/add-and-commit@v9 with: branch: ${{ env.BRANCH_TARGET }} default_author: github_actions @@ -130,7 +130,7 @@ jobs: # `cargo fmt` of tests find tests -name "*.rs" -print0 | xargs -0 cargo fmt -- - name: Commit any changes (to '${{ env.BRANCH_TARGET }}') - uses: EndBug/add-and-commit@v7 + uses: EndBug/add-and-commit@v9 with: branch: ${{ env.BRANCH_TARGET }} default_author: github_actions From 372d460d7a24c3bccad817a9ba9ff9eac71b6f53 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 May 2022 06:38:08 +0000 Subject: [PATCH 197/242] build(deps): bump actions/cache from 2 to 3 Bumps [actions/cache](https://github.com/actions/cache) from 2 to 3. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/CICD.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml index 04acd4c1825..5d49ed363bd 100644 --- a/.github/workflows/CICD.yml +++ b/.github/workflows/CICD.yml @@ -859,7 +859,7 @@ jobs: steps: - uses: actions/checkout@v2 - name: AVD cache - uses: actions/cache@v2 + uses: actions/cache@v3 id: avd-cache with: path: | From fd057574d7fbd8381f9f63c2f9c939f7055c9e6f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 May 2022 06:38:11 +0000 Subject: [PATCH 198/242] build(deps): bump actions/checkout from 2 to 3 Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/CICD.yml | 34 +++++++++++++++++----------------- .github/workflows/FixPR.yml | 4 ++-- .github/workflows/GnuTests.yml | 8 ++++---- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml index 04acd4c1825..c6b7f10a80f 100644 --- a/.github/workflows/CICD.yml +++ b/.github/workflows/CICD.yml @@ -24,7 +24,7 @@ jobs: name: Style/cargo-deny runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: EmbarkStudios/cargo-deny-action@v1 style_deps: @@ -43,7 +43,7 @@ jobs: - { os: macos-latest , features: "feat_Tier1,feat_require_unix,feat_require_unix_utmpx" } - { os: windows-latest , features: feat_os_windows } steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v1 - name: Initialize workflow variables id: vars @@ -101,7 +101,7 @@ jobs: job: - { os: ubuntu-latest , features: feat_os_unix } steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v1 - name: Initialize workflow variables id: vars @@ -165,7 +165,7 @@ jobs: - { os: macos-latest , features: feat_os_macos } - { os: windows-latest , features: feat_os_windows } steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v1 - name: Initialize workflow variables id: vars @@ -223,7 +223,7 @@ jobs: job: - { os: ubuntu-latest , features: feat_os_unix } steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v1 - name: Initialize workflow variables id: vars @@ -275,7 +275,7 @@ jobs: # - { os: macos-latest , features: feat_os_macos } # - { os: windows-latest , features: feat_os_windows } steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v1 - name: Initialize workflow variables id: vars @@ -320,7 +320,7 @@ jobs: job: - { os: ubuntu-latest , features: feat_os_unix } steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v1 - name: Initialize workflow variables id: vars @@ -397,7 +397,7 @@ jobs: job: - { os: ubuntu-latest , features: feat_os_unix } steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v1 - name: Install `rust` toolchain uses: actions-rs/toolchain@v1 @@ -422,7 +422,7 @@ jobs: job: - { os: ubuntu-latest , features: feat_os_unix } steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v1 - name: Install `rust` toolchain uses: actions-rs/toolchain@v1 @@ -452,7 +452,7 @@ jobs: - { os: macos-latest , features: feat_os_macos } - { os: windows-latest , features: feat_os_windows } steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v1 - name: Install `rust` toolchain uses: actions-rs/toolchain@v1 @@ -478,7 +478,7 @@ jobs: - { os: macos-latest , features: feat_os_macos } - { os: windows-latest , features: feat_os_windows } steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v1 - name: Install `rust` toolchain uses: actions-rs/toolchain@v1 @@ -502,7 +502,7 @@ jobs: job: - { os: ubuntu-latest , features: feat_os_unix } steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v1 - name: Install dependencies shell: bash @@ -568,7 +568,7 @@ jobs: - { os: windows-latest , target: x86_64-pc-windows-gnu , features: feat_os_windows } ## note: requires rust >= 1.43.0 to link correctly - { os: windows-latest , target: x86_64-pc-windows-msvc , features: feat_os_windows } steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v1 - name: Initialize workflow variables id: vars @@ -820,7 +820,7 @@ jobs: job: - { os: ubuntu-latest } steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v1 - name: Install/setup prerequisites shell: bash @@ -857,7 +857,7 @@ jobs: env: TERMUX: v0.118.0 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: AVD cache uses: actions/cache@v2 id: avd-cache @@ -911,7 +911,7 @@ jobs: env: mem: 2048 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v1 - name: Prepare, build and test ## spell-checker:ignore (ToDO) sshfs usesh vmactions @@ -979,7 +979,7 @@ jobs: - { os: macos-latest , features: macos } - { os: windows-latest , features: windows } steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v1 # - name: Reattach HEAD ## may be needed for accurate code coverage info # run: git checkout ${{ github.head_ref }} diff --git a/.github/workflows/FixPR.yml b/.github/workflows/FixPR.yml index 2a5382e2742..67e914746ea 100644 --- a/.github/workflows/FixPR.yml +++ b/.github/workflows/FixPR.yml @@ -28,7 +28,7 @@ jobs: job: - { os: ubuntu-latest , features: feat_os_unix } steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v1 - name: Initialize job variables id: vars @@ -100,7 +100,7 @@ jobs: job: - { os: ubuntu-latest , features: feat_os_unix } steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v1 - name: Initialize job variables id: vars diff --git a/.github/workflows/GnuTests.yml b/.github/workflows/GnuTests.yml index c8d3c8b9472..ef919dde9d6 100644 --- a/.github/workflows/GnuTests.yml +++ b/.github/workflows/GnuTests.yml @@ -41,11 +41,11 @@ jobs: TEST_FULL_SUMMARY_FILE='gnu-full-result.json' outputs SUITE_LOG_FILE TEST_FILESET_PREFIX TEST_FILESET_SUFFIX TEST_LOGS_GLOB TEST_SUMMARY_FILE TEST_FULL_SUMMARY_FILE - name: Checkout code (uutil) - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: '${{ steps.vars.outputs.path_UUTILS }}' - name: Checkout code (GNU coreutils) - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: repository: 'coreutils/coreutils' path: '${{ steps.vars.outputs.path_GNU }}' @@ -229,11 +229,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code uutil - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: 'uutils' - name: Checkout GNU coreutils - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: repository: 'coreutils/coreutils' path: 'gnu' From 28c6403ffa78d29ea75862f65ac03743d35ab4d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 May 2022 06:38:13 +0000 Subject: [PATCH 199/242] build(deps): bump actions/upload-artifact from 2 to 3 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 2 to 3. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/CICD.yml | 4 ++-- .github/workflows/GnuTests.yml | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml index 04acd4c1825..0e4a4807de6 100644 --- a/.github/workflows/CICD.yml +++ b/.github/workflows/CICD.yml @@ -534,7 +534,7 @@ jobs: --arg size "$SIZE" \ --arg multisize "$SIZEMULTI" \ '{($date): { sha: $sha, size: $size, multisize: $multisize, }}' > size-result.json - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: size-result path: size-result.json @@ -762,7 +762,7 @@ jobs: args: --target=${{ matrix.job.target }} ${{ steps.vars.outputs.CARGO_TEST_OPTIONS}} ${{ matrix.job.cargo-options }} ${{ steps.dep_vars.outputs.CARGO_UTILITY_LIST_OPTIONS }} toolchain: ${{ env.RUST_MIN_SRV }} - name: Archive executable artifacts - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: ${{ env.PROJECT_NAME }}-${{ matrix.job.target }} path: target/${{ matrix.job.target }}/release/${{ env.PROJECT_NAME }}${{ steps.vars.outputs.EXE_suffix }} diff --git a/.github/workflows/GnuTests.yml b/.github/workflows/GnuTests.yml index c8d3c8b9472..24b362a0485 100644 --- a/.github/workflows/GnuTests.yml +++ b/.github/workflows/GnuTests.yml @@ -146,22 +146,22 @@ jobs: # Compress logs before upload (fails otherwise) gzip ${{ steps.vars.outputs.TEST_LOGS_GLOB }} - name: Reserve SHA1/ID of 'test-summary' - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: "${{ steps.summary.outputs.HASH }}" path: "${{ steps.vars.outputs.TEST_SUMMARY_FILE }}" - name: Reserve test results summary - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: test-summary path: "${{ steps.vars.outputs.TEST_SUMMARY_FILE }}" - name: Reserve test logs - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: test-logs path: "${{ steps.vars.outputs.TEST_LOGS_GLOB }}" - name: Upload full json results - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: gnu-full-result.json path: ${{ steps.vars.outputs.TEST_FULL_SUMMARY_FILE }} From d906f09e6ed84c83360b26caff70b1e15cde9406 Mon Sep 17 00:00:00 2001 From: Jan Scheer Date: Fri, 6 May 2022 14:01:23 +0200 Subject: [PATCH 200/242] stat: improve handling of stdin/fifo (fix #3485) * fix https://github.com/uutils/coreutils/issues/3485 * improve the workaround from #3280 * add tests --- src/uu/stat/src/stat.rs | 79 +++++++++++++++++----------- src/uucore/src/lib/features/fsext.rs | 5 +- tests/by-util/test_stat.rs | 32 ++++++++--- 3 files changed, 76 insertions(+), 40 deletions(-) diff --git a/src/uu/stat/src/stat.rs b/src/uu/stat/src/stat.rs index cebc6c10823..41c9ae4a96e 100644 --- a/src/uu/stat/src/stat.rs +++ b/src/uu/stat/src/stat.rs @@ -19,7 +19,9 @@ use uucore::{entries, format_usage}; use clap::{crate_version, Arg, ArgMatches, Command}; use std::borrow::Cow; use std::convert::AsRef; +use std::ffi::{OsStr, OsString}; use std::os::unix::fs::{FileTypeExt, MetadataExt}; +use std::os::unix::prelude::OsStrExt; use std::path::Path; use std::{cmp, fs, iter}; @@ -221,7 +223,7 @@ pub struct Stater { follow: bool, show_fs: bool, from_user: bool, - files: Vec, + files: Vec, mount_list: Option>, default_tokens: Vec, default_dev_tokens: Vec, @@ -471,24 +473,10 @@ impl Stater { } fn new(matches: &ArgMatches) -> UResult { - let mut files: Vec = matches - .values_of(ARG_FILES) - .map(|v| v.map(ToString::to_string).collect()) + let files = matches + .values_of_os(ARG_FILES) + .map(|v| v.map(OsString::from).collect()) .unwrap_or_default(); - #[cfg(unix)] - if files.contains(&String::from("-")) { - let redirected_path = Path::new("/dev/stdin") - .canonicalize() - .expect("unable to canonicalize /dev/stdin") - .into_os_string() - .into_string() - .unwrap(); - for file in &mut files { - if file == "-" { - *file = redirected_path.clone(); - } - } - } let format_str = if matches.is_present(options::PRINTF) { matches .value_of(options::PRINTF) @@ -550,19 +538,37 @@ impl Stater { } fn exec(&self) -> i32 { + let mut stdin_is_fifo = false; + if cfg!(unix) { + if let Ok(md) = fs::metadata("/dev/stdin") { + stdin_is_fifo = md.file_type().is_fifo(); + } + } + let mut ret = 0; for f in &self.files { - ret |= self.do_stat(f.as_str()); + ret |= self.do_stat(f, stdin_is_fifo); } ret } - fn do_stat(&self, file: &str) -> i32 { + fn do_stat(&self, file: &OsStr, stdin_is_fifo: bool) -> i32 { + let display_name = file.to_string_lossy(); + let file: OsString = if cfg!(unix) && display_name.eq("-") { + if let Ok(p) = Path::new("/dev/stdin").canonicalize() { + p.into_os_string() + } else { + OsString::from("/dev/stdin") + } + } else { + OsString::from(file) + }; + if !self.show_fs { - let result = if self.follow { - fs::metadata(file) + let result = if self.follow || stdin_is_fifo && display_name.eq("-") { + fs::metadata(&file) } else { - fs::symlink_metadata(file) + fs::symlink_metadata(&file) }; match result { Ok(meta) => { @@ -658,28 +664,32 @@ impl Stater { // mount point 'm' => { - arg = self.find_mount_point(file).unwrap(); + arg = self.find_mount_point(&file).unwrap(); output_type = OutputType::Str; } // file name 'n' => { - arg = file.to_owned(); + arg = display_name.to_string(); output_type = OutputType::Str; } // quoted file name with dereference if symbolic link 'N' => { if file_type.is_symlink() { - let dst = match fs::read_link(file) { + let dst = match fs::read_link(&file) { Ok(path) => path, Err(e) => { println!("{}", e); return 1; } }; - arg = format!("{} -> {}", file.quote(), dst.quote()); + arg = format!( + "{} -> {}", + display_name.quote(), + dst.quote() + ); } else { - arg = file.to_string(); + arg = display_name.to_string(); } output_type = OutputType::Str; } @@ -771,12 +781,16 @@ impl Stater { } } Err(e) => { - show_error!("cannot stat {}: {}", file.quote(), e); + show_error!("cannot stat {}: {}", display_name.quote(), e); return 1; } } } else { - match statfs(file) { + #[cfg(unix)] + let p = file.as_bytes(); + #[cfg(not(unix))] + let p = file.into_string().unwrap(); + match statfs(p) { Ok(meta) => { let tokens = &self.default_tokens; @@ -829,7 +843,7 @@ impl Stater { } // file name 'n' => { - arg = file.to_owned(); + arg = display_name.to_string(); output_type = OutputType::Str; } // block size (for faster transfers) @@ -866,7 +880,7 @@ impl Stater { Err(e) => { show_error!( "cannot read file system information for {}: {}", - file.quote(), + display_name.quote(), e ); return 1; @@ -1028,6 +1042,7 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(ARG_FILES) .multiple_occurrences(true) .takes_value(true) + .allow_invalid_utf8(true) .min_values(1), ) } diff --git a/src/uucore/src/lib/features/fsext.rs b/src/uucore/src/lib/features/fsext.rs index 3d7ca1c1f56..787684e93dc 100644 --- a/src/uucore/src/lib/features/fsext.rs +++ b/src/uucore/src/lib/features/fsext.rs @@ -85,6 +85,7 @@ use std::ffi::CString; use std::io::Error as IOError; #[cfg(unix)] use std::mem; +#[cfg(not(unix))] use std::path::Path; use std::time::UNIX_EPOCH; @@ -709,9 +710,9 @@ impl FsMeta for StatFs { } #[cfg(unix)] -pub fn statfs>(path: P) -> Result +pub fn statfs

(path: P) -> Result where - Vec: From

, + P: Into>, { match CString::new(path) { Ok(p) => { diff --git a/tests/by-util/test_stat.rs b/tests/by-util/test_stat.rs index f1a68798138..14aba96fcc6 100644 --- a/tests/by-util/test_stat.rs +++ b/tests/by-util/test_stat.rs @@ -346,9 +346,21 @@ fn test_printf() { ts.ucmd().args(&args).succeeds().stdout_is(expected_stdout); } +#[test] #[cfg(unix)] +fn test_pipe_fifo() { + let (at, mut ucmd) = at_and_ucmd!(); + at.mkfifo("FIFO"); + ucmd.arg("FIFO") + .run() + .no_stderr() + .stdout_contains("fifo") + .stdout_contains("File: FIFO") + .succeeded(); +} + #[test] -#[cfg(disable_until_fixed)] +#[cfg(target_os = "linux")] fn test_stdin_pipe_fifo1() { // $ echo | stat - // File: - @@ -362,17 +374,26 @@ fn test_stdin_pipe_fifo1() { .stdout_contains("fifo") .stdout_contains("File: -") .succeeded(); + + new_ucmd!() + .args(&["-L", "-"]) + .set_stdin(std::process::Stdio::piped()) + .run() + .no_stderr() + .stdout_contains("fifo") + .stdout_contains("File: -") + .succeeded(); } -#[cfg(unix)] #[test] -#[cfg(disable_until_fixed)] +#[cfg(target_os = "linux")] fn test_stdin_pipe_fifo2() { // $ stat - // File: - // Size: 0 Blocks: 0 IO Block: 1024 character special file new_ucmd!() .arg("-") + .set_stdin(std::process::Stdio::null()) .run() .no_stderr() .stdout_contains("character special file") @@ -380,9 +401,8 @@ fn test_stdin_pipe_fifo2() { .succeeded(); } -#[cfg(unix)] #[test] -#[cfg(disable_until_fixed)] +#[cfg(target_os = "linux")] fn test_stdin_redirect() { // $ touch f && stat - < f // File: - @@ -393,7 +413,7 @@ fn test_stdin_redirect() { at.touch("f"); new_ucmd!() .arg("-") - .set_stdin(std::fs::File::open("f").unwrap()) + .set_stdin(std::fs::File::open(at.plus("f")).unwrap()) .run() .no_stderr() .stdout_contains("regular empty file") From e1d50dae87036186e9b4e1f21042218e2eb813eb Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Fri, 6 May 2022 13:58:05 +0200 Subject: [PATCH 201/242] kill: fix typo --- src/uu/kill/src/kill.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/uu/kill/src/kill.rs b/src/uu/kill/src/kill.rs index df868e41812..e77d0c6666f 100644 --- a/src/uu/kill/src/kill.rs +++ b/src/uu/kill/src/kill.rs @@ -22,7 +22,7 @@ static ABOUT: &str = "Send signal to processes or list information about signals const USAGE: &str = "{} [OPTIONS]... PID..."; pub mod options { - pub static PIDS_OR_SIGNALS: &str = "pids_of_signals"; + pub static PIDS_OR_SIGNALS: &str = "pids_or_signals"; pub static LIST: &str = "list"; pub static TABLE: &str = "table"; pub static TABLE_OLD: &str = "table_old"; @@ -109,7 +109,8 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new(options::PIDS_OR_SIGNALS) .hide(true) - .multiple_occurrences(true), + .multiple_occurrences(true) + .allow_hyphen_values(true) ) } From a7cf757127c38e9e8b4d9892419110f75c48d9da Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Fri, 6 May 2022 23:55:54 +0200 Subject: [PATCH 202/242] kill: kill process group with negative id --- Cargo.lock | 3 ++- src/uu/kill/Cargo.toml | 2 +- src/uu/kill/src/kill.rs | 29 +++++++++++++++++------------ 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1079f8a65e2..4c858b83f13 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1158,6 +1158,7 @@ dependencies = [ "bitflags", "cfg-if 1.0.0", "libc", + "memoffset", ] [[package]] @@ -2452,7 +2453,7 @@ name = "uu_kill" version = "0.0.13" dependencies = [ "clap 3.1.15", - "libc", + "nix", "uucore", ] diff --git a/src/uu/kill/Cargo.toml b/src/uu/kill/Cargo.toml index 24347a90af5..4ab76deea7b 100644 --- a/src/uu/kill/Cargo.toml +++ b/src/uu/kill/Cargo.toml @@ -16,7 +16,7 @@ path = "src/kill.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.125" +nix = { version = "0.24.1", features = ["signal"] } uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["signals"] } [[bin]] diff --git a/src/uu/kill/src/kill.rs b/src/uu/kill/src/kill.rs index e77d0c6666f..c966c7face2 100644 --- a/src/uu/kill/src/kill.rs +++ b/src/uu/kill/src/kill.rs @@ -5,16 +5,17 @@ // * For the full copyright and license information, please view the LICENSE file // * that was distributed with this source code. -// spell-checker:ignore (ToDO) signalname pids +// spell-checker:ignore (ToDO) signalname pids killpg #[macro_use] extern crate uucore; use clap::{crate_version, Arg, Command}; -use libc::{c_int, pid_t}; +use nix::sys::signal::{self, Signal}; +use nix::unistd::Pid; use std::io::Error; use uucore::display::Quotable; -use uucore::error::{UResult, USimpleError}; +use uucore::error::{FromIo, UError, UResult, USimpleError}; use uucore::signals::{signal_by_name_or_value, ALL_SIGNALS}; use uucore::{format_usage, InvalidEncodingHandling}; @@ -67,8 +68,12 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } else { 15_usize //SIGTERM }; + let sig: Signal = (sig as i32) + .try_into() + .map_err(|e| std::io::Error::from_raw_os_error(e as i32))?; let pids = parse_pids(&pids_or_signals)?; - kill(sig, &pids) + kill(sig, &pids); + Ok(()) } Mode::Table => { table(); @@ -84,6 +89,7 @@ pub fn uu_app<'a>() -> Command<'a> { .about(ABOUT) .override_usage(format_usage(USAGE)) .infer_long_args(true) + .allow_negative_numbers(true) .arg( Arg::new(options::LIST) .short('l') @@ -109,8 +115,7 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new(options::PIDS_OR_SIGNALS) .hide(true) - .multiple_occurrences(true) - .allow_hyphen_values(true) + .multiple_occurrences(true), ) } @@ -191,21 +196,21 @@ fn parse_signal_value(signal_name: &str) -> UResult { } } -fn parse_pids(pids: &[String]) -> UResult> { +fn parse_pids(pids: &[String]) -> UResult> { pids.iter() .map(|x| { - x.parse::().map_err(|e| { + x.parse::().map_err(|e| { USimpleError::new(1, format!("failed to parse argument {}: {}", x.quote(), e)) }) }) .collect() } -fn kill(signal_value: usize, pids: &[usize]) -> UResult<()> { +fn kill(sig: Signal, pids: &[i32]) { for &pid in pids { - if unsafe { libc::kill(pid as pid_t, signal_value as c_int) } != 0 { - show!(USimpleError::new(1, format!("{}", Error::last_os_error()))); + if let Err(e) = signal::kill(Pid::from_raw(pid), sig) { + show!(Error::from_raw_os_error(e as i32) + .map_err_context(|| format!("sending signal to {} failed", pid))); } } - Ok(()) } From 53c3efecd898d04623fb374ddfcdd19ac76197bd Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Sat, 7 May 2022 12:08:06 +0200 Subject: [PATCH 203/242] kill: remove table_old arg in favor of a short alias --- src/uu/kill/src/kill.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/uu/kill/src/kill.rs b/src/uu/kill/src/kill.rs index c966c7face2..5ae836818cd 100644 --- a/src/uu/kill/src/kill.rs +++ b/src/uu/kill/src/kill.rs @@ -26,7 +26,6 @@ pub mod options { pub static PIDS_OR_SIGNALS: &str = "pids_or_signals"; pub static LIST: &str = "list"; pub static TABLE: &str = "table"; - pub static TABLE_OLD: &str = "table_old"; pub static SIGNAL: &str = "signal"; } @@ -46,7 +45,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uu_app().get_matches_from(args); - let mode = if matches.is_present(options::TABLE) || matches.is_present(options::TABLE_OLD) { + let mode = if matches.is_present(options::TABLE) { Mode::Table } else if matches.is_present(options::LIST) { Mode::List @@ -95,16 +94,15 @@ pub fn uu_app<'a>() -> Command<'a> { .short('l') .long(options::LIST) .help("Lists signals") - .conflicts_with(options::TABLE) - .conflicts_with(options::TABLE_OLD), + .conflicts_with(options::TABLE), ) .arg( Arg::new(options::TABLE) .short('t') + .short_alias('L') .long(options::TABLE) .help("Lists table of signals"), ) - .arg(Arg::new(options::TABLE_OLD).short('L').hide(true)) .arg( Arg::new(options::SIGNAL) .short('s') From f9a5d758f0dfe86d2cbe10e50f7dce04fded3101 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 8 May 2022 21:16:35 +0000 Subject: [PATCH 204/242] build(deps): bump clap_complete from 3.1.3 to 3.1.4 Bumps [clap_complete](https://github.com/clap-rs/clap) from 3.1.3 to 3.1.4. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v3.1.3...clap_complete-v3.1.4) --- updated-dependencies: - dependency-name: clap_complete dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1079f8a65e2..608654e693f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -273,9 +273,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "3.1.3" +version = "3.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7ca9141e27e6ebc52e3c378b0c07f3cea52db46ed1cc5861735fb697b56356" +checksum = "da92e6facd8d73c22745a5d3cbb59bdf8e46e3235c923e516527d8e81eec14a4" dependencies = [ "clap 3.1.15", ] From b2eb4e83917e13511b070c4a7f2c494bf1224e2f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 8 May 2022 21:16:50 +0000 Subject: [PATCH 205/242] build(deps): bump unindent from 0.1.8 to 0.1.9 Bumps [unindent](https://github.com/dtolnay/indoc) from 0.1.8 to 0.1.9. - [Release notes](https://github.com/dtolnay/indoc/releases) - [Commits](https://github.com/dtolnay/indoc/compare/0.1.8...0.1.9) --- updated-dependencies: - dependency-name: unindent dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1079f8a65e2..d25d27e0d96 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2027,9 +2027,9 @@ checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" [[package]] name = "unindent" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514672a55d7380da379785a4d70ca8386c8883ff7eaae877be4d2081cebe73d8" +checksum = "52fee519a3e570f7df377a06a1a7775cdbfb7aa460be7e08de2b1f0e69973a44" [[package]] name = "unix_socket" From 2874f1895097f112daf6d40b999da434681590bd Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Thu, 5 May 2022 18:05:16 -0400 Subject: [PATCH 206/242] mktemp: error on path separator in template prefix Correct the error that arises from a path separator in the prefix portion of a template argument provided to `mktemp`. Before this commit, the error message was incorrect: $ mktemp -t a/bXXX mktemp: failed to create file via template 'a/bXXX': No such file or directory (os error 2) at path "/tmp/a/bege" After this commit, the error message is correct: $ mktemp -t a/bXXX mktemp: invalid template, 'a/bXXX', contains directory separator The code was failing to check for a path separator in the prefix portion of the template. --- src/uu/mktemp/src/mktemp.rs | 28 ++++++++++++++++++++-------- tests/by-util/test_mktemp.rs | 14 ++++++++++++++ 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/uu/mktemp/src/mktemp.rs b/src/uu/mktemp/src/mktemp.rs index b14318679fd..94def487456 100644 --- a/src/uu/mktemp/src/mktemp.rs +++ b/src/uu/mktemp/src/mktemp.rs @@ -41,7 +41,12 @@ enum MkTempError { PersistError(PathBuf), MustEndInX(String), TooFewXs(String), - ContainsDirSeparator(String), + + /// The template prefix contains a path separator (e.g. `"a/bXXX"`). + PrefixContainsDirSeparator(String), + + /// The template suffix contains a path separator (e.g. `"XXXa/b"`). + SuffixContainsDirSeparator(String), InvalidTemplate(String), } @@ -56,7 +61,14 @@ impl Display for MkTempError { PersistError(p) => write!(f, "could not persist file {}", p.quote()), MustEndInX(s) => write!(f, "with --suffix, template {} must end in X", s.quote()), TooFewXs(s) => write!(f, "too few X's in template {}", s.quote()), - ContainsDirSeparator(s) => { + PrefixContainsDirSeparator(s) => { + write!( + f, + "invalid template, {}, contains directory separator", + s.quote() + ) + } + SuffixContainsDirSeparator(s) => { write!( f, "invalid suffix {}, contains directory separator", @@ -252,8 +264,12 @@ fn parse_template<'a>( } }; + if prefix.chars().any(is_separator) { + return Err(MkTempError::PrefixContainsDirSeparator(temp.into())); + } + if suf.chars().any(is_separator) { - return Err(MkTempError::ContainsDirSeparator(suf.into())); + return Err(MkTempError::SuffixContainsDirSeparator(suf.into())); } Ok((prefix, rand, suf)) @@ -352,11 +368,7 @@ mod tests { #[test] fn test_parse_template_errors() { - // TODO This should be an error as well, but we are not - // catching it just yet. A future commit will correct this. - // - // assert!(parse_template("a/bXXX", None).is_err()); - // + assert!(parse_template("a/bXXX", None).is_err()); assert!(parse_template("XXXa/b", None).is_err()); assert!(parse_template("XX", None).is_err()); assert!(parse_template("XXXabc", Some("def")).is_err()); diff --git a/tests/by-util/test_mktemp.rs b/tests/by-util/test_mktemp.rs index c28efc37b10..9fce0e59135 100644 --- a/tests/by-util/test_mktemp.rs +++ b/tests/by-util/test_mktemp.rs @@ -2,6 +2,8 @@ use crate::common::util::*; +use uucore::display::Quotable; + use std::path::PathBuf; use tempfile::tempdir; @@ -482,3 +484,15 @@ fn test_respect_template_directory() { assert_matches_template!(template, filename); assert!(at.file_exists(filename)); } + +/// Test that a template with a path separator is invalid. +#[test] +fn test_template_path_separator() { + new_ucmd!() + .args(&["-t", "a/bXXX"]) + .fails() + .stderr_only(format!( + "mktemp: invalid template, {}, contains directory separator\n", + "a/bXXX".quote() + )); +} From e26fed61b34caec8a5e1325275e1e5a5bfa2152a Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Tue, 10 May 2022 07:34:01 +0200 Subject: [PATCH 207/242] df: implement POSIX conform header line It also fixes #3195 --- src/uu/df/src/blocks.rs | 9 +++++ src/uu/df/src/df.rs | 18 ++++++++++ src/uu/df/src/table.rs | 66 +++++++++++++++++++++++++++--------- tests/by-util/test_df.rs | 73 +++++++++++++++++++++++++++++++++++++--- 4 files changed, 147 insertions(+), 19 deletions(-) diff --git a/src/uu/df/src/blocks.rs b/src/uu/df/src/blocks.rs index bb6e06333ea..9a7e5c580cd 100644 --- a/src/uu/df/src/blocks.rs +++ b/src/uu/df/src/blocks.rs @@ -167,6 +167,15 @@ pub(crate) enum BlockSize { Bytes(u64), } +impl BlockSize { + /// Returns the associated value + pub(crate) fn as_u64(&self) -> u64 { + match *self { + Self::Bytes(n) => n, + } + } +} + impl Default for BlockSize { fn default() -> Self { if env::var("POSIXLY_CORRECT").is_ok() { diff --git a/src/uu/df/src/df.rs b/src/uu/df/src/df.rs index 192cbcadf5c..a11dcf7a0e3 100644 --- a/src/uu/df/src/df.rs +++ b/src/uu/df/src/df.rs @@ -12,6 +12,7 @@ mod filesystem; mod table; use blocks::{HumanReadable, SizeFormat}; +use table::HeaderMode; use uucore::display::Quotable; use uucore::error::{UError, UResult, USimpleError}; use uucore::fsext::{read_fs_list, MountInfo}; @@ -72,6 +73,7 @@ struct Options { show_all_fs: bool, size_format: SizeFormat, block_size: BlockSize, + header_mode: HeaderMode, /// Optional list of filesystem types to include in the output table. /// @@ -99,6 +101,7 @@ impl Default for Options { show_all_fs: Default::default(), block_size: Default::default(), size_format: Default::default(), + header_mode: Default::default(), include: Default::default(), exclude: Default::default(), show_total: Default::default(), @@ -176,6 +179,21 @@ impl Options { ), ParseSizeError::ParseFailure(s) => OptionsError::InvalidBlockSize(s), })?, + header_mode: { + if matches.is_present(OPT_HUMAN_READABLE_BINARY) + || matches.is_present(OPT_HUMAN_READABLE_DECIMAL) + { + HeaderMode::HumanReadable + } else if matches.is_present(OPT_PORTABILITY) { + HeaderMode::PosixPortability + // is_present() doesn't work here, it always returns true because OPT_OUTPUT has + // default values and hence is always present + } else if matches.occurrences_of(OPT_OUTPUT) > 0 { + HeaderMode::Output + } else { + HeaderMode::Default + } + }, size_format: { if matches.is_present(OPT_HUMAN_READABLE_BINARY) { SizeFormat::HumanReadable(HumanReadable::Binary) diff --git a/src/uu/df/src/table.rs b/src/uu/df/src/table.rs index 5309da38fe7..a9a37cfeb55 100644 --- a/src/uu/df/src/table.rs +++ b/src/uu/df/src/table.rs @@ -289,6 +289,23 @@ impl<'a> RowFormatter<'a> { } } +/// A HeaderMode defines what header labels should be shown. +pub(crate) enum HeaderMode { + Default, + // the user used -h or -H + HumanReadable, + // the user used -P + PosixPortability, + // the user used --output + Output, +} + +impl Default for HeaderMode { + fn default() -> Self { + Self::Default + } +} + /// The data of the header row. struct Header {} @@ -302,15 +319,22 @@ impl Header { for column in &options.columns { let header = match column { Column::Source => String::from("Filesystem"), - Column::Size => match options.size_format { - SizeFormat::HumanReadable(_) => String::from("Size"), - SizeFormat::StaticBlockSize => { - format!("{}-blocks", options.block_size) + Column::Size => match options.header_mode { + HeaderMode::HumanReadable => String::from("Size"), + HeaderMode::PosixPortability => { + format!("{}-blocks", options.block_size.as_u64()) } + _ => format!("{}-blocks", options.block_size), }, Column::Used => String::from("Used"), - Column::Avail => String::from("Available"), - Column::Pcent => String::from("Use%"), + Column::Avail => match options.header_mode { + HeaderMode::HumanReadable | HeaderMode::Output => String::from("Avail"), + _ => String::from("Available"), + }, + Column::Pcent => match options.header_mode { + HeaderMode::PosixPortability => String::from("Capacity"), + _ => String::from("Use%"), + }, Column::Target => String::from("Mounted on"), Column::Itotal => String::from("Inodes"), Column::Iused => String::from("IUsed"), @@ -428,7 +452,7 @@ mod tests { use crate::blocks::{HumanReadable, SizeFormat}; use crate::columns::Column; - use crate::table::{Header, Row, RowFormatter}; + use crate::table::{Header, HeaderMode, Row, RowFormatter}; use crate::{BlockSize, Options}; const COLUMNS_WITH_FS_TYPE: [Column; 7] = [ @@ -548,37 +572,49 @@ mod tests { } #[test] - fn test_header_with_human_readable_binary() { + fn test_human_readable_header() { let options = Options { - size_format: SizeFormat::HumanReadable(HumanReadable::Binary), + header_mode: HeaderMode::HumanReadable, + ..Default::default() + }; + assert_eq!( + Header::get_headers(&options), + vec!("Filesystem", "Size", "Used", "Avail", "Use%", "Mounted on") + ); + } + + #[test] + fn test_posix_portability_header() { + let options = Options { + header_mode: HeaderMode::PosixPortability, ..Default::default() }; assert_eq!( Header::get_headers(&options), vec!( "Filesystem", - "Size", + "1024-blocks", "Used", "Available", - "Use%", + "Capacity", "Mounted on" ) ); } #[test] - fn test_header_with_human_readable_si() { + fn test_output_header() { let options = Options { - size_format: SizeFormat::HumanReadable(HumanReadable::Decimal), + header_mode: HeaderMode::Output, ..Default::default() }; assert_eq!( Header::get_headers(&options), vec!( "Filesystem", - "Size", + "1K-blocks", "Used", - "Available", + "Avail", "Use%", "Mounted on" ) diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index 81a9eef720a..3c5bfdeea08 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -73,7 +73,7 @@ fn test_df_output() { "Filesystem", "Size", "Used", - "Available", + "Avail", "Capacity", "Use%", "Mounted", @@ -84,7 +84,7 @@ fn test_df_output() { "Filesystem", "Size", "Used", - "Available", + "Avail", "Use%", "Mounted", "on", @@ -107,7 +107,7 @@ fn test_df_output_overridden() { "Filesystem", "Size", "Used", - "Available", + "Avail", "Capacity", "Use%", "Mounted", @@ -118,7 +118,7 @@ fn test_df_output_overridden() { "Filesystem", "Size", "Used", - "Available", + "Avail", "Use%", "Mounted", "on", @@ -134,6 +134,46 @@ fn test_df_output_overridden() { assert_eq!(actual, expected); } +#[test] +fn test_default_headers() { + let expected = if cfg!(target_os = "macos") { + vec![ + "Filesystem", + "1K-blocks", + "Used", + "Available", + "Capacity", + "Use%", + "Mounted", + "on", + ] + } else { + vec![ + "Filesystem", + "1K-blocks", + "Used", + "Available", + "Use%", + "Mounted", + "on", + ] + }; + let output = new_ucmd!().succeeds().stdout_move_str(); + let actual = output.lines().take(1).collect::>()[0]; + let actual = actual.split_whitespace().collect::>(); + assert_eq!(actual, expected); +} + +#[test] +fn test_precedence_of_human_readable_header_over_output_header() { + let output = new_ucmd!() + .args(&["-H", "--output=size"]) + .succeeds() + .stdout_move_str(); + let header = output.lines().next().unwrap().to_string(); + assert_eq!(header.trim(), "Size"); +} + #[test] fn test_total_option_with_single_dash() { // These should fail because `-total` should have two dashes, @@ -443,6 +483,31 @@ fn test_block_size_with_suffix() { assert_eq!(get_header("1GB"), "1GB-blocks"); } +#[test] +fn test_block_size_in_posix_portability_mode() { + fn get_header(block_size: &str) -> String { + let output = new_ucmd!() + .args(&["-P", "-B", block_size]) + .succeeds() + .stdout_move_str(); + output + .lines() + .next() + .unwrap() + .to_string() + .split_whitespace() + .nth(1) + .unwrap() + .to_string() + } + + assert_eq!(get_header("1024"), "1024-blocks"); + assert_eq!(get_header("1K"), "1024-blocks"); + assert_eq!(get_header("1KB"), "1000-blocks"); + assert_eq!(get_header("1M"), "1048576-blocks"); + assert_eq!(get_header("1MB"), "1000000-blocks"); +} + #[test] fn test_too_large_block_size() { fn run_command(size: &str) { From a6b100a5ca044496e6cc649ea5cccb4e87c5db0b Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Tue, 10 May 2022 09:34:33 +0200 Subject: [PATCH 208/242] df: show error if provided block size is zero --- src/uu/df/src/blocks.rs | 13 +++++++++++-- tests/by-util/test_df.rs | 10 ++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/uu/df/src/blocks.rs b/src/uu/df/src/blocks.rs index bb6e06333ea..8759d161f31 100644 --- a/src/uu/df/src/blocks.rs +++ b/src/uu/df/src/blocks.rs @@ -7,7 +7,10 @@ use crate::OPT_BLOCKSIZE; use clap::ArgMatches; use std::{env, fmt}; -use uucore::parse_size::{parse_size, ParseSizeError}; +use uucore::{ + display::Quotable, + parse_size::{parse_size, ParseSizeError}, +}; /// The first ten powers of 1024. const IEC_BASES: [u128; 10] = [ @@ -180,7 +183,13 @@ impl Default for BlockSize { pub(crate) fn block_size_from_matches(matches: &ArgMatches) -> Result { if matches.is_present(OPT_BLOCKSIZE) { let s = matches.value_of(OPT_BLOCKSIZE).unwrap(); - Ok(BlockSize::Bytes(parse_size(s)?)) + let bytes = parse_size(s)?; + + if bytes > 0 { + Ok(BlockSize::Bytes(bytes)) + } else { + Err(ParseSizeError::ParseFailure(format!("{}", s.quote()))) + } } else { Ok(Default::default()) } diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index 81a9eef720a..5f48f11064c 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -465,6 +465,16 @@ fn test_invalid_block_size() { .arg("--block-size=x") .fails() .stderr_contains("invalid --block-size argument 'x'"); + + new_ucmd!() + .arg("--block-size=0") + .fails() + .stderr_contains("invalid --block-size argument '0'"); + + new_ucmd!() + .arg("--block-size=0K") + .fails() + .stderr_contains("invalid --block-size argument '0K'"); } #[test] From 08b6dd497521e71cc3d0c743061c611686b0f819 Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Sun, 8 May 2022 23:02:32 -0400 Subject: [PATCH 209/242] uucore(perms): better support nameless uids, gids Update the `wrap_chown()` function to support user IDs and group IDs that do not correspond to named users or groups, respectively. Before this commit, the result from `uid2usr()` and `gid2grp()` calls were unwrapped because we assumed a user name or group name, respectively, existed. However, this is not always true: for example, running the command `sudo chown 12345 f` works even if there is no named user with ID 12345. This commit expands `wrap_chown()` to work even if no name exists for the user or group. --- src/uucore/src/lib/features/perms.rs | 34 ++++++++++++++++------------ 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/uucore/src/lib/features/perms.rs b/src/uucore/src/lib/features/perms.rs index d8e3453137a..ed9e1c00177 100644 --- a/src/uucore/src/lib/features/perms.rs +++ b/src/uucore/src/lib/features/perms.rs @@ -92,22 +92,25 @@ pub fn wrap_chown>( ); if level == VerbosityLevel::Verbose { out = if verbosity.groups_only { + let gid = meta.gid(); format!( "{}\nfailed to change group of {} from {} to {}", out, path.quote(), - entries::gid2grp(meta.gid()).unwrap(), - entries::gid2grp(dest_gid).unwrap() + entries::gid2grp(gid).unwrap_or(gid.to_string()), + entries::gid2grp(dest_gid).unwrap_or(dest_gid.to_string()) ) } else { + let uid = meta.uid(); + let gid = meta.gid(); format!( "{}\nfailed to change ownership of {} from {}:{} to {}:{}", out, path.quote(), - entries::uid2usr(meta.uid()).unwrap(), - entries::gid2grp(meta.gid()).unwrap(), - entries::uid2usr(dest_uid).unwrap(), - entries::gid2grp(dest_gid).unwrap() + entries::uid2usr(uid).unwrap_or(uid.to_string()), + entries::gid2grp(gid).unwrap_or(gid.to_string()), + entries::uid2usr(dest_uid).unwrap_or(dest_uid.to_string()), + entries::gid2grp(dest_gid).unwrap_or(dest_gid.to_string()) ) }; }; @@ -119,21 +122,24 @@ pub fn wrap_chown>( if changed { match verbosity.level { VerbosityLevel::Changes | VerbosityLevel::Verbose => { + let gid = meta.gid(); out = if verbosity.groups_only { format!( "changed group of {} from {} to {}", path.quote(), - entries::gid2grp(meta.gid()).unwrap(), - entries::gid2grp(dest_gid).unwrap() + entries::gid2grp(gid).unwrap_or(gid.to_string()), + entries::gid2grp(dest_gid).unwrap_or(dest_gid.to_string()) ) } else { + let gid = meta.gid(); + let uid = meta.uid(); format!( "changed ownership of {} from {}:{} to {}:{}", path.quote(), - entries::uid2usr(meta.uid()).unwrap(), - entries::gid2grp(meta.gid()).unwrap(), - entries::uid2usr(dest_uid).unwrap(), - entries::gid2grp(dest_gid).unwrap() + entries::uid2usr(uid).unwrap_or(uid.to_string()), + entries::gid2grp(gid).unwrap_or(gid.to_string()), + entries::uid2usr(dest_uid).unwrap_or(dest_uid.to_string()), + entries::gid2grp(dest_gid).unwrap_or(dest_gid.to_string()) ) }; } @@ -150,8 +156,8 @@ pub fn wrap_chown>( format!( "ownership of {} retained as {}:{}", path.quote(), - entries::uid2usr(dest_uid).unwrap(), - entries::gid2grp(dest_gid).unwrap() + entries::uid2usr(dest_uid).unwrap_or(dest_uid.to_string()), + entries::gid2grp(dest_gid).unwrap_or(dest_gid.to_string()) ) }; } From 55550e1a6ec98e8657bb7b0807f2675424f4fc78 Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Sat, 23 Apr 2022 12:39:43 -0400 Subject: [PATCH 210/242] chown: allow setting arbitrary numeric user ID Update `chown` to allow setting the owner of a file to a numeric user ID regardless of whether a corresponding username exists on the system. For example, $ touch f && sudo chown 12345 f succeeds even though there is no named user with ID 12345. Fixes #3380. --- src/uu/chown/src/chown.rs | 15 +++++++++++---- tests/by-util/test_chown.rs | 23 +++++++++++++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/uu/chown/src/chown.rs b/src/uu/chown/src/chown.rs index 3add9df1f06..c5869612165 100644 --- a/src/uu/chown/src/chown.rs +++ b/src/uu/chown/src/chown.rs @@ -197,10 +197,17 @@ fn parse_spec(spec: &str, sep: char) -> UResult<(Option, Option)> { // So, try to parse it this way return parse_spec(spec, '.'); } else { - return Err(USimpleError::new( - 1, - format!("invalid user: {}", spec.quote()), - )); + // It's possible that the `user` string contains a + // numeric user ID, in which case, we respect that. + match user.parse() { + Ok(uid) => uid, + Err(_) => { + return Err(USimpleError::new( + 1, + format!("invalid user: {}", spec.quote()), + )) + } + } } } }) diff --git a/tests/by-util/test_chown.rs b/tests/by-util/test_chown.rs index 4470260f439..05a10fb6541 100644 --- a/tests/by-util/test_chown.rs +++ b/tests/by-util/test_chown.rs @@ -418,6 +418,29 @@ fn test_chown_only_user_id() { .stderr_contains(&"failed to change"); } +/// Test for setting the owner to a user ID for a user that does not exist. +/// +/// For example: +/// +/// $ touch f && chown 12345 f +/// +/// succeeds with exit status 0 and outputs nothing. The owner of the +/// file is set to 12345, even though no user with that ID exists. +/// +/// This test must be run as root, because only the root user can +/// transfer ownership of a file. +#[test] +fn test_chown_only_user_id_nonexistent_user() { + let ts = TestScenario::new(util_name!()); + let at = ts.fixtures.clone(); + at.touch("f"); + if let Ok(result) = run_ucmd_as_root(&ts, &["12345", "f"]) { + result.success().no_stdout().no_stderr(); + } else { + print!("Test skipped; requires root user"); + } +} + #[test] // FixME: stderr = chown: ownership of 'test_chown_file1' retained as cuuser:wheel #[cfg(not(target_os = "freebsd"))] From 163df8abc1954fee060d354c775ed1f4ff99f66c Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Mon, 9 May 2022 10:19:57 -0400 Subject: [PATCH 211/242] fixup! chown: allow setting arbitrary numeric user ID --- src/uu/chown/src/chown.rs | 47 +++++++++++++++++++++++++++---------- tests/by-util/test_chown.rs | 23 ++++++++++++++++++ 2 files changed, 57 insertions(+), 13 deletions(-) diff --git a/src/uu/chown/src/chown.rs b/src/uu/chown/src/chown.rs index c5869612165..18c64d60e0a 100644 --- a/src/uu/chown/src/chown.rs +++ b/src/uu/chown/src/chown.rs @@ -167,17 +167,18 @@ pub fn uu_app<'a>() -> Command<'a> { ) } -/// Parse the username and groupname +/// Parse the owner/group specifier string into a user ID and a group ID. /// -/// In theory, it should be username:groupname -/// but ... -/// it can user.name:groupname -/// or username.groupname +/// The `spec` can be of the form: /// -/// # Arguments +/// * `"owner:group"`, +/// * `"owner"`, +/// * `":group"`, /// -/// * `spec` - The input from the user -/// * `sep` - Should be ':' or '.' +/// and the owner or group can be specified either as an ID or a +/// name. The `sep` argument specifies which character to use as a +/// separator between the owner and group; calling code should set +/// this to `':'`. fn parse_spec(spec: &str, sep: char) -> UResult<(Option, Option)> { assert!(['.', ':'].contains(&sep)); let mut args = spec.splitn(2, sep); @@ -215,11 +216,18 @@ fn parse_spec(spec: &str, sep: char) -> UResult<(Option, Option)> { None }; let gid = if !group.is_empty() { - Some( - Group::locate(group) - .map_err(|_| USimpleError::new(1, format!("invalid group: {}", spec.quote())))? - .gid, - ) + Some(match Group::locate(group) { + Ok(g) => g.gid, + Err(_) => match group.parse() { + Ok(gid) => gid, + Err(_) => { + return Err(USimpleError::new( + 1, + format!("invalid group: {}", spec.quote()), + )); + } + }, + }) } else { None }; @@ -238,4 +246,17 @@ mod test { assert!(format!("{}", parse_spec("::", ':').err().unwrap()).starts_with("invalid group: ")); assert!(format!("{}", parse_spec("..", ':').err().unwrap()).starts_with("invalid group: ")); } + + /// Test for parsing IDs that don't correspond to a named user or group. + #[test] + fn test_parse_spec_nameless_ids() { + // This assumes that there is no named user with ID 12345. + assert!(matches!(parse_spec("12345", ':'), Ok((Some(12345), None)))); + // This assumes that there is no named group with ID 54321. + assert!(matches!(parse_spec(":54321", ':'), Ok((None, Some(54321))))); + assert!(matches!( + parse_spec("12345:54321", ':'), + Ok((Some(12345), Some(54321))) + )); + } } diff --git a/tests/by-util/test_chown.rs b/tests/by-util/test_chown.rs index 05a10fb6541..ef3fc0d33fe 100644 --- a/tests/by-util/test_chown.rs +++ b/tests/by-util/test_chown.rs @@ -484,6 +484,29 @@ fn test_chown_only_group_id() { .stderr_contains(&"failed to change"); } +/// Test for setting the group to a group ID for a group that does not exist. +/// +/// For example: +/// +/// $ touch f && chown :12345 f +/// +/// succeeds with exit status 0 and outputs nothing. The group of the +/// file is set to 12345, even though no group with that ID exists. +/// +/// This test must be run as root, because only the root user can +/// transfer ownership of a file. +#[test] +fn test_chown_only_group_id_nonexistent_group() { + let ts = TestScenario::new(util_name!()); + let at = ts.fixtures.clone(); + at.touch("f"); + if let Ok(result) = run_ucmd_as_root(&ts, &[":12345", "f"]) { + result.success().no_stdout().no_stderr(); + } else { + print!("Test skipped; requires root user"); + } +} + #[test] fn test_chown_owner_group_id() { // test chown 1111:1111 file.txt From f56903493c3717401dc2191584844f9c510e2340 Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Mon, 9 May 2022 20:29:11 -0400 Subject: [PATCH 212/242] WIP Trying to diagnose 'invalid group: 1001:121' error in CI environment --- src/uu/chown/src/chown.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/uu/chown/src/chown.rs b/src/uu/chown/src/chown.rs index 18c64d60e0a..9d2cad1c38f 100644 --- a/src/uu/chown/src/chown.rs +++ b/src/uu/chown/src/chown.rs @@ -220,7 +220,8 @@ fn parse_spec(spec: &str, sep: char) -> UResult<(Option, Option)> { Ok(g) => g.gid, Err(_) => match group.parse() { Ok(gid) => gid, - Err(_) => { + Err(e) => { + eprintln!("error {}, user {}, group {}, uid {:?}", e, user, group, uid); return Err(USimpleError::new( 1, format!("invalid group: {}", spec.quote()), From 3029d83a36af853a95cebdd8363a41c3143659ab Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Mon, 9 May 2022 20:47:46 -0400 Subject: [PATCH 213/242] Revert "WIP Trying to diagnose 'invalid group: 1001:121' error in CI environment" This reverts commit 291fb3ad71a0e93705509a352fd95de7539402ed. --- src/uu/chown/src/chown.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/uu/chown/src/chown.rs b/src/uu/chown/src/chown.rs index 9d2cad1c38f..18c64d60e0a 100644 --- a/src/uu/chown/src/chown.rs +++ b/src/uu/chown/src/chown.rs @@ -220,8 +220,7 @@ fn parse_spec(spec: &str, sep: char) -> UResult<(Option, Option)> { Ok(g) => g.gid, Err(_) => match group.parse() { Ok(gid) => gid, - Err(e) => { - eprintln!("error {}, user {}, group {}, uid {:?}", e, user, group, uid); + Err(_) => { return Err(USimpleError::new( 1, format!("invalid group: {}", spec.quote()), From 5713de4d937ac7e03cbf32e926fb4044bd782d67 Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Mon, 9 May 2022 20:50:20 -0400 Subject: [PATCH 214/242] fixup! uucore(perms): better support nameless uids, gids --- src/uucore/src/lib/features/perms.rs | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/uucore/src/lib/features/perms.rs b/src/uucore/src/lib/features/perms.rs index ed9e1c00177..edb71464604 100644 --- a/src/uucore/src/lib/features/perms.rs +++ b/src/uucore/src/lib/features/perms.rs @@ -97,8 +97,8 @@ pub fn wrap_chown>( "{}\nfailed to change group of {} from {} to {}", out, path.quote(), - entries::gid2grp(gid).unwrap_or(gid.to_string()), - entries::gid2grp(dest_gid).unwrap_or(dest_gid.to_string()) + entries::gid2grp(gid).unwrap_or_else(|_| gid.to_string()), + entries::gid2grp(dest_gid).unwrap_or_else(|_| dest_gid.to_string()) ) } else { let uid = meta.uid(); @@ -107,10 +107,10 @@ pub fn wrap_chown>( "{}\nfailed to change ownership of {} from {}:{} to {}:{}", out, path.quote(), - entries::uid2usr(uid).unwrap_or(uid.to_string()), - entries::gid2grp(gid).unwrap_or(gid.to_string()), - entries::uid2usr(dest_uid).unwrap_or(dest_uid.to_string()), - entries::gid2grp(dest_gid).unwrap_or(dest_gid.to_string()) + entries::uid2usr(uid).unwrap_or_else(|_| uid.to_string()), + entries::gid2grp(gid).unwrap_or_else(|_| gid.to_string()), + entries::uid2usr(dest_uid).unwrap_or_else(|_| dest_uid.to_string()), + entries::gid2grp(dest_gid).unwrap_or_else(|_| dest_gid.to_string()) ) }; }; @@ -127,8 +127,8 @@ pub fn wrap_chown>( format!( "changed group of {} from {} to {}", path.quote(), - entries::gid2grp(gid).unwrap_or(gid.to_string()), - entries::gid2grp(dest_gid).unwrap_or(dest_gid.to_string()) + entries::gid2grp(gid).unwrap_or_else(|_| gid.to_string()), + entries::gid2grp(dest_gid).unwrap_or_else(|_| dest_gid.to_string()) ) } else { let gid = meta.gid(); @@ -136,10 +136,10 @@ pub fn wrap_chown>( format!( "changed ownership of {} from {}:{} to {}:{}", path.quote(), - entries::uid2usr(uid).unwrap_or(uid.to_string()), - entries::gid2grp(gid).unwrap_or(gid.to_string()), - entries::uid2usr(dest_uid).unwrap_or(dest_uid.to_string()), - entries::gid2grp(dest_gid).unwrap_or(dest_gid.to_string()) + entries::uid2usr(uid).unwrap_or_else(|_| uid.to_string()), + entries::gid2grp(gid).unwrap_or_else(|_| gid.to_string()), + entries::uid2usr(dest_uid).unwrap_or_else(|_| dest_uid.to_string()), + entries::gid2grp(dest_gid).unwrap_or_else(|_| dest_gid.to_string()) ) }; } @@ -156,8 +156,8 @@ pub fn wrap_chown>( format!( "ownership of {} retained as {}:{}", path.quote(), - entries::uid2usr(dest_uid).unwrap_or(dest_uid.to_string()), - entries::gid2grp(dest_gid).unwrap_or(dest_gid.to_string()) + entries::uid2usr(dest_uid).unwrap_or_else(|_| dest_uid.to_string()), + entries::gid2grp(dest_gid).unwrap_or_else(|_| dest_gid.to_string()) ) }; } From 598dc79b69d9eb6b711fd45b4b4fa7dd18d75413 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Thu, 12 May 2022 10:11:24 +0200 Subject: [PATCH 215/242] df: test default blocksize in POSIX mode --- tests/by-util/test_df.rs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index 157818d958c..9ff8e103ddc 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -435,6 +435,30 @@ fn test_default_block_size() { assert_eq!(header, "512B-blocks"); } +#[test] +fn test_default_block_size_in_posix_portability_mode() { + fn get_header(s: &str) -> String { + s.lines() + .next() + .unwrap() + .to_string() + .split_whitespace() + .nth(1) + .unwrap() + .to_string() + } + + let output = new_ucmd!().arg("-P").succeeds().stdout_move_str(); + assert_eq!(get_header(&output), "1024-blocks"); + + let output = new_ucmd!() + .arg("-P") + .env("POSIXLY_CORRECT", "1") + .succeeds() + .stdout_move_str(); + assert_eq!(get_header(&output), "512-blocks"); +} + #[test] fn test_block_size_1024() { fn get_header(block_size: u64) -> String { From 369026a92f1b0c3e3b17706e2061b98447f7ee9a Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Thu, 12 May 2022 22:34:08 +0200 Subject: [PATCH 216/242] tr: remove duplicate line from clap::Command --- src/uu/tr/src/tr.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/uu/tr/src/tr.rs b/src/uu/tr/src/tr.rs index dd8edc518aa..93465429f96 100644 --- a/src/uu/tr/src/tr.rs +++ b/src/uu/tr/src/tr.rs @@ -143,7 +143,6 @@ pub fn uu_app<'a>() -> Command<'a> { .about(ABOUT) .override_usage(format_usage(USAGE)) .infer_long_args(true) - .infer_long_args(true) .arg( Arg::new(options::COMPLEMENT) .visible_short_alias('C') From fa94591b723b52a6b6435c876e1b42c61ed24929 Mon Sep 17 00:00:00 2001 From: Jan Scheer Date: Thu, 12 May 2022 19:22:50 +0200 Subject: [PATCH 217/242] test_stat: expand scope for stdin tests On Android and macOS all/some tests for stdin fail with: `cannot stat '-': No such file or directory` Apparently the `/dev/stdin` redirect workaround doesn't work for these targets. --- tests/by-util/test_stat.rs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/tests/by-util/test_stat.rs b/tests/by-util/test_stat.rs index 14aba96fcc6..68185046707 100644 --- a/tests/by-util/test_stat.rs +++ b/tests/by-util/test_stat.rs @@ -360,12 +360,11 @@ fn test_pipe_fifo() { } #[test] -#[cfg(target_os = "linux")] +#[cfg(all(unix, not(target_os = "android")))] fn test_stdin_pipe_fifo1() { // $ echo | stat - // File: - // Size: 0 Blocks: 0 IO Block: 4096 fifo - // use std::process::{Command, Stdio}; new_ucmd!() .arg("-") .set_stdin(std::process::Stdio::piped()) @@ -374,7 +373,6 @@ fn test_stdin_pipe_fifo1() { .stdout_contains("fifo") .stdout_contains("File: -") .succeeded(); - new_ucmd!() .args(&["-L", "-"]) .set_stdin(std::process::Stdio::piped()) @@ -386,7 +384,7 @@ fn test_stdin_pipe_fifo1() { } #[test] -#[cfg(target_os = "linux")] +#[cfg(all(unix, not(target_os = "android")))] fn test_stdin_pipe_fifo2() { // $ stat - // File: - @@ -402,16 +400,15 @@ fn test_stdin_pipe_fifo2() { } #[test] -#[cfg(target_os = "linux")] +#[cfg(all(unix, not(any(target_os = "android", target_os = "macos"))))] fn test_stdin_redirect() { // $ touch f && stat - < f // File: - // Size: 0 Blocks: 0 IO Block: 4096 regular empty file - let ts = TestScenario::new(util_name!()); let at = &ts.fixtures; at.touch("f"); - new_ucmd!() + ts.ucmd() .arg("-") .set_stdin(std::fs::File::open(at.plus("f")).unwrap()) .run() From 5d628310fc522e1e23983044ed1e41cc6111f882 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 May 2022 06:45:15 +0000 Subject: [PATCH 218/242] build(deps): bump vmactions/freebsd-vm from 0.1.5 to 0.1.6 Bumps [vmactions/freebsd-vm](https://github.com/vmactions/freebsd-vm) from 0.1.5 to 0.1.6. - [Release notes](https://github.com/vmactions/freebsd-vm/releases) - [Commits](https://github.com/vmactions/freebsd-vm/compare/v0.1.5...v0.1.6) --- updated-dependencies: - dependency-name: vmactions/freebsd-vm dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/CICD.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml index 079dc1f2942..c58b725c428 100644 --- a/.github/workflows/CICD.yml +++ b/.github/workflows/CICD.yml @@ -915,7 +915,7 @@ jobs: - uses: Swatinem/rust-cache@v1 - name: Prepare, build and test ## spell-checker:ignore (ToDO) sshfs usesh vmactions - uses: vmactions/freebsd-vm@v0.1.5 + uses: vmactions/freebsd-vm@v0.1.6 with: usesh: true # sync: sshfs From 0acfa07d7707897e64ba3783cdc370f4e102388d Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Thu, 12 May 2022 22:53:25 +0200 Subject: [PATCH 219/242] all: add value hints --- src/uu/base32/src/base_common.rs | 7 ++++++- src/uu/basename/src/basename.rs | 1 + src/uu/cat/src/cat.rs | 3 ++- src/uu/chcon/src/chcon.rs | 3 +++ src/uu/chgrp/src/chgrp.rs | 1 + src/uu/chmod/src/chmod.rs | 4 +++- src/uu/chown/src/chown.rs | 1 + src/uu/chroot/src/chroot.rs | 2 ++ src/uu/cksum/src/cksum.rs | 3 ++- src/uu/comm/src/comm.rs | 12 ++++++++++-- src/uu/cp/src/cp.rs | 4 +++- src/uu/csplit/src/csplit.rs | 7 ++++++- src/uu/cut/src/cut.rs | 3 ++- src/uu/date/src/date.rs | 2 ++ src/uu/dd/src/dd.rs | 2 ++ src/uu/df/src/df.rs | 6 +++++- src/uu/dircolors/src/dircolors.rs | 1 + src/uu/dirname/src/dirname.rs | 7 ++++++- src/uu/du/src/du.rs | 2 ++ src/uu/env/src/env.rs | 2 ++ src/uu/expand/src/expand.rs | 1 + src/uu/fmt/src/fmt.rs | 3 ++- src/uu/fold/src/fold.rs | 3 ++- src/uu/groups/src/groups.rs | 3 ++- src/uu/hashsum/src/hashsum.rs | 1 + src/uu/head/src/head.rs | 6 +++++- src/uu/hostname/src/hostname.rs | 6 +++++- src/uu/id/src/id.rs | 3 ++- src/uu/install/src/install.rs | 11 ++++++++++- src/uu/join/src/join.rs | 2 ++ src/uu/link/src/link.rs | 1 + src/uu/ln/src/ln.rs | 2 ++ src/uu/ls/src/ls.rs | 3 ++- src/uu/mkdir/src/mkdir.rs | 3 ++- src/uu/mkfifo/src/mkfifo.rs | 3 ++- src/uu/mknod/src/mknod.rs | 3 ++- src/uu/mktemp/src/mktemp.rs | 3 ++- src/uu/more/src/more.rs | 3 ++- src/uu/mv/src/mv.rs | 6 ++++-- src/uu/nice/src/nice.rs | 6 +++++- src/uu/nl/src/nl.rs | 3 ++- src/uu/nohup/src/nohup.rs | 3 ++- src/uu/od/src/od.rs | 3 ++- src/uu/paste/src/paste.rs | 3 ++- src/uu/pathchk/src/pathchk.rs | 3 ++- src/uu/pinky/src/pinky.rs | 3 ++- src/uu/pr/src/pr.rs | 1 + src/uu/ptx/src/ptx.rs | 12 ++++++++---- src/uu/readlink/src/readlink.rs | 3 ++- src/uu/realpath/src/realpath.rs | 3 ++- src/uu/relpath/src/relpath.rs | 13 +++++++++++-- src/uu/rm/src/rm.rs | 1 + src/uu/rmdir/src/rmdir.rs | 3 ++- src/uu/runcon/src/runcon.rs | 3 ++- src/uu/shred/src/shred.rs | 3 ++- src/uu/shuf/src/shuf.rs | 12 +++++++++--- src/uu/sort/src/sort.rs | 15 ++++++++++----- src/uu/split/src/split.rs | 9 ++++++--- src/uu/stat/src/stat.rs | 3 ++- src/uu/stdbuf/src/stdbuf.rs | 3 ++- src/uu/sum/src/sum.rs | 3 ++- src/uu/sync/src/sync.rs | 3 ++- src/uu/tac/src/tac.rs | 3 ++- src/uu/tail/src/tail.rs | 3 ++- src/uu/tee/src/tee.rs | 6 +++++- src/uu/timeout/src/timeout.rs | 1 + src/uu/touch/src/touch.rs | 6 ++++-- src/uu/truncate/src/truncate.rs | 4 +++- src/uu/tsort/src/tsort.rs | 7 ++++++- src/uu/unexpand/src/unexpand.rs | 7 ++++++- src/uu/uniq/src/uniq.rs | 3 ++- src/uu/unlink/src/unlink.rs | 3 ++- src/uu/users/src/users.rs | 7 ++++++- src/uu/wc/src/wc.rs | 6 ++++-- src/uu/who/src/who.rs | 3 ++- src/uucore/src/lib/features/perms.rs | 1 + 76 files changed, 240 insertions(+), 73 deletions(-) diff --git a/src/uu/base32/src/base_common.rs b/src/uu/base32/src/base_common.rs index 148bad2f833..90221f4f629 100644 --- a/src/uu/base32/src/base_common.rs +++ b/src/uu/base32/src/base_common.rs @@ -123,7 +123,12 @@ pub fn base_app<'a>(about: &'a str, usage: &'a str) -> Command<'a> { ) // "multiple" arguments are used to check whether there is more than one // file passed in. - .arg(Arg::new(options::FILE).index(1).multiple_occurrences(true)) + .arg( + Arg::new(options::FILE) + .index(1) + .multiple_occurrences(true) + .value_hint(clap::ValueHint::FilePath), + ) } pub fn get_input<'a>(config: &Config, stdin_ref: &'a Stdin) -> UResult> { diff --git a/src/uu/basename/src/basename.rs b/src/uu/basename/src/basename.rs index 7b0a0a486c4..242a6a6e9a5 100644 --- a/src/uu/basename/src/basename.rs +++ b/src/uu/basename/src/basename.rs @@ -102,6 +102,7 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new(options::NAME) .multiple_occurrences(true) + .value_hint(clap::ValueHint::AnyPath) .hide(true), ) .arg( diff --git a/src/uu/cat/src/cat.rs b/src/uu/cat/src/cat.rs index 67de917f7b5..cd10b5251df 100644 --- a/src/uu/cat/src/cat.rs +++ b/src/uu/cat/src/cat.rs @@ -249,7 +249,8 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new(options::FILE) .hide(true) - .multiple_occurrences(true), + .multiple_occurrences(true) + .value_hint(clap::ValueHint::FilePath), ) .arg( Arg::new(options::SHOW_ALL) diff --git a/src/uu/chcon/src/chcon.rs b/src/uu/chcon/src/chcon.rs index e49191ea357..3458a4cca30 100644 --- a/src/uu/chcon/src/chcon.rs +++ b/src/uu/chcon/src/chcon.rs @@ -197,6 +197,7 @@ pub fn uu_app<'a>() -> Command<'a> { .long(options::REFERENCE) .takes_value(true) .value_name("RFILE") + .value_hint(clap::ValueHint::FilePath) .conflicts_with_all(&[options::USER, options::ROLE, options::TYPE, options::RANGE]) .help( "Use security context of RFILE, rather than specifying \ @@ -210,6 +211,7 @@ pub fn uu_app<'a>() -> Command<'a> { .long(options::USER) .takes_value(true) .value_name("USER") + .value_hint(clap::ValueHint::Username) .help("Set user USER in the target security context.") .allow_invalid_utf8(true), ) @@ -294,6 +296,7 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new("FILE") .multiple_occurrences(true) + .value_hint(clap::ValueHint::FilePath) .min_values(1) .allow_invalid_utf8(true), ) diff --git a/src/uu/chgrp/src/chgrp.rs b/src/uu/chgrp/src/chgrp.rs index d7e8baafeab..015f0998294 100644 --- a/src/uu/chgrp/src/chgrp.rs +++ b/src/uu/chgrp/src/chgrp.rs @@ -113,6 +113,7 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(options::REFERENCE) .long(options::REFERENCE) .value_name("RFILE") + .value_hint(clap::ValueHint::FilePath) .help("use RFILE's group rather than specifying GROUP values") .takes_value(true) .multiple_occurrences(false), diff --git a/src/uu/chmod/src/chmod.rs b/src/uu/chmod/src/chmod.rs index 25a37c372bf..d4b81ee37d9 100644 --- a/src/uu/chmod/src/chmod.rs +++ b/src/uu/chmod/src/chmod.rs @@ -157,6 +157,7 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(options::REFERENCE) .long("reference") .takes_value(true) + .value_hint(clap::ValueHint::FilePath) .help("use RFILE's mode instead of MODE values"), ) .arg( @@ -170,7 +171,8 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new(options::FILE) .required_unless_present(options::MODE) - .multiple_occurrences(true), + .multiple_occurrences(true) + .value_hint(clap::ValueHint::AnyPath), ) } diff --git a/src/uu/chown/src/chown.rs b/src/uu/chown/src/chown.rs index 3add9df1f06..e66e105fbe1 100644 --- a/src/uu/chown/src/chown.rs +++ b/src/uu/chown/src/chown.rs @@ -134,6 +134,7 @@ pub fn uu_app<'a>() -> Command<'a> { .long(options::REFERENCE) .help("use RFILE's owner and group rather than specifying OWNER:GROUP values") .value_name("RFILE") + .value_hint(clap::ValueHint::FilePath) .min_values(1), ) .arg( diff --git a/src/uu/chroot/src/chroot.rs b/src/uu/chroot/src/chroot.rs index e54cc3f8fe8..30cf75644d3 100644 --- a/src/uu/chroot/src/chroot.rs +++ b/src/uu/chroot/src/chroot.rs @@ -102,6 +102,7 @@ pub fn uu_app<'a>() -> Command<'a> { .infer_long_args(true) .arg( Arg::new(options::NEWROOT) + .value_hint(clap::ValueHint::DirPath) .hide(true) .required(true) .index(1), @@ -139,6 +140,7 @@ pub fn uu_app<'a>() -> Command<'a> { ) .arg( Arg::new(options::COMMAND) + .value_hint(clap::ValueHint::CommandName) .hide(true) .multiple_occurrences(true) .index(2), diff --git a/src/uu/cksum/src/cksum.rs b/src/uu/cksum/src/cksum.rs index e901e0820ed..e9a5c562033 100644 --- a/src/uu/cksum/src/cksum.rs +++ b/src/uu/cksum/src/cksum.rs @@ -150,6 +150,7 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new(options::FILE) .hide(true) - .multiple_occurrences(true), + .multiple_occurrences(true) + .value_hint(clap::ValueHint::FilePath), ) } diff --git a/src/uu/comm/src/comm.rs b/src/uu/comm/src/comm.rs index 2207493d30d..78ef4e5c269 100644 --- a/src/uu/comm/src/comm.rs +++ b/src/uu/comm/src/comm.rs @@ -173,6 +173,14 @@ pub fn uu_app<'a>() -> Command<'a> { .default_value(options::DELIMITER_DEFAULT) .hide_default_value(true), ) - .arg(Arg::new(options::FILE_1).required(true)) - .arg(Arg::new(options::FILE_2).required(true)) + .arg( + Arg::new(options::FILE_1) + .required(true) + .value_hint(clap::ValueHint::FilePath), + ) + .arg( + Arg::new(options::FILE_2) + .required(true) + .value_hint(clap::ValueHint::FilePath), + ) } diff --git a/src/uu/cp/src/cp.rs b/src/uu/cp/src/cp.rs index 1b47b782879..41466abc8f4 100644 --- a/src/uu/cp/src/cp.rs +++ b/src/uu/cp/src/cp.rs @@ -314,6 +314,7 @@ pub fn uu_app<'a>() -> Command<'a> { .conflicts_with(options::NO_TARGET_DIRECTORY) .long(options::TARGET_DIRECTORY) .value_name(options::TARGET_DIRECTORY) + .value_hint(clap::ValueHint::DirPath) .takes_value(true) .validator(|s| { if Path::new(s).is_dir() { @@ -464,7 +465,8 @@ pub fn uu_app<'a>() -> Command<'a> { // END TODO .arg(Arg::new(options::PATHS) - .multiple_occurrences(true)) + .multiple_occurrences(true) + .value_hint(clap::ValueHint::AnyPath)) } #[uucore::main] diff --git a/src/uu/csplit/src/csplit.rs b/src/uu/csplit/src/csplit.rs index a0b739935c9..2ef6b34f96b 100644 --- a/src/uu/csplit/src/csplit.rs +++ b/src/uu/csplit/src/csplit.rs @@ -797,7 +797,12 @@ pub fn uu_app<'a>() -> Command<'a> { .long(options::ELIDE_EMPTY_FILES) .help("remove empty output files"), ) - .arg(Arg::new(options::FILE).hide(true).required(true)) + .arg( + Arg::new(options::FILE) + .hide(true) + .required(true) + .value_hint(clap::ValueHint::FilePath), + ) .arg( Arg::new(options::PATTERN) .hide(true) diff --git a/src/uu/cut/src/cut.rs b/src/uu/cut/src/cut.rs index 2264f4f26a1..b809b765de5 100644 --- a/src/uu/cut/src/cut.rs +++ b/src/uu/cut/src/cut.rs @@ -614,6 +614,7 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new(options::FILE) .hide(true) - .multiple_occurrences(true) + .multiple_occurrences(true) + .value_hint(clap::ValueHint::FilePath) ) } diff --git a/src/uu/date/src/date.rs b/src/uu/date/src/date.rs index 8946768d540..ca18856d1fa 100644 --- a/src/uu/date/src/date.rs +++ b/src/uu/date/src/date.rs @@ -272,6 +272,7 @@ pub fn uu_app<'a>() -> Command<'a> { .short('f') .long(OPT_FILE) .takes_value(true) + .value_hint(clap::ValueHint::FilePath) .help("like --date; once for each line of DATEFILE"), ) .arg( @@ -303,6 +304,7 @@ pub fn uu_app<'a>() -> Command<'a> { .short('r') .long(OPT_REFERENCE) .takes_value(true) + .value_hint(clap::ValueHint::AnyPath) .help("display the last modification time of FILE"), ) .arg( diff --git a/src/uu/dd/src/dd.rs b/src/uu/dd/src/dd.rs index 3f1a54b1cf9..115da8bccfd 100644 --- a/src/uu/dd/src/dd.rs +++ b/src/uu/dd/src/dd.rs @@ -742,6 +742,7 @@ pub fn uu_app<'a>() -> Command<'a> { .long(options::INFILE) .overrides_with(options::INFILE) .takes_value(true) + .value_hint(clap::ValueHint::FilePath) .require_equals(true) .value_name("FILE") .help("(alternatively if=FILE) specifies the file used for input. When not specified, stdin is used instead") @@ -751,6 +752,7 @@ pub fn uu_app<'a>() -> Command<'a> { .long(options::OUTFILE) .overrides_with(options::OUTFILE) .takes_value(true) + .value_hint(clap::ValueHint::FilePath) .require_equals(true) .value_name("FILE") .help("(alternatively of=FILE) specifies the file used for output. When not specified, stdout is used instead") diff --git a/src/uu/df/src/df.rs b/src/uu/df/src/df.rs index a11dcf7a0e3..1f59982b21a 100644 --- a/src/uu/df/src/df.rs +++ b/src/uu/df/src/df.rs @@ -583,7 +583,11 @@ pub fn uu_app<'a>() -> Command<'a> { .multiple_occurrences(true) .help("limit listing to file systems not of type TYPE"), ) - .arg(Arg::new(OPT_PATHS).multiple_occurrences(true)) + .arg( + Arg::new(OPT_PATHS) + .multiple_occurrences(true) + .value_hint(clap::ValueHint::AnyPath), + ) } #[cfg(test)] diff --git a/src/uu/dircolors/src/dircolors.rs b/src/uu/dircolors/src/dircolors.rs index c76dbc0c14e..78cf8d802c0 100644 --- a/src/uu/dircolors/src/dircolors.rs +++ b/src/uu/dircolors/src/dircolors.rs @@ -187,6 +187,7 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new(options::FILE) .hide(true) + .value_hint(clap::ValueHint::FilePath) .multiple_occurrences(true), ) } diff --git a/src/uu/dirname/src/dirname.rs b/src/uu/dirname/src/dirname.rs index 030c3981c31..ac37e513bbd 100644 --- a/src/uu/dirname/src/dirname.rs +++ b/src/uu/dirname/src/dirname.rs @@ -88,5 +88,10 @@ pub fn uu_app<'a>() -> Command<'a> { .short('z') .help("separate output with NUL rather than newline"), ) - .arg(Arg::new(options::DIR).hide(true).multiple_occurrences(true)) + .arg( + Arg::new(options::DIR) + .hide(true) + .multiple_occurrences(true) + .value_hint(clap::ValueHint::AnyPath), + ) } diff --git a/src/uu/du/src/du.rs b/src/uu/du/src/du.rs index b29a938a460..d358d3e8f99 100644 --- a/src/uu/du/src/du.rs +++ b/src/uu/du/src/du.rs @@ -884,6 +884,7 @@ pub fn uu_app<'a>() -> Command<'a> { .short('X') .long("exclude-from") .value_name("FILE") + .value_hint(clap::ValueHint::FilePath) .help("exclude files that match any pattern in FILE") .multiple_occurrences(true) @@ -913,6 +914,7 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new(options::FILE) .hide(true) + .value_hint(clap::ValueHint::AnyPath) .multiple_occurrences(true) ) } diff --git a/src/uu/env/src/env.rs b/src/uu/env/src/env.rs index 2ec0ce1c63c..a42621daddb 100644 --- a/src/uu/env/src/env.rs +++ b/src/uu/env/src/env.rs @@ -144,6 +144,7 @@ pub fn uu_app<'a>() -> Command<'a> { .takes_value(true) .number_of_values(1) .value_name("DIR") + .value_hint(clap::ValueHint::DirPath) .help("change working directory to DIR")) .arg(Arg::new("null") .short('0') @@ -156,6 +157,7 @@ pub fn uu_app<'a>() -> Command<'a> { .takes_value(true) .number_of_values(1) .value_name("PATH") + .value_hint(clap::ValueHint::FilePath) .multiple_occurrences(true) .help("read and set variables from a \".env\"-style configuration file (prior to any \ unset and/or set)")) diff --git a/src/uu/expand/src/expand.rs b/src/uu/expand/src/expand.rs index b9d9309cd7a..11761516238 100644 --- a/src/uu/expand/src/expand.rs +++ b/src/uu/expand/src/expand.rs @@ -207,6 +207,7 @@ pub fn uu_app<'a>() -> Command<'a> { .multiple_occurrences(true) .hide(true) .takes_value(true) + .value_hint(clap::ValueHint::FilePath) ) } diff --git a/src/uu/fmt/src/fmt.rs b/src/uu/fmt/src/fmt.rs index 3cb85167486..27afb689f68 100644 --- a/src/uu/fmt/src/fmt.rs +++ b/src/uu/fmt/src/fmt.rs @@ -344,6 +344,7 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new(ARG_FILES) .multiple_occurrences(true) - .takes_value(true), + .takes_value(true) + .value_hint(clap::ValueHint::FilePath), ) } diff --git a/src/uu/fold/src/fold.rs b/src/uu/fold/src/fold.rs index d24d31be975..b2806eb01ff 100644 --- a/src/uu/fold/src/fold.rs +++ b/src/uu/fold/src/fold.rs @@ -99,7 +99,8 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new(options::FILE) .hide(true) - .multiple_occurrences(true), + .multiple_occurrences(true) + .value_hint(clap::ValueHint::FilePath), ) } diff --git a/src/uu/groups/src/groups.rs b/src/uu/groups/src/groups.rs index cd0d05b071d..dd218803355 100644 --- a/src/uu/groups/src/groups.rs +++ b/src/uu/groups/src/groups.rs @@ -112,6 +112,7 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(options::USERS) .multiple_occurrences(true) .takes_value(true) - .value_name(options::USERS), + .value_name(options::USERS) + .value_hint(clap::ValueHint::Username), ) } diff --git a/src/uu/hashsum/src/hashsum.rs b/src/uu/hashsum/src/hashsum.rs index 244e4b9289c..872cb5c21d1 100644 --- a/src/uu/hashsum/src/hashsum.rs +++ b/src/uu/hashsum/src/hashsum.rs @@ -423,6 +423,7 @@ pub fn uu_app_common<'a>() -> Command<'a> { .index(1) .multiple_occurrences(true) .value_name("FILE") + .value_hint(clap::ValueHint::FilePath) .allow_invalid_utf8(true), ) } diff --git a/src/uu/head/src/head.rs b/src/uu/head/src/head.rs index b6d36a4ada4..01f08ff937f 100644 --- a/src/uu/head/src/head.rs +++ b/src/uu/head/src/head.rs @@ -107,7 +107,11 @@ pub fn uu_app<'a>() -> Command<'a> { .help("line delimiter is NUL, not newline") .overrides_with(options::ZERO_NAME), ) - .arg(Arg::new(options::FILES_NAME).multiple_occurrences(true)) + .arg( + Arg::new(options::FILES_NAME) + .multiple_occurrences(true) + .value_hint(clap::ValueHint::FilePath), + ) } #[derive(Debug, PartialEq)] diff --git a/src/uu/hostname/src/hostname.rs b/src/uu/hostname/src/hostname.rs index 757caed023a..11b0d6cdb19 100644 --- a/src/uu/hostname/src/hostname.rs +++ b/src/uu/hostname/src/hostname.rs @@ -105,7 +105,11 @@ pub fn uu_app<'a>() -> Command<'a> { .overrides_with_all(&[OPT_DOMAIN, OPT_IP_ADDRESS, OPT_FQDN, OPT_SHORT]) .help("Display the short hostname (the portion before the first dot) if possible"), ) - .arg(Arg::new(OPT_HOST).allow_invalid_utf8(true)) + .arg( + Arg::new(OPT_HOST) + .allow_invalid_utf8(true) + .value_hint(clap::ValueHint::Hostname), + ) } fn display_hostname(matches: &ArgMatches) -> UResult<()> { diff --git a/src/uu/id/src/id.rs b/src/uu/id/src/id.rs index cc23ce19f86..bb8e261d26b 100644 --- a/src/uu/id/src/id.rs +++ b/src/uu/id/src/id.rs @@ -443,7 +443,8 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(options::ARG_USERS) .multiple_occurrences(true) .takes_value(true) - .value_name(options::ARG_USERS), + .value_name(options::ARG_USERS) + .value_hint(clap::ValueHint::Username), ) } diff --git a/src/uu/install/src/install.rs b/src/uu/install/src/install.rs index 808898cfb20..6750560d2fc 100644 --- a/src/uu/install/src/install.rs +++ b/src/uu/install/src/install.rs @@ -248,6 +248,7 @@ pub fn uu_app<'a>() -> Command<'a> { .help("set ownership (super-user only)") .value_name("OWNER") .takes_value(true) + .value_hint(clap::ValueHint::Username) ) .arg( Arg::new(OPT_PRESERVE_TIMESTAMPS) @@ -266,6 +267,7 @@ pub fn uu_app<'a>() -> Command<'a> { .long(OPT_STRIP_PROGRAM) .help("program used to strip binaries (no action Windows)") .value_name("PROGRAM") + .value_hint(clap::ValueHint::CommandName) ) .arg( backup_control::arguments::suffix() @@ -277,6 +279,7 @@ pub fn uu_app<'a>() -> Command<'a> { .long(OPT_TARGET_DIRECTORY) .help("move all SOURCE arguments into DIRECTORY") .value_name("DIRECTORY") + .value_hint(clap::ValueHint::DirPath) ) .arg( // TODO implement flag @@ -307,7 +310,13 @@ pub fn uu_app<'a>() -> Command<'a> { .help("(unimplemented) set security context of files and directories") .value_name("CONTEXT") ) - .arg(Arg::new(ARG_FILES).multiple_occurrences(true).takes_value(true).min_values(1)) + .arg( + Arg::new(ARG_FILES) + .multiple_occurrences(true) + .takes_value(true) + .min_values(1) + .value_hint(clap::ValueHint::AnyPath) + ) } /// Check for unimplemented command line arguments. diff --git a/src/uu/join/src/join.rs b/src/uu/join/src/join.rs index ef19fe32833..20a8cbd28e0 100644 --- a/src/uu/join/src/join.rs +++ b/src/uu/join/src/join.rs @@ -801,12 +801,14 @@ FILENUM is 1 or 2, corresponding to FILE1 or FILE2", Arg::new("file1") .required(true) .value_name("FILE1") + .value_hint(clap::ValueHint::FilePath) .hide(true), ) .arg( Arg::new("file2") .required(true) .value_name("FILE2") + .value_hint(clap::ValueHint::FilePath) .hide(true), ) } diff --git a/src/uu/link/src/link.rs b/src/uu/link/src/link.rs index 3c959af333e..1fc0c49ce97 100644 --- a/src/uu/link/src/link.rs +++ b/src/uu/link/src/link.rs @@ -46,6 +46,7 @@ pub fn uu_app<'a>() -> Command<'a> { .min_values(2) .max_values(2) .takes_value(true) + .value_hint(clap::ValueHint::AnyPath) .allow_invalid_utf8(true), ) } diff --git a/src/uu/ln/src/ln.rs b/src/uu/ln/src/ln.rs index 088edf219d1..fdbb32311a3 100644 --- a/src/uu/ln/src/ln.rs +++ b/src/uu/ln/src/ln.rs @@ -232,6 +232,7 @@ pub fn uu_app<'a>() -> Command<'a> { .long(options::TARGET_DIRECTORY) .help("specify the DIRECTORY in which to create the links") .value_name("DIRECTORY") + .value_hint(clap::ValueHint::DirPath) .conflicts_with(options::NO_TARGET_DIRECTORY), ) .arg( @@ -257,6 +258,7 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(ARG_FILES) .multiple_occurrences(true) .takes_value(true) + .value_hint(clap::ValueHint::AnyPath) .required(true) .min_values(1), ) diff --git a/src/uu/ls/src/ls.rs b/src/uu/ls/src/ls.rs index 17eec91ec2f..20d960c511a 100644 --- a/src/uu/ls/src/ls.rs +++ b/src/uu/ls/src/ls.rs @@ -1402,7 +1402,8 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(options::PATHS) .multiple_occurrences(true) .takes_value(true) - .allow_invalid_utf8(true), + .value_hint(clap::ValueHint::AnyPath) + .allow_invalid_utf8(true) ) .after_help( "The TIME_STYLE argument can be full-iso, long-iso, iso. \ diff --git a/src/uu/mkdir/src/mkdir.rs b/src/uu/mkdir/src/mkdir.rs index b1d7583d32c..6ba58c2bbcf 100644 --- a/src/uu/mkdir/src/mkdir.rs +++ b/src/uu/mkdir/src/mkdir.rs @@ -137,7 +137,8 @@ pub fn uu_app<'a>() -> Command<'a> { .multiple_occurrences(true) .takes_value(true) .min_values(1) - .allow_invalid_utf8(true), + .allow_invalid_utf8(true) + .value_hint(clap::ValueHint::DirPath), ) } diff --git a/src/uu/mkfifo/src/mkfifo.rs b/src/uu/mkfifo/src/mkfifo.rs index 756fd75cfe6..b14ae8bedb6 100644 --- a/src/uu/mkfifo/src/mkfifo.rs +++ b/src/uu/mkfifo/src/mkfifo.rs @@ -102,6 +102,7 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new(options::FIFO) .hide(true) - .multiple_occurrences(true), + .multiple_occurrences(true) + .value_hint(clap::ValueHint::AnyPath), ) } diff --git a/src/uu/mknod/src/mknod.rs b/src/uu/mknod/src/mknod.rs index 0e7c4be45e5..fdd57aa01ed 100644 --- a/src/uu/mknod/src/mknod.rs +++ b/src/uu/mknod/src/mknod.rs @@ -162,7 +162,8 @@ pub fn uu_app<'a>() -> Command<'a> { .value_name("NAME") .help("name of the new file") .required(true) - .index(1), + .index(1) + .value_hint(clap::ValueHint::AnyPath), ) .arg( Arg::new("type") diff --git a/src/uu/mktemp/src/mktemp.rs b/src/uu/mktemp/src/mktemp.rs index 94def487456..20b95f009c0 100644 --- a/src/uu/mktemp/src/mktemp.rs +++ b/src/uu/mktemp/src/mktemp.rs @@ -202,7 +202,8 @@ pub fn uu_app<'a>() -> Command<'a> { be an absolute name; unlike with -t, TEMPLATE may contain \ slashes, but mktemp creates only the final component", ) - .value_name("DIR"), + .value_name("DIR") + .value_hint(clap::ValueHint::DirPath), ) .arg(Arg::new(OPT_T).short('t').help( "Generate a template (using the supplied prefix and TMPDIR (TMP on windows) if set) \ diff --git a/src/uu/more/src/more.rs b/src/uu/more/src/more.rs index ab94bd435c4..711d2b21416 100644 --- a/src/uu/more/src/more.rs +++ b/src/uu/more/src/more.rs @@ -183,7 +183,8 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(options::FILES) .required(false) .multiple_occurrences(true) - .help("Path to the files to be read"), + .help("Path to the files to be read") + .value_hint(clap::ValueHint::FilePath), ) } diff --git a/src/uu/mv/src/mv.rs b/src/uu/mv/src/mv.rs index 1c2390f8024..fa8284061b9 100644 --- a/src/uu/mv/src/mv.rs +++ b/src/uu/mv/src/mv.rs @@ -156,14 +156,15 @@ pub fn uu_app<'a>() -> Command<'a> { .help("move all SOURCE arguments into DIRECTORY") .takes_value(true) .value_name("DIRECTORY") + .value_hint(clap::ValueHint::DirPath) .conflicts_with(OPT_NO_TARGET_DIRECTORY) .allow_invalid_utf8(true) ) .arg( Arg::new(OPT_NO_TARGET_DIRECTORY) .short('T') - .long(OPT_NO_TARGET_DIRECTORY). - help("treat DEST as a normal file") + .long(OPT_NO_TARGET_DIRECTORY) + .help("treat DEST as a normal file") ) .arg( Arg::new(OPT_UPDATE) @@ -183,6 +184,7 @@ pub fn uu_app<'a>() -> Command<'a> { .min_values(2) .required(true) .allow_invalid_utf8(true) + .value_hint(clap::ValueHint::AnyPath) ) } diff --git a/src/uu/nice/src/nice.rs b/src/uu/nice/src/nice.rs index e78de828bc9..f0d663bccc3 100644 --- a/src/uu/nice/src/nice.rs +++ b/src/uu/nice/src/nice.rs @@ -117,5 +117,9 @@ pub fn uu_app<'a>() -> Command<'a> { .takes_value(true) .allow_hyphen_values(true), ) - .arg(Arg::new(options::COMMAND).multiple_occurrences(true)) + .arg( + Arg::new(options::COMMAND) + .multiple_occurrences(true) + .value_hint(clap::ValueHint::CommandName), + ) } diff --git a/src/uu/nl/src/nl.rs b/src/uu/nl/src/nl.rs index 28cf3fb4d0d..e6ca7f93141 100644 --- a/src/uu/nl/src/nl.rs +++ b/src/uu/nl/src/nl.rs @@ -154,7 +154,8 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new(options::FILE) .hide(true) - .multiple_occurrences(true), + .multiple_occurrences(true) + .value_hint(clap::ValueHint::FilePath), ) .arg( Arg::new(options::BODY_NUMBERING) diff --git a/src/uu/nohup/src/nohup.rs b/src/uu/nohup/src/nohup.rs index 0d67ad466ef..6f605ac4f5b 100644 --- a/src/uu/nohup/src/nohup.rs +++ b/src/uu/nohup/src/nohup.rs @@ -126,7 +126,8 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(options::CMD) .hide(true) .required(true) - .multiple_occurrences(true), + .multiple_occurrences(true) + .value_hint(clap::ValueHint::CommandName), ) .trailing_var_arg(true) .infer_long_args(true) diff --git a/src/uu/od/src/od.rs b/src/uu/od/src/od.rs index 33fac39d372..168213dae95 100644 --- a/src/uu/od/src/od.rs +++ b/src/uu/od/src/od.rs @@ -512,7 +512,8 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new(options::FILENAME) .hide(true) - .multiple_occurrences(true), + .multiple_occurrences(true) + .value_hint(clap::ValueHint::FilePath), ) } diff --git a/src/uu/paste/src/paste.rs b/src/uu/paste/src/paste.rs index 2826a19e354..682e66a5da9 100644 --- a/src/uu/paste/src/paste.rs +++ b/src/uu/paste/src/paste.rs @@ -71,7 +71,8 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(options::FILE) .value_name("FILE") .multiple_occurrences(true) - .default_value("-"), + .default_value("-") + .value_hint(clap::ValueHint::FilePath), ) } diff --git a/src/uu/pathchk/src/pathchk.rs b/src/uu/pathchk/src/pathchk.rs index 6260590aab5..0f21448cf88 100644 --- a/src/uu/pathchk/src/pathchk.rs +++ b/src/uu/pathchk/src/pathchk.rs @@ -108,7 +108,8 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new(options::PATH) .hide(true) - .multiple_occurrences(true), + .multiple_occurrences(true) + .value_hint(clap::ValueHint::AnyPath), ) } diff --git a/src/uu/pinky/src/pinky.rs b/src/uu/pinky/src/pinky.rs index 4a793944fc3..b5217afe4f9 100644 --- a/src/uu/pinky/src/pinky.rs +++ b/src/uu/pinky/src/pinky.rs @@ -179,7 +179,8 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new(options::USER) .takes_value(true) - .multiple_occurrences(true), + .multiple_occurrences(true) + .value_hint(clap::ValueHint::Username), ) .arg( // Redefine the help argument to not include the short flag diff --git a/src/uu/pr/src/pr.rs b/src/uu/pr/src/pr.rs index ca12f0be008..682e9b6d42e 100644 --- a/src/uu/pr/src/pr.rs +++ b/src/uu/pr/src/pr.rs @@ -372,6 +372,7 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(options::FILES) .multiple_occurrences(true) .multiple_values(true) + .value_hint(clap::ValueHint::FilePath) ) } diff --git a/src/uu/ptx/src/ptx.rs b/src/uu/ptx/src/ptx.rs index 2f253b58064..9cdad7ccf52 100644 --- a/src/uu/ptx/src/ptx.rs +++ b/src/uu/ptx/src/ptx.rs @@ -754,7 +754,8 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new(options::FILE) .hide(true) - .multiple_occurrences(true), + .multiple_occurrences(true) + .value_hint(clap::ValueHint::FilePath), ) .arg( Arg::new(options::AUTO_REFERENCE) @@ -826,7 +827,8 @@ pub fn uu_app<'a>() -> Command<'a> { .long(options::BREAK_FILE) .help("word break characters in this FILE") .value_name("FILE") - .takes_value(true), + .takes_value(true) + .value_hint(clap::ValueHint::FilePath), ) .arg( Arg::new(options::IGNORE_CASE) @@ -849,7 +851,8 @@ pub fn uu_app<'a>() -> Command<'a> { .long(options::IGNORE_FILE) .help("read ignore word list from FILE") .value_name("FILE") - .takes_value(true), + .takes_value(true) + .value_hint(clap::ValueHint::FilePath), ) .arg( Arg::new(options::ONLY_FILE) @@ -857,7 +860,8 @@ pub fn uu_app<'a>() -> Command<'a> { .long(options::ONLY_FILE) .help("read only word list from this FILE") .value_name("FILE") - .takes_value(true), + .takes_value(true) + .value_hint(clap::ValueHint::FilePath), ) .arg( Arg::new(options::REFERENCES) diff --git a/src/uu/readlink/src/readlink.rs b/src/uu/readlink/src/readlink.rs index ba1e368f26a..10d75e7ef71 100644 --- a/src/uu/readlink/src/readlink.rs +++ b/src/uu/readlink/src/readlink.rs @@ -161,7 +161,8 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new(ARG_FILES) .multiple_occurrences(true) - .takes_value(true), + .takes_value(true) + .value_hint(clap::ValueHint::AnyPath), ) } diff --git a/src/uu/realpath/src/realpath.rs b/src/uu/realpath/src/realpath.rs index bea89c19e95..403e7c456d2 100644 --- a/src/uu/realpath/src/realpath.rs +++ b/src/uu/realpath/src/realpath.rs @@ -130,7 +130,8 @@ pub fn uu_app<'a>() -> Command<'a> { .multiple_occurrences(true) .takes_value(true) .required(true) - .min_values(1), + .min_values(1) + .value_hint(clap::ValueHint::AnyPath), ) } diff --git a/src/uu/relpath/src/relpath.rs b/src/uu/relpath/src/relpath.rs index 2e45ce927b2..336e2192df3 100644 --- a/src/uu/relpath/src/relpath.rs +++ b/src/uu/relpath/src/relpath.rs @@ -87,6 +87,15 @@ pub fn uu_app<'a>() -> Command<'a> { .arg(Arg::new(options::DIR).short('d').takes_value(true).help( "If any of FROM and TO is not subpath of DIR, output absolute path instead of relative", )) - .arg(Arg::new(options::TO).required(true).takes_value(true)) - .arg(Arg::new(options::FROM).takes_value(true)) + .arg( + Arg::new(options::TO) + .required(true) + .takes_value(true) + .value_hint(clap::ValueHint::AnyPath), + ) + .arg( + Arg::new(options::FROM) + .takes_value(true) + .value_hint(clap::ValueHint::AnyPath), + ) } diff --git a/src/uu/rm/src/rm.rs b/src/uu/rm/src/rm.rs index 0701387d972..4f69c8fb153 100644 --- a/src/uu/rm/src/rm.rs +++ b/src/uu/rm/src/rm.rs @@ -227,6 +227,7 @@ pub fn uu_app<'a>() -> Command<'a> { .multiple_occurrences(true) .takes_value(true) .min_values(1) + .value_hint(clap::ValueHint::AnyPath) ) } diff --git a/src/uu/rmdir/src/rmdir.rs b/src/uu/rmdir/src/rmdir.rs index 127b8fcf91d..be4e537806d 100644 --- a/src/uu/rmdir/src/rmdir.rs +++ b/src/uu/rmdir/src/rmdir.rs @@ -197,6 +197,7 @@ pub fn uu_app<'a>() -> Command<'a> { .takes_value(true) .min_values(1) .required(true) - .allow_invalid_utf8(true), + .allow_invalid_utf8(true) + .value_hint(clap::ValueHint::DirPath), ) } diff --git a/src/uu/runcon/src/runcon.rs b/src/uu/runcon/src/runcon.rs index 8c20319be33..64df4f381d2 100644 --- a/src/uu/runcon/src/runcon.rs +++ b/src/uu/runcon/src/runcon.rs @@ -156,7 +156,8 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new("ARG") .multiple_occurrences(true) - .allow_invalid_utf8(true), + .allow_invalid_utf8(true) + .value_hint(clap::ValueHint::CommandName), ) // Once "ARG" is parsed, everything after that belongs to it. // diff --git a/src/uu/shred/src/shred.rs b/src/uu/shred/src/shred.rs index 05c8d18050e..7f1c97c771c 100644 --- a/src/uu/shred/src/shred.rs +++ b/src/uu/shred/src/shred.rs @@ -374,7 +374,8 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new(options::FILE) .hide(true) - .multiple_occurrences(true), + .multiple_occurrences(true) + .value_hint(clap::ValueHint::FilePath), ) } diff --git a/src/uu/shuf/src/shuf.rs b/src/uu/shuf/src/shuf.rs index 0b62ec84a11..6369fc9b5f6 100644 --- a/src/uu/shuf/src/shuf.rs +++ b/src/uu/shuf/src/shuf.rs @@ -158,14 +158,16 @@ pub fn uu_app<'a>() -> Command<'a> { .long(options::OUTPUT) .takes_value(true) .value_name("FILE") - .help("write result to FILE instead of standard output"), + .help("write result to FILE instead of standard output") + .value_hint(clap::ValueHint::FilePath), ) .arg( Arg::new(options::RANDOM_SOURCE) .long(options::RANDOM_SOURCE) .takes_value(true) .value_name("FILE") - .help("get random bytes from FILE"), + .help("get random bytes from FILE") + .value_hint(clap::ValueHint::FilePath), ) .arg( Arg::new(options::REPEAT) @@ -179,7 +181,11 @@ pub fn uu_app<'a>() -> Command<'a> { .long(options::ZERO_TERMINATED) .help("line delimiter is NUL, not newline"), ) - .arg(Arg::new(options::FILE).takes_value(true)) + .arg( + Arg::new(options::FILE) + .takes_value(true) + .value_hint(clap::ValueHint::FilePath), + ) } fn read_input_file(filename: &str) -> UResult> { diff --git a/src/uu/sort/src/sort.rs b/src/uu/sort/src/sort.rs index 141a7dd2cc0..15becdc6be7 100644 --- a/src/uu/sort/src/sort.rs +++ b/src/uu/sort/src/sort.rs @@ -1397,7 +1397,8 @@ pub fn uu_app<'a>() -> Command<'a> { .long(options::OUTPUT) .help("write output to FILENAME instead of stdout") .takes_value(true) - .value_name("FILENAME"), + .value_name("FILENAME") + .value_hint(clap::ValueHint::FilePath), ) .arg( Arg::new(options::REVERSE) @@ -1461,13 +1462,15 @@ pub fn uu_app<'a>() -> Command<'a> { .long(options::TMP_DIR) .help("use DIR for temporaries, not $TMPDIR or /tmp") .takes_value(true) - .value_name("DIR"), + .value_name("DIR") + .value_hint(clap::ValueHint::DirPath), ) .arg( Arg::new(options::COMPRESS_PROG) .long(options::COMPRESS_PROG) .help("compress temporary files with PROG, decompress with PROG -d; PROG has to take input from stdin and output to stdout") - .value_name("PROG"), + .value_name("PROG") + .value_hint(clap::ValueHint::CommandName), ) .arg( Arg::new(options::BATCH_SIZE) @@ -1482,7 +1485,8 @@ pub fn uu_app<'a>() -> Command<'a> { .takes_value(true) .value_name("NUL_FILES") .multiple_occurrences(true) - .allow_invalid_utf8(true), + .allow_invalid_utf8(true) + .value_hint(clap::ValueHint::FilePath), ) .arg( Arg::new(options::DEBUG) @@ -1493,7 +1497,8 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(options::FILES) .multiple_occurrences(true) .takes_value(true) - .allow_invalid_utf8(true), + .allow_invalid_utf8(true) + .value_hint(clap::ValueHint::FilePath), ) } diff --git a/src/uu/split/src/split.rs b/src/uu/split/src/split.rs index c90c7a6b261..03905e8770a 100644 --- a/src/uu/split/src/split.rs +++ b/src/uu/split/src/split.rs @@ -111,9 +111,11 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(OPT_FILTER) .long(OPT_FILTER) .takes_value(true) + .value_name("COMMAND") + .value_hint(clap::ValueHint::CommandName) .help( - "write to shell COMMAND file name is $FILE (Currently not implemented for Windows)", - ), + "write to shell COMMAND; file name is $FILE (Currently not implemented for Windows)", + ), ) .arg( Arg::new(OPT_ELIDE_EMPTY_FILES) @@ -162,7 +164,8 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(ARG_INPUT) .takes_value(true) .default_value("-") - .index(1), + .index(1) + .value_hint(clap::ValueHint::FilePath), ) .arg( Arg::new(ARG_PREFIX) diff --git a/src/uu/stat/src/stat.rs b/src/uu/stat/src/stat.rs index 41c9ae4a96e..e261ab813f0 100644 --- a/src/uu/stat/src/stat.rs +++ b/src/uu/stat/src/stat.rs @@ -1043,6 +1043,7 @@ pub fn uu_app<'a>() -> Command<'a> { .multiple_occurrences(true) .takes_value(true) .allow_invalid_utf8(true) - .min_values(1), + .min_values(1) + .value_hint(clap::ValueHint::FilePath), ) } diff --git a/src/uu/stdbuf/src/stdbuf.rs b/src/uu/stdbuf/src/stdbuf.rs index 816c8671799..e0025d9f118 100644 --- a/src/uu/stdbuf/src/stdbuf.rs +++ b/src/uu/stdbuf/src/stdbuf.rs @@ -232,6 +232,7 @@ pub fn uu_app<'a>() -> Command<'a> { .multiple_occurrences(true) .takes_value(true) .hide(true) - .required(true), + .required(true) + .value_hint(clap::ValueHint::CommandName), ) } diff --git a/src/uu/sum/src/sum.rs b/src/uu/sum/src/sum.rs index 5016359105f..9280fcf813f 100644 --- a/src/uu/sum/src/sum.rs +++ b/src/uu/sum/src/sum.rs @@ -150,7 +150,8 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new(options::FILE) .multiple_occurrences(true) - .hide(true), + .hide(true) + .value_hint(clap::ValueHint::FilePath), ) .arg( Arg::new(options::BSD_COMPATIBLE) diff --git a/src/uu/sync/src/sync.rs b/src/uu/sync/src/sync.rs index 9baf9b182d0..6f34c11b7af 100644 --- a/src/uu/sync/src/sync.rs +++ b/src/uu/sync/src/sync.rs @@ -217,7 +217,8 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new(ARG_FILES) .multiple_occurrences(true) - .takes_value(true), + .takes_value(true) + .value_hint(clap::ValueHint::AnyPath), ) } diff --git a/src/uu/tac/src/tac.rs b/src/uu/tac/src/tac.rs index 3151b97e22c..62d578ee957 100644 --- a/src/uu/tac/src/tac.rs +++ b/src/uu/tac/src/tac.rs @@ -91,7 +91,8 @@ pub fn uu_app<'a>() -> Command<'a> { .arg( Arg::new(options::FILE) .hide(true) - .multiple_occurrences(true), + .multiple_occurrences(true) + .value_hint(clap::ValueHint::FilePath), ) } diff --git a/src/uu/tail/src/tail.rs b/src/uu/tail/src/tail.rs index 96b6daf79f6..8f5a62e6148 100644 --- a/src/uu/tail/src/tail.rs +++ b/src/uu/tail/src/tail.rs @@ -351,7 +351,8 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(options::ARG_FILES) .multiple_occurrences(true) .takes_value(true) - .min_values(1), + .min_values(1) + .value_hint(clap::ValueHint::FilePath), ) } diff --git a/src/uu/tee/src/tee.rs b/src/uu/tee/src/tee.rs index d9c2e78f1b0..7b6b6620840 100644 --- a/src/uu/tee/src/tee.rs +++ b/src/uu/tee/src/tee.rs @@ -74,7 +74,11 @@ pub fn uu_app<'a>() -> Command<'a> { .short('i') .help("ignore interrupt signals (ignored on non-Unix platforms)"), ) - .arg(Arg::new(options::FILE).multiple_occurrences(true)) + .arg( + Arg::new(options::FILE) + .multiple_occurrences(true) + .value_hint(clap::ValueHint::FilePath), + ) } #[cfg(unix)] diff --git a/src/uu/timeout/src/timeout.rs b/src/uu/timeout/src/timeout.rs index 8374c124c31..baafce4df99 100644 --- a/src/uu/timeout/src/timeout.rs +++ b/src/uu/timeout/src/timeout.rs @@ -170,6 +170,7 @@ pub fn uu_app<'a>() -> Command<'a> { .index(2) .required(true) .multiple_occurrences(true) + .value_hint(clap::ValueHint::CommandName) ) .trailing_var_arg(true) .infer_long_args(true) diff --git a/src/uu/touch/src/touch.rs b/src/uu/touch/src/touch.rs index f71eb81d01b..c250953bc7f 100644 --- a/src/uu/touch/src/touch.rs +++ b/src/uu/touch/src/touch.rs @@ -219,7 +219,8 @@ pub fn uu_app<'a>() -> Command<'a> { .long(options::sources::REFERENCE) .help("use this file's times instead of the current time") .value_name("FILE") - .allow_invalid_utf8(true), + .allow_invalid_utf8(true) + .value_hint(clap::ValueHint::AnyPath), ) .arg( Arg::new(options::TIME) @@ -238,7 +239,8 @@ pub fn uu_app<'a>() -> Command<'a> { .multiple_occurrences(true) .takes_value(true) .min_values(1) - .allow_invalid_utf8(true), + .allow_invalid_utf8(true) + .value_hint(clap::ValueHint::AnyPath), ) .group(ArgGroup::new(options::SOURCES).args(&[ options::sources::CURRENT, diff --git a/src/uu/truncate/src/truncate.rs b/src/uu/truncate/src/truncate.rs index 6c9d8197be4..b3110dcc1ce 100644 --- a/src/uu/truncate/src/truncate.rs +++ b/src/uu/truncate/src/truncate.rs @@ -162,6 +162,7 @@ pub fn uu_app<'a>() -> Command<'a> { .required_unless_present(options::SIZE) .help("base the size of each file on the size of RFILE") .value_name("RFILE") + .value_hint(clap::ValueHint::FilePath) ) .arg( Arg::new(options::SIZE) @@ -176,7 +177,8 @@ pub fn uu_app<'a>() -> Command<'a> { .multiple_occurrences(true) .takes_value(true) .required(true) - .min_values(1)) + .min_values(1) + .value_hint(clap::ValueHint::FilePath)) } /// Truncate the named file to the specified size. diff --git a/src/uu/tsort/src/tsort.rs b/src/uu/tsort/src/tsort.rs index aecd492fe26..72b8843e5b6 100644 --- a/src/uu/tsort/src/tsort.rs +++ b/src/uu/tsort/src/tsort.rs @@ -99,7 +99,12 @@ pub fn uu_app<'a>() -> Command<'a> { .override_usage(format_usage(USAGE)) .about(SUMMARY) .infer_long_args(true) - .arg(Arg::new(options::FILE).default_value("-").hide(true)) + .arg( + Arg::new(options::FILE) + .default_value("-") + .hide(true) + .value_hint(clap::ValueHint::FilePath), + ) } // We use String as a representation of node here diff --git a/src/uu/unexpand/src/unexpand.rs b/src/uu/unexpand/src/unexpand.rs index 70a763f3b91..0ebfea6134d 100644 --- a/src/uu/unexpand/src/unexpand.rs +++ b/src/uu/unexpand/src/unexpand.rs @@ -109,7 +109,12 @@ pub fn uu_app<'a>() -> Command<'a> { .override_usage(format_usage(USAGE)) .about(SUMMARY) .infer_long_args(true) - .arg(Arg::new(options::FILE).hide(true).multiple_occurrences(true)) + .arg( + Arg::new(options::FILE) + .hide(true) + .multiple_occurrences(true) + .value_hint(clap::ValueHint::FilePath) + ) .arg( Arg::new(options::ALL) .short('a') diff --git a/src/uu/uniq/src/uniq.rs b/src/uu/uniq/src/uniq.rs index 32e0783ce88..e71c21303da 100644 --- a/src/uu/uniq/src/uniq.rs +++ b/src/uu/uniq/src/uniq.rs @@ -392,7 +392,8 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(ARG_FILES) .multiple_occurrences(true) .takes_value(true) - .max_values(2), + .max_values(2) + .value_hint(clap::ValueHint::FilePath), ) } diff --git a/src/uu/unlink/src/unlink.rs b/src/uu/unlink/src/unlink.rs index fc72b46239b..890935f1a06 100644 --- a/src/uu/unlink/src/unlink.rs +++ b/src/uu/unlink/src/unlink.rs @@ -36,6 +36,7 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(OPT_PATH) .required(true) .hide(true) - .allow_invalid_utf8(true), + .allow_invalid_utf8(true) + .value_hint(clap::ValueHint::AnyPath), ) } diff --git a/src/uu/users/src/users.rs b/src/uu/users/src/users.rs index 79fac3b68be..b1785d6085c 100644 --- a/src/uu/users/src/users.rs +++ b/src/uu/users/src/users.rs @@ -64,5 +64,10 @@ pub fn uu_app<'a>() -> Command<'a> { .about(ABOUT) .override_usage(format_usage(USAGE)) .infer_long_args(true) - .arg(Arg::new(ARG_FILES).takes_value(true).max_values(1)) + .arg( + Arg::new(ARG_FILES) + .takes_value(true) + .max_values(1) + .value_hint(clap::ValueHint::FilePath), + ) } diff --git a/src/uu/wc/src/wc.rs b/src/uu/wc/src/wc.rs index 968830c4898..ba7c4c1af19 100644 --- a/src/uu/wc/src/wc.rs +++ b/src/uu/wc/src/wc.rs @@ -210,7 +210,8 @@ pub fn uu_app<'a>() -> Command<'a> { "read input from the files specified by NUL-terminated names in file F; If F is - then read names from standard input", - ), + ) + .value_hint(clap::ValueHint::FilePath), ) .arg( Arg::new(options::LINES) @@ -234,7 +235,8 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(ARG_FILES) .multiple_occurrences(true) .takes_value(true) - .allow_invalid_utf8(true), + .allow_invalid_utf8(true) + .value_hint(clap::ValueHint::FilePath), ) } diff --git a/src/uu/who/src/who.rs b/src/uu/who/src/who.rs index 47d96a38189..6c07039d2d4 100644 --- a/src/uu/who/src/who.rs +++ b/src/uu/who/src/who.rs @@ -250,7 +250,8 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(options::FILE) .takes_value(true) .min_values(1) - .max_values(2), + .max_values(2) + .value_hint(clap::ValueHint::FilePath), ) } diff --git a/src/uucore/src/lib/features/perms.rs b/src/uucore/src/lib/features/perms.rs index d8e3453137a..df37e5a69f5 100644 --- a/src/uucore/src/lib/features/perms.rs +++ b/src/uucore/src/lib/features/perms.rs @@ -456,6 +456,7 @@ pub fn chown_base<'a>( command = command.arg( Arg::new(options::ARG_FILES) .value_name(options::ARG_FILES) + .value_hint(clap::ValueHint::FilePath) .multiple_occurrences(true) .takes_value(true) .required(true) From 996a84cb6f298b9a35f5a5d0ec40f73a8789a205 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Thu, 12 May 2022 09:09:10 +0200 Subject: [PATCH 220/242] df: round up values if block size is specified Fixes #3479 --- src/uu/df/src/table.rs | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/uu/df/src/table.rs b/src/uu/df/src/table.rs index a9a37cfeb55..fac2ca66395 100644 --- a/src/uu/df/src/table.rs +++ b/src/uu/df/src/table.rs @@ -233,7 +233,7 @@ impl<'a> RowFormatter<'a> { SizeFormat::HumanReadable(h) => self.scaled_human_readable(size, h), SizeFormat::StaticBlockSize => { let BlockSize::Bytes(d) = self.options.block_size; - (size / d).to_string() + (size as f64 / d as f64).ceil().to_string() } } } @@ -793,4 +793,28 @@ mod tests { let fmt = RowFormatter::new(&row, &options); assert_eq!(fmt.get_values(), vec!("26%")); } + + #[test] + fn test_row_formatter_with_round_up_byte_values() { + fn get_formatted_values(bytes: u64, bytes_used: u64, bytes_avail: u64) -> Vec { + let options = Options { + block_size: BlockSize::Bytes(1000), + columns: vec![Column::Size, Column::Used, Column::Avail], + ..Default::default() + }; + + let row = Row { + bytes, + bytes_used, + bytes_avail, + ..Default::default() + }; + RowFormatter::new(&row, &options).get_values() + } + + assert_eq!(get_formatted_values(100, 100, 0), vec!("1", "1", "0")); + assert_eq!(get_formatted_values(100, 99, 1), vec!("1", "1", "1")); + assert_eq!(get_formatted_values(1000, 1000, 0), vec!("1", "1", "0")); + assert_eq!(get_formatted_values(1001, 1000, 1), vec!("2", "1", "1")); + } } From 896bbec76003656db74e6a3a0fe107ff0828bdce Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Fri, 13 May 2022 22:47:56 -0400 Subject: [PATCH 221/242] all: clippy fixes --- src/uu/fold/src/fold.rs | 2 +- src/uu/head/src/parse.rs | 2 +- src/uu/ls/src/ls.rs | 6 +++--- src/uu/numfmt/src/format.rs | 2 +- src/uu/od/src/od.rs | 13 +++++++++---- src/uu/od/src/parse_formats.rs | 2 +- src/uu/od/src/parse_inputs.rs | 2 +- src/uu/ptx/src/ptx.rs | 26 +++++++++++++------------ src/uu/sort/src/sort.rs | 4 ++-- src/uu/stat/src/stat.rs | 4 ++-- src/uu/stdbuf/src/stdbuf.rs | 2 +- src/uu/tail/src/parse.rs | 2 +- src/uu/tsort/src/tsort.rs | 6 +----- src/uu/who/src/who.rs | 15 +++++++------- src/uucore/src/lib/parser/parse_size.rs | 2 +- tests/by-util/test_ls.rs | 2 +- 16 files changed, 48 insertions(+), 44 deletions(-) diff --git a/src/uu/fold/src/fold.rs b/src/uu/fold/src/fold.rs index d24d31be975..254d90d27ee 100644 --- a/src/uu/fold/src/fold.rs +++ b/src/uu/fold/src/fold.rs @@ -106,7 +106,7 @@ pub fn uu_app<'a>() -> Command<'a> { fn handle_obsolete(args: &[String]) -> (Vec, Option) { for (i, arg) in args.iter().enumerate() { let slice = &arg; - if slice.starts_with('-') && slice.chars().nth(1).map_or(false, |c| c.is_digit(10)) { + if slice.starts_with('-') && slice.chars().nth(1).map_or(false, |c| c.is_ascii_digit()) { let mut v = args.to_vec(); v.remove(i); return (v, Some(slice[1..].to_owned())); diff --git a/src/uu/head/src/parse.rs b/src/uu/head/src/parse.rs index ee543fe065e..ea731ba2902 100644 --- a/src/uu/head/src/parse.rs +++ b/src/uu/head/src/parse.rs @@ -20,7 +20,7 @@ pub fn parse_obsolete(src: &str) -> Option let mut has_num = false; let mut last_char = 0 as char; for (n, c) in &mut chars { - if c.is_digit(10) { + if c.is_ascii_digit() { has_num = true; num_end = n; } else { diff --git a/src/uu/ls/src/ls.rs b/src/uu/ls/src/ls.rs index 17eec91ec2f..e189728e4c9 100644 --- a/src/uu/ls/src/ls.rs +++ b/src/uu/ls/src/ls.rs @@ -28,7 +28,7 @@ use std::{ cmp::Reverse, error::Error, ffi::{OsStr, OsString}, - fmt::Display, + fmt::{Display, Write as FmtWrite}, fs::{self, DirEntry, FileType, Metadata, ReadDir}, io::{stdout, BufWriter, ErrorKind, Stdout, Write}, path::{Path, PathBuf}, @@ -1825,7 +1825,7 @@ fn display_additional_leading_info( } else { "?".to_owned() }; - result.push_str(&format!("{} ", pad_left(&i, padding.inode))); + write!(result, "{} ", pad_left(&i, padding.inode)).unwrap(); } } @@ -1835,7 +1835,7 @@ fn display_additional_leading_info( } else { "?".to_owned() }; - result.push_str(&format!("{} ", pad_left(&s, padding.block_size),)); + write!(result, "{} ", pad_left(&s, padding.block_size)).unwrap(); } Ok(result) } diff --git a/src/uu/numfmt/src/format.rs b/src/uu/numfmt/src/format.rs index f66e1ac0aa2..97f00b3c8bf 100644 --- a/src/uu/numfmt/src/format.rs +++ b/src/uu/numfmt/src/format.rs @@ -244,7 +244,7 @@ fn format_string( p => format!( "{:width$}", "", width = f.spacing[b % output_info.byte_size_block] - )); + ) + .unwrap(); match f.formatter_item_info.formatter { FormatWriter::IntWriter(func) => { @@ -626,12 +629,14 @@ fn print_bytes(prefix: &str, input_decoder: &MemoryDecoder, output_info: &Output let missing_spacing = output_info .print_width_line .saturating_sub(output_text.chars().count()); - output_text.push_str(&format!( + write!( + output_text, "{:>width$} {}", "", format_ascii_dump(input_decoder.get_buffer(0)), width = missing_spacing - )); + ) + .unwrap(); } if first { diff --git a/src/uu/od/src/parse_formats.rs b/src/uu/od/src/parse_formats.rs index 21971445ddf..f9f473dc806 100644 --- a/src/uu/od/src/parse_formats.rs +++ b/src/uu/od/src/parse_formats.rs @@ -244,7 +244,7 @@ fn is_format_size_decimal( return false; } match ch { - Some(d) if d.is_digit(10) => { + Some(d) if d.is_ascii_digit() => { decimal_size.push(d); true } diff --git a/src/uu/od/src/parse_inputs.rs b/src/uu/od/src/parse_inputs.rs index 45e664ce357..80b0d974f04 100644 --- a/src/uu/od/src/parse_inputs.rs +++ b/src/uu/od/src/parse_inputs.rs @@ -10,7 +10,7 @@ pub trait CommandLineOpts { } /// Implementation for `getopts` -impl<'a> CommandLineOpts for ArgMatches { +impl CommandLineOpts for ArgMatches { fn inputs(&self) -> Vec<&str> { self.values_of(options::FILENAME) .map(|values| values.collect()) diff --git a/src/uu/ptx/src/ptx.rs b/src/uu/ptx/src/ptx.rs index 2f253b58064..40fe3421883 100644 --- a/src/uu/ptx/src/ptx.rs +++ b/src/uu/ptx/src/ptx.rs @@ -13,7 +13,7 @@ use std::cmp; use std::collections::{BTreeSet, HashMap, HashSet}; use std::default::Default; use std::error::Error; -use std::fmt::{Display, Formatter}; +use std::fmt::{Display, Formatter, Write as FmtWrite}; use std::fs::File; use std::io::{stdin, stdout, BufRead, BufReader, BufWriter, Read, Write}; use std::num::ParseIntError; @@ -572,7 +572,7 @@ fn format_tex_line( reference: &str, ) -> String { let mut output = String::new(); - output.push_str(&format!("\\{} ", config.macro_name)); + write!(output, "\\{} ", config.macro_name).unwrap(); let all_before = if config.input_ref { let before = &line[0..word_ref.position]; let before_start_trim_offset = @@ -587,18 +587,18 @@ fn format_tex_line( let after_chars_trim_idx = (word_ref.position_end, chars_line.len()); let all_after = &chars_line[after_chars_trim_idx.0..after_chars_trim_idx.1]; let (tail, before, after, head) = get_output_chunks(all_before, keyword, all_after, config); - output.push_str(&format!( - "{5}{0}{6}{5}{1}{6}{5}{2}{6}{5}{3}{6}{5}{4}{6}", + write!( + output, + "{{{0}}}{{{1}}}{{{2}}}{{{3}}}{{{4}}}", format_tex_field(&tail), format_tex_field(&before), format_tex_field(keyword), format_tex_field(&after), format_tex_field(&head), - "{", - "}" - )); + ) + .unwrap(); if config.auto_ref || config.input_ref { - output.push_str(&format!("{}{}{}", "{", format_tex_field(reference), "}")); + write!(output, "{{{}}}", format_tex_field(reference)).unwrap(); } output } @@ -615,7 +615,7 @@ fn format_roff_line( reference: &str, ) -> String { let mut output = String::new(); - output.push_str(&format!(".{}", config.macro_name)); + write!(output, ".{}", config.macro_name).unwrap(); let all_before = if config.input_ref { let before = &line[0..word_ref.position]; let before_start_trim_offset = @@ -630,16 +630,18 @@ fn format_roff_line( let after_chars_trim_idx = (word_ref.position_end, chars_line.len()); let all_after = &chars_line[after_chars_trim_idx.0..after_chars_trim_idx.1]; let (tail, before, after, head) = get_output_chunks(all_before, keyword, all_after, config); - output.push_str(&format!( + write!( + output, " \"{}\" \"{}\" \"{}{}\" \"{}\"", format_roff_field(&tail), format_roff_field(&before), format_roff_field(keyword), format_roff_field(&after), format_roff_field(&head) - )); + ) + .unwrap(); if config.auto_ref || config.input_ref { - output.push_str(&format!(" \"{}\"", format_roff_field(reference))); + write!(output, " \"{}\"", format_roff_field(reference)).unwrap(); } output } diff --git a/src/uu/sort/src/sort.rs b/src/uu/sort/src/sort.rs index 141a7dd2cc0..3b423f4af57 100644 --- a/src/uu/sort/src/sort.rs +++ b/src/uu/sort/src/sort.rs @@ -348,9 +348,9 @@ impl GlobalSettings { ]; let mut size_string = input.trim().to_string(); - if size_string.ends_with(|c: char| ALLOW_LIST.contains(&c) || c.is_digit(10)) { + if size_string.ends_with(|c: char| ALLOW_LIST.contains(&c) || c.is_ascii_digit()) { // b 1, K 1024 (default) - if size_string.ends_with(|c: char| c.is_digit(10)) { + if size_string.ends_with(|c: char| c.is_ascii_digit()) { size_string.push('K'); } else if size_string.ends_with('b') { size_string.pop(); diff --git a/src/uu/stat/src/stat.rs b/src/uu/stat/src/stat.rs index 41c9ae4a96e..3a585b10611 100644 --- a/src/uu/stat/src/stat.rs +++ b/src/uu/stat/src/stat.rs @@ -197,8 +197,8 @@ impl ScanUtil for str { pub fn group_num(s: &str) -> Cow { let is_negative = s.starts_with('-'); - assert!(is_negative || s.chars().take(1).all(|c| c.is_digit(10))); - assert!(s.chars().skip(1).all(|c| c.is_digit(10))); + assert!(is_negative || s.chars().take(1).all(|c| c.is_ascii_digit())); + assert!(s.chars().skip(1).all(|c| c.is_ascii_digit())); if s.len() < 4 { return s.into(); } diff --git a/src/uu/stdbuf/src/stdbuf.rs b/src/uu/stdbuf/src/stdbuf.rs index 816c8671799..3250ea3f8ad 100644 --- a/src/uu/stdbuf/src/stdbuf.rs +++ b/src/uu/stdbuf/src/stdbuf.rs @@ -62,7 +62,7 @@ struct ProgramOptions { stderr: BufferType, } -impl<'a> TryFrom<&ArgMatches> for ProgramOptions { +impl TryFrom<&ArgMatches> for ProgramOptions { type Error = ProgramOptionsError; fn try_from(matches: &ArgMatches) -> Result { diff --git a/src/uu/tail/src/parse.rs b/src/uu/tail/src/parse.rs index ea9df9a02c5..d524adbc107 100644 --- a/src/uu/tail/src/parse.rs +++ b/src/uu/tail/src/parse.rs @@ -19,7 +19,7 @@ pub fn parse_obsolete(src: &str) -> Option let mut has_num = false; let mut last_char = 0 as char; for (n, c) in &mut chars { - if c.is_digit(10) { + if c.is_ascii_digit() { has_num = true; num_end = n; } else { diff --git a/src/uu/tsort/src/tsort.rs b/src/uu/tsort/src/tsort.rs index aecd492fe26..27b0ebb5673 100644 --- a/src/uu/tsort/src/tsort.rs +++ b/src/uu/tsort/src/tsort.rs @@ -50,11 +50,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { let mut line = String::new(); match reader.read_line(&mut line) { Ok(_) => { - let tokens: Vec = line - .trim_end() - .split_whitespace() - .map(|s| s.to_owned()) - .collect(); + let tokens: Vec = line.split_whitespace().map(|s| s.to_owned()).collect(); if tokens.is_empty() { break; } diff --git a/src/uu/who/src/who.rs b/src/uu/who/src/who.rs index 47d96a38189..15190af0755 100644 --- a/src/uu/who/src/who.rs +++ b/src/uu/who/src/who.rs @@ -15,6 +15,7 @@ use uucore::utmpx::{self, time, Utmpx}; use clap::{crate_version, Arg, Command}; use std::borrow::Cow; use std::ffi::CStr; +use std::fmt::Write; use std::os::unix::fs::MetadataExt; use std::path::PathBuf; use uucore::{format_usage, InvalidEncodingHandling}; @@ -528,24 +529,24 @@ impl Who { let mut buf = String::with_capacity(64); let msg = vec![' ', state].into_iter().collect::(); - buf.push_str(&format!("{:<8}", user)); + write!(buf, "{:<8}", user).unwrap(); if self.include_mesg { buf.push_str(&msg); } - buf.push_str(&format!(" {:<12}", line)); + write!(buf, " {:<12}", line).unwrap(); // "%b %e %H:%M" (LC_ALL=C) let time_size = 3 + 2 + 2 + 1 + 2; - buf.push_str(&format!(" {:<1$}", time, time_size)); + write!(buf, " {:<1$}", time, time_size).unwrap(); if !self.short_output { if self.include_idle { - buf.push_str(&format!(" {:<6}", idle)); + write!(buf, " {:<6}", idle).unwrap(); } - buf.push_str(&format!(" {:>10}", pid)); + write!(buf, " {:>10}", pid).unwrap(); } - buf.push_str(&format!(" {:<8}", comment)); + write!(buf, " {:<8}", comment).unwrap(); if self.include_exit { - buf.push_str(&format!(" {:<12}", exit)); + write!(buf, " {:<12}", exit).unwrap(); } println!("{}", buf.trim_end()); } diff --git a/src/uucore/src/lib/parser/parse_size.rs b/src/uucore/src/lib/parser/parse_size.rs index 28a898825bf..de316c3d2dc 100644 --- a/src/uucore/src/lib/parser/parse_size.rs +++ b/src/uucore/src/lib/parser/parse_size.rs @@ -38,7 +38,7 @@ pub fn parse_size(size: &str) -> Result { } // Get the numeric part of the size argument. For example, if the // argument is "123K", then the numeric part is "123". - let numeric_string: String = size.chars().take_while(|c| c.is_digit(10)).collect(); + let numeric_string: String = size.chars().take_while(|c| c.is_ascii_digit()).collect(); let number: u64 = if !numeric_string.is_empty() { match numeric_string.parse() { Ok(n) => n, diff --git a/tests/by-util/test_ls.rs b/tests/by-util/test_ls.rs index 72217a403bd..7b0390e70b1 100644 --- a/tests/by-util/test_ls.rs +++ b/tests/by-util/test_ls.rs @@ -2840,7 +2840,7 @@ fn test_ls_context2() { let ts = TestScenario::new(util_name!()); for c_flag in ["-Z", "--context"] { ts.ucmd() - .args(&[c_flag, &"/"]) + .args(&[c_flag, "/"]) .succeeds() .stdout_only(unwrap_or_return!(expected_result(&ts, &[c_flag, "/"])).stdout_str()); } From 530d5f6dbfc1edaa5efaa85884db8749ffabd876 Mon Sep 17 00:00:00 2001 From: ilkecan Date: Sat, 14 May 2022 03:00:29 +0000 Subject: [PATCH 222/242] mv: allow a single source with --target-directory --- src/uu/mv/src/mv.rs | 31 ++++++++++++++++++++++--------- tests/by-util/test_mv.rs | 14 ++++++++++++++ 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/uu/mv/src/mv.rs b/src/uu/mv/src/mv.rs index 1c2390f8024..b6a6712de9c 100644 --- a/src/uu/mv/src/mv.rs +++ b/src/uu/mv/src/mv.rs @@ -13,7 +13,7 @@ mod error; #[macro_use] extern crate uucore; -use clap::{crate_version, Arg, ArgMatches, Command}; +use clap::{crate_version, Arg, ArgMatches, Command, ErrorKind}; use std::env; use std::ffi::OsString; use std::fs; @@ -70,13 +70,26 @@ static ARG_FILES: &str = "files"; #[uucore::main] pub fn uumain(args: impl uucore::Args) -> UResult<()> { - let matches = uu_app() - .after_help(&*format!( - "{}\n{}", - LONG_HELP, - backup_control::BACKUP_CONTROL_LONG_HELP - )) - .get_matches_from(args); + let help = format!( + "{}\n{}", + LONG_HELP, + backup_control::BACKUP_CONTROL_LONG_HELP + ); + let mut app = uu_app().after_help(&*help); + let matches = app + .try_get_matches_from_mut(args) + .unwrap_or_else(|e| e.exit()); + + if !matches.is_present(OPT_TARGET_DIRECTORY) && matches.occurrences_of(ARG_FILES) == 1 { + app.error( + ErrorKind::TooFewValues, + format!( + "The argument '<{}>...' requires at least 2 values, but only 1 was provided", + ARG_FILES + ), + ) + .exit(); + } let files: Vec = matches .values_of_os(ARG_FILES) @@ -180,7 +193,7 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(ARG_FILES) .multiple_occurrences(true) .takes_value(true) - .min_values(2) + .min_values(1) .required(true) .allow_invalid_utf8(true) ) diff --git a/tests/by-util/test_mv.rs b/tests/by-util/test_mv.rs index 06f4d5259a7..96bd96856c5 100644 --- a/tests/by-util/test_mv.rs +++ b/tests/by-util/test_mv.rs @@ -641,6 +641,20 @@ fn test_mv_target_dir() { assert!(at.file_exists(&format!("{}/{}", dir, file_b))); } +#[test] +fn test_mv_target_dir_single_source() { + let (at, mut ucmd) = at_and_ucmd!(); + let dir = "test_mv_target_dir_single_source_dir"; + let file = "test_mv_target_dir_single_source_file"; + + at.touch(file); + at.mkdir(dir); + ucmd.arg("-t").arg(dir).arg(file).succeeds().no_stderr(); + + assert!(!at.file_exists(file)); + assert!(at.file_exists(&format!("{}/{}", dir, file))); +} + #[test] fn test_mv_overwrite_dir() { let (at, mut ucmd) = at_and_ucmd!(); From 576aafb00f5e8cfd9d294578412b594734f84820 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Sun, 15 May 2022 16:25:17 +0200 Subject: [PATCH 223/242] df: fix incorrect rounding of size header --- src/uu/df/src/blocks.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/uu/df/src/blocks.rs b/src/uu/df/src/blocks.rs index 594c18acc05..88190b5c187 100644 --- a/src/uu/df/src/blocks.rs +++ b/src/uu/df/src/blocks.rs @@ -99,7 +99,7 @@ fn to_magnitude_and_suffix_not_powers_of_1024(n: u128) -> Result { if rem % (SI_BASES[i] / 10) == 0 { Ok(format!("{}.{}{}", quot, tenths_place, suffix)) - } else if tenths_place + 1 == 10 { + } else if tenths_place + 1 == 10 || quot >= 10 { Ok(format!("{}{}", quot + 1, suffix)) } else { Ok(format!("{}.{}{}", quot, tenths_place + 1, suffix)) @@ -245,6 +245,7 @@ mod tests { assert_eq!(to_magnitude_and_suffix(1001).unwrap(), "1.1kB"); assert_eq!(to_magnitude_and_suffix(1023).unwrap(), "1.1kB"); assert_eq!(to_magnitude_and_suffix(1025).unwrap(), "1.1kB"); + assert_eq!(to_magnitude_and_suffix(10_001).unwrap(), "11kB"); assert_eq!(to_magnitude_and_suffix(999_000).unwrap(), "999kB"); assert_eq!(to_magnitude_and_suffix(999_001).unwrap(), "1MB"); From 9090457f029b0b168f41c3aa1660887c4c1de3b6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 May 2022 07:01:00 +0000 Subject: [PATCH 224/242] build(deps): bump lscolors from 0.9.0 to 0.10.0 Bumps [lscolors](https://github.com/sharkdp/lscolors) from 0.9.0 to 0.10.0. - [Release notes](https://github.com/sharkdp/lscolors/releases) - [Commits](https://github.com/sharkdp/lscolors/compare/v0.9.0...v0.10.0) --- updated-dependencies: - dependency-name: lscolors dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- src/uu/ls/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 537e34e2627..3051c2af440 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1055,9 +1055,9 @@ dependencies = [ [[package]] name = "lscolors" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e9323b3525d4efad2dead1837a105e313253bfdbad1d470994038eededa4d62" +checksum = "88e4434edeec6cd16a7e8e13569af4568a66fcd6d79abd8696db22dd95f920e6" dependencies = [ "ansi_term", ] diff --git a/src/uu/ls/Cargo.toml b/src/uu/ls/Cargo.toml index ec092d06af5..ddb6f15d392 100644 --- a/src/uu/ls/Cargo.toml +++ b/src/uu/ls/Cargo.toml @@ -22,7 +22,7 @@ number_prefix = "0.4" term_grid = "0.1.5" termsize = "0.1.6" glob = "0.3.0" -lscolors = { version = "0.9.0", features = ["ansi_term"] } +lscolors = { version = "0.10.0", features = ["ansi_term"] } uucore = { version = ">=0.0.8", package = "uucore", path = "../../uucore", features = ["entries", "fs"] } once_cell = "1.10.0" atty = "0.2" From a79d2263dd4a2a48569c381beb59f387809fde12 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 May 2022 07:01:16 +0000 Subject: [PATCH 225/242] build(deps): bump rayon from 1.5.2 to 1.5.3 Bumps [rayon](https://github.com/rayon-rs/rayon) from 1.5.2 to 1.5.3. - [Release notes](https://github.com/rayon-rs/rayon/releases) - [Changelog](https://github.com/rayon-rs/rayon/blob/master/RELEASES.md) - [Commits](https://github.com/rayon-rs/rayon/compare/v1.5.2...v1.5.3) --- updated-dependencies: - dependency-name: rayon dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 537e34e2627..ff7739f049a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1530,9 +1530,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.5.2" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd249e82c21598a9a426a4e00dd7adc1d640b22445ec8545feef801d1a74c221" +checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" dependencies = [ "autocfg", "crossbeam-deque", From cd743c2fd1ce94487bcb538858c9719fa0df44cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 May 2022 07:13:42 +0000 Subject: [PATCH 226/242] build(deps): bump libc from 0.2.125 to 0.2.126 Bumps [libc](https://github.com/rust-lang/libc) from 0.2.125 to 0.2.126. - [Release notes](https://github.com/rust-lang/libc/releases) - [Commits](https://github.com/rust-lang/libc/compare/0.2.125...0.2.126) --- updated-dependencies: - dependency-name: libc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- src/uu/chmod/Cargo.toml | 2 +- src/uu/cp/Cargo.toml | 2 +- src/uu/hostid/Cargo.toml | 2 +- src/uu/kill/Cargo.toml | 2 +- src/uu/logname/Cargo.toml | 2 +- src/uu/mkfifo/Cargo.toml | 2 +- src/uu/mknod/Cargo.toml | 2 +- src/uu/nice/Cargo.toml | 2 +- src/uu/nohup/Cargo.toml | 2 +- src/uu/nproc/Cargo.toml | 2 +- src/uu/pathchk/Cargo.toml | 2 +- src/uu/rmdir/Cargo.toml | 2 +- src/uu/sync/Cargo.toml | 2 +- src/uu/tail/Cargo.toml | 2 +- src/uu/tee/Cargo.toml | 2 +- src/uu/test/Cargo.toml | 2 +- src/uu/timeout/Cargo.toml | 2 +- src/uu/tty/Cargo.toml | 2 +- src/uu/whoami/Cargo.toml | 2 +- src/uucore/Cargo.toml | 2 +- 21 files changed, 24 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 537e34e2627..405b46f4f53 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1021,9 +1021,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.125" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] name = "libloading" @@ -1530,9 +1530,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.5.2" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd249e82c21598a9a426a4e00dd7adc1d640b22445ec8545feef801d1a74c221" +checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" dependencies = [ "autocfg", "crossbeam-deque", diff --git a/src/uu/chmod/Cargo.toml b/src/uu/chmod/Cargo.toml index df0b089fad8..9a99f0d19f2 100644 --- a/src/uu/chmod/Cargo.toml +++ b/src/uu/chmod/Cargo.toml @@ -16,7 +16,7 @@ path = "src/chmod.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.125" +libc = "0.2.126" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["fs", "mode"] } [[bin]] diff --git a/src/uu/cp/Cargo.toml b/src/uu/cp/Cargo.toml index 3f3c2e317f8..c676204b4f2 100644 --- a/src/uu/cp/Cargo.toml +++ b/src/uu/cp/Cargo.toml @@ -21,7 +21,7 @@ path = "src/cp.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } filetime = "0.2" -libc = "0.2.125" +libc = "0.2.126" quick-error = "2.0.1" selinux = { version="0.2", optional=true } uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["entries", "fs", "perms", "mode"] } diff --git a/src/uu/hostid/Cargo.toml b/src/uu/hostid/Cargo.toml index d29160b21cf..cfbdd4a2c8d 100644 --- a/src/uu/hostid/Cargo.toml +++ b/src/uu/hostid/Cargo.toml @@ -16,7 +16,7 @@ path = "src/hostid.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.125" +libc = "0.2.126" uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } [[bin]] diff --git a/src/uu/kill/Cargo.toml b/src/uu/kill/Cargo.toml index 24347a90af5..7ec12979ceb 100644 --- a/src/uu/kill/Cargo.toml +++ b/src/uu/kill/Cargo.toml @@ -16,7 +16,7 @@ path = "src/kill.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.125" +libc = "0.2.126" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["signals"] } [[bin]] diff --git a/src/uu/logname/Cargo.toml b/src/uu/logname/Cargo.toml index fe7f2f7386e..9da5a7c41d3 100644 --- a/src/uu/logname/Cargo.toml +++ b/src/uu/logname/Cargo.toml @@ -15,7 +15,7 @@ edition = "2021" path = "src/logname.rs" [dependencies] -libc = "0.2.125" +libc = "0.2.126" clap = { version = "3.1", features = ["wrap_help", "cargo"] } uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } diff --git a/src/uu/mkfifo/Cargo.toml b/src/uu/mkfifo/Cargo.toml index 821d67d53db..6f38b055d43 100644 --- a/src/uu/mkfifo/Cargo.toml +++ b/src/uu/mkfifo/Cargo.toml @@ -16,7 +16,7 @@ path = "src/mkfifo.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.125" +libc = "0.2.126" uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } [[bin]] diff --git a/src/uu/mknod/Cargo.toml b/src/uu/mknod/Cargo.toml index 88c9e3fb077..61a738c5923 100644 --- a/src/uu/mknod/Cargo.toml +++ b/src/uu/mknod/Cargo.toml @@ -17,7 +17,7 @@ path = "src/mknod.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "^0.2.125" +libc = "^0.2.126" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["mode"] } [[bin]] diff --git a/src/uu/nice/Cargo.toml b/src/uu/nice/Cargo.toml index 9b6ca52bdb7..5f2e20bdb2d 100644 --- a/src/uu/nice/Cargo.toml +++ b/src/uu/nice/Cargo.toml @@ -16,7 +16,7 @@ path = "src/nice.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.125" +libc = "0.2.126" nix = { version = "0.24.1", default-features = false } uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } diff --git a/src/uu/nohup/Cargo.toml b/src/uu/nohup/Cargo.toml index ba38a7ecd8b..6e3faf37d7a 100644 --- a/src/uu/nohup/Cargo.toml +++ b/src/uu/nohup/Cargo.toml @@ -16,7 +16,7 @@ path = "src/nohup.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.125" +libc = "0.2.126" atty = "0.2" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["fs"] } diff --git a/src/uu/nproc/Cargo.toml b/src/uu/nproc/Cargo.toml index f52f2d0db3f..89a742d0e79 100644 --- a/src/uu/nproc/Cargo.toml +++ b/src/uu/nproc/Cargo.toml @@ -15,7 +15,7 @@ edition = "2021" path = "src/nproc.rs" [dependencies] -libc = "0.2.125" +libc = "0.2.126" num_cpus = "1.10" clap = { version = "3.1", features = ["wrap_help", "cargo"] } uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["fs"] } diff --git a/src/uu/pathchk/Cargo.toml b/src/uu/pathchk/Cargo.toml index dd8b8307648..be46ac38af4 100644 --- a/src/uu/pathchk/Cargo.toml +++ b/src/uu/pathchk/Cargo.toml @@ -16,7 +16,7 @@ path = "src/pathchk.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.125" +libc = "0.2.126" uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } [[bin]] diff --git a/src/uu/rmdir/Cargo.toml b/src/uu/rmdir/Cargo.toml index 0894fa4110c..f422cecaac2 100644 --- a/src/uu/rmdir/Cargo.toml +++ b/src/uu/rmdir/Cargo.toml @@ -17,7 +17,7 @@ path = "src/rmdir.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } -libc = "0.2.125" +libc = "0.2.126" [[bin]] name = "rmdir" diff --git a/src/uu/sync/Cargo.toml b/src/uu/sync/Cargo.toml index f6e57391dbe..c4b30e7a27d 100644 --- a/src/uu/sync/Cargo.toml +++ b/src/uu/sync/Cargo.toml @@ -16,7 +16,7 @@ path = "src/sync.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.125" +libc = "0.2.126" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["wide"] } winapi = { version = "0.3", features = ["errhandlingapi", "fileapi", "handleapi", "std", "winbase", "winerror"] } diff --git a/src/uu/tail/Cargo.toml b/src/uu/tail/Cargo.toml index 7006ddb67e8..9c4026b5fda 100644 --- a/src/uu/tail/Cargo.toml +++ b/src/uu/tail/Cargo.toml @@ -16,7 +16,7 @@ path = "src/tail.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.125" +libc = "0.2.126" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["ringbuffer", "lines"] } [target.'cfg(windows)'.dependencies] diff --git a/src/uu/tee/Cargo.toml b/src/uu/tee/Cargo.toml index 07ee9e33bad..a964f58e438 100644 --- a/src/uu/tee/Cargo.toml +++ b/src/uu/tee/Cargo.toml @@ -16,7 +16,7 @@ path = "src/tee.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.125" +libc = "0.2.126" retain_mut = "=0.1.7" # ToDO: [2021-01-01; rivy; maint/MinSRV] ~ v0.1.5 uses const generics which aren't stabilized until rust v1.51.0 uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["libc"] } diff --git a/src/uu/test/Cargo.toml b/src/uu/test/Cargo.toml index 58f891541a7..94cec610cf4 100644 --- a/src/uu/test/Cargo.toml +++ b/src/uu/test/Cargo.toml @@ -16,7 +16,7 @@ path = "src/test.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.125" +libc = "0.2.126" uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } [target.'cfg(target_os = "redox")'.dependencies] diff --git a/src/uu/timeout/Cargo.toml b/src/uu/timeout/Cargo.toml index d285c3214ca..3c6efa288a5 100644 --- a/src/uu/timeout/Cargo.toml +++ b/src/uu/timeout/Cargo.toml @@ -16,7 +16,7 @@ path = "src/timeout.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.125" +libc = "0.2.126" nix = { version = "0.24.1", default-features = false, features = ["signal"] } uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["process", "signals"] } diff --git a/src/uu/tty/Cargo.toml b/src/uu/tty/Cargo.toml index da6446ab036..2b80797f1f8 100644 --- a/src/uu/tty/Cargo.toml +++ b/src/uu/tty/Cargo.toml @@ -16,7 +16,7 @@ path = "src/tty.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo"] } -libc = "0.2.125" +libc = "0.2.126" atty = "0.2" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["fs"] } diff --git a/src/uu/whoami/Cargo.toml b/src/uu/whoami/Cargo.toml index 253e2ba1bf1..78ba91460a8 100644 --- a/src/uu/whoami/Cargo.toml +++ b/src/uu/whoami/Cargo.toml @@ -22,7 +22,7 @@ uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=[ winapi = { version = "0.3", features = ["lmcons"] } [target.'cfg(unix)'.dependencies] -libc = "0.2.125" +libc = "0.2.126" [[bin]] name = "whoami" diff --git a/src/uucore/Cargo.toml b/src/uucore/Cargo.toml index 7a350146ed0..581ec7862a5 100644 --- a/src/uucore/Cargo.toml +++ b/src/uucore/Cargo.toml @@ -31,7 +31,7 @@ time = { version="<= 0.3", optional=true, features = ["formatting", "local-offse data-encoding = { version="2.1", optional=true } data-encoding-macro = { version="0.1.12", optional=true } z85 = { version="3.0.5", optional=true } -libc = { version="0.2.125", optional=true } +libc = { version="0.2.126", optional=true } once_cell = "1.10.0" os_display = "0.1.3" From 8d0572a3ba225157e49250b40dec3cdb681bfda5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 May 2022 07:13:56 +0000 Subject: [PATCH 227/242] build(deps): bump signal-hook from 0.3.13 to 0.3.14 Bumps [signal-hook](https://github.com/vorner/signal-hook) from 0.3.13 to 0.3.14. - [Release notes](https://github.com/vorner/signal-hook/releases) - [Changelog](https://github.com/vorner/signal-hook/blob/master/CHANGELOG.md) - [Commits](https://github.com/vorner/signal-hook/compare/v0.3.13...v0.3.14) --- updated-dependencies: - dependency-name: signal-hook dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- src/uu/dd/Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 537e34e2627..bac65643621 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1530,9 +1530,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.5.2" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd249e82c21598a9a426a4e00dd7adc1d640b22445ec8545feef801d1a74c221" +checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" dependencies = [ "autocfg", "crossbeam-deque", @@ -1739,9 +1739,9 @@ checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" [[package]] name = "signal-hook" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "647c97df271007dcea485bb74ffdb57f2e683f1306c854f468a0c244badabf2d" +checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d" dependencies = [ "libc", "signal-hook-registry", diff --git a/src/uu/dd/Cargo.toml b/src/uu/dd/Cargo.toml index c805685adc8..a2acea60813 100644 --- a/src/uu/dd/Cargo.toml +++ b/src/uu/dd/Cargo.toml @@ -22,7 +22,7 @@ libc = "0.2" uucore = { version=">=0.0.8", package="uucore", path="../../uucore" } [target.'cfg(any(target_os = "linux", target_os = "android"))'.dependencies] -signal-hook = "0.3.9" +signal-hook = "0.3.14" [[bin]] name = "dd" From 5dc1a3759acdec9a33992e61bd8ef517e5dd7c42 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 May 2022 06:29:03 +0000 Subject: [PATCH 228/242] build(deps): bump clap from 3.1.15 to 3.1.18 Bumps [clap](https://github.com/clap-rs/clap) from 3.1.15 to 3.1.18. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/v3.1.15...v3.1.18) --- updated-dependencies: - dependency-name: clap dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 212 ++++++++++++++++++++++++++--------------------------- 1 file changed, 106 insertions(+), 106 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a5cb2b3a702..f81b7d1e951 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -256,9 +256,9 @@ dependencies = [ [[package]] name = "clap" -version = "3.1.15" +version = "3.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a35a599b11c089a7f49105658d089b8f2cf0882993c17daf6de15285c2c35d" +checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" dependencies = [ "atty", "bitflags", @@ -277,7 +277,7 @@ version = "3.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da92e6facd8d73c22745a5d3cbb59bdf8e46e3235c923e516527d8e81eec14a4" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", ] [[package]] @@ -316,7 +316,7 @@ version = "0.0.13" dependencies = [ "atty", "chrono", - "clap 3.1.15", + "clap 3.1.18", "clap_complete", "conv", "filetime", @@ -2067,7 +2067,7 @@ checksum = "7cf7d77f457ef8dfa11e4cd5933c5ddb5dc52a94664071951219a97710f0a32b" name = "uu_arch" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "platform-info", "uucore", ] @@ -2076,7 +2076,7 @@ dependencies = [ name = "uu_base32" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2092,7 +2092,7 @@ dependencies = [ name = "uu_basename" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2100,7 +2100,7 @@ dependencies = [ name = "uu_basenc" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uu_base32", "uucore", ] @@ -2110,7 +2110,7 @@ name = "uu_cat" version = "0.0.13" dependencies = [ "atty", - "clap 3.1.15", + "clap 3.1.18", "nix", "thiserror", "unix_socket", @@ -2121,7 +2121,7 @@ dependencies = [ name = "uu_chcon" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "fts-sys", "libc", "selinux", @@ -2133,7 +2133,7 @@ dependencies = [ name = "uu_chgrp" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2141,7 +2141,7 @@ dependencies = [ name = "uu_chmod" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "libc", "uucore", ] @@ -2150,7 +2150,7 @@ dependencies = [ name = "uu_chown" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2158,7 +2158,7 @@ dependencies = [ name = "uu_chroot" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2166,7 +2166,7 @@ dependencies = [ name = "uu_cksum" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2174,7 +2174,7 @@ dependencies = [ name = "uu_comm" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2182,7 +2182,7 @@ dependencies = [ name = "uu_cp" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "exacl", "filetime", "ioctl-sys", @@ -2199,7 +2199,7 @@ dependencies = [ name = "uu_csplit" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "regex", "thiserror", "uucore", @@ -2211,7 +2211,7 @@ version = "0.0.13" dependencies = [ "atty", "bstr", - "clap 3.1.15", + "clap 3.1.18", "memchr 2.5.0", "uucore", ] @@ -2221,7 +2221,7 @@ name = "uu_date" version = "0.0.13" dependencies = [ "chrono", - "clap 3.1.15", + "clap 3.1.18", "libc", "uucore", "winapi 0.3.9", @@ -2232,7 +2232,7 @@ name = "uu_dd" version = "0.0.13" dependencies = [ "byte-unit", - "clap 3.1.15", + "clap 3.1.18", "gcd", "libc", "signal-hook", @@ -2243,7 +2243,7 @@ dependencies = [ name = "uu_df" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "number_prefix", "unicode-width", "uucore", @@ -2253,7 +2253,7 @@ dependencies = [ name = "uu_dir" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "selinux", "uu_ls", "uucore", @@ -2263,7 +2263,7 @@ dependencies = [ name = "uu_dircolors" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "glob", "uucore", ] @@ -2272,7 +2272,7 @@ dependencies = [ name = "uu_dirname" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2281,7 +2281,7 @@ name = "uu_du" version = "0.0.13" dependencies = [ "chrono", - "clap 3.1.15", + "clap 3.1.18", "glob", "uucore", "winapi 0.3.9", @@ -2291,7 +2291,7 @@ dependencies = [ name = "uu_echo" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2299,7 +2299,7 @@ dependencies = [ name = "uu_env" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "rust-ini", "uucore", ] @@ -2308,7 +2308,7 @@ dependencies = [ name = "uu_expand" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "unicode-width", "uucore", ] @@ -2317,7 +2317,7 @@ dependencies = [ name = "uu_expr" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "num-bigint", "num-traits", "onig", @@ -2328,7 +2328,7 @@ dependencies = [ name = "uu_factor" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "coz", "num-traits", "paste", @@ -2342,7 +2342,7 @@ dependencies = [ name = "uu_false" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2350,7 +2350,7 @@ dependencies = [ name = "uu_fmt" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "unicode-width", "uucore", ] @@ -2359,7 +2359,7 @@ dependencies = [ name = "uu_fold" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2367,7 +2367,7 @@ dependencies = [ name = "uu_groups" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2377,7 +2377,7 @@ version = "0.0.13" dependencies = [ "blake2b_simd", "blake3", - "clap 3.1.15", + "clap 3.1.18", "digest", "hex", "md-5", @@ -2393,7 +2393,7 @@ dependencies = [ name = "uu_head" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "memchr 2.5.0", "uucore", ] @@ -2402,7 +2402,7 @@ dependencies = [ name = "uu_hostid" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "libc", "uucore", ] @@ -2411,7 +2411,7 @@ dependencies = [ name = "uu_hostname" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "hostname", "uucore", "winapi 0.3.9", @@ -2421,7 +2421,7 @@ dependencies = [ name = "uu_id" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "selinux", "uucore", ] @@ -2430,7 +2430,7 @@ dependencies = [ name = "uu_install" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "file_diff", "filetime", "libc", @@ -2442,7 +2442,7 @@ dependencies = [ name = "uu_join" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "memchr 2.5.0", "uucore", ] @@ -2451,7 +2451,7 @@ dependencies = [ name = "uu_kill" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "libc", "uucore", ] @@ -2460,7 +2460,7 @@ dependencies = [ name = "uu_link" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2468,7 +2468,7 @@ dependencies = [ name = "uu_ln" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2476,7 +2476,7 @@ dependencies = [ name = "uu_logname" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "libc", "uucore", ] @@ -2487,7 +2487,7 @@ version = "0.0.13" dependencies = [ "atty", "chrono", - "clap 3.1.15", + "clap 3.1.18", "glob", "lazy_static", "lscolors", @@ -2504,7 +2504,7 @@ dependencies = [ name = "uu_mkdir" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2512,7 +2512,7 @@ dependencies = [ name = "uu_mkfifo" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "libc", "uucore", ] @@ -2521,7 +2521,7 @@ dependencies = [ name = "uu_mknod" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "libc", "uucore", ] @@ -2530,7 +2530,7 @@ dependencies = [ name = "uu_mktemp" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "rand", "tempfile", "uucore", @@ -2541,7 +2541,7 @@ name = "uu_more" version = "0.0.13" dependencies = [ "atty", - "clap 3.1.15", + "clap 3.1.18", "crossterm", "nix", "unicode-segmentation", @@ -2553,7 +2553,7 @@ dependencies = [ name = "uu_mv" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "fs_extra", "uucore", ] @@ -2562,7 +2562,7 @@ dependencies = [ name = "uu_nice" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "libc", "nix", "uucore", @@ -2572,7 +2572,7 @@ dependencies = [ name = "uu_nl" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "regex", "uucore", ] @@ -2582,7 +2582,7 @@ name = "uu_nohup" version = "0.0.13" dependencies = [ "atty", - "clap 3.1.15", + "clap 3.1.18", "libc", "uucore", ] @@ -2591,7 +2591,7 @@ dependencies = [ name = "uu_nproc" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "libc", "num_cpus", "uucore", @@ -2601,7 +2601,7 @@ dependencies = [ name = "uu_numfmt" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2610,7 +2610,7 @@ name = "uu_od" version = "0.0.13" dependencies = [ "byteorder", - "clap 3.1.15", + "clap 3.1.18", "half", "uucore", ] @@ -2619,7 +2619,7 @@ dependencies = [ name = "uu_paste" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2627,7 +2627,7 @@ dependencies = [ name = "uu_pathchk" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "libc", "uucore", ] @@ -2636,7 +2636,7 @@ dependencies = [ name = "uu_pinky" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2645,7 +2645,7 @@ name = "uu_pr" version = "0.0.13" dependencies = [ "chrono", - "clap 3.1.15", + "clap 3.1.18", "itertools", "quick-error", "regex", @@ -2656,7 +2656,7 @@ dependencies = [ name = "uu_printenv" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2664,7 +2664,7 @@ dependencies = [ name = "uu_printf" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2672,7 +2672,7 @@ dependencies = [ name = "uu_ptx" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "regex", "uucore", ] @@ -2681,7 +2681,7 @@ dependencies = [ name = "uu_pwd" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2689,7 +2689,7 @@ dependencies = [ name = "uu_readlink" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2697,7 +2697,7 @@ dependencies = [ name = "uu_realpath" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2705,7 +2705,7 @@ dependencies = [ name = "uu_relpath" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2713,7 +2713,7 @@ dependencies = [ name = "uu_rm" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "remove_dir_all 0.7.0", "uucore", "walkdir", @@ -2724,7 +2724,7 @@ dependencies = [ name = "uu_rmdir" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "libc", "uucore", ] @@ -2733,7 +2733,7 @@ dependencies = [ name = "uu_runcon" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "libc", "selinux", "thiserror", @@ -2745,7 +2745,7 @@ name = "uu_seq" version = "0.0.13" dependencies = [ "bigdecimal", - "clap 3.1.15", + "clap 3.1.18", "num-bigint", "num-traits", "uucore", @@ -2755,7 +2755,7 @@ dependencies = [ name = "uu_shred" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "rand", "uucore", ] @@ -2764,7 +2764,7 @@ dependencies = [ name = "uu_shuf" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "rand", "rand_core", "uucore", @@ -2774,7 +2774,7 @@ dependencies = [ name = "uu_sleep" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2783,7 +2783,7 @@ name = "uu_sort" version = "0.0.13" dependencies = [ "binary-heap-plus", - "clap 3.1.15", + "clap 3.1.18", "compare", "ctrlc", "fnv", @@ -2801,7 +2801,7 @@ dependencies = [ name = "uu_split" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "memchr 2.5.0", "uucore", ] @@ -2810,7 +2810,7 @@ dependencies = [ name = "uu_stat" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2818,7 +2818,7 @@ dependencies = [ name = "uu_stdbuf" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "tempfile", "uu_stdbuf_libstdbuf", "uucore", @@ -2838,7 +2838,7 @@ dependencies = [ name = "uu_sum" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2846,7 +2846,7 @@ dependencies = [ name = "uu_sync" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "libc", "uucore", "winapi 0.3.9", @@ -2856,7 +2856,7 @@ dependencies = [ name = "uu_tac" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "memchr 2.5.0", "memmap2", "regex", @@ -2867,7 +2867,7 @@ dependencies = [ name = "uu_tail" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "libc", "nix", "uucore", @@ -2878,7 +2878,7 @@ dependencies = [ name = "uu_tee" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "libc", "retain_mut", "uucore", @@ -2888,7 +2888,7 @@ dependencies = [ name = "uu_test" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "libc", "redox_syscall", "uucore", @@ -2898,7 +2898,7 @@ dependencies = [ name = "uu_timeout" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "libc", "nix", "uucore", @@ -2908,7 +2908,7 @@ dependencies = [ name = "uu_touch" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "filetime", "time 0.3.9", "uucore", @@ -2919,7 +2919,7 @@ dependencies = [ name = "uu_tr" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "nom", "uucore", ] @@ -2928,7 +2928,7 @@ dependencies = [ name = "uu_true" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2936,7 +2936,7 @@ dependencies = [ name = "uu_truncate" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2944,7 +2944,7 @@ dependencies = [ name = "uu_tsort" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2953,7 +2953,7 @@ name = "uu_tty" version = "0.0.13" dependencies = [ "atty", - "clap 3.1.15", + "clap 3.1.18", "libc", "uucore", ] @@ -2962,7 +2962,7 @@ dependencies = [ name = "uu_uname" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "platform-info", "uucore", ] @@ -2971,7 +2971,7 @@ dependencies = [ name = "uu_unexpand" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "unicode-width", "uucore", ] @@ -2980,7 +2980,7 @@ dependencies = [ name = "uu_uniq" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "strum", "strum_macros", "uucore", @@ -2990,7 +2990,7 @@ dependencies = [ name = "uu_unlink" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -2999,7 +2999,7 @@ name = "uu_uptime" version = "0.0.13" dependencies = [ "chrono", - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -3007,7 +3007,7 @@ dependencies = [ name = "uu_users" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -3015,7 +3015,7 @@ dependencies = [ name = "uu_vdir" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "selinux", "uu_ls", "uucore", @@ -3026,7 +3026,7 @@ name = "uu_wc" version = "0.0.13" dependencies = [ "bytecount", - "clap 3.1.15", + "clap 3.1.18", "libc", "nix", "unicode-width", @@ -3038,7 +3038,7 @@ dependencies = [ name = "uu_who" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "uucore", ] @@ -3046,7 +3046,7 @@ dependencies = [ name = "uu_whoami" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "libc", "uucore", "winapi 0.3.9", @@ -3056,7 +3056,7 @@ dependencies = [ name = "uu_yes" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "nix", "uucore", ] @@ -3065,7 +3065,7 @@ dependencies = [ name = "uucore" version = "0.0.13" dependencies = [ - "clap 3.1.15", + "clap 3.1.18", "data-encoding", "data-encoding-macro", "dns-lookup", From 27dd59635af4d32b5898077c25b03eaf78a93ddb Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Mon, 16 May 2022 16:39:20 +0200 Subject: [PATCH 229/242] uucore: add InvalidSuffix to ParseSizeError --- src/uu/dd/src/parseargs.rs | 2 +- src/uu/df/src/df.rs | 5 +++ src/uu/du/src/du.rs | 4 ++- src/uu/od/src/od.rs | 4 ++- src/uu/sort/src/sort.rs | 8 +++-- src/uucore/src/lib/parser/parse_size.rs | 41 +++++++++++++++---------- tests/by-util/test_df.rs | 13 ++++++++ tests/by-util/test_du.rs | 8 ++++- tests/by-util/test_od.rs | 13 +++++++- tests/by-util/test_sort.rs | 26 ++++++++-------- 10 files changed, 89 insertions(+), 35 deletions(-) diff --git a/src/uu/dd/src/parseargs.rs b/src/uu/dd/src/parseargs.rs index 0a2fae99a22..53adce3f326 100644 --- a/src/uu/dd/src/parseargs.rs +++ b/src/uu/dd/src/parseargs.rs @@ -388,7 +388,7 @@ fn parse_bytes_no_x(s: &str) -> Result { let (num, multiplier) = match (s.find('c'), s.rfind('w'), s.rfind('b')) { (None, None, None) => match uucore::parse_size::parse_size(s) { Ok(n) => (n, 1), - Err(ParseSizeError::ParseFailure(s)) => { + Err(ParseSizeError::InvalidSuffix(s)) | Err(ParseSizeError::ParseFailure(s)) => { return Err(ParseError::MultiplierStringParseFailure(s)) } Err(ParseSizeError::SizeTooBig(s)) => { diff --git a/src/uu/df/src/df.rs b/src/uu/df/src/df.rs index 1f59982b21a..793138f7dd2 100644 --- a/src/uu/df/src/df.rs +++ b/src/uu/df/src/df.rs @@ -121,6 +121,7 @@ impl Default for Options { enum OptionsError { BlockSizeTooLarge(String), InvalidBlockSize(String), + InvalidSuffix(String), /// An error getting the columns to display in the output table. ColumnError(ColumnError), @@ -139,6 +140,9 @@ impl fmt::Display for OptionsError { // TODO This needs to vary based on whether `--block-size` // or `-B` were provided. Self::InvalidBlockSize(s) => write!(f, "invalid --block-size argument {}", s), + // TODO This needs to vary based on whether `--block-size` + // or `-B` were provided. + Self::InvalidSuffix(s) => write!(f, "invalid suffix in --block-size argument {}", s), Self::ColumnError(ColumnError::MultipleColumns(s)) => write!( f, "option --output: field {} used more than once", @@ -174,6 +178,7 @@ impl Options { show_local_fs: matches.is_present(OPT_LOCAL), show_all_fs: matches.is_present(OPT_ALL), block_size: block_size_from_matches(matches).map_err(|e| match e { + ParseSizeError::InvalidSuffix(s) => OptionsError::InvalidSuffix(s), ParseSizeError::SizeTooBig(_) => OptionsError::BlockSizeTooLarge( matches.value_of(OPT_BLOCKSIZE).unwrap().to_string(), ), diff --git a/src/uu/du/src/du.rs b/src/uu/du/src/du.rs index d358d3e8f99..ec1c735b033 100644 --- a/src/uu/du/src/du.rs +++ b/src/uu/du/src/du.rs @@ -953,8 +953,10 @@ impl Threshold { fn format_error_message(error: &ParseSizeError, s: &str, option: &str) -> String { // NOTE: // GNU's du echos affected flag, -B or --block-size (-t or --threshold), depending user's selection - // GNU's du does distinguish between "invalid (suffix in) argument" match error { + ParseSizeError::InvalidSuffix(_) => { + format!("invalid suffix in --{} argument {}", option, s.quote()) + } ParseSizeError::ParseFailure(_) => format!("invalid --{} argument {}", option, s.quote()), ParseSizeError::SizeTooBig(_) => format!("--{} argument {} too large", option, s.quote()), } diff --git a/src/uu/od/src/od.rs b/src/uu/od/src/od.rs index 673035ea27d..73917b99f76 100644 --- a/src/uu/od/src/od.rs +++ b/src/uu/od/src/od.rs @@ -679,8 +679,10 @@ fn open_input_peek_reader( fn format_error_message(error: &ParseSizeError, s: &str, option: &str) -> String { // NOTE: // GNU's od echos affected flag, -N or --read-bytes (-j or --skip-bytes, etc.), depending user's selection - // GNU's od does distinguish between "invalid (suffix in) argument" match error { + ParseSizeError::InvalidSuffix(_) => { + format!("invalid suffix in --{} argument {}", option, s.quote()) + } ParseSizeError::ParseFailure(_) => format!("invalid --{} argument {}", option, s.quote()), ParseSizeError::SizeTooBig(_) => format!("--{} argument {} too large", option, s.quote()), } diff --git a/src/uu/sort/src/sort.rs b/src/uu/sort/src/sort.rs index c3d66d05715..15e36a59535 100644 --- a/src/uu/sort/src/sort.rs +++ b/src/uu/sort/src/sort.rs @@ -362,8 +362,10 @@ impl GlobalSettings { size )) }) + } else if size_string.starts_with(|c: char| c.is_ascii_digit()) { + Err(ParseSizeError::InvalidSuffix("invalid suffix".to_string())) } else { - Err(ParseSizeError::ParseFailure("invalid suffix".to_string())) + Err(ParseSizeError::ParseFailure("parse failure".to_string())) } } @@ -1833,8 +1835,10 @@ fn open(path: impl AsRef) -> UResult> { fn format_error_message(error: &ParseSizeError, s: &str, option: &str) -> String { // NOTE: // GNU's sort echos affected flag, -S or --buffer-size, depending user's selection - // GNU's sort does distinguish between "invalid (suffix in) argument" match error { + ParseSizeError::InvalidSuffix(_) => { + format!("invalid suffix in --{} argument {}", option, s.quote()) + } ParseSizeError::ParseFailure(_) => format!("invalid --{} argument {}", option, s.quote()), ParseSizeError::SizeTooBig(_) => format!("--{} argument {} too large", option, s.quote()), } diff --git a/src/uucore/src/lib/parser/parse_size.rs b/src/uucore/src/lib/parser/parse_size.rs index de316c3d2dc..557010584c6 100644 --- a/src/uucore/src/lib/parser/parse_size.rs +++ b/src/uucore/src/lib/parser/parse_size.rs @@ -72,7 +72,8 @@ pub fn parse_size(size: &str) -> Result { "EB" | "eB" => (1000, 6), "ZB" | "zB" => (1000, 7), "YB" | "yB" => (1000, 8), - _ => return Err(ParseSizeError::parse_failure(size)), + _ if numeric_string.is_empty() => return Err(ParseSizeError::parse_failure(size)), + _ => return Err(ParseSizeError::invalid_suffix(size)), }; let factor = match u64::try_from(base.pow(exponent)) { Ok(n) => n, @@ -85,13 +86,15 @@ pub fn parse_size(size: &str) -> Result { #[derive(Debug, PartialEq, Eq)] pub enum ParseSizeError { - ParseFailure(String), // Syntax - SizeTooBig(String), // Overflow + InvalidSuffix(String), // Suffix + ParseFailure(String), // Syntax + SizeTooBig(String), // Overflow } impl Error for ParseSizeError { fn description(&self) -> &str { match *self { + ParseSizeError::InvalidSuffix(ref s) => &*s, ParseSizeError::ParseFailure(ref s) => &*s, ParseSizeError::SizeTooBig(ref s) => &*s, } @@ -101,7 +104,9 @@ impl Error for ParseSizeError { impl fmt::Display for ParseSizeError { fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { let s = match self { - ParseSizeError::ParseFailure(s) | ParseSizeError::SizeTooBig(s) => s, + ParseSizeError::InvalidSuffix(s) + | ParseSizeError::ParseFailure(s) + | ParseSizeError::SizeTooBig(s) => s, }; write!(f, "{}", s) } @@ -111,6 +116,10 @@ impl fmt::Display for ParseSizeError { // but there's a lot of downstream code that constructs these errors manually // that would be affected impl ParseSizeError { + fn invalid_suffix(s: &str) -> Self { + Self::InvalidSuffix(format!("{}", s.quote())) + } + fn parse_failure(s: &str) -> Self { // stderr on linux (GNU coreutils 8.32) (LC_ALL=C) // has to be handled in the respective uutils because strings differ, e.g.: @@ -237,20 +246,20 @@ mod tests { ); } + #[test] + fn invalid_suffix() { + let test_strings = ["328hdsf3290", "5mib", "1e2", "1H", "1.2"]; + for &test_string in &test_strings { + assert_eq!( + parse_size(test_string).unwrap_err(), + ParseSizeError::InvalidSuffix(format!("{}", test_string.quote())) + ); + } + } + #[test] fn invalid_syntax() { - let test_strings = [ - "328hdsf3290", - "5MiB nonsense", - "5mib", - "biB", - "-", - "+", - "", - "-1", - "1e2", - "∞", - ]; + let test_strings = ["biB", "-", "+", "", "-1", "∞"]; for &test_string in &test_strings { assert_eq!( parse_size(test_string).unwrap_err(), diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index 9ff8e103ddc..6f8de3bfad5 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -566,6 +566,19 @@ fn test_invalid_block_size() { .stderr_contains("invalid --block-size argument '0K'"); } +#[test] +fn test_invalid_block_size_suffix() { + new_ucmd!() + .arg("--block-size=1H") + .fails() + .stderr_contains("invalid suffix in --block-size argument '1H'"); + + new_ucmd!() + .arg("--block-size=1.2") + .fails() + .stderr_contains("invalid suffix in --block-size argument '1.2'"); +} + #[test] fn test_output_selects_columns() { let output = new_ucmd!() diff --git a/tests/by-util/test_du.rs b/tests/by-util/test_du.rs index bf506c8b538..b421d5e84d2 100644 --- a/tests/by-util/test_du.rs +++ b/tests/by-util/test_du.rs @@ -94,7 +94,13 @@ fn test_du_invalid_size() { .arg("/tmp") .fails() .code_is(1) - .stderr_only(format!("du: invalid --{} argument '1fb4t'", s)); + .stderr_only(format!("du: invalid suffix in --{} argument '1fb4t'", s)); + ts.ucmd() + .arg(format!("--{}=x", s)) + .arg("/tmp") + .fails() + .code_is(1) + .stderr_only(format!("du: invalid --{} argument 'x'", s)); #[cfg(not(target_pointer_width = "128"))] ts.ucmd() .arg(format!("--{}=1Y", s)) diff --git a/tests/by-util/test_od.rs b/tests/by-util/test_od.rs index 3272971d748..e688813099c 100644 --- a/tests/by-util/test_od.rs +++ b/tests/by-util/test_od.rs @@ -827,7 +827,8 @@ fn test_traditional_only_label() { #[test] fn test_od_invalid_bytes() { - const INVALID_SIZE: &str = "1fb4t"; + const INVALID_SIZE: &str = "x"; + const INVALID_SUFFIX: &str = "1fb4t"; const BIG_SIZE: &str = "1Y"; // NOTE: @@ -852,6 +853,16 @@ fn test_od_invalid_bytes() { option, INVALID_SIZE )); + new_ucmd!() + .arg(format!("{}={}", option, INVALID_SUFFIX)) + .arg("file") + .fails() + .code_is(1) + .stderr_only(format!( + "od: invalid suffix in {} argument '{}'", + option, INVALID_SUFFIX + )); + #[cfg(not(target_pointer_width = "128"))] new_ucmd!() .arg(format!("{}={}", option, BIG_SIZE)) diff --git a/tests/by-util/test_sort.rs b/tests/by-util/test_sort.rs index 24846d20706..ff4c7942777 100644 --- a/tests/by-util/test_sort.rs +++ b/tests/by-util/test_sort.rs @@ -56,18 +56,20 @@ fn test_buffer_sizes() { #[test] fn test_invalid_buffer_size() { - let buffer_sizes = ["asd", "100f"]; - for invalid_buffer_size in &buffer_sizes { - new_ucmd!() - .arg("-S") - .arg(invalid_buffer_size) - .fails() - .code_is(2) - .stderr_only(format!( - "sort: invalid --buffer-size argument '{}'", - invalid_buffer_size - )); - } + new_ucmd!() + .arg("-S") + .arg("asd") + .fails() + .code_is(2) + .stderr_only("sort: invalid --buffer-size argument 'asd'"); + + new_ucmd!() + .arg("-S") + .arg("100f") + .fails() + .code_is(2) + .stderr_only("sort: invalid suffix in --buffer-size argument '100f'"); + #[cfg(not(target_pointer_width = "128"))] new_ucmd!() .arg("-n") From cbc0381f205b5208a5a0f54fa3abad379342a2e0 Mon Sep 17 00:00:00 2001 From: LevitatingBusinessMan Date: Tue, 17 May 2022 23:46:38 +0200 Subject: [PATCH 230/242] uname: hide processor and hwplatform options --- src/uu/uname/src/uname.rs | 43 +++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/src/uu/uname/src/uname.rs b/src/uu/uname/src/uname.rs index f7b578c27bf..f08b3f48e60 100644 --- a/src/uu/uname/src/uname.rs +++ b/src/uu/uname/src/uname.rs @@ -90,34 +90,41 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { output.push_str(&uname.nodename()); output.push(' '); } + if kernelrelease || all { output.push_str(&uname.release()); output.push(' '); } + if kernelversion || all { output.push_str(&uname.version()); output.push(' '); } + if machine || all { output.push_str(&uname.machine()); output.push(' '); } - if processor || all { - // According to https://stackoverflow.com/posts/394271/revisions - // Most of the time, it returns unknown - output.push_str("unknown"); + + if os || all { + output.push_str(HOST_OS); output.push(' '); } - if hwplatform || all { - // According to https://lists.gnu.org/archive/html/bug-coreutils/2005-09/msg00063.html - // Most of the time, it returns unknown + + // This option is unsupported on modern Linux systems + // See: https://lists.gnu.org/archive/html/bug-coreutils/2005-09/msg00063.html + if processor { output.push_str("unknown"); output.push(' '); } - if os || all { - output.push_str(HOST_OS); + + // This option is unsupported on modern Linux systems + // See: https://lists.gnu.org/archive/html/bug-coreutils/2005-09/msg00063.html + if hwplatform { + output.push_str("unknown"); output.push(' '); } + println!("{}", output.trim_end()); Ok(()) @@ -151,20 +158,22 @@ pub fn uu_app<'a>() -> Command<'a> { .short('v') .long(options::KERNELVERSION) .help("print the operating system version.")) - .arg(Arg::new(options::HWPLATFORM) - .short('i') - .long(options::HWPLATFORM) - .help("print the hardware platform (non-portable)")) .arg(Arg::new(options::MACHINE) .short('m') .long(options::MACHINE) .help("print the machine hardware name.")) - .arg(Arg::new(options::PROCESSOR) - .short('p') - .long(options::PROCESSOR) - .help("print the processor type (non-portable)")) .arg(Arg::new(options::OS) .short('o') .long(options::OS) .help("print the operating system name.")) + .arg(Arg::new(options::PROCESSOR) + .short('p') + .long(options::PROCESSOR) + .help("print the processor type (non-portable)") + .hide(true)) + .arg(Arg::new(options::HWPLATFORM) + .short('i') + .long(options::HWPLATFORM) + .help("print the hardware platform (non-portable)") + .hide(true)) } From 8a941db20ab44d4bb3ea4112b297ca2266e84bf7 Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Wed, 11 May 2022 22:31:09 -0400 Subject: [PATCH 231/242] mktemp: correct error message on absolute path Correct the error message produced by `mktemp` when `--tmpdir` is given and the template is an absolute path: $ mktemp --tmpdir=a /XXX mktemp: invalid template, '/XXX'; with --tmpdir, it may not be absolute --- src/uu/mktemp/src/mktemp.rs | 8 +++++--- tests/by-util/test_mktemp.rs | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/uu/mktemp/src/mktemp.rs b/src/uu/mktemp/src/mktemp.rs index 20b95f009c0..541b1310ede 100644 --- a/src/uu/mktemp/src/mktemp.rs +++ b/src/uu/mktemp/src/mktemp.rs @@ -139,12 +139,14 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { let dry_run = matches.is_present(OPT_DRY_RUN); let suppress_file_err = matches.is_present(OPT_QUIET); - let (prefix, rand, suffix) = parse_template(template, matches.value_of(OPT_SUFFIX))?; - - if matches.is_present(OPT_TMPDIR) && PathBuf::from(prefix).is_absolute() { + // If `--tmpdir` is given, the template cannot be an absolute + // path. For example, `mktemp --tmpdir=a /XXX` is not allowed. + if matches.is_present(OPT_TMPDIR) && PathBuf::from(template).is_absolute() { return Err(MkTempError::InvalidTemplate(template.into()).into()); } + let (prefix, rand, suffix) = parse_template(template, matches.value_of(OPT_SUFFIX))?; + let res = if dry_run { dry_exec(tmpdir, prefix, rand, suffix) } else { diff --git a/tests/by-util/test_mktemp.rs b/tests/by-util/test_mktemp.rs index 9fce0e59135..8cdddd82ca0 100644 --- a/tests/by-util/test_mktemp.rs +++ b/tests/by-util/test_mktemp.rs @@ -414,6 +414,22 @@ fn test_mktemp_directory_tmpdir() { assert!(PathBuf::from(result.stdout_str().trim()).is_dir()); } +/// Test that an absolute path is disallowed when --tmpdir is provided. +#[test] +fn test_tmpdir_absolute_path() { + #[cfg(windows)] + let path = r"C:\XXX"; + #[cfg(not(windows))] + let path = "/XXX"; + new_ucmd!() + .args(&["--tmpdir=a", path]) + .fails() + .stderr_only(format!( + "mktemp: invalid template, '{}'; with --tmpdir, it may not be absolute\n", + path + )); +} + /// Decide whether a string matches a given template. /// /// In the template, the character `'X'` is treated as a wildcard, From a3e6d2b84b97d8493a6be650a55f307334836d52 Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Tue, 17 May 2022 21:02:42 -0400 Subject: [PATCH 232/242] seq: use usage error where appropriate --- src/uu/seq/src/error.rs | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/uu/seq/src/error.rs b/src/uu/seq/src/error.rs index 8c372758c8a..ae641a978c5 100644 --- a/src/uu/seq/src/error.rs +++ b/src/uu/seq/src/error.rs @@ -31,20 +31,20 @@ impl SeqError { /// The [`String`] argument as read from the command-line. fn arg(&self) -> &str { match self { - SeqError::ParseError(s, _) => s, - SeqError::ZeroIncrement(s) => s, + Self::ParseError(s, _) => s, + Self::ZeroIncrement(s) => s, } } /// The type of argument that is causing the error. fn argtype(&self) -> &str { match self { - SeqError::ParseError(_, e) => match e { + Self::ParseError(_, e) => match e { ParseNumberError::Float => "floating point argument", ParseNumberError::Nan => "'not-a-number' argument", ParseNumberError::Hex => "hexadecimal argument", }, - SeqError::ZeroIncrement(_) => "Zero increment value", + Self::ZeroIncrement(_) => "Zero increment value", } } } @@ -53,18 +53,16 @@ impl UError for SeqError { fn code(&self) -> i32 { 1 } + + fn usage(&self) -> bool { + true + } } impl Error for SeqError {} impl Display for SeqError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!( - f, - "invalid {}: {}\nTry '{} --help' for more information.", - self.argtype(), - self.arg().quote(), - uucore::execution_phrase(), - ) + write!(f, "invalid {}: {}", self.argtype(), self.arg().quote()) } } From 7374d76d639ad2865a53a5e0df0dcc7a4db0979a Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Thu, 19 May 2022 10:44:01 +0200 Subject: [PATCH 233/242] date: set names for arg values --- src/uu/date/src/date.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/uu/date/src/date.rs b/src/uu/date/src/date.rs index ca18856d1fa..6b4a49bd320 100644 --- a/src/uu/date/src/date.rs +++ b/src/uu/date/src/date.rs @@ -265,6 +265,7 @@ pub fn uu_app<'a>() -> Command<'a> { .short('d') .long(OPT_DATE) .takes_value(true) + .value_name("STRING") .help("display time described by STRING, not 'now'"), ) .arg( @@ -272,6 +273,7 @@ pub fn uu_app<'a>() -> Command<'a> { .short('f') .long(OPT_FILE) .takes_value(true) + .value_name("DATEFILE") .value_hint(clap::ValueHint::FilePath) .help("like --date; once for each line of DATEFILE"), ) @@ -280,6 +282,7 @@ pub fn uu_app<'a>() -> Command<'a> { .short('I') .long(OPT_ISO_8601) .takes_value(true) + .value_name("FMT") .help(ISO_8601_HELP_STRING), ) .arg( @@ -292,6 +295,7 @@ pub fn uu_app<'a>() -> Command<'a> { Arg::new(OPT_RFC_3339) .long(OPT_RFC_3339) .takes_value(true) + .value_name("FMT") .help(RFC_3339_HELP_STRING), ) .arg( @@ -304,6 +308,7 @@ pub fn uu_app<'a>() -> Command<'a> { .short('r') .long(OPT_REFERENCE) .takes_value(true) + .value_name("FILE") .value_hint(clap::ValueHint::AnyPath) .help("display the last modification time of FILE"), ) @@ -312,6 +317,7 @@ pub fn uu_app<'a>() -> Command<'a> { .short('s') .long(OPT_SET) .takes_value(true) + .value_name("STRING") .help(OPT_SET_HELP_STRING), ) .arg( From 6260333415cba80b59936257f0995f5ee9553c3f Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Wed, 18 May 2022 18:33:53 -0400 Subject: [PATCH 234/242] mktemp: fix error msg when suffix has path sep. Correct the error message when the template argument contains a path separator in its suffix. Before this commit: $ mktemp aXXX/b mktemp: too few X's in template 'b' After this commit: $ mktemp aXXX/b mktemp: invalid suffix '/b', contains directory separator This error message is more appropriate and matches the behavior of GNU mktemp. --- src/uu/mktemp/src/mktemp.rs | 15 ++++++++++++++- tests/by-util/test_mktemp.rs | 15 +++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/uu/mktemp/src/mktemp.rs b/src/uu/mktemp/src/mktemp.rs index 20b95f009c0..8cefc7982c6 100644 --- a/src/uu/mktemp/src/mktemp.rs +++ b/src/uu/mktemp/src/mktemp.rs @@ -17,7 +17,7 @@ use std::env; use std::error::Error; use std::fmt::Display; use std::iter; -use std::path::{is_separator, Path, PathBuf}; +use std::path::{is_separator, Path, PathBuf, MAIN_SEPARATOR}; use rand::Rng; use tempfile::Builder; @@ -129,6 +129,19 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { }; let filename = path.file_name(); let template = filename.unwrap().to_str().unwrap(); + // If the command line was `mktemp aXXX/b`, then we will + // find that `tmp`, which is the result of getting the + // parent when treating the argument as a path, contains + // at least three consecutive Xs. This means that there + // was a path separator in the suffix, which is not + // allowed. + if tmp.display().to_string().contains("XXX") { + return Err(MkTempError::SuffixContainsDirSeparator(format!( + "{}{}", + MAIN_SEPARATOR, template + )) + .into()); + } (template, tmp) } } else { diff --git a/tests/by-util/test_mktemp.rs b/tests/by-util/test_mktemp.rs index 9fce0e59135..962ab565b80 100644 --- a/tests/by-util/test_mktemp.rs +++ b/tests/by-util/test_mktemp.rs @@ -496,3 +496,18 @@ fn test_template_path_separator() { "a/bXXX".quote() )); } + +/// Test that a suffix with a path separator is invalid. +#[test] +fn test_suffix_path_separator() { + #[cfg(not(windows))] + new_ucmd!() + .arg("aXXX/b") + .fails() + .stderr_only("mktemp: invalid suffix '/b', contains directory separator\n"); + #[cfg(windows)] + new_ucmd!() + .arg(r"aXXX\b") + .fails() + .stderr_only("mktemp: invalid suffix '\\b', contains directory separator\n"); +} From 7a599c26ff63fad3be500a1a76f44668d5f84d21 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Fri, 20 May 2022 09:27:34 +0200 Subject: [PATCH 235/242] dependabot: remove trailing space --- .github/dependabot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index cfcddbb1434..38f046ead55 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -7,6 +7,6 @@ updates: open-pull-requests-limit: 5 - package-ecosystem: "github-actions" directory: "/" - schedule: + schedule: interval: daily open-pull-requests-limit: 5 From af5ef5585f7580ffa1991b6ff25926635b3f133b Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Fri, 20 May 2022 15:10:16 +0200 Subject: [PATCH 236/242] df/uniq: suppress lint errors --- src/uu/df/src/df.rs | 1 + src/uu/uniq/src/uniq.rs | 3 +++ 2 files changed, 4 insertions(+) diff --git a/src/uu/df/src/df.rs b/src/uu/df/src/df.rs index 793138f7dd2..7c95e693808 100644 --- a/src/uu/df/src/df.rs +++ b/src/uu/df/src/df.rs @@ -148,6 +148,7 @@ impl fmt::Display for OptionsError { "option --output: field {} used more than once", s.quote() ), + #[allow(clippy::print_in_format_impl)] Self::FilesystemTypeBothSelectedAndExcluded(types) => { for t in types { eprintln!( diff --git a/src/uu/uniq/src/uniq.rs b/src/uu/uniq/src/uniq.rs index e71c21303da..d947166fecb 100644 --- a/src/uu/uniq/src/uniq.rs +++ b/src/uu/uniq/src/uniq.rs @@ -5,6 +5,9 @@ // * For the full copyright and license information, please view the LICENSE // * file that was distributed with this source code. +// TODO remove this when https://github.com/rust-lang/rust-clippy/issues/6902 is fixed +#![allow(clippy::use_self)] + use clap::{crate_version, Arg, ArgMatches, Command}; use std::fs::File; use std::io::{self, stdin, stdout, BufRead, BufReader, BufWriter, Read, Write}; From 55a68bca80066cc7637511a1ce375386eeb60bee Mon Sep 17 00:00:00 2001 From: Thomas Queiroz Date: Sat, 21 May 2022 02:55:45 -0300 Subject: [PATCH 237/242] ls: implement --group-directories-first --- src/uu/ls/src/ls.rs | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/uu/ls/src/ls.rs b/src/uu/ls/src/ls.rs index d5cf3aaedd0..c1c6cfab488 100644 --- a/src/uu/ls/src/ls.rs +++ b/src/uu/ls/src/ls.rs @@ -140,6 +140,7 @@ pub mod options { pub static HIDE: &str = "hide"; pub static IGNORE: &str = "ignore"; pub static CONTEXT: &str = "context"; + pub static GROUP_DIRECTORIES_FIRST: &str = "group-directories-first"; } const DEFAULT_TERM_WIDTH: u16 = 80; @@ -330,6 +331,7 @@ pub struct Config { time_style: TimeStyle, context: bool, selinux_supported: bool, + group_directories_first: bool, } // Fields that can be removed or added to the long format @@ -780,6 +782,7 @@ impl Config { false } }, + group_directories_first: options.is_present(options::GROUP_DIRECTORIES_FIRST), }) } } @@ -1397,6 +1400,12 @@ pub fn uu_app<'a>() -> Command<'a> { .long(options::CONTEXT) .help(CONTEXT_HELP_TEXT), ) + .arg( + Arg::new(options::GROUP_DIRECTORIES_FIRST) + .long(options::GROUP_DIRECTORIES_FIRST) + .help("group directories before files; can be augmented with \ + a --sort option, but any use of --sort=none (-U) disables grouping"), + ) // Positional arguments .arg( Arg::new(options::PATHS) @@ -1635,6 +1644,28 @@ fn sort_entries(entries: &mut [PathData], config: &Config, out: &mut BufWriter { + // If it metadata cannot be determined, treat as a file. + get_metadata(p.p_buf.as_path(), true).map_or_else(|_| false, |m| m.is_dir()) + } + Some(Some(m)) => m.is_dir(), + } + }); + } } fn is_hidden(file_path: &DirEntry) -> bool { From 3ea6720d46f836fd82081da25bac5c46548c2af7 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sat, 21 May 2022 09:22:24 +0200 Subject: [PATCH 238/242] Update extension ID for rust-analyzer vscode extension recommendation --- .vscode/extensions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/extensions.json b/.vscode/extensions.json index bd9dcf48561..b9c161a4c28 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -6,7 +6,7 @@ // "streetsidesoftware.code-spell-checker" ~ `cspell` spell-checker support { "recommendations": [ - "matklad.rust-analyzer", + "rust-lang.rust-analyzer", "streetsidesoftware.code-spell-checker", "foxundermoon.shell-format" ] From bcb9821e2496e341b0ab5ff6cfd00a620eb7d152 Mon Sep 17 00:00:00 2001 From: Thomas Queiroz Date: Sat, 21 May 2022 18:04:17 -0300 Subject: [PATCH 239/242] ls: take into account "." and ".." when sorting --- src/uu/ls/src/ls.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/uu/ls/src/ls.rs b/src/uu/ls/src/ls.rs index c1c6cfab488..52a5a114526 100644 --- a/src/uu/ls/src/ls.rs +++ b/src/uu/ls/src/ls.rs @@ -1732,8 +1732,6 @@ fn enter_directory( }; // Convert those entries to the PathData struct - let mut vec_path_data = Vec::new(); - for raw_entry in read_dir { let dir_entry = match raw_entry { Ok(path) => path, @@ -1747,12 +1745,11 @@ fn enter_directory( if should_display(&dir_entry, config) { let entry_path_data = PathData::new(dir_entry.path(), Some(Ok(dir_entry)), None, config, false); - vec_path_data.push(entry_path_data); + entries.push(entry_path_data); }; } - sort_entries(&mut vec_path_data, config, out); - entries.append(&mut vec_path_data); + sort_entries(&mut entries, config, out); // Print total after any error display if config.format == Format::Long || config.alloc_size { From c4606266e4cc5dec8359f82614dd2c227b4fa5e2 Mon Sep 17 00:00:00 2001 From: Thomas Queiroz Date: Sat, 21 May 2022 18:38:31 -0300 Subject: [PATCH 240/242] tests/ls: update version sort test --- tests/by-util/test_ls.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/by-util/test_ls.rs b/tests/by-util/test_ls.rs index 7b0390e70b1..d80884df0e2 100644 --- a/tests/by-util/test_ls.rs +++ b/tests/by-util/test_ls.rs @@ -2107,7 +2107,7 @@ fn test_ls_version_sort() { ); let result = scene.ucmd().arg("-a1v").succeeds(); - expected.insert(0, ".."); + expected.insert(expected.len() - 1, ".."); expected.insert(0, "."); assert_eq!( result.stdout_str().split('\n').collect::>(), From 0b24839a1e6f94f9009baabc08443fa5bf16381e Mon Sep 17 00:00:00 2001 From: Thomas Queiroz Date: Sat, 21 May 2022 18:50:32 -0300 Subject: [PATCH 241/242] tests/ls: add --group-directories-first test --- tests/by-util/test_ls.rs | 53 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/tests/by-util/test_ls.rs b/tests/by-util/test_ls.rs index d80884df0e2..ba95fa6a1a6 100644 --- a/tests/by-util/test_ls.rs +++ b/tests/by-util/test_ls.rs @@ -1301,6 +1301,59 @@ fn test_ls_deref() { assert!(!re.is_match(result.stdout_str().trim())); } +#[test] +fn test_ls_group_directories_first() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + let mut filenames = ["file1", "file2", "anotherFile", "abc", "xxx", "zzz"]; + for filename in filenames { + at.touch(filename); + } + filenames.sort_unstable(); + + let dirnames = ["aaa", "bbb", "ccc", "yyy"]; + for dirname in dirnames { + at.mkdir(dirname); + } + + let dots = [".", ".."]; + + let result = scene + .ucmd() + .arg("-1a") + .arg("--group-directories-first") + .run(); + assert_eq!( + result.stdout_str().split('\n').collect::>(), + dots.into_iter() + .chain(dirnames.into_iter()) + .chain(filenames.into_iter()) + .chain([""].into_iter()) + .collect::>(), + ); + + let result = scene + .ucmd() + .arg("-1ar") + .arg("--group-directories-first") + .run(); + assert_eq!( + result.stdout_str().split('\n').collect::>(), + (dirnames.into_iter().rev()) + .chain(dots.into_iter().rev()) + .chain(filenames.into_iter().rev()) + .chain([""].into_iter()) + .collect::>(), + ); + + let result = scene + .ucmd() + .arg("-1aU") + .arg("--group-directories-first") + .run(); + let result2 = scene.ucmd().arg("-1aU").run(); + assert_eq!(result.stdout_str(), result2.stdout_str()); +} #[test] fn test_ls_sort_none() { let scene = TestScenario::new(util_name!()); From eae07adfb182cc1c9e69ee7e55128587095bca87 Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Sun, 22 May 2022 19:57:19 +0200 Subject: [PATCH 242/242] Version 0.0.14 (#3553) Version 0.0.14 --- Cargo.lock | 479 ++++++++++++------------- Cargo.toml | 206 +++++------ src/uu/arch/Cargo.toml | 2 +- src/uu/base32/Cargo.toml | 2 +- src/uu/base64/Cargo.toml | 2 +- src/uu/basename/Cargo.toml | 2 +- src/uu/basenc/Cargo.toml | 2 +- src/uu/cat/Cargo.toml | 2 +- src/uu/chcon/Cargo.toml | 2 +- src/uu/chgrp/Cargo.toml | 2 +- src/uu/chmod/Cargo.toml | 2 +- src/uu/chown/Cargo.toml | 2 +- src/uu/chroot/Cargo.toml | 2 +- src/uu/cksum/Cargo.toml | 2 +- src/uu/comm/Cargo.toml | 2 +- src/uu/cp/Cargo.toml | 2 +- src/uu/csplit/Cargo.toml | 2 +- src/uu/cut/Cargo.toml | 2 +- src/uu/date/Cargo.toml | 2 +- src/uu/dd/Cargo.toml | 2 +- src/uu/df/Cargo.toml | 2 +- src/uu/dir/Cargo.toml | 6 +- src/uu/dircolors/Cargo.toml | 2 +- src/uu/dirname/Cargo.toml | 2 +- src/uu/du/Cargo.toml | 2 +- src/uu/echo/Cargo.toml | 2 +- src/uu/env/Cargo.toml | 2 +- src/uu/expand/Cargo.toml | 2 +- src/uu/expr/Cargo.toml | 2 +- src/uu/factor/Cargo.toml | 2 +- src/uu/false/Cargo.toml | 2 +- src/uu/fmt/Cargo.toml | 2 +- src/uu/fold/Cargo.toml | 2 +- src/uu/groups/Cargo.toml | 2 +- src/uu/hashsum/Cargo.toml | 2 +- src/uu/head/Cargo.toml | 2 +- src/uu/hostid/Cargo.toml | 2 +- src/uu/hostname/Cargo.toml | 2 +- src/uu/id/Cargo.toml | 2 +- src/uu/install/Cargo.toml | 2 +- src/uu/join/Cargo.toml | 2 +- src/uu/kill/Cargo.toml | 2 +- src/uu/link/Cargo.toml | 2 +- src/uu/ln/Cargo.toml | 2 +- src/uu/logname/Cargo.toml | 2 +- src/uu/ls/Cargo.toml | 2 +- src/uu/mkdir/Cargo.toml | 2 +- src/uu/mkfifo/Cargo.toml | 2 +- src/uu/mknod/Cargo.toml | 2 +- src/uu/mktemp/Cargo.toml | 2 +- src/uu/more/Cargo.toml | 2 +- src/uu/mv/Cargo.toml | 2 +- src/uu/nice/Cargo.toml | 2 +- src/uu/nl/Cargo.toml | 2 +- src/uu/nohup/Cargo.toml | 2 +- src/uu/nproc/Cargo.toml | 2 +- src/uu/numfmt/Cargo.toml | 2 +- src/uu/od/Cargo.toml | 2 +- src/uu/paste/Cargo.toml | 2 +- src/uu/pathchk/Cargo.toml | 2 +- src/uu/pinky/Cargo.toml | 2 +- src/uu/pr/Cargo.toml | 2 +- src/uu/printenv/Cargo.toml | 2 +- src/uu/printf/Cargo.toml | 2 +- src/uu/ptx/Cargo.toml | 2 +- src/uu/pwd/Cargo.toml | 2 +- src/uu/readlink/Cargo.toml | 2 +- src/uu/realpath/Cargo.toml | 2 +- src/uu/relpath/Cargo.toml | 2 +- src/uu/rm/Cargo.toml | 2 +- src/uu/rmdir/Cargo.toml | 2 +- src/uu/runcon/Cargo.toml | 2 +- src/uu/seq/Cargo.toml | 2 +- src/uu/shred/Cargo.toml | 2 +- src/uu/shuf/Cargo.toml | 2 +- src/uu/sleep/Cargo.toml | 2 +- src/uu/sort/Cargo.toml | 2 +- src/uu/split/Cargo.toml | 2 +- src/uu/stat/Cargo.toml | 2 +- src/uu/stdbuf/Cargo.toml | 4 +- src/uu/stdbuf/src/libstdbuf/Cargo.toml | 2 +- src/uu/sum/Cargo.toml | 2 +- src/uu/sync/Cargo.toml | 2 +- src/uu/tac/Cargo.toml | 2 +- src/uu/tail/Cargo.toml | 4 +- src/uu/tee/Cargo.toml | 2 +- src/uu/test/Cargo.toml | 2 +- src/uu/timeout/Cargo.toml | 2 +- src/uu/touch/Cargo.toml | 2 +- src/uu/tr/Cargo.toml | 2 +- src/uu/true/Cargo.toml | 2 +- src/uu/truncate/Cargo.toml | 2 +- src/uu/tsort/Cargo.toml | 2 +- src/uu/tty/Cargo.toml | 2 +- src/uu/uname/Cargo.toml | 2 +- src/uu/unexpand/Cargo.toml | 2 +- src/uu/uniq/Cargo.toml | 2 +- src/uu/unlink/Cargo.toml | 2 +- src/uu/uptime/Cargo.toml | 2 +- src/uu/users/Cargo.toml | 2 +- src/uu/vdir/Cargo.toml | 4 +- src/uu/wc/Cargo.toml | 2 +- src/uu/who/Cargo.toml | 2 +- src/uu/whoami/Cargo.toml | 2 +- src/uu/yes/Cargo.toml | 2 +- src/uucore/Cargo.toml | 2 +- src/uucore_procs/Cargo.toml | 2 +- util/update-version.sh | 12 +- 108 files changed, 446 insertions(+), 471 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5a978a6ba14..40fdcfd2af8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -69,9 +69,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 = "bigdecimal" @@ -109,7 +109,7 @@ dependencies = [ "log", "peeking_take_while", "proc-macro2", - "quote 1.0.14", + "quote 1.0.18", "regex", "rustc-hash", "shlex", @@ -149,9 +149,9 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.10.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1d36a02058e76b040de25a4464ba1c80935655595b661505c8b39b664828b95" +checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" dependencies = [ "generic-array", ] @@ -190,9 +190,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "cc" -version = "1.0.72" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" [[package]] name = "cexpr" @@ -230,9 +230,9 @@ dependencies = [ [[package]] name = "clang-sys" -version = "1.3.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa66045b9cb23c2e9c1520732030608b02ee07e5cfaa5a521ec15ded7fa24c90" +checksum = "bf6b561dcf059c85bbe388e0a7b0a1469acb3934cc0cfa148613a830629e3049" dependencies = [ "glob", "libc", @@ -312,7 +312,7 @@ dependencies = [ [[package]] name = "coreutils" -version = "0.0.13" +version = "0.0.14" dependencies = [ "atty", "chrono", @@ -458,9 +458,9 @@ dependencies = [ [[package]] name = "cpp" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4875a08600be48dcc9cb6ee07f104a3e0752e95184dede6a30044d6480bf50e8" +checksum = "dec5e86d4f6547f0218ad923d9508244a71ef83b763196e6698b4f70f3595185" dependencies = [ "cpp_macros", ] @@ -493,9 +493,9 @@ dependencies = [ [[package]] name = "cpp_common" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df78ad28e5fe814285016779fb3d3b874520c799a847e6190bf2b834cc4ff283" +checksum = "76071bb9c8c4dd2b5eb209907deab7b031323cf1be3dfdc6ec5d37f4f187d8a1" dependencies = [ "lazy_static", "proc-macro2", @@ -504,17 +504,16 @@ dependencies = [ [[package]] name = "cpp_macros" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f93a21e618c10abc84ebb63ffa5952e1f7a4568b8141d542d5ef860e4a8fc25" +checksum = "7fdaa01904c12a8989dbfa110b41ef27efc432ac9934f691b9732f01cb64dc01" dependencies = [ "aho-corasick", "byteorder", - "cpp_common 0.5.6", - "if_rust_version", + "cpp_common 0.5.7", "lazy_static", "proc-macro2", - "quote 1.0.14", + "quote 1.0.18", "syn", ] @@ -526,7 +525,7 @@ checksum = "a8cd649bf5b3804d92fe12a60c7698f5a538a6033ed8a668bf5241d4d4f1644e" dependencies = [ "cpp_synom", "quote 0.3.15", - "unicode-xid 0.0.4", + "unicode-xid", ] [[package]] @@ -546,14 +545,14 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fc8da5694233b646150c785118f77835ad0a49680c7f312a10ef30957c67b6d" dependencies = [ - "unicode-xid 0.0.4", + "unicode-xid", ] [[package]] name = "cpufeatures" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" dependencies = [ "libc", ] @@ -569,9 +568,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.2" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e54ea8bc3fb1ee042f5aace6e3c6e025d3874866da222930f70ce62aceba0bfa" +checksum = "5aaa7bd5fb665c6864b5f963dd9097905c54125909c7aa94c9e18507cdbe6c53" dependencies = [ "cfg-if 1.0.0", "crossbeam-utils", @@ -590,10 +589,11 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.6" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97242a70df9b89a65d0b6df3c4bf5b9ce03c5b7309019777fbde37e7537f8762" +checksum = "1145cf131a2c6ba0615079ab6a638f7e1973ac9c2634fcbeaaad6114246efe8c" dependencies = [ + "autocfg", "cfg-if 1.0.0", "crossbeam-utils", "lazy_static", @@ -603,9 +603,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcae03edb34f947e64acdb1c33ec169824e20657e9ecb61cef6c8c74dcb8120" +checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" dependencies = [ "cfg-if 1.0.0", "lazy_static", @@ -648,11 +648,11 @@ dependencies = [ [[package]] name = "ctor" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccc0a48a9b826acdf4028595adc9db92caea352f7af011a3034acd172a52a0aa" +checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c" dependencies = [ - "quote 1.0.14", + "quote 1.0.18", "syn", ] @@ -785,9 +785,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "779d043b6a0b90cc4c0ed7ee380a6504394cee7efd7db050e3774eee387324b2" +checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" dependencies = [ "instant", ] @@ -812,9 +812,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +checksum = "b39522e96686d38f4bc984b9198e3a0613264abaebaff2c5c918bfa6b6da09af" dependencies = [ "cfg-if 1.0.0", "crc32fast", @@ -865,9 +865,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418d37c8b1d42553c93648be529cb70f920d3baf8ef469b74b9638df426e0b4c" +checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" dependencies = [ "cfg-if 1.0.0", "libc", @@ -945,17 +945,11 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" -[[package]] -name = "if_rust_version" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46dbcb333e86939721589d25a3557e180b52778cb33c7fdfe9e0158ff790d5ec" - [[package]] name = "indexmap" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" +checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" dependencies = [ "autocfg", "hashbrown 0.11.2", @@ -987,9 +981,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" [[package]] name = "keccak" @@ -1037,18 +1031,19 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" +checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" dependencies = [ + "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.14" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if 1.0.0", ] @@ -1118,35 +1113,23 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.4.4" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082" dependencies = [ "adler", - "autocfg", ] [[package]] name = "mio" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9" +checksum = "713d550d9b44d89174e066b7a6217ae06234c10cb47819a88290d2b353c31799" dependencies = [ "libc", "log", - "miow", - "ntapi", "wasi 0.11.0+wasi-snapshot-preview1", - "winapi 0.3.9", -] - -[[package]] -name = "miow" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi 0.3.9", + "windows-sys", ] [[package]] @@ -1171,15 +1154,6 @@ dependencies = [ "minimal-lexical", ] -[[package]] -name = "ntapi" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" -dependencies = [ - "winapi 0.3.9", -] - [[package]] name = "num-bigint" version = "0.4.3" @@ -1193,9 +1167,9 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ "autocfg", "num-traits", @@ -1222,9 +1196,9 @@ dependencies = [ [[package]] name = "num_threads" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aba1801fb138d8e85e11d0fc70baf4fe1cdfffda7c6cd34a854905df588e5ed0" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" dependencies = [ "libc", ] @@ -1243,9 +1217,9 @@ checksum = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" [[package]] name = "once_cell" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" +checksum = "7b10983b38c53aebdf33f542c6275b0f58a238129d00c4ae0e6fb59738d783ca" [[package]] name = "onig" @@ -1290,9 +1264,9 @@ dependencies = [ [[package]] name = "os_str_bytes" -version = "6.0.0" +version = "6.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" +checksum = "029d8d0b2f198229de29dca79676f2738ff952edf3fde542eb8bf94d8c21b435" [[package]] name = "ouroboros" @@ -1314,15 +1288,15 @@ dependencies = [ "Inflector", "proc-macro-error", "proc-macro2", - "quote 1.0.14", + "quote 1.0.18", "syn", ] [[package]] name = "output_vt100" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53cdc5b785b7a58c5aad8216b3dfa114df64b0b06ae6e1501cef91df2fbdf8f9" +checksum = "628223faebab4e3e40667ee0b2336d34a5b960ff60ea743ddfdbcf7770bcfb66" dependencies = [ "winapi 0.3.9", ] @@ -1339,9 +1313,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.1" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954" +checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" dependencies = [ "cfg-if 1.0.0", "libc", @@ -1352,9 +1326,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0744126afe1a6dd7f394cb50a716dbe086cb06e255e53d8d0185d82828358fb5" +checksum = "0c520e05135d6e763148b6426a837e239041653ba7becd2e538c076c738025fc" [[package]] name = "peeking_take_while" @@ -1402,9 +1376,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.24" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" [[package]] name = "platform-info" @@ -1442,7 +1416,7 @@ checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", "proc-macro2", - "quote 1.0.14", + "quote 1.0.18", "syn", "version_check", ] @@ -1454,17 +1428,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ "proc-macro2", - "quote 1.0.14", + "quote 1.0.18", "version_check", ] [[package]] name = "proc-macro2" -version = "1.0.36" +version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" dependencies = [ - "unicode-xid 0.2.2", + "unicode-ident", ] [[package]] @@ -1492,9 +1466,9 @@ checksum = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" [[package]] name = "quote" -version = "1.0.14" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47aa80447ce4daf1717500037052af176af5d38cc3e571d9ec1c7353fc10c87d" +checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" dependencies = [ "proc-macro2", ] @@ -1543,9 +1517,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.9.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f51245e1e62e1f1629cbfec37b5793bbabcaeb90f30e94d2ba03564687353e4" +checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" dependencies = [ "crossbeam-channel", "crossbeam-deque", @@ -1579,9 +1553,9 @@ checksum = "ef445213a92fdddc4bc69d9111156d20ffd50704a86ad82b372aab701a0d3a9a" [[package]] name = "regex" -version = "1.5.5" +version = "1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1" dependencies = [ "aho-corasick", "memchr 2.5.0", @@ -1596,9 +1570,9 @@ checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" [[package]] name = "regex-syntax" -version = "0.6.25" +version = "0.6.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" [[package]] name = "remove_dir_all" @@ -1690,9 +1664,9 @@ dependencies = [ [[package]] name = "selinux-sys" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d842d177120716580c4c6cb56dfe3c5f3a3e3dcec635091f1b2034b6c0be4c6" +checksum = "12d374f91738fab4e9e49c656eca7de906b8ec3740c0b792ff0f397b247cb1a5" dependencies = [ "bindgen", "cc", @@ -1770,9 +1744,9 @@ dependencies = [ [[package]] name = "siphasher" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a86232ab60fa71287d7f2ddae4a7073f6b7aac33631c3015abb556f08c6d0a3e" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" [[package]] name = "smallvec" @@ -1788,9 +1762,9 @@ checksum = "f67ad224767faa3c7d8b6d91985b78e70a1324408abcb1cfcc2be4c06bc06043" [[package]] name = "socket2" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f82496b90c36d70af5fcd482edaa2e0bd16fade569de1330405fecbbdac736b" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" dependencies = [ "libc", "winapi 0.3.9", @@ -1828,7 +1802,7 @@ checksum = "6878079b17446e4d3eba6192bb0a2950d5b14f0ed8424b852310e5a94345d0ef" dependencies = [ "heck", "proc-macro2", - "quote 1.0.14", + "quote 1.0.18", "rustversion", "syn", ] @@ -1841,13 +1815,13 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.86" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" +checksum = "fbaf6116ab8924f39d52792136fb74fd60a80194cf1b1c6ffa6453eef1c3f942" dependencies = [ "proc-macro2", - "quote 1.0.14", - "unicode-xid 0.2.2", + "quote 1.0.18", + "unicode-ident", ] [[package]] @@ -1875,9 +1849,9 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" dependencies = [ "winapi-util", ] @@ -1954,7 +1928,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" dependencies = [ "proc-macro2", - "quote 1.0.14", + "quote 1.0.18", "syn", ] @@ -1993,6 +1967,12 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +[[package]] +name = "unicode-ident" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" + [[package]] name = "unicode-linebreak" version = "0.1.2" @@ -2020,12 +2000,6 @@ version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" -[[package]] -name = "unicode-xid" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" - [[package]] name = "unindent" version = "0.1.9" @@ -2060,13 +2034,13 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] name = "utf8-width" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cf7d77f457ef8dfa11e4cd5933c5ddb5dc52a94664071951219a97710f0a32b" +checksum = "5190c9442dcdaf0ddd50f37420417d219ae5261bbf5db120d0f9bab996c9cba1" [[package]] name = "uu_arch" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "platform-info", @@ -2075,7 +2049,7 @@ dependencies = [ [[package]] name = "uu_base32" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2083,7 +2057,7 @@ dependencies = [ [[package]] name = "uu_base64" -version = "0.0.13" +version = "0.0.14" dependencies = [ "uu_base32", "uucore", @@ -2091,7 +2065,7 @@ dependencies = [ [[package]] name = "uu_basename" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2099,7 +2073,7 @@ dependencies = [ [[package]] name = "uu_basenc" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uu_base32", @@ -2108,7 +2082,7 @@ dependencies = [ [[package]] name = "uu_cat" -version = "0.0.13" +version = "0.0.14" dependencies = [ "atty", "clap 3.1.18", @@ -2120,7 +2094,7 @@ dependencies = [ [[package]] name = "uu_chcon" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "fts-sys", @@ -2132,7 +2106,7 @@ dependencies = [ [[package]] name = "uu_chgrp" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2140,7 +2114,7 @@ dependencies = [ [[package]] name = "uu_chmod" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "libc", @@ -2149,7 +2123,7 @@ dependencies = [ [[package]] name = "uu_chown" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2157,7 +2131,7 @@ dependencies = [ [[package]] name = "uu_chroot" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2165,7 +2139,7 @@ dependencies = [ [[package]] name = "uu_cksum" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2173,7 +2147,7 @@ dependencies = [ [[package]] name = "uu_comm" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2181,7 +2155,7 @@ dependencies = [ [[package]] name = "uu_cp" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "exacl", @@ -2198,7 +2172,7 @@ dependencies = [ [[package]] name = "uu_csplit" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "regex", @@ -2208,7 +2182,7 @@ dependencies = [ [[package]] name = "uu_cut" -version = "0.0.13" +version = "0.0.14" dependencies = [ "atty", "bstr", @@ -2219,7 +2193,7 @@ dependencies = [ [[package]] name = "uu_date" -version = "0.0.13" +version = "0.0.14" dependencies = [ "chrono", "clap 3.1.18", @@ -2230,7 +2204,7 @@ dependencies = [ [[package]] name = "uu_dd" -version = "0.0.13" +version = "0.0.14" dependencies = [ "byte-unit", "clap 3.1.18", @@ -2242,7 +2216,7 @@ dependencies = [ [[package]] name = "uu_df" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "number_prefix", @@ -2252,7 +2226,7 @@ dependencies = [ [[package]] name = "uu_dir" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "selinux", @@ -2262,7 +2236,7 @@ dependencies = [ [[package]] name = "uu_dircolors" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "glob", @@ -2271,7 +2245,7 @@ dependencies = [ [[package]] name = "uu_dirname" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2279,7 +2253,7 @@ dependencies = [ [[package]] name = "uu_du" -version = "0.0.13" +version = "0.0.14" dependencies = [ "chrono", "clap 3.1.18", @@ -2290,7 +2264,7 @@ dependencies = [ [[package]] name = "uu_echo" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2298,7 +2272,7 @@ dependencies = [ [[package]] name = "uu_env" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "rust-ini", @@ -2307,7 +2281,7 @@ dependencies = [ [[package]] name = "uu_expand" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "unicode-width", @@ -2316,7 +2290,7 @@ dependencies = [ [[package]] name = "uu_expr" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "num-bigint", @@ -2327,7 +2301,7 @@ dependencies = [ [[package]] name = "uu_factor" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "coz", @@ -2341,7 +2315,7 @@ dependencies = [ [[package]] name = "uu_false" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2349,7 +2323,7 @@ dependencies = [ [[package]] name = "uu_fmt" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "unicode-width", @@ -2358,7 +2332,7 @@ dependencies = [ [[package]] name = "uu_fold" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2366,7 +2340,7 @@ dependencies = [ [[package]] name = "uu_groups" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2374,7 +2348,7 @@ dependencies = [ [[package]] name = "uu_hashsum" -version = "0.0.13" +version = "0.0.14" dependencies = [ "blake2b_simd", "blake3", @@ -2392,7 +2366,7 @@ dependencies = [ [[package]] name = "uu_head" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "memchr 2.5.0", @@ -2401,7 +2375,7 @@ dependencies = [ [[package]] name = "uu_hostid" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "libc", @@ -2410,7 +2384,7 @@ dependencies = [ [[package]] name = "uu_hostname" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "hostname", @@ -2420,7 +2394,7 @@ dependencies = [ [[package]] name = "uu_id" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "selinux", @@ -2429,7 +2403,7 @@ dependencies = [ [[package]] name = "uu_install" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "file_diff", @@ -2441,7 +2415,7 @@ dependencies = [ [[package]] name = "uu_join" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "memchr 2.5.0", @@ -2450,7 +2424,7 @@ dependencies = [ [[package]] name = "uu_kill" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "nix", @@ -2459,7 +2433,7 @@ dependencies = [ [[package]] name = "uu_link" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2467,7 +2441,7 @@ dependencies = [ [[package]] name = "uu_ln" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2475,7 +2449,7 @@ dependencies = [ [[package]] name = "uu_logname" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "libc", @@ -2484,7 +2458,7 @@ dependencies = [ [[package]] name = "uu_ls" -version = "0.0.13" +version = "0.0.14" dependencies = [ "atty", "chrono", @@ -2503,7 +2477,7 @@ dependencies = [ [[package]] name = "uu_mkdir" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2511,7 +2485,7 @@ dependencies = [ [[package]] name = "uu_mkfifo" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "libc", @@ -2520,7 +2494,7 @@ dependencies = [ [[package]] name = "uu_mknod" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "libc", @@ -2529,7 +2503,7 @@ dependencies = [ [[package]] name = "uu_mktemp" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "rand", @@ -2539,7 +2513,7 @@ dependencies = [ [[package]] name = "uu_more" -version = "0.0.13" +version = "0.0.14" dependencies = [ "atty", "clap 3.1.18", @@ -2552,7 +2526,7 @@ dependencies = [ [[package]] name = "uu_mv" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "fs_extra", @@ -2561,7 +2535,7 @@ dependencies = [ [[package]] name = "uu_nice" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "libc", @@ -2571,7 +2545,7 @@ dependencies = [ [[package]] name = "uu_nl" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "regex", @@ -2580,7 +2554,7 @@ dependencies = [ [[package]] name = "uu_nohup" -version = "0.0.13" +version = "0.0.14" dependencies = [ "atty", "clap 3.1.18", @@ -2590,7 +2564,7 @@ dependencies = [ [[package]] name = "uu_nproc" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "libc", @@ -2600,7 +2574,7 @@ dependencies = [ [[package]] name = "uu_numfmt" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2608,7 +2582,7 @@ dependencies = [ [[package]] name = "uu_od" -version = "0.0.13" +version = "0.0.14" dependencies = [ "byteorder", "clap 3.1.18", @@ -2618,7 +2592,7 @@ dependencies = [ [[package]] name = "uu_paste" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2626,7 +2600,7 @@ dependencies = [ [[package]] name = "uu_pathchk" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "libc", @@ -2635,7 +2609,7 @@ dependencies = [ [[package]] name = "uu_pinky" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2643,7 +2617,7 @@ dependencies = [ [[package]] name = "uu_pr" -version = "0.0.13" +version = "0.0.14" dependencies = [ "chrono", "clap 3.1.18", @@ -2655,7 +2629,7 @@ dependencies = [ [[package]] name = "uu_printenv" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2663,7 +2637,7 @@ dependencies = [ [[package]] name = "uu_printf" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2671,7 +2645,7 @@ dependencies = [ [[package]] name = "uu_ptx" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "regex", @@ -2680,7 +2654,7 @@ dependencies = [ [[package]] name = "uu_pwd" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2688,7 +2662,7 @@ dependencies = [ [[package]] name = "uu_readlink" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2696,7 +2670,7 @@ dependencies = [ [[package]] name = "uu_realpath" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2704,7 +2678,7 @@ dependencies = [ [[package]] name = "uu_relpath" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2712,7 +2686,7 @@ dependencies = [ [[package]] name = "uu_rm" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "remove_dir_all 0.7.0", @@ -2723,7 +2697,7 @@ dependencies = [ [[package]] name = "uu_rmdir" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "libc", @@ -2732,7 +2706,7 @@ dependencies = [ [[package]] name = "uu_runcon" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "libc", @@ -2743,7 +2717,7 @@ dependencies = [ [[package]] name = "uu_seq" -version = "0.0.13" +version = "0.0.14" dependencies = [ "bigdecimal", "clap 3.1.18", @@ -2754,7 +2728,7 @@ dependencies = [ [[package]] name = "uu_shred" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "rand", @@ -2763,7 +2737,7 @@ dependencies = [ [[package]] name = "uu_shuf" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "rand", @@ -2773,7 +2747,7 @@ dependencies = [ [[package]] name = "uu_sleep" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2781,7 +2755,7 @@ dependencies = [ [[package]] name = "uu_sort" -version = "0.0.13" +version = "0.0.14" dependencies = [ "binary-heap-plus", "clap 3.1.18", @@ -2800,7 +2774,7 @@ dependencies = [ [[package]] name = "uu_split" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "memchr 2.5.0", @@ -2809,7 +2783,7 @@ dependencies = [ [[package]] name = "uu_stat" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2817,7 +2791,7 @@ dependencies = [ [[package]] name = "uu_stdbuf" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "tempfile", @@ -2827,7 +2801,7 @@ dependencies = [ [[package]] name = "uu_stdbuf_libstdbuf" -version = "0.0.13" +version = "0.0.14" dependencies = [ "cpp", "cpp_build", @@ -2837,7 +2811,7 @@ dependencies = [ [[package]] name = "uu_sum" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2845,7 +2819,7 @@ dependencies = [ [[package]] name = "uu_sync" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "libc", @@ -2855,7 +2829,7 @@ dependencies = [ [[package]] name = "uu_tac" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "memchr 2.5.0", @@ -2866,7 +2840,7 @@ dependencies = [ [[package]] name = "uu_tail" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "libc", @@ -2877,7 +2851,7 @@ dependencies = [ [[package]] name = "uu_tee" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "libc", @@ -2887,7 +2861,7 @@ dependencies = [ [[package]] name = "uu_test" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "libc", @@ -2897,7 +2871,7 @@ dependencies = [ [[package]] name = "uu_timeout" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "libc", @@ -2907,7 +2881,7 @@ dependencies = [ [[package]] name = "uu_touch" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "filetime", @@ -2918,7 +2892,7 @@ dependencies = [ [[package]] name = "uu_tr" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "nom", @@ -2927,7 +2901,7 @@ dependencies = [ [[package]] name = "uu_true" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2935,7 +2909,7 @@ dependencies = [ [[package]] name = "uu_truncate" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2943,7 +2917,7 @@ dependencies = [ [[package]] name = "uu_tsort" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2951,7 +2925,7 @@ dependencies = [ [[package]] name = "uu_tty" -version = "0.0.13" +version = "0.0.14" dependencies = [ "atty", "clap 3.1.18", @@ -2961,7 +2935,7 @@ dependencies = [ [[package]] name = "uu_uname" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "platform-info", @@ -2970,7 +2944,7 @@ dependencies = [ [[package]] name = "uu_unexpand" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "unicode-width", @@ -2979,7 +2953,7 @@ dependencies = [ [[package]] name = "uu_uniq" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "strum", @@ -2989,7 +2963,7 @@ dependencies = [ [[package]] name = "uu_unlink" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -2997,7 +2971,7 @@ dependencies = [ [[package]] name = "uu_uptime" -version = "0.0.13" +version = "0.0.14" dependencies = [ "chrono", "clap 3.1.18", @@ -3006,7 +2980,7 @@ dependencies = [ [[package]] name = "uu_users" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -3014,7 +2988,7 @@ dependencies = [ [[package]] name = "uu_vdir" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "selinux", @@ -3024,7 +2998,7 @@ dependencies = [ [[package]] name = "uu_wc" -version = "0.0.13" +version = "0.0.14" dependencies = [ "bytecount", "clap 3.1.18", @@ -3037,7 +3011,7 @@ dependencies = [ [[package]] name = "uu_who" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "uucore", @@ -3045,7 +3019,7 @@ dependencies = [ [[package]] name = "uu_whoami" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "libc", @@ -3055,7 +3029,7 @@ dependencies = [ [[package]] name = "uu_yes" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "nix", @@ -3064,7 +3038,7 @@ dependencies = [ [[package]] name = "uucore" -version = "0.0.13" +version = "0.0.14" dependencies = [ "clap 3.1.18", "data-encoding", @@ -3089,10 +3063,10 @@ dependencies = [ [[package]] name = "uucore_procs" -version = "0.0.13" +version = "0.0.14" dependencies = [ "proc-macro2", - "quote 1.0.14", + "quote 1.0.18", ] [[package]] @@ -3138,9 +3112,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "which" -version = "4.2.2" +version = "4.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea187a8ef279bc014ec368c27a920da2024d2a711109bfbe3440585d5cf27ad9" +checksum = "5c4fb54e6113b6a8772ee41c3404fb0301ac79604489467e0a9ce1f3e97c24ae" dependencies = [ "either", "lazy_static", @@ -3201,9 +3175,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.32.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df6e476185f92a12c072be4a189a0210dcdcf512a1891d6dff9edb874deadc6" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" dependencies = [ "windows_aarch64_msvc", "windows_i686_gnu", @@ -3214,33 +3188,33 @@ dependencies = [ [[package]] name = "windows_aarch64_msvc" -version = "0.32.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" [[package]] name = "windows_i686_gnu" -version = "0.32.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" [[package]] name = "windows_i686_msvc" -version = "0.32.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" [[package]] name = "windows_x86_64_gnu" -version = "0.32.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" [[package]] name = "windows_x86_64_msvc" -version = "0.32.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" [[package]] name = "xattr" @@ -3259,11 +3233,12 @@ checksum = "2a599daf1b507819c1121f0bf87fa37eb19daac6aff3aefefd4e6e2e0f2020fc" [[package]] name = "zip" -version = "0.6.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6fa4aa90e99fb8d701bda16fb040d8ed2f9c7176fb44de750e880a74b580315" +checksum = "bf225bcf73bb52cbb496e70475c7bd7a3f769df699c0020f6c7bd9a96dcf0b8d" dependencies = [ "byteorder", "crc32fast", + "crossbeam-utils", "flate2", ] diff --git a/Cargo.toml b/Cargo.toml index d9e942b2188..c288ad0b912 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ [package] name = "coreutils" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "coreutils ~ GNU coreutils (updated); implemented as universal (cross-platform) utils, written in Rust" @@ -268,109 +268,109 @@ uucore = { version=">=0.0.11", package="uucore", path="src/uucore" } selinux = { version="0.2", optional = true } zip = { version = "0.6.0", optional=true, default_features=false, features=["deflate"] } # * uutils -uu_test = { optional=true, version="0.0.13", package="uu_test", path="src/uu/test" } +uu_test = { optional=true, version="0.0.14", package="uu_test", path="src/uu/test" } # -arch = { optional=true, version="0.0.13", package="uu_arch", path="src/uu/arch" } -base32 = { optional=true, version="0.0.13", package="uu_base32", path="src/uu/base32" } -base64 = { optional=true, version="0.0.13", package="uu_base64", path="src/uu/base64" } -basename = { optional=true, version="0.0.13", package="uu_basename", path="src/uu/basename" } -basenc = { optional=true, version="0.0.13", package="uu_basenc", path="src/uu/basenc" } -cat = { optional=true, version="0.0.13", package="uu_cat", path="src/uu/cat" } -chcon = { optional=true, version="0.0.13", package="uu_chcon", path="src/uu/chcon" } -chgrp = { optional=true, version="0.0.13", package="uu_chgrp", path="src/uu/chgrp" } -chmod = { optional=true, version="0.0.13", package="uu_chmod", path="src/uu/chmod" } -chown = { optional=true, version="0.0.13", package="uu_chown", path="src/uu/chown" } -chroot = { optional=true, version="0.0.13", package="uu_chroot", path="src/uu/chroot" } -cksum = { optional=true, version="0.0.13", package="uu_cksum", path="src/uu/cksum" } -comm = { optional=true, version="0.0.13", package="uu_comm", path="src/uu/comm" } -cp = { optional=true, version="0.0.13", package="uu_cp", path="src/uu/cp" } -csplit = { optional=true, version="0.0.13", package="uu_csplit", path="src/uu/csplit" } -cut = { optional=true, version="0.0.13", package="uu_cut", path="src/uu/cut" } -date = { optional=true, version="0.0.13", package="uu_date", path="src/uu/date" } -dd = { optional=true, version="0.0.13", package="uu_dd", path="src/uu/dd" } -df = { optional=true, version="0.0.13", package="uu_df", path="src/uu/df" } -dir = { optional=true, version="0.0.13", package="uu_dir", path="src/uu/dir" } -dircolors= { optional=true, version="0.0.13", package="uu_dircolors", path="src/uu/dircolors" } -dirname = { optional=true, version="0.0.13", package="uu_dirname", path="src/uu/dirname" } -du = { optional=true, version="0.0.13", package="uu_du", path="src/uu/du" } -echo = { optional=true, version="0.0.13", package="uu_echo", path="src/uu/echo" } -env = { optional=true, version="0.0.13", package="uu_env", path="src/uu/env" } -expand = { optional=true, version="0.0.13", package="uu_expand", path="src/uu/expand" } -expr = { optional=true, version="0.0.13", package="uu_expr", path="src/uu/expr" } -factor = { optional=true, version="0.0.13", package="uu_factor", path="src/uu/factor" } -false = { optional=true, version="0.0.13", package="uu_false", path="src/uu/false" } -fmt = { optional=true, version="0.0.13", package="uu_fmt", path="src/uu/fmt" } -fold = { optional=true, version="0.0.13", package="uu_fold", path="src/uu/fold" } -groups = { optional=true, version="0.0.13", package="uu_groups", path="src/uu/groups" } -hashsum = { optional=true, version="0.0.13", package="uu_hashsum", path="src/uu/hashsum" } -head = { optional=true, version="0.0.13", package="uu_head", path="src/uu/head" } -hostid = { optional=true, version="0.0.13", package="uu_hostid", path="src/uu/hostid" } -hostname = { optional=true, version="0.0.13", package="uu_hostname", path="src/uu/hostname" } -id = { optional=true, version="0.0.13", package="uu_id", path="src/uu/id" } -install = { optional=true, version="0.0.13", package="uu_install", path="src/uu/install" } -join = { optional=true, version="0.0.13", package="uu_join", path="src/uu/join" } -kill = { optional=true, version="0.0.13", package="uu_kill", path="src/uu/kill" } -link = { optional=true, version="0.0.13", package="uu_link", path="src/uu/link" } -ln = { optional=true, version="0.0.13", package="uu_ln", path="src/uu/ln" } -ls = { optional=true, version="0.0.13", package="uu_ls", path="src/uu/ls" } -logname = { optional=true, version="0.0.13", package="uu_logname", path="src/uu/logname" } -mkdir = { optional=true, version="0.0.13", package="uu_mkdir", path="src/uu/mkdir" } -mkfifo = { optional=true, version="0.0.13", package="uu_mkfifo", path="src/uu/mkfifo" } -mknod = { optional=true, version="0.0.13", package="uu_mknod", path="src/uu/mknod" } -mktemp = { optional=true, version="0.0.13", package="uu_mktemp", path="src/uu/mktemp" } -more = { optional=true, version="0.0.13", package="uu_more", path="src/uu/more" } -mv = { optional=true, version="0.0.13", package="uu_mv", path="src/uu/mv" } -nice = { optional=true, version="0.0.13", package="uu_nice", path="src/uu/nice" } -nl = { optional=true, version="0.0.13", package="uu_nl", path="src/uu/nl" } -nohup = { optional=true, version="0.0.13", package="uu_nohup", path="src/uu/nohup" } -nproc = { optional=true, version="0.0.13", package="uu_nproc", path="src/uu/nproc" } -numfmt = { optional=true, version="0.0.13", package="uu_numfmt", path="src/uu/numfmt" } -od = { optional=true, version="0.0.13", package="uu_od", path="src/uu/od" } -paste = { optional=true, version="0.0.13", package="uu_paste", path="src/uu/paste" } -pathchk = { optional=true, version="0.0.13", package="uu_pathchk", path="src/uu/pathchk" } -pinky = { optional=true, version="0.0.13", package="uu_pinky", path="src/uu/pinky" } -pr = { optional=true, version="0.0.13", package="uu_pr", path="src/uu/pr" } -printenv = { optional=true, version="0.0.13", package="uu_printenv", path="src/uu/printenv" } -printf = { optional=true, version="0.0.13", package="uu_printf", path="src/uu/printf" } -ptx = { optional=true, version="0.0.13", package="uu_ptx", path="src/uu/ptx" } -pwd = { optional=true, version="0.0.13", package="uu_pwd", path="src/uu/pwd" } -readlink = { optional=true, version="0.0.13", package="uu_readlink", path="src/uu/readlink" } -realpath = { optional=true, version="0.0.13", package="uu_realpath", path="src/uu/realpath" } -relpath = { optional=true, version="0.0.13", package="uu_relpath", path="src/uu/relpath" } -rm = { optional=true, version="0.0.13", package="uu_rm", path="src/uu/rm" } -rmdir = { optional=true, version="0.0.13", package="uu_rmdir", path="src/uu/rmdir" } -runcon = { optional=true, version="0.0.13", package="uu_runcon", path="src/uu/runcon" } -seq = { optional=true, version="0.0.13", package="uu_seq", path="src/uu/seq" } -shred = { optional=true, version="0.0.13", package="uu_shred", path="src/uu/shred" } -shuf = { optional=true, version="0.0.13", package="uu_shuf", path="src/uu/shuf" } -sleep = { optional=true, version="0.0.13", package="uu_sleep", path="src/uu/sleep" } -sort = { optional=true, version="0.0.13", package="uu_sort", path="src/uu/sort" } -split = { optional=true, version="0.0.13", package="uu_split", path="src/uu/split" } -stat = { optional=true, version="0.0.13", package="uu_stat", path="src/uu/stat" } -stdbuf = { optional=true, version="0.0.13", package="uu_stdbuf", path="src/uu/stdbuf" } -sum = { optional=true, version="0.0.13", package="uu_sum", path="src/uu/sum" } -sync = { optional=true, version="0.0.13", package="uu_sync", path="src/uu/sync" } -tac = { optional=true, version="0.0.13", package="uu_tac", path="src/uu/tac" } -tail = { optional=true, version="0.0.13", package="uu_tail", path="src/uu/tail" } -tee = { optional=true, version="0.0.13", package="uu_tee", path="src/uu/tee" } -timeout = { optional=true, version="0.0.13", package="uu_timeout", path="src/uu/timeout" } -touch = { optional=true, version="0.0.13", package="uu_touch", path="src/uu/touch" } -tr = { optional=true, version="0.0.13", package="uu_tr", path="src/uu/tr" } -true = { optional=true, version="0.0.13", package="uu_true", path="src/uu/true" } -truncate = { optional=true, version="0.0.13", package="uu_truncate", path="src/uu/truncate" } -tsort = { optional=true, version="0.0.13", package="uu_tsort", path="src/uu/tsort" } -tty = { optional=true, version="0.0.13", package="uu_tty", path="src/uu/tty" } -uname = { optional=true, version="0.0.13", package="uu_uname", path="src/uu/uname" } -unexpand = { optional=true, version="0.0.13", package="uu_unexpand", path="src/uu/unexpand" } -uniq = { optional=true, version="0.0.13", package="uu_uniq", path="src/uu/uniq" } -unlink = { optional=true, version="0.0.13", package="uu_unlink", path="src/uu/unlink" } -uptime = { optional=true, version="0.0.13", package="uu_uptime", path="src/uu/uptime" } -users = { optional=true, version="0.0.13", package="uu_users", path="src/uu/users" } -vdir = { optional=true, version="0.0.13", package="uu_vdir", path="src/uu/vdir" } -wc = { optional=true, version="0.0.13", package="uu_wc", path="src/uu/wc" } -who = { optional=true, version="0.0.13", package="uu_who", path="src/uu/who" } -whoami = { optional=true, version="0.0.13", package="uu_whoami", path="src/uu/whoami" } -yes = { optional=true, version="0.0.13", package="uu_yes", path="src/uu/yes" } +arch = { optional=true, version="0.0.14", package="uu_arch", path="src/uu/arch" } +base32 = { optional=true, version="0.0.14", package="uu_base32", path="src/uu/base32" } +base64 = { optional=true, version="0.0.14", package="uu_base64", path="src/uu/base64" } +basename = { optional=true, version="0.0.14", package="uu_basename", path="src/uu/basename" } +basenc = { optional=true, version="0.0.14", package="uu_basenc", path="src/uu/basenc" } +cat = { optional=true, version="0.0.14", package="uu_cat", path="src/uu/cat" } +chcon = { optional=true, version="0.0.14", package="uu_chcon", path="src/uu/chcon" } +chgrp = { optional=true, version="0.0.14", package="uu_chgrp", path="src/uu/chgrp" } +chmod = { optional=true, version="0.0.14", package="uu_chmod", path="src/uu/chmod" } +chown = { optional=true, version="0.0.14", package="uu_chown", path="src/uu/chown" } +chroot = { optional=true, version="0.0.14", package="uu_chroot", path="src/uu/chroot" } +cksum = { optional=true, version="0.0.14", package="uu_cksum", path="src/uu/cksum" } +comm = { optional=true, version="0.0.14", package="uu_comm", path="src/uu/comm" } +cp = { optional=true, version="0.0.14", package="uu_cp", path="src/uu/cp" } +csplit = { optional=true, version="0.0.14", package="uu_csplit", path="src/uu/csplit" } +cut = { optional=true, version="0.0.14", package="uu_cut", path="src/uu/cut" } +date = { optional=true, version="0.0.14", package="uu_date", path="src/uu/date" } +dd = { optional=true, version="0.0.14", package="uu_dd", path="src/uu/dd" } +df = { optional=true, version="0.0.14", package="uu_df", path="src/uu/df" } +dir = { optional=true, version="0.0.14", package="uu_dir", path="src/uu/dir" } +dircolors= { optional=true, version="0.0.14", package="uu_dircolors", path="src/uu/dircolors" } +dirname = { optional=true, version="0.0.14", package="uu_dirname", path="src/uu/dirname" } +du = { optional=true, version="0.0.14", package="uu_du", path="src/uu/du" } +echo = { optional=true, version="0.0.14", package="uu_echo", path="src/uu/echo" } +env = { optional=true, version="0.0.14", package="uu_env", path="src/uu/env" } +expand = { optional=true, version="0.0.14", package="uu_expand", path="src/uu/expand" } +expr = { optional=true, version="0.0.14", package="uu_expr", path="src/uu/expr" } +factor = { optional=true, version="0.0.14", package="uu_factor", path="src/uu/factor" } +false = { optional=true, version="0.0.14", package="uu_false", path="src/uu/false" } +fmt = { optional=true, version="0.0.14", package="uu_fmt", path="src/uu/fmt" } +fold = { optional=true, version="0.0.14", package="uu_fold", path="src/uu/fold" } +groups = { optional=true, version="0.0.14", package="uu_groups", path="src/uu/groups" } +hashsum = { optional=true, version="0.0.14", package="uu_hashsum", path="src/uu/hashsum" } +head = { optional=true, version="0.0.14", package="uu_head", path="src/uu/head" } +hostid = { optional=true, version="0.0.14", package="uu_hostid", path="src/uu/hostid" } +hostname = { optional=true, version="0.0.14", package="uu_hostname", path="src/uu/hostname" } +id = { optional=true, version="0.0.14", package="uu_id", path="src/uu/id" } +install = { optional=true, version="0.0.14", package="uu_install", path="src/uu/install" } +join = { optional=true, version="0.0.14", package="uu_join", path="src/uu/join" } +kill = { optional=true, version="0.0.14", package="uu_kill", path="src/uu/kill" } +link = { optional=true, version="0.0.14", package="uu_link", path="src/uu/link" } +ln = { optional=true, version="0.0.14", package="uu_ln", path="src/uu/ln" } +ls = { optional=true, version="0.0.14", package="uu_ls", path="src/uu/ls" } +logname = { optional=true, version="0.0.14", package="uu_logname", path="src/uu/logname" } +mkdir = { optional=true, version="0.0.14", package="uu_mkdir", path="src/uu/mkdir" } +mkfifo = { optional=true, version="0.0.14", package="uu_mkfifo", path="src/uu/mkfifo" } +mknod = { optional=true, version="0.0.14", package="uu_mknod", path="src/uu/mknod" } +mktemp = { optional=true, version="0.0.14", package="uu_mktemp", path="src/uu/mktemp" } +more = { optional=true, version="0.0.14", package="uu_more", path="src/uu/more" } +mv = { optional=true, version="0.0.14", package="uu_mv", path="src/uu/mv" } +nice = { optional=true, version="0.0.14", package="uu_nice", path="src/uu/nice" } +nl = { optional=true, version="0.0.14", package="uu_nl", path="src/uu/nl" } +nohup = { optional=true, version="0.0.14", package="uu_nohup", path="src/uu/nohup" } +nproc = { optional=true, version="0.0.14", package="uu_nproc", path="src/uu/nproc" } +numfmt = { optional=true, version="0.0.14", package="uu_numfmt", path="src/uu/numfmt" } +od = { optional=true, version="0.0.14", package="uu_od", path="src/uu/od" } +paste = { optional=true, version="0.0.14", package="uu_paste", path="src/uu/paste" } +pathchk = { optional=true, version="0.0.14", package="uu_pathchk", path="src/uu/pathchk" } +pinky = { optional=true, version="0.0.14", package="uu_pinky", path="src/uu/pinky" } +pr = { optional=true, version="0.0.14", package="uu_pr", path="src/uu/pr" } +printenv = { optional=true, version="0.0.14", package="uu_printenv", path="src/uu/printenv" } +printf = { optional=true, version="0.0.14", package="uu_printf", path="src/uu/printf" } +ptx = { optional=true, version="0.0.14", package="uu_ptx", path="src/uu/ptx" } +pwd = { optional=true, version="0.0.14", package="uu_pwd", path="src/uu/pwd" } +readlink = { optional=true, version="0.0.14", package="uu_readlink", path="src/uu/readlink" } +realpath = { optional=true, version="0.0.14", package="uu_realpath", path="src/uu/realpath" } +relpath = { optional=true, version="0.0.14", package="uu_relpath", path="src/uu/relpath" } +rm = { optional=true, version="0.0.14", package="uu_rm", path="src/uu/rm" } +rmdir = { optional=true, version="0.0.14", package="uu_rmdir", path="src/uu/rmdir" } +runcon = { optional=true, version="0.0.14", package="uu_runcon", path="src/uu/runcon" } +seq = { optional=true, version="0.0.14", package="uu_seq", path="src/uu/seq" } +shred = { optional=true, version="0.0.14", package="uu_shred", path="src/uu/shred" } +shuf = { optional=true, version="0.0.14", package="uu_shuf", path="src/uu/shuf" } +sleep = { optional=true, version="0.0.14", package="uu_sleep", path="src/uu/sleep" } +sort = { optional=true, version="0.0.14", package="uu_sort", path="src/uu/sort" } +split = { optional=true, version="0.0.14", package="uu_split", path="src/uu/split" } +stat = { optional=true, version="0.0.14", package="uu_stat", path="src/uu/stat" } +stdbuf = { optional=true, version="0.0.14", package="uu_stdbuf", path="src/uu/stdbuf" } +sum = { optional=true, version="0.0.14", package="uu_sum", path="src/uu/sum" } +sync = { optional=true, version="0.0.14", package="uu_sync", path="src/uu/sync" } +tac = { optional=true, version="0.0.14", package="uu_tac", path="src/uu/tac" } +tail = { optional=true, version="0.0.14", package="uu_tail", path="src/uu/tail" } +tee = { optional=true, version="0.0.14", package="uu_tee", path="src/uu/tee" } +timeout = { optional=true, version="0.0.14", package="uu_timeout", path="src/uu/timeout" } +touch = { optional=true, version="0.0.14", package="uu_touch", path="src/uu/touch" } +tr = { optional=true, version="0.0.14", package="uu_tr", path="src/uu/tr" } +true = { optional=true, version="0.0.14", package="uu_true", path="src/uu/true" } +truncate = { optional=true, version="0.0.14", package="uu_truncate", path="src/uu/truncate" } +tsort = { optional=true, version="0.0.14", package="uu_tsort", path="src/uu/tsort" } +tty = { optional=true, version="0.0.14", package="uu_tty", path="src/uu/tty" } +uname = { optional=true, version="0.0.14", package="uu_uname", path="src/uu/uname" } +unexpand = { optional=true, version="0.0.14", package="uu_unexpand", path="src/uu/unexpand" } +uniq = { optional=true, version="0.0.14", package="uu_uniq", path="src/uu/uniq" } +unlink = { optional=true, version="0.0.14", package="uu_unlink", path="src/uu/unlink" } +uptime = { optional=true, version="0.0.14", package="uu_uptime", path="src/uu/uptime" } +users = { optional=true, version="0.0.14", package="uu_users", path="src/uu/users" } +vdir = { optional=true, version="0.0.14", package="uu_vdir", path="src/uu/vdir" } +wc = { optional=true, version="0.0.14", package="uu_wc", path="src/uu/wc" } +who = { optional=true, version="0.0.14", package="uu_who", path="src/uu/who" } +whoami = { optional=true, version="0.0.14", package="uu_whoami", path="src/uu/whoami" } +yes = { optional=true, version="0.0.14", package="uu_yes", path="src/uu/yes" } # this breaks clippy linting with: "tests/by-util/test_factor_benches.rs: No such file or directory (os error 2)" # factor_benches = { optional = true, version = "0.0.0", package = "uu_factor_benches", path = "tests/benches/factor" } diff --git a/src/uu/arch/Cargo.toml b/src/uu/arch/Cargo.toml index d57e747aa4e..29c0cb18346 100644 --- a/src/uu/arch/Cargo.toml +++ b/src/uu/arch/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_arch" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "arch ~ (uutils) display machine architecture" diff --git a/src/uu/base32/Cargo.toml b/src/uu/base32/Cargo.toml index ede70e70d88..d1223c1ca6d 100644 --- a/src/uu/base32/Cargo.toml +++ b/src/uu/base32/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_base32" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "base32 ~ (uutils) decode/encode input (base32-encoding)" diff --git a/src/uu/base64/Cargo.toml b/src/uu/base64/Cargo.toml index 9569467dc13..df812487509 100644 --- a/src/uu/base64/Cargo.toml +++ b/src/uu/base64/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_base64" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "base64 ~ (uutils) decode/encode input (base64-encoding)" diff --git a/src/uu/basename/Cargo.toml b/src/uu/basename/Cargo.toml index 51780516488..95c3e6ff09e 100644 --- a/src/uu/basename/Cargo.toml +++ b/src/uu/basename/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_basename" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "basename ~ (uutils) display PATHNAME with leading directory components removed" diff --git a/src/uu/basenc/Cargo.toml b/src/uu/basenc/Cargo.toml index 1eeddbfae03..a6559cda0b6 100644 --- a/src/uu/basenc/Cargo.toml +++ b/src/uu/basenc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_basenc" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "basenc ~ (uutils) decode/encode input" diff --git a/src/uu/cat/Cargo.toml b/src/uu/cat/Cargo.toml index cdd15d50199..b21a915d0fb 100644 --- a/src/uu/cat/Cargo.toml +++ b/src/uu/cat/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_cat" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "cat ~ (uutils) concatenate and display input" diff --git a/src/uu/chcon/Cargo.toml b/src/uu/chcon/Cargo.toml index 62283c6af5d..ee7432bfc73 100644 --- a/src/uu/chcon/Cargo.toml +++ b/src/uu/chcon/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_chcon" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "chcon ~ (uutils) change file security context" diff --git a/src/uu/chgrp/Cargo.toml b/src/uu/chgrp/Cargo.toml index e270069cf41..6ba4f6b59ee 100644 --- a/src/uu/chgrp/Cargo.toml +++ b/src/uu/chgrp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_chgrp" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "chgrp ~ (uutils) change the group ownership of FILE" diff --git a/src/uu/chmod/Cargo.toml b/src/uu/chmod/Cargo.toml index 9a99f0d19f2..f4776835a10 100644 --- a/src/uu/chmod/Cargo.toml +++ b/src/uu/chmod/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_chmod" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "chmod ~ (uutils) change mode of FILE" diff --git a/src/uu/chown/Cargo.toml b/src/uu/chown/Cargo.toml index c0162f12a51..3c2ae714353 100644 --- a/src/uu/chown/Cargo.toml +++ b/src/uu/chown/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_chown" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "chown ~ (uutils) change the ownership of FILE" diff --git a/src/uu/chroot/Cargo.toml b/src/uu/chroot/Cargo.toml index db766970421..02eb93ea980 100644 --- a/src/uu/chroot/Cargo.toml +++ b/src/uu/chroot/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_chroot" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "chroot ~ (uutils) run COMMAND under a new root directory" diff --git a/src/uu/cksum/Cargo.toml b/src/uu/cksum/Cargo.toml index e694c7c38b7..41704858324 100644 --- a/src/uu/cksum/Cargo.toml +++ b/src/uu/cksum/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_cksum" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "cksum ~ (uutils) display CRC and size of input" diff --git a/src/uu/comm/Cargo.toml b/src/uu/comm/Cargo.toml index b4f1a96ceec..af9afb0dce1 100644 --- a/src/uu/comm/Cargo.toml +++ b/src/uu/comm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_comm" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "comm ~ (uutils) compare sorted inputs" diff --git a/src/uu/cp/Cargo.toml b/src/uu/cp/Cargo.toml index c676204b4f2..c350e158eec 100644 --- a/src/uu/cp/Cargo.toml +++ b/src/uu/cp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_cp" -version = "0.0.13" +version = "0.0.14" authors = [ "Jordy Dickinson ", "Joshua S. Miller ", diff --git a/src/uu/csplit/Cargo.toml b/src/uu/csplit/Cargo.toml index 6c86900a3b6..4e8c82d0e45 100644 --- a/src/uu/csplit/Cargo.toml +++ b/src/uu/csplit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_csplit" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "csplit ~ (uutils) Output pieces of FILE separated by PATTERN(s) to files 'xx00', 'xx01', ..., and output byte counts of each piece to standard output" diff --git a/src/uu/cut/Cargo.toml b/src/uu/cut/Cargo.toml index 65ba2c41685..aa7a2ac8bb5 100644 --- a/src/uu/cut/Cargo.toml +++ b/src/uu/cut/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_cut" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "cut ~ (uutils) display byte/field columns of input lines" diff --git a/src/uu/date/Cargo.toml b/src/uu/date/Cargo.toml index cf723279f8a..f4c1df86d3d 100644 --- a/src/uu/date/Cargo.toml +++ b/src/uu/date/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_date" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "date ~ (uutils) display or set the current time" diff --git a/src/uu/dd/Cargo.toml b/src/uu/dd/Cargo.toml index a2acea60813..586f25bb82d 100644 --- a/src/uu/dd/Cargo.toml +++ b/src/uu/dd/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_dd" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "dd ~ (uutils) copy and convert files" diff --git a/src/uu/df/Cargo.toml b/src/uu/df/Cargo.toml index 1020b71bb46..8e4fc969840 100644 --- a/src/uu/df/Cargo.toml +++ b/src/uu/df/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_df" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "df ~ (uutils) display file system information" diff --git a/src/uu/dir/Cargo.toml b/src/uu/dir/Cargo.toml index 542abdc630e..9ee98648b0b 100644 --- a/src/uu/dir/Cargo.toml +++ b/src/uu/dir/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_dir" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "shortcut to ls -C -b" @@ -17,8 +17,8 @@ path = "src/dir.rs" [dependencies] clap = { version = "3.1", features = ["wrap_help", "cargo", "env"] } uucore = { version = ">=0.0.8", package = "uucore", path = "../../uucore", features = ["entries", "fs"] } -selinux = { version="0.2", optional = true } -uu_ls = {path="../ls"} +selinux = { version = "0.2", optional = true } +uu_ls = { version = ">=0.0.14", path="../ls"} [[bin]] name = "dir" diff --git a/src/uu/dircolors/Cargo.toml b/src/uu/dircolors/Cargo.toml index b5fe79b4782..8708f595f60 100644 --- a/src/uu/dircolors/Cargo.toml +++ b/src/uu/dircolors/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_dircolors" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "dircolors ~ (uutils) display commands to set LS_COLORS" diff --git a/src/uu/dirname/Cargo.toml b/src/uu/dirname/Cargo.toml index 6e4c2f9f53c..b919850dbab 100644 --- a/src/uu/dirname/Cargo.toml +++ b/src/uu/dirname/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_dirname" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "dirname ~ (uutils) display parent directory of PATHNAME" diff --git a/src/uu/du/Cargo.toml b/src/uu/du/Cargo.toml index 1760731e3d4..75fef0cf710 100644 --- a/src/uu/du/Cargo.toml +++ b/src/uu/du/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_du" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "du ~ (uutils) display disk usage" diff --git a/src/uu/echo/Cargo.toml b/src/uu/echo/Cargo.toml index 374aa48813b..ed7a983ea20 100644 --- a/src/uu/echo/Cargo.toml +++ b/src/uu/echo/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_echo" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "echo ~ (uutils) display TEXT" diff --git a/src/uu/env/Cargo.toml b/src/uu/env/Cargo.toml index e7f1df1592a..fe538564fd5 100644 --- a/src/uu/env/Cargo.toml +++ b/src/uu/env/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_env" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "env ~ (uutils) set each NAME to VALUE in the environment and run COMMAND" diff --git a/src/uu/expand/Cargo.toml b/src/uu/expand/Cargo.toml index 9e21585e841..cfae82edc13 100644 --- a/src/uu/expand/Cargo.toml +++ b/src/uu/expand/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_expand" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "expand ~ (uutils) convert input tabs to spaces" diff --git a/src/uu/expr/Cargo.toml b/src/uu/expr/Cargo.toml index 9ea8008af84..1b501ef438f 100644 --- a/src/uu/expr/Cargo.toml +++ b/src/uu/expr/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_expr" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "expr ~ (uutils) display the value of EXPRESSION" diff --git a/src/uu/factor/Cargo.toml b/src/uu/factor/Cargo.toml index 20a21ac001d..348cf307d8f 100644 --- a/src/uu/factor/Cargo.toml +++ b/src/uu/factor/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_factor" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "factor ~ (uutils) display the prime factors of each NUMBER" diff --git a/src/uu/false/Cargo.toml b/src/uu/false/Cargo.toml index 26c2762b523..abd317079e8 100644 --- a/src/uu/false/Cargo.toml +++ b/src/uu/false/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_false" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "false ~ (uutils) do nothing and fail" diff --git a/src/uu/fmt/Cargo.toml b/src/uu/fmt/Cargo.toml index 6a85f1c667a..193862581cb 100644 --- a/src/uu/fmt/Cargo.toml +++ b/src/uu/fmt/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_fmt" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "fmt ~ (uutils) reformat each paragraph of input" diff --git a/src/uu/fold/Cargo.toml b/src/uu/fold/Cargo.toml index 67cc74ec9ff..08aae3c4ba7 100644 --- a/src/uu/fold/Cargo.toml +++ b/src/uu/fold/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_fold" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "fold ~ (uutils) wrap each line of input" diff --git a/src/uu/groups/Cargo.toml b/src/uu/groups/Cargo.toml index e1effbb235c..f7cb2b905d7 100644 --- a/src/uu/groups/Cargo.toml +++ b/src/uu/groups/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_groups" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "groups ~ (uutils) display group memberships for USERNAME" diff --git a/src/uu/hashsum/Cargo.toml b/src/uu/hashsum/Cargo.toml index c38c8499a33..9647655be33 100644 --- a/src/uu/hashsum/Cargo.toml +++ b/src/uu/hashsum/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_hashsum" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "hashsum ~ (uutils) display or check input digests" diff --git a/src/uu/head/Cargo.toml b/src/uu/head/Cargo.toml index d02aaa9e072..abfc39cbaab 100644 --- a/src/uu/head/Cargo.toml +++ b/src/uu/head/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_head" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "head ~ (uutils) display the first lines of input" diff --git a/src/uu/hostid/Cargo.toml b/src/uu/hostid/Cargo.toml index cfbdd4a2c8d..8701ee0cf53 100644 --- a/src/uu/hostid/Cargo.toml +++ b/src/uu/hostid/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_hostid" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "hostid ~ (uutils) display the numeric identifier of the current host" diff --git a/src/uu/hostname/Cargo.toml b/src/uu/hostname/Cargo.toml index d0c1234b64c..0acf39f4e90 100644 --- a/src/uu/hostname/Cargo.toml +++ b/src/uu/hostname/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_hostname" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "hostname ~ (uutils) display or set the host name of the current host" diff --git a/src/uu/id/Cargo.toml b/src/uu/id/Cargo.toml index de18a826912..de6a32394b9 100644 --- a/src/uu/id/Cargo.toml +++ b/src/uu/id/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_id" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "id ~ (uutils) display user and group information for USER" diff --git a/src/uu/install/Cargo.toml b/src/uu/install/Cargo.toml index 72be5b70f55..fde8f76338b 100644 --- a/src/uu/install/Cargo.toml +++ b/src/uu/install/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_install" -version = "0.0.13" +version = "0.0.14" authors = [ "Ben Eills ", "uutils developers", diff --git a/src/uu/join/Cargo.toml b/src/uu/join/Cargo.toml index 1a28689a8d3..0d291d2ad4e 100644 --- a/src/uu/join/Cargo.toml +++ b/src/uu/join/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_join" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "join ~ (uutils) merge lines from inputs with matching join fields" diff --git a/src/uu/kill/Cargo.toml b/src/uu/kill/Cargo.toml index 4ab76deea7b..43a56a44c28 100644 --- a/src/uu/kill/Cargo.toml +++ b/src/uu/kill/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_kill" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "kill ~ (uutils) send a signal to a process" diff --git a/src/uu/link/Cargo.toml b/src/uu/link/Cargo.toml index 6cc51462e79..ae29663723a 100644 --- a/src/uu/link/Cargo.toml +++ b/src/uu/link/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_link" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "link ~ (uutils) create a hard (file system) link to FILE" diff --git a/src/uu/ln/Cargo.toml b/src/uu/ln/Cargo.toml index 453222df845..bf621080a81 100644 --- a/src/uu/ln/Cargo.toml +++ b/src/uu/ln/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_ln" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "ln ~ (uutils) create a (file system) link to TARGET" diff --git a/src/uu/logname/Cargo.toml b/src/uu/logname/Cargo.toml index 9da5a7c41d3..fd33913236c 100644 --- a/src/uu/logname/Cargo.toml +++ b/src/uu/logname/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_logname" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "logname ~ (uutils) display the login name of the current user" diff --git a/src/uu/ls/Cargo.toml b/src/uu/ls/Cargo.toml index ddb6f15d392..5be5e993c77 100644 --- a/src/uu/ls/Cargo.toml +++ b/src/uu/ls/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_ls" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "ls ~ (uutils) display directory contents" diff --git a/src/uu/mkdir/Cargo.toml b/src/uu/mkdir/Cargo.toml index 11210d0ce26..36280e99815 100644 --- a/src/uu/mkdir/Cargo.toml +++ b/src/uu/mkdir/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_mkdir" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "mkdir ~ (uutils) create DIRECTORY" diff --git a/src/uu/mkfifo/Cargo.toml b/src/uu/mkfifo/Cargo.toml index 6f38b055d43..e344eb3639a 100644 --- a/src/uu/mkfifo/Cargo.toml +++ b/src/uu/mkfifo/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_mkfifo" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "mkfifo ~ (uutils) create FIFOs (named pipes)" diff --git a/src/uu/mknod/Cargo.toml b/src/uu/mknod/Cargo.toml index 61a738c5923..6f1961df6e2 100644 --- a/src/uu/mknod/Cargo.toml +++ b/src/uu/mknod/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_mknod" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "mknod ~ (uutils) create special file NAME of TYPE" diff --git a/src/uu/mktemp/Cargo.toml b/src/uu/mktemp/Cargo.toml index c0c3366dcc6..c20bf2f907b 100644 --- a/src/uu/mktemp/Cargo.toml +++ b/src/uu/mktemp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_mktemp" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "mktemp ~ (uutils) create and display a temporary file or directory from TEMPLATE" diff --git a/src/uu/more/Cargo.toml b/src/uu/more/Cargo.toml index d28ec4377bc..c11e795a6e4 100644 --- a/src/uu/more/Cargo.toml +++ b/src/uu/more/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_more" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "more ~ (uutils) input perusal filter" diff --git a/src/uu/mv/Cargo.toml b/src/uu/mv/Cargo.toml index da1b8efe6e7..9f89e709c34 100644 --- a/src/uu/mv/Cargo.toml +++ b/src/uu/mv/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_mv" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "mv ~ (uutils) move (rename) SOURCE to DESTINATION" diff --git a/src/uu/nice/Cargo.toml b/src/uu/nice/Cargo.toml index 5f2e20bdb2d..e3cf5db81b2 100644 --- a/src/uu/nice/Cargo.toml +++ b/src/uu/nice/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_nice" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "nice ~ (uutils) run PROGRAM with modified scheduling priority" diff --git a/src/uu/nl/Cargo.toml b/src/uu/nl/Cargo.toml index 35357b422d8..6192f74f1ab 100644 --- a/src/uu/nl/Cargo.toml +++ b/src/uu/nl/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_nl" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "nl ~ (uutils) display input with added line numbers" diff --git a/src/uu/nohup/Cargo.toml b/src/uu/nohup/Cargo.toml index 6e3faf37d7a..cc95a6375ae 100644 --- a/src/uu/nohup/Cargo.toml +++ b/src/uu/nohup/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_nohup" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "nohup ~ (uutils) run COMMAND, ignoring hangup signals" diff --git a/src/uu/nproc/Cargo.toml b/src/uu/nproc/Cargo.toml index 89a742d0e79..689ecca45d0 100644 --- a/src/uu/nproc/Cargo.toml +++ b/src/uu/nproc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_nproc" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "nproc ~ (uutils) display the number of processing units available" diff --git a/src/uu/numfmt/Cargo.toml b/src/uu/numfmt/Cargo.toml index c59924f1f25..ef9ee91d4e5 100644 --- a/src/uu/numfmt/Cargo.toml +++ b/src/uu/numfmt/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_numfmt" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "numfmt ~ (uutils) reformat NUMBER" diff --git a/src/uu/od/Cargo.toml b/src/uu/od/Cargo.toml index a0a983f4883..35c83d37bca 100644 --- a/src/uu/od/Cargo.toml +++ b/src/uu/od/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_od" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "od ~ (uutils) display formatted representation of input" diff --git a/src/uu/paste/Cargo.toml b/src/uu/paste/Cargo.toml index a07d32af8d1..011a3d00694 100644 --- a/src/uu/paste/Cargo.toml +++ b/src/uu/paste/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_paste" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "paste ~ (uutils) merge lines from inputs" diff --git a/src/uu/pathchk/Cargo.toml b/src/uu/pathchk/Cargo.toml index be46ac38af4..4fe53e4115e 100644 --- a/src/uu/pathchk/Cargo.toml +++ b/src/uu/pathchk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_pathchk" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "pathchk ~ (uutils) diagnose invalid or non-portable PATHNAME" diff --git a/src/uu/pinky/Cargo.toml b/src/uu/pinky/Cargo.toml index 2dab3449199..b28fdeef704 100644 --- a/src/uu/pinky/Cargo.toml +++ b/src/uu/pinky/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_pinky" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "pinky ~ (uutils) display user information" diff --git a/src/uu/pr/Cargo.toml b/src/uu/pr/Cargo.toml index 78fa9e28eb9..d4b5906e141 100644 --- a/src/uu/pr/Cargo.toml +++ b/src/uu/pr/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_pr" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "pr ~ (uutils) convert text files for printing" diff --git a/src/uu/printenv/Cargo.toml b/src/uu/printenv/Cargo.toml index a44a5a5c131..a488254c97d 100644 --- a/src/uu/printenv/Cargo.toml +++ b/src/uu/printenv/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_printenv" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "printenv ~ (uutils) display value of environment VAR" diff --git a/src/uu/printf/Cargo.toml b/src/uu/printf/Cargo.toml index c2326308598..f085cd7c9a2 100644 --- a/src/uu/printf/Cargo.toml +++ b/src/uu/printf/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_printf" -version = "0.0.13" +version = "0.0.14" authors = [ "Nathan Ross", "uutils developers", diff --git a/src/uu/ptx/Cargo.toml b/src/uu/ptx/Cargo.toml index be76d8df45d..9c06e0de3d7 100644 --- a/src/uu/ptx/Cargo.toml +++ b/src/uu/ptx/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_ptx" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "ptx ~ (uutils) display a permuted index of input" diff --git a/src/uu/pwd/Cargo.toml b/src/uu/pwd/Cargo.toml index 3d993bd7024..73e027824aa 100644 --- a/src/uu/pwd/Cargo.toml +++ b/src/uu/pwd/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_pwd" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "pwd ~ (uutils) display current working directory" diff --git a/src/uu/readlink/Cargo.toml b/src/uu/readlink/Cargo.toml index 0d02d5115a5..da04dcfa3ef 100644 --- a/src/uu/readlink/Cargo.toml +++ b/src/uu/readlink/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_readlink" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "readlink ~ (uutils) display resolved path of PATHNAME" diff --git a/src/uu/realpath/Cargo.toml b/src/uu/realpath/Cargo.toml index d19eea0dccb..e669c988b00 100644 --- a/src/uu/realpath/Cargo.toml +++ b/src/uu/realpath/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_realpath" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "realpath ~ (uutils) display resolved absolute path of PATHNAME" diff --git a/src/uu/relpath/Cargo.toml b/src/uu/relpath/Cargo.toml index 2954ac0e833..1c67b3b77e8 100644 --- a/src/uu/relpath/Cargo.toml +++ b/src/uu/relpath/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_relpath" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "relpath ~ (uutils) display relative path of PATHNAME_TO from PATHNAME_FROM" diff --git a/src/uu/rm/Cargo.toml b/src/uu/rm/Cargo.toml index 77d221e394a..0b03739c03a 100644 --- a/src/uu/rm/Cargo.toml +++ b/src/uu/rm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_rm" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "rm ~ (uutils) remove PATHNAME" diff --git a/src/uu/rmdir/Cargo.toml b/src/uu/rmdir/Cargo.toml index f422cecaac2..245a13397e0 100644 --- a/src/uu/rmdir/Cargo.toml +++ b/src/uu/rmdir/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_rmdir" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "rmdir ~ (uutils) remove empty DIRECTORY" diff --git a/src/uu/runcon/Cargo.toml b/src/uu/runcon/Cargo.toml index 30406d82044..fa9ca113719 100644 --- a/src/uu/runcon/Cargo.toml +++ b/src/uu/runcon/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_runcon" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "runcon ~ (uutils) run command with specified security context" diff --git a/src/uu/seq/Cargo.toml b/src/uu/seq/Cargo.toml index 67226093dfe..6ba2cd6883a 100644 --- a/src/uu/seq/Cargo.toml +++ b/src/uu/seq/Cargo.toml @@ -1,7 +1,7 @@ # spell-checker:ignore bigdecimal [package] name = "uu_seq" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "seq ~ (uutils) display a sequence of numbers" diff --git a/src/uu/shred/Cargo.toml b/src/uu/shred/Cargo.toml index 658abf598ff..d35177c9035 100644 --- a/src/uu/shred/Cargo.toml +++ b/src/uu/shred/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_shred" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "shred ~ (uutils) hide former FILE contents with repeated overwrites" diff --git a/src/uu/shuf/Cargo.toml b/src/uu/shuf/Cargo.toml index 26577d0d551..dd4ed18c17a 100644 --- a/src/uu/shuf/Cargo.toml +++ b/src/uu/shuf/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_shuf" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "shuf ~ (uutils) display random permutations of input lines" diff --git a/src/uu/sleep/Cargo.toml b/src/uu/sleep/Cargo.toml index bf1a4a5c538..8ec08754781 100644 --- a/src/uu/sleep/Cargo.toml +++ b/src/uu/sleep/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_sleep" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "sleep ~ (uutils) pause for DURATION" diff --git a/src/uu/sort/Cargo.toml b/src/uu/sort/Cargo.toml index 3c8be6a5007..70630681f8f 100644 --- a/src/uu/sort/Cargo.toml +++ b/src/uu/sort/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_sort" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "sort ~ (uutils) sort input lines" diff --git a/src/uu/split/Cargo.toml b/src/uu/split/Cargo.toml index 75e080dfd74..380f1e898c7 100644 --- a/src/uu/split/Cargo.toml +++ b/src/uu/split/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_split" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "split ~ (uutils) split input into output files" diff --git a/src/uu/stat/Cargo.toml b/src/uu/stat/Cargo.toml index 28ca9c51b26..2ab4377617c 100644 --- a/src/uu/stat/Cargo.toml +++ b/src/uu/stat/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_stat" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "stat ~ (uutils) display FILE status" diff --git a/src/uu/stdbuf/Cargo.toml b/src/uu/stdbuf/Cargo.toml index 4e6ea21eb42..ff533aa4998 100644 --- a/src/uu/stdbuf/Cargo.toml +++ b/src/uu/stdbuf/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_stdbuf" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "stdbuf ~ (uutils) run COMMAND with modified standard stream buffering" @@ -20,7 +20,7 @@ tempfile = "3" uucore = { version=">=0.0.11", package="uucore", path="../../uucore" } [build-dependencies] -libstdbuf = { version="0.0.13", package="uu_stdbuf_libstdbuf", path="src/libstdbuf" } +libstdbuf = { version="0.0.14", package="uu_stdbuf_libstdbuf", path="src/libstdbuf" } [[bin]] name = "stdbuf" diff --git a/src/uu/stdbuf/src/libstdbuf/Cargo.toml b/src/uu/stdbuf/src/libstdbuf/Cargo.toml index aacfe852452..c67a0e5db91 100644 --- a/src/uu/stdbuf/src/libstdbuf/Cargo.toml +++ b/src/uu/stdbuf/src/libstdbuf/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_stdbuf_libstdbuf" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "stdbuf/libstdbuf ~ (uutils); dynamic library required for stdbuf" diff --git a/src/uu/sum/Cargo.toml b/src/uu/sum/Cargo.toml index 7e7894769b8..a5c2375b39e 100644 --- a/src/uu/sum/Cargo.toml +++ b/src/uu/sum/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_sum" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "sum ~ (uutils) display checksum and block counts for input" diff --git a/src/uu/sync/Cargo.toml b/src/uu/sync/Cargo.toml index c4b30e7a27d..82e7da742ed 100644 --- a/src/uu/sync/Cargo.toml +++ b/src/uu/sync/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_sync" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "sync ~ (uutils) synchronize cache writes to storage" diff --git a/src/uu/tac/Cargo.toml b/src/uu/tac/Cargo.toml index b6c5d62b809..192da688817 100644 --- a/src/uu/tac/Cargo.toml +++ b/src/uu/tac/Cargo.toml @@ -2,7 +2,7 @@ [package] name = "uu_tac" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "tac ~ (uutils) concatenate and display input lines in reverse order" diff --git a/src/uu/tail/Cargo.toml b/src/uu/tail/Cargo.toml index 9c4026b5fda..13582389821 100644 --- a/src/uu/tail/Cargo.toml +++ b/src/uu/tail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_tail" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "tail ~ (uutils) display the last lines of input" @@ -23,7 +23,7 @@ uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=[ winapi = { version="0.3", features=["fileapi", "handleapi", "processthreadsapi", "synchapi", "winbase"] } [target.'cfg(unix)'.dependencies] -nix = { version = "0.24.1", default-features = false } +nix = { version = "0.24.1", features = ["fs"] } [[bin]] name = "tail" diff --git a/src/uu/tee/Cargo.toml b/src/uu/tee/Cargo.toml index a964f58e438..da0e36ff008 100644 --- a/src/uu/tee/Cargo.toml +++ b/src/uu/tee/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_tee" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "tee ~ (uutils) display input and copy to FILE" diff --git a/src/uu/test/Cargo.toml b/src/uu/test/Cargo.toml index 94cec610cf4..034b105dd0f 100644 --- a/src/uu/test/Cargo.toml +++ b/src/uu/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_test" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "test ~ (uutils) evaluate comparison and file type expressions" diff --git a/src/uu/timeout/Cargo.toml b/src/uu/timeout/Cargo.toml index 3c6efa288a5..323caa9ebf5 100644 --- a/src/uu/timeout/Cargo.toml +++ b/src/uu/timeout/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_timeout" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "timeout ~ (uutils) run COMMAND with a DURATION time limit" diff --git a/src/uu/touch/Cargo.toml b/src/uu/touch/Cargo.toml index aa747ae7859..764015f5fbe 100644 --- a/src/uu/touch/Cargo.toml +++ b/src/uu/touch/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_touch" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "touch ~ (uutils) change FILE timestamps" diff --git a/src/uu/tr/Cargo.toml b/src/uu/tr/Cargo.toml index 9d757e2766b..d47bc12f226 100644 --- a/src/uu/tr/Cargo.toml +++ b/src/uu/tr/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_tr" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "tr ~ (uutils) translate characters within input and display" diff --git a/src/uu/true/Cargo.toml b/src/uu/true/Cargo.toml index bb35c63f5df..7c036cf43c5 100644 --- a/src/uu/true/Cargo.toml +++ b/src/uu/true/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_true" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "true ~ (uutils) do nothing and succeed" diff --git a/src/uu/truncate/Cargo.toml b/src/uu/truncate/Cargo.toml index 3defee473ef..aab71d36e3b 100644 --- a/src/uu/truncate/Cargo.toml +++ b/src/uu/truncate/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_truncate" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "truncate ~ (uutils) truncate (or extend) FILE to SIZE" diff --git a/src/uu/tsort/Cargo.toml b/src/uu/tsort/Cargo.toml index e9d236247fa..998001a9a5d 100644 --- a/src/uu/tsort/Cargo.toml +++ b/src/uu/tsort/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_tsort" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "tsort ~ (uutils) topologically sort input (partially ordered) pairs" diff --git a/src/uu/tty/Cargo.toml b/src/uu/tty/Cargo.toml index 2b80797f1f8..22274d1bc13 100644 --- a/src/uu/tty/Cargo.toml +++ b/src/uu/tty/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_tty" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "tty ~ (uutils) display the name of the terminal connected to standard input" diff --git a/src/uu/uname/Cargo.toml b/src/uu/uname/Cargo.toml index 66b9a3eb846..d80fb606427 100644 --- a/src/uu/uname/Cargo.toml +++ b/src/uu/uname/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_uname" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "uname ~ (uutils) display system information" diff --git a/src/uu/unexpand/Cargo.toml b/src/uu/unexpand/Cargo.toml index beee39dafe7..84ed5976046 100644 --- a/src/uu/unexpand/Cargo.toml +++ b/src/uu/unexpand/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_unexpand" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "unexpand ~ (uutils) convert input spaces to tabs" diff --git a/src/uu/uniq/Cargo.toml b/src/uu/uniq/Cargo.toml index cfb83513da6..ecc07047499 100644 --- a/src/uu/uniq/Cargo.toml +++ b/src/uu/uniq/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_uniq" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "uniq ~ (uutils) filter identical adjacent lines from input" diff --git a/src/uu/unlink/Cargo.toml b/src/uu/unlink/Cargo.toml index 75cba4472df..7f37ec5e679 100644 --- a/src/uu/unlink/Cargo.toml +++ b/src/uu/unlink/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_unlink" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "unlink ~ (uutils) remove a (file system) link to FILE" diff --git a/src/uu/uptime/Cargo.toml b/src/uu/uptime/Cargo.toml index f08cb4d11e3..4446eecf827 100644 --- a/src/uu/uptime/Cargo.toml +++ b/src/uu/uptime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_uptime" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "uptime ~ (uutils) display dynamic system information" diff --git a/src/uu/users/Cargo.toml b/src/uu/users/Cargo.toml index 2796a5a4601..e9dded743ec 100644 --- a/src/uu/users/Cargo.toml +++ b/src/uu/users/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_users" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "users ~ (uutils) display names of currently logged-in users" diff --git a/src/uu/vdir/Cargo.toml b/src/uu/vdir/Cargo.toml index 10dc07a255d..819d9be740b 100644 --- a/src/uu/vdir/Cargo.toml +++ b/src/uu/vdir/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_vdir" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "shortcut to ls -l -b" @@ -18,7 +18,7 @@ path = "src/vdir.rs" clap = { version = "3.1", features = ["wrap_help", "cargo", "env"] } uucore = { version = ">=0.0.8", package = "uucore", path = "../../uucore", features = ["entries", "fs"] } selinux = { version="0.2", optional = true } -uu_ls = {path="../ls"} +uu_ls = { version = ">=0.0.14", path="../ls"} [[bin]] name = "vdir" diff --git a/src/uu/wc/Cargo.toml b/src/uu/wc/Cargo.toml index bd819f244af..d224329b487 100644 --- a/src/uu/wc/Cargo.toml +++ b/src/uu/wc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_wc" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "wc ~ (uutils) display newline, word, and byte counts for input" diff --git a/src/uu/who/Cargo.toml b/src/uu/who/Cargo.toml index 3e3ee496e73..813884d3567 100644 --- a/src/uu/who/Cargo.toml +++ b/src/uu/who/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_who" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "who ~ (uutils) display information about currently logged-in users" diff --git a/src/uu/whoami/Cargo.toml b/src/uu/whoami/Cargo.toml index 78ba91460a8..4bf1f13086e 100644 --- a/src/uu/whoami/Cargo.toml +++ b/src/uu/whoami/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_whoami" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "whoami ~ (uutils) display user name of current effective user ID" diff --git a/src/uu/yes/Cargo.toml b/src/uu/yes/Cargo.toml index 54675eba7d8..e2c6d8450c8 100644 --- a/src/uu/yes/Cargo.toml +++ b/src/uu/yes/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uu_yes" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "yes ~ (uutils) repeatedly display a line with STRING (or 'y')" diff --git a/src/uucore/Cargo.toml b/src/uucore/Cargo.toml index 581ec7862a5..e382193778b 100644 --- a/src/uucore/Cargo.toml +++ b/src/uucore/Cargo.toml @@ -2,7 +2,7 @@ [package] name = "uucore" -version = "0.0.13" +version = "0.0.14" authors = ["uutils developers"] license = "MIT" description = "uutils ~ 'core' uutils code library (cross-platform)" diff --git a/src/uucore_procs/Cargo.toml b/src/uucore_procs/Cargo.toml index 4547beb8cb7..3ced9f1ad3e 100644 --- a/src/uucore_procs/Cargo.toml +++ b/src/uucore_procs/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uucore_procs" -version = "0.0.13" +version = "0.0.14" authors = ["Roy Ivy III "] license = "MIT" description = "uutils ~ 'uucore' proc-macros" diff --git a/util/update-version.sh b/util/update-version.sh index 7daa3c08ef0..5f4fa7e8e97 100755 --- a/util/update-version.sh +++ b/util/update-version.sh @@ -11,14 +11,14 @@ # 6) Run util/publish.sh --do-it # 7) In some cases, you might have to fix dependencies and run import -FROM="0.0.12" -TO="0.0.13" +FROM="0.0.13" +TO="0.0.14" -UUCORE_PROCS_FROM="0.0.12" -UUCORE_PROCS_TO="0.0.13" +UUCORE_PROCS_FROM="0.0.13" +UUCORE_PROCS_TO="0.0.14" -UUCORE_FROM="0.0.12" -UUCORE_TO="0.0.13" +UUCORE_FROM="0.0.13" +UUCORE_TO="0.0.14" PROGS=$(ls -1d src/uu/*/Cargo.toml src/uu/stdbuf/src/libstdbuf/Cargo.toml Cargo.toml src/uu/base64/Cargo.toml)

!TriV6 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 W-;4NcBwhmkH{$MlxFPcu@yDS5 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/install/helloworld_linux b/tests/fixtures/install/helloworld_linux index c1c6b9b37226b201e0ecdd470f59022353f602c2..4f0895df9e6a773468aced7cfa5981d4ef672bf8 100755 GIT binary patch literal 464928 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ĨvTTHnU@Xa#DV;#B$NgmM15b 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 i*x5 z>Q`^3{5{SJ9;v}rk1J*?oa2zL0AJ^v4E=Cd?y*>jIR`~d3chlx6x?sVvhFXCbuMd* zsCw|}*Ai79vX?2{{ZW2{cuQjMT(lwJe=Rm_bj@?t-WaA$|nq9kNJCSX52w3}?V3|V$1Zp-J%eqJm|D?V`VR6aHeg?mT zs@aOB|INF>jdeAYdH<)@H9^+tM?v;zIr5qAJUUS3)NH%{IY~WbqV8fK z9&?rQSG38khnd|6-*D;bQZU!P(6~VnPY41qMdArj;XE-)GGzR4bJLF;DE+1QoaUy_ z?(cGXDW3VDJ=kuV$0${}EnN^Z%&vI=+2WwAih;!*ELNx^*#s1b$+`rTxuL~rcv>O{ z*iOlL8kxyxhm;T7*%cI+UJ!KV{aio^Q3Q7WpyOACutg=z@R++bRJQ#6bG4??K2`bn zOy$L`&PEkAQ034tr~Y83e$3ufadZ#ery(R`u^_^(K!8|u;Cj9}P(7Nzn>~H#o*sqc z3>tZ+U4yv*xfZ`f_34ei1g}zn7QZJZ#cg=nmoh0}YQDB)=3M9D{Zsb&G4n7KOrkG7(S9=0Myd93j0ByH!P>zbGcZ90{i)JG1^i4H zp_Hf=r9?G#PAKl2dQ5y{=heq@ph^k)R0JJK>s(EwMrx~sWhzr8!ec5!e6{f-w1AGu zk#jp{M$T*7n`g8?My;~qAfAY|`Pa8prgIrc{FO$X5k0E0W?$@6jz-$WCZ!{iHgKb99eB6V!G$`x*T(V=GA9~;>=>h##5 zx@4K9sFHurc|0!4a+XZn=U{Ot&?C7^SwHyEI>GA)>nq=^9c+yKJ4uQ}(|kf&O@~GE ztbRg9Cmjx#yeC;!ePNhl@+R9I>*6mOKU#0CXv&g9ZWc&OqLNlFft2rIZHA>_#U-Zo6j}!^()%Yq=pn9YK zj7)+v7nVIcvKWWffpA&{~mvL&2z>rPw|N{x`_iVW}!&4sNOutXup@Q z*0$4d(KMEw%xAbaV)Y2>M!P{TN{-{FW}g(hVDYRKQUEje66Zv(h}dlF)6-D#jAaw3 z6fG-K^M&=%!dFw1RKuzUji0fP@#}nrx)J|3^sU*qphDowl=l*u6-conue>zra>~oI zJ_YeYSzJ_p+iM9yLf>OTLcp$PsrVit<7N`VN$D-hWTPwKdl-HIZ3V5wDd`-X#tyV)9bqr=_8?EXIDJHTg(H|L&Ug#w~|H zdXGTT0FKxN-FDj!MXirciwfcA2%$t#)CB2A3q>DI5Cuoj><(C;LKyRXX_cvcfSahm zej(8u4(c>(CC!-!NJEoIIsZq}82V@y_2D)?Al|7IL)d*<*-MEN6YUk$ERWx)Q1Er@ z)AT!;q?;va>lCNKTR5?tiT!5bXS3 zapxt+RCcv}<`+YR_&>?=O`)+|&ey2i8BdEb)MvD>jf!ylc7aCu7cEPk%`9d`z%L+!n+6U`2q>jSB;*m!x=g%d4) zG=lm~iMb<#sU!FMmX{jzlrX4>8rD>oae<&x$;zDQ*%(QzUOEiWg*vNB+xF3+x=J=7 z=c6MC#H6Ey+7^{cuj-1w8I=|2Kx$?s@3DW&d*XY+%AIZB3j*%GXtS~EjMZ)z3)&C- zwphS@HvJx}eP)k<`(36Rj9~L1SC(;4=~n(y?v0JM586 z-DI+Q%HCGn=Va1Wwjp-d6W9ZMpp=#m)~jV3q8~mXN(HWS(HiIzyRhxN(_{6WQ-YOm zw(ZR~ez2Ct;c!zKsa~plbLSdl5ufrBlP}FvWf^1NNF6SD!pI%&s)4+!z_OS8vc6Vm zonu`Ru;vG?G1^O(84s#~7-GhVb~8>!hEi)xi8qhaY#K`Z@KM+_bx0<-fuJ}Cz0JCe z(s8^P-B~A1an^Y;1M+jN(qG}{e?Fo4nVvqm^MYeKzkX~-b0n{NgR%TRXj7YyiziQH zY96mY;x%!7u=86%u=^Zxtf~C4?eoD(ZWv>qF~)vW`QpxQXtJhlPhO&VQr_c2Ut{bG z^p0@bO~pR69ExEVijQnYe1(WTD4!LdvsN&J+DJeZGTbN4UIfWr~4Fi4=8Az2^z$`HL%TPMmV&_%BOrsO{DB4=fa{tFrJ|xVo>lHbl#Dbec zq#Ur86(myqB)`~1Ww+cPKBJ`|9vIY85^mLb^ zrHZ1~GXi7kXd%Z?O%Cgs{~Kal4C4KX@d@na65|C;h9V*V2A2!ltKh;^ktaWL>G5ll zD0=u~rF_q`zaChb$3*!Z`^-eE-`wNxJUMnl+vlgpHYG8Wp{~_uXf}(iLNomT;n$+R z^eXh|by=2L9|*O^2(`Y^pZgkJT8;L&F97#dQLoWH8BE&FIm2lGx}ekm5Pdl+@P9+Z zLW=26L{VH65oMhFIQbTg)bTIryQx!hJ6xTxIR>e=effqd6HZ0&<A>`R{uy#6d2Z*K9>w@-g=?%SWQ&yw>gA?E_fX|$UZ(x0RYU6NkskyJYL z%(i`l*xDkL^b2$c-M#-#4VrI~A!(5R_nrE7>hIeGu`^uqhpdk~qmg{+FvLBf3j(@Sg1*#!f}VXrK&hha{y<;_?T7E2DfHi${+E4`=%ftt7X|HDII-A|*skA~ zXs(e#zW+A{c{O6xbQ{Zsa$0N9O3orFP?Q|C#zTQq`V<&FM+)r!&C?pJHO#J;{e~j# ze1DI1ru7Z+7H;XKE5ZR|0@k=7J}CJeYV5s0=I~#aIsBMI_!)P&eL;~mrr6q)d<>#q zXdPyK-6eozPu{~vZ;Z8rTeZ$O<176~-y&jK=J;^ytM4E8!&2g8%>HTr7`s}^!viMl z#pI0HTK}A`#_Nlhc2_-&y=iVF+IiVAonw!!UTZA>6!_XcV_5xw7a6es$x~F(#LYpa zNA-5biaVkaBfiu4QBUW0f*sS@6_jdQ`x&~capxL4CR2|vn%oymwCmaAGNvS$5V6UkWLaX9Uq)JA|pS?9?LLS-D@nLF7WuH zm&<6<$UDk%+Hc1KV&U)^%Vk@(noJM(xvH}G23eciK0`Bjnk29vc2zw)wByU~5Z2hO z=4(OrEWvMTW&wzXuV?JBsM<2!6pcK8ep}mT^yG!o7b&e>`3jDOyQ3$IQa7Bg5tccA zQIgHx(os}ssG9M|k5Ql|&ml80>}U(x7lso#)2h@l1Afo2^>fCuC}mhX%ANs*FhYGV zDp7A|G0mY=?A`Jqejg~xhgH)fgN2N-lO%Q9qM*{Z6=e?bMUPQVh?QNL^$Rybi!}iR zFETwryyMOXyxt>lU#Pm|40=G&9>>P5u=QES2+>@VhY@1nn4tA{0jCqNQYWa6nmRfI zqzBe58F=zB(xIsPH`MePx1{ydtlHXYedes;;2dR`kWJyW*c|HUae4fWLmr{Oh$Pb5 zjnaKt?6N1x=GQ7?S+Q`!*nr7i#SD2aU745sHRaQyu`_9K5qk4Hp*P*N{n=!4{Km3j zx&WPocOPfCYIe$ha``&Qlzv~r>}V4`@Y|Bk(ozzr(8$rbM%1xTF``N9>E#kud*f3# zH369}m{#_smJPrS_2D3P%Kf>Asji6F^WZIo0f)gUBq&Es(d1B$reMc3sdTIesEb5E z)ro*=I^4bp{jNAEHXS5U;`>cV4eK+RyEc_&*9K9G4;N3_LFqG$A9c}_f7Fd_@sQL}EA!ky)TorvAkudJ z8Imu0Xvv1?VKvtVqRsZ;oLNK zGp2iFuf$Gib#^q#a25uN)L-~C$IrL7v)}H{&d-;A@K*?^L?li$BLszb>pmw)0g+B!K?BxbWW_4g~}r4 zk%(mMXXHKud(T1|8xy!i`$u+z&XZdqEJZLt>qiJZg*AH_9J5~DX~OXRCM5~_3n zI|i27gQ79%j%u@4g3ZSX_k5HOSUnbx4w2!uuA-O$3UdG;0@V=y6if;`@wc%XWd|H* z;;>{QPAykiJ)OWOuU7-`NU?vkzsGo+6sM(?c~slk966$Ma^&z>gertw7bvWA$yKY! zRYiPJZC-3tWtTGP9!zpsK=mr9&5N$5{flY;+0c3}V;n@KWvci^im6Jjx5mEUj^$`avuLYk9Vg$KzC5f zpP{rq-o|~jI1jOTksd-@u^!u2uCSZC>zvBvj58S5tr2K z7B*X*;WQ!66q%r`VaZ#jRF6GVwBHqV4xWBv`lVgK;92FLmCE}G`n^ovkI?U@%KK3Lej4wUJ6WTwwq^&^ZjOxwoY1zhU^^;~H7(?6Yy(tP zF2(d}AXN9x2#pV){))uipPeA(uHQ2F7vlTLiaApARuZ}o=U!Mr%Rk&-#5teo5vS`< zbjF_`5n>?=V@Ld!8{mo8qW2>VK7NMUkkW zMwv_1iboBu@(FtrDi^iv#$xSx(h(tBIU+nGJev|`*I4Cej5qUrqM=a^Wr%1+bnM}`0V6Q1pX65uuxX^Fe~7j96?oK*A-f! zNO}_HXWkAO3iGCd^0w|G@vG{}TV7_QPL?od@vZ&GwYl z4{H2*X#DrH0QHk^RlkJ)ABeQkxb|3ITeXj6x{Cs4%}itYC-Ut{rHI1t$I31M+!JF# zdrHXuj@*KEEPPo<3)dr~nrQ9gc$d=v*0m+-v zFlPM*3Me6?6oOytZru!3<`WN#E)Z*#{v#cTgOTdsEGPUE?NR-yK&HKRY)RT{J}Mdb z*K0oMzFB6Mido06D#P61#w1M111O+SBCaFWUgxakep!?{&KKoMkz|6B2p#K-&1*Z) z7yUN4C@z*7Y^|D$+xQ^6C6GFVeMN%S%W#^t28f$fZ6G9l0Sd?jsg4vxiS8qURFpY! zbSQCFo%%=tFFr5lM^84Q(^DhUV{>4usYNHJUC?5BWp zn(h*^t5HVPCh(m7n#L1W9d7M_$VJk2%w~!b6F5-EToTTMSz{w|;yz4TQoi5X0sOP^ z)1z8B;RYWej(v)dnjtnkK{SMboZP1(o_nbf|F2d+mVt9=#$@tk(U z!YnlQvL7ueze5U&Die<+aovd*(CV@)!z=2oF}kRFl`!^NPL~n=+4<`oT879*C#$EI zPjp3F<>r)1w=TUa<8~C;DSbN6hB*&xd!<~Cl5 zRA*S3jvL_SA&f*(IV`6n4|^EhTpis;i0W)5memkW<>T1E#6WL)!H9{B>NY1Ix ziV%_i{b^OVMv0eR=IXCNHdGTQaZ0Xmq1AK!h2Q^~Ql`YN88%iGuv_$w%P_LDTU2_p z9b{u(Ql?}oG=m+0bHYhE<4}da!zSrDBa$4itHYN|*hrq>g(v8+cmk^Q=Suj{WS$o; z*ZFsN<(Eh}lzi6qQIT}~5($Tr zM|k0=goh;ud*LvYP2H%9`nE(BBvZ7k3eV6<-}J&$boeh`_&f=ZOg`a-zbavURgKDj zvJU^ui!YS$p-I~d`>1+OFtu1E9xRc=Q`f1$UfJLrO3hS(lmv{_R2A4Pfx}YcRNz?& z3`?D>0&8>t2XFZ0&jeB@s@LD??`+oR`>!Q1D5ZAT+dr1TAa$BsZRPs|TDu%`D~H3a&FSq5ib=RidHZ!T^P|EaQ;$Ad1MwuoajpEZKc0QR z-f$c{8yOY`1DVWbE@YC)?6u!Vc&!Tq8{HI5yG?e!dPgd90wB{0%%f_)jC5fjlnvVI zfTbzU7;=!eX9$LNcX~W!s#B~>%*>`(nP&3yjx!nEkP*JsNu3~kppA(zf!2Q*Up*EW zb0-+Fz|eX15FD}FmJIeqS>ucz$8dYj>byYEm#Saw=fStL*~E4BYQK+f5fw%Fl+LRQ zI;RfnY#bWg65JF!8E-wJ&wzG8pN>kMKvBc>JB1X+UyOx&M+e2Y)H_;~LtkoP+mfN; zsU$PI0M)-3GmKR)cfVU;K2w(};Lxpkk9U!-V8>IRr+1}KJfq+hDCDWIZk6X6oRhj(q}O-%GNcm{dOLIf&zG}(bRZoay>YG z=HFNOA*~a@T0{FKLW65wu*xF>zhR1@m%YP(?+jsQe}YEw8NYr*Jzx6A&h8St9v|Zy zE`6_`$h`5y>5ndsm0qnNumbV~vC8AwNySE58|c%^JhebixbS4KznU0CzFVGaV^L}BG9 zVN>%&0&dB{a{?oyuTX9UoKqs@Cc~o8&lM&!m`4`!jQtk(q7FqZ*%@p zV-LY_q9I+g8S)g-p*Tq85M9k=qKe5e!wN)FNBaLJl@KgVG!ODAf*R)MP^vRzRCcK? zH^#3wspm`YDnhPt3HbtRFF_$@!J6n}kUqKV^+Yk3T;dg}+N%aWh@P0J|C*2ejOJE~ zq!yuG#f9et&P*)uNB_3#b)1(*B`)GDm^0Eae^HkDvsQ2u1-DuqDVa|PWu3XcD1A=g z*uGZHgh;>xZZmAUCOtGYM8C{f=}#TL(hn=fhNMD0SQ-8NwE9u& z-95tnGrs3$Ouf}F2IPwUJA|=oo-xL}fP@sF6J|4e5arz0GI}k2mHT)V2r~e&sOA-8 z%+|gsadJ&_sEAJ47ibdVKB)?wE`@R<)yoG?suRwYgp8G;NzQ$lv>Jd!{V|MH8cJKz zO=S0|=_P_nH(1-C-wZ!3>(HX$CI^+tQE3)T6|7mIPX=~=IEN#P^cEMQW>@k<-?V4TYoc_ z&7hHCddQlJdaVo}acXx~eC(3j6|xDlR){ur3QK@5 zzaw!aG#Vu)F=?yQExqwPGd@MX&$#zwWCg`h30uz#Df})%?xWRtg0rC+MCz| zj-HRs)hob-9}~;yC%^WN17KRMdJw9Uw*PZ}-6#!-sA+1iJPMAp{99n@vw+7vs8gK_ zkj))ilX~7&c(uM$?v3A*ZzE?E;|s*0Md8P0`D=0RVdAXGQsj?`B39z+Z=AQ3U5t3J zU6CcLxOpdp()C$h)#%XI(!EBk5p#S~o!e(B3Q#Tw%*g;tGq*VRdtZ$X@oTVp zqmv}Pf2vcdE5jJn6}!Ow_S8d)MUuCX)M>j?kwMP8mVt#TVJ6i1Y!8$#L&z(=esVvdu`&@$^W_s10pMByxV z*O;7ze^L`;Io&txym6Z_IGX2mMXI8#?M<4b@BCx^tt3I6LO8ZMBWP6sL*M8^59xj< zPfi1AQHZxXfq^0y5!p)nl{@Vkkv@5i_Wz@>29)2Z=n_%$tu?G?TRq+XD(VQysO+D` zfI6t#DZ)2mh`?grL8nXD9T*C*A+a}LlAPl?aq67YCOO0LvZfcRWx)Sj&^-q(X#JC_ zpj7>TF6H3^m$F2cg1uYLB%A6yf2(R6IebKgpVncTCFH!6VAbPL4lCI1M*dPqlCah3 zIl^ly=`Tw^kV#$k0LbHPj2zO-XUI>E2+$I!YPKY5o#gyc zAFM^|cE~cSs`&Tno1FMiC>~YkZ4|O-;bg>rODb5oh%;e3UgTZ+44tW{UH(m8ypr!<1J8AWUhU>b!b|!cSOQt(S7E*V1)@q*C@1<~nFhZ&hnH z(p8uX>NOj0H-E<7O)UxYuhJwq4zX_YS3C}2T4NaIEtVdY<*O9b66RZ~-EI&z!s#yY zkY=Mvb53h@dT}{`jf`Q=xqpzJmHb@vB1)MCA zxvOeKl1wFPaqhcZVY^zgAZ;2IFI+G~eH57_u7q-Wi`?5}#Q(q>2W3K~ZEarZ?GN(N zCFnRnR2Vv8%C&u}SabIYu?gzUdM~REF<+oZ1(n!A&0_K4B98w8T0PpzZfqHC<=P)v<1Um5kZ!@C;Ob0Rf+bVK znjFU$1`|EZ%BqZBXs+T+6IreiPR2I+1>~c|iRSJT^`3Wg_pn$?!u;T%89HJ9Tc-^O zykESZ=S!ATb=wouWqn95KWs~z(+B~++Wt;IEVnRzwoF%*k5+8xysJPlI({ycUeEn( z<;te25Sz7_{?$V-Ju&y|wg;$8T#;RzQzxo%N*My=^dI0khAODG#j3!|LGI#P4=a^! zOWPTEAVN@hh=~QG73?CO)qSYC=VmIW>D6&fqCRZ6KTn)6ToOJ*6$vx&!NE#^gc;Il z6@Y*JSI*FPTqiQtJLUex<&+2tb4KLnba6HQm3Zv4z8%OtgT7i1xa(4Q&O4{cGvbeA zEyn`UB|5T?{cR8Q%M_vPZx@pao{%*GZGU@}B)Mw>8&1{5Rj7o0>~F;+bsk-$*97h* zkhQ@LxF&G36s76y{DR`>bMBgetcv9v0~S`2(Y-uG>~sgUED+So0%5%@pl(JL+lxBl zY5r5t7p+i@>N&K`~veo0))Pdhu~EBFa!&Uk|$9#_mm3u@@C7L>A14pVmv+~^N4$*bx^q8|gcSTtL@nfb5zRXl)2>qd;$r=k=Mx!HL;eO0buE>ur z;a-!}5G_i#!)zi5QvEi&lxdwCuw=k1t>!jp$nP&1g*&(K~K&GI_$<^9a=d@ zK^JmlSK$IXaJxPE_8>&df?Q1Jky1I_$g6+`wNn;n!yGYjYU2Jb z^aSx&rZW{a2;Jd1nO?~>B`jI~fzB`?w#5quxNgv6g&g&v54>0F%EPvAr;k-_U$nsF zlE`FIc|&j-Z}mr_=+3KKFqK^?K_F@dwtodS)BM_H&T2-4eDY zB2lx4J6%XG9N~v~)AEz^FSq=ulrOYL^(g9oH=oxLND+?go#?!>z-8qA7539d3n{{^ z@kKLz+ImhM?H|3wUK~j1+uaZABR{|7e(4#iQgvTAr|5HGcO4C*LE`M7fK#XA^#Mk= z*^5Kj>)ONKekil|%kFF67gOz>;=cBh2fQY@igwTIYujis3y;Nyg zk`2p}Y?YMk+@n(_cVLOKdK0$^VVvjj6!a+J{0S1Mna4FjS9S|qy8M)-@0vw0{e^P9 z`f-{2*8ANTU#;u1$A`GDLSMIz@is2KlB0O~-M9XAn1)MN-q&2iP3eOZfi@a}1F&Qf zP}woWHT56YD^$6_T{@hRXpoc7Tb$a5_2==@OOA9d^6;Khl3q~kJg73|UTe*CBQ*+H z7qq#p{OPZuXq_z~_j2>qv`zoZ%|p&^=4FZTMa~vssh(oo3FM+7s%KOwbj}&#l1s|T z*s;7Wo!g(6-z1$eZ~pPP`GDb3FbI#sT<*9o?4;)lG7L{hfzHaumnCn+Y zPdAtB_Ce}yBfo1;_#867sUe=|Oi=KKQ_t896%TuqJhnp(FZC}&HRLeXmG?Lh{mB4_?z>7w-!Myu$h75k2XA92sMOi8c&P7t5(*15;qHq##$Jq5jp&14Tk)18hPp(reqw!Tv zs3S8)$Npg7(gmBE+s+tv%Q{{}WT=VATC-=a$O{!n;{E7j`q`^KI?IJI#GrHfpq#Fw zSYW^Yv+PD1v49iUbjR4QKa7H9b$OyLtMIY7*L!?CKhPg`K_Hj^dT$W^>kn2zE?DO(uyQz<^XIa>cZ({Z2)vHb zyq|l@T^^l$-*;8h*bNcVaJp|m#6U?dC%xsR5QfW^lHoQffiTD`iY`09iIri$nfFcgiApm`W&OG z&7}`|hNli)E%_CFkJUi;%e>`U0U#%HzxFwW{8aAh3wgX|^o3s!kX50Oi|_jjy!wlU z^!;kTa=;>T^WQ7^Cn5q|++AX)E1i=E%qsw(uV(pUmJ}fLI>L$X0as}&1o>IczrLgR zLiBxcs&@ugxE<~(JrT&7eC*MarSFcO7W1!7E@6CASZ06v=|}%&AC#vbCGV#SΞ6Tr(eIt$;T_HRja61*ym-bZ@A~pnFmAvN4~8| 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�ao@qv`dg=ZC^fzt5w*Cl&p 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