Fourth batch
[gitweb.git] / perl / Git / SVN / GlobSpec.pm
index 96cfd9896e99f7060ab69e76675f976a1f8ffdc7..a0a8d1762150acd5b6a91116d4835fba1834d425 100644 (file)
@@ -8,19 +8,23 @@ sub new {
        $re =~ s!/+$!!g; # no need for trailing slashes
        my (@left, @right, @patterns);
        my $state = "left";
-       my $die_msg = "Only one set of wildcard directories " .
-                               "(e.g. '*' or '*/*/*') is supported: '$glob'\n";
+       my $die_msg = "Only one set of wildcards " .
+                               "(e.g. '*' or '*/*/*') is supported: $glob\n";
        for my $part (split(m|/|, $glob)) {
-               if ($part =~ /\*/ && $part ne "*") {
-                       die "Invalid pattern in '$glob': $part\n";
-               } elsif ($pattern_ok && $part =~ /[{}]/ &&
+               if ($pattern_ok && $part =~ /[{}]/ &&
                         $part !~ /^\{[^{}]+\}/) {
                        die "Invalid pattern in '$glob': $part\n";
                }
-               if ($part eq "*") {
+               my $nstars = $part =~ tr/*//;
+               if ($nstars > 1) {
+                       die "Only one '*' is allowed in a pattern: '$part'\n";
+               }
+               if ($part =~ /(.*)\*(.*)/) {
                        die $die_msg if $state eq "right";
+                       my ($l, $r) = ($1, $2);
                        $state = "pattern";
-                       push(@patterns, "[^/]*");
+                       my $pat = quotemeta($l) . '[^/]*' . quotemeta($r);
+                       push(@patterns, $pat);
                } elsif ($pattern_ok && $part =~ /^\{(.*)\}$/) {
                        die $die_msg if $state eq "right";
                        $state = "pattern";
@@ -44,7 +48,9 @@ sub new {
        my $right = join('/', @right);
        $re = join('/', @patterns);
        $re = join('\/',
-                  grep(length, quotemeta($left), "($re)", quotemeta($right)));
+                  grep(length, quotemeta($left),
+                                "($re)(?=/|\$)",
+                                quotemeta($right)));
        my $left_re = qr/^\/\Q$left\E(\/|$)/;
        bless { left => $left, right => $right, left_regex => $left_re,
                regex => qr/$re/, glob => $glob, depth => $depth }, $class;