Mercurial > hg
annotate hgext/pager.py @ 30409:0852161588c6
osutil: implement setprocname to set process title for some platforms
This patch adds a simple setprocname method to osutil. The operation is not
defined by any standard and is platform-specific, the current implementation
tries to cover some major platforms (ex. Linux, OS X, FreeBSD) that is
relatively easy to support. Other platforms (Windows [4], other BSDs, ...)
can be added in the future.
The current implementation supports two methods to change process title:
a. setproctitle if available (works in FreeBSD).
b. rewrite argv in place (works in Linux [1] and Mac OS X). [2] [3]
[1]: Linux has "prctl(PR_SET_NAME, ...)" but 1) it has 16-byte limit, which
is too small; 2) it is not quite equivalent to what we want - it changes
"/proc/self/comm", not "/proc/self/cmdline" - "comm" change won't show up
in "ps" output unless "-o comm" is used.
[2]: The implementation does not rewrite the **environ buffer like some
other implementations do, just to make the code simpler and safer. However,
this also means the buffer size we can rewrite is significantly shorter. If
we are really greedy and want the "environ" space, we can change the
implementation later.
[3]: It requires a CPython private API: Py_GetArgcArgv to get the original
argv. Unfortunately Python 3 makes a copy of argv and returns the wchar_t
version, so it is not supported for now. (if we really want to, we could
count backwards from "char **environ", given known argc and argv, not sure
if that's a good idea - probably not)
[4]: The feature is aimed to make it easier for forked command server
processes to show what they are doing. Since Windows does not support
fork(), despite it's a major platform, its support is not added in this
patch.
author | Jun Wu <quark@fb.com> |
---|---|
date | Fri, 11 Nov 2016 21:11:17 +0000 |
parents | bd55d98027ee |
children | 39d13b8c101d |
rev | line source |
---|---|
6323
6e1308a09ffd
Use the pager given by the environment to display long output
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
1 # pager.py - display output using a pager |
6e1308a09ffd
Use the pager given by the environment to display long output
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
2 # |
6e1308a09ffd
Use the pager given by the environment to display long output
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
3 # Copyright 2008 David Soria Parra <dsp@php.net> |
6e1308a09ffd
Use the pager given by the environment to display long output
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
4 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
7995
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
10263 | 6 # GNU General Public License version 2 or any later version. |
6323
6e1308a09ffd
Use the pager given by the environment to display long output
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
7 # |
12083
ebfc46929f3e
help: refer to user configuration file more consistently
Brodie Rao <brodie@bitheap.org>
parents:
11414
diff
changeset
|
8 # To load the extension, add it to your configuration file: |
6323
6e1308a09ffd
Use the pager given by the environment to display long output
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
9 # |
6e1308a09ffd
Use the pager given by the environment to display long output
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
10 # [extension] |
10112
703db37d186b
hgext: enable extensions without "hgext." prefix in help texts
Martin Geisler <mg@lazybytes.net>
parents:
9841
diff
changeset
|
11 # pager = |
6323
6e1308a09ffd
Use the pager given by the environment to display long output
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
12 # |
29967
bd55d98027ee
pager: use single quotes in use warning
timeless <timeless@mozdev.org>
parents:
29841
diff
changeset
|
13 # Run 'hg help pager' to get info on configuration. |
6462
6c4e12682fb9
pager: make config info accessible with "hg help pager"
Christian Ebert <blacktrash@gmx.net>
parents:
6457
diff
changeset
|
14 |
8894
868670dbc237
extensions: improve the consistency of synopses
Cédric Duval <cedricduval@free.fr>
parents:
8225
diff
changeset
|
15 '''browse command output with an external pager |
6462
6c4e12682fb9
pager: make config info accessible with "hg help pager"
Christian Ebert <blacktrash@gmx.net>
parents:
6457
diff
changeset
|
16 |
9212
dfc1d5da98f0
pager: use reST syntax for literal blocks
Martin Geisler <mg@lazybytes.net>
parents:
9069
diff
changeset
|
17 To set the pager that should be used, set the application variable:: |
6462
6c4e12682fb9
pager: make config info accessible with "hg help pager"
Christian Ebert <blacktrash@gmx.net>
parents:
6457
diff
changeset
|
18 |
6c4e12682fb9
pager: make config info accessible with "hg help pager"
Christian Ebert <blacktrash@gmx.net>
parents:
6457
diff
changeset
|
19 [pager] |
17305
e66fa4d587dc
pager: drop -S option for less in example for pager configuration
Thomas Arendsen Hein <thomas@intevation.de>
parents:
17250
diff
changeset
|
20 pager = less -FRX |
6462
6c4e12682fb9
pager: make config info accessible with "hg help pager"
Christian Ebert <blacktrash@gmx.net>
parents:
6457
diff
changeset
|
21 |
9267
bd9e5d200186
pager: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9212
diff
changeset
|
22 If no pager is set, the pager extensions uses the environment variable |
bd9e5d200186
pager: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9212
diff
changeset
|
23 $PAGER. If neither pager.pager, nor $PAGER is set, no pager is used. |
6462
6c4e12682fb9
pager: make config info accessible with "hg help pager"
Christian Ebert <blacktrash@gmx.net>
parents:
6457
diff
changeset
|
24 |
6c4e12682fb9
pager: make config info accessible with "hg help pager"
Christian Ebert <blacktrash@gmx.net>
parents:
6457
diff
changeset
|
25 You can disable the pager for certain commands by adding them to the |
9212
dfc1d5da98f0
pager: use reST syntax for literal blocks
Martin Geisler <mg@lazybytes.net>
parents:
9069
diff
changeset
|
26 pager.ignore list:: |
6462
6c4e12682fb9
pager: make config info accessible with "hg help pager"
Christian Ebert <blacktrash@gmx.net>
parents:
6457
diff
changeset
|
27 |
6c4e12682fb9
pager: make config info accessible with "hg help pager"
Christian Ebert <blacktrash@gmx.net>
parents:
6457
diff
changeset
|
28 [pager] |
6c4e12682fb9
pager: make config info accessible with "hg help pager"
Christian Ebert <blacktrash@gmx.net>
parents:
6457
diff
changeset
|
29 ignore = version, help, update |
6c4e12682fb9
pager: make config info accessible with "hg help pager"
Christian Ebert <blacktrash@gmx.net>
parents:
6457
diff
changeset
|
30 |
9267
bd9e5d200186
pager: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents:
9212
diff
changeset
|
31 You can also enable the pager only for certain commands using |
9841
7cd6dee6fe37
pager: provide a default attend list
Brodie Rao <me+hg@dackz.net>
parents:
9267
diff
changeset
|
32 pager.attend. Below is the default list of commands to be paged:: |
6462
6c4e12682fb9
pager: make config info accessible with "hg help pager"
Christian Ebert <blacktrash@gmx.net>
parents:
6457
diff
changeset
|
33 |
6c4e12682fb9
pager: make config info accessible with "hg help pager"
Christian Ebert <blacktrash@gmx.net>
parents:
6457
diff
changeset
|
34 [pager] |
9841
7cd6dee6fe37
pager: provide a default attend list
Brodie Rao <me+hg@dackz.net>
parents:
9267
diff
changeset
|
35 attend = annotate, cat, diff, export, glog, log, qdiff |
7cd6dee6fe37
pager: provide a default attend list
Brodie Rao <me+hg@dackz.net>
parents:
9267
diff
changeset
|
36 |
7cd6dee6fe37
pager: provide a default attend list
Brodie Rao <me+hg@dackz.net>
parents:
9267
diff
changeset
|
37 Setting pager.attend to an empty value will cause all commands to be |
7cd6dee6fe37
pager: provide a default attend list
Brodie Rao <me+hg@dackz.net>
parents:
9267
diff
changeset
|
38 paged. |
6462
6c4e12682fb9
pager: make config info accessible with "hg help pager"
Christian Ebert <blacktrash@gmx.net>
parents:
6457
diff
changeset
|
39 |
6c4e12682fb9
pager: make config info accessible with "hg help pager"
Christian Ebert <blacktrash@gmx.net>
parents:
6457
diff
changeset
|
40 If pager.attend is present, pager.ignore will be ignored. |
6c4e12682fb9
pager: make config info accessible with "hg help pager"
Christian Ebert <blacktrash@gmx.net>
parents:
6457
diff
changeset
|
41 |
21281
bcddddcf0b54
pager: add attend-<command> option
Matt Mackall <mpm@selenic.com>
parents:
21280
diff
changeset
|
42 Lastly, you can enable and disable paging for individual commands with |
bcddddcf0b54
pager: add attend-<command> option
Matt Mackall <mpm@selenic.com>
parents:
21280
diff
changeset
|
43 the attend-<command> option. This setting takes precedence over |
bcddddcf0b54
pager: add attend-<command> option
Matt Mackall <mpm@selenic.com>
parents:
21280
diff
changeset
|
44 existing attend and ignore options and defaults:: |
bcddddcf0b54
pager: add attend-<command> option
Matt Mackall <mpm@selenic.com>
parents:
21280
diff
changeset
|
45 |
bcddddcf0b54
pager: add attend-<command> option
Matt Mackall <mpm@selenic.com>
parents:
21280
diff
changeset
|
46 [pager] |
bcddddcf0b54
pager: add attend-<command> option
Matt Mackall <mpm@selenic.com>
parents:
21280
diff
changeset
|
47 attend-cat = false |
bcddddcf0b54
pager: add attend-<command> option
Matt Mackall <mpm@selenic.com>
parents:
21280
diff
changeset
|
48 |
10973
49a07f441496
Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents:
10516
diff
changeset
|
49 To ignore global commands like :hg:`version` or :hg:`help`, you have |
12083
ebfc46929f3e
help: refer to user configuration file more consistently
Brodie Rao <brodie@bitheap.org>
parents:
11414
diff
changeset
|
50 to specify them in your user configuration file. |
12694
04f6de46bf3a
pager: add global --pager=<auto/boolean> option
Brodie Rao <brodie@bitheap.org>
parents:
12083
diff
changeset
|
51 |
27128
efceacd6a0c6
pager: improve help for --pager=
timeless <timeless@mozdev.org>
parents:
26454
diff
changeset
|
52 To control whether the pager is used at all for an individual command, |
efceacd6a0c6
pager: improve help for --pager=
timeless <timeless@mozdev.org>
parents:
26454
diff
changeset
|
53 you can use --pager=<value>:: |
efceacd6a0c6
pager: improve help for --pager=
timeless <timeless@mozdev.org>
parents:
26454
diff
changeset
|
54 |
efceacd6a0c6
pager: improve help for --pager=
timeless <timeless@mozdev.org>
parents:
26454
diff
changeset
|
55 - use as needed: `auto`. |
efceacd6a0c6
pager: improve help for --pager=
timeless <timeless@mozdev.org>
parents:
26454
diff
changeset
|
56 - require the pager: `yes` or `on`. |
efceacd6a0c6
pager: improve help for --pager=
timeless <timeless@mozdev.org>
parents:
26454
diff
changeset
|
57 - suppress the pager: `no` or `off` (any unrecognized value |
efceacd6a0c6
pager: improve help for --pager=
timeless <timeless@mozdev.org>
parents:
26454
diff
changeset
|
58 will also work). |
21281
bcddddcf0b54
pager: add attend-<command> option
Matt Mackall <mpm@selenic.com>
parents:
21280
diff
changeset
|
59 |
6462
6c4e12682fb9
pager: make config info accessible with "hg help pager"
Christian Ebert <blacktrash@gmx.net>
parents:
6457
diff
changeset
|
60 ''' |
28320
63c2864af25f
pager: use absolute_import
Augie Fackler <augie@google.com>
parents:
27128
diff
changeset
|
61 from __future__ import absolute_import |
6323
6e1308a09ffd
Use the pager given by the environment to display long output
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
62 |
28320
63c2864af25f
pager: use absolute_import
Augie Fackler <augie@google.com>
parents:
27128
diff
changeset
|
63 import atexit |
63c2864af25f
pager: use absolute_import
Augie Fackler <augie@google.com>
parents:
27128
diff
changeset
|
64 import os |
63c2864af25f
pager: use absolute_import
Augie Fackler <augie@google.com>
parents:
27128
diff
changeset
|
65 import signal |
63c2864af25f
pager: use absolute_import
Augie Fackler <augie@google.com>
parents:
27128
diff
changeset
|
66 import subprocess |
63c2864af25f
pager: use absolute_import
Augie Fackler <augie@google.com>
parents:
27128
diff
changeset
|
67 import sys |
63c2864af25f
pager: use absolute_import
Augie Fackler <augie@google.com>
parents:
27128
diff
changeset
|
68 |
29205
a0939666b836
py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents:
28554
diff
changeset
|
69 from mercurial.i18n import _ |
28320
63c2864af25f
pager: use absolute_import
Augie Fackler <augie@google.com>
parents:
27128
diff
changeset
|
70 from mercurial import ( |
63c2864af25f
pager: use absolute_import
Augie Fackler <augie@google.com>
parents:
27128
diff
changeset
|
71 cmdutil, |
63c2864af25f
pager: use absolute_import
Augie Fackler <augie@google.com>
parents:
27128
diff
changeset
|
72 commands, |
63c2864af25f
pager: use absolute_import
Augie Fackler <augie@google.com>
parents:
27128
diff
changeset
|
73 dispatch, |
63c2864af25f
pager: use absolute_import
Augie Fackler <augie@google.com>
parents:
27128
diff
changeset
|
74 extensions, |
63c2864af25f
pager: use absolute_import
Augie Fackler <augie@google.com>
parents:
27128
diff
changeset
|
75 util, |
63c2864af25f
pager: use absolute_import
Augie Fackler <augie@google.com>
parents:
27128
diff
changeset
|
76 ) |
6323
6e1308a09ffd
Use the pager given by the environment to display long output
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
77 |
29841
d5883fd055c6
extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents:
29205
diff
changeset
|
78 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for |
25186
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
24067
diff
changeset
|
79 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should |
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
24067
diff
changeset
|
80 # be specifying the version(s) of Mercurial they are tested with, or |
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
24067
diff
changeset
|
81 # leave the attribute unspecified. |
29841
d5883fd055c6
extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents:
29205
diff
changeset
|
82 testedwith = 'ships-with-hg-core' |
16743
38caf405d010
hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents:
16652
diff
changeset
|
83 |
26452
499d5c98e98b
pager: inline _pagersubprocess() into _runpager()
Yuya Nishihara <yuya@tcha.org>
parents:
25201
diff
changeset
|
84 def _runpager(ui, p): |
16631
369741ef7253
pager: preserve Hg's exit code (and fix Windows support) (issue3225)
Brodie Rao <brodie@sf.io>
parents:
14945
diff
changeset
|
85 pager = subprocess.Popen(p, shell=True, bufsize=-1, |
369741ef7253
pager: preserve Hg's exit code (and fix Windows support) (issue3225)
Brodie Rao <brodie@sf.io>
parents:
14945
diff
changeset
|
86 close_fds=util.closefds, stdin=subprocess.PIPE, |
369741ef7253
pager: preserve Hg's exit code (and fix Windows support) (issue3225)
Brodie Rao <brodie@sf.io>
parents:
14945
diff
changeset
|
87 stdout=sys.stdout, stderr=sys.stderr) |
369741ef7253
pager: preserve Hg's exit code (and fix Windows support) (issue3225)
Brodie Rao <brodie@sf.io>
parents:
14945
diff
changeset
|
88 |
26454
62c5e937f477
pager: recreate stdout to make it line-buffered
Yuya Nishihara <yuya@tcha.org>
parents:
26453
diff
changeset
|
89 # back up original file objects and descriptors |
62c5e937f477
pager: recreate stdout to make it line-buffered
Yuya Nishihara <yuya@tcha.org>
parents:
26453
diff
changeset
|
90 olduifout = ui.fout |
62c5e937f477
pager: recreate stdout to make it line-buffered
Yuya Nishihara <yuya@tcha.org>
parents:
26453
diff
changeset
|
91 oldstdout = sys.stdout |
26453
1a2578418689
pager: rename variables of backup fds
Yuya Nishihara <yuya@tcha.org>
parents:
26452
diff
changeset
|
92 stdoutfd = os.dup(sys.stdout.fileno()) |
1a2578418689
pager: rename variables of backup fds
Yuya Nishihara <yuya@tcha.org>
parents:
26452
diff
changeset
|
93 stderrfd = os.dup(sys.stderr.fileno()) |
26454
62c5e937f477
pager: recreate stdout to make it line-buffered
Yuya Nishihara <yuya@tcha.org>
parents:
26453
diff
changeset
|
94 |
62c5e937f477
pager: recreate stdout to make it line-buffered
Yuya Nishihara <yuya@tcha.org>
parents:
26453
diff
changeset
|
95 # create new line-buffered stdout so that output can show up immediately |
62c5e937f477
pager: recreate stdout to make it line-buffered
Yuya Nishihara <yuya@tcha.org>
parents:
26453
diff
changeset
|
96 ui.fout = sys.stdout = newstdout = os.fdopen(sys.stdout.fileno(), 'wb', 1) |
16631
369741ef7253
pager: preserve Hg's exit code (and fix Windows support) (issue3225)
Brodie Rao <brodie@sf.io>
parents:
14945
diff
changeset
|
97 os.dup2(pager.stdin.fileno(), sys.stdout.fileno()) |
16752
359fda6cb01d
pager: use ui._isatty infrastructure
Matt Mackall <mpm@selenic.com>
parents:
16743
diff
changeset
|
98 if ui._isatty(sys.stderr): |
16631
369741ef7253
pager: preserve Hg's exit code (and fix Windows support) (issue3225)
Brodie Rao <brodie@sf.io>
parents:
14945
diff
changeset
|
99 os.dup2(pager.stdin.fileno(), sys.stderr.fileno()) |
369741ef7253
pager: preserve Hg's exit code (and fix Windows support) (issue3225)
Brodie Rao <brodie@sf.io>
parents:
14945
diff
changeset
|
100 |
369741ef7253
pager: preserve Hg's exit code (and fix Windows support) (issue3225)
Brodie Rao <brodie@sf.io>
parents:
14945
diff
changeset
|
101 @atexit.register |
369741ef7253
pager: preserve Hg's exit code (and fix Windows support) (issue3225)
Brodie Rao <brodie@sf.io>
parents:
14945
diff
changeset
|
102 def killpager(): |
18717
fcc4b55876c3
pager: catch ctrl-c on exit (issue3834)
Matt Mackall <mpm@selenic.com>
parents:
17305
diff
changeset
|
103 if util.safehasattr(signal, "SIGINT"): |
fcc4b55876c3
pager: catch ctrl-c on exit (issue3834)
Matt Mackall <mpm@selenic.com>
parents:
17305
diff
changeset
|
104 signal.signal(signal.SIGINT, signal.SIG_IGN) |
16631
369741ef7253
pager: preserve Hg's exit code (and fix Windows support) (issue3225)
Brodie Rao <brodie@sf.io>
parents:
14945
diff
changeset
|
105 pager.stdin.close() |
26454
62c5e937f477
pager: recreate stdout to make it line-buffered
Yuya Nishihara <yuya@tcha.org>
parents:
26453
diff
changeset
|
106 ui.fout = olduifout |
62c5e937f477
pager: recreate stdout to make it line-buffered
Yuya Nishihara <yuya@tcha.org>
parents:
26453
diff
changeset
|
107 sys.stdout = oldstdout |
62c5e937f477
pager: recreate stdout to make it line-buffered
Yuya Nishihara <yuya@tcha.org>
parents:
26453
diff
changeset
|
108 # close new stdout while it's associated with pager; otherwise stdout |
62c5e937f477
pager: recreate stdout to make it line-buffered
Yuya Nishihara <yuya@tcha.org>
parents:
26453
diff
changeset
|
109 # fd would be closed when newstdout is deleted |
62c5e937f477
pager: recreate stdout to make it line-buffered
Yuya Nishihara <yuya@tcha.org>
parents:
26453
diff
changeset
|
110 newstdout.close() |
62c5e937f477
pager: recreate stdout to make it line-buffered
Yuya Nishihara <yuya@tcha.org>
parents:
26453
diff
changeset
|
111 # restore original fds: stdout is open again |
26453
1a2578418689
pager: rename variables of backup fds
Yuya Nishihara <yuya@tcha.org>
parents:
26452
diff
changeset
|
112 os.dup2(stdoutfd, sys.stdout.fileno()) |
1a2578418689
pager: rename variables of backup fds
Yuya Nishihara <yuya@tcha.org>
parents:
26452
diff
changeset
|
113 os.dup2(stderrfd, sys.stderr.fileno()) |
16631
369741ef7253
pager: preserve Hg's exit code (and fix Windows support) (issue3225)
Brodie Rao <brodie@sf.io>
parents:
14945
diff
changeset
|
114 pager.wait() |
11182
3c368a1c962d
pager: fork and exec pager as parent process
Brodie Rao <brodie@bitheap.org>
parents:
10516
diff
changeset
|
115 |
6323
6e1308a09ffd
Use the pager given by the environment to display long output
David Soria Parra <dsp@php.net>
parents:
diff
changeset
|
116 def uisetup(ui): |
16752
359fda6cb01d
pager: use ui._isatty infrastructure
Matt Mackall <mpm@selenic.com>
parents:
16743
diff
changeset
|
117 if '--debugger' in sys.argv or not ui.formatted(): |
11414 | 118 return |
119 | |
28554
fa3438548b3d
pager: skip uisetup if chg is detected
Jun Wu <quark@fb.com>
parents:
28320
diff
changeset
|
120 # chg has its own pager implementation |
fa3438548b3d
pager: skip uisetup if chg is detected
Jun Wu <quark@fb.com>
parents:
28320
diff
changeset
|
121 argv = sys.argv[:] |
fa3438548b3d
pager: skip uisetup if chg is detected
Jun Wu <quark@fb.com>
parents:
28320
diff
changeset
|
122 if 'chgunix' in dispatch._earlygetopt(['--cmdserver'], argv): |
fa3438548b3d
pager: skip uisetup if chg is detected
Jun Wu <quark@fb.com>
parents:
28320
diff
changeset
|
123 return |
fa3438548b3d
pager: skip uisetup if chg is detected
Jun Wu <quark@fb.com>
parents:
28320
diff
changeset
|
124 |
7216
292fb2ad2846
extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents:
6548
diff
changeset
|
125 def pagecmd(orig, ui, options, cmd, cmdfunc): |
6417
13fafd8cc4a1
pager: Add a configuration to enable/disable the pager for certain commands
David Soria Parra <dsp <at> php.net>
parents:
6324
diff
changeset
|
126 p = ui.config("pager", "pager", os.environ.get("PAGER")) |
21277
2bc778e2f9b3
pager: break pager invocation out of command check loop
Matt Mackall <mpm@selenic.com>
parents:
20790
diff
changeset
|
127 usepager = False |
21278
e1f5f38fd944
pager: break always out of command check loop
Matt Mackall <mpm@selenic.com>
parents:
21277
diff
changeset
|
128 always = util.parsebool(options['pager']) |
21279
19b8cfe4396f
pager: break auto out of command check loop
Matt Mackall <mpm@selenic.com>
parents:
21278
diff
changeset
|
129 auto = options['pager'] == 'auto' |
14515
76f295eaed86
util: add helper function isatty(fd) to check for tty-ness
Idan Kamara <idankk86@gmail.com>
parents:
13642
diff
changeset
|
130 |
21277
2bc778e2f9b3
pager: break pager invocation out of command check loop
Matt Mackall <mpm@selenic.com>
parents:
20790
diff
changeset
|
131 if not p: |
2bc778e2f9b3
pager: break pager invocation out of command check loop
Matt Mackall <mpm@selenic.com>
parents:
20790
diff
changeset
|
132 pass |
21278
e1f5f38fd944
pager: break always out of command check loop
Matt Mackall <mpm@selenic.com>
parents:
21277
diff
changeset
|
133 elif always: |
e1f5f38fd944
pager: break always out of command check loop
Matt Mackall <mpm@selenic.com>
parents:
21277
diff
changeset
|
134 usepager = True |
21279
19b8cfe4396f
pager: break auto out of command check loop
Matt Mackall <mpm@selenic.com>
parents:
21278
diff
changeset
|
135 elif not auto: |
19b8cfe4396f
pager: break auto out of command check loop
Matt Mackall <mpm@selenic.com>
parents:
21278
diff
changeset
|
136 usepager = False |
21277
2bc778e2f9b3
pager: break pager invocation out of command check loop
Matt Mackall <mpm@selenic.com>
parents:
20790
diff
changeset
|
137 else: |
9841
7cd6dee6fe37
pager: provide a default attend list
Brodie Rao <me+hg@dackz.net>
parents:
9267
diff
changeset
|
138 attend = ui.configlist('pager', 'attend', attended) |
21280 | 139 ignore = ui.configlist('pager', 'ignore') |
19940
7d99bff0f77c
pager: honour internal aliases
David Soria Parra <dsp@experimentalworks.net>
parents:
18923
diff
changeset
|
140 cmds, _ = cmdutil.findcmd(cmd, commands.table) |
7d99bff0f77c
pager: honour internal aliases
David Soria Parra <dsp@experimentalworks.net>
parents:
18923
diff
changeset
|
141 |
7d99bff0f77c
pager: honour internal aliases
David Soria Parra <dsp@experimentalworks.net>
parents:
18923
diff
changeset
|
142 for cmd in cmds: |
21281
bcddddcf0b54
pager: add attend-<command> option
Matt Mackall <mpm@selenic.com>
parents:
21280
diff
changeset
|
143 var = 'attend-%s' % cmd |
bcddddcf0b54
pager: add attend-<command> option
Matt Mackall <mpm@selenic.com>
parents:
21280
diff
changeset
|
144 if ui.config('pager', var): |
bcddddcf0b54
pager: add attend-<command> option
Matt Mackall <mpm@selenic.com>
parents:
21280
diff
changeset
|
145 usepager = ui.configbool('pager', var) |
bcddddcf0b54
pager: add attend-<command> option
Matt Mackall <mpm@selenic.com>
parents:
21280
diff
changeset
|
146 break |
21279
19b8cfe4396f
pager: break auto out of command check loop
Matt Mackall <mpm@selenic.com>
parents:
21278
diff
changeset
|
147 if (cmd in attend or |
19b8cfe4396f
pager: break auto out of command check loop
Matt Mackall <mpm@selenic.com>
parents:
21278
diff
changeset
|
148 (cmd not in ignore and not attend)): |
21277
2bc778e2f9b3
pager: break pager invocation out of command check loop
Matt Mackall <mpm@selenic.com>
parents:
20790
diff
changeset
|
149 usepager = True |
19940
7d99bff0f77c
pager: honour internal aliases
David Soria Parra <dsp@experimentalworks.net>
parents:
18923
diff
changeset
|
150 break |
21277
2bc778e2f9b3
pager: break pager invocation out of command check loop
Matt Mackall <mpm@selenic.com>
parents:
20790
diff
changeset
|
151 |
24066
afdf5f6ab37a
pager: set an attribute on ui indicating that a pager is active
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21281
diff
changeset
|
152 setattr(ui, 'pageractive', usepager) |
afdf5f6ab37a
pager: set an attribute on ui indicating that a pager is active
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21281
diff
changeset
|
153 |
21277
2bc778e2f9b3
pager: break pager invocation out of command check loop
Matt Mackall <mpm@selenic.com>
parents:
20790
diff
changeset
|
154 if usepager: |
2bc778e2f9b3
pager: break pager invocation out of command check loop
Matt Mackall <mpm@selenic.com>
parents:
20790
diff
changeset
|
155 ui.setconfig('ui', 'formatted', ui.formatted(), 'pager') |
2bc778e2f9b3
pager: break pager invocation out of command check loop
Matt Mackall <mpm@selenic.com>
parents:
20790
diff
changeset
|
156 ui.setconfig('ui', 'interactive', False, 'pager') |
2bc778e2f9b3
pager: break pager invocation out of command check loop
Matt Mackall <mpm@selenic.com>
parents:
20790
diff
changeset
|
157 if util.safehasattr(signal, "SIGPIPE"): |
2bc778e2f9b3
pager: break pager invocation out of command check loop
Matt Mackall <mpm@selenic.com>
parents:
20790
diff
changeset
|
158 signal.signal(signal.SIGPIPE, signal.SIG_DFL) |
2bc778e2f9b3
pager: break pager invocation out of command check loop
Matt Mackall <mpm@selenic.com>
parents:
20790
diff
changeset
|
159 _runpager(ui, p) |
7216
292fb2ad2846
extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents:
6548
diff
changeset
|
160 return orig(ui, options, cmd, cmdfunc) |
6417
13fafd8cc4a1
pager: Add a configuration to enable/disable the pager for certain commands
David Soria Parra <dsp <at> php.net>
parents:
6324
diff
changeset
|
161 |
24067
0baf41e02a4d
pager: ensure wrapped dispatch._runcommand runs before color's
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24066
diff
changeset
|
162 # Wrap dispatch._runcommand after color is loaded so color can see |
0baf41e02a4d
pager: ensure wrapped dispatch._runcommand runs before color's
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24066
diff
changeset
|
163 # ui.pageractive. Otherwise, if we loaded first, color's wrapped |
0baf41e02a4d
pager: ensure wrapped dispatch._runcommand runs before color's
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24066
diff
changeset
|
164 # dispatch._runcommand would run without having access to ui.pageractive. |
0baf41e02a4d
pager: ensure wrapped dispatch._runcommand runs before color's
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24066
diff
changeset
|
165 def afterloaded(loaded): |
0baf41e02a4d
pager: ensure wrapped dispatch._runcommand runs before color's
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24066
diff
changeset
|
166 extensions.wrapfunction(dispatch, '_runcommand', pagecmd) |
0baf41e02a4d
pager: ensure wrapped dispatch._runcommand runs before color's
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24066
diff
changeset
|
167 extensions.afterloaded('color', afterloaded) |
9841
7cd6dee6fe37
pager: provide a default attend list
Brodie Rao <me+hg@dackz.net>
parents:
9267
diff
changeset
|
168 |
12694
04f6de46bf3a
pager: add global --pager=<auto/boolean> option
Brodie Rao <brodie@bitheap.org>
parents:
12083
diff
changeset
|
169 def extsetup(ui): |
04f6de46bf3a
pager: add global --pager=<auto/boolean> option
Brodie Rao <brodie@bitheap.org>
parents:
12083
diff
changeset
|
170 commands.globalopts.append( |
04f6de46bf3a
pager: add global --pager=<auto/boolean> option
Brodie Rao <brodie@bitheap.org>
parents:
12083
diff
changeset
|
171 ('', 'pager', 'auto', |
04f6de46bf3a
pager: add global --pager=<auto/boolean> option
Brodie Rao <brodie@bitheap.org>
parents:
12083
diff
changeset
|
172 _("when to paginate (boolean, always, auto, or never)"), |
04f6de46bf3a
pager: add global --pager=<auto/boolean> option
Brodie Rao <brodie@bitheap.org>
parents:
12083
diff
changeset
|
173 _('TYPE'))) |
04f6de46bf3a
pager: add global --pager=<auto/boolean> option
Brodie Rao <brodie@bitheap.org>
parents:
12083
diff
changeset
|
174 |
9841
7cd6dee6fe37
pager: provide a default attend list
Brodie Rao <me+hg@dackz.net>
parents:
9267
diff
changeset
|
175 attended = ['annotate', 'cat', 'diff', 'export', 'glog', 'log', 'qdiff'] |