[PATCH 2 of 3] rebase: choose default destination the same way as 'hg merge' (BC)

Yuya Nishihara yuya at tcha.org
Wed Feb 17 10:05:26 EST 2016


On Mon, 15 Feb 2016 10:49:15 +0000, Pierre-Yves David wrote:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david at fb.com>
> # Date 1455456359 0
> #      Sun Feb 14 13:25:59 2016 +0000
> # Node ID 1b45c38d02ddca7ff763366e732528c658ccb13c
> # Parent  dfac70f47ed5ac6802eba6a331f36fb843c81bc7
> # EXP-Topic destination
> # Available At http://hg.netv6.net/marmoute-wip/mercurial/
> #              hg pull http://hg.netv6.net/marmoute-wip/mercurial/ -r 1b45c38d02dd
> rebase: choose default destination the same way as 'hg merge' (BC)

I like the new behavior even though it is a big BC.

> This changeset finally make 'hg rebase' choose its default destination using the
> same logic as 'hg merge'. The previous default was "tipmost changeset on the
> current branch", the new default is "the other head if there is only one".

"help rebase" still says "the current branch tip as the destination." We'll
have to update it.

>  @revsetpredicate('_destrebase')
>  def _revsetdestrebase(repo, subset, x):
>      # ``_rebasedefaultdest()``
>  
>      # default destination for rebase.
>      # # XXX: Currently private because I expect the signature to change.
> -    # # XXX: - taking rev as arguments,
>      # # XXX: - bailing out in case of ambiguity vs returning all data.
> -    # # XXX: - probably merging with the merge destination.
>      # i18n: "_rebasedefaultdest" is a keyword
> -    revset.getargs(x, 0, 0, _("_rebasedefaultdest takes no arguments"))
> -    return subset & revset.baseset([_destrebase(repo)])
> +    sourceset = None
> +    if x is not None:
> +        sourceset = revset.getset(repo, revset.fullreposet(repo), x)
> +    return subset & revset.baseset([destutil.destmerge(repo, action='rebase',
> +                                                       sourceset=sourceset,
> +                                                       onheadcheck=False)])

If this isn't an intermediate state of the rebase refactoring series, can we
have a wrapper for destutil.destmerge() ? There are 4 copies.

>  @command('rebase',
>      [('s', 'source', '',
>       _('rebase the specified changeset and descendants'), _('REV')),
>      ('b', 'base', '',
> @@ -279,10 +275,16 @@ def rebase(ui, repo, **opts):
>          else:
>              dest, rebaseset = _definesets(ui, repo, destf, srcf, basef, revf)
>              if dest is None:
>                  return _nothingtorebase()
>  
> +            if not destf:
> +                dest = repo[destutil.destmerge(repo, action='rebase',
> +                                               sourceset=rebaseset,
> +                                               onheadcheck=False)]
> +                destf = str(dest)

Is it necessary to recalculate dest here?
If it is, perhaps _definesets() wouldn't do the right thing.

>  def externalparent(repo, state, targetancestors):
>      """Return the revision that should be used as the second parent
>      when the revisions in state is collapsed on top of targetancestors.
> @@ -1165,13 +1177,18 @@ def pullrebase(orig, ui, repo, *args, **
>                      del opts['rev']
>                  # positional argument from pull conflicts with rebase's own
>                  # --source.
>                  if 'source' in opts:
>                      del opts['source']
> -                if rebase(ui, repo, **opts) == _nothingtorebase():
> +                try:
> +                    rebase(ui, repo, **opts)
> +                except error.NoMergeDestAbort:
>                      rev, _a, _b = destutil.destupdate(repo)
> -                    if rev != repo['.'].rev(): # we could update
> +                    if rev == repo['.'].rev(): # we could update
> +                        ui.status(_('nothing to rebase\n'))
> +                    else:

Nit: we could update on "else:" case

> +                        ui.status(_('nothing to rebase - updating instead\n'))
>                          # not passing argument to get the bare update behavior
>                          # with warning and trumpets
>                          commands.update(ui, repo)


More information about the Mercurial-devel mailing list