hgext/pager.py
author FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
Sun, 14 Feb 2016 01:33:55 +0900
changeset 28119 91a827e760df
parent 27128 efceacd6a0c6
child 28320 63c2864af25f
permissions -rw-r--r--
hg: make cachedlocalrepo cache appropriate repoview object Before this patch, 'cachedlocalrepo' always caches "visible" repoview object, because 'cachedlocalrepo' uses "visible" repoview returned by 'hg.repository()' without any additional processing. If the client of 'cachedlocalrepo' wants "served" repoview, some objects to be cached are discarded unintentionally. 1. 'cachedlocalrepo' newly caches "visible" repoview object (call it VIEW1) 2. 'cachedlocalrepo' returns VIEW1 to the client of it at 'fetch()' 3. the client gets "served" repoview object by 'filtered("served")' on VIEW1 (call this "served" repoview VIEW2) 4. accessing to 'repo.changelog' implies: - instantiation of changelog via 'localrepository.changelog' - instantiation of "filtered changelog" via 'repoview.changelog' 5. "filtered changelog" above is cached in VIEW2 6. VIEW2 is discarded after processing, because there is no reference to it 7. 'cachedlocalrepo' returns VIEW1 cached at (1) above to the client at next 'fetch()' 8. 'filtered("served")' on VIEW1 at the client side creates new "served" repoview again, because VIEW1 is "visible" (call this new "served" repoview VIEW3) 9. accessing to 'repo.changelog' implies instantiation of filtered changelog again, because "filtered changelog" is cached in VIEW2 at (5), but not in VIEW3 currently used 10. (go to (7) above) As described above, "served" repoview object and "filtered changelog" cached in it are discarded always, even if the repository itself hasn't been changed since last access. For example, in the case of 'hgweb_mod.hgweb', "newly caching" occurs, when: - all cached objects are already assigned to another threads (in this case, repoview is created in 'cachedlocalrepo.copy()') - or, stat of '00changelog.i' is changed from last access (in this case, repoview is created in 'cachedlocalrepo.fetch()') once changes are pushed via HTTP, this always occurs. The root cause of this inefficiency is that 'cachedlocalrepo' always caches "visible" repoview object, even if the client of it wants another view. To make 'cachedlocalrepo' cache appropriate repoview object, this patch adds additional filtering on the repo object returned by 'hg.repository()'. It is assumed that initial repoview object should be already filtered by expected view. After this patch: - 'filtered("served")' on VIEW1 at (3)/(7) above returns VIEW1 itself, because VIEW1 is now "served", and - VIEW2 and VIEW3 equal VIEW1 - therefore, "filtered changelog" is cached in VIEW1, and reused intentionally
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10112
diff changeset
     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
#
6462
6c4e12682fb9 pager: make config info accessible with "hg help pager"
Christian Ebert <blacktrash@gmx.net>
parents: 6457
diff changeset
    13
