changeset 25749:f2748cc43b2a

convert: support multiple specifed revs in git source This allows specifying multiple revs/branches to convert from a git repo.
author Durham Goode <durham@fb.com>
date Wed, 08 Jul 2015 10:29:11 -0700
parents baea47cafe75
children c9093d4d1ff6
files hgext/convert/git.py tests/test-convert-git.t
diffstat 2 files changed, 42 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/convert/git.py	Wed Jul 08 10:27:43 2015 -0700
+++ b/hgext/convert/git.py	Wed Jul 08 10:29:11 2015 -0700
@@ -89,10 +89,6 @@
     def __init__(self, ui, path, revs=None):
         super(convert_git, self).__init__(ui, path, revs=revs)
 
-        if revs and len(revs) > 1:
-            raise util.Abort(_("git source does not support specifying "
-                               "multiple revs"))
-
         if os.path.isdir(path + "/.git"):
             path += "/.git"
         if not os.path.exists(path + "/objects"):
@@ -126,12 +122,15 @@
         if not self.revs:
             heads, ret = self.gitread('git rev-parse --branches --remotes')
             heads = heads.splitlines()
+            if ret:
+                raise util.Abort(_('cannot retrieve git heads'))
         else:
-            heads, ret = self.gitread("git rev-parse --verify %s" %
-                                      self.revs[0])
-            heads = [heads[:-1]]
-        if ret:
-            raise util.Abort(_('cannot retrieve git heads'))
+            heads = []
+            for rev in self.revs:
+                rawhead, ret = self.gitread("git rev-parse --verify %s" % rev)
+                heads.append(rawhead[:-1])
+                if ret:
+                    raise util.Abort(_('cannot retrieve git head "%s"') % rev)
         return heads
 
     def catfile(self, rev, type):
--- a/tests/test-convert-git.t	Wed Jul 08 10:27:43 2015 -0700
+++ b/tests/test-convert-git.t	Wed Jul 08 10:29:11 2015 -0700
@@ -442,6 +442,40 @@
   abort: --sourcesort is not supported by this data source
   [255]
 
+test converting certain branches
+
+  $ mkdir git-testrevs
+  $ cd git-testrevs
+  $ git init
+  Initialized empty Git repository in $TESTTMP/git-testrevs/.git/
+  $ echo a >> a ; git add a > /dev/null; git commit -m 'first' > /dev/null
+  $ echo a >> a ; git add a > /dev/null; git commit -m 'master commit' > /dev/null
+  $ git checkout -b goodbranch 'HEAD^'
+  Switched to a new branch 'goodbranch'
+  $ echo a >> b ; git add b > /dev/null; git commit -m 'good branch commit' > /dev/null
+  $ git checkout -b badbranch 'HEAD^'
+  Switched to a new branch 'badbranch'
+  $ echo a >> c ; git add c > /dev/null; git commit -m 'bad branch commit' > /dev/null
+  $ cd ..
+  $ hg convert git-testrevs hg-testrevs --rev master --rev goodbranch
+  initializing destination hg-testrevs repository
+  scanning source...
+  sorting...
+  converting...
+  2 first
+  1 good branch commit
+  0 master commit
+  updating bookmarks
+  $ cd hg-testrevs
+  $ hg log -G -T '{rev} {bookmarks}'
+  o  2 master
+  |
+  | o  1 goodbranch
+  |/
+  o  0
+  
+  $ cd ..
+
 test sub modules
 
   $ mkdir git-repo5