comparison hgext/pager.py @ 25201:59d794154e8d

pager: drop python 2.4 hack around subprocess Farewell, we do not need you anymore.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Mon, 18 May 2015 16:20:12 -0500
parents 80c5b2666a96
children 499d5c98e98b
comparison
equal deleted inserted replaced
25200:3613819fb05f 25201:59d794154e8d
53 used. Use a boolean value like yes, no, on, off, or use auto for 53 used. Use a boolean value like yes, no, on, off, or use auto for
54 normal behavior. 54 normal behavior.
55 55
56 ''' 56 '''
57 57
58 import atexit, sys, os, signal, subprocess, errno, shlex 58 import atexit, sys, os, signal, subprocess
59 from mercurial import commands, dispatch, util, extensions, cmdutil 59 from mercurial import commands, dispatch, util, extensions, cmdutil
60 from mercurial.i18n import _ 60 from mercurial.i18n import _
61 61
62 # Note for extension authors: ONLY specify testedwith = 'internal' for 62 # Note for extension authors: ONLY specify testedwith = 'internal' for
63 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should 63 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
64 # be specifying the version(s) of Mercurial they are tested with, or 64 # be specifying the version(s) of Mercurial they are tested with, or
65 # leave the attribute unspecified. 65 # leave the attribute unspecified.
66 testedwith = 'internal' 66 testedwith = 'internal'
67
68 def _pagerfork(ui, p):
69 if not util.safehasattr(os, 'fork'):
70 sys.stdout = util.popen(p, 'wb')
71 if ui._isatty(sys.stderr):
72 sys.stderr = sys.stdout
73 return
74 fdin, fdout = os.pipe()
75 pid = os.fork()
76 if pid == 0:
77 os.close(fdin)
78 os.dup2(fdout, sys.stdout.fileno())
79 if ui._isatty(sys.stderr):
80 os.dup2(fdout, sys.stderr.fileno())
81 os.close(fdout)
82 return
83 os.dup2(fdin, sys.stdin.fileno())
84 os.close(fdin)
85 os.close(fdout)
86 try:
87 os.execvp('/bin/sh', ['/bin/sh', '-c', p])
88 except OSError, e:
89 if e.errno == errno.ENOENT:
90 # no /bin/sh, try executing the pager directly
91 args = shlex.split(p)
92 os.execvp(args[0], args)
93 else:
94 raise
95 67
96 def _pagersubprocess(ui, p): 68 def _pagersubprocess(ui, p):
97 pager = subprocess.Popen(p, shell=True, bufsize=-1, 69 pager = subprocess.Popen(p, shell=True, bufsize=-1,
98 close_fds=util.closefds, stdin=subprocess.PIPE, 70 close_fds=util.closefds, stdin=subprocess.PIPE,
99 stdout=sys.stdout, stderr=sys.stderr) 71 stdout=sys.stdout, stderr=sys.stderr)
112 os.dup2(stdout, sys.stdout.fileno()) 84 os.dup2(stdout, sys.stdout.fileno())
113 os.dup2(stderr, sys.stderr.fileno()) 85 os.dup2(stderr, sys.stderr.fileno())
114 pager.wait() 86 pager.wait()
115 87
116 def _runpager(ui, p): 88 def _runpager(ui, p):
117 # The subprocess module shipped with Python <= 2.4 is buggy (issue3533). 89 _pagersubprocess(ui, p)
118 # The compat version is buggy on Windows (issue3225), but has been shipping
119 # with hg for a long time. Preserve existing functionality.
120 if sys.version_info >= (2, 5):
121 _pagersubprocess(ui, p)
122 else:
123 _pagerfork(ui, p)
124 90
125 def uisetup(ui): 91 def uisetup(ui):
126 if '--debugger' in sys.argv or not ui.formatted(): 92 if '--debugger' in sys.argv or not ui.formatted():
127 return 93 return
128 94