Skip to content

Commit bb16cc1

Browse files
committed
Add range_in_original_file to BlameEntry
1 parent 3a296e5 commit bb16cc1

File tree

1 file changed

+87
-25
lines changed

1 file changed

+87
-25
lines changed

gix-blame/tests/blame.rs

Lines changed: 87 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -117,32 +117,50 @@ impl From<LineRange> for Range<u32> {
117117
#[derive(Debug, PartialEq)]
118118
struct BlameEntry {
119119
range_in_blamed_file: Range<u32>,
120+
range_in_original_file: Range<u32>,
120121
commit_id: ObjectId,
121122
}
122123

123124
impl 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]
16301677
fn 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]
16871739
fn 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

Comments
 (0)