Skip to content

Commit 08e7777

Browse files
authored
Merge pull request #2043 from GitoxideLabs/fix-unidiff
fix: `blob::UnifiedDiff` now produces non-overlapping hunks.
2 parents e09825a + 0d102f4 commit 08e7777

File tree

2 files changed

+63
-3
lines changed

2 files changed

+63
-3
lines changed

gix-diff/src/blob/unified_diff.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -218,9 +218,7 @@ pub(super) mod _impl {
218218
if self.err.is_some() {
219219
return;
220220
}
221-
if ((self.pos == 0) && (before.start - self.pos > self.ctx_size))
222-
|| (before.start - self.pos > 2 * self.ctx_size)
223-
{
221+
if before.start - self.pos > 2 * self.ctx_size {
224222
if let Err(err) = self.flush() {
225223
self.err = Some(err);
226224
return;

gix-diff/tests/diff/blob/unified_diff.rs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,68 @@ fn removed_modified_added() -> crate::Result {
108108
Ok(())
109109
}
110110

111+
#[test]
112+
fn context_overlap_by_one_line_move_up() -> crate::Result {
113+
let a = "2\n3\n4\n5\n6\n7\n";
114+
let b = "7\n2\n3\n4\n5\n6\n";
115+
116+
let interner = gix_diff::blob::intern::InternedInput::new(a, b);
117+
let actual = gix_diff::blob::diff(
118+
Algorithm::Myers,
119+
&interner,
120+
UnifiedDiff::new(
121+
&interner,
122+
String::new(),
123+
NewlineSeparator::AfterHeaderAndLine("\n"),
124+
ContextSize::symmetrical(3),
125+
),
126+
)?;
127+
128+
// merged by context.
129+
insta::assert_snapshot!(actual, @r"
130+
@@ -1,6 +1,6 @@
131+
+7
132+
2
133+
3
134+
4
135+
5
136+
6
137+
-7
138+
");
139+
Ok(())
140+
}
141+
142+
#[test]
143+
fn context_overlap_by_one_line_move_down() -> crate::Result {
144+
let a = "2\n3\n4\n5\n6\n7\n";
145+
let b = "7\n2\n3\n4\n5\n6\n";
146+
147+
let interner = gix_diff::blob::intern::InternedInput::new(b, a);
148+
let actual = gix_diff::blob::diff(
149+
Algorithm::Myers,
150+
&interner,
151+
UnifiedDiff::new(
152+
&interner,
153+
String::new(),
154+
NewlineSeparator::AfterHeaderAndLine("\n"),
155+
ContextSize::symmetrical(3),
156+
),
157+
)?;
158+
159+
// merged by context.
160+
insta::assert_snapshot!(actual, @r"
161+
@@ -1,6 +1,6 @@
162+
-7
163+
2
164+
3
165+
4
166+
5
167+
6
168+
+7
169+
");
170+
Ok(())
171+
}
172+
111173
#[test]
112174
fn removed_modified_added_with_newlines_in_tokens() -> crate::Result {
113175
let a = "1\n2\n3\n4\n5\n6\n7\n8\n9\n10";

0 commit comments

Comments
 (0)