[PATCH] pager: exit cleanly on SIGPIPE (BC)

Jun Wu quark at fb.com
Fri Feb 10 07:24:16 EST 2017


I forgot to mention this looks good to me too (as I saw dsp replied first).

It's an improved version of "dispatch: treat SIGPIPE as a termination signal
(BC)".

Excerpts from Simon Farnsworth's message of 2017-02-08 07:47:39 -0800:
> # HG changeset patch
> # User Simon Farnsworth <simonfar at fb.com>
> # Date 1486568650 28800
> #      Wed Feb 08 07:44:10 2017 -0800
> # Node ID d50cda2a403786836d1f0d5c99401599dc4f43ec
> # Parent  1f51b4658f21bbb797e922d155c1046eddccf91d
> pager: exit cleanly on SIGPIPE (BC)
> 
> Changeset aaa751585325 removes SIGPIPE handling completely. This is wrong,
> as it means that Mercurial does not exit when the pager does. Instead, raise
> SignalInterrupt when SIGPIPE happens with a pager attached, to trigger the
> normal exit path.
> 
> This will cause "killed!" to be printed to stderr (hence the BC warning),
> but in the normal pager use case (where the pager gets both stderr and
> stdout), this messsage is lost as we only get SIGPIPE when the pager quits.
> 
> diff --git a/hgext/pager.py b/hgext/pager.py
> --- a/hgext/pager.py
> +++ b/hgext/pager.py
> @@ -72,6 +72,7 @@
>      commands,
>      dispatch,
>      encoding,
> +    error,
>      extensions,
>      util,
>      )
> @@ -114,6 +115,9 @@
>          os.dup2(stderrfd, util.stderr.fileno())
>          pager.wait()
>  
> +def catchterm(*args):
> +    raise error.SignalInterrupt
> +
>  def uisetup(ui):
>      class pagerui(ui.__class__):
>          def _runpager(self, pagercmd):
> @@ -153,6 +157,8 @@
>          if usepager:
>              ui.setconfig('ui', 'formatted', ui.formatted(), 'pager')
>              ui.setconfig('ui', 'interactive', False, 'pager')
> +            if util.safehasattr(signal, "SIGPIPE"):
> +                signal.signal(signal.SIGPIPE, catchterm)
>              ui._runpager(p)
>          return orig(ui, options, cmd, cmdfunc)
>  


More information about the Mercurial-devel mailing list