X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/6d01db205f41f16755fe7fbe49694b3bba2121c8..a97f508bb5b06597168e3f24765c76e7e64618b4:/IkiWiki/Render.pm

diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm
index 05132a8a8..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});
 			}
 		}
 	}
@@ -800,6 +801,14 @@ sub refresh () {
 		derender_internal($file);
 	}
 
+	run_hooks(build_affected => sub {
+		my %affected = shift->();
+		while (my ($page, $message) = each %affected) {
+			next unless exists $pagesources{$page};
+			render($pagesources{$page}, $message);
+		}
+	});
+
 	my ($backlinkchanged, $linkchangers)=calculate_changed_links($changed,
 		$del, $oldlink_targets);
 
@@ -821,8 +830,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 {
@@ -831,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});
 		}
 	}
 }