summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Hess <joey@kitenet.net>2010-11-20 12:24:00 -0400
committerJoey Hess <joey@kitenet.net>2010-11-20 12:24:00 -0400
commitcfbfbdc5979abc941b08862bd1f66bc986e9ac08 (patch)
tree7be9d790c50769d12130e4a34a97bc4845e732e6
parentc9b737cc8596f9421ba968e56839eb052e80e794 (diff)
parent55515050e1f3aad13dc96796a347cefa98e8e472 (diff)
Merge remote branch 'smcv/ready/glob-cache'
-rw-r--r--IkiWiki.pm15
-rw-r--r--IkiWiki/Plugin/filecheck.pm2
-rw-r--r--IkiWiki/Plugin/meta.pm2
-rw-r--r--IkiWiki/Plugin/po.pm2
4 files changed, 14 insertions, 7 deletions
diff --git a/IkiWiki.pm b/IkiWiki.pm
index 08a3d7875..e5370f4a6 100644
--- a/IkiWiki.pm
+++ b/IkiWiki.pm
@@ -2388,7 +2388,7 @@ sub glob2re ($) {
my $re=quotemeta(shift);
$re=~s/\\\*/.*/g;
$re=~s/\\\?/./g;
- return $re;
+ return qr/^$re$/i;
}
package IkiWiki::FailReason;
@@ -2482,6 +2482,8 @@ sub derel ($$) {
return $path;
}
+my %glob_cache;
+
sub match_glob ($$;@) {
my $page=shift;
my $glob=shift;
@@ -2489,8 +2491,13 @@ sub match_glob ($$;@) {
$glob=derel($glob, $params{location});
- my $regexp=IkiWiki::glob2re($glob);
- if ($page=~/^$regexp$/i) {
+ # Instead of converting the glob to a regex every time,
+ # cache the compiled regex to save time.
+ if (!defined $glob_cache{$glob}) {
+ my $re = IkiWiki::glob2re($glob);
+ $glob_cache{$glob} = $re;
+ }
+ if ($page=~ $glob_cache{$glob}) {
if (! IkiWiki::isinternal($page) || $params{internal}) {
return IkiWiki::SuccessReason->new("$glob matches $page");
}
@@ -2660,7 +2667,7 @@ sub match_user ($$;@) {
return IkiWiki::ErrorReason->new("no user specified");
}
- if (defined $params{user} && $params{user}=~/^$regexp$/i) {
+ if (defined $params{user} && $params{user}=~$regexp) {
return IkiWiki::SuccessReason->new("user is $user");
}
elsif (! defined $params{user}) {
diff --git a/IkiWiki/Plugin/filecheck.pm b/IkiWiki/Plugin/filecheck.pm
index 3b0a7b314..4f4e67489 100644
--- a/IkiWiki/Plugin/filecheck.pm
+++ b/IkiWiki/Plugin/filecheck.pm
@@ -161,7 +161,7 @@ sub match_mimetype ($$;@) {
}
my $regexp=IkiWiki::glob2re($wanted);
- if ($mimetype!~/^$regexp$/i) {
+ if ($mimetype!~$regexp) {
return IkiWiki::FailReason->new("file MIME type is $mimetype, not $wanted");
}
else {
diff --git a/IkiWiki/Plugin/meta.pm b/IkiWiki/Plugin/meta.pm
index 5cfa72833..47007afe2 100644
--- a/IkiWiki/Plugin/meta.pm
+++ b/IkiWiki/Plugin/meta.pm
@@ -355,7 +355,7 @@ sub match {
}
if (defined $val) {
- if ($val=~/^$re$/i) {
+ if ($val=~$re) {
return IkiWiki::SuccessReason->new("$re matches $field of $page", $page => $IkiWiki::DEPEND_CONTENT, "" => 1);
}
else {
diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm
index a79e7d7f0..79142ed1f 100644
--- a/IkiWiki/Plugin/po.pm
+++ b/IkiWiki/Plugin/po.pm
@@ -1297,7 +1297,7 @@ sub match_lang ($$;@) {
my $regexp=IkiWiki::glob2re($wanted);
my $lang=IkiWiki::Plugin::po::lang($page);
- if ($lang !~ /^$regexp$/i) {
+ if ($lang !~ $regexp) {
return IkiWiki::FailReason->new("file language is $lang, not $wanted");
}
else {