userdiff/perl: tighten BEGIN/END block pattern to reject here-doc delimiters

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> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jonathan Nieder committed May 22, 2011 at 12:29 UTC f143d9c695cd4c3e86069c536fa0dff04fc93e93
2 files changed +16 -3
t/t4018-diff-funcname.sh
+15 -2
@@ -29,7 +29,7 @@ public class Beer
29 }
30 EOF
31 sed 's/beer\\/beer,\\/' <Beer.java >Beer-correct.java
32 -cat >Beer.perl <<\EOF
32 +cat >Beer.perl <<\EOT
33 package Beer;
34
35 use strict;
@@ -56,6 +56,15 @@ sub finalround
56 print "99 bottles of beer on the wall.\n");
57 }
58
59 +sub withheredocument {
60 + print <<"EOF"
61 +decoy here-doc
62 +EOF
63 + # some lines of context
64 + # to pad it out
65 + print "hello\n";
66 +}
67 +
68 __END__
69
70 =head1 NAME
@@ -76,7 +85,7 @@ Beer - subroutine to output fragment of a drinking song
85 song;
86
87 =cut
79 -EOF
88 +EOT
89 sed -e '
90 s/hello/goodbye/
91 s/beer\\/beer,\\/
@@ -138,6 +147,10 @@ test_expect_success 'perl pattern accepts K&R style brace placement, too' '
147 test_expect_funcname "sub finalround\$" perl
148 '
149
150 +test_expect_success 'but is not distracted by end of <<here document' '
151 + test_expect_funcname "sub withheredocument {\$" perl
152 +'
153 +
154 test_expect_success 'perl pattern is not distracted by sub within POD' '
155 test_expect_funcname "=head" perl
156 '
userdiff.c
+1 -1
@@ -74,7 +74,7 @@ PATTERNS("perl",
74 "(:[^;#]*)?"
75 "(\\{[ \t]*)?" /* brace can come here or on the next line */
76 "(#.*)?$\n" /* comment */
77 - "^[A-Z]+[ \t]*" /* BEGIN, END, ... */
77 + "^(BEGIN|END|INIT|CHECK|UNITCHECK|AUTOLOAD|DESTROY)[ \t]*"
78 "(\\{[ \t]*)?" /* brace can come here or on the next line */
79 "(#.*)?$\n"
80 "^=head[0-9] .*", /* POD */