[PATCH 4 of 4 V2] destutil: add more precise error classes for destmerge

Martin von Zweigbergk martinvonz at google.com
Mon Feb 15 02:32:31 EST 2016


On Sun, Feb 14, 2016 at 9:27 PM, Martin von Zweigbergk
<martinvonz at google.com> wrote:
> On Sun, Feb 14, 2016 at 7:38 AM, Pierre-Yves David
> <pierre-yves.david at ens-lyon.org> wrote:
>> # HG changeset patch
>> # User Pierre-Yves David <pierre-yves.david at fb.com>
>> # Date 1455060641 0
>> #      Tue Feb 09 23:30:41 2016 +0000
>> # Node ID 191223342dcb0e8e87b2b3f038fdda98b3d51a26
>> # Parent  e025ec586bdf3111bb1ca85672c7cab3b407cf46
>> # EXP-Topic destination
>> # Available At http://hg.netv6.net/marmoute-wip/mercurial/
>> #              hg pull http://hg.netv6.net/marmoute-wip/mercurial/ -r 191223342dcb
>> destutil: add more precise error classes for destmerge
>>
>> Having exception classes more precise than 'Abort' will allow us to properly
>> catch "nothing to rebase" situations when we will be using 'destmerge' in
>> rebase.
>>
>> diff --git a/mercurial/destutil.py b/mercurial/destutil.py
>> --- a/mercurial/destutil.py
>> +++ b/mercurial/destutil.py
>> @@ -207,14 +207,14 @@ def _destmergebook(repo, action='merge',
>>              node = bmheads[1]
>>          else:
>>              node = bmheads[0]
>>      elif len(bmheads) > 2:
>>          msg, hint = msgdestmerge['toomanybookmarks'][action]
>> -        raise error.Abort(msg, hint=hint)
>> +        raise error.ManyMergeDestAbort(msg, hint=hint)
>>      elif len(bmheads) <= 1:
>>          msg, hint = msgdestmerge['nootherbookmarks'][action]
>> -        raise error.Abort(msg, hint=hint)
>> +        raise error.NoMergeDestAbort(msg, hint=hint)
>>      assert node is not None
>>      return node
>>
>>  def _destmergebranch(repo, action='merge', sourceset=None, onheadcheck=True):
>>      """find merge destination based on branch heads"""
>> @@ -223,17 +223,17 @@ def _destmergebranch(repo, action='merge
>>      if sourceset is None:
>>          sourceset = [repo[repo.dirstate.p1()].rev()]
>>          branch = repo.dirstate.branch()
>>      elif not sourceset:
>>          msg, hint = msgdestmerge['emptysourceset'][action]
>> -        raise error.Abort(msg, hint=hint)
>> +        raise error.NoMergeDestAbort(msg, hint=hint)
>>      else:
>>          branch = None
>>          for ctx in repo.set('roots(%ld::%ld)', sourceset, sourceset):
>>              if branch is not None and ctx.branch() != branch:
>>                  msg, hint = msgdestmerge['multiplebranchessourceset'][action]
>> -                raise error.Abort(msg, hint=hint)
>> +                raise error.ManyMergeDestAbort(msg, hint=hint)
>>              branch = ctx.branch()
>>
>>      bheads = repo.branchheads(branch)
>>      if onheadcheck and not repo.revs('%ld and %ln', sourceset, bheads):
>>          # Case A: working copy if not on a head. (merge only)
>> @@ -254,11 +254,11 @@ def _destmergebranch(repo, action='merge
>>          # This means that there will be more than 1 candidate. This is
>>          # ambiguous. We abort asking the user to pick as explicit destination
>>          # instead.
>>          msg, hint = msgdestmerge['toomanyheads'][action]
>>          msg %= (branch, len(bheads) + 1)
>> -        raise error.Abort(msg, hint=hint)
>> +        raise error.ManyMergeDestAbort(msg, hint=hint)
>>      elif not nbhs:
>>          # Case B: There is no other anonymous heads
>>          #
>>          # This means that there is no natural candidate to merge with.
>>          # We abort, with various messages for various cases.
>> @@ -267,11 +267,11 @@ def _destmergebranch(repo, action='merge
>>          elif len(repo.heads()) > 1:
>>              msg, hint = msgdestmerge['nootherbranchheads'][action]
>>              msg %= branch
>>          else:
>>              msg, hint = msgdestmerge['nootherheads'][action]
>> -        raise error.Abort(msg, hint=hint)
>> +        raise error.NoMergeDestAbort(msg, hint=hint)
>>      else:
>>          node = nbhs[0]
>>      assert node is not None
>>      return node
>>
>> diff --git a/mercurial/error.py b/mercurial/error.py
>> --- a/mercurial/error.py
>> +++ b/mercurial/error.py
>> @@ -70,10 +70,19 @@ class ConfigError(Abort):
>>      """Exception raised when parsing config files"""
>>
>>  class UpdateAbort(Abort):
>>      """Raised when an update is aborted for destination issue"""
>>
>> +class MergeDestAbort(Abort):
>> +    """Raised when an update is aborted for destination issues"""
>
> Unused. Meant to be superclass for the classes below?

Since I'll be away for a week now, I pushed this series to the
clowncopter. Feel free to fix it up there if you like.

>
>> +
>> +class NoMergeDestAbort(Abort):
>> +    """Raised when an update is aborted because there is nothing to merge"""
>> +
>> +class ManyMergeDestAbort(Abort):
>> +    """Raised when an update is aborted because destination is ambigious"""
>> +
>>  class ResponseExpected(Abort):
>>      """Raised when an EOF is received for a prompt"""
>>      def __init__(self):
>>          from .i18n import _
>>          Abort.__init__(self, _('response expected'))
>> _______________________________________________
>> Mercurial-devel mailing list
>> Mercurial-devel at mercurial-scm.org
>> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list