From 8ba513c64d98463e3bf7d01a02c6d882897ebee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Sat, 7 Jun 2025 13:16:20 +0200 Subject: [PATCH 1/3] Add test for source file name tracking per hunk This is a test case for the issue fixed in 7435ed5a9a7370a12332e12bd40fdbc757284a85. 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. --- gix-blame/tests/blame.rs | 42 +++++++++++++++++++ .../make_blame_rename_tracking_repo.sh | 37 ++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100755 gix-blame/tests/fixtures/make_blame_rename_tracking_repo.sh diff --git a/gix-blame/tests/blame.rs b/gix-blame/tests/blame.rs index 7b7d1e39e1d..5791d90a678 100644 --- a/gix-blame/tests/blame.rs +++ b/gix-blame/tests/blame.rs @@ -487,6 +487,48 @@ 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: gix_object::bstr::BString = "after-rename.txt".into(); + + let lines_blamed = gix_blame::file( + &odb, + suspect, + None, + &mut resource_cache, + source_file_name.as_ref(), + 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).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/make_blame_rename_tracking_repo.sh b/gix-blame/tests/fixtures/make_blame_rename_tracking_repo.sh new file mode 100755 index 00000000000..d34f56a86f8 --- /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 + +echo -e "line 1\nline 2\nline 3\nline 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 + +echo -e "line 1\nline 2\nline 3\nline 4\nline 5" > after-rename.txt +git add after-rename.txt +git commit -q -m c3 + +git checkout -b different-branch +git reset --hard HEAD~2 + +echo -e "line 0\nline 1\nline 2\nline 3\nline 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 From 25413788e3c5c9059d39b125e3543b9b9301e8fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Sat, 7 Jun 2025 13:22:44 +0200 Subject: [PATCH 2/3] Remove obsolete comment --- gix-blame/src/file/function.rs | 2 -- 1 file changed, 2 deletions(-) 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() From 8e2bc0fb3e0d3b3a4ac58af76317e13e11b72117 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Mon, 9 Jun 2025 11:14:44 +0200 Subject: [PATCH 3/3] refactor - an easier way of generate changing lines. --- gix-blame/tests/blame.rs | 7 +++---- .../make_blame_rename_tracking_repo.tar | Bin 0 -> 85504 bytes .../fixtures/make_blame_rename_tracking_repo.sh | 6 +++--- 3 files changed, 6 insertions(+), 7 deletions(-) create mode 100644 gix-blame/tests/fixtures/generated-archives/make_blame_rename_tracking_repo.tar diff --git a/gix-blame/tests/blame.rs b/gix-blame/tests/blame.rs index 5791d90a678..f0f90dcfaa5 100644 --- a/gix-blame/tests/blame.rs +++ b/gix-blame/tests/blame.rs @@ -502,14 +502,13 @@ mod rename_tracking { suspect, } = Fixture::for_worktree_path(worktree_path.to_path_buf()).unwrap(); - let source_file_name: gix_object::bstr::BString = "after-rename.txt".into(); - + let source_file_name = "after-rename.txt"; let lines_blamed = gix_blame::file( &odb, suspect, None, &mut resource_cache, - source_file_name.as_ref(), + source_file_name.into(), gix_blame::Options { diff_algorithm: gix_diff::blob::Algorithm::Histogram, range: BlameRanges::default(), @@ -523,7 +522,7 @@ mod rename_tracking { 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).unwrap(); + let baseline = Baseline::collect(git_dir.join("after-rename.baseline"), source_file_name.into()).unwrap(); pretty_assertions::assert_eq!(lines_blamed, baseline); } 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 0000000000000000000000000000000000000000..fd9ab6b5202064e78ad72888d81ec5d4d4e9dd82 GIT binary patch literal 85504 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 literal 0 HcmV?d00001 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 d34f56a86f8..d37b906a14a 100755 --- a/gix-blame/tests/fixtures/make_blame_rename_tracking_repo.sh +++ b/gix-blame/tests/fixtures/make_blame_rename_tracking_repo.sh @@ -8,7 +8,7 @@ git config merge.ff false git checkout -q -b main -echo -e "line 1\nline 2\nline 3\nline 4" > before-rename.txt +seq 1 4 > before-rename.txt git add before-rename.txt git commit -q -m c1 @@ -16,14 +16,14 @@ mv before-rename.txt after-rename.txt git add before-rename.txt after-rename.txt git commit -q -m c2 -echo -e "line 1\nline 2\nline 3\nline 4\nline 5" > after-rename.txt +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 -echo -e "line 0\nline 1\nline 2\nline 3\nline 4" > before-rename.txt +seq 0 4 > before-rename.txt git add before-rename.txt git commit -q -m c10