[PATCH 5 of 9] stdio: catch StdioError in dispatch.run and clean up appropriately
Yuya Nishihara
yuya at tcha.org
Tue Apr 11 09:54:54 EDT 2017
On Mon, 10 Apr 2017 11:51:35 -0700, Bryan O'Sullivan wrote:
> # HG changeset patch
> # User Bryan O'Sullivan <bryano at fb.com>
> # Date 1490804813 25200
> # Wed Mar 29 09:26:53 2017 -0700
> # Node ID 024364c1aa2e8b247d6156208394ebf01913f85a
> # Parent 935d0e5af9001f3a0730e7c477dc14ae5baf4799
> stdio: catch StdioError in dispatch.run and clean up appropriately
>
> We attempt to report what went wrong, and more importantly exit the
> program with an error code.
>
> (The exception we catch is not yet raised anywhere in the code.)
>
> diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py
> --- a/mercurial/dispatch.py
> +++ b/mercurial/dispatch.py
> @@ -60,7 +60,22 @@ class request(object):
>
> def run():
> "run the command in sys.argv"
> - sys.exit((dispatch(request(pycompat.sysargv[1:])) or 0) & 255)
> + req = request(pycompat.sysargv[1:])
> + err = None
> + try:
> + status = (dispatch(req) or 0) & 255
> + except error.StdioError as err:
> + status = 1
> + if util.safehasattr(req.ui, 'fout'):
> + try:
> + req.ui.fout.close()
> + except IOError as err:
> + status = 1
255 would be better, too.
> + if util.safehasattr(req.ui, 'ferr'):
> + if err is not None and err.errno != errno.EPIPE:
> + req.ui.ferr.write('abort: %s\n' % err.strerror)
> + req.ui.ferr.close()
> + sys.exit(status)
Is it safe to close stdout and stderr here? IIRC, Python interpreter can
somehow crash due to closed stdout/err on Windows.
More information about the Mercurial-devel
mailing list