X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/23be8e3843eae94bb1ead23c62901c1d730a36c2..3b53e11288b584a4c793cd2f3370c3dae881eb50:/IkiWiki/Render.pm

diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm
index adb39a983..58b374ad7 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});
 			}
 		}
 	}
@@ -769,9 +770,17 @@ sub refresh () {
 	my ($new, $internal_new)=find_new_files($files);
 	my ($del, $internal_del)=find_del_files($pages);
 	my ($changed, $internal_changed)=find_changed($files);
+	my %existingfiles;
 	run_hooks(needsbuild => sub {
 		my $ret=shift->($changed, [@$del, @$internal_del]);
-		$changed=$ret if ref $ret eq 'ARRAY';
+		if (ref $ret eq 'ARRAY' && $ret != $changed) {
+			if (! %existingfiles) {
+				foreach my $f (@$files) {
+					$existingfiles{$f}=1;
+				}
+			}
+			@$changed=grep $existingfiles{$_}, @$ret;
+		}
 	});
 	my $oldlink_targets=calculate_old_links($changed, $del);
 
@@ -829,8 +838,13 @@ sub refresh () {
 		run_hooks(delete => sub { shift->(@$del, @$internal_del) });
 	}
 	if (%rendered) {
-		run_hooks(change => sub { shift->(keys %rendered) });
+		run_hooks(rendered => sub { shift->(keys %rendered) });
+		run_hooks(change => sub { shift->(keys %rendered) }); # back-compat
 	}
+	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 {
@@ -839,7 +853,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});
 		}
 	}
 }