truncate recentchangesdiffs after 200 lines
This works around a perl crasher bug, and also avoids bloating pages with enormous diffs. rcs_recentchanges modified to return a list in an array context.master
parent
672893634b
commit
862ca19eb1
|
@ -5,6 +5,8 @@ use warnings;
|
||||||
use strict;
|
use strict;
|
||||||
use IkiWiki 2.00;
|
use IkiWiki 2.00;
|
||||||
|
|
||||||
|
my $maxlines=200;
|
||||||
|
|
||||||
sub import { #{{{
|
sub import { #{{{
|
||||||
hook(type => "pagetemplate", id => "recentchangesdiff",
|
hook(type => "pagetemplate", id => "recentchangesdiff",
|
||||||
call => \&pagetemplate);
|
call => \&pagetemplate);
|
||||||
|
@ -15,8 +17,17 @@ sub pagetemplate (@) { #{{{
|
||||||
my $template=$params{template};
|
my $template=$params{template};
|
||||||
if ($config{rcs} && exists $params{rev} && length $params{rev} &&
|
if ($config{rcs} && exists $params{rev} && length $params{rev} &&
|
||||||
$template->query(name => "diff")) {
|
$template->query(name => "diff")) {
|
||||||
my $diff=IkiWiki::rcs_diff($params{rev});
|
my @lines=IkiWiki::rcs_diff($params{rev});
|
||||||
if (defined $diff && length $diff) {
|
if (@lines) {
|
||||||
|
my $diff;
|
||||||
|
if (@lines > $maxlines) {
|
||||||
|
# only include so many lines of diff
|
||||||
|
$diff=join("", @lines[0..($maxlines-1)])."\n".
|
||||||
|
gettext("(Diff truncated)");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$diff=join("", @lines);
|
||||||
|
}
|
||||||
# escape links and preprocessor stuff
|
# escape links and preprocessor stuff
|
||||||
$diff =~ s/(?<!\\)\[\[/\\\[\[/g;
|
$diff =~ s/(?<!\\)\[\[/\\\[\[/g;
|
||||||
$template->param(diff => $diff);
|
$template->param(diff => $diff);
|
||||||
|
|
|
@ -60,7 +60,8 @@ sub rcs_recentchanges ($) {
|
||||||
sub rcs_diff ($) {
|
sub rcs_diff ($) {
|
||||||
# Optional, used to get diffs for recentchanges.
|
# Optional, used to get diffs for recentchanges.
|
||||||
# The parameter is the rev from rcs_recentchanges.
|
# The parameter is the rev from rcs_recentchanges.
|
||||||
return "";
|
# Should return a list of lines of the diff (including \n) in list
|
||||||
|
# context, and the whole diff in scalar context.
|
||||||
}
|
}
|
||||||
|
|
||||||
sub rcs_getctime ($) {
|
sub rcs_getctime ($) {
|
||||||
|
|
|
@ -414,16 +414,18 @@ sub rcs_recentchanges ($) { #{{{
|
||||||
sub rcs_diff ($) { #{{{
|
sub rcs_diff ($) { #{{{
|
||||||
my $rev=shift;
|
my $rev=shift;
|
||||||
my ($sha1) = $rev =~ /^($sha1_pattern)$/; # untaint
|
my ($sha1) = $rev =~ /^($sha1_pattern)$/; # untaint
|
||||||
my $ret;
|
my @lines;
|
||||||
foreach my $line (run_or_non("git", "show", $sha1)) {
|
foreach my $line (run_or_non("git", "show", $sha1)) {
|
||||||
if (defined $ret) {
|
if (@lines || $line=~/^diff --git/) {
|
||||||
$ret.=$line."\n";
|
push @lines, $line."\n";
|
||||||
}
|
|
||||||
elsif ($line=~/^diff --git/) {
|
|
||||||
$ret=$line."\n";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return $ret;
|
if (wantarray) {
|
||||||
|
return @lines;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return join("", @lines);
|
||||||
|
}
|
||||||
} #}}}
|
} #}}}
|
||||||
|
|
||||||
sub rcs_getctime ($) { #{{{
|
sub rcs_getctime ($) { #{{{
|
||||||
|
|
|
@ -219,7 +219,7 @@ sub rcs_recentchanges ($) { #{{{
|
||||||
|
|
||||||
sub rcs_diff ($) { #{{{
|
sub rcs_diff ($) { #{{{
|
||||||
my $rev=possibly_foolish_untaint(int(shift));
|
my $rev=possibly_foolish_untaint(int(shift));
|
||||||
return scalar `svnlook diff $config{svnrepo} -r$rev --no-diff-deleted`;
|
return `svnlook diff $config{svnrepo} -r$rev --no-diff-deleted`;
|
||||||
} #}}}
|
} #}}}
|
||||||
|
|
||||||
sub rcs_getctime ($) { #{{{
|
sub rcs_getctime ($) { #{{{
|
||||||
|
|
|
@ -171,7 +171,7 @@ sub rcs_diff ($) { #{{{
|
||||||
}
|
}
|
||||||
|
|
||||||
my $revminusone = $changesets[$i+1];
|
my $revminusone = $changesets[$i+1];
|
||||||
return scalar `tla diff -d $config{srcdir} $revminusone`;
|
return `tla diff -d $config{srcdir} $revminusone`;
|
||||||
} #}}}
|
} #}}}
|
||||||
|
|
||||||
sub rcs_getctime ($) { #{{{
|
sub rcs_getctime ($) { #{{{
|
||||||
|
|
|
@ -23,3 +23,24 @@ The tarball is at http://scratch.madduck.net/__tmp__recentchanges-segfault.tgz -
|
||||||
rm -rf wc/recentchanges
|
rm -rf wc/recentchanges
|
||||||
ikiwiki --setup ikiwiki.setup
|
ikiwiki --setup ikiwiki.setup
|
||||||
# works
|
# works
|
||||||
|
|
||||||
|
> I can reproduce it fine with that, thanks, and it's really looking like a
|
||||||
|
> pure perl bug, that is triggered by markdown. Here's a simpler test case:
|
||||||
|
|
||||||
|
joey@kodama:/tmp>markdown < f
|
||||||
|
zsh: segmentation fault markdown < f
|
||||||
|
|
||||||
|
> Where f is a 6.3 mb file that I
|
||||||
|
> extracted from ikiwiki's rendering pipeline.
|
||||||
|
|
||||||
|
> It seems to be crashing at markdown line 345, which is a big nasty
|
||||||
|
> `s///` statement.
|
||||||
|
|
||||||
|
> The good news: markdown version 1.0.2~b8-2 does not trigger this perl bug.
|
||||||
|
> I only see it with 1.0.1. (Bad news: Newer versions of markdown are
|
||||||
|
> slooooooow, especially on such large files.)
|
||||||
|
|
||||||
|
> I'm calling this [[done]] since I've filed [[debbug 470676]] on perl, and
|
||||||
|
> also have modified recentchangesdiff to only show the first 200 lines of
|
||||||
|
> diff, which should be enough without bloating the recentchanges into
|
||||||
|
> perl-crashing territory. --[[Joey]]
|
||||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2008-03-12 13:53-0400\n"
|
"POT-Creation-Date: 2008-03-12 15:42-0400\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@ -40,30 +40,30 @@ msgstr ""
|
||||||
msgid "Preferences saved."
|
msgid "Preferences saved."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../IkiWiki/CGI.pm:291
|
#: ../IkiWiki/CGI.pm:293
|
||||||
#, perl-format
|
#, perl-format
|
||||||
msgid "%s is not an editable page"
|
msgid "%s is not an editable page"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../IkiWiki/CGI.pm:384 ../IkiWiki/Plugin/brokenlinks.pm:24
|
#: ../IkiWiki/CGI.pm:385 ../IkiWiki/Plugin/brokenlinks.pm:24
|
||||||
#: ../IkiWiki/Plugin/inline.pm:237 ../IkiWiki/Plugin/opendiscussion.pm:17
|
#: ../IkiWiki/Plugin/inline.pm:237 ../IkiWiki/Plugin/opendiscussion.pm:17
|
||||||
#: ../IkiWiki/Plugin/orphans.pm:28 ../IkiWiki/Render.pm:95
|
#: ../IkiWiki/Plugin/orphans.pm:28 ../IkiWiki/Render.pm:95
|
||||||
#: ../IkiWiki/Render.pm:172
|
#: ../IkiWiki/Render.pm:172
|
||||||
msgid "discussion"
|
msgid "discussion"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../IkiWiki/CGI.pm:440
|
#: ../IkiWiki/CGI.pm:441
|
||||||
#, perl-format
|
#, perl-format
|
||||||
msgid "creating %s"
|
msgid "creating %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../IkiWiki/CGI.pm:458 ../IkiWiki/CGI.pm:476 ../IkiWiki/CGI.pm:486
|
#: ../IkiWiki/CGI.pm:459 ../IkiWiki/CGI.pm:477 ../IkiWiki/CGI.pm:487
|
||||||
#: ../IkiWiki/CGI.pm:520 ../IkiWiki/CGI.pm:564
|
#: ../IkiWiki/CGI.pm:521 ../IkiWiki/CGI.pm:566
|
||||||
#, perl-format
|
#, perl-format
|
||||||
msgid "editing %s"
|
msgid "editing %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../IkiWiki/CGI.pm:653
|
#: ../IkiWiki/CGI.pm:656
|
||||||
msgid "You are banned."
|
msgid "You are banned."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -500,7 +500,7 @@ msgstr ""
|
||||||
msgid "code includes disallowed latex commands"
|
msgid "code includes disallowed latex commands"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../IkiWiki/Plugin/teximg.pm:96
|
#: ../IkiWiki/Plugin/teximg.pm:88
|
||||||
msgid "failed to generate image from code"
|
msgid "failed to generate image from code"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -508,7 +508,7 @@ msgstr ""
|
||||||
msgid "(not toggleable in preview mode)"
|
msgid "(not toggleable in preview mode)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../IkiWiki/Rcs/Stub.pm:68
|
#: ../IkiWiki/Rcs/Stub.pm:69
|
||||||
msgid "getctime not implemented"
|
msgid "getctime not implemented"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue