diff --git a/Cargo.lock b/Cargo.lock index 2d4331dc..75e1bcfb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -264,17 +264,17 @@ name = "diffutils" version = "0.5.0" dependencies = [ "assert_cmd", - "chrono", "codspeed-divan-compat", "diff", - "itoa", "predicates", - "pretty_assertions", "rand", "regex", "same-file", "tempfile", "unicode-width", + "uu_cmp", + "uu_diff", + "uucore", ] [[package]] @@ -824,6 +824,38 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "uu_cmp" +version = "0.5.0" +dependencies = [ + "itoa", + "same-file", + "uucore", +] + +[[package]] +name = "uu_diff" +version = "0.5.0" +dependencies = [ + "diff", + "pretty_assertions", + "regex", + "same-file", + "unicode-width", + "uucore", +] + +[[package]] +name = "uucore" +version = "0.5.0" +dependencies = [ + "chrono", + "pretty_assertions", + "regex", + "tempfile", + "unicode-width", +] + [[package]] name = "wait-timeout" version = "0.2.1" diff --git a/Cargo.toml b/Cargo.toml index ded812c8..ae0819e0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,10 +1,46 @@ [package] name = "diffutils" -version = "0.5.0" -edition = "2021" description = "A CLI app for generating diff files" -license = "MIT OR Apache-2.0" repository = "https://github.com/uutils/diffutils" +edition.workspace = true +rust-version.workspace = true +version.workspace = true +license.workspace = true +homepage.workspace = true +keywords.workspace = true +categories.workspace = true + +[workspace] +members = [ + "src/uu/*", + "src/uucore/", +] + +default-members = [ + ".", + "src/uu/*", + "src/uucore/", +] + +[workspace.dependencies] +uucore = { path = "src/uucore" } +chrono = "0.4.38" +diff = "0.1.13" +itoa = "1.0.11" +regex = "1.10.4" +same-file = "1.0.6" +unicode-width = "0.2.0" +pretty_assertions = "1.4.0" +tempfile = "3.26.0" + +[workspace.package] +categories = ["command-line-utilities"] +edition = "2021" +rust-version = "1.87.0" +homepage = "https://github.com/uutils/diffutils" +keywords = ["diffutils", "uutils", "cross-platform", "cli", "utility"] +license = "MIT OR Apache-2.0" +version = "0.5.0" [lib] name = "diffutilslib" @@ -15,20 +51,20 @@ name = "diffutils" path = "src/main.rs" [dependencies] -chrono = "0.4.38" -diff = "0.1.13" -itoa = "1.0.11" -regex = "1.10.4" -same-file = "1.0.6" -unicode-width = "0.2.0" +diff = { workspace = true } +same-file = { workspace = true } +regex = { workspace = true } +unicode-width = { workspace = true } +tempfile = { workspace = true } +uu_cmp = { path = "src/uu/cmp" } +uu_diff = { path = "src/uu/diff" } +uucore = { path = "src/uucore" } [dev-dependencies] assert_cmd = "2.0.14" divan = { version = "5.0.0", package = "codspeed-divan-compat" } -pretty_assertions = "1.4.0" predicates = "3.1.0" rand = "0.10.0" -tempfile = "3.26.0" [profile.release] lto = "thin" diff --git a/fuzz/Cargo.lock b/fuzz/Cargo.lock index 47a03af4..601bfebb 100644 --- a/fuzz/Cargo.lock +++ b/fuzz/Cargo.lock @@ -85,12 +85,13 @@ checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" name = "diffutils" version = "0.5.0" dependencies = [ - "chrono", "diff", - "itoa", "regex", "same-file", "unicode-width", + "uu_cmp", + "uu_diff", + "uucore", ] [[package]] @@ -309,6 +310,34 @@ dependencies = [ "libfuzzer-sys", ] +[[package]] +name = "uu_cmp" +version = "0.5.0" +dependencies = [ + "itoa", + "same-file", + "uucore", +] + +[[package]] +name = "uu_diff" +version = "0.5.0" +dependencies = [ + "diff", + "same-file", + "unicode-width", + "uucore", +] + +[[package]] +name = "uucore" +version = "0.5.0" +dependencies = [ + "chrono", + "regex", + "unicode-width", +] + [[package]] name = "wasip2" version = "1.0.2+wasi-0.2.9" diff --git a/src/lib.rs b/src/lib.rs index 342b01ca..4385a339 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,16 +1,7 @@ -pub mod cmp; -pub mod context_diff; -pub mod ed_diff; -pub mod macros; -pub mod normal_diff; -pub mod params; -pub mod side_diff; -pub mod unified_diff; -pub mod utils; - // Re-export the public functions/types you need -pub use context_diff::diff as context_diff; -pub use ed_diff::diff as ed_diff; -pub use normal_diff::diff as normal_diff; -pub use side_diff::diff as side_by_side_diff; -pub use unified_diff::diff as unified_diff; +pub use uu_cmp as cmp; +pub use uu_diff::ed_diff; +pub use uu_diff::normal_diff; +pub use uu_diff::side_diff; +pub use uu_diff::unified_diff; +pub use uucore::*; diff --git a/src/main.rs b/src/main.rs index d0adb692..f3bbc040 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,17 +11,6 @@ use std::{ process::ExitCode, }; -mod cmp; -mod context_diff; -mod diff; -mod ed_diff; -mod macros; -mod normal_diff; -mod params; -mod side_diff; -mod unified_diff; -mod utils; - /// # Panics /// Panics if the binary path cannot be determined fn binary_path(args: &mut Peekable) -> PathBuf { @@ -70,8 +59,8 @@ fn main() -> ExitCode { }; match util_name.as_encoded_bytes() { - name if name.ends_with(b"diff") => diff::main(args), - name if name.ends_with(b"cmp") => cmp::main(args), + name if name.ends_with(b"diff") => uu_diff::main(args), + name if name.ends_with(b"cmp") => uu_cmp::main(args), name => { use std::io::{stderr, Write as _}; let _ = writeln!( diff --git a/src/uu/cmp/Cargo.lock b/src/uu/cmp/Cargo.lock new file mode 100644 index 00000000..274f6f0d --- /dev/null +++ b/src/uu/cmp/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "uu_cmp" +version = "0.0.0" diff --git a/src/uu/cmp/Cargo.toml b/src/uu/cmp/Cargo.toml new file mode 100644 index 00000000..2ca97c7e --- /dev/null +++ b/src/uu/cmp/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "uu_cmp" +categories.workspace = true +edition.workspace = true +rust-version.workspace = true +homepage.workspace = true +keywords.workspace = true +license.workspace = true +version.workspace = true + +[dependencies] +uucore = { workspace = true } +itoa = { workspace = true } +same-file = { workspace = true } + +[lib] +path = "./src/cmp.rs" diff --git a/src/uu/cmp/LICENSE-APACHE b/src/uu/cmp/LICENSE-APACHE new file mode 120000 index 00000000..6e2b1da8 --- /dev/null +++ b/src/uu/cmp/LICENSE-APACHE @@ -0,0 +1 @@ +../../../LICENSE-APACHE \ No newline at end of file diff --git a/src/uu/cmp/LICENSE-MIT b/src/uu/cmp/LICENSE-MIT new file mode 120000 index 00000000..98cefa6a --- /dev/null +++ b/src/uu/cmp/LICENSE-MIT @@ -0,0 +1 @@ +../../../LICENSE-MIT \ No newline at end of file diff --git a/src/cmp.rs b/src/uu/cmp/src/cmp.rs similarity index 99% rename from src/cmp.rs rename to src/uu/cmp/src/cmp.rs index e3534a02..65281a0b 100644 --- a/src/cmp.rs +++ b/src/uu/cmp/src/cmp.rs @@ -3,13 +3,13 @@ // For the full copyright and license information, please view the LICENSE-* // files that was distributed with this source code. -use crate::utils::format_failure_to_read_input_file; use std::env::{self, ArgsOs}; use std::ffi::OsString; use std::io::{BufRead, BufReader, BufWriter, Read, Write}; use std::iter::Peekable; use std::process::ExitCode; use std::{cmp, fs, io}; +use uucore::utils::format_failure_to_read_input_file; #[cfg(unix)] use std::os::fd::{AsRawFd, FromRawFd}; diff --git a/src/uu/diff/Cargo.toml b/src/uu/diff/Cargo.toml new file mode 100644 index 00000000..b5759d2b --- /dev/null +++ b/src/uu/diff/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "uu_diff" +categories.workspace = true +edition.workspace = true +rust-version.workspace = true +homepage.workspace = true +keywords.workspace = true +license.workspace = true +version.workspace = true + +[dependencies] +uucore = { workspace = true } +same-file = { workspace = true } +diff = { workspace = true } +unicode-width = { workspace = true } + +[dev-dependencies] +pretty_assertions = { workspace = true } +regex = { workspace = true } +uucore = { workspace = true, features = ["test-utils"] } + +[lib] +path = "./src/diff.rs" diff --git a/src/uu/diff/LICENSE-APACHE b/src/uu/diff/LICENSE-APACHE new file mode 120000 index 00000000..6e2b1da8 --- /dev/null +++ b/src/uu/diff/LICENSE-APACHE @@ -0,0 +1 @@ +../../../LICENSE-APACHE \ No newline at end of file diff --git a/src/uu/diff/LICENSE-MIT b/src/uu/diff/LICENSE-MIT new file mode 120000 index 00000000..98cefa6a --- /dev/null +++ b/src/uu/diff/LICENSE-MIT @@ -0,0 +1 @@ +../../../LICENSE-MIT \ No newline at end of file diff --git a/src/context_diff.rs b/src/uu/diff/src/context_diff.rs similarity index 97% rename from src/context_diff.rs rename to src/uu/diff/src/context_diff.rs index 7ddffea6..9ef3166f 100644 --- a/src/context_diff.rs +++ b/src/uu/diff/src/context_diff.rs @@ -6,9 +6,8 @@ use std::collections::VecDeque; use std::io::Write; -use crate::params::Params; -use crate::utils::do_write_line; -use crate::utils::get_modification_time; +use uucore::params::Params; +use uucore::utils::{do_write_line, get_modification_time}; #[derive(Debug, PartialEq)] pub enum DiffLine { @@ -382,12 +381,12 @@ mod tests { use super::*; use pretty_assertions::assert_eq; - use crate::utils::testcmds::PATCH_CMD; + use uucore::utils::testcmds::PATCH_CMD; #[test] fn test_permutations() { // test all possible six-line files. - let target = "target/context-diff/"; + let target = "../../../target/context-diff/"; let _ = std::fs::create_dir(target); for &a in &[0, 1, 2] { for &b in &[0, 1, 2] { @@ -454,7 +453,8 @@ mod tests { let _ = fb; let output = PATCH_CMD .new() - .arg("-p0") + .arg("-d") + .arg(&format!("{target}")) .arg("--context") .stdin(File::open(format!("{target}/ab.diff")).unwrap()) .output() @@ -474,7 +474,7 @@ mod tests { #[test] fn test_permutations_empty_lines() { - let target = "target/context-diff/"; + let target = "../../../target/context-diff/"; // test all possible six-line files with missing newlines. let _ = std::fs::create_dir(target); for &a in &[0, 1, 2] { @@ -536,7 +536,8 @@ mod tests { let _ = fb; let output = PATCH_CMD .new() - .arg("-p0") + .arg("-d") + .arg(&format!("{target}")) .arg("--context") .stdin(File::open(format!("{target}/ab_.diff")).unwrap()) .output() @@ -556,7 +557,7 @@ mod tests { #[test] fn test_permutations_missing_lines() { - let target = "target/context-diff/"; + let target = "../../../target/context-diff/"; // test all possible six-line files. let _ = std::fs::create_dir(target); for &a in &[0, 1, 2] { @@ -621,7 +622,8 @@ mod tests { let _ = fb; let output = PATCH_CMD .new() - .arg("-p0") + .arg("-d") + .arg(&format!("{target}")) .arg("--context") .stdin(File::open(format!("{target}/abx.diff")).unwrap()) .output() @@ -641,7 +643,7 @@ mod tests { #[test] fn test_permutations_reverse() { - let target = "target/context-diff/"; + let target = "../../../target/context-diff/"; // test all possible six-line files. let _ = std::fs::create_dir(target); for &a in &[0, 1, 2] { @@ -709,7 +711,8 @@ mod tests { let _ = fb; let output = PATCH_CMD .new() - .arg("-p0") + .arg("-d") + .arg(&format!("{target}")) .arg("--context") .stdin(File::open(format!("{target}/abr.diff")).unwrap()) .output() @@ -729,7 +732,7 @@ mod tests { #[test] fn test_stop_early() { - use crate::assert_diff_eq; + use uucore::assert_diff_eq; let from_filename = "foo"; let from = ["a", "b", "c", ""].join("\n"); diff --git a/src/diff.rs b/src/uu/diff/src/diff.rs similarity index 94% rename from src/diff.rs rename to src/uu/diff/src/diff.rs index f4c0614c..46f6d09b 100644 --- a/src/diff.rs +++ b/src/uu/diff/src/diff.rs @@ -3,15 +3,20 @@ // For the full copyright and license information, please view the LICENSE-* // files that was distributed with this source code. -use crate::params::{parse_params, Format}; -use crate::utils::report_failure_to_read_input_file; -use crate::{context_diff, ed_diff, normal_diff, side_diff, unified_diff}; +pub mod context_diff; +pub mod ed_diff; +pub mod normal_diff; +pub mod side_diff; +pub mod unified_diff; + use std::env::ArgsOs; use std::ffi::OsString; use std::fs; use std::io::{self, stdout, Read, Write}; use std::iter::Peekable; use std::process::{exit, ExitCode}; +use uucore::params::{parse_params, Format}; +use uucore::utils::report_failure_to_read_input_file; // Exit codes are documented at // https://www.gnu.org/software/diffutils/manual/html_node/Invoking-diff.html. diff --git a/src/ed_diff.rs b/src/uu/diff/src/ed_diff.rs similarity index 98% rename from src/ed_diff.rs rename to src/uu/diff/src/ed_diff.rs index 81ddfb46..1a199a6e 100644 --- a/src/ed_diff.rs +++ b/src/uu/diff/src/ed_diff.rs @@ -5,8 +5,8 @@ use std::io::Write; -use crate::params::Params; -use crate::utils::do_write_line; +use uucore::params::Params; +use uucore::utils::do_write_line; #[derive(Debug, PartialEq)] struct Mismatch { @@ -163,7 +163,7 @@ mod tests { use super::*; use pretty_assertions::assert_eq; - use crate::utils::testcmds::ED_CMD; + use uucore::utils::testcmds::ED_CMD; pub fn diff_w(expected: &[u8], actual: &[u8], filename: &str) -> Result, DiffError> { let mut output = diff(expected, actual, &Params::default())?; @@ -182,7 +182,7 @@ mod tests { #[test] fn test_permutations() { - let target = "target/ed-diff/"; + let target = "../../../target/ed-diff/"; // test all possible six-line files. let _ = std::fs::create_dir(target); for &a in &[0, 1, 2] { @@ -262,7 +262,7 @@ mod tests { #[test] fn test_permutations_empty_lines() { - let target = "target/ed-diff/"; + let target = "../../../target/ed-diff/"; // test all possible six-line files with missing newlines. let _ = std::fs::create_dir(target); for &a in &[0, 1, 2] { @@ -336,7 +336,7 @@ mod tests { #[test] fn test_permutations_reverse() { - let target = "target/ed-diff/"; + let target = "../../../target/ed-diff/"; // test all possible six-line files. let _ = std::fs::create_dir(target); for &a in &[0, 1, 2] { diff --git a/src/normal_diff.rs b/src/uu/diff/src/normal_diff.rs similarity index 98% rename from src/normal_diff.rs rename to src/uu/diff/src/normal_diff.rs index 652dc84e..a3ca2a09 100644 --- a/src/normal_diff.rs +++ b/src/uu/diff/src/normal_diff.rs @@ -5,8 +5,8 @@ use std::io::Write; -use crate::params::Params; -use crate::utils::do_write_line; +use uucore::params::Params; +use uucore::utils::do_write_line; #[derive(Debug, PartialEq)] struct Mismatch { @@ -215,7 +215,7 @@ mod tests { use super::*; use pretty_assertions::assert_eq; - use crate::utils::testcmds::PATCH_CMD; + use uucore::utils::testcmds::PATCH_CMD; #[test] fn test_basic() { @@ -230,7 +230,7 @@ mod tests { #[test] fn test_permutations() { - let target = "target/normal-diff/"; + let target = "../../../target/normal-diff/"; // test all possible six-line files. let _ = std::fs::create_dir(target); for &a in &[0, 1, 2] { @@ -308,7 +308,7 @@ mod tests { #[test] fn test_permutations_missing_line_ending() { - let target = "target/normal-diff/"; + let target = "../../../target/normal-diff/"; // test all possible six-line files with missing newlines. let _ = std::fs::create_dir(target); for &a in &[0, 1, 2] { @@ -402,7 +402,7 @@ mod tests { #[test] fn test_permutations_empty_lines() { - let target = "target/normal-diff/"; + let target = "../../../target/normal-diff/"; // test all possible six-line files with missing newlines. let _ = std::fs::create_dir(target); for &a in &[0, 1, 2] { @@ -474,7 +474,7 @@ mod tests { #[test] fn test_permutations_reverse() { - let target = "target/normal-diff/"; + let target = "../../../target/normal-diff/"; // test all possible six-line files. let _ = std::fs::create_dir(target); for &a in &[0, 1, 2] { diff --git a/src/side_diff.rs b/src/uu/diff/src/side_diff.rs similarity index 99% rename from src/side_diff.rs rename to src/uu/diff/src/side_diff.rs index 56953d25..3a39ddb8 100644 --- a/src/side_diff.rs +++ b/src/uu/diff/src/side_diff.rs @@ -8,7 +8,7 @@ use diff::Result; use std::{io::Write, vec}; use unicode_width::UnicodeWidthStr; -use crate::params::Params; +use uucore::params::Params; const GUTTER_WIDTH_MIN: usize = 3; diff --git a/src/unified_diff.rs b/src/uu/diff/src/unified_diff.rs similarity index 97% rename from src/unified_diff.rs rename to src/uu/diff/src/unified_diff.rs index 27773b10..36cd45b3 100644 --- a/src/unified_diff.rs +++ b/src/uu/diff/src/unified_diff.rs @@ -6,9 +6,8 @@ use std::collections::VecDeque; use std::io::Write; -use crate::params::Params; -use crate::utils::do_write_line; -use crate::utils::get_modification_time; +use uucore::params::Params; +use uucore::utils::{do_write_line, get_modification_time}; #[derive(Debug, PartialEq)] pub enum DiffLine { @@ -408,11 +407,11 @@ mod tests { use super::*; use pretty_assertions::assert_eq; - use crate::utils::testcmds::PATCH_CMD; + use uucore::utils::testcmds::PATCH_CMD; #[test] fn test_permutations() { - let target = "target/unified-diff/"; + let target = "../../../target/unified-diff/"; // test all possible six-line files. let _ = std::fs::create_dir(target); for &a in &[0, 1, 2] { @@ -494,11 +493,12 @@ mod tests { .unwrap_or_else(|_| String::from("[Invalid UTF-8]")) ); - use crate::utils::testcmds::PATCH_CMD; + use uucore::utils::testcmds::PATCH_CMD; let output = PATCH_CMD .new() - .arg("-p0") + .arg("-d") + .arg(&format!("{target}")) .stdin(File::open(format!("{target}/ab.diff")).unwrap()) .output() .unwrap(); @@ -517,7 +517,7 @@ mod tests { #[test] fn test_permutations_missing_line_ending() { - let target = "target/unified-diff/"; + let target = "../../../target/unified-diff/"; // test all possible six-line files with missing newlines. let _ = std::fs::create_dir(target); for &a in &[0, 1, 2] { @@ -599,7 +599,8 @@ mod tests { let _ = fb; let output = PATCH_CMD .new() - .arg("-p0") + .arg("-d") + .arg(&format!("{target}")) .stdin(File::open(format!("{target}/abn.diff")).unwrap()) .output() .unwrap(); @@ -619,7 +620,7 @@ mod tests { #[test] fn test_permutations_empty_lines() { - let target = "target/unified-diff/"; + let target = "../../../target/unified-diff/"; // test all possible six-line files with missing newlines. let _ = std::fs::create_dir(target); for &a in &[0, 1, 2] { @@ -696,7 +697,8 @@ mod tests { let _ = fb; let output = PATCH_CMD .new() - .arg("-p0") + .arg("-d") + .arg(&format!("{target}")) .stdin(File::open(format!("{target}/ab_.diff")).unwrap()) .output() .unwrap(); @@ -716,7 +718,7 @@ mod tests { #[test] fn test_permutations_missing_lines() { - let target = "target/unified-diff/"; + let target = "../../../target/unified-diff/"; // test all possible six-line files. let _ = std::fs::create_dir(target); for &a in &[0, 1, 2] { @@ -778,7 +780,8 @@ mod tests { let _ = fb; let output = PATCH_CMD .new() - .arg("-p0") + .arg("-d") + .arg(&format!("{target}")) .stdin(File::open(format!("{target}/abx.diff")).unwrap()) .output() .unwrap(); @@ -797,7 +800,7 @@ mod tests { #[test] fn test_permutations_reverse() { - let target = "target/unified-diff/"; + let target = "../../../target/unified-diff/"; // test all possible six-line files. let _ = std::fs::create_dir(target); for &a in &[0, 1, 2] { @@ -865,7 +868,8 @@ mod tests { let _ = fb; let output = PATCH_CMD .new() - .arg("-p0") + .arg("-d") + .arg(&format!("{target}")) .stdin(File::open(format!("{target}/abr.diff")).unwrap()) .output() .unwrap(); @@ -884,7 +888,7 @@ mod tests { #[test] fn test_stop_early() { - use crate::assert_diff_eq; + use uucore::assert_diff_eq; let from_filename = "foo"; let from = ["a", "b", "c", ""].join("\n"); diff --git a/src/uucore/Cargo.toml b/src/uucore/Cargo.toml new file mode 100644 index 00000000..40160e51 --- /dev/null +++ b/src/uucore/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "uucore" +categories.workspace = true +edition.workspace = true +rust-version.workspace = true +homepage.workspace = true +keywords.workspace = true +license.workspace = true +version.workspace = true + +[dependencies] +chrono = { workspace = true } +regex = { workspace = true } +unicode-width = { workspace = true } + +[dev-dependencies] +pretty_assertions = { workspace = true } +tempfile = { workspace = true } + +[features] +test-utils = [] diff --git a/src/uucore/src/lib.rs b/src/uucore/src/lib.rs new file mode 100644 index 00000000..6652316c --- /dev/null +++ b/src/uucore/src/lib.rs @@ -0,0 +1,6 @@ +pub mod macros; +pub mod params; +pub mod utils; + +pub use params::*; +pub use utils::*; diff --git a/src/macros.rs b/src/uucore/src/macros.rs similarity index 100% rename from src/macros.rs rename to src/uucore/src/macros.rs diff --git a/src/params.rs b/src/uucore/src/params.rs similarity index 100% rename from src/params.rs rename to src/uucore/src/params.rs diff --git a/src/utils.rs b/src/uucore/src/utils.rs similarity index 99% rename from src/utils.rs rename to src/uucore/src/utils.rs index d9415afd..218cef50 100644 --- a/src/utils.rs +++ b/src/uucore/src/utils.rs @@ -98,7 +98,7 @@ pub fn report_failure_to_read_input_file( ); } -#[cfg(test)] +#[cfg(feature = "test-utils")] pub mod testcmds { // Command construction wrapper that provides some validation and non-obscure, "fail fast" // feedback and error messages.