Mercurial > hg
comparison mercurial/ui.py @ 46024:07b0a687c01a stable
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 | 14ac6a74e7e7 |
children | 2cf61e66c6d0 |
comparison
equal
deleted
inserted
replaced
46023:139b334c9392 | 46024:07b0a687c01a |
---|---|
1733 l = self._fin.readline() | 1733 l = self._fin.readline() |
1734 if not l: | 1734 if not l: |
1735 raise EOFError | 1735 raise EOFError |
1736 return l.rstrip(b'\n') | 1736 return l.rstrip(b'\n') |
1737 else: | 1737 else: |
1738 return getpass.getpass('') | 1738 return encoding.strtolocal(getpass.getpass('')) |
1739 except EOFError: | 1739 except EOFError: |
1740 raise error.ResponseExpected() | 1740 raise error.ResponseExpected() |
1741 | 1741 |
1742 def status(self, *msg, **opts): | 1742 def status(self, *msg, **opts): |
1743 '''write status message to output (if ui.quiet is False) | 1743 '''write status message to output (if ui.quiet is False) |