##// END OF EJS Templates
pager: use single quotes in use warning
timeless -
r29967:bd55d980 default
parent child Browse files
Show More
@@ -1,175 +1,175 b''
1 1 # pager.py - display output using a pager
2 2 #
3 3 # Copyright 2008 David Soria Parra <dsp@php.net>
4 4 #
5 5 # This software may be used and distributed according to the terms of the
6 6 # GNU General Public License version 2 or any later version.
7 7 #
8 8 # To load the extension, add it to your configuration file:
9 9 #
10 10 # [extension]
11 11 # pager =
12 12 #
13 # Run "hg help pager" to get info on configuration.
13 # Run 'hg help pager' to get info on configuration.
14 14
15 15 '''browse command output with an external pager
16 16
17 17 To set the pager that should be used, set the application variable::
18 18
19 19 [pager]
20 20 pager = less -FRX
21 21
22 22 If no pager is set, the pager extensions uses the environment variable
23 23 $PAGER. If neither pager.pager, nor $PAGER is set, no pager is used.
24 24
25 25 You can disable the pager for certain commands by adding them to the
26 26 pager.ignore list::
27 27
28 28 [pager]
29 29 ignore = version, help, update
30 30
31 31 You can also enable the pager only for certain commands using
32 32 pager.attend. Below is the default list of commands to be paged::
33 33
34 34 [pager]
35 35 attend = annotate, cat, diff, export, glog, log, qdiff
36 36
37 37 Setting pager.attend to an empty value will cause all commands to be
38 38 paged.
39 39
40 40 If pager.attend is present, pager.ignore will be ignored.
41 41
42 42 Lastly, you can enable and disable paging for individual commands with
43 43 the attend-<command> option. This setting takes precedence over
44 44 existing attend and ignore options and defaults::
45 45
46 46 [pager]
47 47 attend-cat = false
48 48
49 49 To ignore global commands like :hg:`version` or :hg:`help`, you have
50 50 to specify them in your user configuration file.
51 51
52 52 To control whether the pager is used at all for an individual command,
53 53 you can use --pager=<value>::
54 54
55 55 - use as needed: `auto`.
56 56 - require the pager: `yes` or `on`.
57 57 - suppress the pager: `no` or `off` (any unrecognized value
58 58 will also work).
59 59
60 60 '''
61 61 from __future__ import absolute_import
62 62
63 63 import atexit
64 64 import os
65 65 import signal
66 66 import subprocess
67 67 import sys
68 68
69 69 from mercurial.i18n import _
70 70 from mercurial import (
71 71 cmdutil,
72 72 commands,
73 73 dispatch,
74 74 extensions,
75 75 util,
76 76 )
77 77
78 78 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
79 79 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
80 80 # be specifying the version(s) of Mercurial they are tested with, or
81 81 # leave the attribute unspecified.
82 82 testedwith = 'ships-with-hg-core'
83 83
84 84 def _runpager(ui, p):
85 85 pager = subprocess.Popen(p, shell=True, bufsize=-1,
86 86 close_fds=util.closefds, stdin=subprocess.PIPE,
87 87 stdout=sys.stdout, stderr=sys.stderr)
88 88
89 89 # back up original file objects and descriptors
90 90 olduifout = ui.fout
91 91 oldstdout = sys.stdout
92 92 stdoutfd = os.dup(sys.stdout.fileno())
93 93 stderrfd = os.dup(sys.stderr.fileno())
94 94
95 95 # create new line-buffered stdout so that output can show up immediately
96 96 ui.fout = sys.stdout = newstdout = os.fdopen(sys.stdout.fileno(), 'wb', 1)
97 97 os.dup2(pager.stdin.fileno(), sys.stdout.fileno())
98 98 if ui._isatty(sys.stderr):
99 99 os.dup2(pager.stdin.fileno(), sys.stderr.fileno())
100 100
101 101 @atexit.register
102 102 def killpager():
103 103 if util.safehasattr(signal, "SIGINT"):
104 104 signal.signal(signal.SIGINT, signal.SIG_IGN)
105 105 pager.stdin.close()
106 106 ui.fout = olduifout
107 107 sys.stdout = oldstdout
108 108 # close new stdout while it's associated with pager; otherwise stdout
109 109 # fd would be closed when newstdout is deleted
110 110 newstdout.close()
111 111 # restore original fds: stdout is open again
112 112 os.dup2(stdoutfd, sys.stdout.fileno())
113 113 os.dup2(stderrfd, sys.stderr.fileno())
114 114 pager.wait()
115 115
116 116 def uisetup(ui):
117 117 if '--debugger' in sys.argv or not ui.formatted():
118 118 return
119 119
120 120 # chg has its own pager implementation
121 121 argv = sys.argv[:]
122 122 if 'chgunix' in dispatch._earlygetopt(['--cmdserver'], argv):
123 123 return
124 124
125 125 def pagecmd(orig, ui, options, cmd, cmdfunc):
126 126 p = ui.config("pager", "pager", os.environ.get("PAGER"))
127 127 usepager = False
128 128 always = util.parsebool(options['pager'])
129 129 auto = options['pager'] == 'auto'
130 130
131 131 if not p:
132 132 pass
133 133 elif always:
134 134 usepager = True
135 135 elif not auto:
136 136 usepager = False
137 137 else:
138 138 attend = ui.configlist('pager', 'attend', attended)
139 139 ignore = ui.configlist('pager', 'ignore')
140 140 cmds, _ = cmdutil.findcmd(cmd, commands.table)
141 141
142 142 for cmd in cmds:
143 143 var = 'attend-%s' % cmd
144 144 if ui.config('pager', var):
145 145 usepager = ui.configbool('pager', var)
146 146 break
147 147 if (cmd in attend or
148 148 (cmd not in ignore and not attend)):
149 149 usepager = True
150 150 break
151 151
152 152 setattr(ui, 'pageractive', usepager)
153 153
154 154 if usepager:
155 155 ui.setconfig('ui', 'formatted', ui.formatted(), 'pager')
156 156 ui.setconfig('ui', 'interactive', False, 'pager')
157 157 if util.safehasattr(signal, "SIGPIPE"):
158 158 signal.signal(signal.SIGPIPE, signal.SIG_DFL)
159 159 _runpager(ui, p)
160 160 return orig(ui, options, cmd, cmdfunc)
161 161
162 162 # Wrap dispatch._runcommand after color is loaded so color can see
163 163 # ui.pageractive. Otherwise, if we loaded first, color's wrapped
164 164 # dispatch._runcommand would run without having access to ui.pageractive.
165 165 def afterloaded(loaded):
166 166 extensions.wrapfunction(dispatch, '_runcommand', pagecmd)
167 167 extensions.afterloaded('color', afterloaded)
168 168
169 169 def extsetup(ui):
170 170 commands.globalopts.append(
171 171 ('', 'pager', 'auto',
172 172 _("when to paginate (boolean, always, auto, or never)"),
173 173 _('TYPE')))
174 174
175 175 attended = ['annotate', 'cat', 'diff', 'export', 'glog', 'log', 'qdiff']
General Comments 0
You need to be logged in to leave comments. Login now