diff options
Diffstat (limited to 'hgext/pager.py')
-rw-r--r-- | hgext/pager.py | 53 |
1 files changed, 15 insertions, 38 deletions
diff --git a/hgext/pager.py b/hgext/pager.py index ae430ef..ccf0bd5 100644 --- a/hgext/pager.py +++ b/hgext/pager.py @@ -17,11 +17,17 @@ To set the pager that should be used, set the application variable:: [pager] - pager = less -FRX + pager = less -FRSX If no pager is set, the pager extensions uses the environment variable $PAGER. If neither pager.pager, nor $PAGER is set, no pager is used. +If you notice "BROKEN PIPE" error messages, you can disable them by +setting:: + + [pager] + quiet = True + You can disable the pager for certain commands by adding them to the pager.ignore list:: @@ -47,16 +53,14 @@ used. Use a boolean value like yes, no, on, off, or use auto for normal behavior. ''' -import atexit, sys, os, signal, subprocess +import sys, os, signal, shlex, errno from mercurial import commands, dispatch, util, extensions from mercurial.i18n import _ -testedwith = 'internal' - -def _pagerfork(ui, p): - if not util.safehasattr(os, 'fork'): +def _runpager(p): + if not hasattr(os, 'fork'): sys.stdout = util.popen(p, 'wb') - if ui._isatty(sys.stderr): + if util.isatty(sys.stderr): sys.stderr = sys.stdout return fdin, fdout = os.pipe() @@ -64,7 +68,7 @@ def _pagerfork(ui, p): if pid == 0: os.close(fdin) os.dup2(fdout, sys.stdout.fileno()) - if ui._isatty(sys.stderr): + if util.isatty(sys.stderr): os.dup2(fdout, sys.stderr.fileno()) os.close(fdout) return @@ -81,35 +85,8 @@ def _pagerfork(ui, p): 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) - - stdout = os.dup(sys.stdout.fileno()) - stderr = os.dup(sys.stderr.fileno()) - os.dup2(pager.stdin.fileno(), sys.stdout.fileno()) - if ui._isatty(sys.stderr): - os.dup2(pager.stdin.fileno(), sys.stderr.fileno()) - - @atexit.register - def killpager(): - pager.stdin.close() - os.dup2(stdout, sys.stdout.fileno()) - 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(): + if ui.plain() or '--debugger' in sys.argv or not util.isatty(sys.stdout): return def pagecmd(orig, ui, options, cmd, cmdfunc): @@ -124,9 +101,9 @@ def uisetup(ui): (cmd not in ui.configlist('pager', 'ignore') and not attend))): ui.setconfig('ui', 'formatted', ui.formatted()) ui.setconfig('ui', 'interactive', False) - if util.safehasattr(signal, "SIGPIPE"): + _runpager(p) + if ui.configbool('pager', 'quiet'): signal.signal(signal.SIGPIPE, signal.SIG_DFL) - _runpager(ui, p) return orig(ui, options, cmd, cmdfunc) extensions.wrapfunction(dispatch, '_runcommand', pagecmd) |