# Run "hg help pager" to get info on configuration.
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
'''
6323
6e1308a09ffd Use the pager given by the environment to display long output
David Soria Parra <dsp@php.net>
parents:
diff changeset
    61
25201
59d794154e8d pager: drop python 2.4 hack around subprocess
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25186
diff changeset
    62
import atexit, sys, os, signal, subprocess
19940
7d99bff0f77c pager: honour internal aliases
David Soria Parra <dsp@experimentalworks.net>
parents: 18923
diff changeset
    63
from mercurial import commands, dispatch, util, extensions, cmdutil
12694
04f6de46bf3a pager: add global --pager=<auto/boolean> option
Brodie Rao <brodie@bitheap.org>
parents: 12083
diff changeset
    64
from mercurial.i18n import _
6323
6e1308a09ffd Use the pager given by the environment to display long output
David Soria Parra <dsp@php.net>
parents:
diff changeset
    65
25186
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24067
diff changeset
    66
# Note for extension authors: ONLY specify testedwith = 'internal' for
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24067
diff changeset
    67
# 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
    68
# 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
    69
# leave the attribute unspecified.
16743
38caf405d010 hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents: 16652
diff changeset
    70
testedwith = 'internal'
38caf405d010 hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents: 16652
diff changeset
    71
26452
499d5c98e98b pager: inline _pagersubprocess() into _runpager()
Yuya Nishihara <yuya@tcha.org>
parents: 25201
diff changeset
    72
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
    73
    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
    74
                             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
    75
                             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
    76
26454
62c5e937f477 pager: recreate stdout to make it line-buffered
Yuya Nishihara <yuya@tcha.org>
parents: 26453
diff changeset
    77
    # 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
    78
    olduifout = ui.fout
62c5e937f477 pager: recreate stdout to make it line-buffered
Yuya Nishihara <yuya@tcha.org>
parents: 26453
diff changeset
    79
    oldstdout = sys.stdout
26453
1a2578418689 pager: rename variables of backup fds
Yuya Nishihara <yuya@tcha.org>
parents: 26452
diff changeset
    80
    stdoutfd = os.dup(sys.stdout.fileno())
1a2578418689 pager: rename variables of backup fds
Yuya Nishihara <yuya@tcha.org>
parents: 26452
diff changeset
    81
    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
    82
62c5e937f477 pager: recreate stdout to make it line-buffered
Yuya Nishihara <yuya@tcha.org>
parents: 26453
diff changeset
    83
    # 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
    84
    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
    85
    os.dup2(pager.stdin.fileno(), sys.stdout.fileno())
16752
359fda6cb01d pager: use ui._isatty infrastructure
Matt Mackall <mpm@selenic.com>
parents: 16743
diff changeset
    86
    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
    87
        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
    88
369741ef7253 pager: preserve Hg's exit code (and fix Windows support) (issue3225)
Brodie Rao <brodie@sf.io>
parents: 14945
diff changeset
    89
    @atexit.register
369741ef7253 pager: preserve Hg's exit code (and fix Windows support) (issue3225)
Brodie Rao <brodie@sf.io>
parents: 14945
diff changeset
    90
    def killpager():
18717
fcc4b55876c3 pager: catch ctrl-c on exit (issue3834)
Matt Mackall <mpm@selenic.com>
parents: 17305
diff changeset
    91
        if util.safehasattr(signal, "SIGINT"):
fcc4b55876c3 pager: catch ctrl-c on exit (issue3834)
Matt Mackall <mpm@selenic.com>
parents: 17305
diff changeset
    92
            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
    93
        pager.stdin.close()
26454
62c5e937f477 pager: recreate stdout to make it line-buffered
Yuya Nishihara <yuya@tcha.org>
parents: 26453
diff changeset
    94
        ui.fout = olduifout
62c5e937f477 pager: recreate stdout to make it line-buffered
Yuya Nishihara <yuya@tcha.org>
parents: 26453
diff changeset
    95
        sys.stdout = oldstdout
62c5e937f477 pager: recreate stdout to make it line-buffered
Yuya Nishihara <yuya@tcha.org>
parents: 26453
diff changeset
    96
        # 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
    97
        # 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
    98
        newstdout.close()
62c5e937f477 pager: recreate stdout to make it line-buffered
Yuya Nishihara <yuya@tcha.org>
parents: 26453
diff changeset
    99
        # restore original fds: stdout is open again
26453
1a2578418689 pager: rename variables of backup fds
Yuya Nishihara <yuya@tcha.org>
parents: 26452
diff changeset
   100
        os.dup2(stdoutfd, sys.stdout.fileno())
1a2578418689 pager: rename variables of backup fds
Yuya Nishihara <yuya@tcha.org>
parents: 26452
diff changeset
   101
        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
   102
        pager.wait()
11182
3c368a1c962d pager: fork and exec pager as parent process
Brodie Rao <brodie@bitheap.org>
parents: 10516
diff changeset
   103
6323
6e1308a09ffd Use the pager given by the environment to display long output
David Soria Parra <dsp@php.net>
parents:
diff changeset
   104
def uisetup(ui):
16752
359fda6cb01d pager: use ui._isatty infrastructure
Matt Mackall <mpm@selenic.com>
parents: 16743
diff changeset
   105
    if '--debugger' in sys.argv or not ui.formatted():
11414
0fa4474bdc2f pager: respect HGPLAIN
Yuya Nishihara <yuya@tcha.org>
parents: 11328
diff changeset
   106
        return
0fa4474bdc2f pager: respect HGPLAIN
Yuya Nishihara <yuya@tcha.org>
parents: 11328
diff changeset
   107
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6548
diff changeset
   108
    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
   109
        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
   110
        usepager = False
21278
e1f5f38fd944 pager: break always out of command check loop
Matt Mackall <mpm@selenic.com>
parents: 21277
diff changeset
   111
        always = util.parsebool(options['pager'])
21279
19b8cfe4396f pager: break auto out of command check loop
Matt Mackall <mpm@selenic.com>
parents: 21278
diff changeset
   112
        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
   113
21277
2bc778e2f9b3 pager: break pager invocation out of command check loop
Matt Mackall <mpm@selenic.com>
parents: 20790
diff changeset
   114
        if not p:
2bc778e2f9b3 pager: break pager invocation out of command check loop
Matt Mackall <mpm@selenic.com>
parents: 20790
diff changeset
   115
            pass
21278
e1f5f38fd944 pager: break always out of command check loop
Matt Mackall <mpm@selenic.com>
parents: 21277
diff changeset
   116
        elif always:
e1f5f38fd944 pager: break always out of command check loop
Matt Mackall <mpm@selenic.com>
parents: 21277
diff changeset
   117
            usepager = True
21279
19b8cfe4396f pager: break auto out of command check loop
Matt Mackall <mpm@selenic.com>
parents: 21278
diff changeset
   118
        elif not auto:
19b8cfe4396f pager: break auto out of command check loop
Matt Mackall <mpm@selenic.com>
parents: 21278
diff changeset
   119
            usepager = False
21277
2bc778e2f9b3 pager: break pager invocation out of command check loop
Matt Mackall <mpm@selenic.com>
parents: 20790
diff changeset
   120
        else:
9841
7cd6dee6fe37 pager: provide a default attend list
Brodie Rao <me+hg@dackz.net>
parents: 9267
diff changeset
   121
            attend = ui.configlist('pager', 'attend', attended)
21280
71028188970e pager: variable reorder
Matt Mackall <mpm@selenic.com>
parents: 21279
diff changeset
   122
            ignore = ui.configlist('pager', 'ignore')
19940
7d99bff0f77c pager: honour internal aliases
David Soria Parra <dsp@experimentalworks.net>
parents: 18923
diff changeset
   123
            cmds, _ = cmdutil.findcmd(cmd, commands.table)
7d99bff0f77c pager: honour internal aliases
David Soria Parra <dsp@experimentalworks.net>
parents: 18923
diff changeset
   124
7d99bff0f77c pager: honour internal aliases
David Soria Parra <dsp@experimentalworks.net>
parents: 18923
diff changeset
   125
            for cmd in cmds:
21281
bcddddcf0b54 pager: add attend-<command> option
Matt Mackall <mpm@selenic.com>
parents: 21280
diff changeset
   126
                var = 'attend-%s' % cmd
bcddddcf0b54 pager: add attend-<command> option
Matt Mackall <mpm@selenic.com>
parents: 21280
diff changeset
   127
                if ui.config('pager', var):
bcddddcf0b54 pager: add attend-<command> option
Matt Mackall <mpm@selenic.com>
parents: 21280
diff changeset
   128
                    usepager = ui.configbool('pager', var)
bcddddcf0b54 pager: add attend-<command> option
Matt Mackall <mpm@selenic.com>
parents: 21280
diff changeset
   129
                    break
21279
19b8cfe4396f pager: break auto out of command check loop
Matt Mackall <mpm@selenic.com>
parents: 21278
diff changeset
   130
                if (cmd in attend or
19b8cfe4396f pager: break auto out of command check loop
Matt Mackall <mpm@selenic.com>
parents: 21278
diff changeset
   131
                     (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
   132
                    usepager = True
19940
7d99bff0f77c pager: honour internal aliases
David Soria Parra <dsp@experimentalworks.net>
parents: 18923
diff changeset
   133
                    break
21277
2bc778e2f9b3 pager: break pager invocation out of command check loop
Matt Mackall <mpm@selenic.com>
parents: 20790
diff changeset
   134
24066
afdf5f6ab37a pager: set an attribute on ui indicating that a pager is active
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21281
diff changeset
   135
        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
   136
21277
2bc778e2f9b3 pager: break pager invocation out of command check loop
Matt Mackall <mpm@selenic.com>
parents: 20790
diff changeset
   137
        if usepager:
2bc778e2f9b3 pager: break pager invocation out of command check loop
Matt Mackall <mpm@selenic.com>
parents: 20790
diff changeset
   138
            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
   139
            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
   140
            if util.safehasattr(signal, "SIGPIPE"):
2bc778e2f9b3 pager: break pager invocation out of command check loop
Matt Mackall <mpm@selenic.com>
parents: 20790
diff changeset
   141
                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
   142
            _runpager(ui, p)
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6548
diff changeset
   143
        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
   144
24067
0baf41e02a4d pager: ensure wrapped dispatch._runcommand runs before color's
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24066
diff changeset
   145
    # 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
   146
    # 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
   147
    # 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
   148
    def afterloaded(loaded):
0baf41e02a4d pager: ensure wrapped dispatch._runcommand runs before color's
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24066
diff changeset
   149
        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
   150
    extensions.afterloaded('color', afterloaded)
9841
7cd6dee6fe37 pager: provide a default attend list
Brodie Rao <me+hg@dackz.net>
parents: 9267
diff changeset
   151
12694
04f6de46bf3a pager: add global --pager=<auto/boolean> option
Brodie Rao <brodie@bitheap.org>
parents: 12083
diff changeset
   152
def extsetup(ui):
04f6de46bf3a pager: add global --pager=<auto/boolean> option
Brodie Rao <brodie@bitheap.org>
parents: 12083
diff changeset
   153
    commands.globalopts.append(
04f6de46bf3a pager: add global --pager=<auto/boolean> option
Brodie Rao <brodie@bitheap.org>
parents: 12083
diff changeset
   154
        ('', 'pager', 'auto',
04f6de46bf3a pager: add global --pager=<auto/boolean> option
Brodie Rao <brodie@bitheap.org>
parents: 12083
diff changeset
   155
         _("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
   156
         _('TYPE')))
04f6de46bf3a pager: add global --pager=<auto/boolean> option
Brodie Rao <brodie@bitheap.org>
parents: 12083
diff changeset
   157
9841
7cd6dee6fe37 pager: provide a default attend list
Brodie Rao <me+hg@dackz.net>
parents: 9267
diff changeset
   158
attended = ['annotate', 'cat', 'diff', 'export', 'glog', 'log', 'qdiff']