# HG changeset patch # User Yuya Nishihara # Date 2017-01-14 11:31:35 # Node ID b96c57c1f860f856958715b0bff00e1daff23175 # Parent 2cbbd4622ab06cb0da1a165064720bbbebefa227 ui: check EOF of getpass() response read from command-server channel readline() returns '' only when EOF is encountered, in which case, Python's getpass() raises EOFError. We should do the same to abort the session as "response expected." This bug was reported to https://bitbucket.org/tortoisehg/thg/issues/4659/ diff --git a/mercurial/ui.py b/mercurial/ui.py --- a/mercurial/ui.py +++ b/mercurial/ui.py @@ -972,7 +972,10 @@ class ui(object): # disable getpass() only if explicitly specified. it's still valid # to interact with tty even if fin is not a tty. if self.configbool('ui', 'nontty'): - return self.fin.readline().rstrip('\n') + l = self.fin.readline() + if not l: + raise EOFError + return l.rstrip('\n') else: return getpass.getpass('') except EOFError: diff --git a/tests/test-commandserver.t b/tests/test-commandserver.t --- a/tests/test-commandserver.t +++ b/tests/test-commandserver.t @@ -607,6 +607,12 @@ changelog and manifest would have invali ... runcommand(server, ['debuggetpass', '--config', ... 'ui.interactive=True'], ... input=stringio('1234\n')) + ... runcommand(server, ['debuggetpass', '--config', + ... 'ui.interactive=True'], + ... input=stringio('\n')) + ... runcommand(server, ['debuggetpass', '--config', + ... 'ui.interactive=True'], + ... input=stringio('')) ... runcommand(server, ['debugprompt', '--config', ... 'ui.interactive=True'], ... input=stringio('5678\n')) @@ -614,6 +620,11 @@ changelog and manifest would have invali ... runcommand(server, ['debugwritestdout']) *** runcommand debuggetpass --config ui.interactive=True password: 1234 + *** runcommand debuggetpass --config ui.interactive=True + password: + *** runcommand debuggetpass --config ui.interactive=True + password: abort: response expected + [255] *** runcommand debugprompt --config ui.interactive=True prompt: 5678 *** runcommand debugreadstdin