diff --git a/src/params.rs b/src/params.rs index 7e9cc78..40af9ea 100644 --- a/src/params.rs +++ b/src/params.rs @@ -1,4 +1,5 @@ use std::ffi::{OsStr, OsString}; +use std::path::PathBuf; use regex::Regex; @@ -178,6 +179,20 @@ pub fn parse_params>(opts: I) -> Result ", exe.to_string_lossy())); }; + + // diff DIRECTORY FILE => diff DIRECTORY/FILE FILE + // diff FILE DIRECTORY => diff FILE DIRECTORY/FILE + let mut from_path: PathBuf = PathBuf::from(¶ms.from); + let mut to_path: PathBuf = PathBuf::from(¶ms.to); + + if from_path.is_dir() && to_path.is_file() { + from_path.push(to_path.file_name().unwrap()); + params.from = from_path.into_os_string(); + } else if from_path.is_file() && to_path.is_dir() { + to_path.push(from_path.file_name().unwrap()); + params.to = to_path.into_os_string(); + } + params.format = format.unwrap_or(Format::default()); Ok(params) } diff --git a/tests/integration.rs b/tests/integration.rs index 853ba4d..3f49af3 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -6,6 +6,7 @@ use assert_cmd::cmd::Command; use diffutilslib::assert_diff_eq; use predicates::prelude::*; +use std::fs::File; use std::io::Write; use tempfile::NamedTempFile; @@ -234,3 +235,33 @@ fn read_from_stdin() -> Result<(), Box> { Ok(()) } + +#[test] +fn read_from_directory() -> Result<(), Box> { + let mut cmd = Command::cargo_bin("diffutils")?; + + let target = "target/integration"; + let _ = std::fs::create_dir(target); + let directory = &format!("{target}/d"); + let _ = std::fs::create_dir(directory); + let mut a = File::create(&format!("{target}/a")).unwrap(); + a.write_all(b"a\n").unwrap(); + let mut da = File::create(&format!("{directory}/a")).unwrap(); + da.write_all(b"da\n").unwrap(); + + cmd.arg("-u") + .arg(&format!("{target}/d")) + .arg(&format!("{target}/a")); + cmd.assert().code(predicate::eq(1)).failure(); + + let output = cmd.output().unwrap().stdout; + assert_diff_eq!( + output, + format!( + "--- {}/d/a\tTIMESTAMP\n+++ {}/a\tTIMESTAMP\n@@ -1 +1 @@\n-da\n+a\n", + target, target + ) + ); + + Ok(()) +}