[PATCH 1 of 2] chgserver: do not ignore SIGPIPE if pager is used

Jun Wu quark at fb.com
Fri Jun 24 16:10:17 UTC 2016


# HG changeset patch
# User Jun Wu <quark at fb.com>
# Date 1466784401 -3600
#      Fri Jun 24 17:06:41 2016 +0100
# Node ID f1195d649b4237400de44ac741f701aded61eb95
# Parent  2a54cf92c773777f8a5c821c6831c945eb4131c0
# Available At https://bitbucket.org/quark-zju/hg-draft
#              hg pull https://bitbucket.org/quark-zju/hg-draft -r f1195d649b42
chgserver: do not ignore SIGPIPE if pager is used

We rely on SIGPIPE to exit when the pager exits. And Python ignores SIGPIPE
by default. Explicitly set SIGPIPE handler to SIG_DFL (terminate) just like
pager.py.

diff --git a/hgext/chgserver.py b/hgext/chgserver.py
--- a/hgext/chgserver.py
+++ b/hgext/chgserver.py
@@ -48,6 +48,7 @@ import inspect
 import os
 import random
 import re
+import signal
 import struct
 import sys
 import threading
@@ -498,6 +499,11 @@ class chgcmdserver(commandserver.server)
 
         pagercmd = _setuppagercmd(self.ui, options, cmd)
         if pagercmd:
+            # Python's SIGPIPE is SIG_IGN by default. change to SIG_DFL so
+            # we can exit if the pipe to the pager is closed
+            if util.safehasattr(signal, 'SIGPIPE') and \
+                    signal.getsignal(signal.SIGPIPE) == signal.SIG_IGN:
+                signal.signal(signal.SIGPIPE, signal.SIG_DFL)
             self.cresult.write(pagercmd)
         else:
             self.cresult.write('\0')


More information about the Mercurial-devel mailing list