Comments
Patch
@@ -87,14 +87,10 @@
close_fds=util.closefds, stdin=subprocess.PIPE,
stdout=util.stdout, stderr=util.stderr)
- # back up original file objects and descriptors
- olduifout = ui.fout
- oldstdout = util.stdout
+ # back up original file descriptors
stdoutfd = os.dup(util.stdout.fileno())
stderrfd = os.dup(util.stderr.fileno())
- # create new line-buffered stdout so that output can show up immediately
- ui.fout = util.stdout = newstdout = os.fdopen(util.stdout.fileno(), 'wb', 1)
os.dup2(pager.stdin.fileno(), util.stdout.fileno())
if ui._isatty(util.stderr):
os.dup2(pager.stdin.fileno(), util.stderr.fileno())
@@ -103,15 +99,10 @@
def killpager():
if util.safehasattr(signal, "SIGINT"):
signal.signal(signal.SIGINT, signal.SIG_IGN)
- pager.stdin.close()
- ui.fout = olduifout
- util.stdout = oldstdout
- # close new stdout while it's associated with pager; otherwise stdout
- # fd would be closed when newstdout is deleted
- newstdout.close()
- # restore original fds: stdout is open again
+ # restore original fds, closing pager.stdin copies in the process
os.dup2(stdoutfd, util.stdout.fileno())
os.dup2(stderrfd, util.stderr.fileno())
+ pager.stdin.close()
pager.wait()
def uisetup(ui):
@@ -63,6 +63,18 @@
urlreq = pycompat.urlreq
xmlrpclib = pycompat.xmlrpclib
+def isatty(fp):
+ try:
+ return fp.isatty()
+ except AttributeError:
+ return False
+
+# glibc determines buffering on first write to stdout - if we replace a TTY
+# destined stdout with a pipe destined stdout (e.g. pager), we want line
+# buffering
+if isatty(stdout):
+ stdout = os.fdopen(stdout.fileno(), 'wb', 1)
+
if pycompat.osname == 'nt':
from . import windows as platform
stdout = platform.winstdout(pycompat.stdout)
@@ -2750,12 +2762,6 @@
u.user = u.passwd = None
return str(u)
-def isatty(fp):
- try:
- return fp.isatty()
- except AttributeError:
- return False
-
timecount = unitcountfn(
(1, 1e3, _('%.0f s')),
(100, 1, _('%.1f s')),