X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/49e0841ad5f36adbbc1291488d8e34ef550d0df9..146f1d9ab546ffc4aebef79340c6691720513f46:/IkiWiki/Render.pm diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm index 57418f2ed..e8ed627a4 100644 --- a/IkiWiki/Render.pm +++ b/IkiWiki/Render.pm @@ -6,7 +6,7 @@ use warnings; use strict; use IkiWiki; -my (%backlinks, %rendered); +my (%backlinks, %rendered, %scanned); our %brokenlinks; my $links_calculated=0; @@ -111,7 +111,7 @@ sub genpage ($$) { } templateactions($template, $page); - my @backlinks=sort { $a->{page} cmp $b->{page} } backlinks($page); + my @backlinks=sort { $a->{page} cmp $b->{page} || $a->{url} cmp $b->{url} } backlinks($page); my ($backlinks, $more_backlinks); if (@backlinks <= $config{numbacklinks} || ! $config{numbacklinks}) { $backlinks=\@backlinks; @@ -134,6 +134,7 @@ sub genpage ($$) { ctime => displaytime($pagectime{$page}, undef, 1), baseurl => baseurl($page), html5 => $config{html5}, + responsive_layout => $config{responsive_layout}, ); run_hooks(pagetemplate => sub { @@ -154,6 +155,8 @@ sub genpage ($$) { sub scan ($) { my $file=shift; + return if ($config{rebuild} && $phase > PHASE_SCAN) || $scanned{$file}; + $scanned{$file}=1; debug(sprintf(gettext("scanning %s"), $file)); @@ -323,6 +326,7 @@ sub find_src_files (;$$$) { $page = pagename($file); if (! exists $pagesources{$page} && file_pruned($file)) { + no warnings 'once'; $File::Find::prune=1; return; } @@ -346,7 +350,7 @@ sub find_src_files (;$$$) { else { push @files, $f; if ($pages{$page}) { - debug(sprintf(gettext("%s has multiple possible source pages"), $page)); + debug(sprintf(gettext("%s has multiple possible source files; one will be chosen at random"), $page)); } $pages{$page}=1; } @@ -395,7 +399,7 @@ sub process_changed_files ($$) { } push @files, $f; if ($pages{$page}) { - debug(sprintf(gettext("%s has multiple possible source pages"), $page)); + debug(sprintf(gettext("%s has multiple possible source files; one will be chosen at random"), $page)); } $pages{$page}=1; } @@ -471,7 +475,12 @@ sub find_new_files ($) { } $pagecase{lc $page}=$page; if (! exists $pagectime{$page}) { - $pagectime{$page}=(srcfile_stat($file))[10]; + my @stat=srcfile_stat($file, 1); + # For the creation time of the page, take the + # inode change time (not creation time!) or + # the modification time, whichever is older. + my $ctime=($stat[10] < $stat[9] ? $stat[10] : $stat[9]); + $pagectime{$page}=$ctime if defined $ctime; } } } @@ -531,10 +540,11 @@ sub find_changed ($) { my @internal_changed; foreach my $file (@$files) { my $page=pagename($file); - my ($srcfile, @stat)=srcfile_stat($file); - if (! exists $pagemtime{$page} || - $stat[9] > $pagemtime{$page} || - $forcerebuild{$page}) { + my ($srcfile, @stat)=srcfile_stat($file, 1); + if (defined $srcfile && + (! exists $pagemtime{$page} || + $stat[9] > $pagemtime{$page} || + $forcerebuild{$page})) { $pagemtime{$page}=$stat[9]; if (isinternal($page)) { @@ -824,17 +834,16 @@ sub gen_autofile ($$$) { return 1; } -sub want_find_changes { - $config{only_committed_changes} && - exists $IkiWiki::hooks{rcs}{rcs_find_changes} && - exists $IkiWiki::hooks{rcs}{rcs_get_current_rev} -} - sub refresh () { + $phase = PHASE_SCAN; + srcdir_check(); run_hooks(refresh => sub { shift->() }); my ($files, $pages, $new, $internal_new, $del, $internal_del, $changed, $internal_changed); - if (! $config{rebuild} && want_find_changes() && defined $IkiWiki::lastrev && length $IkiWiki::lastrev) { + my $want_find_changes=$config{only_committed_changes} && + exists $IkiWiki::hooks{rcs}{rcs_find_changes} && + exists $IkiWiki::hooks{rcs}{rcs_get_current_rev}; + if (! $config{rebuild} && $want_find_changes && defined $IkiWiki::lastrev && length $IkiWiki::lastrev) { my ($changed_raw, $del_raw); ($changed_raw, $del_raw, $IkiWiki::lastrev) = $IkiWiki::hooks{rcs}{rcs_find_changes}{call}->($IkiWiki::lastrev); ($files, $pages)=process_changed_files($changed_raw, $del_raw); @@ -842,7 +851,7 @@ sub refresh () { else { ($files, $pages)=find_src_files(); } - if (want_find_changes()) { + if ($want_find_changes) { if (! defined($IkiWiki::lastrev) || ! length $IkiWiki::lastrev) { $IkiWiki::lastrev=$IkiWiki::hooks{rcs}{rcs_get_current_rev}{call}->(); } @@ -879,7 +888,14 @@ sub refresh () { } calculate_links(); - + + # At this point it becomes OK to start matching pagespecs. + $phase = PHASE_RENDER; + # Save some memory in full rebuilds: we no longer need to keep + # track of which pages we've scanned, because we can assume the + # answer is "all of them". + %scanned = () if $config{rebuild}; + remove_del(@$del, @$internal_del); foreach my $file (@$changed) { @@ -943,6 +959,10 @@ sub commandline_render () { loadindex(); unlockwiki(); + # This function behaves as though it's in the render phase; + # all other files are assumed to have been scanned last time. + $phase = PHASE_RENDER; + my $srcfile=possibly_foolish_untaint($config{render}); my $file=$srcfile; $file=~s/\Q$config{srcdir}\E\/?//;