comparison mercurial/debugcommands.py @ 45929:87e7dd8e7734

ui: ensure `getpass()` returns bytes Previously, this could return either bytes or str. I'm not sure which direction we should go in, but since the input is bytes, I guess bytes makes sense as output. `debuguigetpass` crashed because it assumed bytes would be returned, `sslcontext.load_cert_chain()` is happy with bytes or str if the type info in PyCharm is correct, and `smtplib.SMTP.login()` wants str. I couldn't figure out how to test this, because the test stalls for input with `echo test | hg debuguigetpass --config ui.interactive=1`, likely because it drains stdin before prompting. The custom input reading with `ui.nontty=1` does not. I'm also a bit concerned with all of this encoding/decoding. The existing code in the mail module uses `encoding.strfromlocal()`, but the username and password are ascii encoded/decoded in `mercurial.url.passwordmgr.find_user_password()` with `pycompat.{str,bytes}url()`. I'm not sure if this inconsistency could cause subtle compatability issues. Differential Revision: https://phab.mercurial-scm.org/D9375
author Matt Harbison <matt_harbison@yahoo.com>
date Mon, 23 Nov 2020 11:47:06 -0500
parents 1a72e4839795
children 89a2afe31e82
comparison
equal deleted inserted replaced
45928:62329b759635 45929:87e7dd8e7734
3790 norepo=True, 3790 norepo=True,
3791 ) 3791 )
3792 def debuguigetpass(ui, prompt=b''): 3792 def debuguigetpass(ui, prompt=b''):
3793 """show prompt to type password""" 3793 """show prompt to type password"""
3794 r = ui.getpass(prompt) 3794 r = ui.getpass(prompt)
3795 if r is not None:
3796 r = encoding.strtolocal(r)
3797 else:
3798 r = b"<default response>"
3795 ui.writenoi18n(b'response: %s\n' % r) 3799 ui.writenoi18n(b'response: %s\n' % r)
3796 3800
3797 3801
3798 @command( 3802 @command(
3799 b'debuguiprompt', 3803 b'debuguiprompt',