summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: f5b7ce1)
raw | patch | inline | side by side (parent: f5b7ce1)
author | Jonathan Nieder <jrnieder@gmail.com> | |
Sun, 22 May 2011 17:29:32 +0000 (12:29 -0500) | ||
committer | Junio C Hamano <gitster@pobox.com> | |
Mon, 23 May 2011 18:39:13 +0000 (11:39 -0700) |
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>
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>
t/t4018-diff-funcname.sh | patch | blob | history | |
userdiff.c | patch | blob | history |
index b2fd1a99da12916e0ea809925629d3832214cc92..b68c56b68c0f80a0d96b513733bc5fb17db6fed4 100755 (executable)
--- a/t/t4018-diff-funcname.sh
+++ b/t/t4018-diff-funcname.sh
}
EOF
sed 's/beer\\/beer,\\/' <Beer.java >Beer-correct.java
-cat >Beer.perl <<\EOF
+cat >Beer.perl <<\EOT
package Beer;
use strict;
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
song;
=cut
-EOF
+EOT
sed -e '
s/hello/goodbye/
s/beer\\/beer,\\/
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 42b86ac63d734280ac85ea829a910c4aa375dfcd..e55310cd02c8e7d1f0404b2fee9539e7340993d9 100644 (file)
--- a/userdiff.c
+++ b/userdiff.c
"(:[^;#]*)?"
"(\\{[ \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 */