Skip to content

Commit 8ba513c

Browse files
committed
Add test for source file name tracking per hunk
This is a test case for the issue fixed in 7435ed5. The issue was related to the fact that, before the fix, `source_file_name` was only tracked globally, as opposed to locally, i. e. on a per-hunk basis. The test case constructs a repository that has the same rename twice, in two different branches. Tracking `source_file_name` globally is insufficient to capture this history which is why this test fails without the fix.
1 parent 76eddf8 commit 8ba513c

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

gix-blame/tests/blame.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,48 @@ mod blame_ranges {
487487
}
488488
}
489489

490+
mod rename_tracking {
491+
use gix_blame::BlameRanges;
492+
493+
use crate::{Baseline, Fixture};
494+
495+
#[test]
496+
fn source_file_name_is_tracked_per_hunk() {
497+
let worktree_path = gix_testtools::scripted_fixture_read_only("make_blame_rename_tracking_repo.sh").unwrap();
498+
499+
let Fixture {
500+
odb,
501+
mut resource_cache,
502+
suspect,
503+
} = Fixture::for_worktree_path(worktree_path.to_path_buf()).unwrap();
504+
505+
let source_file_name: gix_object::bstr::BString = "after-rename.txt".into();
506+
507+
let lines_blamed = gix_blame::file(
508+
&odb,
509+
suspect,
510+
None,
511+
&mut resource_cache,
512+
source_file_name.as_ref(),
513+
gix_blame::Options {
514+
diff_algorithm: gix_diff::blob::Algorithm::Histogram,
515+
range: BlameRanges::default(),
516+
since: None,
517+
rewrites: Some(gix_diff::Rewrites::default()),
518+
},
519+
)
520+
.unwrap()
521+
.entries;
522+
523+
assert_eq!(lines_blamed.len(), 3);
524+
525+
let git_dir = worktree_path.join(".git");
526+
let baseline = Baseline::collect(git_dir.join("after-rename.baseline"), source_file_name).unwrap();
527+
528+
pretty_assertions::assert_eq!(lines_blamed, baseline);
529+
}
530+
}
531+
490532
fn fixture_path() -> PathBuf {
491533
gix_testtools::scripted_fixture_read_only("make_blame_repo.sh").unwrap()
492534
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#!/usr/bin/env bash
2+
set -eu -o pipefail
3+
4+
git init -q
5+
git config --local diff.algorithm histogram
6+
7+
git config merge.ff false
8+
9+
git checkout -q -b main
10+
11+
echo -e "line 1\nline 2\nline 3\nline 4" > before-rename.txt
12+
git add before-rename.txt
13+
git commit -q -m c1
14+
15+
mv before-rename.txt after-rename.txt
16+
git add before-rename.txt after-rename.txt
17+
git commit -q -m c2
18+
19+
echo -e "line 1\nline 2\nline 3\nline 4\nline 5" > after-rename.txt
20+
git add after-rename.txt
21+
git commit -q -m c3
22+
23+
git checkout -b different-branch
24+
git reset --hard HEAD~2
25+
26+
echo -e "line 0\nline 1\nline 2\nline 3\nline 4" > before-rename.txt
27+
git add before-rename.txt
28+
git commit -q -m c10
29+
30+
mv before-rename.txt after-rename.txt
31+
git add before-rename.txt after-rename.txt
32+
git commit -q -m c11
33+
34+
git checkout main
35+
git merge different-branch || true
36+
37+
git blame --porcelain after-rename.txt > .git/after-rename.baseline

0 commit comments

Comments
 (0)