aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Hess <joey@gnu.kitenet.net>2009-10-06 18:09:46 -0400
committerJoey Hess <joey@gnu.kitenet.net>2009-10-06 18:09:46 -0400
commitba1dfb4ec665f95b4f4217360e08109bcbf7f41b (patch)
treee81c07532cee90e9bd686ba661249fea9866e50a
parentaf85f62d6fd7c3b437fa527bff3392616d3513dc (diff)
downloadikiwiki-ba1dfb4ec665f95b4f4217360e08109bcbf7f41b.tar
ikiwiki-ba1dfb4ec665f95b4f4217360e08109bcbf7f41b.tar.gz
fix support of a single dependency that combines links and exists types
This is very common, and the code has to test each type differently, since the list of candidates to test, as well as the test, will vary per type. Much happier with this code now.
-rw-r--r--IkiWiki/Render.pm65
1 files changed, 40 insertions, 25 deletions
diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm
index e86314107..8f9cbf673 100644
--- a/IkiWiki/Render.pm
+++ b/IkiWiki/Render.pm
@@ -545,38 +545,53 @@ sub render_dependent ($$$$$$$) {
}
if (exists $depends{$p} && ! defined $reason) {
- D: foreach my $d (keys %{$depends{$p}}) {
- my $sub=pagespec_translate($d);
+ foreach my $dep (keys %{$depends{$p}}) {
+ my $sub=pagespec_translate($dep);
next if $@ || ! defined $sub;
# only consider internal files
# if the page explicitly depends
# on such files
- my $internal_dep=$d =~ /internal\(/;
-
- my @candidates;
- if ($depends{$p}{$d} & $IkiWiki::DEPEND_PRESENCE) {
- @candidates=@exists_changed;
- push @candidates, @$internal_new, @$internal_del
- if $internal_dep;
- }
- if (($depends{$p}{$d} & ($IkiWiki::DEPEND_CONTENT | $IkiWiki::DEPEND_LINKS))) {
- @candidates=@changed;
- push @candidates, @$internal_new, @$internal_del, @$internal_changed
- if $internal_dep;
- }
-
- foreach my $file (@candidates) {
- next if $file eq $f;
- my $page=pagename($file);
- if ($sub->($page, location => $p)) {
- if ($depends{$p}{$d} & $IkiWiki::DEPEND_LINKS &&
- ! $depends{$p}{$d} & $IkiWiki::DEPEND_CONTENT) {
- next unless $linkchangers->{lc($page)};
+ my $internal_dep=$dep =~ /internal\(/;
+
+ my $in=sub {
+ my $list=shift;
+ my $type=shift;
+ foreach my $file ($list) {
+ next if $file eq $f;
+ my $page=pagename($file);
+ if ($sub->($page, location => $p)) {
+ if ($type == $IkiWiki::DEPEND_LINKS) {
+ next unless $linkchangers->{lc($page)};
+ }
+ return $page;
}
- $reason = $page;
- last D;
}
+ return undef;
+ };
+
+ if ($depends{$p}{$dep} & $IkiWiki::DEPEND_CONTENT) {
+ last if $reason =
+ $in->(\@changed, $IkiWiki::DEPEND_CONTENT);
+ last if $internal_dep && ($reason =
+ $in->($internal_new, $IkiWiki::DEPEND_CONTENT) ||
+ $in->($internal_del, $IkiWiki::DEPEND_CONTENT) ||
+ $in->($internal_changed, $IkiWiki::DEPEND_CONTENT));
+ }
+ if ($depends{$p}{$dep} & $IkiWiki::DEPEND_PRESENCE) {
+ last if $reason =
+ $in->(\@exists_changed, $IkiWiki::DEPEND_PRESENCE);
+ last if $internal_dep && ($reason =
+ $in->($internal_new, $IkiWiki::DEPEND_PRESENCE) ||
+ $in->($internal_del, $IkiWiki::DEPEND_PRESENCE));
+ }
+ if ($depends{$p}{$dep} & $IkiWiki::DEPEND_LINKS) {
+ last if $reason =
+ $in->(\@changed, $IkiWiki::DEPEND_LINKS);
+ last if $internal_dep && ($reason =
+ $in->($internal_new, $IkiWiki::DEPEND_LINKS) ||
+ $in->($internal_del, $IkiWiki::DEPEND_LINKS) ||
+ $in->($internal_changed, $IkiWiki::DEPEND_LINKS));
}
}
}