From 862ca19eb1aee87e4ac05e8a5a9b326dd32dfe5d Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 12 Mar 2008 15:45:10 -0400 Subject: [PATCH] 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. --- IkiWiki/Plugin/recentchangesdiff.pm | 15 +++++++++++-- IkiWiki/Rcs/Stub.pm | 3 ++- IkiWiki/Rcs/git.pm | 16 +++++++------- IkiWiki/Rcs/svn.pm | 2 +- IkiWiki/Rcs/tla.pm | 2 +- ...n_commits_which_remove_a_lot_of_files.mdwn | 21 +++++++++++++++++++ po/ikiwiki.pot | 18 ++++++++-------- 7 files changed, 56 insertions(+), 21 deletions(-) diff --git a/IkiWiki/Plugin/recentchangesdiff.pm b/IkiWiki/Plugin/recentchangesdiff.pm index bd2826f76..3942f308b 100644 --- a/IkiWiki/Plugin/recentchangesdiff.pm +++ b/IkiWiki/Plugin/recentchangesdiff.pm @@ -5,6 +5,8 @@ use warnings; use strict; use IkiWiki 2.00; +my $maxlines=200; + sub import { #{{{ hook(type => "pagetemplate", id => "recentchangesdiff", call => \&pagetemplate); @@ -15,8 +17,17 @@ sub pagetemplate (@) { #{{{ my $template=$params{template}; if ($config{rcs} && exists $params{rev} && length $params{rev} && $template->query(name => "diff")) { - my $diff=IkiWiki::rcs_diff($params{rev}); - if (defined $diff && length $diff) { + my @lines=IkiWiki::rcs_diff($params{rev}); + 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 $diff =~ s/(?param(diff => $diff); diff --git a/IkiWiki/Rcs/Stub.pm b/IkiWiki/Rcs/Stub.pm index d94daf8bc..a460f29a2 100644 --- a/IkiWiki/Rcs/Stub.pm +++ b/IkiWiki/Rcs/Stub.pm @@ -60,7 +60,8 @@ sub rcs_recentchanges ($) { sub rcs_diff ($) { # Optional, used to get diffs for 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 ($) { diff --git a/IkiWiki/Rcs/git.pm b/IkiWiki/Rcs/git.pm index 9306a513e..1882b43ef 100644 --- a/IkiWiki/Rcs/git.pm +++ b/IkiWiki/Rcs/git.pm @@ -414,16 +414,18 @@ sub rcs_recentchanges ($) { #{{{ sub rcs_diff ($) { #{{{ my $rev=shift; my ($sha1) = $rev =~ /^($sha1_pattern)$/; # untaint - my $ret; + my @lines; foreach my $line (run_or_non("git", "show", $sha1)) { - if (defined $ret) { - $ret.=$line."\n"; - } - elsif ($line=~/^diff --git/) { - $ret=$line."\n"; + if (@lines || $line=~/^diff --git/) { + push @lines, $line."\n"; } } - return $ret; + if (wantarray) { + return @lines; + } + else { + return join("", @lines); + } } #}}} sub rcs_getctime ($) { #{{{ diff --git a/IkiWiki/Rcs/svn.pm b/IkiWiki/Rcs/svn.pm index 7bad40747..ea193e08f 100644 --- a/IkiWiki/Rcs/svn.pm +++ b/IkiWiki/Rcs/svn.pm @@ -219,7 +219,7 @@ sub rcs_recentchanges ($) { #{{{ sub rcs_diff ($) { #{{{ 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 ($) { #{{{ diff --git a/IkiWiki/Rcs/tla.pm b/IkiWiki/Rcs/tla.pm index 2890ff8c7..47579c15b 100644 --- a/IkiWiki/Rcs/tla.pm +++ b/IkiWiki/Rcs/tla.pm @@ -171,7 +171,7 @@ sub rcs_diff ($) { #{{{ } my $revminusone = $changesets[$i+1]; - return scalar `tla diff -d $config{srcdir} $revminusone`; + return `tla diff -d $config{srcdir} $revminusone`; } #}}} sub rcs_getctime ($) { #{{{ diff --git a/doc/bugs/recentchangesdiff_crashes_on_commits_which_remove_a_lot_of_files.mdwn b/doc/bugs/recentchangesdiff_crashes_on_commits_which_remove_a_lot_of_files.mdwn index 5872275b5..eaf6c95e9 100644 --- a/doc/bugs/recentchangesdiff_crashes_on_commits_which_remove_a_lot_of_files.mdwn +++ b/doc/bugs/recentchangesdiff_crashes_on_commits_which_remove_a_lot_of_files.mdwn @@ -23,3 +23,24 @@ The tarball is at http://scratch.madduck.net/__tmp__recentchanges-segfault.tgz - rm -rf wc/recentchanges ikiwiki --setup ikiwiki.setup # 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]] diff --git a/po/ikiwiki.pot b/po/ikiwiki.pot index 76baba228..7ba12899a 100644 --- a/po/ikiwiki.pot +++ b/po/ikiwiki.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\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" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -40,30 +40,30 @@ msgstr "" msgid "Preferences saved." msgstr "" -#: ../IkiWiki/CGI.pm:291 +#: ../IkiWiki/CGI.pm:293 #, perl-format msgid "%s is not an editable page" 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/orphans.pm:28 ../IkiWiki/Render.pm:95 #: ../IkiWiki/Render.pm:172 msgid "discussion" msgstr "" -#: ../IkiWiki/CGI.pm:440 +#: ../IkiWiki/CGI.pm:441 #, perl-format msgid "creating %s" msgstr "" -#: ../IkiWiki/CGI.pm:458 ../IkiWiki/CGI.pm:476 ../IkiWiki/CGI.pm:486 -#: ../IkiWiki/CGI.pm:520 ../IkiWiki/CGI.pm:564 +#: ../IkiWiki/CGI.pm:459 ../IkiWiki/CGI.pm:477 ../IkiWiki/CGI.pm:487 +#: ../IkiWiki/CGI.pm:521 ../IkiWiki/CGI.pm:566 #, perl-format msgid "editing %s" msgstr "" -#: ../IkiWiki/CGI.pm:653 +#: ../IkiWiki/CGI.pm:656 msgid "You are banned." msgstr "" @@ -500,7 +500,7 @@ msgstr "" msgid "code includes disallowed latex commands" msgstr "" -#: ../IkiWiki/Plugin/teximg.pm:96 +#: ../IkiWiki/Plugin/teximg.pm:88 msgid "failed to generate image from code" msgstr "" @@ -508,7 +508,7 @@ msgstr "" msgid "(not toggleable in preview mode)" msgstr "" -#: ../IkiWiki/Rcs/Stub.pm:68 +#: ../IkiWiki/Rcs/Stub.pm:69 msgid "getctime not implemented" msgstr ""