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

Martin von Zweigbergk martinvonz at google.com
Fri Feb 10 18:54:15 EST 2017


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.

>
> 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


More information about the Mercurial-devel mailing list