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