]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki.pm
Merge branch 'master' into dependency-types
[ikiwiki.git] / IkiWiki.pm
index f959d868b1e659926577874b1404545184037182..cd93fe969de8a38b4356ad041ba7c1cf6de3b801 100644 (file)
@@ -1780,19 +1780,17 @@ sub add_depends ($$;$) {
                return 1;
        }
 
-       # Analyse the pagespec, and match it against all pages
-       # 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 );
-       #       my %i=$r->influences;
-       #       foreach my $i (keys %i) {
-       #               $depends_simple{$page}{lc $i} |= $i{$i};
-       #       }
-       #}
-       print STDERR "warning: use of add_depends by ".caller()."; influences not tracked\n";
+       # Add explicit dependencies for influences.
+       my $sub=pagespec_translate($pagespec);
+       return if $@;
+       foreach my $p (keys %pagesources) {
+               my $r=$sub->($p, location => $page);
+               my $i=$r->influences;
+               foreach my $k (keys %$i) {
+                       $depends_simple{$page}{lc $k} |= $i->{$k};
+               }
+               last if $r->influences_static;
+       }
 
        $depends{$page}{$pagespec} |= $deptype;
        return 1;
@@ -1986,11 +1984,15 @@ sub pagespec_match_list ($$;@) {
                if $@ || ! defined $sub;
 
        my @candidates;
-       if (exists $params{limit}) {
-               @candidates=grep { $params{limit}->($_) } keys %pagesources;
+       if (exists $params{list}) {
+               @candidates=exists $params{filter}
+                       ? grep { ! $params{filter}->($_) } @{$params{list}}
+                       : @{$params{list}};
        }
        else {
-               @candidates=keys %pagesources;
+               @candidates=exists $params{filter}
+                       ? grep { ! $params{filter}->($_) } keys %pagesources
+                       : keys %pagesources;
        }
 
        if (defined $params{sort}) {
@@ -2023,46 +2025,30 @@ sub pagespec_match_list ($$;@) {
        
        # clear params, remainder is passed to pagespec
        my $num=$params{num};
-       delete @params{qw{num deptype reverse sort limit}};
+       delete @params{qw{num deptype reverse sort filter list}};
        
        my @matches;
        my $firstfail;
        my $count=0;
+       my $accum=IkiWiki::SuccessReason->new();
        foreach my $p (@candidates) {
                my $r=$sub->($p, %params, location => $page);
+               error(sprintf(gettext("cannot match pages: %s"), $r))
+                       if $r->isa("IkiWiki::ErrorReason");
+               $accum |= $r;
                if ($r) {
-                       push @matches, [$p, $r];
+                       push @matches, $p;
                        last if defined $num && ++$count == $num;
                }
-               elsif (! defined $firstfail) {
-                       $firstfail=$r;
-               }
-       }
-
-       my @ret;
-       if (@matches) {
-               # Add all influences from successful matches.
-               foreach my $m (@matches) {
-                       push @ret, $m->[0];
-                       my %i=$m->[1]->influences;
-                       foreach my $i (keys %i) {
-                               $depends_simple{$page}{lc $i} |= $i{$i};
-                       }
-               }
        }
-       elsif (defined $firstfail) {
-               # Add influences from one failure. (Which one should not
-               # matter; all should have the same influences.)
-               my %i=$firstfail->influences;
-               foreach my $i (keys %i) {
-                       $depends_simple{$page}{lc $i} |= $i{$i};
-               }
 
-               error(sprintf(gettext("cannot match pages: %s"), $firstfail))
-                       if $firstfail->isa("IkiWiki::ErrorReason");
+       # Add simple dependencies for accumulated influences.
+       my $i=$accum->influences;
+       foreach my $k (keys %$i) {
+               $depends_simple{$page}{lc $k} |= $i->{$k};
        }
 
-       return @ret;
+       return @matches;
 }
 
 sub pagespec_valid ($) {
@@ -2111,12 +2097,14 @@ sub new {
 
 sub influences {
        my $this=shift;
-       if (! @_) {
-               return %{$this->[1]};
-       }
-       else {
-               $this->[1]={@_};
-       }
+       $this->[1]={@_} if @_;
+       my %i=%{$this->[1]};
+       delete $i{""};
+       return \%i;
+}
+
+sub influences_static {
+       return ! $_[0][1]->{""};
 }
 
 sub merge_influences {
@@ -2185,19 +2173,19 @@ sub match_link ($$;@) {
        my $bestlink = IkiWiki::bestlink($from, $link);
        foreach my $p (@{$links}) {
                if (length $bestlink) {
-                       return IkiWiki::SuccessReason->new("$page links to $link", $page => $IkiWiki::DEPEND_LINKS)
+                       return IkiWiki::SuccessReason->new("$page links to $link", $page => $IkiWiki::DEPEND_LINKS, "" => 1)
                                if $bestlink eq IkiWiki::bestlink($page, $p);
                }
                else {
-                       return IkiWiki::SuccessReason->new("$page links to page $p matching $link", $page => $IkiWiki::DEPEND_LINKS)
+                       return IkiWiki::SuccessReason->new("$page links to page $p matching $link", $page => $IkiWiki::DEPEND_LINKS, "" => 1)
                                if match_glob($p, $link, %params);
                        my ($p_rel)=$p=~/^\/?(.*)/;
                        $link=~s/^\///;
-                       return IkiWiki::SuccessReason->new("$page links to page $p_rel matching $link", $page => $IkiWiki::DEPEND_LINKS)
+                       return IkiWiki::SuccessReason->new("$page links to page $p_rel matching $link", $page => $IkiWiki::DEPEND_LINKS, "" => 1)
                                if match_glob($p_rel, $link, %params);
                }
        }
-       return IkiWiki::FailReason->new("$page does not link to $link");
+       return IkiWiki::FailReason->new("$page does not link to $link", "" => 1);
 }
 
 sub match_backlink ($$;@) {