Thread (22 messages) 22 messages, 6 authors, 2024-10-22

Re: [PATCH] blame: respect .git-blame-ignore-revs automatically

From: Phillip Wood <hidden>
Date: 2024-10-08 09:51:04

Hi Abhijeetsingh

On 08/10/2024 08:01, Abhijeetsingh Meena via GitGitGadget wrote:
From: Abhijeetsingh Meena <redacted>

Modify `git blame` to automatically respect a `.git-blame-ignore-revs`
file if it exists in the repository. This file is used by many projects
to ignore non-functional changes, such as reformatting or large-scale
refactoring, when generating blame information.

Before this change, users had to manually specify the file with the
`--ignore-revs-file` option. This update streamlines the process by
automatically detecting the `.git-blame-ignore-revs` file, reducing
manual effort.
As Kristoffer mentioned there is a config option so that the user does 
not have to specify the file each time. The decision not to support a 
default file for this feature was deliberate [1,2]. It is possible that 
we now have enough experience with the feature that we think it would be 
a good idea but any such change would need to address the concerns about 
ignoring "cleanup" commits that introduce bugs. If we do decide to 
support a default file we'd need to work out how it interacted with the 
config setting and make sure there was an easy way to turn the feature off.

Best Wishes

Phillip

[1] 
https://lore.kernel.org/git/c34159af-f97e-82b3-e2a1-04adae5c10ac@google.com/ (local)
[2] https://lore.kernel.org/git/YLfe+HXl4hkzs44b@nand.local/ (local)
quoted hunk ↗ jump to hunk
This change aligns with the standardized practice in many repositories
and simplifies the workflow for users.

Signed-off-by: Abhijeetsingh Meena <redacted>
---
     blame: respect .git-blame-ignore-revs automatically
     
     
     Introduction
     ============
     
     Hi, I'm Abhijeet (Ethan0456), and this is my first contribution to the
     Git project. I currently work as an ML Engineer at an early-stage
     startup, and I’m excited to contribute to this open-source project.
     
     
     Why the Change?
     ===============
     
     I came across this enhancement request on the bug tracker and found it
     beginner-friendly, making it a great opportunity for me to get familiar
     with the Git codebase. The ability for git blame to automatically
     respect the .git-blame-ignore-revs file is something that can streamline
     workflows for many users, and I felt it would be a valuable addition.
     
     
     Feedback
     ========
     
     While I’m confident in the changes made to builtin/blame.c and the new
     test case in t/t8015-blame-ignore-revs.sh, I welcome any feedback or
     suggestions to improve both my code and approach. I’m eager to learn
     from the community and improve where needed.
     
     
     Community Need
     ==============
     
     There is precedent for this functionality in other projects:
     
      * Chromium
        [https://chromium.googlesource.com/chromium/src.git/+/f0596779e57f46fccb115a0fd65f0305894e3031/.git-blame-ignore-revs],
        which powers many popular browsers, uses .git-blame-ignore-revs to
        simplify the blame process by ignoring non-functional changes.
      * Rob Allen's blog post
        [https://akrabat.com/ignoring-revisions-with-git-blame/] discusses
        the need for ignoring revisions with git blame, and a commenter
        specifically suggests that it would be helpful if Git automatically
        respected .git-blame-ignore-revs.
     
     I hope this change aligns with community needs and improves the git
     blame experience for users.

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1809%2FEthan0456%2Fblame-auto-ignore-revs-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1809/Ethan0456/blame-auto-ignore-revs-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/1809

  builtin/blame.c                      |  8 ++++++++
  t/t8015-blame-default-ignore-revs.sh | 26 ++++++++++++++++++++++++++
  2 files changed, 34 insertions(+)
  create mode 100755 t/t8015-blame-default-ignore-revs.sh
diff --git a/builtin/blame.c b/builtin/blame.c
index e407a22da3b..1eddabaf60f 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -1105,6 +1105,14 @@ parse_done:
  		add_pending_object(&revs, &head_commit->object, "HEAD");
  	}
  
+	/*
+	* By default, add .git-blame-ignore-revs to the list of files
+	* containing revisions to ignore if it exists.
+	*/
+	if (access(".git-blame-ignore-revs", F_OK) == 0) {
+		string_list_append(&ignore_revs_file_list, ".git-blame-ignore-revs");
+	}
+
  	init_scoreboard(&sb);
  	sb.revs = &revs;
  	sb.contents_from = contents_from;
diff --git a/t/t8015-blame-default-ignore-revs.sh b/t/t8015-blame-default-ignore-revs.sh
new file mode 100755
index 00000000000..84e1a9e87e6
--- /dev/null
+++ b/t/t8015-blame-default-ignore-revs.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+test_description='default revisions to ignore when blaming'
+
+TEST_PASSES_SANITIZE_LEAK=true
+. ./test-lib.sh
+
+test_expect_success 'blame: default-ignore-revs-file' '
+    test_commit first-commit hello.txt hello &&
+
+    echo world >>hello.txt &&
+    test_commit second-commit hello.txt &&
+
+    sed "1s/hello/hi/" <hello.txt > hello.txt.tmp &&
+    mv hello.txt.tmp hello.txt &&
+    test_commit third-commit hello.txt &&
+
+    git rev-parse HEAD >ignored-file &&
+    git blame --ignore-revs-file=ignored-file hello.txt >expect &&
+    git rev-parse HEAD >.git-blame-ignore-revs &&
+    git blame hello.txt >actual &&
+
+    test_cmp expect actual
+'
+
+test_done
\ No newline at end of file

base-commit: 777489f9e09c8d0dd6b12f9d90de6376330577a2
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help