diff --git a/gix-blame/src/file/function.rs b/gix-blame/src/file/function.rs index 298d8e38be2..b69780ae244 100644 --- a/gix-blame/src/file/function.rs +++ b/gix-blame/src/file/function.rs @@ -128,8 +128,6 @@ pub fn file( continue 'outer; }; - // We know `first_hunk_for_suspect` can’t be `None` here because we check `is_some()` - // above. let current_file_path = first_hunk_for_suspect .source_file_name .clone() diff --git a/gix-blame/tests/blame.rs b/gix-blame/tests/blame.rs index 7b7d1e39e1d..f0f90dcfaa5 100644 --- a/gix-blame/tests/blame.rs +++ b/gix-blame/tests/blame.rs @@ -487,6 +487,47 @@ mod blame_ranges { } } +mod rename_tracking { + use gix_blame::BlameRanges; + + use crate::{Baseline, Fixture}; + + #[test] + fn source_file_name_is_tracked_per_hunk() { + let worktree_path = gix_testtools::scripted_fixture_read_only("make_blame_rename_tracking_repo.sh").unwrap(); + + let Fixture { + odb, + mut resource_cache, + suspect, + } = Fixture::for_worktree_path(worktree_path.to_path_buf()).unwrap(); + + let source_file_name = "after-rename.txt"; + let lines_blamed = gix_blame::file( + &odb, + suspect, + None, + &mut resource_cache, + source_file_name.into(), + gix_blame::Options { + diff_algorithm: gix_diff::blob::Algorithm::Histogram, + range: BlameRanges::default(), + since: None, + rewrites: Some(gix_diff::Rewrites::default()), + }, + ) + .unwrap() + .entries; + + assert_eq!(lines_blamed.len(), 3); + + let git_dir = worktree_path.join(".git"); + let baseline = Baseline::collect(git_dir.join("after-rename.baseline"), source_file_name.into()).unwrap(); + + pretty_assertions::assert_eq!(lines_blamed, baseline); + } +} + fn fixture_path() -> PathBuf { gix_testtools::scripted_fixture_read_only("make_blame_repo.sh").unwrap() } 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 new file mode 100644 index 00000000000..fd9ab6b5202 Binary files /dev/null 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 new file mode 100755 index 00000000000..d37b906a14a --- /dev/null +++ b/gix-blame/tests/fixtures/make_blame_rename_tracking_repo.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +set -eu -o pipefail + +git init -q +git config --local diff.algorithm histogram + +git config merge.ff false + +git checkout -q -b main + +seq 1 4 > before-rename.txt +git add before-rename.txt +git commit -q -m c1 + +mv before-rename.txt after-rename.txt +git add before-rename.txt after-rename.txt +git commit -q -m c2 + +seq 1 5 > after-rename.txt +git add after-rename.txt +git commit -q -m c3 + +git checkout -b different-branch +git reset --hard HEAD~2 + +seq 0 4 > before-rename.txt +git add before-rename.txt +git commit -q -m c10 + +mv before-rename.txt after-rename.txt +git add before-rename.txt after-rename.txt +git commit -q -m c11 + +git checkout main +git merge different-branch || true + +git blame --porcelain after-rename.txt > .git/after-rename.baseline