[PATCH 3 of 4] convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Augie Fackler
raf at durin42.com
Thu Oct 3 09:50:09 CDT 2013
On Wed, Oct 02, 2013 at 07:56:45PM +0200, Mads Kiilerich wrote:
> # 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.
It's new functionality, how would it fail to be backwards compatible?
What am I missing?
>
> 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
> ##########
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list