Mercurial > public > mercurial-scm > hg
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)