]> sipb.mit.edu Git - ikiwiki.git/blobdiff - ikiwiki
optimise svn log a bit
[ikiwiki.git] / ikiwiki
diff --git a/ikiwiki b/ikiwiki
index dd417780096502b756e2d15b7026828edc413941..bda2d0401376f9cb7ee6ea0cd1f71d2192249d3c 100755 (executable)
--- a/ikiwiki
+++ b/ikiwiki
@@ -401,6 +401,25 @@ sub render ($) { #{{{
        }
 } #}}}
 
+sub lockwiki () { #{{{
+       # Take an exclusive lock on the wiki to prevent multiple concurrent
+       # run issues. The lock will be dropped on program exit.
+       if (! -d "$config{srcdir}/.ikiwiki") {
+               mkdir("$config{srcdir}/.ikiwiki");
+       }
+       open(WIKILOCK, ">$config{srcdir}/.ikiwiki/lockfile") || error ("cannot write to lockfile: $!");
+       if (! flock(WIKILOCK, 2 | 4)) {
+               debug("wiki seems to be locked, waiting for lock");
+               my $wait=600; # arbitrary, but don't hang forever to 
+                             # prevent process pileup
+               for (1..600) {
+                       return if flock(WIKILOCK, 2 | 4);
+                       sleep 1;
+               }
+               error("wiki is locked; waited $wait seconds without lock being freed (possible stuck process or stale lock?)");
+       }
+} #}}}
+
 sub loadindex () { #{{{
        open (IN, "$config{srcdir}/.ikiwiki/index") || return;
        while (<IN>) {
@@ -485,7 +504,7 @@ sub rcs_recentchanges ($) { #{{{
                my $infoline=qr/^r(\d+)\s+\|\s+([^\s]+)\s+\|\s+(\d+-\d+-\d+\s+\d+:\d+:\d+\s+[-+]?\d+).*/;
                my $state='start';
                my ($rev, $user, $when, @pages, @message);
-               foreach (`LANG=C svn log -v '$svn_url'`) {
+               foreach (`LANG=C svn log --limit $num -v '$svn_url'`) {
                        chomp;
                        if ($state eq 'start' && /$div/) {
                                $state='header';
@@ -525,7 +544,7 @@ sub rcs_recentchanges ($) { #{{{
                                @pages=@message=();
                        }
                        elsif ($state eq 'body') {
-                               push @message, {line => $_},
+                               push @message, {line => escapeHTML($_)},
                        }
                }
        }
@@ -557,7 +576,7 @@ sub refresh () { #{{{
                                $File::Find::prune=1;
                                use warnings "all";
                        }
-                       elsif (! -d $_) {
+                       elsif (! -d $_ && ! -l $_) {
                                my ($f)=/$config{wiki_file_regexp}/; # untaint
                                if (! defined $f) {
                                        warn("skipping bad filename $_\n");
@@ -1172,6 +1191,7 @@ sub setup () { # {{{
 } #}}}
 
 # main {{{
+lockwiki();
 setup() if $config{setup};
 if ($config{wrapper}) {
        gen_wrapper(%config);