From 928ca15251557d4fd6fc16db209f65f44eb0f018 Mon Sep 17 00:00:00 2001 From: Dorian Peron Date: Fri, 9 Jan 2026 17:18:39 +0100 Subject: [PATCH] sha256sum: introduce standalone binary --- Cargo.lock | 13 ++ Cargo.toml | 2 + GNUmakefile | 1 - build.rs | 1 - src/common/validation.rs | 2 +- src/uu/sha256sum/Cargo.toml | 38 ++++ src/uu/sha256sum/LICENSE | 1 + src/uu/sha256sum/locales/en-US.ftl | 2 + src/uu/sha256sum/locales/fr-FR.ftl | 2 + src/uu/sha256sum/src/main.rs | 1 + src/uu/sha256sum/src/sha256sum.rs | 1 + src/uucore/src/lib/lib.rs | 2 +- src/uucore/src/lib/mods/locale.rs | 11 +- tests/by-util/test_hashsum.rs | 18 +- tests/by-util/test_sha256sum.rs | 181 ++++++++++++++++++ tests/fixtures/sha256sum/binary.png | Bin 0 -> 8055 bytes .../binary.sha256.checkfile | 0 .../binary.sha256.expected | 0 tests/fixtures/sha256sum/input.txt | 1 + .../{hashsum => sha256sum}/sha256.checkfile | 0 .../{hashsum => sha256sum}/sha256.expected | 0 tests/tests.rs | 4 + 22 files changed, 268 insertions(+), 13 deletions(-) create mode 100644 src/uu/sha256sum/Cargo.toml create mode 120000 src/uu/sha256sum/LICENSE create mode 100644 src/uu/sha256sum/locales/en-US.ftl create mode 100644 src/uu/sha256sum/locales/fr-FR.ftl create mode 100644 src/uu/sha256sum/src/main.rs create mode 100644 src/uu/sha256sum/src/sha256sum.rs create mode 100644 tests/by-util/test_sha256sum.rs create mode 100644 tests/fixtures/sha256sum/binary.png rename tests/fixtures/{hashsum => sha256sum}/binary.sha256.checkfile (100%) rename tests/fixtures/{hashsum => sha256sum}/binary.sha256.expected (100%) create mode 100644 tests/fixtures/sha256sum/input.txt rename tests/fixtures/{hashsum => sha256sum}/sha256.checkfile (100%) rename tests/fixtures/{hashsum => sha256sum}/sha256.expected (100%) diff --git a/Cargo.lock b/Cargo.lock index 8232e2e27..aa8dcdf27 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -629,6 +629,7 @@ dependencies = [ "uu_seq", "uu_sha1sum", "uu_sha224sum", + "uu_sha256sum", "uu_shred", "uu_shuf", "uu_sleep", @@ -4010,6 +4011,18 @@ dependencies = [ "uucore", ] +[[package]] +name = "uu_sha256sum" +version = "0.6.0" +dependencies = [ + "clap", + "codspeed-divan-compat", + "fluent", + "tempfile", + "uu_checksum_common", + "uucore", +] + [[package]] name = "uu_shred" version = "0.6.0" diff --git a/Cargo.toml b/Cargo.toml index 789586c3d..801f67979 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -90,6 +90,7 @@ feat_common_core = [ "md5sum", "sha1sum", "sha224sum", + "sha256sum", "comm", "cp", "csplit", @@ -445,6 +446,7 @@ b2sum = { optional = true, version = "0.6.0", package = "uu_b2sum", path = "src/ md5sum = { optional = true, version = "0.6.0", package = "uu_md5sum", path = "src/uu/md5sum" } sha1sum = { optional = true, version = "0.6.0", package = "uu_sha1sum", path = "src/uu/sha1sum" } sha224sum = { optional = true, version = "0.6.0", package = "uu_sha224sum", path = "src/uu/sha224sum" } +sha256sum = { optional = true, version = "0.6.0", package = "uu_sha256sum", path = "src/uu/sha256sum" } comm = { optional = true, version = "0.6.0", package = "uu_comm", path = "src/uu/comm" } cp = { optional = true, version = "0.6.0", package = "uu_cp", path = "src/uu/cp" } csplit = { optional = true, version = "0.6.0", package = "uu_csplit", path = "src/uu/csplit" } diff --git a/GNUmakefile b/GNUmakefile index f713e6390..998968d09 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -96,7 +96,6 @@ SELINUX_PROGS := \ runcon HASHSUM_PROGS := \ - sha256sum \ sha384sum \ sha512sum diff --git a/build.rs b/build.rs index 49d8c675c..c206e892f 100644 --- a/build.rs +++ b/build.rs @@ -91,7 +91,6 @@ pub fn main() { phf_map.entry(krate, format!("({krate}::uumain, {krate}::uu_app_custom)")); let map_value = format!("({krate}::uumain, {krate}::uu_app_common)"); - phf_map.entry("sha256sum", map_value.clone()); phf_map.entry("sha384sum", map_value.clone()); phf_map.entry("sha512sum", map_value.clone()); } diff --git a/src/common/validation.rs b/src/common/validation.rs index c5aaac3d0..aa01b4679 100644 --- a/src/common/validation.rs +++ b/src/common/validation.rs @@ -51,7 +51,7 @@ fn get_canonical_util_name(util_name: &str) -> &str { "[" => "test", // hashsum aliases - all these hash commands are aliases for hashsum - "sha256sum" | "sha384sum" | "sha512sum" => "hashsum", + "sha384sum" | "sha512sum" => "hashsum", "dir" => "ls", // dir is an alias for ls diff --git a/src/uu/sha256sum/Cargo.toml b/src/uu/sha256sum/Cargo.toml new file mode 100644 index 000000000..2ca6204c0 --- /dev/null +++ b/src/uu/sha256sum/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "uu_sha256sum" +description = "sha256sum ~ (uutils) Print or check the SHA256 checksums" +repository = "https://github.com/uutils/coreutils/tree/main/src/uu/sha256sum" +version.workspace = true +authors.workspace = true +license.workspace = true +homepage.workspace = true +keywords.workspace = true +categories.workspace = true +edition.workspace = true +readme.workspace = true + +[lints] +workspace = true + +[lib] +path = "src/sha256sum.rs" + +[dependencies] +clap = { workspace = true } +uu_checksum_common = { workspace = true } +uucore = { workspace = true, features = [ + "checksum", + "encoding", + "sum", + "hardware", +] } +fluent = { workspace = true } + +[dev-dependencies] +divan = { workspace = true } +tempfile = { workspace = true } +uucore = { workspace = true, features = ["benchmark"] } + +[[bin]] +name = "sha256sum" +path = "src/main.rs" diff --git a/src/uu/sha256sum/LICENSE b/src/uu/sha256sum/LICENSE new file mode 120000 index 000000000..5853aaea5 --- /dev/null +++ b/src/uu/sha256sum/LICENSE @@ -0,0 +1 @@ +../../../LICENSE \ No newline at end of file diff --git a/src/uu/sha256sum/locales/en-US.ftl b/src/uu/sha256sum/locales/en-US.ftl new file mode 100644 index 000000000..60a0b4a3f --- /dev/null +++ b/src/uu/sha256sum/locales/en-US.ftl @@ -0,0 +1,2 @@ +sha256sum-about = Print or check the SHA256 checksums +sha256sum-usage = sha256sum [OPTIONS] [FILE]... diff --git a/src/uu/sha256sum/locales/fr-FR.ftl b/src/uu/sha256sum/locales/fr-FR.ftl new file mode 100644 index 000000000..baaa2f83b --- /dev/null +++ b/src/uu/sha256sum/locales/fr-FR.ftl @@ -0,0 +1,2 @@ +sha256sum-about = Afficher le SHA256 et la taille de chaque fichier +sha256sum-usage = sha256sum [OPTION]... [FICHIER]... diff --git a/src/uu/sha256sum/src/main.rs b/src/uu/sha256sum/src/main.rs new file mode 100644 index 000000000..323cd315d --- /dev/null +++ b/src/uu/sha256sum/src/main.rs @@ -0,0 +1 @@ +uucore::bin!(uu_sha256sum); diff --git a/src/uu/sha256sum/src/sha256sum.rs b/src/uu/sha256sum/src/sha256sum.rs new file mode 100644 index 000000000..ab47a23df --- /dev/null +++ b/src/uu/sha256sum/src/sha256sum.rs @@ -0,0 +1 @@ +uu_checksum_common::declare_standalone!("sha256sum", uucore::checksum::AlgoKind::Sha256); diff --git a/src/uucore/src/lib/lib.rs b/src/uucore/src/lib/lib.rs index b013e9128..3e6003f31 100644 --- a/src/uucore/src/lib/lib.rs +++ b/src/uucore/src/lib/lib.rs @@ -173,7 +173,7 @@ pub fn get_canonical_util_name(util_name: &str) -> &str { "[" => "test", // hashsum aliases - all these hash commands are aliases for hashsum - "sha256sum" | "sha384sum" | "sha512sum" => "hashsum", + "sha384sum" | "sha512sum" => "hashsum", "dir" => "ls", // dir is an alias for ls diff --git a/src/uucore/src/lib/mods/locale.rs b/src/uucore/src/lib/mods/locale.rs index c69a5452d..da5a996d5 100644 --- a/src/uucore/src/lib/mods/locale.rs +++ b/src/uucore/src/lib/mods/locale.rs @@ -157,7 +157,16 @@ fn create_bundle( try_add_resource_from(get_locales_dir(util_name).ok()); // checksum binaries also require fluent files from the checksum_common crate - if ["cksum", "b2sum", "md5sum", "sha1sum", "sha224sum"].contains(&util_name) { + if [ + "cksum", + "b2sum", + "md5sum", + "sha1sum", + "sha224sum", + "sha256sum", + ] + .contains(&util_name) + { try_add_resource_from(get_locales_dir("checksum_common").ok()); } diff --git a/tests/by-util/test_hashsum.rs b/tests/by-util/test_hashsum.rs index ea044f6ab..ff6d92f2d 100644 --- a/tests/by-util/test_hashsum.rs +++ b/tests/by-util/test_hashsum.rs @@ -205,7 +205,6 @@ test_digest! {b3sum, b3sum} test_digest! {shake128, shake128} test_digest! {shake256, shake256} -test_digest_with_len! {sha256, sha256, 256} test_digest_with_len! {sha384, sha384, 384} test_digest_with_len! {sha512, sha512, 512} test_digest_with_len! {sha3_224, sha3, 224} @@ -618,6 +617,7 @@ fn test_conflicting_arg() { .fails_with_code(1); } +#[ignore = "moved to standalone"] #[test] fn test_tag() { let scene = TestScenario::new(util_name!()); @@ -1184,6 +1184,7 @@ fn test_check_md5_comment_leading_space() { .stderr_contains("WARNING: 1 line is improperly formatted"); } +#[ignore = "moved to standalone"] #[test] fn test_sha256_binary() { let ts = TestScenario::new(util_name!()); @@ -1200,6 +1201,7 @@ fn test_sha256_binary() { ); } +#[ignore = "moved to standalone"] #[test] fn test_sha256_stdin_binary() { let ts = TestScenario::new(util_name!()); @@ -1217,8 +1219,8 @@ fn test_sha256_stdin_binary() { } // This test is currently disabled on windows +#[ignore = "moved to standalone"] #[test] -#[cfg_attr(windows, ignore = "Discussion is in #9168")] fn test_check_sha256_binary() { new_ucmd!() .args(&["--sha256", "--check", "binary.sha256.checkfile"]) @@ -1241,12 +1243,12 @@ fn test_help_shows_correct_utility_name() { // .stdout_does_not_contain("Usage: hashsum"); // Test sha256sum - scene - .ccmd("sha256sum") - .arg("--help") - .succeeds() - .stdout_contains("Usage: sha256sum") - .stdout_does_not_contain("Usage: hashsum"); + // scene + // .ccmd("sha256sum") + // .arg("--help") + // .succeeds() + // .stdout_contains("Usage: sha256sum") + // .stdout_does_not_contain("Usage: hashsum"); // Test b2sum // scene diff --git a/tests/by-util/test_sha256sum.rs b/tests/by-util/test_sha256sum.rs new file mode 100644 index 000000000..b3b538384 --- /dev/null +++ b/tests/by-util/test_sha256sum.rs @@ -0,0 +1,181 @@ +// This file is part of the uutils coreutils package. +// +// For the full copyright and license information, please view the LICENSE +// file that was distributed with this source code. + +use uutests::new_ucmd; +use uutests::util::TestScenario; +use uutests::util_name; +// spell-checker:ignore checkfile, testf, ntestf +macro_rules! get_hash( + ($str:expr) => ( + $str.split(' ').collect::>()[0] + ); +); + +macro_rules! test_digest { + ($id:ident) => { + mod $id { + use uutests::util::*; + use uutests::util_name; + static EXPECTED_FILE: &'static str = concat!(stringify!($id), ".expected"); + static CHECK_FILE: &'static str = concat!(stringify!($id), ".checkfile"); + static INPUT_FILE: &'static str = "input.txt"; + + #[test] + fn test_single_file() { + let ts = TestScenario::new(util_name!()); + assert_eq!( + ts.fixtures.read(EXPECTED_FILE), + get_hash!( + ts.ucmd() + .arg(INPUT_FILE) + .succeeds() + .no_stderr() + .stdout_str() + ) + ); + } + + #[test] + fn test_stdin() { + let ts = TestScenario::new(util_name!()); + assert_eq!( + ts.fixtures.read(EXPECTED_FILE), + get_hash!( + ts.ucmd() + .pipe_in_fixture(INPUT_FILE) + .succeeds() + .no_stderr() + .stdout_str() + ) + ); + } + + #[test] + fn test_check() { + let ts = TestScenario::new(util_name!()); + println!("File content='{}'", ts.fixtures.read(INPUT_FILE)); + println!("Check file='{}'", ts.fixtures.read(CHECK_FILE)); + + ts.ucmd() + .args(&["--check", CHECK_FILE]) + .succeeds() + .no_stderr() + .stdout_is("input.txt: OK\n"); + } + + #[test] + fn test_zero() { + let ts = TestScenario::new(util_name!()); + assert_eq!( + ts.fixtures.read(EXPECTED_FILE), + get_hash!( + ts.ucmd() + .arg("--zero") + .arg(INPUT_FILE) + .succeeds() + .no_stderr() + .stdout_str() + ) + ); + } + + #[test] + fn test_missing_file() { + let ts = TestScenario::new(util_name!()); + let at = &ts.fixtures; + + at.write("a", "file1\n"); + at.write("c", "file3\n"); + + ts.ucmd() + .args(&["a", "b", "c"]) + .fails() + .stdout_contains("a\n") + .stdout_contains("c\n") + .stderr_contains("b: No such file or directory"); + } + } + }; +} + +test_digest! {sha256} + +#[test] +fn test_invalid_arg() { + new_ucmd!().arg("--definitely-invalid").fails_with_code(1); +} + +#[test] +fn test_conflicting_arg() { + new_ucmd!().arg("--tag").arg("--check").fails_with_code(1); + new_ucmd!().arg("--tag").arg("--text").fails_with_code(1); +} + +#[test] +fn test_tag() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + at.write("foobar", "foo bar\n"); + scene + .ccmd("sha256sum") + .arg("--tag") + .arg("foobar") + .succeeds() + .stdout_is( + "SHA256 (foobar) = 1f2ec52b774368781bed1d1fb140a92e0eb6348090619c9291f9a5a3c8e8d151\n", + ); +} + +#[test] +fn test_sha256_binary() { + let ts = TestScenario::new(util_name!()); + assert_eq!( + ts.fixtures.read("binary.sha256.expected"), + get_hash!( + ts.ucmd() + .arg("binary.png") + .succeeds() + .no_stderr() + .stdout_str() + ) + ); +} + +#[test] +fn test_sha256_stdin_binary() { + let ts = TestScenario::new(util_name!()); + assert_eq!( + ts.fixtures.read("binary.sha256.expected"), + get_hash!( + ts.ucmd() + .pipe_in_fixture("binary.png") + .succeeds() + .no_stderr() + .stdout_str() + ) + ); +} + +// This test is currently disabled on windows +#[test] +#[cfg_attr(windows, ignore = "Discussion is in #9168")] +fn test_check_sha256_binary() { + new_ucmd!() + .args(&["--check", "binary.sha256.checkfile"]) + .succeeds() + .no_stderr() + .stdout_is("binary.png: OK\n"); +} + +#[test] +fn test_help_shows_correct_utility_name() { + // Test that help output shows the actual utility name instead of "hashsum" + new_ucmd!() + .arg("--help") + .succeeds() + .stdout_contains("Usage: sha256sum") + .stdout_does_not_contain("Usage: hashsum"); +} diff --git a/tests/fixtures/sha256sum/binary.png b/tests/fixtures/sha256sum/binary.png new file mode 100644 index 0000000000000000000000000000000000000000..6c4161338f200299744af6dff35884ac5c94516b GIT binary patch literal 8055 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 Sw4Q;1fx*+&&t;ucLK6V^nqaB` literal 0 HcmV?d00001 diff --git a/tests/fixtures/hashsum/binary.sha256.checkfile b/tests/fixtures/sha256sum/binary.sha256.checkfile similarity index 100% rename from tests/fixtures/hashsum/binary.sha256.checkfile rename to tests/fixtures/sha256sum/binary.sha256.checkfile diff --git a/tests/fixtures/hashsum/binary.sha256.expected b/tests/fixtures/sha256sum/binary.sha256.expected similarity index 100% rename from tests/fixtures/hashsum/binary.sha256.expected rename to tests/fixtures/sha256sum/binary.sha256.expected diff --git a/tests/fixtures/sha256sum/input.txt b/tests/fixtures/sha256sum/input.txt new file mode 100644 index 000000000..8c01d89ae --- /dev/null +++ b/tests/fixtures/sha256sum/input.txt @@ -0,0 +1 @@ +hello, world \ No newline at end of file diff --git a/tests/fixtures/hashsum/sha256.checkfile b/tests/fixtures/sha256sum/sha256.checkfile similarity index 100% rename from tests/fixtures/hashsum/sha256.checkfile rename to tests/fixtures/sha256sum/sha256.checkfile diff --git a/tests/fixtures/hashsum/sha256.expected b/tests/fixtures/sha256sum/sha256.expected similarity index 100% rename from tests/fixtures/hashsum/sha256.expected rename to tests/fixtures/sha256sum/sha256.expected diff --git a/tests/tests.rs b/tests/tests.rs index b51ed1c5b..26cf7b7aa 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -84,6 +84,10 @@ mod test_sha1sum; #[path = "by-util/test_sha224sum.rs"] mod test_sha224sum; +#[cfg(feature = "sha256sum")] +#[path = "by-util/test_sha256sum.rs"] +mod test_sha256sum; + #[cfg(feature = "cp")] #[path = "by-util/test_cp.rs"] mod test_cp;