changeset 821:0d6d2fcc62b6

git_handler: support wildcards for Git branch name matching This is quite similar to syntax Git supports. In the future maybe core Mercurial could be extended to support this, but I think this independently makes sense in hg-git.
author Siddharth Agarwal <sid0@fb.com>
date Fri, 31 Oct 2014 11:14:35 -0700
parents 826296785e8b
children 53e7e8f34dcd
files hggit/git_handler.py tests/test-pull.t
diffstat 2 files changed, 90 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/hggit/git_handler.py
+++ b/hggit/git_handler.py
@@ -1055,13 +1055,20 @@
                 (r, r[r.find('/', r.find('/')+1)+1:])
                     for r in refs]
             for h in heads:
-                r = [pair[0] for pair in stripped_refs if pair[1] == h]
-                if not r:
-                    raise hgutil.Abort("ref %s not found on remote server" % h)
-                elif len(r) == 1:
-                    filteredrefs.append(r[0])
+                if h.endswith('/*'):
+                    prefix = h[:-1]  # include the / but not the *
+                    r = [pair[0] for pair in stripped_refs
+                         if pair[1].startswith(prefix)]
+                    r.sort()
+                    filteredrefs.extend(r)
                 else:
-                    raise hgutil.Abort("ambiguous reference %s: %r" % (h, r))
+                    r = [pair[0] for pair in stripped_refs if pair[1] == h]
+                    if not r:
+                        raise hgutil.Abort("ref %s not found on remote server" % h)
+                    elif len(r) == 1:
+                        filteredrefs.append(r[0])
+                    else:
+                        raise hgutil.Abort("ambiguous reference %s: %r" % (h, r))
         else:
             for ref, sha in refs.iteritems():
                 if (not ref.endswith('^{}')
--- a/tests/test-pull.t
+++ b/tests/test-pull.t
@@ -179,3 +179,80 @@
      date:        Mon Jan 01 00:00:10 2007 +0000
      summary:     add alpha
   
+pull with wildcards
+  $ cd gitrepo
+  $ git checkout -qb releases/v1 master
+  $ echo zeta > zeta
+  $ git add zeta
+  $ fn_git_commit -m 'add zeta'
+  $ git checkout -qb releases/v2 master
+  $ echo eta > eta
+  $ git add eta
+  $ fn_git_commit -m 'add eta'
+  $ git checkout -qb notreleases/v1 master
+  $ echo theta > theta
+  $ git add theta
+  $ fn_git_commit -m 'add theta'
+
+ensure that releases/v1 and releases/v2 are pulled but not notreleases/v1
+  $ cd ..
+  $ hg -R hgrepo pull -r 'releases/*'
+  pulling from $TESTTMP/gitrepo
+  importing git objects into hg
+  (run 'hg heads .' to see heads, 'hg merge' to merge)
+  $ hg -R hgrepo log --graph
+  o  changeset:   6:bdc34645137e
+  |  bookmark:    releases/v2
+  |  tag:         default/releases/v2
+  |  tag:         tip
+  |  parent:      4:892d20308ddf
+  |  user:        test <test@example.org>
+  |  date:        Mon Jan 01 00:00:15 2007 +0000
+  |  summary:     add eta
+  |
+  | o  changeset:   5:3e35a45c61f9
+  |/   bookmark:    releases/v1
+  |    tag:         default/releases/v1
+  |    user:        test <test@example.org>
+  |    date:        Mon Jan 01 00:00:14 2007 +0000
+  |    summary:     add zeta
+  |
+  o    changeset:   4:892d20308ddf
+  |\   bookmark:    master
+  | |  tag:         default/master
+  | |  parent:      3:56cabe48c4b0
+  | |  parent:      1:7bcd915dc873
+  | |  user:        test <test@example.org>
+  | |  date:        Mon Jan 01 00:00:13 2007 +0000
+  | |  summary:     Merge branch 'beta'
+  | |
+  | o  changeset:   3:56cabe48c4b0
+  | |  parent:      0:3442585be8a6
+  | |  user:        test <test@example.org>
+  | |  date:        Mon Jan 01 00:00:13 2007 +0000
+  | |  summary:     add gamma
+  | |
+  | | o  changeset:   2:4d41070bf840
+  | |/   bookmark:    delta
+  | |    tag:         default/delta
+  | |    parent:      0:3442585be8a6
+  | |    user:        test <test@example.org>
+  | |    date:        Mon Jan 01 00:00:12 2007 +0000
+  | |    summary:     add delta
+  | |
+  o |  changeset:   1:7bcd915dc873
+  |/   bookmark:    beta
+  |    tag:         default/beta
+  |    tag:         t_beta
+  |    user:        test <test@example.org>
+  |    date:        Mon Jan 01 00:00:11 2007 +0000
+  |    summary:     add beta
+  |
+  @  changeset:   0:3442585be8a6
+     bookmark:    epsilon
+     tag:         default/epsilon
+     tag:         t_alpha
+     user:        test <test@example.org>
+     date:        Mon Jan 01 00:00:10 2007 +0000
+     summary:     add alpha
+