From f2b3d1341447cbf29189ab490daae418fbe5d02d Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 8 Oct 2009 13:38:46 -0400 Subject: fix handling of influences of pagespecs that fail to match If a pagespec fails to match, I had been throwing the influences away, but that is not right. Consider `backlink(foo)`, where foo does not exist. It still needs to be added as an influence, because if it is created, it will influence the pagespec to match. But with that fix, `link(bar)` had as influences all pages, whether they link to bar or not. Which is not necessary, because modifiying a page to add a link to bar will directly cause the pagespec to match. So, in match_link (and all the match_* functions for page metadata), only return an influence if the match succeeds. match_backlink had been implemented as the inverse of match_link, but that is no longer completly true. While match_link does not return an influence on failure, match_backlink does. match_created_before/after also return the influence on failure, this way if created_after(foo) currently fails because foo does not exist, it will still update the page with the pagespec if foo is created. --- IkiWiki.pm | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'IkiWiki.pm') diff --git a/IkiWiki.pm b/IkiWiki.pm index c250d50ad..2064c881a 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -1789,13 +1789,12 @@ sub add_depends ($$;@) { } # Analyse the pagespec, and match it against all pages - # to get a list of influences, and add explicit - # content dependencies for those. + # to get a list of influences, and add explicit dependencies + # for those. my $sub=pagespec_translate($pagespec); return if $@; foreach my $p (keys %pagesources) { my $r=$sub->($p, location => $page ); - next unless $r; my %i=$r->influences; foreach my $i (keys %i) { $depends_simple{$page}{lc $i} |= $i{$i}; @@ -2026,7 +2025,13 @@ sub new { } sub influences { - return %{$_[0][1]}; + my $this=shift; + if (! @_) { + return %{$this->[1]}; + } + else { + $this->[1]={@_}; + } } sub merge_influences { @@ -2090,7 +2095,7 @@ sub match_link ($$;@) { my $from=exists $params{location} ? $params{location} : ''; my $links = $IkiWiki::links{$page}; - return IkiWiki::FailReason->new("$page has no links", $page => $IkiWiki::DEPEND_LINKS) + return IkiWiki::FailReason->new("$page has no links") unless $links && @{$links}; my $bestlink = IkiWiki::bestlink($from, $link); foreach my $p (@{$links}) { @@ -2107,11 +2112,13 @@ sub match_link ($$;@) { if match_glob($p_rel, $link, %params); } } - return IkiWiki::FailReason->new("$page does not link to $link", $page => $IkiWiki::DEPEND_LINKS); + return IkiWiki::FailReason->new("$page does not link to $link"); } sub match_backlink ($$;@) { - return match_link($_[1], $_[0], @_); + my $ret=match_link($_[1], $_[0], @_); + $ret->influences($_[1] => $IkiWiki::DEPEND_LINKS); + return $ret; } sub match_created_before ($$;@) { -- cgit v1.2.3