Skip to content

Commit 1b311c6

Browse files
authored
Merge pull request #33 from TanmayPatil105/context-diff-modification-time
Display modification times of input files in context and unified diff
2 parents be66ff3 + aedd068 commit 1b311c6

File tree

9 files changed

+306
-34
lines changed

9 files changed

+306
-34
lines changed

Cargo.lock

Lines changed: 157 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ name = "diffutils"
1515
path = "src/main.rs"
1616

1717
[dependencies]
18+
chrono = "0.4.35"
1819
diff = "0.1.10"
1920
regex = "1.10.3"
2021
same-file = "1.0.6"

src/context_diff.rs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use std::io::Write;
88

99
use crate::params::Params;
1010
use crate::utils::do_write_line;
11+
use crate::utils::get_modification_time;
1112

1213
#[derive(Debug, PartialEq)]
1314
pub enum DiffLine {
@@ -267,10 +268,14 @@ fn make_diff(
267268

268269
#[must_use]
269270
pub fn diff(expected: &[u8], actual: &[u8], params: &Params) -> Vec<u8> {
271+
let from_modified_time = get_modification_time(&params.from.to_string_lossy());
272+
let to_modified_time = get_modification_time(&params.to.to_string_lossy());
270273
let mut output = format!(
271-
"*** {0}\t\n--- {1}\t\n",
274+
"*** {0}\t{1}\n--- {2}\t{3}\n",
272275
params.from.to_string_lossy(),
273-
params.to.to_string_lossy()
276+
from_modified_time,
277+
params.to.to_string_lossy(),
278+
to_modified_time
274279
)
275280
.into_bytes();
276281
let diff_results = make_diff(expected, actual, params.context_count, params.brief);
@@ -717,6 +722,8 @@ mod tests {
717722

718723
#[test]
719724
fn test_stop_early() {
725+
use crate::assert_diff_eq;
726+
720727
let from_filename = "foo";
721728
let from = ["a", "b", "c", ""].join("\n");
722729
let to_filename = "bar";
@@ -731,9 +738,10 @@ mod tests {
731738
..Default::default()
732739
},
733740
);
741+
734742
let expected_full = [
735-
"*** foo\t",
736-
"--- bar\t",
743+
"*** foo\tTIMESTAMP",
744+
"--- bar\tTIMESTAMP",
737745
"***************",
738746
"*** 1,3 ****",
739747
" a",
@@ -746,7 +754,7 @@ mod tests {
746754
"",
747755
]
748756
.join("\n");
749-
assert_eq!(diff_full, expected_full.as_bytes());
757+
assert_diff_eq!(diff_full, expected_full);
750758

751759
let diff_brief = diff(
752760
from.as_bytes(),
@@ -758,8 +766,9 @@ mod tests {
758766
..Default::default()
759767
},
760768
);
761-
let expected_brief = ["*** foo\t", "--- bar\t", ""].join("\n");
762-
assert_eq!(diff_brief, expected_brief.as_bytes());
769+
770+
let expected_brief = ["*** foo\tTIMESTAMP", "--- bar\tTIMESTAMP", ""].join("\n");
771+
assert_diff_eq!(diff_brief, expected_brief);
763772

764773
let nodiff_full = diff(
765774
from.as_bytes(),

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
pub mod context_diff;
22
pub mod ed_diff;
3+
pub mod macros;
34
pub mod normal_diff;
45
pub mod params;
56
pub mod unified_diff;

src/macros.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// asserts equality of the actual diff and expected diff
2+
// considering datetime varitations
3+
//
4+
// It replaces the modification time in the actual diff
5+
// with placeholer "TIMESTAMP" and then asserts the equality
6+
//
7+
// For eg.
8+
// let brief = "*** fruits_old.txt\t2024-03-24 23:43:05.189597645 +0530\n
9+
// --- fruits_new.txt\t2024-03-24 23:35:08.922581904 +0530\n";
10+
//
11+
// replaced = "*** fruits_old.txt\tTIMESTAMP\n
12+
// --- fruits_new.txt\tTIMESTAMP\n";
13+
#[macro_export]
14+
macro_rules! assert_diff_eq {
15+
($actual:expr, $expected:expr) => {{
16+
use regex::Regex;
17+
use std::str;
18+
19+
let diff = str::from_utf8(&$actual).unwrap();
20+
let re = Regex::new(r"\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+ [+-]\d{4}").unwrap();
21+
let actual = re.replacen(diff, 2, "TIMESTAMP");
22+
23+
assert_eq!(actual, $expected);
24+
}};
25+
}

src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use std::process::{exit, ExitCode};
1212

1313
mod context_diff;
1414
mod ed_diff;
15+
mod macros;
1516
mod normal_diff;
1617
mod params;
1718
mod unified_diff;

0 commit comments

Comments
 (0)