[PATCH evolve-ext:stable] evolve: don't try to relocate a node on top of itself

Angel Ezquerra angel.ezquerra at gmail.com
Tue Mar 25 18:10:12 CDT 2014


On Wed, Mar 26, 2014 at 12:06 AM, Olle Lundberg <olle.lundberg at gmail.com> wrote:
> # HG changeset patch
> # User Olle Lundberg <geek at nerd.sh>
> # Date 1395788513 -3600
> #      Wed Mar 26 00:01:53 2014 +0100
> # Branch stable
> # Node ID 5a2abe5bae7ae4f439d4a078b7891e3bcf6bcc48
> # Parent  6a67606e1c3456c603707fe57e8404af5e33a1bd
> evolve: don't try to relocate a node on top of itself
>
> This fixes problems with "no support for evolution merge changes yet"
> on a linear repo, where evolve thinks that a node is supposed to be
> relocated on top of itself.
>
> diff --git a/hgext/evolve.py b/hgext/evolve.py
> --- a/hgext/evolve.py
> +++ b/hgext/evolve.py
> @@ -1007,36 +1007,39 @@
>      targets = newer[0]
>      assert targets
>      if len(targets) > 1:
>          raise util.Abort(_("does not handle split parents yet\n"))
>          return 2
> -    target = targets[0]
> -    displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
> -    target = repo[target]
> -    repo.ui.status(_('move:'))
> -    if not ui.quiet:
> -        displayer.show(orig)
> -    repo.ui.status(_('atop:'))
> -    if not ui.quiet:
> -        displayer.show(target)
> -    if progresscb: progresscb()
> -    todo = 'hg rebase -r %s -d %s\n' % (orig, target)
> -    if dryrun:
> -        repo.ui.write(todo)
> -    else:
> -        repo.ui.note(todo)
> -        if progresscb: progresscb()
> -        lock = repo.lock()
> -        try:
> -            relocate(repo, orig, target)
> -        except MergeFailure:
> -            repo.opener.write('graftstate', orig.hex() + '\n')
> -            repo.ui.write_err(_('evolve failed!\n'))
> -            repo.ui.write_err(_('fix conflict and run "hg evolve --continue"\n'))
> -            raise
> -        finally:
> -            lock.release()
> +    target = repo[targets[0]]
> +    # Target revision is same as original revision, it makes no sense to try
> +    #  to relocate a node on top of itself.
> +    if target.rev() != orig.rev()
> +        displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
> +        repo.ui.status(_('move:'))
> +        if not ui.quiet:
> +            displayer.show(orig)
> +        repo.ui.status(_('atop:'))
> +        if not ui.quiet:
> +            displayer.show(target)
> +        if progresscb:
> +            progresscb()
> +        todo = 'hg rebase -r %s -d %s\n' % (orig, target)
> +        if dryrun:
> +            repo.ui.write(todo)
> +        else:
> +            repo.ui.note(todo)
> +            if progresscb: progresscb()
> +            lock = repo.lock()
> +            try:
> +                relocate(repo, orig, target)
> +            except MergeFailure:
> +                repo.opener.write('graftstate', orig.hex() + '\n')
> +                repo.ui.write_err(_('evolve failed!\n'))
> +                repo.ui.write_err(_('fix conflict and run "hg evolve --continue"\n'))
> +                raise
> +            finally:
> +                lock.release()
>
>  def _solvebumped(ui, repo, bumped, dryrun=False, progresscb=None):
>      """Stabilize a bumped changeset"""
>      # For now we deny bumped merge
>      if len(bumped.parents()) > 1:

Wouldn't it be better to just do the check and exit early (showing
some error message), and keep the rest of the code the same? That
would be a much smaller patch.

Cheers,

angel


More information about the Mercurial-devel mailing list