[PATCH 2 of 7 stable] bundle1: fix bundle1-denied reporting for push over ssh

Martin von Zweigbergk martinvonz at google.com
Sun Feb 12 02:23:59 EST 2017


On Sat, Feb 11, 2017 at 10:28 AM, Gregory Szorc <gregory.szorc at gmail.com> wrote:
>
>
>> On Feb 10, 2017, at 15:54, Martin von Zweigbergk via Mercurial-devel <mercurial-devel at mercurial-scm.org> wrote:
>>
>> On Fri, Feb 10, 2017 at 9:53 AM, Pierre-Yves David
>> <pierre-yves.david at ens-lyon.org> wrote:
>>> # HG changeset patch
>>> # User Pierre-Yves David <pierre-yves.david at ens-lyon.org>
>>> # Date 1486745819 -3600
>>> #      Fri Feb 10 17:56:59 2017 +0100
>>> # Branch stable
>>> # Node ID f319afe9c93cb0cfeeff58f66b1792eb55130ba4
>>> # Parent  a7ded180ddb35dfc0e642e960a59ed475fd9be75
>>> # EXP-Topic getbundleerror
>>> bundle1: fix bundle1-denied reporting for push over ssh
>>>
>>> Changeset b288fb2724bf introduced a config option to have the server deny push
>>> using bundle1. The original protocol has not really be design to allow such kind
>>> of error reporting so some hack was used. It turned the hack only works on HTTP
>>> and that ssh wire peer hangs forever when the same hack is used. After further
>>> digging, there is no way to report the error in a unified way. Using 'ooberror'
>>> freeze ssh and raising 'Abort' makes HTTP return a HTTP500 without further
>>> details. So with sadness we implement a version that dispatch according to the
>>> protocol used.
>>
>> Could we instead raise a custom exception with the appropriate data (a
>> main message and a hint, it seems) that we then could catch in the
>> http and ssh handlers and handle appropriately for each?
>>
>> Even if that's what we want long-term (I don't know if there's a
>> reason not want it long-term), I'm fine with taking your patches for
>> now since they're probably less intrusive and therefore more
>> appropriate for stable.
>
> Ugh. The SSH wire protocol needs to be replaced.
>
> I agree with Martin about wanting a better error handling mechanism. I also agree that it would be too invasive for stable.
>
> The patches as is correct an obvious problem and LGTM. Refinements can occur on default.
>
> FWIW Mozilla sees a lot of these "stream ended unexpectedly" errors. The errors are next to useless and I really wish we printed something more informational. I still suspect we may be swallowing an exception from a low-level network failure somewhere. What I'm trying to say is there is a lot of room for improvement to error handling in the protocol code. But that's for another series.

Series queued for stable. Thanks to Pierre-Yves for patches and thanks
to Greg for review.

>
>>
>>>
>>> We also add a test for pushing over ssh to make sure we won't regress in the
>>> future. That test show that the hint is missing, this is another bug fixed in
>>> the next changeset.
>>>
>>> diff -r a7ded180ddb3 -r f319afe9c93c mercurial/wireproto.py
>>> --- a/mercurial/wireproto.py    Fri Feb 10 17:56:47 2017 +0100
>>> +++ b/mercurial/wireproto.py    Fri Feb 10 17:56:59 2017 +0100
>>> @@ -33,9 +33,10 @@
>>> urlerr = util.urlerr
>>> urlreq = util.urlreq
>>>
>>> -bundle2required = _(
>>> -    'incompatible Mercurial client; bundle2 required\n'
>>> -    '(see https://www.mercurial-scm.org/wiki/IncompatibleClient)\n')
>>> +bundle2requiredmain = _('incompatible Mercurial client; bundle2 required')
>>> +bundle2requiredhint = _('see https://www.mercurial-scm.org/wiki/'
>>> +                        'IncompatibleClient')
>>> +bundle2required = '%s\n(%s)\n' % (bundle2requiredmain, bundle2requiredhint)
>>>
>>> class abstractserverproto(object):
>>>     """abstract class that summarizes the protocol API
>>> @@ -948,7 +949,14 @@
>>>             gen = exchange.readbundle(repo.ui, fp, None)
>>>             if (isinstance(gen, changegroupmod.cg1unpacker)
>>>                 and not bundle1allowed(repo, 'push')):
>>> -                return ooberror(bundle2required)
>>> +                if proto.name == 'http':
>>> +                    # need to special case http because stderr do not get to
>>> +                    # the http client on failed push so we need to abuse some
>>> +                    # other error type to make sure the message get to the
>>> +                    # user.
>>> +                    return ooberror(bundle2required)
>>> +                raise error.Abort(bundle2requiredmain,
>>> +                                  hint=bundle2requiredhint)
>>>
>>>             r = exchange.unbundle(repo, gen, their_heads, 'serve',
>>>                                   proto._client())
>>> diff -r a7ded180ddb3 -r f319afe9c93c tests/test-bundle2-exchange.t
>>> --- a/tests/test-bundle2-exchange.t     Fri Feb 10 17:56:47 2017 +0100
>>> +++ b/tests/test-bundle2-exchange.t     Fri Feb 10 17:56:59 2017 +0100
>>> @@ -1107,6 +1107,14 @@
>>>   (see https://www.mercurial-scm.org/wiki/IncompatibleClient)
>>>   [255]
>>>
>>> +(also check with ssh)
>>> +
>>> +  $ hg --config devel.legacy.exchange=bundle1 push ssh://user@dummy/bundle2onlyserver
>>> +  pushing to ssh://user@dummy/bundle2onlyserver
>>> +  searching for changes
>>> +  remote: abort: incompatible Mercurial client; bundle2 required
>>> +  [1]
>>> +
>>>   $ hg push
>>>   pushing to http://localhost:$HGPORT/
>>>   searching for changes
>>> _______________________________________________
>>> Mercurial-devel mailing list
>>> Mercurial-devel at mercurial-scm.org
>>> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
>> _______________________________________________
>> 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