summaryrefslogtreecommitdiff
path: root/hgext/pager.py
diff options
context:
space:
mode:
Diffstat (limited to 'hgext/pager.py')
-rw-r--r--hgext/pager.py53
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)