diff --git a/gix-blame/tests/blame.rs b/gix-blame/tests/blame.rs index 3b404a96153..ca13012f1d7 100644 --- a/gix-blame/tests/blame.rs +++ b/gix-blame/tests/blame.rs @@ -207,6 +207,21 @@ impl Fixture { suspect: head_id, }) } + + fn blame_file( + &mut self, + source_file_name: &bstr::BStr, + options: gix_blame::Options, + ) -> Result { + gix_blame::file( + &self.odb, + self.suspect, + None, + &mut self.resource_cache, + source_file_name, + options, + ) + } } macro_rules! mktest { @@ -584,6 +599,36 @@ mod rename_tracking { Ok(()) } + + #[test] + fn rename_and_change_in_merge_commit() -> gix_testtools::Result { + let worktree_path = gix_testtools::scripted_fixture_read_only("make_blame_rename_tracking_repo.sh")?; + + let mut fixture = Fixture::for_worktree_path(worktree_path.to_path_buf())?; + let source_file_name = "change-and-renamed.txt"; + + let lines_blamed = fixture + .blame_file( + source_file_name.into(), + gix_blame::Options { + diff_algorithm: gix_diff::blob::Algorithm::Histogram, + ranges: BlameRanges::default(), + since: None, + rewrites: Some(gix_diff::Rewrites::default()), + debug_track_path: false, + }, + )? + .entries; + + assert_eq!(lines_blamed.len(), 4); + + let git_dir = worktree_path.join(".git"); + let baseline = Baseline::collect(git_dir.join("change-and-renamed.baseline"), source_file_name.into())?; + + pretty_assertions::assert_eq!(lines_blamed, baseline); + + Ok(()) + } } fn fixture_path() -> gix_testtools::Result { diff --git a/gix-blame/tests/fixtures/generated-archives/make_blame_rename_tracking_repo.tar b/gix-blame/tests/fixtures/generated-archives/make_blame_rename_tracking_repo.tar index fd9ab6b5202..16ac5c2c8d3 100644 Binary files a/gix-blame/tests/fixtures/generated-archives/make_blame_rename_tracking_repo.tar and b/gix-blame/tests/fixtures/generated-archives/make_blame_rename_tracking_repo.tar differ diff --git a/gix-blame/tests/fixtures/make_blame_rename_tracking_repo.sh b/gix-blame/tests/fixtures/make_blame_rename_tracking_repo.sh index d37b906a14a..2a08101376f 100755 --- a/gix-blame/tests/fixtures/make_blame_rename_tracking_repo.sh +++ b/gix-blame/tests/fixtures/make_blame_rename_tracking_repo.sh @@ -35,3 +35,33 @@ git checkout main git merge different-branch || true git blame --porcelain after-rename.txt > .git/after-rename.baseline + +echo -e "1\n2\n3\n4\n5\n" > change-and-rename.txt +git add change-and-rename.txt +git commit -q -m c2.1.1 + +echo -e "1\ntwo\n3\n4\n5\n" > change-and-rename.txt +git add change-and-rename.txt +git commit -q -m c2.1.2 + +git checkout -b branch-that-renames-file +git reset --hard HEAD~1 + +echo -e "1\n2\n3\nfour\n5\n" > change-and-rename.txt +git add change-and-rename.txt +git commit -q -m c2.2.1 + +mv change-and-rename.txt change-and-renamed.txt +git add change-and-rename.txt change-and-renamed.txt +git commit -q -m c2.2.2 + +echo -e "1\n2\n3\nfour\nfive\n" > change-and-renamed.txt +git add change-and-renamed.txt +git commit -q -m c2.2.2 + +git checkout main +git merge branch-that-renames-file || true +git add change-and-rename.txt +git commit --no-edit + +git blame --porcelain change-and-renamed.txt > .git/change-and-renamed.baseline