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

[PATCH 8/7] userdiff/perl: tighten BEGIN/END block pattern to reject here-doc delimiters

From
Jonathan Nieder <jrnieder@gmail.com>
Date
May 22, 2011, 17:29 UTC
Message-ID
<20110522172932.GA21159@elie>
In-Reply-To
<20110521193826.GG10530@elie>

A naive method of treating BEGIN/END blocks with a brace on the second line as diff/grep funcname context involves also matching unrelated lines that consist of all-caps letters:

	sub foo {
		print <<'EOF'
	text goes here
	...
	EOF
		... rest of foo ...
	}

That's not so great, because it means that "git diff" and "git grep --show-function" would write "=EOF" or "@@ EOF" as context instead of a more useful reminder like "@@ sub foo {".

To avoid this, tighten the pattern to only match the special block names that perl accepts (namely BEGIN, END, INIT, CHECK, UNITCHECK, AUTOLOAD, and DESTROY). The list is taken from perl's toke.c.

Suggested-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
Jonathan Nieder wrote:
Show 9 quoted lines
> Accept
>
> 	sub foo
> 	{
> 	}
>
> as an alternative to a more common style that introduces perl
> functions with a brace on the first line (and likewise for BEGIN/END
> blocks).

I just remembered that this pattern is overzealous since it will match here-document terminators, as in:

	sub foo {
		print <<'FINIS'
	here-doc goes here
	FINIS
		... rest of foo, a change to which might be described in
		a diff ...
	}
Fix follows.
 t/t4018-diff-funcname.sh |   17 +++++++++++++++--
 userdiff.c               |    2 +-
 2 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/t/t4018-diff-funcname.sh b/t/t4018-diff-funcname.sh
index b2fd1a9..b68c56b 100755
--- a/t/t4018-diff-funcname.sh
+++ b/t/t4018-diff-funcname.sh
@@ -29,7 +29,7 @@ public class Beer
 }
 EOF
 sed 's/beer\\/beer,\\/' <Beer.java >Beer-correct.java
-cat >Beer.perl <<\EOF
+cat >Beer.perl <<\EOT
 package Beer;
 
 use strict;
@@ -56,6 +56,15 @@ sub finalround
 	print "99 bottles of beer on the wall.\n");
 }
 
+sub withheredocument {
+	print <<"EOF"
+decoy here-doc
+EOF
+	# some lines of context
+	# to pad it out
+	print "hello\n";
+}
+
 __END__
 
 =head1 NAME
@@ -76,7 +85,7 @@ Beer - subroutine to output fragment of a drinking song
 	song;
 
 =cut
-EOF
+EOT
 sed -e '
 	s/hello/goodbye/
 	s/beer\\/beer,\\/
@@ -138,6 +147,10 @@ test_expect_success 'perl pattern accepts K&R style brace placement, too' '
 	test_expect_funcname "sub finalround\$" perl
 '
 
+test_expect_success 'but is not distracted by end of <<here document' '
+	test_expect_funcname "sub withheredocument {\$" perl
+'
+
 test_expect_success 'perl pattern is not distracted by sub within POD' '
 	test_expect_funcname "=head" perl
 '
diff --git a/userdiff.c b/userdiff.c
index 42b86ac..e55310c 100644
--- a/userdiff.c
+++ b/userdiff.c
@@ -74,7 +74,7 @@ PATTERNS("perl",
 		"(:[^;#]*)?"
 		"(\\{[ \t]*)?" /* brace can come here or on the next line */
 		"(#.*)?$\n" /* comment */
-	 "^[A-Z]+[ \t]*"	/* BEGIN, END, ... */
+	 "^(BEGIN|END|INIT|CHECK|UNITCHECK|AUTOLOAD|DESTROY)[ \t]*"
 		"(\\{[ \t]*)?" /* brace can come here or on the next line */
 		"(#.*)?$\n"
 	 "^=head[0-9] .*",	/* POD */
-- 
1.7.5.1
Previous: Jonathan NiederNext: Jonathan Nieder
Message 11 of 13 in “Problems with Git's "perl" userdiff driver”
  1. Ævar Arnfjörð BjarmasonMay 15, 2011
  2. Junio C HamanoMay 15, 2011
  3. Ævar Arnfjörð BjarmasonMay 15, 2011
  4. 0/7 Re: Problems with Git's "perl" userdiff driverJonathan Nieder, May 21, 2011
  5. 1/7 t4018 (funcname patterns): make .gitattributes state easier to trackJonathan Nieder, May 21, 2011
  6. 2/7 t4018 (funcname patterns): make configuration easier to trackJonathan Nieder, May 21, 2011
  7. 3/7 t4018 (funcname patterns): minor cleanupsJonathan Nieder, May 21, 2011
  8. 4/7 userdiff/perl: anchor "sub" and "package" patterns on the leftJonathan Nieder, May 21, 2011
  9. 5/7 userdiff/perl: match full line of POD headersJonathan Nieder, May 21, 2011
  10. 6/7 userdiff/perl: catch sub with brace on second lineJonathan Nieder, May 21, 2011
  11. 8/7 userdiff/perl: tighten BEGIN/END block pattern to reject here-doc delimitersJonathan Nieder, May 22, 2011
  12. 7/7 tests: make test_expect_code quieter on successJonathan Nieder, May 21, 2011
  13. Ævar Arnfjörð BjarmasonMay 22, 2011

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.