Make git-svn branch patterns match complete URL
authorAmmon Riley <ammon.riley@gmail.com>
Thu, 30 Aug 2012 22:53:57 +0000 (15:53 -0700)
committerEric Wong <normalperson@yhbt.net>
Fri, 5 Oct 2012 22:48:12 +0000 (22:48 +0000)
When using the {word,[...]} style of configuration for tags and branches,
it appears the intent is to only match whole path parts, since the words
in the {} pattern are meta-character quoted.

When the pattern word appears in the beginning or middle of the url,
it's matched completely, since the left side, pattern, and (non-empty)
right side are joined together with path separators.

However, when the pattern word appears at the end of the URL, the
right side is an empty pattern, and the resulting regex matches
more than just the specified pattern.

For example, if you specify something along the lines of

    branches = branches/project/{release_1,release_2}

and your repository also contains "branches/project/release_1_2", you
will also get the release_1_2 branch.  By restricting the match regex
with anchors, this is avoided.

Signed-off-by: Ammon Riley <ammon.riley@gmail.com>
Signed-off-by: Eric Wong <normalperson@yhbt.net>
perl/Git/SVN/GlobSpec.pm
t/t9154-git-svn-fancy-glob.sh

index 96cfd9896e99f7060ab69e76675f976a1f8ffdc7..c95f5d76cae9fc40a1c1d2e6cff899e81186b6ca 100644 (file)
@@ -44,7 +44,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;
index a6a56a6cb908b30799b46b1e122c1b59079db43d..b780e0efe3de8939f12e408517510f3601de494d 100755 (executable)
@@ -21,6 +21,15 @@ test_expect_success 'add red branch' "
        test_must_fail git rev-parse refs/remotes/blue
        "
 
+test_expect_success 'add gre branch' "
+       GIT_CONFIG=.git/svn/.metadata git config --unset svn-remote.svn.branches-maxRev &&
+       git config svn-remote.svn.branches 'branches/{red,gre}:refs/remotes/*' &&
+       git svn fetch &&
+       git rev-parse refs/remotes/red &&
+       test_must_fail git rev-parse refs/remotes/green &&
+       test_must_fail git rev-parse refs/remotes/blue
+       "
+
 test_expect_success 'add green branch' "
        GIT_CONFIG=.git/svn/.metadata git config --unset svn-remote.svn.branches-maxRev &&
        git config svn-remote.svn.branches 'branches/{red,green}:refs/remotes/*' &&