summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Hess <joey@kodama.kitenet.net>2008-03-12 15:45:10 -0400
committerJoey Hess <joey@kodama.kitenet.net>2008-03-12 15:45:10 -0400
commit862ca19eb1aee87e4ac05e8a5a9b326dd32dfe5d (patch)
tree65d67b5398db4cae6fd0d57526ba907b1b002d2c
parent672893634be9d7e7f2b44c27e4927021b12eedb6 (diff)
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.
-rw-r--r--IkiWiki/Plugin/recentchangesdiff.pm15
-rw-r--r--IkiWiki/Rcs/Stub.pm3
-rw-r--r--IkiWiki/Rcs/git.pm16
-rw-r--r--IkiWiki/Rcs/svn.pm2
-rw-r--r--IkiWiki/Rcs/tla.pm2
-rw-r--r--doc/bugs/recentchangesdiff_crashes_on_commits_which_remove_a_lot_of_files.mdwn21
-rw-r--r--po/ikiwiki.pot18
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/(?<!\\)\[\[/\\\[\[/g;
$template->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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""