From c72fda7d695142cc29ac986125234140f6414d97 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 7 Oct 2009 19:40:44 -0400 Subject: [PATCH] make success and failreason objects carry an influences hash 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 | 42 +++++++++++++++++++++++------------------- t/pagespec_match.t | 6 +++++- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/IkiWiki.pm b/IkiWiki.pm index 7b1d24c6a..73d2a9763 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -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,37 +2015,41 @@ 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, +); + +our @ISA = 'IkiWiki::SuccessReason'; + +package IkiWiki::SuccessReason; + +use overload ( + '""' => 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::SuccessReason; - -use overload ( - '""' => sub { ${$_[0]} }, - '0+' => sub { 1 }, - '!' => sub { bless $_[0], 'IkiWiki::FailReason'}, - fallback => 1, -); - -sub new { - my $class = shift; - my $value = shift; - return bless \$value, $class; -}; - package IkiWiki::PageSpec; sub derel ($$) { diff --git a/t/pagespec_match.t b/t/pagespec_match.t index 64408f489..a1fcba7c8 100755 --- a/t/pagespec_match.t +++ b/t/pagespec_match.t @@ -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");