##// END OF EJS Templates
pager: skip uisetup if chg is detected...
Jun Wu -
r28554:fa343854 default
parent child Browse files
Show More
@@ -1,170 +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 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 import (
70 70 cmdutil,
71 71 commands,
72 72 dispatch,
73 73 extensions,
74 74 util,
75 75 )
76 76 from mercurial.i18n import _
77 77
78 78 # Note for extension authors: ONLY specify testedwith = 'internal' 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 = 'internal'
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 # chg has its own pager implementation
121 argv = sys.argv[:]
122 if 'chgunix' in dispatch._earlygetopt(['--cmdserver'], argv):
123 return
124
120 125 def pagecmd(orig, ui, options, cmd, cmdfunc):
121 126 p = ui.config("pager", "pager", os.environ.get("PAGER"))
122 127 usepager = False
123 128 always = util.parsebool(options['pager'])
124 129 auto = options['pager'] == 'auto'
125 130
126 131 if not p:
127 132 pass
128 133 elif always:
129 134 usepager = True
130 135 elif not auto:
131 136 usepager = False
132 137 else:
133 138 attend = ui.configlist('pager', 'attend', attended)
134 139 ignore = ui.configlist('pager', 'ignore')
135 140 cmds, _ = cmdutil.findcmd(cmd, commands.table)
136 141
137 142 for cmd in cmds:
138 143 var = 'attend-%s' % cmd
139 144 if ui.config('pager', var):
140 145 usepager = ui.configbool('pager', var)
141 146 break
142 147 if (cmd in attend or
143 148 (cmd not in ignore and not attend)):
144 149 usepager = True
145 150 break
146 151
147 152 setattr(ui, 'pageractive', usepager)
148 153
149 154 if usepager:
150 155 ui.setconfig('ui', 'formatted', ui.formatted(), 'pager')
151 156 ui.setconfig('ui', 'interactive', False, 'pager')
152 157 if util.safehasattr(signal, "SIGPIPE"):
153 158 signal.signal(signal.SIGPIPE, signal.SIG_DFL)
154 159 _runpager(ui, p)
155 160 return orig(ui, options, cmd, cmdfunc)
156 161
157 162 # Wrap dispatch._runcommand after color is loaded so color can see
158 163 # ui.pageractive. Otherwise, if we loaded first, color's wrapped
159 164 # dispatch._runcommand would run without having access to ui.pageractive.
160 165 def afterloaded(loaded):
161 166 extensions.wrapfunction(dispatch, '_runcommand', pagecmd)
162 167 extensions.afterloaded('color', afterloaded)
163 168
164 169 def extsetup(ui):
165 170 commands.globalopts.append(
166 171 ('', 'pager', 'auto',
167 172 _("when to paginate (boolean, always, auto, or never)"),
168 173 _('TYPE')))
169 174
170 175 attended = ['annotate', 'cat', 'diff', 'export', 'glog', 'log', 'qdiff']
General Comments 0
You need to be logged in to leave comments. Login now