[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