convert: keep converted hg parents that are outside convert.hg.revs (BC)
authorMads Kiilerich <madski@unity3d.com>
Wed, 13 Apr 2016 00:16:21 +0200
changeset 28900 b65966f50058
parent 28899 8c94594adbef
child 28901 a368da441b32
convert: keep converted hg parents that are outside convert.hg.revs (BC) Before, when converting revisions without also including their already converted parents in convert.hg.revs, the parents would no longer be parents. That seems unfortunate and we dare to assume that nobody ever wants that. Instead, preserve parents that are outside the current convert range but already have been converted. The parents returned in getcommit() are unconditionally converted, so we introduce a separate optparents with optional parents.
hgext/convert/common.py
hgext/convert/convcmd.py
hgext/convert/hg.py
tests/test-convert-hg-startrev.t
--- a/hgext/convert/common.py	Thu Mar 24 16:01:07 2016 -0700
+++ b/hgext/convert/common.py	Wed Apr 13 00:16:21 2016 +0200
@@ -55,11 +55,13 @@
 
 class commit(object):
     def __init__(self, author, date, desc, parents, branch=None, rev=None,
-                 extra={}, sortkey=None, saverev=True, phase=phases.draft):
+                 extra={}, sortkey=None, saverev=True, phase=phases.draft,
+                 optparents=None):
         self.author = author or 'unknown'
         self.date = date or '0 0'
         self.desc = desc
-        self.parents = parents
+        self.parents = parents # will be converted and used as parents
+        self.optparents = optparents or [] # will be used if already converted
         self.branch = branch
         self.rev = rev
         self.extra = extra
--- a/hgext/convert/convcmd.py	Thu Mar 24 16:01:07 2016 -0700
+++ b/hgext/convert/convcmd.py	Wed Apr 13 00:16:21 2016 +0200
@@ -472,6 +472,9 @@
             parents = [self.map.get(p, p) for p in parents]
         except KeyError:
             parents = [b[0] for b in pbranches]
+            parents.extend(self.map[x]
+                           for x in commit.optparents
+                           if x in self.map)
         if len(pbranches) != 2:
             cleanp2 = set()
         if len(parents) < 3:
--- a/hgext/convert/hg.py	Thu Mar 24 16:01:07 2016 -0700
+++ b/hgext/convert/hg.py	Wed Apr 13 00:16:21 2016 +0200
@@ -582,7 +582,9 @@
 
     def getcommit(self, rev):
         ctx = self._changectx(rev)
-        parents = [p.hex() for p in self._parents(ctx)]
+        _parents = self._parents(ctx)
+        parents = [p.hex() for p in _parents]
+        optparents = [p.hex() for p in ctx.parents() if p and p not in _parents]
         crev = rev
 
         return common.commit(author=ctx.user(),
@@ -591,6 +593,7 @@
                              desc=ctx.description(),
                              rev=crev,
                              parents=parents,
+                             optparents=optparents,
                              branch=ctx.branch(),
                              extra=ctx.extra(),
                              sortkey=ctx.rev(),
--- a/tests/test-convert-hg-startrev.t	Thu Mar 24 16:01:07 2016 -0700
+++ b/tests/test-convert-hg-startrev.t	Wed Apr 13 00:16:21 2016 +0200
@@ -222,7 +222,7 @@
   o  0 "0: add a b f" files: a b f
   
 Convert in multiple steps that doesn't overlap - the link to the parent is
-currently missing
+preserved anyway
 
   $ hg convert --config convert.hg.revs=::1 source multistep
   initializing destination multistep repository
@@ -237,8 +237,8 @@
   converting...
   0 2: copy e from a, change b
   $ glog multistep
-  o  2 "2: copy e from a, change b" files: a b c d e
-  
+  o  2 "2: copy e from a, change b" files: b e
+  |
   o  1 "1: add c, move f to d" files: c d f
   |
   o  0 "0: add a b f" files: a b f