diff options
author | Joey Hess <joey@kodama.kitenet.net> | 2008-01-29 15:05:49 -0500 |
---|---|---|
committer | Joey Hess <joey@kodama.kitenet.net> | 2008-01-29 15:05:49 -0500 |
commit | 47ee266163202f15fca3b108fad294bec262405a (patch) | |
tree | e83d75d593b57beaaf6ecd41de7fd5a63903d31e /IkiWiki | |
parent | 2bfd2e984132e5c235be066070c4e5b14d79b775 (diff) | |
download | ikiwiki-47ee266163202f15fca3b108fad294bec262405a.tar ikiwiki-47ee266163202f15fca3b108fad294bec262405a.tar.gz |
improve support for internal pages
This makes it a lot quicker to deal with lots of recentchanges pages
appearing and disappearing. It avoids needing to clutter up pagespecs with
exclusions for those pages, by making normal pagespecs not match them.
Diffstat (limited to 'IkiWiki')
-rw-r--r-- | IkiWiki/Render.pm | 47 |
1 files changed, 37 insertions, 10 deletions
diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm index aa9b73141..b5b461499 100644 --- a/IkiWiki/Render.pm +++ b/IkiWiki/Render.pm @@ -319,15 +319,19 @@ sub refresh () { #{{{ }, $dir); }; - my %rendered; + my (%rendered, @add, @del, @internal); # check for added or removed pages - my @add; foreach my $file (@files) { my $page=pagename($file); $pagesources{$page}=$file; if (! $pagemtime{$page}) { - push @add, $file; + if (isinternal($page)) { + push @internal, $file; + } + else { + push @add, $file; + } $pagecase{lc $page}=$page; if ($config{getctime} && -e "$config{srcdir}/$file") { $pagectime{$page}=rcs_getctime("$config{srcdir}/$file"); @@ -337,11 +341,15 @@ sub refresh () { #{{{ } } } - my @del; foreach my $page (keys %pagemtime) { if (! $exists{$page}) { - debug(sprintf(gettext("removing old page %s"), $page)); - push @del, $pagesources{$page}; + if (isinternal($page)) { + push @internal, $pagesources{$page}; + } + else { + debug(sprintf(gettext("removing old page %s"), $page)); + push @del, $pagesources{$page}; + } $links{$page}=[]; $renderedfiles{$page}=[]; $pagemtime{$page}=0; @@ -366,7 +374,12 @@ sub refresh () { #{{{ $mtime > $pagemtime{$page} || $forcerebuild{$page}) { $pagemtime{$page}=$mtime; - push @needsbuild, $file; + if (isinternal($page)) { + push @internal, $file; + } + else { + push @needsbuild, $file; + } } } run_hooks(needsbuild => sub { shift->(\@needsbuild) }); @@ -382,6 +395,15 @@ sub refresh () { #{{{ render($file); $rendered{$file}=1; } + foreach my $file (@internal) { + # internal pages are not rendered + my $page=pagename($file); + delete $depends{$page}; + foreach my $old (@{$renderedfiles{$page}}) { + delete $destsources{$old}; + } + $renderedfiles{$page}=[]; + } # rebuild pages that link to added or removed pages if (@add || @del) { @@ -397,13 +419,17 @@ sub refresh () { #{{{ } } - if (%rendered || @del) { + if (%rendered || @del || @internal) { + my @changed=(keys %rendered, @del); + # rebuild dependant pages foreach my $f (@files) { next if $rendered{$f}; my $p=pagename($f); if (exists $depends{$p}) { - foreach my $file (keys %rendered, @del) { + # only consider internal files + # if the page explicitly depends on such files + foreach my $file (@changed, $depends{$p}=~/internal\(/ ? @internal : ()) { next if $f eq $file; my $page=pagename($file); if (pagespec_match($page, $depends{$p}, location => $p)) { @@ -419,7 +445,7 @@ sub refresh () { #{{{ # handle backlinks; if a page has added/removed links, # update the pages it links to my %linkchanged; - foreach my $file (keys %rendered, @del) { + foreach my $file (@changed) { my $page=pagename($file); if (exists $links{$page}) { @@ -441,6 +467,7 @@ sub refresh () { #{{{ } } } + foreach my $link (keys %linkchanged) { my $linkfile=$pagesources{$link}; if (defined $linkfile) { |