X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/d68d25526816d40048ca47ad360304bce162b659..a97f508bb5b06597168e3f24765c76e7e64618b4:/IkiWiki/Render.pm?ds=sidebyside

diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm
index 98aab8204..a90d202ee 100644
--- a/IkiWiki/Render.pm
+++ b/IkiWiki/Render.pm
@@ -262,12 +262,13 @@ sub render ($$) {
 	}
 }
 
-sub prune ($) {
+sub prune ($;$) {
 	my $file=shift;
+	my $up_to=shift;
 
 	unlink($file);
 	my $dir=dirname($file);
-	while (rmdir($dir)) {
+	while ((! defined $up_to || $dir =~ m{^\Q$up_to\E\/}) && rmdir($dir)) {
 		$dir=dirname($dir);
 	}
 }
@@ -447,7 +448,7 @@ sub remove_del (@) {
 		}
 	
 		foreach my $old (@{$oldrenderedfiles{$page}}) {
-			prune($config{destdir}."/".$old);
+			prune($config{destdir}."/".$old, $config{destdir});
 		}
 
 		foreach my $source (keys %destsources) {
@@ -537,7 +538,7 @@ sub remove_unrendered () {
 		foreach my $file (@{$oldrenderedfiles{$page}}) {
 			if (! grep { $_ eq $file } @{$renderedfiles{$page}}) {
 				debug(sprintf(gettext("removing %s, no longer built by %s"), $file, $page));
-				prune($config{destdir}."/".$file);
+				prune($config{destdir}."/".$file, $config{destdir});
 			}
 		}
 	}
@@ -832,10 +833,10 @@ sub refresh () {
 		run_hooks(rendered => sub { shift->(keys %rendered) });
 		run_hooks(change => sub { shift->(keys %rendered) }); # back-compat
 	}
-	run_hooks(difference => sub {
-		shift->(@$new, @$changed, @$del,
-			@$internal_new, @$internal_changed, @$internal_del);
-	});
+	my %all_changed = map { $_ => 1 }
+		@$new, @$changed, @$del,
+		@$internal_new, @$internal_changed, @$internal_del;
+	run_hooks(changes => sub { shift->(keys %all_changed) });
 }
 
 sub clean_rendered {
@@ -844,7 +845,7 @@ sub clean_rendered {
 	remove_unrendered();
 	foreach my $page (keys %oldrenderedfiles) {
 		foreach my $file (@{$oldrenderedfiles{$page}}) {
-			prune($config{destdir}."/".$file);
+			prune($config{destdir}."/".$file, $config{destdir});
 		}
 	}
 }