Skip to content

Commit 34530fd

Browse files
committed
Apply offset to chunk after deletion
1 parent 5909dc1 commit 34530fd

File tree

1 file changed

+42
-6
lines changed

1 file changed

+42
-6
lines changed

gix-blame/tests/blame.rs

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ fn blame_works() {
261261
enum Change {
262262
Unchanged(Range<u32>),
263263
Added(Range<u32>, u32),
264-
Deleted(u32),
264+
Deleted(u32, u32),
265265
}
266266

267267
struct ChangeRecorder {
@@ -300,7 +300,8 @@ impl Sink for ChangeRecorder {
300300
.push(Change::Added(after.start..after.end, before.end - before.start));
301301
}
302302
(true, false) => {
303-
self.changes.push(Change::Deleted(before.end - before.start));
303+
self.changes
304+
.push(Change::Deleted(after.start, before.end - before.start));
304305
}
305306
(false, false) => unimplemented!(),
306307
}
@@ -515,10 +516,22 @@ fn process_change(
515516
}
516517
}
517518
}
518-
(Some(hunk), Some(Change::Deleted(number_of_lines_deleted))) => {
519+
(Some(hunk), Some(Change::Deleted(line_number_in_destination, number_of_lines_deleted))) => {
519520
*offset_in_destination -= number_of_lines_deleted;
520521

521-
(Some(hunk), None)
522+
if hunk.range_in_destination.start > line_number_in_destination {
523+
let line_range_in_next_destination =
524+
LineRange::with_offset(hunk.range_in_destination.clone(), *offset_in_destination);
525+
526+
new_hunks_to_blame.push(UnblamedHunk::from_destination(
527+
line_range_in_next_destination.into(),
528+
hunk.offset() + *offset_in_destination,
529+
));
530+
531+
(None, None)
532+
} else {
533+
(Some(hunk), None)
534+
}
522535
}
523536
(Some(hunk), None) => {
524537
new_hunks_to_blame.push(UnblamedHunk::new(
@@ -1366,7 +1379,7 @@ fn process_change_works_deleted_hunk() {
13661379
&mut offset_in_destination,
13671380
suspect,
13681381
Some(UnblamedHunk::new(0..5, Offset::Added(0))),
1369-
Some(Change::Deleted(3)),
1382+
Some(Change::Deleted(5, 3)),
13701383
);
13711384

13721385
assert_eq!(
@@ -1382,6 +1395,29 @@ fn process_change_works_deleted_hunk() {
13821395
assert_eq!(offset_in_destination, Offset::Deleted(3));
13831396
}
13841397

1398+
#[test]
1399+
fn process_change_works_deleted_hunk_2() {
1400+
let mut lines_blamed: Vec<BlameEntry> = vec![];
1401+
let mut new_hunks_to_blame: Vec<UnblamedHunk> = vec![];
1402+
let mut offset_in_destination: Offset = Offset::Added(0);
1403+
let suspect = ObjectId::null(gix_hash::Kind::Sha1);
1404+
1405+
let (hunk, change) = process_change(
1406+
&mut lines_blamed,
1407+
&mut new_hunks_to_blame,
1408+
&mut offset_in_destination,
1409+
suspect,
1410+
Some(UnblamedHunk::new(2..16, Offset::Added(0))),
1411+
Some(Change::Deleted(0, 4)),
1412+
);
1413+
1414+
assert_eq!(hunk, None);
1415+
assert_eq!(change, None);
1416+
assert_eq!(lines_blamed, vec![]);
1417+
assert_eq!(new_hunks_to_blame, vec![UnblamedHunk::new(2..16, Offset::Deleted(4))]);
1418+
assert_eq!(offset_in_destination, Offset::Deleted(4));
1419+
}
1420+
13851421
#[test]
13861422
fn process_changes_works() {
13871423
let mut lines_blamed: Vec<BlameEntry> = vec![];
@@ -1669,7 +1705,7 @@ fn process_changes_works_deleted_hunk() {
16691705
UnblamedHunk::new(0..4, Offset::Added(0)),
16701706
UnblamedHunk::new(4..7, Offset::Added(0)),
16711707
];
1672-
let changes: Vec<Change> = vec![Change::Deleted(3), Change::Added(0..4, 0)];
1708+
let changes: Vec<Change> = vec![Change::Deleted(0, 3), Change::Added(0..4, 0)];
16731709
let suspect = ObjectId::null(gix_hash::Kind::Sha1);
16741710
let new_hunks_to_blame = process_changes(&mut lines_blamed, hunks_to_blame, changes, suspect);
16751711

0 commit comments

Comments
 (0)