[PATCH 3 of 5 EVOLVE] fold: overhaul handling of multiple and single revisions (BC)
Pierre-Yves David
pierre-yves.david at ens-lyon.org
Mon Jun 30 13:58:41 CDT 2014
On 06/30/2014 08:28 PM, Jordi Gutiérrez Hermoso wrote:
> # HG changeset patch
> # User Jordi Gutiérrez Hermoso <jordigh at octave.org>
> # Date 1404149389 14400
> # Mon Jun 30 13:29:49 2014 -0400
> # Node ID 0a970a5c0fecd98f16e4b9591713a5f516905646
> # Parent 04afee1615a9823298b011ed1ab1ff1e2b686a1e
> fold: overhaul handling of multiple and single revisions (BC)
>
> The fold command parsed the revision arguments in a very peculiar and
> idiosyncratic fashion: either a single revision could be specified or
> multiple revisions could be specified with --rev (but not both). This
> is inconsistent with the way all other hg commands parse revision
> arguments. We have several examples of command where several revisions
> are passed, and the --rev option is optional for specifying those
> revisions (update, strip, export).
You are getting confuse about "single revision" vs "multiple revision".
The only confusing and non-standar behavior is the semantic change when
--rev is specified.
But both option alway accepted multiple revision.
> This patch alters the way in which fold parses its revision arguments.
> No distinction is made between revisions passed with or without the
> --rev argument. Whether a single or multiple revision is specified, it
> will all be folded together into one, by connecting them to the parent
> of the working directory.
I feel like this sentence is over complicated. but this is not too
important in the commit message.
> If the --exact argument is passed, then the
> parent of the working directory is ignored and the specified revisions
> must be a single contiguous line.
>
> The docstring and tests are modified accordingly.
>
> diff --git a/hgext/evolve.py b/hgext/evolve.py
> --- a/hgext/evolve.py
> +++ b/hgext/evolve.py
> @@ -2074,32 +2074,42 @@ def touch(ui, repo, *revs, **opts):
> lockmod.release(lock, wlock)
>
> @command('^fold|squash',
> - [('r', 'rev', [], _("explicitly specify the full set of revision to fold")),
> + [('r', 'rev', [], _("revision to fold")),
> + ('', 'exact', None, _("ignore parent of working directory"))
No super fan of the --exact help test.
What about "Fold specified revision only"
> ] + commitopts + commitopts2,
> - # allow to choose the seed ?
> - _('rev'))
> + _('hg fold [OPTION]... [-r] REV'))
> def fold(ui, repo, *revs, **opts):
> - """Fold multiple revisions into a single one
> + """fold multiple revisions into a single one
>
> - The revisions from your current working directory to the given one are folded
> - into a single successor revision.
> + Folds all revisions between the specified revision and the parent
> + of working directory into a single revision.
Fold a set of revision with working directory parent?
> The folded revisions
> + will be marked as obsolete and replaced by the resulting revision.
I do not believe we want to mention obsolescence here. obsolescence is a
global behavior of mercurial (so we do not need to specify it all the
time) and and advances concept (should be thrown at new user so quickly
in the help)
> - you can alternatively use --rev to explicitly specify revisions to be folded,
> - ignoring the current working directory parent.
> + If multiple revisions are specified, they will all be folded
> + together with the parent of the working directory, along with any
> + intermediate revisions.
Not sure this this is necessary, but usually does not hurt to tell the
same thing in differnt way.
> + If specifying multiple revisions, use --exact for folding those
> + revisions while ignoring the parent of the working directory. In
> + this case, the given revisions must form a linear unbroken chain.
I find this a bit confusing. What about:
You can use --exact to fold just the revision specified. Ignoring the
working directory parent.
In this case, the given revisions must form a linear unbroken chain.
> """
> revs = list(revs)
> - if revs:
> - if opts.get('rev', ()):
> - raise util.Abort("cannot specify both --rev and a target revision")
> - targets = scmutil.revrange(repo, revs)
> - revs = repo.revs('(%ld::.) or (.::%ld)', targets, targets)
> - elif 'rev' in opts:
> - revs = scmutil.revrange(repo, opts['rev'])
> - else:
> - revs = ()
> + revs.extend(opts['rev'])
> if not revs:
> raise util.Abort(_('no revisions specified'))
>
> + revs = scmutil.revrange(repo, revs)
> +
> + if not opts['exact']:
> + # Try to extend given revision starting from the working directory
> + extrevs = repo.revs('(%ld::.) or (.::%ld)', revs, revs)
> + discardedrevs = [r for r in revs if r not in extrevs]
> + if discardedrevs:
> + raise util.Abort(_("cannot fold non-linear revisions"),
> + hint=_("given revisions are unrelated to parent "
> + "of working directory"))
> + revs = extrevs
> +
> if len(revs) == 1:
> ui.write_err(_('single revision specified, nothing to fold\n'))
> return 1
> diff --git a/tests/test-evolve.t b/tests/test-evolve.t
> --- a/tests/test-evolve.t
> +++ b/tests/test-evolve.t
> @@ -616,27 +616,23 @@ Test fold
> $ hg fold
> abort: no revisions specified
> [255]
> - $ hg fold 6 --rev 10
> - abort: cannot specify both --rev and a target revision
> - [255]
> $ hg fold .
> single revision specified, nothing to fold
> [1]
> + $ hg fold 10 1
> + abort: cannot fold non-linear revisions
> + (given revisions are unrelated to parent of working directory)
> + [255]
> + $ hg fold -r 5
> + 3 changesets folded
> + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
> $ hg fold 6 # want to run hg fold 6
> - 2 changesets folded
> - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
> - $ glog
> - @ 11:dd4682c1a481 at default(draft) add 1
> - |
> - o 5:0b9e50c35132 at default(draft) add 3
> - |
> - o 4:ce341209337f at default(draft) add 4
> - |
> - | o 1:73d38bb17fd7 at default(draft) add 1
> - |/
> - o 0:8685c6d34325 at default(draft) add 0
> + abort: unknown revision '6'!
> + [255]
> + $ hg log -r 11 --template '{desc}\n'
> + add 3
>
> - $ hg log -r 11 --template '{desc}\n'
> +
> add 1
>
>
> @@ -648,8 +644,8 @@ Test fold with wc parent is not the head
>
> $ hg up 4
> 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
> - $ hg fold --rev 4::11 --user victor
> - 3 changesets folded
> + $ hg fold --rev 4::11 --user victor --exact
> + 2 changesets folded
> 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
> $ glog
> @ 12:d26d339c513f at default(draft) add 4
> @@ -680,8 +676,7 @@ Test olog
>
> $ hg olog
> 4 : add 4 - test
> - 5 : add 3 - test
> - 11 : add 1 - test
> + 11 : add 3 - test
>
> Test obsstore stat
>
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
>
--
Pierre-Yves David
More information about the Mercurial-devel
mailing list