pager: work around bug in python 2.4's subprocess module (
issue3533)
hg v2.2.2 fixed the pager on Windows, but broke it on Python 2.4.
This patch only uses the new behavior if Python >= 2.5 is detected.
--- a/hgext/pager.py Wed Jul 25 19:02:35 2012 +0200
+++ b/hgext/pager.py Fri Jul 06 18:06:52 2012 -0400
@@ -53,7 +53,35 @@
testedwith = 'internal'
-def _runpager(ui, p):
+def _pagerfork(ui, p):
+ if not util.safehasattr(os, 'fork'):
+ sys.stdout = util.popen(p, 'wb')
+ if ui._isatty(sys.stderr):
+ sys.stderr = sys.stdout
+ return
+ fdin, fdout = os.pipe()
+ pid = os.fork()
+ if pid == 0:
+ os.close(fdin)
+ os.dup2(fdout, sys.stdout.fileno())
+ if ui._isatty(sys.stderr):
+ os.dup2(fdout, sys.stderr.fileno())
+ os.close(fdout)
+ return
+ os.dup2(fdin, sys.stdin.fileno())
+ os.close(fdin)
+ os.close(fdout)
+ try:
+ os.execvp('/bin/sh', ['/bin/sh', '-c', p])
+ except OSError, e:
+ if e.errno == errno.ENOENT:
+ # no /bin/sh, try executing the pager directly
+ args = shlex.split(p)
+ os.execvp(args[0], args)
+ else:
+ raise
+
+def _pagersubprocess(ui, p):
pager = subprocess.Popen(p, shell=True, bufsize=-1,
close_fds=util.closefds, stdin=subprocess.PIPE,
stdout=sys.stdout, stderr=sys.stderr)
@@ -71,6 +99,15 @@
os.dup2(stderr, sys.stderr.fileno())
pager.wait()
+def _runpager(ui, p):
+ # The subprocess module shipped with Python <= 2.4 is buggy (issue3533).
+ # The compat version is buggy on Windows (issue3225), but has been shipping
+ # with hg for a long time. Preserve existing functionality.
+ if sys.version_info >= (2, 5):
+ _pagersubprocess(ui, p)
+ else:
+ _pagerfork(ui, p)
+
def uisetup(ui):
if '--debugger' in sys.argv or not ui.formatted():
return