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>
maint
Jonathan Nieder 2011-05-22 12:29:32 -05:00 committed by Junio C Hamano
parent f5b7ce1b90
commit f143d9c695
2 changed files with 16 additions and 3 deletions

View File

@ -29,7 +29,7 @@ public class Beer
} }
EOF EOF
sed 's/beer\\/beer,\\/' <Beer.java >Beer-correct.java sed 's/beer\\/beer,\\/' <Beer.java >Beer-correct.java
cat >Beer.perl <<\EOF cat >Beer.perl <<\EOT
package Beer; package Beer;


use strict; use strict;
@ -56,6 +56,15 @@ sub finalround
print "99 bottles of beer on the wall.\n"); 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__ __END__


=head1 NAME =head1 NAME
@ -76,7 +85,7 @@ Beer - subroutine to output fragment of a drinking song
song; song;


=cut =cut
EOF EOT
sed -e ' sed -e '
s/hello/goodbye/ s/hello/goodbye/
s/beer\\/beer,\\/ 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_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_success 'perl pattern is not distracted by sub within POD' '
test_expect_funcname "=head" perl test_expect_funcname "=head" perl
' '

View File

@ -74,7 +74,7 @@ PATTERNS("perl",
"(:[^;#]*)?" "(:[^;#]*)?"
"(\\{[ \t]*)?" /* brace can come here or on the next line */ "(\\{[ \t]*)?" /* brace can come here or on the next line */
"(#.*)?$\n" /* comment */ "(#.*)?$\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 */ "(\\{[ \t]*)?" /* brace can come here or on the next line */
"(#.*)?$\n" "(#.*)?$\n"
"^=head[0-9] .*", /* POD */ "^=head[0-9] .*", /* POD */