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`.
|
||||
* Made unified diff support more flexible through the introduction of
|
||||
the `UnifiedDiff` type.
|
||||
* Fixed grouped diff operation to return an empty result if the diff
|
||||
does not show any changes.
|
||||
|
||||
## 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);
|
||||
}
|
||||
|
||||
if !pending_group.is_empty() {
|
||||
rv.push(pending_group);
|
||||
match &pending_group[..] {
|
||||
&[] | &[DiffOp::Equal { .. }] => {}
|
||||
_ => rv.push(pending_group),
|
||||
}
|
||||
|
||||
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 {
|
||||
"\n"
|
||||
};
|
||||
writeln!(f, "{}", self.header())?;
|
||||
let mut wrote_header = false;
|
||||
for change in self.iter_changes() {
|
||||
if !wrote_header {
|
||||
writeln!(f, "{}", self.header())?;
|
||||
wrote_header = true;
|
||||
}
|
||||
write!(
|
||||
f,
|
||||
"{}{}{}",
|
||||
|
|
@ -238,3 +242,8 @@ fn test_unified_diff() {
|
|||
);
|
||||
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