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.master
parent
0cb08c9a4b
commit
f2b3d13414
21
IkiWiki.pm
21
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 ($$;@) {
|
||||
|
|
|
@ -294,11 +294,11 @@ sub match {
|
|||
return IkiWiki::SuccessReason->new("$re matches $field of $page", $page => $IkiWiki::DEPEND_CONTENT);
|
||||
}
|
||||
else {
|
||||
return IkiWiki::FailReason->new("$re does not match $field of $page", $page => $IkiWiki::DEPEND_CONTENT);
|
||||
return IkiWiki::FailReason->new("$re does not match $field of $page");
|
||||
}
|
||||
}
|
||||
else {
|
||||
return IkiWiki::FailReason->new("$page does not have a $field", $page => $IkiWiki::DEPEND_CONTENT);
|
||||
return IkiWiki::FailReason->new("$page does not have a $field");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue