X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/0a52e8fd82d80bdd1290f49c3187d3f72db39c75..c868d08aeb6ffabecf88079753530d9801a3fef3:/ikiwiki?ds=sidebyside diff --git a/ikiwiki b/ikiwiki index dd4177800..cb90ef04f 100755 --- 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 () { @@ -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);