+}
+
+sub refresh () {
+ srcdir_check();
+ run_hooks(refresh => sub { shift->() });
+ @files=@{find_src_files()};
+ process_new_files();
+ process_del_files();
+
+ my @needsbuild=find_needsbuild();
+ run_hooks(needsbuild => sub { shift->(\@needsbuild) });
+
+ foreach my $file (@needsbuild, @del) {
+ calculate_old_links($file);
+ }
+
+ foreach my $file (@needsbuild) {
+ scan($file);
+ }
+
+ calculate_links();
+
+ foreach my $file (@needsbuild) {
+ render($file, sprintf(gettext("building %s"), $file));
+ }
+ foreach my $file (@internal, @internal_change) {
+ derender_internal($file);
+ }
+
+ foreach my $file (@needsbuild, @del) {
+ calculate_changed_links($file);
+ }
+
+ foreach my $file (@new, @del) {
+ render_linkers($file);
+ }
+
+ if (@needsbuild || @del || @internal || @internal_change) {
+ 1 while render_dependent();
+ }
+
+ render_backlinks();
+ remove_unrendered();
+
+ if (@del) {
+ run_hooks(delete => sub { shift->(@del) });
+ }
+ if (%rendered) {
+ run_hooks(change => sub { shift->(keys %rendered) });
+ }
+}
+
+sub commandline_render () {
+ lockwiki();
+ loadindex();
+ unlockwiki();
+
+ my $srcfile=possibly_foolish_untaint($config{render});
+ my $file=$srcfile;
+ $file=~s/\Q$config{srcdir}\E\/?//;
+
+ my $type=pagetype($file);
+ die sprintf(gettext("ikiwiki: cannot build %s"), $srcfile)."\n" unless defined $type;
+ my $content=readfile($srcfile);
+ my $page=pagename($file);
+ $pagesources{$page}=$file;
+ $content=filter($page, $page, $content);
+ $content=preprocess($page, $page, $content);
+ $content=linkify($page, $page, $content);
+ $content=htmlize($page, $page, $type, $content);
+ $pagemtime{$page}=(stat($srcfile))[9];
+ $pagectime{$page}=$pagemtime{$page} if ! exists $pagectime{$page};
+
+ print genpage($page, $content);
+ exit 0;
+}