make success and failreason objects carry an influences hash
authorJoey Hess <joey@gnu.kitenet.net>
Wed, 7 Oct 2009 23:40:44 +0000 (19:40 -0400)
committerJoey Hess <joey@gnu.kitenet.net>
Wed, 7 Oct 2009 23:59:26 +0000 (19:59 -0400)
The hash will be used used to record a set of pages that influenced the
result of a pagespec match.

The influences are merged together when boolean and/or are encountered
in a pagespec. That means using a non-short-circuiting OR operator. And
so I use & and | when translating pagespecs, since those bitwise operators
can be overloaded. ("and" and "or" cannot, apparently).

IkiWiki.pm
t/pagespec_match.t

index 7b1d24c6a2214d14543aadcbbadde9767a15af52..73d2a9763107cfe918c17d6dbc27945b22a222f0 100644 (file)
@@ -1926,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;
@@ -2015,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;
 
index 64408f4898cb8b0671ba24fb7f2f8433e87dacae..a1fcba7c89353f8411fd91252a1216c13e1516b0 100755 (executable)
@@ -1,7 +1,7 @@
 #!/usr/bin/perl
 use warnings;
 use strict;
-use Test::More tests => 54;
+use Test::More tests => 56;
 
 BEGIN { use_ok("IkiWiki"); }
 
@@ -88,3 +88,7 @@ ok(! pagespec_match("foo", "no_such_function(foo)"), "foo");
 my $ret=pagespec_match("foo", "(invalid");
 ok(! $ret, "syntax error");
 ok($ret =~ /syntax error/, "error message");
+
+my $ret=pagespec_match("foo", "bar or foo");
+ok($ret, "simple match");
+is($ret, "foo matches foo", "stringified return");