Improve diff op grouping for full matches
This changes the behavior of the diff op grouping function to return an empty result if the diff is a full match. This also adds an example to demonstrate unified diff rendering.
This commit is contained in:
parent
4459c5ee3a
commit
020701c4d5
5 changed files with 62 additions and 3 deletions
|
|
@ -8,6 +8,8 @@ All notable changes to similar are documented here.
|
||||||
* Added virtual newline handling to `iter_changes`.
|
* Added virtual newline handling to `iter_changes`.
|
||||||
* Made unified diff support more flexible through the introduction of
|
* Made unified diff support more flexible through the introduction of
|
||||||
the `UnifiedDiff` type.
|
the `UnifiedDiff` type.
|
||||||
|
* Fixed grouped diff operation to return an empty result if the diff
|
||||||
|
does not show any changes.
|
||||||
|
|
||||||
## 0.4.0
|
## 0.4.0
|
||||||
|
|
||||||
|
|
|
||||||
22
examples/udiff.rs
Normal file
22
examples/udiff.rs
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
use std::fs::read_to_string;
|
||||||
|
use std::process::exit;
|
||||||
|
|
||||||
|
use similar::text::TextDiff;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let args: Vec<_> = std::env::args_os().collect();
|
||||||
|
if args.len() != 3 {
|
||||||
|
eprintln!("usage: udiff [old] [new]");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
let old = read_to_string(&args[1]).unwrap();
|
||||||
|
let new = read_to_string(&args[2]).unwrap();
|
||||||
|
print!(
|
||||||
|
"{}",
|
||||||
|
TextDiff::from_lines(&old, &new).unified_diff().header(
|
||||||
|
&args[1].as_os_str().to_string_lossy(),
|
||||||
|
&args[2].as_os_str().to_string_lossy()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
@ -222,8 +222,9 @@ pub fn group_diff_ops(mut ops: Vec<DiffOp>, n: usize) -> Vec<Vec<DiffOp>> {
|
||||||
pending_group.push(op);
|
pending_group.push(op);
|
||||||
}
|
}
|
||||||
|
|
||||||
if !pending_group.is_empty() {
|
match &pending_group[..] {
|
||||||
rv.push(pending_group);
|
&[] | &[DiffOp::Equal { .. }] => {}
|
||||||
|
_ => rv.push(pending_group),
|
||||||
}
|
}
|
||||||
|
|
||||||
rv
|
rv
|
||||||
|
|
|
||||||
25
src/text/snapshots/similar__text__udiff__unified_diff.snap
Normal file
25
src/text/snapshots/similar__text__udiff__unified_diff.snap
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
---
|
||||||
|
source: src/text/udiff.rs
|
||||||
|
expression: "&diff.unified_diff().header(\"a.txt\", \"b.txt\").to_string()"
|
||||||
|
---
|
||||||
|
--- a.txt
|
||||||
|
+++ b.txt
|
||||||
|
@@ -15,3 +19,3 @@
|
||||||
|
p
|
||||||
|
q
|
||||||
|
r
|
||||||
|
-s
|
||||||
|
+S
|
||||||
|
t
|
||||||
|
u
|
||||||
|
v
|
||||||
|
@@ -37,3 +41,3 @@
|
||||||
|
L
|
||||||
|
M
|
||||||
|
N
|
||||||
|
-O
|
||||||
|
+o
|
||||||
|
P
|
||||||
|
Q
|
||||||
|
R
|
||||||
|
|
||||||
|
|
@ -178,8 +178,12 @@ impl<'diff, 'old, 'new, 'bufs> fmt::Display for UnifiedDiffHunk<'diff, 'old, 'ne
|
||||||
} else {
|
} else {
|
||||||
"\n"
|
"\n"
|
||||||
};
|
};
|
||||||
writeln!(f, "{}", self.header())?;
|
let mut wrote_header = false;
|
||||||
for change in self.iter_changes() {
|
for change in self.iter_changes() {
|
||||||
|
if !wrote_header {
|
||||||
|
writeln!(f, "{}", self.header())?;
|
||||||
|
wrote_header = true;
|
||||||
|
}
|
||||||
write!(
|
write!(
|
||||||
f,
|
f,
|
||||||
"{}{}{}",
|
"{}{}{}",
|
||||||
|
|
@ -238,3 +242,8 @@ fn test_unified_diff() {
|
||||||
);
|
);
|
||||||
insta::assert_snapshot!(&diff.unified_diff().header("a.txt", "b.txt").to_string());
|
insta::assert_snapshot!(&diff.unified_diff().header("a.txt", "b.txt").to_string());
|
||||||
}
|
}
|
||||||
|
#[test]
|
||||||
|
fn test_empty_unified_diff() {
|
||||||
|
let diff = TextDiff::from_lines("abc", "abc");
|
||||||
|
assert_eq!(diff.unified_diff().header("a.txt", "b.txt").to_string(), "");
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue