]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki.pm
make success and failreason objects carry an influences hash
[ikiwiki.git] / IkiWiki.pm
index b895e12fc0a924fac01a6ef1b10d58e02dbdb003..73d2a9763107cfe918c17d6dbc27945b22a222f0 100644 (file)
@@ -1536,7 +1536,7 @@ sub loadindex () {
                                };
                        }
                        elsif (exists $d->{depends_simple}) {
-                               $depends{$page}=$d->{depends_simple};
+                               $depends_simple{$page}=$d->{depends_simple};
                        }
                        if (exists $d->{dependslist}) {
                                # old format
@@ -1776,22 +1776,41 @@ sub add_depends ($$;@) {
        my $simple=$pagespec =~ /$config{wiki_file_regexp}/ &&
                $pagespec !~ /[\s*?()!]/;
 
-       my $deptype=$DEPEND_CONTENT;
+       my $deptype=0;
        if (@_) {
                my %params=@_;
                
-               # Is the pagespec limited to terms that will continue
-               # to match pages as long as those pages exist?
-               my $limited=1;
-               while ($limited && $pagespec=~m/(\w+)\([^\)]*\)/g) {
-                       $limited = $1 =~ /^(glob|internal|creation_month|creation_day|creation_year|created_before|created_after)$/;
+               if ($params{presence}) {
+                       # Is the pagespec limited to terms that will continue
+                       # to match pages as long as those pages exist?
+                       my $presence_limited=1;
+                       while ($presence_limited && $pagespec=~m/(\w+)\([^\)]*\)/g) {
+                               $presence_limited = $1 =~ /^(glob|internal|creation_month|creation_day|creation_year|created_before|created_after)$/;
+                       }
+                       if ($presence_limited) {
+                               $deptype=$deptype | $DEPEND_PRESENCE;
+                       }
+                       else {
+                               $deptype=$deptype | $DEPEND_CONTENT;
+                       }
+               }
+               if ($params{links}) {
+                       # Is the pagespec limited to terms that will continue
+                       # to match pages as long as those pages exist and
+                       # link to the same places?
+                       my $links_limited=1;
+                       while ($links_limited && $pagespec=~m/(\w+)\([^\)]*\)/g) {
+                               $links_limited = $1 =~ /^(glob|internal|creation_month|creation_day|creation_year|created_before|created_after|backlink)$/;
+                       }
+                       if ($links_limited) {
+                               $deptype=$deptype | $DEPEND_LINKS;
+                       }
+                       else {
+                               $deptype=$deptype | $DEPEND_CONTENT;
+                       }
                }
-
-               $deptype=$deptype & ~$DEPEND_CONTENT | $DEPEND_PRESENCE
-                       if $params{presence} && $limited;
-               $deptype=$deptype & ~$DEPEND_CONTENT | $DEPEND_LINKS
-                       if $params{links} && $limited;
        }
+       $deptype=$DEPEND_CONTENT unless $deptype;
 
        if ($simple) {
                $depends_simple{$page}{lc $pagespec} |= $deptype;
@@ -1907,10 +1926,10 @@ sub pagespec_translate ($) {
        }gx) {
                my $word=$1;
                if (lc $word eq 'and') {
-                       $code.=' &&';
+                       $code.=' &';
                }
                elsif (lc $word eq 'or') {
-                       $code.=' ||';
+                       $code.=' |';
                }
                elsif ($word eq "(" || $word eq ")" || $word eq "!") {
                        $code.=' '.$word;
@@ -1996,36 +2015,40 @@ sub glob2re ($) {
 package IkiWiki::FailReason;
 
 use overload (
-       '""'    => sub { ${$_[0]} },
+       '""'    => sub { $_[0][0] },
        '0+'    => sub { 0 },
        '!'     => sub { bless $_[0], 'IkiWiki::SuccessReason'},
+       '&'     => sub { $_[0][1]={%{$_[0][1]}, %{$_[1][1]}}; $_[0] },
+       '|'     => sub { $_[1][1]={%{$_[0][1]}, %{$_[1][1]}}; $_[1] },
        fallback => 1,
 );
 
-sub new {
-       my $class = shift;
-       my $value = shift;
-       return bless \$value, $class;
-}
-
-package IkiWiki::ErrorReason;
-
-our @ISA = 'IkiWiki::FailReason';
+our @ISA = 'IkiWiki::SuccessReason';
 
 package IkiWiki::SuccessReason;
 
 use overload (
-       '""'    => sub { ${$_[0]} },
+       '""'    => sub { $_[0][0] },
        '0+'    => sub { 1 },
        '!'     => sub { bless $_[0], 'IkiWiki::FailReason'},
+       '&'     => sub { $_[1][1]={%{$_[0][1]}, %{$_[1][1]}}; $_[1] },
+       '|'     => sub { $_[0][1]={%{$_[0][1]}, %{$_[1][1]}}; $_[0] },
        fallback => 1,
 );
 
 sub new {
        my $class = shift;
        my $value = shift;
-       return bless \$value, $class;
-};
+       return bless [$value, {@_}], $class;
+}
+
+sub influences {
+       return keys %{$_[0][1]};
+}
+
+package IkiWiki::ErrorReason;
+
+our @ISA = 'IkiWiki::FailReason';
 
 package IkiWiki::PageSpec;