##// END OF EJS Templates
run-tests: write out scripts in binary mode...
run-tests: write out scripts in binary mode Caught because Python 3 refuses to write bytes to a non-binary fd.

File last commit:

r21281:bcddddcf default
r21916:792ebd7d default
Show More
pager.py
168 lines | 5.2 KiB | text/x-python | PythonLexer
David Soria Parra
Use the pager given by the environment to display long output...
r6323 # pager.py - display output using a pager
#
# Copyright 2008 David Soria Parra <dsp@php.net>
#
Martin Geisler
updated license to be explicit about GPL version 2
r8225 # This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
David Soria Parra
Use the pager given by the environment to display long output...
r6323 #
Brodie Rao
help: refer to user configuration file more consistently...
r12083 # To load the extension, add it to your configuration file:
David Soria Parra
Use the pager given by the environment to display long output...
r6323 #
# [extension]
Martin Geisler
hgext: enable extensions without "hgext." prefix in help texts
r10112 # pager =
David Soria Parra
Use the pager given by the environment to display long output...
r6323 #
Christian Ebert
pager: make config info accessible with "hg help pager"
r6462 # Run "hg help pager" to get info on configuration.
Cédric Duval
extensions: improve the consistency of synopses...
r8894 '''browse command output with an external pager
Christian Ebert
pager: make config info accessible with "hg help pager"
r6462
Martin Geisler
pager: use reST syntax for literal blocks
r9212 To set the pager that should be used, set the application variable::
Christian Ebert
pager: make config info accessible with "hg help pager"
r6462
[pager]
Thomas Arendsen Hein
pager: drop -S option for less in example for pager configuration...
r17305 pager = less -FRX
Christian Ebert
pager: make config info accessible with "hg help pager"
r6462
Martin Geisler
pager: wrap docstrings at 70 characters
r9267 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.
Christian Ebert
pager: make config info accessible with "hg help pager"
r6462
You can disable the pager for certain commands by adding them to the
Martin Geisler
pager: use reST syntax for literal blocks
r9212 pager.ignore list::
Christian Ebert
pager: make config info accessible with "hg help pager"
r6462
[pager]
ignore = version, help, update
Martin Geisler
pager: wrap docstrings at 70 characters
r9267 You can also enable the pager only for certain commands using
Brodie Rao
pager: provide a default attend list...
r9841 pager.attend. Below is the default list of commands to be paged::
Christian Ebert
pager: make config info accessible with "hg help pager"
r6462
[pager]
Brodie Rao
pager: provide a default attend list...
r9841 attend = annotate, cat, diff, export, glog, log, qdiff
Setting pager.attend to an empty value will cause all commands to be
paged.
Christian Ebert
pager: make config info accessible with "hg help pager"
r6462
If pager.attend is present, pager.ignore will be ignored.
Matt Mackall
pager: add attend-<command> option...
r21281 Lastly, you can enable and disable paging for individual commands with
the attend-<command> option. This setting takes precedence over
existing attend and ignore options and defaults::
[pager]
attend-cat = false
Martin Geisler
Use hg role in help strings
r10973 To ignore global commands like :hg:`version` or :hg:`help`, you have
Brodie Rao
help: refer to user configuration file more consistently...
r12083 to specify them in your user configuration file.
Brodie Rao
pager: add global --pager=<auto/boolean> option
r12694
The --pager=... option can also be used to control when the pager is
used. Use a boolean value like yes, no, on, off, or use auto for
normal behavior.
Matt Mackall
pager: add attend-<command> option...
r21281
Christian Ebert
pager: make config info accessible with "hg help pager"
r6462 '''
David Soria Parra
Use the pager given by the environment to display long output...
r6323
Bryan O'Sullivan
pager: add missing imports of errno and shlex...
r18923 import atexit, sys, os, signal, subprocess, errno, shlex
David Soria Parra
pager: honour internal aliases...
r19940 from mercurial import commands, dispatch, util, extensions, cmdutil
Brodie Rao
pager: add global --pager=<auto/boolean> option
r12694 from mercurial.i18n import _
David Soria Parra
Use the pager given by the environment to display long output...
r6323
Augie Fackler
hgext: mark all first-party extensions as such
r16743 testedwith = 'internal'
Michael Bacarella
pager: work around bug in python 2.4's subprocess module (issue3533)...
r17250 def _pagerfork(ui, p):
if not util.safehasattr(os, 'fork'):
sys.stdout = util.popen(p, 'wb')
if ui._isatty(sys.stderr):
sys.stderr = sys.stdout
return
fdin, fdout = os.pipe()
pid = os.fork()
if pid == 0:
os.close(fdin)
os.dup2(fdout, sys.stdout.fileno())
if ui._isatty(sys.stderr):
os.dup2(fdout, sys.stderr.fileno())
os.close(fdout)
return
os.dup2(fdin, sys.stdin.fileno())
os.close(fdin)
os.close(fdout)
try:
os.execvp('/bin/sh', ['/bin/sh', '-c', p])
except OSError, e:
if e.errno == errno.ENOENT:
# no /bin/sh, try executing the pager directly
args = shlex.split(p)
os.execvp(args[0], args)
else:
raise
def _pagersubprocess(ui, p):
Brodie Rao
pager: preserve Hg's exit code (and fix Windows support) (issue3225)...
r16631 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())
Matt Mackall
pager: use ui._isatty infrastructure
r16752 if ui._isatty(sys.stderr):
Brodie Rao
pager: preserve Hg's exit code (and fix Windows support) (issue3225)...
r16631 os.dup2(pager.stdin.fileno(), sys.stderr.fileno())
@atexit.register
def killpager():
Matt Mackall
pager: catch ctrl-c on exit (issue3834)
r18717 if util.safehasattr(signal, "SIGINT"):
signal.signal(signal.SIGINT, signal.SIG_IGN)
Brodie Rao
pager: preserve Hg's exit code (and fix Windows support) (issue3225)...
r16631 pager.stdin.close()
os.dup2(stdout, sys.stdout.fileno())
os.dup2(stderr, sys.stderr.fileno())
pager.wait()
Brodie Rao
pager: fork and exec pager as parent process...
r11182
Michael Bacarella
pager: work around bug in python 2.4's subprocess module (issue3533)...
r17250 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)
David Soria Parra
Use the pager given by the environment to display long output...
r6323 def uisetup(ui):
Matt Mackall
pager: use ui._isatty infrastructure
r16752 if '--debugger' in sys.argv or not ui.formatted():
Yuya Nishihara
pager: respect HGPLAIN...
r11414 return
Matt Mackall
extensions: use new wrapper functions
r7216 def pagecmd(orig, ui, options, cmd, cmdfunc):
David Soria Parra <dsp <at> php.net>
pager: Add a configuration to enable/disable the pager for certain commands...
r6417 p = ui.config("pager", "pager", os.environ.get("PAGER"))
Matt Mackall
pager: break pager invocation out of command check loop
r21277 usepager = False
Matt Mackall
pager: break always out of command check loop
r21278 always = util.parsebool(options['pager'])
Matt Mackall
pager: break auto out of command check loop
r21279 auto = options['pager'] == 'auto'
Idan Kamara
util: add helper function isatty(fd) to check for tty-ness
r14515
Matt Mackall
pager: break pager invocation out of command check loop
r21277 if not p:
pass
Matt Mackall
pager: break always out of command check loop
r21278 elif always:
usepager = True
Matt Mackall
pager: break auto out of command check loop
r21279 elif not auto:
usepager = False
Matt Mackall
pager: break pager invocation out of command check loop
r21277 else:
Brodie Rao
pager: provide a default attend list...
r9841 attend = ui.configlist('pager', 'attend', attended)
Matt Mackall
pager: variable reorder
r21280 ignore = ui.configlist('pager', 'ignore')
David Soria Parra
pager: honour internal aliases...
r19940 cmds, _ = cmdutil.findcmd(cmd, commands.table)
for cmd in cmds:
Matt Mackall
pager: add attend-<command> option...
r21281 var = 'attend-%s' % cmd
if ui.config('pager', var):
usepager = ui.configbool('pager', var)
break
Matt Mackall
pager: break auto out of command check loop
r21279 if (cmd in attend or
(cmd not in ignore and not attend)):
Matt Mackall
pager: break pager invocation out of command check loop
r21277 usepager = True
David Soria Parra
pager: honour internal aliases...
r19940 break
Matt Mackall
pager: break pager invocation out of command check loop
r21277
if usepager:
ui.setconfig('ui', 'formatted', ui.formatted(), 'pager')
ui.setconfig('ui', 'interactive', False, 'pager')
if util.safehasattr(signal, "SIGPIPE"):
signal.signal(signal.SIGPIPE, signal.SIG_DFL)
_runpager(ui, p)
Matt Mackall
extensions: use new wrapper functions
r7216 return orig(ui, options, cmd, cmdfunc)
David Soria Parra <dsp <at> php.net>
pager: Add a configuration to enable/disable the pager for certain commands...
r6417
Matt Mackall
extensions: use new wrapper functions
r7216 extensions.wrapfunction(dispatch, '_runcommand', pagecmd)
Brodie Rao
pager: provide a default attend list...
r9841
Brodie Rao
pager: add global --pager=<auto/boolean> option
r12694 def extsetup(ui):
commands.globalopts.append(
('', 'pager', 'auto',
_("when to paginate (boolean, always, auto, or never)"),
_('TYPE')))
Brodie Rao
pager: provide a default attend list...
r9841 attended = ['annotate', 'cat', 'diff', 'export', 'glog', 'log', 'qdiff']