hgext/pager.py
changeset 26454 62c5e937f477
parent 26453 1a2578418689
child 27128 efceacd6a0c6
--- a/hgext/pager.py	Sat Oct 03 18:48:21 2015 +0900
+++ b/hgext/pager.py	Sat Oct 03 15:16:33 2015 +0900
@@ -70,8 +70,14 @@
                              close_fds=util.closefds, stdin=subprocess.PIPE,
                              stdout=sys.stdout, stderr=sys.stderr)
 
+    # back up original file objects and descriptors
+    olduifout = ui.fout
+    oldstdout = sys.stdout
     stdoutfd = os.dup(sys.stdout.fileno())
     stderrfd = os.dup(sys.stderr.fileno())
+
+    # create new line-buffered stdout so that output can show up immediately
+    ui.fout = sys.stdout = newstdout = os.fdopen(sys.stdout.fileno(), 'wb', 1)
     os.dup2(pager.stdin.fileno(), sys.stdout.fileno())
     if ui._isatty(sys.stderr):
         os.dup2(pager.stdin.fileno(), sys.stderr.fileno())
@@ -81,6 +87,12 @@
         if util.safehasattr(signal, "SIGINT"):
             signal.signal(signal.SIGINT, signal.SIG_IGN)
         pager.stdin.close()
+        ui.fout = olduifout
+        sys.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
         os.dup2(stdoutfd, sys.stdout.fileno())
         os.dup2(stderrfd, sys.stderr.fileno())
         pager.wait()