summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--IkiWiki.pm29
-rw-r--r--debian/changelog2
-rw-r--r--doc/bugs/conflicts.mdwn2
3 files changed, 31 insertions, 2 deletions
diff --git a/IkiWiki.pm b/IkiWiki.pm
index 85b542486..fa49b2c34 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
@@ -823,6 +823,17 @@ sub prep_writefile ($$) {
if (-l "$destdir/$test") {
error("cannot write to a symlink ($test)");
}
+ if (-f _ && $test ne $file) {
+ # Remove conflicting file.
+ foreach my $p (keys %renderedfiles, keys %oldrenderedfiles) {
+ foreach my $f (@{$renderedfiles{$p}}, @{$oldrenderedfiles{$p}}) {
+ if ($f eq $test) {
+ unlink("$destdir/$test");
+ last;
+ }
+ }
+ }
+ }
$test=dirname($test);
}
@@ -876,11 +887,12 @@ sub will_render ($$;$) {
my $dest=shift;
my $clear=shift;
- # Important security check.
+ # Important security check for independently created files.
if (-e "$config{destdir}/$dest" && ! $config{rebuild} &&
! grep { $_ eq $dest } (@{$renderedfiles{$page}}, @{$oldrenderedfiles{$page}}, @{$wikistate{editpage}{previews}})) {
my $from_other_page=0;
- foreach my $p (keys %renderedfiles) {
+ # Expensive, but rarely runs.
+ foreach my $p (keys %renderedfiles, keys %oldrenderedfiles) {
if (grep {
$_ eq $dest ||
dirname($_) eq $dest
@@ -894,6 +906,19 @@ sub will_render ($$;$) {
unless $from_other_page;
}
+ # If $dest exists as a directory, remove conflicting files in it
+ # rendered from other pages.
+ if (-d _) {
+ foreach my $p (keys %renderedfiles, keys %oldrenderedfiles) {
+ foreach my $f (@{$renderedfiles{$p}}, @{$oldrenderedfiles{$p}}) {
+ if ($f eq dirname($dest) || dirname($f) eq $dest) {
+ unlink("$config{destdir}/$f");
+ rmdir(dirname("$config{destdir}/$f"));
+ }
+ }
+ }
+ }
+
if (! $clear || $cleared{$page}) {
$renderedfiles{$page}=[$dest, grep { $_ ne $dest } @{$renderedfiles{$page}}];
}
diff --git a/debian/changelog b/debian/changelog
index bb9a43692..21b5d01fa 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -18,6 +18,8 @@ ikiwiki (3.20100705) UNRELEASED; urgency=low
* po: needstranslation() pagespec can have a percent specified.
* Drop Cache-Control must-revalidate (Firefox 3.5.10 does not seem to have
the caching problem that was added to work around). Closes: #588623
+ * Made much more robust in cases where multiple source files produce
+ conflicting files/directories in the destdir.
-- Joey Hess <joeyh@debian.org> Mon, 05 Jul 2010 13:59:42 -0400
diff --git a/doc/bugs/conflicts.mdwn b/doc/bugs/conflicts.mdwn
index a67450290..bef0f54cd 100644
--- a/doc/bugs/conflicts.mdwn
+++ b/doc/bugs/conflicts.mdwn
@@ -28,3 +28,5 @@ destination file is rendered by multiple pages. Or when one page renders
a file that is a parent directory of the rendered file of another page.
It could warn, rather than erroring. The last page rendered would "win";
generating the destdir file.
+
+[[done]]