@@ -261,7 +261,7 @@ fn blame_works() {
261261enum Change {
262262 Unchanged ( Range < u32 > ) ,
263263 Added ( Range < u32 > , u32 ) ,
264- Deleted ( u32 ) ,
264+ Deleted ( u32 , u32 ) ,
265265}
266266
267267struct 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]
13861422fn 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