diff -r 40da2d7b4871 -r 48fe4f56a3b4 mercurial/dispatch.py --- a/mercurial/dispatch.py Sun Jan 14 19:30:48 2018 -0800 +++ b/mercurial/dispatch.py Sun Jan 14 20:06:56 2018 -0800 @@ -96,10 +96,16 @@ err = e status = -1 if util.safehasattr(req.ui, 'ferr'): - if err is not None and err.errno != errno.EPIPE: - req.ui.ferr.write('abort: %s\n' % - encoding.strtolocal(err.strerror)) - req.ui.ferr.flush() + try: + if err is not None and err.errno != errno.EPIPE: + req.ui.ferr.write('abort: %s\n' % + encoding.strtolocal(err.strerror)) + req.ui.ferr.flush() + # There's not much we can do about an I/O error here. So (possibly) + # change the status code and move on. + except IOError: + status = -1 + sys.exit(status & 255) def _initstdio():