git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 6/8] blame: enable funcname blaming with userdiff driver

From
Philippe Blain via GitGitGadget <gitgitgadget@gmail.com>
Date
Nov 1, 2020, 17:28 UTC
Message-ID
<c77108e864afe8c60018248923ff75cdef05efb4.1604251728.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.774.v2.git.1604251727.gitgitgadget@gmail.com>
From: Philippe Blain <levraiphilippeblain@gmail.com>

In blame.c::cmd_blame, we send the 'path' field of the 'sb' 'struct blame_scoreboard' as the 'path' argument to 'line-range.c::parse_range_arg', but 'sb.path' is not set yet; it's set to the local variable 'path' a few lines later at line 1137.

This 'path' argument is only used in 'parse_range_arg' if we are blaming a funcname, i.e. `git blame -L :<funcname> <path>`, and in that case it is sent to 'parse_range_funcname', where it is used to determine if a userdiff driver should be used for said <path> to match the given funcname.

Since 'path' is yet unset, the userdiff driver is never used, so we fall back to the default funcname regex, which is usually not appropriate for paths that are set to use a specific userdiff driver, and thus either we match some unrelated lines, or we die with

    fatal: -L parameter '<funcname>' starting at line 1: no match

This has been the case ever since `git blame` learned to blame a funcname in 13b8f68c1f (log -L: :pattern:file syntax to find by funcname, 2013-03-28).

Enable funcname blaming for paths using specific userdiff drivers by initializing 'sb.path' earlier in 'cmd_blame', when some of its other fields are initialized, so that it is set when passed to 'parse_range_arg'.

Add a regression test in 'annotate-tests.sh', which is sourced in t8001-annotate.sh and t8002-blame.sh, leveraging an existing file used to test the userdiff patterns in t4018-diff-funcname.

Also, use 'sb.path' instead of 'path' when constructing the error message at line 1114, for consistency.

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
---
 builtin/blame.c     |  4 ++--
 t/annotate-tests.sh | 18 ++++++++++++++++++
 2 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/builtin/blame.c b/builtin/blame.c
index 224b6f18d4..f2e528fcbc 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -1081,6 +1081,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
 	sb.contents_from = contents_from;
 	sb.reverse = reverse;
 	sb.repo = the_repository;
+	sb.path = path;
 	build_ignorelist(&sb, &ignore_revs_file_list, &ignore_rev_list);
 	string_list_clear(&ignore_revs_file_list, 0);
 	string_list_clear(&ignore_rev_list, 0);
@@ -1110,7 +1111,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
 		if ((!lno && (top || bottom)) || lno < bottom)
 			die(Q_("file %s has only %lu line",
 			       "file %s has only %lu lines",
-			       lno), path, lno);
+			       lno), sb.path, lno);
 		if (bottom < 1)
 			bottom = 1;
 		if (top < 1 || lno < top)
@@ -1135,7 +1136,6 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
 	string_list_clear(&range_list, 0);
 
 	sb.ent = NULL;
-	sb.path = path;
 
 	if (blame_move_score)
 		sb.move_score = blame_move_score;
diff --git a/t/annotate-tests.sh b/t/annotate-tests.sh
index d933af5714..3aee61d2cc 100644
--- a/t/annotate-tests.sh
+++ b/t/annotate-tests.sh
@@ -479,6 +479,24 @@ test_expect_success 'blame -L ^:RE (absolute: end-of-file)' '
 	check_count -f hello.c -L$n -L^:ma.. F 4 G 1 H 1
 '
 
+test_expect_success 'setup -L :funcname with userdiff driver' '
+	echo "fortran-* diff=fortran" >.gitattributes &&
+	fortran_file=fortran-external-function &&
+	orig_file="$TEST_DIRECTORY/t4018/$fortran_file" &&
+	cp $orig_file . &&
+	git add $fortran_file &&
+	GIT_AUTHOR_NAME="A" GIT_AUTHOR_EMAIL="A@test.git" \
+	git commit -m "add fortran file" &&
+	sed -e "s/ChangeMe/IWasChanged/" <"$orig_file" >$fortran_file &&
+	git add $fortran_file &&
+	GIT_AUTHOR_NAME="B" GIT_AUTHOR_EMAIL="B@test.git" \
+	git commit -m "change fortran file"
+'
+
+test_expect_success 'blame -L :funcname with userdiff driver' '
+	check_count -f fortran-external-function -L:RIGHT A 7 B 1
+'
+
 test_expect_success 'setup incremental' '
 	(
 	GIT_AUTHOR_NAME=I &&
-- 
gitgitgadget
Previous: Philippe Blain via GitGitGadgetNext: Philippe Blain via GitGitGadget
Message 28 of 30 in “blame: enable funcname blaming with userdiff driver”
  1. 0/6 blame: enable funcname blaming with userdiff driverPhilippe Blain via GitGitGadget, Oct 28, 2020
  2. 3/6 blame-options.txt: also mention 'funcname' in '-L' descriptionPhilippe Blain via GitGitGadget, Oct 28, 2020
  3. Junio C HamanoOct 29, 2020
  4. Philippe BlainOct 31, 2020
  5. 6/6 blame: enable funcname blaming with userdiff driverPhilippe Blain via GitGitGadget, Oct 28, 2020
  6. Junio C HamanoOct 29, 2020
  7. Philippe BlainOct 31, 2020
  8. Junio C HamanoOct 31, 2020
  9. 4/6 doc: add more pointers to gitattributes(5) for userdiffPhilippe Blain via GitGitGadget, Oct 28, 2020
  10. Eric SunshineOct 28, 2020
  11. 5/6 line-log: mention both modes in 'blame' and 'log' short helpPhilippe Blain via GitGitGadget, Oct 28, 2020
  12. Eric SunshineOct 28, 2020
  13. Philippe BlainOct 29, 2020
  14. 2/6 doc: line-range: improve formattingPhilippe Blain via GitGitGadget, Oct 28, 2020
  15. Eric SunshineOct 28, 2020
  16. Junio C HamanoOct 29, 2020
  17. Philippe BlainOct 31, 2020
  18. 1/6 doc: log, gitk: move '-L' description to 'line-range-options.txt'Philippe Blain via GitGitGadget, Oct 28, 2020
  19. Junio C HamanoOct 29, 2020
  20. Philippe BlainOct 31, 2020
  21. Junio C HamanoOct 31, 2020
  22. 0/8 blame: enable funcname blaming with userdiff driverPhilippe Blain via GitGitGadget, Nov 1, 2020
  23. 1/8 doc: log, gitk: move '-L' description to 'line-range-options.txt'Philippe Blain via GitGitGadget, Nov 1, 2020
  24. 3/8 blame-options.txt: also mention 'funcname' in '-L' descriptionPhilippe Blain via GitGitGadget, Nov 1, 2020
  25. 4/8 doc: add more pointers to gitattributes(5) for userdiffPhilippe Blain via GitGitGadget, Nov 1, 2020
  26. 5/8 line-log: mention both modes in 'blame' and 'log' short helpPhilippe Blain via GitGitGadget, Nov 1, 2020
  27. 2/8 doc: line-range: improve formattingPhilippe Blain via GitGitGadget, Nov 1, 2020
  28. 6/8 blame: enable funcname blaming with userdiff driverPhilippe Blain via GitGitGadget, Nov 1, 2020
  29. 8/8 blame: simplify 'setup_blame_bloom_data' interfacePhilippe Blain via GitGitGadget, Nov 1, 2020
  30. 7/8 blame: simplify 'setup_scoreboard' interfacePhilippe Blain via GitGitGadget, Nov 1, 2020

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.