From f143d9c695cd4c3e86069c536fa0dff04fc93e93 Mon Sep 17 00:00:00 2001 From: Jonathan Nieder Date: Sun, 22 May 2011 12:29:32 -0500 Subject: [PATCH] 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 Signed-off-by: Jonathan Nieder Signed-off-by: Junio C Hamano --- 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 b2fd1a99d..b68c56b68 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-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 <