aboutsummaryrefslogtreecommitdiff
path: root/IkiWiki.pm
diff options
context:
space:
mode:
authorSimon McVittie <smcv@ http://smcv.pseudorandom.co.uk/>2009-06-18 15:54:53 +0100
committerSimon McVittie <smcv@ http://smcv.pseudorandom.co.uk/>2009-08-24 23:18:10 +0100
commitfe4f176f725b069ac74561600bba982c2d9ad607 (patch)
treef450ae4642b4c28d82f23aeb488c63f92ec54b5f /IkiWiki.pm
parentcc665380e3c9998ef04f1e42320cecd152ffd23c (diff)
downloadikiwiki-fe4f176f725b069ac74561600bba982c2d9ad607.tar
ikiwiki-fe4f176f725b069ac74561600bba982c2d9ad607.tar.gz
Optimize the dependencies list
On a large wiki you can spend a lot of time reading through large lists of dependencies to see whether files need to be rebuilt (album, with its one-page-per-photo arrangement, suffers particularly badly from this). The dependency list is currently a single pagespec, but it's not used like a normal pagespec - in practice, it's a list of pagespecs joined with the "or" operator. Accordingly, change it to be stored as a list of pagespecs. On a wiki with many tagged photo albums, this reduces the time to refresh after `touch tags/*.mdwn` from about 31 to 25 seconds. Getting the benefit of this change on an existing wiki requires a rebuild.
Diffstat (limited to 'IkiWiki.pm')
-rw-r--r--IkiWiki.pm19
1 files changed, 13 insertions, 6 deletions
diff --git a/IkiWiki.pm b/IkiWiki.pm
index 43ffb1fd8..3e94c8a25 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
@@ -1507,8 +1507,11 @@ sub loadindex () {
$links{$page}=$d->{links};
$oldlinks{$page}=[@{$d->{links}}];
}
- if (exists $d->{depends}) {
- $depends{$page}=$d->{depends};
+ if (exists $d->{dependslist}) {
+ $depends{$page}=$d->{dependslist};
+ }
+ elsif (exists $d->{depends}) {
+ $depends{$page}=[$d->{depends}];
}
if (exists $d->{state}) {
$pagestate{$page}=$d->{state};
@@ -1554,7 +1557,8 @@ sub saveindex () {
};
if (exists $depends{$page}) {
- $index{page}{$src}{depends} = $depends{$page};
+ $index{page}{$src}{depends} = join(" or ", @{$depends{$page}});
+ $index{page}{$src}{dependslist} = $depends{$page};
}
if (exists $pagestate{$page}) {
@@ -1724,14 +1728,17 @@ sub rcs_receive () {
sub add_depends ($$) {
my $page=shift;
my $pagespec=shift;
-
+
return unless pagespec_valid($pagespec);
if (! exists $depends{$page}) {
- $depends{$page}=$pagespec;
+ $depends{$page}=[$pagespec];
}
else {
- $depends{$page}=pagespec_merge($depends{$page}, $pagespec);
+ foreach my $p (@{$depends{$page}}) {
+ return 1 if $p eq $pagespec;
+ }
+ push @{$depends{$page}}, $pagespec;
}
return 1;