@@ -117,32 +117,50 @@ impl From<LineRange> for Range<u32> {
117117#[ derive( Debug ,  PartialEq ) ]  
118118struct  BlameEntry  { 
119119    range_in_blamed_file :  Range < u32 > , 
120+     range_in_original_file :  Range < u32 > , 
120121    commit_id :  ObjectId , 
121122} 
122123
123124impl  BlameEntry  { 
124-     fn  new ( range :  Range < u32 > ,  commit_id :  ObjectId )  -> Self  { 
125-         assert ! ( range. end > range. start,  "{range:?}" ) ; 
125+     fn  new ( range_in_blamed_file :  Range < u32 > ,  range_in_original_file :  Range < u32 > ,  commit_id :  ObjectId )  -> Self  { 
126+         assert ! ( 
127+             range_in_blamed_file. end > range_in_blamed_file. start, 
128+             "{range_in_blamed_file:?}" 
129+         ) ; 
130+         assert ! ( 
131+             range_in_original_file. end > range_in_original_file. start, 
132+             "{range_in_original_file:?}" 
133+         ) ; 
126134
127135        Self  { 
128-             range_in_blamed_file :  range. clone ( ) , 
136+             range_in_blamed_file :  range_in_blamed_file. clone ( ) , 
137+             range_in_original_file :  range_in_original_file. clone ( ) , 
129138            commit_id, 
130139        } 
131140    } 
132141
133-     fn  with_offset ( range :  Range < u32 > ,  commit_id :  ObjectId ,  offset :  Offset )  -> Self  { 
134-         assert ! ( range. end > range. start,  "{range:?}" ) ; 
142+     fn  with_offset ( range_in_original_file :  Range < u32 > ,  commit_id :  ObjectId ,  offset :  Offset )  -> Self  { 
143+         assert ! ( 
144+             range_in_original_file. end > range_in_original_file. start, 
145+             "{range_in_original_file:?}" 
146+         ) ; 
135147
136148        match  offset { 
137149            Offset :: Added ( added)  => Self  { 
138-                 range_in_blamed_file :  ( range. start  + added) ..( range. end  + added) , 
150+                 range_in_blamed_file :  ( range_in_original_file. start  + added) ..( range_in_original_file. end  + added) , 
151+                 range_in_original_file, 
139152                commit_id, 
140153            } , 
141154            Offset :: Deleted ( deleted)  => { 
142-                 assert ! ( range. start >= deleted,  "{range:?} {offset:?}" ) ; 
155+                 assert ! ( 
156+                     range_in_original_file. start >= deleted, 
157+                     "{range_in_original_file:?} {offset:?}" 
158+                 ) ; 
143159
144160                Self  { 
145-                     range_in_blamed_file :  ( range. start  - deleted) ..( range. end  - deleted) , 
161+                     range_in_blamed_file :  ( range_in_original_file. start  - deleted) 
162+                         ..( range_in_original_file. end  - deleted) , 
163+                     range_in_original_file, 
146164                    commit_id, 
147165                } 
148166            } 
@@ -653,7 +671,8 @@ mod baseline {
653671        type  Item  = BlameEntry ; 
654672
655673        fn  next ( & mut  self )  -> Option < Self :: Item >  { 
656-             let  mut  range = Range :: default ( ) ; 
674+             let  mut  range_in_blamed_file = Range :: default ( ) ; 
675+             let  mut  range_in_original_file = Range :: default ( ) ; 
657676            let  mut  commit_id = ObjectId :: null ( gix_hash:: Kind :: Sha1 ) ; 
658677            let  mut  skip_lines:  u32  = 0 ; 
659678
@@ -688,14 +707,18 @@ mod baseline {
688707
689708                    commit_id = result. unwrap ( ) ; 
690709
710+                     let  line_number_in_original_file = fields[ 1 ] . parse :: < u32 > ( ) . unwrap ( ) ; 
691711                    let  line_number_in_final_file = fields[ 2 ] . parse :: < u32 > ( ) . unwrap ( ) ; 
692712                    // The last field indicates the number of lines this group contains info for 
693713                    // (this is not equal to the number of lines in git blame’s porcelain output). 
694714                    let  number_of_lines_in_group = fields[ 3 ] . parse :: < u32 > ( ) . unwrap ( ) ; 
695715
696716                    skip_lines = number_of_lines_in_group; 
697717
698-                     range = ( line_number_in_final_file - 1 ) ..( line_number_in_final_file + number_of_lines_in_group - 1 ) ; 
718+                     range_in_original_file = ( line_number_in_original_file - 1 ) 
719+                         ..( line_number_in_original_file + number_of_lines_in_group - 1 ) ; 
720+                     range_in_blamed_file =
721+                         ( line_number_in_final_file - 1 ) ..( line_number_in_final_file + number_of_lines_in_group - 1 ) ; 
699722                } 
700723            } 
701724
@@ -704,7 +727,7 @@ mod baseline {
704727                return  None ; 
705728            } 
706729
707-             Some ( BlameEntry :: new ( range ,  commit_id) ) 
730+             Some ( BlameEntry :: new ( range_in_blamed_file ,  range_in_original_file ,  commit_id) ) 
708731        } 
709732    } 
710733} 
@@ -801,11 +824,16 @@ fn blame_file(worktree_path: PathBuf, file_path: &BStr) -> Vec<BlameEntry> {
801824            // remaining lines to it, even though we don’t explicitly check whether that is true 
802825            // here. We could perhaps use `needed_to_obtain` to compare `suspect` against an empty 
803826            // tree to validate this assumption. 
804-             lines_blamed. extend ( 
805-                 lines_to_blame
806-                     . iter ( ) 
807-                     . map ( |hunk| BlameEntry :: new ( hunk. range_in_blamed_file . clone ( ) ,  suspect) ) , 
808-             ) ; 
827+             lines_blamed. extend ( lines_to_blame. iter ( ) . map ( |hunk| { 
828+                 BlameEntry :: new ( 
829+                     hunk. range_in_blamed_file . clone ( ) , 
830+                     // TODO 
831+                     // I don’t know whether it is correct to use `range_in_destination` for 
832+                     // this purpose. 
833+                     hunk. range_in_destination . clone ( ) , 
834+                     suspect, 
835+                 ) 
836+             } ) ) ; 
809837
810838            lines_to_blame = vec ! [ ] ; 
811839
@@ -860,11 +888,16 @@ fn blame_file(worktree_path: PathBuf, file_path: &BStr) -> Vec<BlameEntry> {
860888            if  matches ! ( modification,  gix_diff:: tree:: recorder:: Change :: Addition  {  .. } )  { 
861889                // Every line that has not been blamed yet on a commit, is expected to have been 
862890                // added when the file was added to the repository. 
863-                 lines_blamed. extend ( 
864-                     lines_to_blame
865-                         . iter ( ) 
866-                         . map ( |hunk| BlameEntry :: new ( hunk. range_in_blamed_file . clone ( ) ,  suspect) ) , 
867-                 ) ; 
891+                 lines_blamed. extend ( lines_to_blame. iter ( ) . map ( |hunk| { 
892+                     BlameEntry :: new ( 
893+                         hunk. range_in_blamed_file . clone ( ) , 
894+                         // TODO 
895+                         // I don’t know whether it is correct to use `range_in_destination` for 
896+                         // this purpose. 
897+                         hunk. range_in_destination . clone ( ) , 
898+                         suspect, 
899+                     ) 
900+                 } ) ) ; 
868901
869902                lines_to_blame = vec ! [ ] ; 
870903
@@ -995,6 +1028,7 @@ fn process_change_works_added_hunk() {
9951028        lines_blamed, 
9961029        vec![ BlameEntry  { 
9971030            range_in_blamed_file:  0 ..3 , 
1031+             range_in_original_file:  0 ..3 , 
9981032            commit_id:  suspect
9991033        } ] 
10001034    ) ; 
@@ -1030,6 +1064,7 @@ fn process_change_works_added_hunk_2() {
10301064        lines_blamed, 
10311065        vec![ BlameEntry  { 
10321066            range_in_blamed_file:  2 ..3 , 
1067+             range_in_original_file:  2 ..3 , 
10331068            commit_id:  suspect
10341069        } ] 
10351070    ) ; 
@@ -1071,6 +1106,7 @@ fn process_change_works_added_hunk_3() {
10711106        lines_blamed, 
10721107        vec![ BlameEntry  { 
10731108            range_in_blamed_file:  12 ..13 , 
1109+             range_in_original_file:  12 ..13 , 
10741110            commit_id:  suspect
10751111        } ] 
10761112    ) ; 
@@ -1113,6 +1149,7 @@ fn process_change_works_added_hunk_4() {
11131149        lines_blamed, 
11141150        vec![ BlameEntry  { 
11151151            range_in_blamed_file:  14 ..15 , 
1152+             range_in_original_file:  9 ..10 , 
11161153            commit_id:  suspect
11171154        } ] 
11181155    ) ; 
@@ -1154,6 +1191,7 @@ fn process_change_works_added_hunk_5() {
11541191        lines_blamed, 
11551192        vec![ BlameEntry  { 
11561193            range_in_blamed_file:  0 ..3 , 
1194+             range_in_original_file:  0 ..3 , 
11571195            commit_id:  suspect
11581196        } ] 
11591197    ) ; 
@@ -1190,6 +1228,7 @@ fn process_change_works_added_hunk_6() {
11901228        lines_blamed, 
11911229        vec![ BlameEntry  { 
11921230            range_in_blamed_file:  1 ..4 , 
1231+             range_in_original_file:  0 ..3 , 
11931232            commit_id:  suspect
11941233        } ] 
11951234    ) ; 
@@ -1226,6 +1265,7 @@ fn process_change_works_added_hunk_7() {
12261265        lines_blamed, 
12271266        vec![ BlameEntry  { 
12281267            range_in_blamed_file:  4 ..6 , 
1268+             range_in_original_file:  3 ..5 , 
12291269            commit_id:  suspect
12301270        } ] 
12311271    ) ; 
@@ -1262,6 +1302,7 @@ fn process_change_works_added_hunk_8() {
12621302        lines_blamed, 
12631303        vec![ BlameEntry  { 
12641304            range_in_blamed_file:  23 ..24 , 
1305+             range_in_original_file:  25 ..26 , 
12651306            commit_id:  suspect
12661307        } ] 
12671308    ) ; 
@@ -1536,6 +1577,7 @@ fn process_changes_works_added_hunk() {
15361577        lines_blamed, 
15371578        vec![ BlameEntry  { 
15381579            range_in_blamed_file:  0 ..4 , 
1580+             range_in_original_file:  0 ..4 , 
15391581            commit_id:  suspect
15401582        } ] 
15411583    ) ; 
@@ -1554,6 +1596,7 @@ fn process_changes_works_added_hunk_2() {
15541596        lines_blamed, 
15551597        vec![ BlameEntry  { 
15561598            range_in_blamed_file:  0 ..4 , 
1599+             range_in_original_file:  0 ..4 , 
15571600            commit_id:  suspect
15581601        } ] 
15591602    ) ; 
@@ -1572,6 +1615,7 @@ fn process_changes_works_added_hunk_3() {
15721615        lines_blamed, 
15731616        vec![ BlameEntry  { 
15741617            range_in_blamed_file:  2 ..4 , 
1618+             range_in_original_file:  2 ..4 , 
15751619            commit_id:  suspect
15761620        } ] 
15771621    ) ; 
@@ -1597,10 +1641,12 @@ fn process_changes_works_added_hunk_4_0() {
15971641        vec![ 
15981642            BlameEntry  { 
15991643                range_in_blamed_file:  0 ..1 , 
1644+                 range_in_original_file:  0 ..1 , 
16001645                commit_id:  suspect
16011646            } , 
16021647            BlameEntry  { 
16031648                range_in_blamed_file:  1 ..4 , 
1649+                 range_in_original_file:  1 ..4 , 
16041650                commit_id:  suspect
16051651            } 
16061652        ] 
@@ -1620,6 +1666,7 @@ fn process_changes_works_added_hunk_4_1() {
16201666        lines_blamed, 
16211667        vec![ BlameEntry  { 
16221668            range_in_blamed_file:  0 ..1 , 
1669+             range_in_original_file:  0 ..1 , 
16231670            commit_id:  suspect
16241671        } ] 
16251672    ) ; 
@@ -1629,24 +1676,28 @@ fn process_changes_works_added_hunk_4_1() {
16291676#[ test]  
16301677fn  process_changes_works_added_hunk_4_2 ( )  { 
16311678    let  suspect = ObjectId :: null ( gix_hash:: Kind :: Sha1 ) ; 
1679+     let  suspect_2 = ObjectId :: from_hex ( b"2222222222222222222222222222222222222222" ) . unwrap ( ) ; 
16321680    let  mut  lines_blamed:  Vec < BlameEntry >  = vec ! [ BlameEntry  { 
16331681        range_in_blamed_file:  0 ..2 , 
1682+         range_in_original_file:  0 ..2 , 
16341683        commit_id:  suspect, 
16351684    } ] ; 
16361685    let  hunks_to_blame:  Vec < UnblamedHunk >  = vec ! [ UnblamedHunk :: new( 2 ..6 ,  Offset :: Added ( 2 ) ) ] ; 
16371686    let  changes:  Vec < Change >  = vec ! [ Change :: Added ( 0 ..1 ,  0 ) ] ; 
1638-     let  new_hunks_to_blame = process_changes ( & mut  lines_blamed,  hunks_to_blame,  changes,  suspect ) ; 
1687+     let  new_hunks_to_blame = process_changes ( & mut  lines_blamed,  hunks_to_blame,  changes,  suspect_2 ) ; 
16391688
16401689    assert_eq ! ( 
16411690        lines_blamed, 
16421691        vec![ 
16431692            BlameEntry  { 
16441693                range_in_blamed_file:  0 ..2 , 
1694+                 range_in_original_file:  0 ..2 , 
16451695                commit_id:  suspect
16461696            } , 
16471697            BlameEntry  { 
16481698                range_in_blamed_file:  2 ..3 , 
1649-                 commit_id:  suspect
1699+                 range_in_original_file:  0 ..1 , 
1700+                 commit_id:  suspect_2
16501701            } 
16511702        ] 
16521703    ) ; 
@@ -1665,6 +1716,7 @@ fn process_changes_works_added_hunk_5() {
16651716        lines_blamed, 
16661717        vec![ BlameEntry  { 
16671718            range_in_blamed_file:  0 ..4 , 
1719+             range_in_original_file:  0 ..4 , 
16681720            commit_id:  suspect
16691721        } ] 
16701722    ) ; 
@@ -1686,24 +1738,28 @@ fn process_changes_works_added_hunk_6() {
16861738#[ test]  
16871739fn  process_changes_works_added_hunk_7 ( )  { 
16881740    let  suspect = ObjectId :: null ( gix_hash:: Kind :: Sha1 ) ; 
1741+     let  suspect_2 = ObjectId :: from_hex ( b"2222222222222222222222222222222222222222" ) . unwrap ( ) ; 
16891742    let  mut  lines_blamed:  Vec < BlameEntry >  = vec ! [ BlameEntry  { 
16901743        range_in_blamed_file:  0 ..1 , 
1744+         range_in_original_file:  0 ..1 , 
16911745        commit_id:  suspect, 
16921746    } ] ; 
16931747    let  hunks_to_blame:  Vec < UnblamedHunk >  = vec ! [ UnblamedHunk :: new( 1 ..3 ,  Offset :: Added ( 1 ) ) ] ; 
16941748    let  changes:  Vec < Change >  = vec ! [ Change :: Added ( 0 ..1 ,  2 ) ] ; 
1695-     let  new_hunks_to_blame = process_changes ( & mut  lines_blamed,  hunks_to_blame,  changes,  suspect ) ; 
1749+     let  new_hunks_to_blame = process_changes ( & mut  lines_blamed,  hunks_to_blame,  changes,  suspect_2 ) ; 
16961750
16971751    assert_eq ! ( 
16981752        lines_blamed, 
16991753        vec![ 
17001754            BlameEntry  { 
17011755                range_in_blamed_file:  0 ..1 , 
1756+                 range_in_original_file:  0 ..1 , 
17021757                commit_id:  suspect
17031758            } , 
17041759            BlameEntry  { 
17051760                range_in_blamed_file:  1 ..2 , 
1706-                 commit_id:  suspect
1761+                 range_in_original_file:  0 ..1 , 
1762+                 commit_id:  suspect_2
17071763            } 
17081764        ] 
17091765    ) ; 
@@ -1723,10 +1779,12 @@ fn process_changes_works_added_hunk_8() {
17231779        vec![ 
17241780            BlameEntry  { 
17251781                range_in_blamed_file:  0 ..2 , 
1782+                 range_in_original_file:  0 ..2 , 
17261783                commit_id:  suspect
17271784            } , 
17281785            BlameEntry  { 
17291786                range_in_blamed_file:  3 ..4 , 
1787+                 range_in_original_file:  3 ..4 , 
17301788                commit_id:  suspect
17311789            } 
17321790        ] 
@@ -1739,6 +1797,7 @@ fn process_changes_works_added_hunk_9() {
17391797    let  suspect = ObjectId :: null ( gix_hash:: Kind :: Sha1 ) ; 
17401798    let  mut  lines_blamed:  Vec < BlameEntry >  = vec ! [ BlameEntry  { 
17411799        range_in_blamed_file:  30 ..31 , 
1800+         range_in_original_file:  30 ..31 , 
17421801        commit_id:  suspect, 
17431802    } ] ; 
17441803    let  hunks_to_blame:  Vec < UnblamedHunk >  = vec ! [ 
@@ -1765,10 +1824,12 @@ fn process_changes_works_added_hunk_9() {
17651824        vec![ 
17661825            BlameEntry  { 
17671826                range_in_blamed_file:  16 ..17 , 
1827+                 range_in_original_file:  16 ..17 , 
17681828                commit_id:  suspect
17691829            } , 
17701830            BlameEntry  { 
17711831                range_in_blamed_file:  30 ..31 , 
1832+                 range_in_original_file:  30 ..31 , 
17721833                commit_id:  suspect
17731834            } 
17741835        ] 
@@ -1807,6 +1868,7 @@ fn process_changes_works_deleted_hunk() {
18071868        lines_blamed, 
18081869        vec![ BlameEntry  { 
18091870            range_in_blamed_file:  0 ..4 , 
1871+             range_in_original_file:  0 ..4 , 
18101872            commit_id:  suspect
18111873        } ] 
18121874    ) ; 
0 commit comments