diff hgext/convert/hg.py @ 6885:6e253aa04ff7

convert: implement startrev for hg source
author Patrick Mezard <pmezard@gmail.com>
date Wed, 13 Aug 2008 23:31:10 +0200
parents f67d1468ac50
children ebf1462f2145
line wrap: on
line diff
--- a/hgext/convert/hg.py	Tue Aug 12 17:47:08 2008 +0200
+++ b/hgext/convert/hg.py	Wed Aug 13 23:31:10 2008 +0200
@@ -206,6 +206,21 @@
         self.lastctx = None
         self._changescache = None
         self.convertfp = None
+        # Restrict converted revisions to startrev descendants
+        startnode = ui.config('convert', 'hg.startrev')
+        if startnode is not None:
+            try:
+                startnode = self.repo.lookup(startnode)
+            except repo.RepoError:
+                raise util.Abort(_('%s is not a valid start revision') 
+                                 % startnode)
+            startrev = self.repo.changelog.rev(startnode)
+            children = {startnode: 1}
+            for rev in self.repo.changelog.descendants(startrev):
+                children[self.repo.changelog.node(rev)] = 1
+            self.keep = children.__contains__
+        else:
+            self.keep = util.always
 
     def changectx(self, rev):
         if self.lastrev != rev:
@@ -213,11 +228,16 @@
             self.lastrev = rev
         return self.lastctx
 
+    def parents(self, ctx):
+        return [p.node() for p in ctx.parents() 
+                if p and self.keep(p.node())]
+
     def getheads(self):
         if self.rev:
-            return [hex(self.repo[self.rev].node())]
+            heads = [self.repo[self.rev].node()]
         else:
-            return [hex(node) for node in self.repo.heads()]
+            heads = self.repo.heads()
+        return [hex(h) for h in heads if self.keep(h)]
 
     def getfile(self, name, rev):
         try:
@@ -230,10 +250,14 @@
 
     def getchanges(self, rev):
         ctx = self.changectx(rev)
+        parents = self.parents(ctx)
+        if not parents:
+            files = util.sort(ctx.manifest().keys())
+            return [(f, rev) for f in files], {}
         if self._changescache and self._changescache[0] == rev:
             m, a, r = self._changescache[1]
         else:
-            m, a, r = self.repo.status(ctx.parents()[0].node(), ctx.node())[:3]
+            m, a, r = self.repo.status(parents[0], ctx.node())[:3]
         changes = [(name, rev) for name in m + a + r]
         return util.sort(changes), self.getcopies(ctx, m + a)
 
@@ -241,14 +265,16 @@
         copies = {}
         for name in files:
             try:
-                copies[name] = ctx.filectx(name).renamed()[0]
+                copynode = ctx.filectx(name).renamed()[0]
+                if self.keep(copynode):
+                    copies[name] = copynode
             except TypeError:
                 pass
         return copies
 
     def getcommit(self, rev):
         ctx = self.changectx(rev)
-        parents = [hex(p.node()) for p in ctx.parents() if p.node() != nullid]
+        parents = [hex(p) for p in self.parents(ctx)]
         if self.saverev:
             crev = rev
         else:
@@ -259,12 +285,18 @@
 
     def gettags(self):
         tags = [t for t in self.repo.tagslist() if t[0] != 'tip']
-        return dict([(name, hex(node)) for name, node in tags])
+        return dict([(name, hex(node)) for name, node in tags
+                     if self.keep(node)])
 
     def getchangedfiles(self, rev, i):
         ctx = self.changectx(rev)
-        i = i or 0
-        changes = self.repo.status(ctx.parents()[i].node(), ctx.node())[:3]
+        parents = self.parents(ctx)
+        if not parents and i is None:
+            i = 0
+            changes = [], ctx.manifest().keys(), []
+        else:
+            i = i or 0
+            changes = self.repo.status(parents[i], ctx.node())[:3]
 
         if i == 0:
             self._changescache = (rev, changes)