85 def _runpager(ui, p): |
85 def _runpager(ui, p): |
86 pager = subprocess.Popen(p, shell=True, bufsize=-1, |
86 pager = subprocess.Popen(p, shell=True, bufsize=-1, |
87 close_fds=util.closefds, stdin=subprocess.PIPE, |
87 close_fds=util.closefds, stdin=subprocess.PIPE, |
88 stdout=util.stdout, stderr=util.stderr) |
88 stdout=util.stdout, stderr=util.stderr) |
89 |
89 |
90 # back up original file objects and descriptors |
90 # back up original file descriptors |
91 olduifout = ui.fout |
|
92 oldstdout = util.stdout |
|
93 stdoutfd = os.dup(util.stdout.fileno()) |
91 stdoutfd = os.dup(util.stdout.fileno()) |
94 stderrfd = os.dup(util.stderr.fileno()) |
92 stderrfd = os.dup(util.stderr.fileno()) |
95 |
93 |
96 # create new line-buffered stdout so that output can show up immediately |
|
97 ui.fout = util.stdout = newstdout = os.fdopen(util.stdout.fileno(), 'wb', 1) |
|
98 os.dup2(pager.stdin.fileno(), util.stdout.fileno()) |
94 os.dup2(pager.stdin.fileno(), util.stdout.fileno()) |
99 if ui._isatty(util.stderr): |
95 if ui._isatty(util.stderr): |
100 os.dup2(pager.stdin.fileno(), util.stderr.fileno()) |
96 os.dup2(pager.stdin.fileno(), util.stderr.fileno()) |
101 |
97 |
102 @atexit.register |
98 @atexit.register |
103 def killpager(): |
99 def killpager(): |
104 if util.safehasattr(signal, "SIGINT"): |
100 if util.safehasattr(signal, "SIGINT"): |
105 signal.signal(signal.SIGINT, signal.SIG_IGN) |
101 signal.signal(signal.SIGINT, signal.SIG_IGN) |
106 pager.stdin.close() |
102 # restore original fds, closing pager.stdin copies in the process |
107 ui.fout = olduifout |
|
108 util.stdout = oldstdout |
|
109 # close new stdout while it's associated with pager; otherwise stdout |
|
110 # fd would be closed when newstdout is deleted |
|
111 newstdout.close() |
|
112 # restore original fds: stdout is open again |
|
113 os.dup2(stdoutfd, util.stdout.fileno()) |
103 os.dup2(stdoutfd, util.stdout.fileno()) |
114 os.dup2(stderrfd, util.stderr.fileno()) |
104 os.dup2(stderrfd, util.stderr.fileno()) |
|
105 pager.stdin.close() |
115 pager.wait() |
106 pager.wait() |
116 |
107 |
117 def uisetup(ui): |
108 def uisetup(ui): |
118 class pagerui(ui.__class__): |
109 class pagerui(ui.__class__): |
119 def _runpager(self, pagercmd): |
110 def _runpager(self, pagercmd): |