]> sipb.mit.edu Git - ikiwiki.git/commitdiff
code checking for locked pages into a new "lockedit" plugin. Both are
authorjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>
Sat, 3 Feb 2007 03:27:33 +0000 (03:27 +0000)
committerjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>
Sat, 3 Feb 2007 03:27:33 +0000 (03:27 +0000)
* Avoid using lots of memory when copying large non-html files.
  Yes, you can keep videos in the wiki..

IkiWiki.pm
IkiWiki/Render.pm
debian/changelog

index 2d692a9784e67548382e0e5e36252f5992b5eb48..dfd2240628141a08e6a9b0d538266b94015b73f6 100644 (file)
@@ -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;
 } #}}}
index dcd107b815172d86031d7cce3fc15a9d16544099..2ad80ced3354457cb4e79c217e36be37f0f52b90 100644 (file)
@@ -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;
        }
 } #}}}
index 9ef47936e3a19d224a7818d2c811714092152e40..4c45fbea77cbbadd6185010e93780b060017b8e9 100644 (file)
@@ -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