From 2c42623b6e3bf4e53d3aae3034d75351d63b6712 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Thu, 28 Dec 2023 10:59:33 +0100 Subject: [PATCH 01/33] cp: backup dest symlink linking to source --- src/uu/cp/src/cp.rs | 1 + tests/by-util/test_cp.rs | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/uu/cp/src/cp.rs b/src/uu/cp/src/cp.rs index 30cb3f59f..a5fb66d29 100644 --- a/src/uu/cp/src/cp.rs +++ b/src/uu/cp/src/cp.rs @@ -1521,6 +1521,7 @@ fn is_forbidden_copy_to_same_file( options.dereference(source_in_command_line) || !source.is_symlink(); paths_refer_to_same_file(source, dest, dereference_to_compare) && !(options.force() && options.backup != BackupMode::NoBackup) + && !(dest.is_symlink() && options.backup != BackupMode::NoBackup) } /// Back up, remove, or leave intact the destination file, depending on the options. diff --git a/tests/by-util/test_cp.rs b/tests/by-util/test_cp.rs index a1638584b..63cfa2155 100644 --- a/tests/by-util/test_cp.rs +++ b/tests/by-util/test_cp.rs @@ -701,6 +701,25 @@ fn test_cp_arg_backup_with_dest_a_symlink() { assert_eq!(original, at.resolve_link(backup)); } +#[test] +fn test_cp_arg_backup_with_dest_a_symlink_to_source() { + let (at, mut ucmd) = at_and_ucmd!(); + let source = "source"; + let source_content = "content"; + let symlink = "symlink"; + let backup = "symlink~"; + + at.write(source, source_content); + at.symlink_file(source, symlink); + + ucmd.arg("-b").arg(source).arg(symlink).succeeds(); + + assert!(!at.symlink_exists(symlink)); + assert_eq!(source_content, at.read(symlink)); + assert!(at.symlink_exists(backup)); + assert_eq!(source, at.resolve_link(backup)); +} + #[test] fn test_cp_arg_backup_with_other_args() { let (at, mut ucmd) = at_and_ucmd!(); From 902a128ea8a3cce5b520afef3c7c357728b93a97 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Sun, 31 Dec 2023 14:17:16 +0100 Subject: [PATCH 02/33] cp: rename function is_forbidden_copy_to_same_file -> is_forbidden_to_copy_to_same_file --- 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 a5fb66d29..91507f319 100644 --- a/src/uu/cp/src/cp.rs +++ b/src/uu/cp/src/cp.rs @@ -1509,7 +1509,7 @@ fn backup_dest(dest: &Path, backup_path: &Path) -> CopyResult { /// /// Copying to the same file is only allowed if both `--backup` and /// `--force` are specified and the file is a regular file. -fn is_forbidden_copy_to_same_file( +fn is_forbidden_to_copy_to_same_file( source: &Path, dest: &Path, options: &Options, @@ -1533,7 +1533,7 @@ fn handle_existing_dest( ) -> CopyResult<()> { // Disallow copying a file to itself, unless `--force` and // `--backup` are both specified. - if is_forbidden_copy_to_same_file(source, dest, options, source_in_command_line) { + if is_forbidden_to_copy_to_same_file(source, dest, options, source_in_command_line) { return Err(format!("{} and {} are the same file", source.quote(), dest.quote()).into()); } From 7ddeba4b98615dea328d2d3ab8dd2be8ad02bfe4 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Mon, 1 Jan 2024 14:30:27 +0100 Subject: [PATCH 03/33] cp: show no "same file" error for --link a a --- src/uu/cp/src/cp.rs | 2 ++ tests/by-util/test_cp.rs | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/uu/cp/src/cp.rs b/src/uu/cp/src/cp.rs index 332bb5785..d58eec13d 100644 --- a/src/uu/cp/src/cp.rs +++ b/src/uu/cp/src/cp.rs @@ -150,6 +150,7 @@ pub enum TargetType { } /// Copy action to perform +#[derive(PartialEq)] pub enum CopyMode { Link, SymLink, @@ -1714,6 +1715,7 @@ fn copy_file( && !options.force() && options.backup == BackupMode::NoBackup && source != dest + || (source == dest && options.copy_mode == CopyMode::Link) { return Ok(()); } diff --git a/tests/by-util/test_cp.rs b/tests/by-util/test_cp.rs index d166243ed..884e71a3c 100644 --- a/tests/by-util/test_cp.rs +++ b/tests/by-util/test_cp.rs @@ -566,6 +566,22 @@ fn test_cp_arg_link_with_dest_hardlink_to_source() { assert!(at.file_exists(hardlink)); } +#[test] +#[cfg(target_os = "linux")] +fn test_cp_arg_link_with_same_file() { + use std::os::linux::fs::MetadataExt; + + let (at, mut ucmd) = at_and_ucmd!(); + let file = "file"; + + at.touch(file); + + ucmd.args(&["--link", file, file]).succeeds(); + + assert_eq!(at.metadata(file).st_nlink(), 1); + assert!(at.file_exists(file)); +} + #[test] fn test_cp_arg_symlink() { let (at, mut ucmd) = at_and_ucmd!(); From 8c1fc8b28743090f06aff52b132dfeacf1f2339d Mon Sep 17 00:00:00 2001 From: D9nni Date: Sun, 7 Jan 2024 21:43:31 +0200 Subject: [PATCH 04/33] Added --raw argument, with error for multiple files --- src/uu/cksum/src/cksum.rs | 55 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/src/uu/cksum/src/cksum.rs b/src/uu/cksum/src/cksum.rs index e8d7da60e..df8fdb5ea 100644 --- a/src/uu/cksum/src/cksum.rs +++ b/src/uu/cksum/src/cksum.rs @@ -8,11 +8,13 @@ use clap::{crate_version, value_parser, Arg, ArgAction, Command}; use hex::encode; use std::ffi::OsStr; use std::fs::File; -use std::io::{self, stdin, BufReader, Read}; +use std::io::{self, stdin, stdout, BufReader, Read, Write}; use std::iter; use std::path::Path; +use std::error::Error; +use std::fmt::Display; use uucore::{ - error::{FromIo, UResult}, + error::{FromIo, UResult, UError}, format_usage, help_about, help_section, help_usage, sum::{ div_ceil, Blake2b, Digest, DigestWriter, Md5, Sha1, Sha224, Sha256, Sha384, Sha512, Sm3, @@ -36,6 +38,32 @@ const ALGORITHM_OPTIONS_SHA512: &str = "sha512"; const ALGORITHM_OPTIONS_BLAKE2B: &str = "blake2b"; const ALGORITHM_OPTIONS_SM3: &str = "sm3"; +#[derive(Debug)] +enum CkSumError { + RawMultipleFiles, +} + +impl UError for CkSumError { + fn code(&self) -> i32 { + match self { + Self::RawMultipleFiles => 1, + } + } +} + +impl Error for CkSumError { +} + +impl Display for CkSumError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::RawMultipleFiles => { + write!(f, "the --raw option is not supported with multiple files") + } + } + } +} + fn detect_algo( program: &str, length: Option, @@ -110,6 +138,7 @@ struct Options { output_bits: usize, untagged: bool, length: Option, + raw: bool, } /// Calculate checksum @@ -123,7 +152,12 @@ fn cksum<'a, I>(mut options: Options, files: I) -> UResult<()> where I: Iterator, { - for filename in files { + let files_vec:Vec<_> = files.collect(); + if options.raw && files_vec.len() > 1 { + return Err(Box::new(CkSumError::RawMultipleFiles)); + } + + for filename in files_vec { let filename = Path::new(filename); let stdin_buf; let file_buf; @@ -140,7 +174,12 @@ where }); let (sum, sz) = digest_read(&mut options.digest, &mut file, options.output_bits) .map_err_context(|| "failed to read input".to_string())?; - + + if options.raw { + let bytes_str = sum.parse::().unwrap().to_be_bytes(); + stdout().write_all(&bytes_str)?; + return Ok(()); + } // The BSD checksum output is 5 digit integer let bsd_width = 5; match (options.algo_name, not_file) { @@ -231,6 +270,7 @@ mod options { pub const FILE: &str = "file"; pub const UNTAGGED: &str = "untagged"; pub const LENGTH: &str = "length"; + pub const RAW: &str = "raw"; } #[uucore::main] @@ -291,6 +331,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { output_bits: bits, length, untagged: matches.get_flag(options::UNTAGGED), + raw: matches.get_flag(options::RAW), }; match matches.get_many::(options::FILE) { @@ -346,6 +387,12 @@ pub fn uu_app() -> Command { .short('l') .help("digest length in bits; must not exceed the max for the blake2 algorithm and must be a multiple of 8") .action(ArgAction::Set), + ) + .arg( + Arg::new(options::RAW) + .long(options::RAW) + .help("emit a raw binary digest, not hexadecimal") + .action(ArgAction::SetTrue), ) .after_help(AFTER_HELP) } From f03ef79bc86ee58f688e5d0d36a684993d5a769a Mon Sep 17 00:00:00 2001 From: D9nni Date: Mon, 8 Jan 2024 08:51:06 +0200 Subject: [PATCH 05/33] cksum: added tests for --raw and fixed fmt whitespace error --- src/uu/cksum/src/cksum.rs | 17 ++++++++--------- tests/by-util/test_cksum.rs | 22 ++++++++++++++++++++++ 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/uu/cksum/src/cksum.rs b/src/uu/cksum/src/cksum.rs index df8fdb5ea..e3fb78ec4 100644 --- a/src/uu/cksum/src/cksum.rs +++ b/src/uu/cksum/src/cksum.rs @@ -6,15 +6,15 @@ // spell-checker:ignore (ToDO) fname, algo use clap::{crate_version, value_parser, Arg, ArgAction, Command}; use hex::encode; +use std::error::Error; use std::ffi::OsStr; +use std::fmt::Display; use std::fs::File; use std::io::{self, stdin, stdout, BufReader, Read, Write}; use std::iter; use std::path::Path; -use std::error::Error; -use std::fmt::Display; use uucore::{ - error::{FromIo, UResult, UError}, + error::{FromIo, UError, UResult}, format_usage, help_about, help_section, help_usage, sum::{ div_ceil, Blake2b, Digest, DigestWriter, Md5, Sha1, Sha224, Sha256, Sha384, Sha512, Sm3, @@ -51,8 +51,7 @@ impl UError for CkSumError { } } -impl Error for CkSumError { -} +impl Error for CkSumError {} impl Display for CkSumError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -152,7 +151,7 @@ fn cksum<'a, I>(mut options: Options, files: I) -> UResult<()> where I: Iterator, { - let files_vec:Vec<_> = files.collect(); + let files_vec: Vec<_> = files.collect(); if options.raw && files_vec.len() > 1 { return Err(Box::new(CkSumError::RawMultipleFiles)); } @@ -174,7 +173,7 @@ where }); let (sum, sz) = digest_read(&mut options.digest, &mut file, options.output_bits) .map_err_context(|| "failed to read input".to_string())?; - + if options.raw { let bytes_str = sum.parse::().unwrap().to_be_bytes(); stdout().write_all(&bytes_str)?; @@ -331,7 +330,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { output_bits: bits, length, untagged: matches.get_flag(options::UNTAGGED), - raw: matches.get_flag(options::RAW), + raw: matches.get_flag(options::RAW), }; match matches.get_many::(options::FILE) { @@ -387,7 +386,7 @@ pub fn uu_app() -> Command { .short('l') .help("digest length in bits; must not exceed the max for the blake2 algorithm and must be a multiple of 8") .action(ArgAction::Set), - ) + ) .arg( Arg::new(options::RAW) .long(options::RAW) diff --git a/tests/by-util/test_cksum.rs b/tests/by-util/test_cksum.rs index 00c768164..a4e877b1c 100644 --- a/tests/by-util/test_cksum.rs +++ b/tests/by-util/test_cksum.rs @@ -286,3 +286,25 @@ fn test_length_is_zero() { .no_stderr() .stdout_is_fixture("length_is_zero.expected"); } + +#[test] +fn test_raw_single_file() { + new_ucmd!() + .arg("--raw") + .arg("lorem_ipsum.txt") + .succeeds() + .no_stderr() + .stdout_is_fixture("raw_single_file.expected"); +} + +#[test] +fn test_raw_multiple_files() { + new_ucmd!() + .arg("--raw") + .arg("lorem_ipsum.txt") + .arg("alice_in_wonderland.txt") + .fails() + .no_stdout() + .stderr_contains("cksum: the --raw option is not supported with multiple files") + .code_is(1); +} From 1c6bf6991c012e3fd391199e98a6feec27bbcba4 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Mon, 8 Jan 2024 10:49:16 +0100 Subject: [PATCH 06/33] nl: don't exit if input is directory --- src/uu/nl/src/nl.rs | 16 +++++++++++----- tests/by-util/test_nl.rs | 17 +++++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/uu/nl/src/nl.rs b/src/uu/nl/src/nl.rs index 7d7688650..c7e72f6e2 100644 --- a/src/uu/nl/src/nl.rs +++ b/src/uu/nl/src/nl.rs @@ -7,8 +7,8 @@ use clap::{crate_version, Arg, ArgAction, Command}; use std::fs::File; use std::io::{stdin, BufRead, BufReader, Read}; use std::path::Path; -use uucore::error::{FromIo, UResult, USimpleError}; -use uucore::{format_usage, help_about, help_section, help_usage}; +use uucore::error::{set_exit_code, FromIo, UResult, USimpleError}; +use uucore::{format_usage, help_about, help_section, help_usage, show_error}; mod helper; @@ -205,9 +205,15 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { nl(&mut buffer, &mut stats, &settings)?; } else { let path = Path::new(file); - let reader = File::open(path).map_err_context(|| file.to_string())?; - let mut buffer = BufReader::new(reader); - nl(&mut buffer, &mut stats, &settings)?; + + if path.is_dir() { + show_error!("{}: Is a directory", path.display()); + set_exit_code(1); + } else { + let reader = File::open(path).map_err_context(|| file.to_string())?; + let mut buffer = BufReader::new(reader); + nl(&mut buffer, &mut stats, &settings)?; + } } } diff --git a/tests/by-util/test_nl.rs b/tests/by-util/test_nl.rs index 78c8975a8..a00e37a47 100644 --- a/tests/by-util/test_nl.rs +++ b/tests/by-util/test_nl.rs @@ -634,3 +634,20 @@ fn test_empty_section_delimiter() { .stdout_is(" 1\ta\n \n 2\tb\n"); } } + +#[test] +fn test_directory_as_input() { + let (at, mut ucmd) = at_and_ucmd!(); + let dir = "dir"; + let file = "file"; + let content = "aaa"; + + at.mkdir(dir); + at.write(file, content); + + ucmd.arg(dir) + .arg(file) + .fails() + .stderr_is(format!("nl: {dir}: Is a directory\n")) + .stdout_contains(content); +} From 28b5224725fe93f445c49a02d975ccdb4abf4812 Mon Sep 17 00:00:00 2001 From: D9nni Date: Mon, 8 Jan 2024 15:50:25 +0200 Subject: [PATCH 07/33] cksum: fixed test for --raw on single file --- tests/by-util/test_cksum.rs | 2 +- tests/fixtures/cksum/raw_single_file.expected | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 tests/fixtures/cksum/raw_single_file.expected diff --git a/tests/by-util/test_cksum.rs b/tests/by-util/test_cksum.rs index 2d4fad923..52ac09911 100644 --- a/tests/by-util/test_cksum.rs +++ b/tests/by-util/test_cksum.rs @@ -294,7 +294,7 @@ fn test_raw_single_file() { .arg("lorem_ipsum.txt") .succeeds() .no_stderr() - .stdout_is_fixture("raw_single_file.expected"); + .stdout_is_fixture_bytes("raw_single_file.expected"); } #[test] diff --git a/tests/fixtures/cksum/raw_single_file.expected b/tests/fixtures/cksum/raw_single_file.expected new file mode 100644 index 000000000..de175b045 --- /dev/null +++ b/tests/fixtures/cksum/raw_single_file.expected @@ -0,0 +1 @@ +Ph \ No newline at end of file From 49154669a620df00c267fd0c520af6001bf73f79 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Tue, 9 Jan 2024 15:17:15 +0100 Subject: [PATCH 08/33] pathchk: simplify and rename test --- tests/by-util/test_pathchk.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tests/by-util/test_pathchk.rs b/tests/by-util/test_pathchk.rs index d66ecb9ef..f5d84b576 100644 --- a/tests/by-util/test_pathchk.rs +++ b/tests/by-util/test_pathchk.rs @@ -4,6 +4,14 @@ // file that was distributed with this source code. use crate::common::util::TestScenario; +#[test] +fn test_no_args() { + new_ucmd!() + .fails() + .no_stdout() + .stderr_contains("pathchk: missing operand"); +} + #[test] fn test_invalid_arg() { new_ucmd!().arg("--definitely-invalid").fails().code_is(1); @@ -164,10 +172,3 @@ fn test_posix_all() { // fail on empty path new_ucmd!().args(&["-p", "-P", ""]).fails().no_stdout(); } - -#[test] -fn test_args_parsing() { - // fail on no args - let empty_args: [String; 0] = []; - new_ucmd!().args(&empty_args).fails().no_stdout(); -} From f400a07dc6e6fed71efb38a5b84d0d981e355cd9 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Tue, 9 Jan 2024 15:19:22 +0100 Subject: [PATCH 09/33] pathchk: remove useless comments --- tests/by-util/test_pathchk.rs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tests/by-util/test_pathchk.rs b/tests/by-util/test_pathchk.rs index f5d84b576..d09c8a2e1 100644 --- a/tests/by-util/test_pathchk.rs +++ b/tests/by-util/test_pathchk.rs @@ -19,8 +19,6 @@ fn test_invalid_arg() { #[test] fn test_default_mode() { - // test the default mode - // accept some reasonable default new_ucmd!().args(&["dir/file"]).succeeds().no_stdout(); @@ -56,8 +54,6 @@ fn test_default_mode() { #[test] fn test_posix_mode() { - // test the posix mode - // accept some reasonable default new_ucmd!().args(&["-p", "dir/file"]).succeeds().no_stdout(); @@ -82,8 +78,6 @@ fn test_posix_mode() { #[test] fn test_posix_special() { - // test the posix special mode - // accept some reasonable default new_ucmd!().args(&["-P", "dir/file"]).succeeds().no_stdout(); @@ -123,8 +117,6 @@ fn test_posix_special() { #[test] fn test_posix_all() { - // test the posix special mode - // accept some reasonable default new_ucmd!() .args(&["-p", "-P", "dir/file"]) From 96271ffa3cb9588c97dddddc186a28ef4bbcb43a Mon Sep 17 00:00:00 2001 From: D9nni Date: Tue, 9 Jan 2024 23:12:40 +0200 Subject: [PATCH 10/33] cksum: added tests for --raw with each algorithm, not working for crc, sysv, bsd --- src/uu/cksum/src/cksum.rs | 19 +++++++++++++----- tests/by-util/test_cksum.rs | 16 ++++++++------- .../cksum/raw/blake2b_single_file.expected | 1 + .../cksum/raw/bsd_single_file.expected | 1 + .../crc_single_file.expected} | 0 .../cksum/raw/md5_single_file.expected | Bin 0 -> 16 bytes .../cksum/raw/sha1_single_file.expected | 1 + .../cksum/raw/sha224_single_file.expected | Bin 0 -> 28 bytes .../cksum/raw/sha256_single_file.expected | 1 + .../cksum/raw/sha384_single_file.expected | 3 +++ .../cksum/raw/sha512_single_file.expected | 1 + .../cksum/raw/sm3_single_file.expected | 1 + .../cksum/raw/sysv_single_file.expected | 1 + 13 files changed, 33 insertions(+), 12 deletions(-) create mode 100644 tests/fixtures/cksum/raw/blake2b_single_file.expected create mode 100644 tests/fixtures/cksum/raw/bsd_single_file.expected rename tests/fixtures/cksum/{raw_single_file.expected => raw/crc_single_file.expected} (100%) create mode 100644 tests/fixtures/cksum/raw/md5_single_file.expected create mode 100644 tests/fixtures/cksum/raw/sha1_single_file.expected create mode 100644 tests/fixtures/cksum/raw/sha224_single_file.expected create mode 100644 tests/fixtures/cksum/raw/sha256_single_file.expected create mode 100644 tests/fixtures/cksum/raw/sha384_single_file.expected create mode 100644 tests/fixtures/cksum/raw/sha512_single_file.expected create mode 100644 tests/fixtures/cksum/raw/sm3_single_file.expected create mode 100644 tests/fixtures/cksum/raw/sysv_single_file.expected diff --git a/src/uu/cksum/src/cksum.rs b/src/uu/cksum/src/cksum.rs index 40c06a386..6f3de690d 100644 --- a/src/uu/cksum/src/cksum.rs +++ b/src/uu/cksum/src/cksum.rs @@ -5,6 +5,7 @@ // spell-checker:ignore (ToDO) fname, algo use clap::{crate_version, value_parser, Arg, ArgAction, Command}; +use hex::decode; use hex::encode; use std::error::Error; use std::ffi::OsStr; @@ -151,12 +152,12 @@ fn cksum<'a, I>(mut options: Options, files: I) -> UResult<()> where I: Iterator, { - let files_vec: Vec<_> = files.collect(); - if options.raw && files_vec.len() > 1 { + let files: Vec<_> = files.collect(); + if options.raw && files.len() > 1 { return Err(Box::new(CkSumError::RawMultipleFiles)); } - for filename in files_vec { + for filename in files { let filename = Path::new(filename); let stdin_buf; let file_buf; @@ -175,8 +176,16 @@ where .map_err_context(|| "failed to read input".to_string())?; if options.raw { - let bytes_str = sum.parse::().unwrap().to_be_bytes(); - stdout().write_all(&bytes_str)?; + match decode(sum.clone()) { + Ok(bytes) => { + stdout().write_all(&bytes)?; + } + Err(_) => { + //bsd, sysv and crc have output generated without encode() + let bytes = sum.parse::().unwrap().to_be_bytes(); + stdout().write_all(&bytes)?; + } + } return Ok(()); } // The BSD checksum output is 5 digit integer diff --git a/tests/by-util/test_cksum.rs b/tests/by-util/test_cksum.rs index 52ac09911..b3db0bf0a 100644 --- a/tests/by-util/test_cksum.rs +++ b/tests/by-util/test_cksum.rs @@ -289,14 +289,16 @@ fn test_length_is_zero() { #[test] fn test_raw_single_file() { - new_ucmd!() - .arg("--raw") - .arg("lorem_ipsum.txt") - .succeeds() - .no_stderr() - .stdout_is_fixture_bytes("raw_single_file.expected"); + for algo in ALGOS { + new_ucmd!() + .arg("--raw") + .arg("lorem_ipsum.txt") + .arg(format!("--algorithm={algo}")) + .succeeds() + .no_stderr() + .stdout_is_fixture_bytes(format!("raw/{algo}_single_file.expected")); + } } - #[test] fn test_raw_multiple_files() { new_ucmd!() diff --git a/tests/fixtures/cksum/raw/blake2b_single_file.expected b/tests/fixtures/cksum/raw/blake2b_single_file.expected new file mode 100644 index 000000000..4955b2f99 --- /dev/null +++ b/tests/fixtures/cksum/raw/blake2b_single_file.expected @@ -0,0 +1 @@ +�����`�x� �f��W���Et�B��l��W^J�0�aX´��8�����5�B��9m�� \ No newline at end of file diff --git a/tests/fixtures/cksum/raw/bsd_single_file.expected b/tests/fixtures/cksum/raw/bsd_single_file.expected new file mode 100644 index 000000000..538ab19f7 --- /dev/null +++ b/tests/fixtures/cksum/raw/bsd_single_file.expected @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/fixtures/cksum/raw_single_file.expected b/tests/fixtures/cksum/raw/crc_single_file.expected similarity index 100% rename from tests/fixtures/cksum/raw_single_file.expected rename to tests/fixtures/cksum/raw/crc_single_file.expected diff --git a/tests/fixtures/cksum/raw/md5_single_file.expected b/tests/fixtures/cksum/raw/md5_single_file.expected new file mode 100644 index 0000000000000000000000000000000000000000..e7b47aebbcba99b6dbaa03e825f0be3b5bfdb012 GIT binary patch literal 16 YcmX?GKH08Ru5cmMzZ literal 0 HcmV?d00001 diff --git a/tests/fixtures/cksum/raw/sha1_single_file.expected b/tests/fixtures/cksum/raw/sha1_single_file.expected new file mode 100644 index 000000000..0f634be47 --- /dev/null +++ b/tests/fixtures/cksum/raw/sha1_single_file.expected @@ -0,0 +1 @@ +к؈:=m毽(%, \ No newline at end of file diff --git a/tests/fixtures/cksum/raw/sha224_single_file.expected b/tests/fixtures/cksum/raw/sha224_single_file.expected new file mode 100644 index 0000000000000000000000000000000000000000..bc3fa6bf18f53f72894471200626992087ef971d GIT binary patch literal 28 kcmcD0mcM7MK%TV2YD?*-If0iL>Nfs77JA{!quGBL0mH`*$p8QV literal 0 HcmV?d00001 diff --git a/tests/fixtures/cksum/raw/sha256_single_file.expected b/tests/fixtures/cksum/raw/sha256_single_file.expected new file mode 100644 index 000000000..b9ce06f39 --- /dev/null +++ b/tests/fixtures/cksum/raw/sha256_single_file.expected @@ -0,0 +1 @@ + PP 0P g^ SkEC[+? \ No newline at end of file diff --git a/tests/fixtures/cksum/raw/sha384_single_file.expected b/tests/fixtures/cksum/raw/sha384_single_file.expected new file mode 100644 index 000000000..4b337f859 --- /dev/null +++ b/tests/fixtures/cksum/raw/sha384_single_file.expected @@ -0,0 +1,3 @@ +K + 2iJMϸ/gLZ{WZ3S +H \ No newline at end of file diff --git a/tests/fixtures/cksum/raw/sha512_single_file.expected b/tests/fixtures/cksum/raw/sha512_single_file.expected new file mode 100644 index 000000000..79f78cf00 --- /dev/null +++ b/tests/fixtures/cksum/raw/sha512_single_file.expected @@ -0,0 +1 @@ +Td%VՎsؚ!Yyu)f|T,Bn^OऊVgD k!= \ No newline at end of file diff --git a/tests/fixtures/cksum/raw/sm3_single_file.expected b/tests/fixtures/cksum/raw/sm3_single_file.expected new file mode 100644 index 000000000..3506406dc --- /dev/null +++ b/tests/fixtures/cksum/raw/sm3_single_file.expected @@ -0,0 +1 @@ +m)k] (0CyMg@pi \ No newline at end of file diff --git a/tests/fixtures/cksum/raw/sysv_single_file.expected b/tests/fixtures/cksum/raw/sysv_single_file.expected new file mode 100644 index 000000000..b975da49c --- /dev/null +++ b/tests/fixtures/cksum/raw/sysv_single_file.expected @@ -0,0 +1 @@ +I \ No newline at end of file From 0fe5f39b74f338177853b2ba960e85eb10ce944c Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Wed, 10 Jan 2024 10:46:03 +0100 Subject: [PATCH 11/33] Bump console from 0.15.7 to 0.15.8 --- Cargo.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9190d1be3..6f83430b6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -320,15 +320,15 @@ checksum = "120133d4db2ec47efe2e26502ee984747630c67f51974fca0b6c1340cf2368d3" [[package]] name = "console" -version = "0.15.7" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ "encode_unicode", "lazy_static", "libc", "unicode-width", - "windows-sys 0.45.0", + "windows-sys 0.52.0", ] [[package]] From d29adfcb095b6dc28d0b21574ff4df69f6e39d97 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Wed, 10 Jan 2024 10:47:20 +0100 Subject: [PATCH 12/33] Bump mio from 0.8.6 to 0.8.10 --- Cargo.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6f83430b6..0e4a271df 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1293,14 +1293,14 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.6" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", "log", "wasi", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] From 4754e071d40c27d91d42855753f86f507abb294d Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Wed, 10 Jan 2024 10:48:50 +0100 Subject: [PATCH 13/33] deny.toml: update comment for windows-sys --- deny.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deny.toml b/deny.toml index df970c2c6..986c2b269 100644 --- a/deny.toml +++ b/deny.toml @@ -62,7 +62,7 @@ skip = [ { name = "linux-raw-sys", version = "0.3.8" }, # terminal_size { name = "rustix", version = "0.37.26" }, - # various crates + # notify { name = "windows-sys", version = "0.45.0" }, # various crates { name = "windows-sys", version = "0.48.0" }, From c7b15ddce9d2af52267511ce06b84bb32b843d82 Mon Sep 17 00:00:00 2001 From: D9nni Date: Wed, 10 Jan 2024 15:04:19 +0200 Subject: [PATCH 14/33] cksum: fixed cksum --raw --algorithm --- src/uu/cksum/src/cksum.rs | 23 ++++++++++++++----- .../cksum/raw/blake2b_single_file.expected | 2 +- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/uu/cksum/src/cksum.rs b/src/uu/cksum/src/cksum.rs index 6f3de690d..eeda3c083 100644 --- a/src/uu/cksum/src/cksum.rs +++ b/src/uu/cksum/src/cksum.rs @@ -176,16 +176,27 @@ where .map_err_context(|| "failed to read input".to_string())?; if options.raw { - match decode(sum.clone()) { - Ok(bytes) => { - stdout().write_all(&bytes)?; - } - Err(_) => { - //bsd, sysv and crc have output generated without encode() + match options.algo_name { + ALGORITHM_OPTIONS_CRC + | ALGORITHM_OPTIONS_SYSV + | ALGORITHM_OPTIONS_BSD => { let bytes = sum.parse::().unwrap().to_be_bytes(); + let mut first_nonzero = 0; + for byte in bytes { + if byte != 0 { + break; + } + first_nonzero += 1; + } + stdout().write_all(&bytes[first_nonzero..])?; + } + _ =>{ + let bytes = decode(sum).unwrap(); stdout().write_all(&bytes)?; } + } + return Ok(()); } // The BSD checksum output is 5 digit integer diff --git a/tests/fixtures/cksum/raw/blake2b_single_file.expected b/tests/fixtures/cksum/raw/blake2b_single_file.expected index 4955b2f99..19b311220 100644 --- a/tests/fixtures/cksum/raw/blake2b_single_file.expected +++ b/tests/fixtures/cksum/raw/blake2b_single_file.expected @@ -1 +1 @@ -�����`�x� �f��W���Et�B��l��W^J�0�aX´��8�����5�B��9m�� \ No newline at end of file +`x fWEtBlW^J0aX´85B9m \ No newline at end of file From 911df1d76cdc1d61f01b282b169dad246089b9f1 Mon Sep 17 00:00:00 2001 From: D9nni Date: Wed, 10 Jan 2024 15:15:23 +0200 Subject: [PATCH 15/33] cksum: code improvements for cksum --raw --algorithm --- src/uu/cksum/src/cksum.rs | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/src/uu/cksum/src/cksum.rs b/src/uu/cksum/src/cksum.rs index eeda3c083..40694fac6 100644 --- a/src/uu/cksum/src/cksum.rs +++ b/src/uu/cksum/src/cksum.rs @@ -176,27 +176,21 @@ where .map_err_context(|| "failed to read input".to_string())?; if options.raw { - match options.algo_name { - ALGORITHM_OPTIONS_CRC - | ALGORITHM_OPTIONS_SYSV - | ALGORITHM_OPTIONS_BSD => { + let bytes = match options.algo_name { + ALGORITHM_OPTIONS_CRC => { let bytes = sum.parse::().unwrap().to_be_bytes(); - let mut first_nonzero = 0; - for byte in bytes { - if byte != 0 { - break; - } - first_nonzero += 1; - } - stdout().write_all(&bytes[first_nonzero..])?; + bytes.to_vec() } - _ =>{ + ALGORITHM_OPTIONS_SYSV | ALGORITHM_OPTIONS_BSD => { + let bytes = sum.parse::().unwrap().to_be_bytes(); + bytes.to_vec() + } + _ => { let bytes = decode(sum).unwrap(); - stdout().write_all(&bytes)?; + bytes } - - } - + }; + stdout().write_all(&bytes)?; return Ok(()); } // The BSD checksum output is 5 digit integer From 9a76997b0a9d6d8b92b7c1d476f00d5cc45a74cc Mon Sep 17 00:00:00 2001 From: D9nni Date: Wed, 10 Jan 2024 16:49:52 +0200 Subject: [PATCH 16/33] cksum: fixed clippy and fmt errors --- src/uu/cksum/src/cksum.rs | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/uu/cksum/src/cksum.rs b/src/uu/cksum/src/cksum.rs index 40694fac6..a3e6dfd9e 100644 --- a/src/uu/cksum/src/cksum.rs +++ b/src/uu/cksum/src/cksum.rs @@ -177,18 +177,11 @@ where if options.raw { let bytes = match options.algo_name { - ALGORITHM_OPTIONS_CRC => { - let bytes = sum.parse::().unwrap().to_be_bytes(); - bytes.to_vec() - } + ALGORITHM_OPTIONS_CRC => sum.parse::().unwrap().to_be_bytes().to_vec(), ALGORITHM_OPTIONS_SYSV | ALGORITHM_OPTIONS_BSD => { - let bytes = sum.parse::().unwrap().to_be_bytes(); - bytes.to_vec() - } - _ => { - let bytes = decode(sum).unwrap(); - bytes + sum.parse::().unwrap().to_be_bytes().to_vec() } + _ => decode(sum).unwrap(), }; stdout().write_all(&bytes)?; return Ok(()); From e948d2e8e5e5403dc8afcb505ad86f98a7b159f3 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Wed, 10 Jan 2024 15:14:12 +0100 Subject: [PATCH 17/33] ci: install mingw-w64-x86_64-gcc for windows-gnu --- .github/workflows/CICD.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml index ea369e4ef..89022bbef 100644 --- a/.github/workflows/CICD.yml +++ b/.github/workflows/CICD.yml @@ -615,6 +615,8 @@ jobs: arm-unknown-linux-gnueabihf) sudo apt-get -y update ; sudo apt-get -y install gcc-arm-linux-gnueabihf ;; aarch64-unknown-linux-*) sudo apt-get -y update ; sudo apt-get -y install gcc-aarch64-linux-gnu ;; *-redox*) sudo apt-get -y update ; sudo apt-get -y install fuse3 libfuse-dev ;; + # Update binutils if MinGW due to https://github.com/rust-lang/rust/issues/112368 + x86_64-pc-windows-gnu) C:/msys64/usr/bin/pacman.exe -Syu --needed mingw-w64-x86_64-gcc --noconfirm ; echo "C:\msys64\mingw64\bin" >> $GITHUB_PATH ;; esac case '${{ matrix.job.os }}' in macos-latest) brew install coreutils ;; # needed for testing @@ -984,6 +986,10 @@ jobs: echo "foo" > /home/runner/.plan ;; esac + case '${{ matrix.job.os }}' in + # Update binutils if MinGW due to https://github.com/rust-lang/rust/issues/112368 + windows-latest) C:/msys64/usr/bin/pacman.exe -Syu --needed mingw-w64-x86_64-gcc --noconfirm ; echo "C:\msys64\mingw64\bin" >> $GITHUB_PATH ;; + esac - name: Initialize toolchain-dependent workflow variables id: dep_vars shell: bash From 7d32e49fb907f3fd9e9a1bbb1e152a4083d1b9a5 Mon Sep 17 00:00:00 2001 From: Samuel Tardieu Date: Wed, 10 Jan 2024 18:19:56 +0100 Subject: [PATCH 18/33] printf: %c prints the first byte of its argument --- src/uucore/src/lib/features/format/argument.rs | 2 +- tests/by-util/test_printf.rs | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/uucore/src/lib/features/format/argument.rs b/src/uucore/src/lib/features/format/argument.rs index 92d6c1603..ef81fc353 100644 --- a/src/uucore/src/lib/features/format/argument.rs +++ b/src/uucore/src/lib/features/format/argument.rs @@ -45,7 +45,7 @@ impl<'a, T: Iterator> ArgumentIter<'a> for T { }; match next { FormatArgument::Char(c) => *c, - FormatArgument::Unparsed(s) => s.chars().next().unwrap_or('\0'), + FormatArgument::Unparsed(s) => s.bytes().next().map_or('\0', char::from), _ => '\0', } } diff --git a/tests/by-util/test_printf.rs b/tests/by-util/test_printf.rs index 48fc1e6ac..c35277106 100644 --- a/tests/by-util/test_printf.rs +++ b/tests/by-util/test_printf.rs @@ -639,3 +639,8 @@ fn partial_char() { "printf: warning: bc: character(s) following character constant have been ignored\n", ); } + +#[test] +fn char_as_byte() { + new_ucmd!().args(&["%c", "🙃"]).succeeds().stdout_only("ð"); +} From 47e908bc6cbd40c9a937ed8f78dc384c83ff2b42 Mon Sep 17 00:00:00 2001 From: Samuel Tardieu Date: Wed, 10 Jan 2024 18:59:33 +0100 Subject: [PATCH 19/33] printf: output of double-quote should not be escaped This is obtained by escaping the sequence `\"` as `"`. --- src/uucore/src/lib/features/format/escape.rs | 1 + tests/by-util/test_printf.rs | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/src/uucore/src/lib/features/format/escape.rs b/src/uucore/src/lib/features/format/escape.rs index d20da3e7e..9420507f3 100644 --- a/src/uucore/src/lib/features/format/escape.rs +++ b/src/uucore/src/lib/features/format/escape.rs @@ -108,6 +108,7 @@ pub fn parse_escape_code(rest: &mut &[u8]) -> EscapedChar { *rest = new_rest; match c { b'\\' => EscapedChar::Byte(b'\\'), + b'"' => EscapedChar::Byte(b'"'), b'a' => EscapedChar::Byte(b'\x07'), b'b' => EscapedChar::Byte(b'\x08'), b'c' => EscapedChar::End, diff --git a/tests/by-util/test_printf.rs b/tests/by-util/test_printf.rs index 48fc1e6ac..a288d7c08 100644 --- a/tests/by-util/test_printf.rs +++ b/tests/by-util/test_printf.rs @@ -36,6 +36,11 @@ fn escaped_slash() { .stdout_only("hello\\ world"); } +#[test] +fn unescaped_double_quote() { + new_ucmd!().args(&["\\\""]).succeeds().stdout_only("\""); +} + #[test] fn escaped_hex() { new_ucmd!().args(&["\\x41"]).succeeds().stdout_only("A"); From 2aa8a3502fd049a3ce13164aa8b289daf2940e04 Mon Sep 17 00:00:00 2001 From: Sudhakar Verma Date: Fri, 12 Jan 2024 16:08:47 +0530 Subject: [PATCH 20/33] printf : no infinite loop --- src/uu/printf/src/printf.rs | 10 +++++++++- tests/by-util/test_printf.rs | 5 +++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/uu/printf/src/printf.rs b/src/uu/printf/src/printf.rs index ad42e3894..64a3a35a7 100644 --- a/src/uu/printf/src/printf.rs +++ b/src/uu/printf/src/printf.rs @@ -11,7 +11,7 @@ use std::ops::ControlFlow; use clap::{crate_version, Arg, ArgAction, Command}; use uucore::error::{UResult, UUsageError}; -use uucore::format::{parse_spec_and_escape, FormatArgument}; +use uucore::format::{parse_spec_and_escape, FormatArgument, FormatItem}; use uucore::{format_usage, help_about, help_section, help_usage}; const VERSION: &str = "version"; @@ -46,6 +46,14 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { }; } + // See #5815 - We don't need to iter on args if no format string seen + let format_seen = parse_spec_and_escape(format_string.as_ref()) + .into_iter() + .any(|r| matches!(r, Ok(FormatItem::Spec(_)))); + if !format_seen { + return Ok(()); + } + while args.peek().is_some() { for item in parse_spec_and_escape(format_string.as_ref()) { match item?.write(stdout(), &mut args)? { diff --git a/tests/by-util/test_printf.rs b/tests/by-util/test_printf.rs index 4f2e1dc10..411285a0c 100644 --- a/tests/by-util/test_printf.rs +++ b/tests/by-util/test_printf.rs @@ -649,3 +649,8 @@ fn partial_char() { fn char_as_byte() { new_ucmd!().args(&["%c", "🙃"]).succeeds().stdout_only("ð"); } + +#[test] +fn no_infinite_loop() { + new_ucmd!().args(&["a", "b"]).succeeds().stdout_only("a"); +} From 4e5a65ee41372ca9bd35501e251b1b7bf799665e Mon Sep 17 00:00:00 2001 From: Sudhakar Verma Date: Fri, 12 Jan 2024 16:23:38 +0530 Subject: [PATCH 21/33] printf: fix clippy warnings --- src/uu/printf/src/printf.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/uu/printf/src/printf.rs b/src/uu/printf/src/printf.rs index 64a3a35a7..b0988f7b4 100644 --- a/src/uu/printf/src/printf.rs +++ b/src/uu/printf/src/printf.rs @@ -47,9 +47,8 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } // See #5815 - We don't need to iter on args if no format string seen - let format_seen = parse_spec_and_escape(format_string.as_ref()) - .into_iter() - .any(|r| matches!(r, Ok(FormatItem::Spec(_)))); + let format_seen = + parse_spec_and_escape(format_string.as_ref()).any(|r| matches!(r, Ok(FormatItem::Spec(_)))); if !format_seen { return Ok(()); } From cd4568f5d9862ab28dda351c7692c0bd95dcdda7 Mon Sep 17 00:00:00 2001 From: Sudhakar Verma Date: Fri, 12 Jan 2024 17:12:30 +0530 Subject: [PATCH 22/33] printf: simplify loop --- src/uu/printf/src/printf.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/uu/printf/src/printf.rs b/src/uu/printf/src/printf.rs index b0988f7b4..c98bb59a1 100644 --- a/src/uu/printf/src/printf.rs +++ b/src/uu/printf/src/printf.rs @@ -38,17 +38,20 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { None => vec![], }; + let mut format_seen = false; let mut args = values.iter().peekable(); for item in parse_spec_and_escape(format_string.as_ref()) { + if let Ok(FormatItem::Spec(_)) = item { + format_seen = true; + } match item?.write(stdout(), &mut args)? { ControlFlow::Continue(()) => {} ControlFlow::Break(()) => return Ok(()), }; } - // See #5815 - We don't need to iter on args if no format string seen - let format_seen = - parse_spec_and_escape(format_string.as_ref()).any(|r| matches!(r, Ok(FormatItem::Spec(_)))); + // Without format specs in the string, the iter would not consume any args, + // leading to an infinite loop. Thus, we exit early. if !format_seen { return Ok(()); } From 19e1f26e3d9aa7a4749ed4c21293d111afc41846 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sat, 13 Jan 2024 14:01:38 +0100 Subject: [PATCH 23/33] fuzz: with pipe, also capture stderr --- fuzz/fuzz_targets/fuzz_common.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fuzz/fuzz_targets/fuzz_common.rs b/fuzz/fuzz_targets/fuzz_common.rs index f0de0b605..e8cac8d40 100644 --- a/fuzz/fuzz_targets/fuzz_common.rs +++ b/fuzz/fuzz_targets/fuzz_common.rs @@ -232,7 +232,10 @@ pub fn run_gnu_cmd( let output = if let Some(input_str) = pipe_input { // We have an pipe input - command.stdin(Stdio::piped()).stdout(Stdio::piped()); + command + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()); let mut child = command.spawn().expect("Failed to execute command"); let child_stdin = child.stdin.as_mut().unwrap(); From 563df4b79d972c27551055e5bf1eb4af02f6955f Mon Sep 17 00:00:00 2001 From: Atomei Alexandru <118962363+Ato2207@users.noreply.github.com> Date: Sat, 13 Jan 2024 15:43:36 +0200 Subject: [PATCH 24/33] Made cksum return an error if used on a directory. (#5822) * Made cksum to return an error if it is used on a directory regardless of the algorithm * Added one more test for cksum on folders and deleted an old one that expected it to succeed instead of fail * Made cksum work on more than one item if it fails and added a test for this case --- src/uu/cksum/src/cksum.rs | 19 ++++++------- tests/by-util/test_cksum.rs | 55 +++++++++++++++++++++++++++---------- 2 files changed, 49 insertions(+), 25 deletions(-) diff --git a/src/uu/cksum/src/cksum.rs b/src/uu/cksum/src/cksum.rs index a3e6dfd9e..458177e8a 100644 --- a/src/uu/cksum/src/cksum.rs +++ b/src/uu/cksum/src/cksum.rs @@ -15,8 +15,8 @@ use std::io::{self, stdin, stdout, BufReader, Read, Write}; use std::iter; use std::path::Path; use uucore::{ - error::{FromIo, UError, UResult}, - format_usage, help_about, help_section, help_usage, + error::{FromIo, UError, UResult, USimpleError}, + format_usage, help_about, help_section, help_usage, show, sum::{ div_ceil, Blake2b, Digest, DigestWriter, Md5, Sha1, Sha224, Sha256, Sha384, Sha512, Sm3, BSD, CRC, SYSV, @@ -174,7 +174,13 @@ where }); let (sum, sz) = digest_read(&mut options.digest, &mut file, options.output_bits) .map_err_context(|| "failed to read input".to_string())?; - + if filename.is_dir() { + show!(USimpleError::new( + 1, + format!("{}: Is a directory", filename.display()) + )); + continue; + } if options.raw { let bytes = match options.algo_name { ALGORITHM_OPTIONS_CRC => sum.parse::().unwrap().to_be_bytes().to_vec(), @@ -214,13 +220,6 @@ where (ALGORITHM_OPTIONS_CRC, true) => println!("{sum} {sz}"), (ALGORITHM_OPTIONS_CRC, false) => println!("{sum} {sz} {}", filename.display()), (ALGORITHM_OPTIONS_BLAKE2B, _) if !options.untagged => { - if filename.is_dir() { - return Err(io::Error::new( - io::ErrorKind::InvalidInput, - format!("{}: Is a directory", filename.display()), - ) - .into()); - } if let Some(length) = options.length { // Multiply by 8 here, as we want to print the length in bits. println!("BLAKE2b-{} ({}) = {sum}", length * 8, filename.display()); diff --git a/tests/by-util/test_cksum.rs b/tests/by-util/test_cksum.rs index b3db0bf0a..80cfc7499 100644 --- a/tests/by-util/test_cksum.rs +++ b/tests/by-util/test_cksum.rs @@ -80,18 +80,6 @@ fn test_nonexisting_file() { .stderr_contains(format!("cksum: {file_name}: No such file or directory")); } -#[test] -fn test_folder() { - let (at, mut ucmd) = at_and_ucmd!(); - - let folder_name = "a_folder"; - at.mkdir(folder_name); - - ucmd.arg(folder_name) - .succeeds() - .stdout_only(format!("4294967295 0 {folder_name}\n")); -} - // Make sure crc is correct for files larger than 32 bytes // but <128 bytes (1 fold pclmul) // spell-checker:disable-line #[test] @@ -312,15 +300,52 @@ fn test_raw_multiple_files() { } #[test] -fn test_blake2b_fail_on_directory() { +fn test_fail_on_folder() { let (at, mut ucmd) = at_and_ucmd!(); let folder_name = "a_folder"; at.mkdir(folder_name); - ucmd.arg("--algorithm=blake2b") - .arg(folder_name) + ucmd.arg(folder_name) .fails() .no_stdout() .stderr_contains(format!("cksum: {folder_name}: Is a directory")); } + +#[test] +fn test_all_algorithms_fail_on_folder() { + let scene = TestScenario::new(util_name!()); + + let at = &scene.fixtures; + + let folder_name = "a_folder"; + at.mkdir(folder_name); + + for algo in ALGOS { + scene + .ucmd() + .arg(format!("--algorithm={algo}")) + .arg(folder_name) + .fails() + .no_stdout() + .stderr_contains(format!("cksum: {folder_name}: Is a directory")); + } +} + +#[test] +fn test_folder_and_file() { + let scene = TestScenario::new(util_name!()); + + let at = &scene.fixtures; + + let folder_name = "a_folder"; + at.mkdir(folder_name); + + scene + .ucmd() + .arg(folder_name) + .arg("lorem_ipsum.txt") + .fails() + .stderr_contains(format!("cksum: {folder_name}: Is a directory")) + .stdout_is_fixture("crc_single_file.expected"); +} From c63b5b2a5d919ffd5b98741035c64c9ab83cf508 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 13 Jan 2024 13:57:26 +0000 Subject: [PATCH 25/33] chore(deps): update rust crate tempfile to 3.9.0 --- Cargo.lock | 6 +++--- Cargo.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0e4a271df..bf83d9acc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2045,15 +2045,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.8.1" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" dependencies = [ "cfg-if", "fastrand", "redox_syscall 0.4.0", "rustix 0.38.28", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index f45d0b2f4..a01fcdd2d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -319,7 +319,7 @@ self_cell = "1.0.3" selinux = "0.4" signal-hook = "0.3.17" smallvec = { version = "1.11", features = ["union"] } -tempfile = "3.8.1" +tempfile = "3.9.0" uutils_term_grid = "0.3" terminal_size = "0.3.0" textwrap = { version = "0.16.0", features = ["terminal_size"] } From e0abb76c0f5be632b60460ccdce69547baa06c60 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Sat, 16 Dec 2023 14:56:13 +0100 Subject: [PATCH 26/33] Bump redox_syscall to 0.4.1 redox_syscall from 0.3.5 & 0.4.0 -> 0.4.1 filetime from 0.2.22 -> 0.2.23 parking_lot_core from 0.9.8 -> 0.9.9 --- Cargo.lock | 31 +++++++++++-------------------- deny.toml | 2 -- 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0e4a271df..936d2c1f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -813,14 +813,14 @@ checksum = "31a7a908b8f32538a2143e59a6e4e2508988832d5d4d6f7c156b3cbc762643a5" [[package]] name = "filetime" -version = "0.2.22" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", - "windows-sys 0.48.0", + "redox_syscall", + "windows-sys 0.52.0", ] [[package]] @@ -1455,13 +1455,13 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", + "redox_syscall", "smallvec", "windows-targets 0.48.0", ] @@ -1689,18 +1689,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.3.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded0bce2d41cc3c57aefa284708ced249a64acb01745dbbe72bd78610bfd644c" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] @@ -2051,7 +2042,7 @@ checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" dependencies = [ "cfg-if", "fastrand", - "redox_syscall 0.4.0", + "redox_syscall", "rustix 0.38.28", "windows-sys 0.48.0", ] @@ -3014,7 +3005,7 @@ version = "0.0.23" dependencies = [ "clap", "libc", - "redox_syscall 0.4.0", + "redox_syscall", "uucore", ] diff --git a/deny.toml b/deny.toml index 986c2b269..d7c04ad2d 100644 --- a/deny.toml +++ b/deny.toml @@ -102,8 +102,6 @@ skip = [ { name = "syn", version = "1.0.109" }, # various crates { name = "bitflags", version = "1.3.2" }, - # various crates - { name = "redox_syscall", version = "0.3.5" }, # clap_builder, textwrap { name = "terminal_size", version = "0.2.6" }, ] From bc51b8d2169896ab5c513edb441a6d041a0449f6 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sat, 13 Jan 2024 15:09:08 +0100 Subject: [PATCH 27/33] cut: allow the same option to be passed multiple times --- src/uu/cut/src/cut.rs | 1 + tests/by-util/test_cut.rs | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/src/uu/cut/src/cut.rs b/src/uu/cut/src/cut.rs index 0d5f79b35..2a3196d00 100644 --- a/src/uu/cut/src/cut.rs +++ b/src/uu/cut/src/cut.rs @@ -510,6 +510,7 @@ pub fn uu_app() -> Command { .about(ABOUT) .after_help(AFTER_HELP) .infer_long_args(true) + .args_override_self(true) .arg( Arg::new(options::BYTES) .short('b') diff --git a/tests/by-util/test_cut.rs b/tests/by-util/test_cut.rs index 112dc0fd3..57e6666d3 100644 --- a/tests/by-util/test_cut.rs +++ b/tests/by-util/test_cut.rs @@ -255,3 +255,13 @@ fn test_equal_as_delimiter3() { .succeeds() .stdout_only_bytes("abZcd\n"); } + +#[test] +fn test_multiple() { + let result = new_ucmd!() + .args(&["-f2", "-d:", "-d="]) + .pipe_in("a=b\n") + .succeeds(); + assert_eq!(result.stdout_str(), "b\n"); + assert_eq!(result.stderr_str(), ""); +} From e860b32a82acb1ca9840d1b7197d5407e922ef99 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 14 Jan 2024 00:28:34 +0000 Subject: [PATCH 28/33] chore(deps): update rust crate smallvec to 1.12 --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bf83d9acc..b6a259134 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1995,9 +1995,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +checksum = "2593d31f82ead8df961d8bd23a64c2ccf2eb5dd34b0a34bfb4dd54011c72009e" [[package]] name = "smawk" diff --git a/Cargo.toml b/Cargo.toml index a01fcdd2d..c69122515 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -318,7 +318,7 @@ same-file = "1.0.6" self_cell = "1.0.3" selinux = "0.4" signal-hook = "0.3.17" -smallvec = { version = "1.11", features = ["union"] } +smallvec = { version = "1.12", features = ["union"] } tempfile = "3.9.0" uutils_term_grid = "0.3" terminal_size = "0.3.0" From aeee56b3c3bd7ed0f93d875d322b0f9eba4ae95d Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Sun, 14 Jan 2024 15:23:24 +0100 Subject: [PATCH 29/33] head: fix clippy warnings in tests --- tests/by-util/test_head.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/by-util/test_head.rs b/tests/by-util/test_head.rs index cc17cdf95..0b0e98aa1 100644 --- a/tests/by-util/test_head.rs +++ b/tests/by-util/test_head.rs @@ -391,7 +391,7 @@ fn test_read_backwards_bytes_proc_fs_version() { let args = ["-c", "-1", "/proc/version"]; let result = ts.ucmd().args(&args).succeeds(); - assert!(result.stdout().len() > 0); + assert!(!result.stdout().is_empty()); } #[cfg(all( @@ -406,7 +406,7 @@ fn test_read_backwards_bytes_proc_fs_modules() { let args = ["-c", "-1", "/proc/modules"]; let result = ts.ucmd().args(&args).succeeds(); - assert!(result.stdout().len() > 0); + assert!(!result.stdout().is_empty()); } #[cfg(all( @@ -421,7 +421,7 @@ fn test_read_backwards_lines_proc_fs_modules() { let args = ["--lines", "-1", "/proc/modules"]; let result = ts.ucmd().args(&args).succeeds(); - assert!(result.stdout().len() > 0); + assert!(!result.stdout().is_empty()); } #[cfg(all( From e01d5f75f786b5f6953f5d714de92a588e0d5bc1 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sun, 14 Jan 2024 15:57:22 +0100 Subject: [PATCH 30/33] ls: if acl are used, show the + in the perms (#5816) * ls: if acl are used, show the + in the perms Tested by tests/mkdir/p-acl.sh * CICD.yml: fix small formatting issue --------- Co-authored-by: Daniel Hofstetter --- .github/workflows/CICD.yml | 20 ++++++++++++++++---- Cargo.lock | 1 + src/uu/ls/Cargo.toml | 3 +++ src/uu/ls/src/ls.rs | 28 ++++++++++++++++++++++++++-- tests/by-util/test_ls.rs | 36 ++++++++++++++++++++++++++++++++++++ 5 files changed, 82 insertions(+), 6 deletions(-) diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml index 89022bbef..209456092 100644 --- a/.github/workflows/CICD.yml +++ b/.github/workflows/CICD.yml @@ -612,11 +612,23 @@ jobs: run: | ## Install/setup prerequisites case '${{ matrix.job.target }}' in - arm-unknown-linux-gnueabihf) sudo apt-get -y update ; sudo apt-get -y install gcc-arm-linux-gnueabihf ;; - aarch64-unknown-linux-*) sudo apt-get -y update ; sudo apt-get -y install gcc-aarch64-linux-gnu ;; - *-redox*) sudo apt-get -y update ; sudo apt-get -y install fuse3 libfuse-dev ;; + arm-unknown-linux-gnueabihf) + sudo apt-get -y update + sudo apt-get -y install gcc-arm-linux-gnueabihf + ;; + aarch64-unknown-linux-*) + sudo apt-get -y update + sudo apt-get -y install gcc-aarch64-linux-gnu + ;; + *-redox*) + sudo apt-get -y update + sudo apt-get -y install fuse3 libfuse-dev + ;; # Update binutils if MinGW due to https://github.com/rust-lang/rust/issues/112368 - x86_64-pc-windows-gnu) C:/msys64/usr/bin/pacman.exe -Syu --needed mingw-w64-x86_64-gcc --noconfirm ; echo "C:\msys64\mingw64\bin" >> $GITHUB_PATH ;; + x86_64-pc-windows-gnu) + C:/msys64/usr/bin/pacman.exe -Syu --needed mingw-w64-x86_64-gcc --noconfirm + echo "C:\msys64\mingw64\bin" >> $GITHUB_PATH + ;; esac case '${{ matrix.job.os }}' in macos-latest) brew install coreutils ;; # needed for testing diff --git a/Cargo.lock b/Cargo.lock index b6a259134..56e448fa7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2616,6 +2616,7 @@ dependencies = [ "unicode-width", "uucore", "uutils_term_grid", + "xattr", ] [[package]] diff --git a/src/uu/ls/Cargo.toml b/src/uu/ls/Cargo.toml index d11eeb27c..38312eefc 100644 --- a/src/uu/ls/Cargo.toml +++ b/src/uu/ls/Cargo.toml @@ -34,6 +34,9 @@ once_cell = { workspace = true } selinux = { workspace = true, optional = true } hostname = { workspace = true } +[target.'cfg(unix)'.dependencies] +xattr = { workspace = true } + [[bin]] name = "ls" path = "src/main.rs" diff --git a/src/uu/ls/src/ls.rs b/src/uu/ls/src/ls.rs index 0e9b25722..1c89cd353 100644 --- a/src/uu/ls/src/ls.rs +++ b/src/uu/ls/src/ls.rs @@ -3,7 +3,7 @@ // For the full copyright and license information, please view the LICENSE // file that was distributed with this source code. -// spell-checker:ignore (ToDO) somegroup nlink tabsize dired subdired dtype colorterm +// spell-checker:ignore (ToDO) somegroup nlink tabsize dired subdired dtype colorterm getxattr use clap::{ builder::{NonEmptyStringValueParser, ValueParser}, @@ -36,6 +36,7 @@ use std::{ }; use term_grid::{Cell, Direction, Filling, Grid, GridOptions}; use unicode_width::UnicodeWidthStr; + #[cfg(any( target_os = "linux", target_os = "macos", @@ -2620,6 +2621,18 @@ fn display_grid( Ok(()) } +#[cfg(all(unix, not(any(target_os = "android", target_os = "macos"))))] +fn file_has_acl>(file: P) -> bool { + // don't use exacl here, it is doing more getxattr call then needed + match xattr::list(file) { + Ok(acl) => { + // if we have extra attributes, we have an acl + acl.count() > 0 + } + Err(_) => false, + } +} + /// This writes to the BufWriter out a single string of the output of `ls -l`. /// /// It writes the following keys, in order: @@ -2663,9 +2676,14 @@ fn display_item_long( output_display += " "; } if let Some(md) = item.get_metadata(out) { + #[cfg(any(not(unix), target_os = "android", target_os = "macos"))] + // TODO: See how Mac should work here + let is_acl_set = false; + #[cfg(all(unix, not(any(target_os = "android", target_os = "macos"))))] + let is_acl_set = file_has_acl(item.display_name.as_os_str()); write!( output_display, - "{}{} {}", + "{}{}{} {}", display_permissions(md, true), if item.security_context.len() > 1 { // GNU `ls` uses a "." character to indicate a file with a security context, @@ -2674,6 +2692,12 @@ fn display_item_long( } else { "" }, + if is_acl_set { + // if acl has been set, we display a "+" at the end of the file permissions + "+" + } else { + "" + }, pad_left(&display_symlink_count(md), padding.link_count) ) .unwrap(); diff --git a/tests/by-util/test_ls.rs b/tests/by-util/test_ls.rs index 0162b0170..1262c2ab9 100644 --- a/tests/by-util/test_ls.rs +++ b/tests/by-util/test_ls.rs @@ -4293,3 +4293,39 @@ fn test_term_colorterm() { "exe" ); } + +#[cfg(all(unix, not(target_os = "macos")))] +#[test] +fn test_acl_display() { + use std::process::Command; + + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + let path = "a42"; + at.mkdir(path); + + let path = at.plus_as_string(path); + // calling the command directly. xattr requires some dev packages to be installed + // and it adds a complex dependency just for a test + match Command::new("setfacl") + .args(["-d", "-m", "group::rwx", &path]) + .status() + .map(|status| status.code()) + { + Ok(Some(0)) => {} + Ok(_) => { + println!("test skipped: setfacl failed"); + return; + } + Err(e) => { + println!("test skipped: setfacl failed with {}", e); + return; + } + } + + scene + .ucmd() + .args(&["-lda", &path]) + .succeeds() + .stdout_contains("+"); +} From 7914f22cfe13167d14f38b01d4a3b8aa6f5b309e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 03:14:26 +0000 Subject: [PATCH 31/33] chore(deps): update rust crate xattr to 1.3.1 --- Cargo.lock | 16 ++++++++-------- Cargo.toml | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e0d6ffbf5..55ec59e2d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1589,7 +1589,7 @@ dependencies = [ "hex", "lazy_static", "procfs-core", - "rustix 0.38.28", + "rustix 0.38.30", ] [[package]] @@ -1822,9 +1822,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.28" +version = "0.38.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca" dependencies = [ "bitflags 2.4.0", "errno", @@ -2043,7 +2043,7 @@ dependencies = [ "cfg-if", "fastrand", "redox_syscall", - "rustix 0.38.28", + "rustix 0.38.30", "windows-sys 0.52.0", ] @@ -2063,7 +2063,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" dependencies = [ - "rustix 0.38.28", + "rustix 0.38.30", "windows-sys 0.48.0", ] @@ -3566,13 +3566,13 @@ checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "xattr" -version = "1.2.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "914566e6413e7fa959cc394fb30e563ba80f3541fbd40816d4c05a0fc3f2a0f1" +checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ "libc", "linux-raw-sys 0.4.12", - "rustix 0.38.28", + "rustix 0.38.30", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index c69122515..17efcb6a7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -331,7 +331,7 @@ utf-8 = "0.7.6" walkdir = "2.4" winapi-util = "0.1.6" windows-sys = { version = "0.48.0", default-features = false } -xattr = "1.2.0" +xattr = "1.3.1" zip = { version = "0.6.6", default-features = false, features = ["deflate"] } hex = "0.4.3" From 076b905513b1ed27cae640ba6cb5d0db42ef5935 Mon Sep 17 00:00:00 2001 From: Biplab Mochan Gartia <45629823+biplab5464@users.noreply.github.com> Date: Mon, 15 Jan 2024 14:07:56 +0530 Subject: [PATCH 32/33] cksum: stops when one of given files doesn't exist #5809 (#5820) * cksum: stops when one of given files doesn't exist #5809 * removed printld cksum: stops when one of given files doesn't exist #5809 * formatting the code cksum: stops when one of given files doesn't exist #5809 * formatting the code cksum: stops when one of given files doesn't exist #5809 * set exist status cksum: stops when one of given files doesn't exist #5809 * code quality formatting issue cksum: stops when one of given files doesn't exist #5809 * tertsdiepraam idea cksum: stops when one of given files doesn't exist #5809 * one new test case and deleted duplicate show cksum: stops when one of given files doesn't exist #5809 * formatting the test cases cksum: stops when one of given files doesn't exist #5809 * Revert "formatting the test cases cksum: stops when one of given files doesn't exist #5809" This reverts commit 8c382f1e8fa4e9ba3fc0f4fc05ee2fb58ef9dbfd. * reverting the changes and committing again due to a mistake cksum: stops when one of given files doesn't exist #5809 --------- Co-authored-by: biplab5464 --- src/uu/cksum/src/cksum.rs | 9 +++++++-- tests/by-util/test_cksum.rs | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/uu/cksum/src/cksum.rs b/src/uu/cksum/src/cksum.rs index 458177e8a..36dfbbe1e 100644 --- a/src/uu/cksum/src/cksum.rs +++ b/src/uu/cksum/src/cksum.rs @@ -168,8 +168,13 @@ where } else if filename.is_dir() { Box::new(BufReader::new(io::empty())) as Box } else { - file_buf = - File::open(filename).map_err_context(|| filename.to_str().unwrap().to_string())?; + file_buf = match File::open(filename) { + Ok(file) => file, + Err(err) => { + show!(err.map_err_context(|| filename.to_string_lossy().to_string())); + continue; + } + }; Box::new(file_buf) as Box }); let (sum, sz) = digest_read(&mut options.digest, &mut file, options.output_bits) diff --git a/tests/by-util/test_cksum.rs b/tests/by-util/test_cksum.rs index 80cfc7499..464de9474 100644 --- a/tests/by-util/test_cksum.rs +++ b/tests/by-util/test_cksum.rs @@ -80,6 +80,22 @@ fn test_nonexisting_file() { .stderr_contains(format!("cksum: {file_name}: No such file or directory")); } +#[test] +fn test_one_nonexisting_file() { + let (at, mut ucmd) = at_and_ucmd!(); + + at.touch("abc.txt"); + at.touch("xyz.txt"); + + ucmd.arg("abc.txt") + .arg("asdf.txt") + .arg("xyz.txt") + .fails() + .stdout_contains_line("4294967295 0 xyz.txt") + .stderr_contains("asdf.txt: No such file or directory") + .stdout_contains_line("4294967295 0 abc.txt"); +} + // Make sure crc is correct for files larger than 32 bytes // but <128 bytes (1 fold pclmul) // spell-checker:disable-line #[test] From e91540fc0792ab563fe2a35a52299024902b88cf Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Mon, 15 Jan 2024 10:27:59 +0100 Subject: [PATCH 33/33] uucore: fix clippy warning from if_not_else lint --- src/uucore/src/lib/features/format/num_format.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/uucore/src/lib/features/format/num_format.rs b/src/uucore/src/lib/features/format/num_format.rs index 325da3ce6..ea5d6a753 100644 --- a/src/uucore/src/lib/features/format/num_format.rs +++ b/src/uucore/src/lib/features/format/num_format.rs @@ -146,10 +146,10 @@ impl Formatter for UnsignedInt { // We also need to take into account that 0 should not be 00 // Since this is an unsigned int, we do not need to take the minus // sign into account. - if x != 0 { - format!("0{x:o}") - } else { + if x == 0 { format!("{x:o}") + } else { + format!("0{x:o}") } } UnsignedIntVariant::Hexadecimal(Case::Lowercase, Prefix::No) => {