Skip to content

Commit

Permalink
userdiff/perl: tighten BEGIN/END block pattern to reject here-doc del…
Browse files Browse the repository at this point in the history
…imiters

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>
  • Loading branch information
Jonathan Nieder authored and Junio C Hamano committed May 23, 2011
1 parent f5b7ce1 commit f143d9c
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 3 deletions.
17 changes: 15 additions & 2 deletions t/t4018-diff-funcname.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand All @@ -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,\\/
Expand Down Expand Up @@ -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
'
Expand Down
2 changes: 1 addition & 1 deletion userdiff.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down

0 comments on commit f143d9c

Please sign in to comment.