[PATCH 3 of 4] convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich
mads at kiilerich.com
Wed Oct 2 12:56:45 CDT 2013
# HG changeset patch
# User Mads Kiilerich <madski at unity3d.com>
# Date 1374273788 -7200
# Sat Jul 20 00:43:08 2013 +0200
# Node ID 103a80342ae8a92284ee184ae3232f10e93e8403
# Parent 6b53306b03188cb3803a8957d73ce551ec72b0b9
convert: introduce hg.revs to replace hg.startrev and --rev with a revset
The existing knobs for controlling which revisions to convert were often
insufficient. Revsets is a shiny hammer that provides a better solution.
The normal fancy deprecation markup doesn't work here so we just remove the
documentation of hg.startrev.
Changing --rev to take a revset for hg source repos would be a much more
elegant solution ... but not backwards compatible.
diff --git a/hgext/convert/__init__.py b/hgext/convert/__init__.py
--- a/hgext/convert/__init__.py
+++ b/hgext/convert/__init__.py
@@ -155,8 +155,7 @@
(forces target IDs to change). It takes a boolean argument and
defaults to False.
- :convert.hg.startrev: convert start revision and its descendants.
- It takes a hg revision identifier and defaults to 0.
+ :convert.hg.revs: revset specifying the source revisions to convert.
CVS Source
##########
diff --git a/hgext/convert/hg.py b/hgext/convert/hg.py
--- a/hgext/convert/hg.py
+++ b/hgext/convert/hg.py
@@ -21,7 +21,7 @@
import os, time, cStringIO
from mercurial.i18n import _
from mercurial.node import bin, hex, nullid
-from mercurial import hg, util, context, bookmarks, error
+from mercurial import hg, util, context, bookmarks, error, scmutil
from common import NoRepo, commit, converter_source, converter_sink
@@ -252,23 +252,37 @@
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 error.RepoError:
- raise util.Abort(_('%s is not a valid start revision')
- % startnode)
- startrev = self.repo.changelog.rev(startnode)
- children = {startnode: 1}
- for r in self.repo.changelog.descendants([startrev]):
- children[self.repo.changelog.node(r)] = 1
- self.keep = children.__contains__
+ hgrevs = ui.config('convert', 'hg.revs')
+ if hgrevs is None:
+ if startnode is not None:
+ try:
+ startnode = self.repo.lookup(startnode)
+ except error.RepoError:
+ raise util.Abort(_('%s is not a valid start revision')
+ % startnode)
+ startrev = self.repo.changelog.rev(startnode)
+ children = {startnode: 1}
+ for r in self.repo.changelog.descendants([startrev]):
+ children[self.repo.changelog.node(r)] = 1
+ self.keep = children.__contains__
+ else:
+ self.keep = util.always
+ if rev:
+ self._heads = [self.repo[rev].node()]
+ else:
+ self._heads = self.repo.heads()
else:
- self.keep = util.always
- if rev:
- self._heads = [self.repo[rev].node()]
- else:
- self._heads = self.repo.heads()
+ if rev or startnode is not None:
+ raise util.Abort(_('hg.revs cannot be combined with '
+ 'hg.startrev or --rev'))
+ nodes = set()
+ parents = set()
+ for r in scmutil.revrange(self.repo, [hgrevs]):
+ ctx = self.repo[r]
+ nodes.add(ctx.node())
+ parents.update(p.node() for p in ctx.parents())
+ self.keep = nodes.__contains__
+ self._heads = nodes - parents
def changectx(self, rev):
if self.lastrev != rev:
diff --git a/tests/test-convert-hg-startrev.t b/tests/test-convert-hg-startrev.t
--- a/tests/test-convert-hg-startrev.t
+++ b/tests/test-convert-hg-startrev.t
@@ -183,3 +183,23 @@
b
$ hg -q verify
$ cd ..
+
+Convert from revset in convert.hg.revs
+
+ $ hg convert --config convert.hg.revs='3:4+0' source revsetrepo
+ initializing destination revsetrepo repository
+ scanning source...
+ sorting...
+ converting...
+ 2 0: add a b f
+ 1 3: change a
+ 0 4: merge 2 and 3
+
+ $ glog revsetrepo
+ o 2 "4: merge 2 and 3" files: b c d e f
+ |
+ o 1 "3: change a" files: a
+ |
+ o 0 "0: add a b f" files: a b f
+
+ $ cd ..
diff --git a/tests/test-convert.t b/tests/test-convert.t
--- a/tests/test-convert.t
+++ b/tests/test-convert.t
@@ -135,9 +135,8 @@
store original revision ID in changeset (forces target IDs
to change). It takes a boolean argument and defaults to
False.
- convert.hg.startrev
- convert start revision and its descendants. It takes a hg
- revision identifier and defaults to 0.
+ convert.hg.revs
+ revset specifying the source revisions to convert.
CVS Source
##########
More information about the Mercurial-devel
mailing list