]> sipb.mit.edu Git - ikiwiki.git/commitdiff
Merge remote branch 'smcv/ready/glob-cache'
authorJoey Hess <joey@kitenet.net>
Sat, 20 Nov 2010 16:24:00 +0000 (12:24 -0400)
committerJoey Hess <joey@kitenet.net>
Sat, 20 Nov 2010 16:24:00 +0000 (12:24 -0400)
IkiWiki.pm
IkiWiki/Plugin/filecheck.pm
IkiWiki/Plugin/meta.pm
IkiWiki/Plugin/po.pm

index 08a3d7875da6b9941000b4531755fcb2a6f42d49..e5370f4a6577f736ca869c84f19d260caf518b6c 100644 (file)
@@ -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}) {
index 3b0a7b3148d4edc2bb5bf1c8d11af474dc28a1c7..4f4e67489a41c51ecae344119362f0ea611d481a 100644 (file)
@@ -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 {
index 5cfa7283350885181b9e8e194e87a4448c235c10..47007afe286bd780eba392fde2fa2b20039ec73e 100644 (file)
@@ -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 {
index a79e7d7f0ee56f579ff4e261cd97028533de3099..79142ed1fe62396f17cff88cbfe914acb40896f7 100644 (file)
@@ -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 {