##// END OF EJS Templates
dispatch: don't show list of commands on bogus command...
dispatch: don't show list of commands on bogus command If a command is ambiguous, you get this: $ hg ve hg: command 've' is ambiguous: verify version [255] If you typo a command, you get this: $ hg comit hg: unknown command 'comit' (did you mean one of commit, incoming, mycommit?) [255] But if you completely mistype a command so it no longer looks like any existing commands, you get a full list of commands. That might be useful the first time you use Mercurial, but after that it's probably more annoying than help, especially if you have the pager enabled and have a short terminal. Let's instead give a short hint telling the user to run `hg help` for more help. Differential Revision: https://phab.mercurial-scm.org/D4024

File last commit:

r37803:b4d85bc1 default
r38810:81fb4421 default
Show More
sshprotoext.py
98 lines | 3.6 KiB | text/x-python | PythonLexer
Gregory Szorc
tests: add low-level SSH protocol tests...
r35948 # sshprotoext.py - Extension to test behavior of SSH protocol
#
# Copyright 2018 Gregory Szorc <gregory.szorc@gmail.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
# This extension replaces the SSH server started via `hg serve --stdio`.
# The server behaves differently depending on environment variables.
from __future__ import absolute_import
from mercurial import (
error,
Gregory Szorc
sshpeer: move handshake outside of sshpeer...
r35956 extensions,
Gregory Szorc
tests: add low-level SSH protocol tests...
r35948 registrar,
sshpeer,
wireprotoserver,
Gregory Szorc
wireproto: rename wireproto to wireprotov1server (API)...
r37803 wireprotov1server,
Gregory Szorc
tests: add low-level SSH protocol tests...
r35948 )
configtable = {}
configitem = registrar.configitem(configtable)
Gregory Szorc
py3: add b'' to config options in test extension...
r36229 configitem(b'sshpeer', b'mode', default=None)
configitem(b'sshpeer', b'handshake-mode', default=None)
Gregory Szorc
tests: add low-level SSH protocol tests...
r35948
class bannerserver(wireprotoserver.sshserver):
"""Server that sends a banner to stdout."""
def serve_forever(self):
for i in range(10):
self._fout.write(b'banner: line %d\n' % i)
super(bannerserver, self).serve_forever()
class prehelloserver(wireprotoserver.sshserver):
"""Tests behavior when connecting to <0.9.1 servers.
The ``hello`` wire protocol command was introduced in Mercurial
0.9.1. Modern clients send the ``hello`` command when connecting
to SSH servers. This mock server tests behavior of the handshake
when ``hello`` is not supported.
"""
def serve_forever(self):
l = self._fin.readline()
assert l == b'hello\n'
# Respond to unknown commands with an empty reply.
Gregory Szorc
wireprotoserver: extract SSH response handling functions...
r36081 wireprotoserver._sshv1respondbytes(self._fout, b'')
Gregory Szorc
tests: add low-level SSH protocol tests...
r35948 l = self._fin.readline()
assert l == b'between\n'
Gregory Szorc
wireprotoserver: move SSH server operation to a standalone function...
r36232 proto = wireprotoserver.sshv1protocolhandler(self._ui, self._fin,
self._fout)
Gregory Szorc
wireproto: rename wireproto to wireprotov1server (API)...
r37803 rsp = wireprotov1server.dispatch(self._repo, proto, b'between')
Gregory Szorc
wireproto: introduce type for raw byte responses (API)...
r36091 wireprotoserver._sshv1respondbytes(self._fout, rsp.data)
Gregory Szorc
tests: add low-level SSH protocol tests...
r35948
super(prehelloserver, self).serve_forever()
Gregory Szorc
sshpeer: move handshake outside of sshpeer...
r35956 def performhandshake(orig, ui, stdin, stdout, stderr):
"""Wrapped version of sshpeer._performhandshake to send extra commands."""
mode = ui.config(b'sshpeer', b'handshake-mode')
if mode == b'pre-no-args':
ui.debug(b'sending no-args command\n')
stdin.write(b'no-args\n')
stdin.flush()
return orig(ui, stdin, stdout, stderr)
elif mode == b'pre-multiple-no-args':
ui.debug(b'sending unknown1 command\n')
stdin.write(b'unknown1\n')
ui.debug(b'sending unknown2 command\n')
stdin.write(b'unknown2\n')
ui.debug(b'sending unknown3 command\n')
stdin.write(b'unknown3\n')
stdin.flush()
return orig(ui, stdin, stdout, stderr)
else:
raise error.ProgrammingError(b'unknown HANDSHAKECOMMANDMODE: %s' %
mode)
Gregory Szorc
tests: add low-level SSH protocol tests...
r35948
def extsetup(ui):
# It's easier for tests to define the server behavior via environment
# variables than config options. This is because `hg serve --stdio`
# has to be invoked with a certain form for security reasons and
# `dummyssh` can't just add `--config` flags to the command line.
servermode = ui.environ.get(b'SSHSERVERMODE')
if servermode == b'banner':
wireprotoserver.sshserver = bannerserver
elif servermode == b'no-hello':
wireprotoserver.sshserver = prehelloserver
elif servermode:
raise error.ProgrammingError(b'unknown server mode: %s' % servermode)
peermode = ui.config(b'sshpeer', b'mode')
if peermode == b'extra-handshake-commands':
Gregory Szorc
sshpeer: move handshake outside of sshpeer...
r35956 extensions.wrapfunction(sshpeer, '_performhandshake', performhandshake)
Gregory Szorc
tests: add low-level SSH protocol tests...
r35948 elif peermode:
raise error.ProgrammingError(b'unknown peer mode: %s' % peermode)