diff options
-rw-r--r-- | IkiWiki.pm | 8 | ||||
-rw-r--r-- | IkiWiki/Render.pm | 19 | ||||
-rw-r--r-- | debian/changelog | 6 |
3 files changed, 27 insertions, 6 deletions
diff --git a/IkiWiki.pm b/IkiWiki.pm index 2d692a978..dfd224062 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -231,9 +231,10 @@ sub srcfile ($) { #{{{ error("internal error: $file cannot be found"); } #}}} -sub readfile ($;$) { #{{{ +sub readfile ($;$$) { #{{{ my $file=shift; my $binary=shift; + my $wantfd=shift; if (-l $file) { error("cannot read a symlink ($file)"); @@ -242,16 +243,18 @@ sub readfile ($;$) { #{{{ local $/=undef; open (IN, $file) || error("failed to read $file: $!"); binmode(IN) if ($binary); + return \*IN if $wantfd; my $ret=<IN>; close IN; return $ret; } #}}} -sub writefile ($$$;$) { #{{{ +sub writefile ($$$;$$) { #{{{ my $file=shift; # can include subdirs my $destdir=shift; # directory to put file in my $content=shift; my $binary=shift; + my $wantfd=shift; my $test=$file; while (length $test) { @@ -274,6 +277,7 @@ sub writefile ($$$;$) { #{{{ open (OUT, ">$destdir/$file") || error("failed to write $destdir/$file: $!"); binmode(OUT) if ($binary); + return \*OUT if $wantfd; print OUT $content; close OUT; } #}}} diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm index dcd107b81..2ad80ced3 100644 --- a/IkiWiki/Render.pm +++ b/IkiWiki/Render.pm @@ -195,10 +195,25 @@ sub render ($) { #{{{ $oldpagemtime{$page}=time; } else { - my $content=readfile($srcfile, 1); + my $srcfd=readfile($srcfile, 1, 1); delete $depends{$file}; will_render($file, $file, 1); - writefile($file, $config{destdir}, $content, 1); + my $destfd=writefile($file, $config{destdir}, undef, 1, 1); + my $blksize = 16384; + my ($len, $buf, $written); + while ($len = sysread $srcfd, $buf, $blksize) { + if (! defined $len) { + next if $! =~ /^Interrupted/; + error("failed to read $srcfile: $!"); + } + my $offset = 0; + while ($len) { + defined($written = syswrite OUT, $buf, $len, $offset) + or error("failed to write $file: $!"); + $len -= $written; + $offset += $written; + } + } $oldpagemtime{$file}=time; } } #}}} diff --git a/debian/changelog b/debian/changelog index 9ef47936e..4c45fbea7 100644 --- a/debian/changelog +++ b/debian/changelog @@ -5,7 +5,7 @@ ikiwiki (1.42) UNRELEASED; urgency=low * Add canedit hook, allowing arbitrary controls over when a page can be edited. * Move code forcing signing before edit to a new "signinedit" plugin, and - code checking for locked pages into a new "lockedit" plugin. Both are + code checking for locked pages into a new "lockedit" plugin. Both are enabled by default. * Remove the anonok config setting. This is now implemented by a new "anonok" plugin. Anyone with a wiki allowing anonymous edits should @@ -13,8 +13,10 @@ ikiwiki (1.42) UNRELEASED; urgency=low * Add an opendiscussion plugin that allows anonymous users to edit discussion pages, on a wiki that is otherwise wouldn't allow it. * Lots of CGI code reorg and cleanup. + * Avoid using lots of memory when copying large non-html files. + Yes, you can keep videos in the wiki.. - -- Joey Hess <joeyh@debian.org> Thu, 1 Feb 2007 15:36:38 -0500 + -- Joey Hess <joeyh@debian.org> Fri, 2 Feb 2007 21:59:04 -0500 ikiwiki (1.41) unstable; urgency=low |