hgext/color.py
author Pierre-Yves David <pierre-yves.david@ens-lyon.org>
Thu, 03 Nov 2016 14:29:19 +0100
changeset 30283 e1f6898a80e1
parent 30282 7a53458fae4e
child 30284 7556507f7197
permissions -rw-r--r--
color: restore _style global after debugcolor ran Before this change, running 'debugcolor' would destroy all color style for the rest of the process life. We now properly backup and restore the variable content. Using a global variable is sketchy in general and could probably be removed. However, this is a quest for another adventure.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22771
d6274291fac1 color: update description of the extension
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22763
diff changeset
     1
# color.py color output for Mercurial commands
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
     2
#
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
     3
# Copyright (C) 2007 Kevin Christen <kevin.christen@gmail.com>
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
     4
#
15771
425c1309718f color: Use the same GPL boilerplate as most hg files
Augie Fackler <durin42@gmail.com>
parents: 15048
diff changeset
     5
# This software may be used and distributed according to the terms of the
425c1309718f color: Use the same GPL boilerplate as most hg files
Augie Fackler <durin42@gmail.com>
parents: 15048
diff changeset
     6
# GNU General Public License version 2 or any later version.
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
     7
8894
868670dbc237 extensions: improve the consistency of synopses
Cédric Duval <cedricduval@free.fr>
parents: 8866
diff changeset
     8
'''colorize output from some commands
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
     9
22771
d6274291fac1 color: update description of the extension
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22763
diff changeset
    10
The color extension colorizes output from several Mercurial commands.
d6274291fac1 color: update description of the extension
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22763
diff changeset
    11
For example, the diff command shows additions in green and deletions
d6274291fac1 color: update description of the extension
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22763
diff changeset
    12
in red, while the status command shows modified files in magenta. Many
d6274291fac1 color: update description of the extension
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22763
diff changeset
    13
other commands have analogous colors. It is possible to customize
d6274291fac1 color: update description of the extension
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22763
diff changeset
    14
these colors.
7457
a70fb83cbb9e diff colorization: finish highlighting trailing whitespace
Georg Brandl <georg@python.org>
parents: 7456
diff changeset
    15
22772
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
    16
Effects
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
    17
-------
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
    18
7988
0447939b4b97 color: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
    19
Other effects in addition to color, like bold and underlined text, are
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
    20
also available. By default, the terminfo database is used to find the
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
    21
terminal codes used to change color and effect.  If terminfo is not
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
    22
available, then effects are rendered with the ECMA-48 SGR control
13635
c9ddc39c21b6 color: don't mention internal function in docstring
Martin Geisler <mg@aragost.com>
parents: 13361
diff changeset
    23
function (aka ANSI escape codes).
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
    24
22772
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
    25
The available effects in terminfo mode are 'blink', 'bold', 'dim',
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
    26
'inverse', 'invisible', 'italic', 'standout', and 'underline'; in
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
    27
ECMA-48 mode, the options are 'bold', 'inverse', 'italic', and
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
    28
'underline'.  How each is rendered depends on the terminal emulator.
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
    29
Some may not be available for a given terminal type, and will be
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
    30
silently ignored.
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
    31
30176
9f41b66cffc0 color: add some documentation for custom terminfo codes
Danek Duvall <danek.duvall@oracle.com>
parents: 30175
diff changeset
    32
If the terminfo entry for your terminal is missing codes for an effect
9f41b66cffc0 color: add some documentation for custom terminfo codes
Danek Duvall <danek.duvall@oracle.com>
parents: 30175
diff changeset
    33
or has the wrong codes, you can add or override those codes in your
9f41b66cffc0 color: add some documentation for custom terminfo codes
Danek Duvall <danek.duvall@oracle.com>
parents: 30175
diff changeset
    34
configuration::
9f41b66cffc0 color: add some documentation for custom terminfo codes
Danek Duvall <danek.duvall@oracle.com>
parents: 30175
diff changeset
    35
9f41b66cffc0 color: add some documentation for custom terminfo codes
Danek Duvall <danek.duvall@oracle.com>
parents: 30175
diff changeset
    36
  [color]
9f41b66cffc0 color: add some documentation for custom terminfo codes
Danek Duvall <danek.duvall@oracle.com>
parents: 30175
diff changeset
    37
  terminfo.dim = \E[2m
9f41b66cffc0 color: add some documentation for custom terminfo codes
Danek Duvall <danek.duvall@oracle.com>
parents: 30175
diff changeset
    38
9f41b66cffc0 color: add some documentation for custom terminfo codes
Danek Duvall <danek.duvall@oracle.com>
parents: 30175
diff changeset
    39
where '\E' is substituted with an escape character.
9f41b66cffc0 color: add some documentation for custom terminfo codes
Danek Duvall <danek.duvall@oracle.com>
parents: 30175
diff changeset
    40
22772
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
    41
Labels
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
    42
------
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
    43
22462
fbd67cf34799 color: document that labels are used for colorizing text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21991
diff changeset
    44
Text receives color effects depending on the labels that it has. Many
fbd67cf34799 color: document that labels are used for colorizing text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21991
diff changeset
    45
default Mercurial commands emit labelled text. You can also define
fbd67cf34799 color: document that labels are used for colorizing text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21991
diff changeset
    46
your own labels in templates using the label function, see :hg:`help
fbd67cf34799 color: document that labels are used for colorizing text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21991
diff changeset
    47
templates`. A single portion of text may have more than one label. In
fbd67cf34799 color: document that labels are used for colorizing text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21991
diff changeset
    48
that case, effects given to the last label will override any other
fbd67cf34799 color: document that labels are used for colorizing text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21991
diff changeset
    49
effects. This includes the special "none" effect, which nullifies
fbd67cf34799 color: document that labels are used for colorizing text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21991
diff changeset
    50
other effects.
fbd67cf34799 color: document that labels are used for colorizing text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21991
diff changeset
    51
22463
1c4ae0f6a30f color: enable debug option to show labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22462
diff changeset
    52
Labels are normally invisible. In order to see these labels and their
22711
60ac52a21512 color: update docstring for debug option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22710
diff changeset
    53
position in the text, use the global --color=debug option. The same
60ac52a21512 color: update docstring for debug option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22710
diff changeset
    54
anchor text may be associated to multiple labels, e.g.
22463
1c4ae0f6a30f color: enable debug option to show labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22462
diff changeset
    55
22711
60ac52a21512 color: update docstring for debug option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22710
diff changeset
    56
  [log.changeset changeset.secret|changeset:   22611:6f0a53c8f587]
22463
1c4ae0f6a30f color: enable debug option to show labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22462
diff changeset
    57
22462
fbd67cf34799 color: document that labels are used for colorizing text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21991
diff changeset
    58
The following are the default effects for some default labels. Default
fbd67cf34799 color: document that labels are used for colorizing text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 21991
diff changeset
    59
effects may be overridden from your configuration file::
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
    60
9206
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    61
  [color]
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    62
  status.modified = blue bold underline red_background
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    63
  status.added = green bold
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    64
  status.removed = red bold blue_background
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    65
  status.deleted = cyan bold underline
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    66
  status.unknown = magenta bold underline
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    67
  status.ignored = black bold
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
    68
9206
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    69
  # 'none' turns off all effects
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    70
  status.clean = none
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    71
  status.copied = none
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
    72
9206
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    73
  qseries.applied = blue bold underline
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    74
  qseries.unapplied = black bold
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    75
  qseries.missing = red bold
7456
79eb16db5e4a color: diff colorization
Brodie Rao <me+hg@dackz.net>
parents: 7455
diff changeset
    76
9206
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    77
  diff.diffline = bold
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    78
  diff.extended = cyan bold
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    79
  diff.file_a = red bold
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    80
  diff.file_b = green bold
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    81
  diff.hunk = magenta
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    82
  diff.deleted = red
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    83
  diff.inserted = green
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    84
  diff.changed = white
22710
b07fd3ac8882 color: document the possibility to colourise tabs in diffs
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22465
diff changeset
    85
  diff.tab =
9206
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    86
  diff.trailingwhitespace = bold red_background
10046
0c23b0b3516b color: Add support for bookmarks
David Soria Parra <dsp@php.net>
parents: 10045
diff changeset
    87
22465
f8e2aebbb24c color: document that changeset phases have labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22464
diff changeset
    88
  # Blank so it inherits the style of the surrounding label
f8e2aebbb24c color: document that changeset phases have labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22464
diff changeset
    89
  changeset.public =
f8e2aebbb24c color: document that changeset phases have labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22464
diff changeset
    90
  changeset.draft =
f8e2aebbb24c color: document that changeset phases have labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22464
diff changeset
    91
  changeset.secret =
f8e2aebbb24c color: document that changeset phases have labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22464
diff changeset
    92
10223
51421ab573de color: colorize output of hg resolve -l
Georg Brandl <georg@python.org>
parents: 10222
diff changeset
    93
  resolve.unresolved = red bold
51421ab573de color: colorize output of hg resolve -l
Georg Brandl <georg@python.org>
parents: 10222
diff changeset
    94
  resolve.resolved = green bold
51421ab573de color: colorize output of hg resolve -l
Georg Brandl <georg@python.org>
parents: 10222
diff changeset
    95
25347
ceec79b5657a bookmarks: name label for active bookmark correctly
Ryan McElroy <rmcelroy@fb.com>
parents: 25186
diff changeset
    96
  bookmarks.active = green
10870
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
    97
11969
52ec5c813723 color: enable branches support
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 11750
diff changeset
    98
  branches.active = none
52ec5c813723 color: enable branches support
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 11750
diff changeset
    99
  branches.closed = black bold
52ec5c813723 color: enable branches support
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 11750
diff changeset
   100
  branches.current = green
52ec5c813723 color: enable branches support
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 11750
diff changeset
   101
  branches.inactive = none
52ec5c813723 color: enable branches support
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 11750
diff changeset
   102
15048
2f0a3977c939 color: add styles for tags
Marc Simpson <marc@0branch.com>
parents: 14989
diff changeset
   103
  tags.normal = green
2f0a3977c939 color: add styles for tags
Marc Simpson <marc@0branch.com>
parents: 14989
diff changeset
   104
  tags.local = black bold
2f0a3977c939 color: add styles for tags
Marc Simpson <marc@0branch.com>
parents: 14989
diff changeset
   105
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19073
diff changeset
   106
  rebase.rebased = blue
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19073
diff changeset
   107
  rebase.remaining = red bold
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19073
diff changeset
   108
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents: 19298
diff changeset
   109
  shelve.age = cyan
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents: 19298
diff changeset
   110
  shelve.newest = green bold
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents: 19298
diff changeset
   111
  shelve.name = blue bold
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents: 19298
diff changeset
   112
19215
f184fe1e2ac5 summary: add a histedit hook
Bryan O'Sullivan <bryano@fb.com>
parents: 19214
diff changeset
   113
  histedit.remaining = red bold
f184fe1e2ac5 summary: add a histedit hook
Bryan O'Sullivan <bryano@fb.com>
parents: 19214
diff changeset
   114
22772
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
   115
Custom colors
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
   116
-------------
14769
9adce4b38ed1 color: for the sake of "less -R", default to ansi in auto mode (issue2792)
Brodie Rao <brodie@bitheap.org>
parents: 14768
diff changeset
   117
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   118
Because there are only eight standard colors, this module allows you
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   119
to define color names for other color slots which might be available
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   120
for your terminal type, assuming terminfo mode.  For instance::
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   121
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   122
  color.brightblue = 12
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   123
  color.pink = 207
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   124
  color.orange = 202
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   125
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   126
to set 'brightblue' to color slot 12 (useful for 16 color terminals
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   127
that have brighter colors defined in the upper eight) and, 'pink' and
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   128
'orange' to colors in 256-color xterm's default color cube.  These
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   129
defined colors may then be used as any of the pre-defined eight,
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   130
including appending '_background' to set the background to that color.
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   131
22772
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
   132
Modes
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
   133
-----
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
   134
14769
9adce4b38ed1 color: for the sake of "less -R", default to ansi in auto mode (issue2792)
Brodie Rao <brodie@bitheap.org>
parents: 14768
diff changeset
   135
By default, the color extension will use ANSI mode (or win32 mode on
9adce4b38ed1 color: for the sake of "less -R", default to ansi in auto mode (issue2792)
Brodie Rao <brodie@bitheap.org>
parents: 14768
diff changeset
   136
Windows) if it detects a terminal. To override auto mode (to enable
9adce4b38ed1 color: for the sake of "less -R", default to ansi in auto mode (issue2792)
Brodie Rao <brodie@bitheap.org>
parents: 14768
diff changeset
   137
terminfo mode, for example), set the following configuration option::
10870
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   138
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   139
  [color]
14769
9adce4b38ed1 color: for the sake of "less -R", default to ansi in auto mode (issue2792)
Brodie Rao <brodie@bitheap.org>
parents: 14768
diff changeset
   140
  mode = terminfo
10870
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   141
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   142
Any value other than 'ansi', 'win32', 'terminfo', or 'auto' will
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   143
disable color.
22772
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
   144
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
   145
Note that on some systems, terminfo mode may cause problems when using
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
   146
color with the pager extension and less -R. less with the -R option
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
   147
will only display ECMA-48 color codes, and terminfo mode may sometimes
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
   148
emit codes that less doesn't understand. You can work around this by
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
   149
either using ansi mode (or auto mode), or by using less -r (which will
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
   150
pass through all terminal control codes, not just color control
b186b3ef4b54 color: reorganise and sectionify the help text
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22771
diff changeset
   151
codes).
24068
4e02418b4236 color: support a different color mode when the pager is active
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24028
diff changeset
   152
4e02418b4236 color: support a different color mode when the pager is active
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24028
diff changeset
   153
On some systems (such as MSYS in Windows), the terminal may support
4e02418b4236 color: support a different color mode when the pager is active
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24028
diff changeset
   154
a different color mode than the pager (activated via the "pager"
4e02418b4236 color: support a different color mode when the pager is active
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24028
diff changeset
   155
extension). It is possible to define separate modes depending on whether
4e02418b4236 color: support a different color mode when the pager is active
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24028
diff changeset
   156
the pager is active::
4e02418b4236 color: support a different color mode when the pager is active
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24028
diff changeset
   157
4e02418b4236 color: support a different color mode when the pager is active
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24028
diff changeset
   158
  [color]
4e02418b4236 color: support a different color mode when the pager is active
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24028
diff changeset
   159
  mode = auto
4e02418b4236 color: support a different color mode when the pager is active
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24028
diff changeset
   160
  pagermode = ansi
4e02418b4236 color: support a different color mode when the pager is active
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24028
diff changeset
   161
4e02418b4236 color: support a different color mode when the pager is active
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24028
diff changeset
   162
If ``pagermode`` is not defined, the ``mode`` will be used.
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
   163
'''
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
   164
28968
a5d449a7bc8f py3: make color use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28633
diff changeset
   165
from __future__ import absolute_import
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
   166
28968
a5d449a7bc8f py3: make color use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28633
diff changeset
   167
import os
29205
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 28968
diff changeset
   168
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 28968
diff changeset
   169
from mercurial.i18n import _
28968
a5d449a7bc8f py3: make color use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28633
diff changeset
   170
from mercurial import (
a5d449a7bc8f py3: make color use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28633
diff changeset
   171
    cmdutil,
a5d449a7bc8f py3: make color use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28633
diff changeset
   172
    commands,
a5d449a7bc8f py3: make color use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28633
diff changeset
   173
    dispatch,
a5d449a7bc8f py3: make color use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28633
diff changeset
   174
    extensions,
a5d449a7bc8f py3: make color use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28633
diff changeset
   175
    subrepo,
a5d449a7bc8f py3: make color use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28633
diff changeset
   176
    ui as uimod,
a5d449a7bc8f py3: make color use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28633
diff changeset
   177
    util,
a5d449a7bc8f py3: make color use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28633
diff changeset
   178
)
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
   179
21249
2b8697e20978 color: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21227
diff changeset
   180
cmdtable = {}
2b8697e20978 color: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21227
diff changeset
   181
command = cmdutil.command(cmdtable)
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29205
diff changeset
   182
# 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: 24848
diff changeset
   183
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24848
diff changeset
   184
# 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: 24848
diff changeset
   185
# leave the attribute unspecified.
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29205
diff changeset
   186
testedwith = 'ships-with-hg-core'
16743
38caf405d010 hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents: 15771
diff changeset
   187
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
   188
# start and stop parameters for effects
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   189
_effects = {'none': 0, 'black': 30, 'red': 31, 'green': 32, 'yellow': 33,
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   190
            'blue': 34, 'magenta': 35, 'cyan': 36, 'white': 37, 'bold': 1,
23925
e563e0cfe08c color: add missing 'dim' in _effects
Sean Farley <sean.michael.farley@gmail.com>
parents: 23780
diff changeset
   191
            'italic': 3, 'underline': 4, 'inverse': 7, 'dim': 2,
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   192
            'black_background': 40, 'red_background': 41,
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   193
            'green_background': 42, 'yellow_background': 43,
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   194
            'blue_background': 44, 'purple_background': 45,
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   195
            'cyan_background': 46, 'white_background': 47}
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   196
14495
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   197
def _terminfosetup(ui, mode):
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   198
    '''Initialize terminfo data and the terminal if we're in terminfo mode.'''
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   199
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   200
    global _terminfo_params
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   201
    # If we failed to load curses, we go ahead and return.
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   202
    if not _terminfo_params:
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   203
        return
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   204
    # Otherwise, see what the config file says.
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   205
    if mode not in ('auto', 'terminfo'):
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   206
        return
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   207
30173
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   208
    _terminfo_params.update((key[6:], (False, int(val), ''))
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   209
        for key, val in ui.configitems('color')
13998
14c7526fed89 color: code simplification
Patrick Mezard <pmezard@gmail.com>
parents: 13987
diff changeset
   210
        if key.startswith('color.'))
30173
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   211
    _terminfo_params.update((key[9:], (True, '', val.replace('\\E', '\x1b')))
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   212
        for key, val in ui.configitems('color')
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   213
        if key.startswith('terminfo.'))
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   214
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   215
    try:
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   216
        curses.setupterm()
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25597
diff changeset
   217
    except curses.error as e:
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   218
        _terminfo_params = {}
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   219
        return
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   220
30173
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   221
    for key, (b, e, c) in _terminfo_params.items():
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   222
        if not b:
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   223
            continue
30173
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   224
        if not c and not curses.tigetstr(e):
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   225
            # Most terminals don't support dim, invis, etc, so don't be
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   226
            # noisy and use ui.debug().
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   227
            ui.debug("no terminfo entry for %s\n" % e)
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   228
            del _terminfo_params[key]
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   229
    if not curses.tigetstr('setaf') or not curses.tigetstr('setab'):
14758
1e6661e09818 color: be silent when falling back to ECMA-48 mode if "auto" mode was desired
Danek Duvall <duvall@comfychair.org>
parents: 14516
diff changeset
   230
        # Only warn about missing terminfo entries if we explicitly asked for
1e6661e09818 color: be silent when falling back to ECMA-48 mode if "auto" mode was desired
Danek Duvall <duvall@comfychair.org>
parents: 14516
diff changeset
   231
        # terminfo mode.
1e6661e09818 color: be silent when falling back to ECMA-48 mode if "auto" mode was desired
Danek Duvall <duvall@comfychair.org>
parents: 14516
diff changeset
   232
        if mode == "terminfo":
1e6661e09818 color: be silent when falling back to ECMA-48 mode if "auto" mode was desired
Danek Duvall <duvall@comfychair.org>
parents: 14516
diff changeset
   233
            ui.warn(_("no terminfo entry for setab/setaf: reverting to "
1e6661e09818 color: be silent when falling back to ECMA-48 mode if "auto" mode was desired
Danek Duvall <duvall@comfychair.org>
parents: 14516
diff changeset
   234
              "ECMA-48 color\n"))
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   235
        _terminfo_params = {}
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   236
19297
8ddc3cd962ba color: only provide the required opt to _modesetup
Simon Heimberg <simohe@besonet.ch>
parents: 19215
diff changeset
   237
def _modesetup(ui, coloropt):
14495
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   238
    global _terminfo_params
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   239
22463
1c4ae0f6a30f color: enable debug option to show labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22462
diff changeset
   240
    if coloropt == 'debug':
1c4ae0f6a30f color: enable debug option to show labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22462
diff changeset
   241
        return 'debug'
1c4ae0f6a30f color: enable debug option to show labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22462
diff changeset
   242
21723
35eb333d61d5 color: add parenthesis to help readability
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21249
diff changeset
   243
    auto = (coloropt == 'auto')
14495
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   244
    always = not auto and util.parsebool(coloropt)
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   245
    if not always and not auto:
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   246
        return None
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   247
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   248
    formatted = always or (os.environ.get('TERM') != 'dumb' and ui.formatted())
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   249
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   250
    mode = ui.config('color', 'mode', 'auto')
24068
4e02418b4236 color: support a different color mode when the pager is active
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24028
diff changeset
   251
4e02418b4236 color: support a different color mode when the pager is active
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24028
diff changeset
   252
    # If pager is active, color.pagermode overrides color.mode.
4e02418b4236 color: support a different color mode when the pager is active
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24028
diff changeset
   253
    if getattr(ui, 'pageractive', False):
4e02418b4236 color: support a different color mode when the pager is active
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24028
diff changeset
   254
        mode = ui.config('color', 'pagermode', mode)
4e02418b4236 color: support a different color mode when the pager is active
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24028
diff changeset
   255
14495
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   256
    realmode = mode
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   257
    if mode == 'auto':
24028
a78888d98606 color: be more conservative about setting ANSI mode on Windows (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23925
diff changeset
   258
        if os.name == 'nt':
a78888d98606 color: be more conservative about setting ANSI mode on Windows (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23925
diff changeset
   259
            term = os.environ.get('TERM')
a78888d98606 color: be more conservative about setting ANSI mode on Windows (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23925
diff changeset
   260
            # TERM won't be defined in a vanilla cmd.exe environment.
a78888d98606 color: be more conservative about setting ANSI mode on Windows (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23925
diff changeset
   261
a78888d98606 color: be more conservative about setting ANSI mode on Windows (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23925
diff changeset
   262
            # UNIX-like environments on Windows such as Cygwin and MSYS will
a78888d98606 color: be more conservative about setting ANSI mode on Windows (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23925
diff changeset
   263
            # set TERM. They appear to make a best effort attempt at setting it
a78888d98606 color: be more conservative about setting ANSI mode on Windows (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23925
diff changeset
   264
            # to something appropriate. However, not all environments with TERM
a78888d98606 color: be more conservative about setting ANSI mode on Windows (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23925
diff changeset
   265
            # defined support ANSI. Since "ansi" could result in terminal
a78888d98606 color: be more conservative about setting ANSI mode on Windows (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23925
diff changeset
   266
            # gibberish, we error on the side of selecting "win32". However, if
a78888d98606 color: be more conservative about setting ANSI mode on Windows (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23925
diff changeset
   267
            # w32effects is not defined, we almost certainly don't support
a78888d98606 color: be more conservative about setting ANSI mode on Windows (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23925
diff changeset
   268
            # "win32", so don't even try.
24535
1818d4dca75c color: fix crash in cmd.exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 24266
diff changeset
   269
            if (term and 'xterm' in term) or not w32effects:
24028
a78888d98606 color: be more conservative about setting ANSI mode on Windows (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23925
diff changeset
   270
                realmode = 'ansi'
a78888d98606 color: be more conservative about setting ANSI mode on Windows (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23925
diff changeset
   271
            else:
a78888d98606 color: be more conservative about setting ANSI mode on Windows (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23925
diff changeset
   272
                realmode = 'win32'
14769
9adce4b38ed1 color: for the sake of "less -R", default to ansi in auto mode (issue2792)
Brodie Rao <brodie@bitheap.org>
parents: 14768
diff changeset
   273
        else:
14495
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   274
            realmode = 'ansi'
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   275
24266
c14b1d349af3 color: consolidate cut-and-paste code
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24249
diff changeset
   276
    def modewarn():
c14b1d349af3 color: consolidate cut-and-paste code
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24249
diff changeset
   277
        # only warn if color.mode was explicitly set and we're in
c14b1d349af3 color: consolidate cut-and-paste code
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24249
diff changeset
   278
        # an interactive terminal
c14b1d349af3 color: consolidate cut-and-paste code
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24249
diff changeset
   279
        if mode == realmode and ui.interactive():
c14b1d349af3 color: consolidate cut-and-paste code
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24249
diff changeset
   280
            ui.warn(_('warning: failed to set color mode to %s\n') % mode)
c14b1d349af3 color: consolidate cut-and-paste code
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24249
diff changeset
   281
14495
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   282
    if realmode == 'win32':
14989
9e9d4a762586 color.py - clear _terminfo_params in win32 mode
Andrei Vermel <avermel@mail.ru>
parents: 14769
diff changeset
   283
        _terminfo_params = {}
14768
55db12e54450 color: fix TypeError with auto mode on win32 when colors aren't available (issue2871)
Brodie Rao <brodie@bitheap.org>
parents: 14758
diff changeset
   284
        if not w32effects:
24266
c14b1d349af3 color: consolidate cut-and-paste code
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24249
diff changeset
   285
            modewarn()
14495
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   286
            return None
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   287
        _effects.update(w32effects)
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   288
    elif realmode == 'ansi':
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   289
        _terminfo_params = {}
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   290
    elif realmode == 'terminfo':
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   291
        _terminfosetup(ui, mode)
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   292
        if not _terminfo_params:
24266
c14b1d349af3 color: consolidate cut-and-paste code
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24249
diff changeset
   293
            ## FIXME Shouldn't we return None in this case too?
c14b1d349af3 color: consolidate cut-and-paste code
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24249
diff changeset
   294
            modewarn()
14495
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   295
            realmode = 'ansi'
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   296
    else:
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   297
        return None
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   298
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   299
    if always or (auto and formatted):
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   300
        return realmode
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   301
    return None
ad6ad51cc0dd color: fix --color=always when output is piped
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14145
diff changeset
   302
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   303
try:
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   304
    import curses
30173
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   305
    # Mapping from effect name to terminfo attribute name (or raw code) or
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   306
    # color number.  This will also force-load the curses module.
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   307
    _terminfo_params = {'none': (True, 'sgr0', ''),
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   308
                        'standout': (True, 'smso', ''),
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   309
                        'underline': (True, 'smul', ''),
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   310
                        'reverse': (True, 'rev', ''),
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   311
                        'inverse': (True, 'rev', ''),
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   312
                        'blink': (True, 'blink', ''),
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   313
                        'dim': (True, 'dim', ''),
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   314
                        'bold': (True, 'bold', ''),
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   315
                        'invisible': (True, 'invis', ''),
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   316
                        'italic': (True, 'sitm', ''),
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   317
                        'black': (False, curses.COLOR_BLACK, ''),
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   318
                        'red': (False, curses.COLOR_RED, ''),
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   319
                        'green': (False, curses.COLOR_GREEN, ''),
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   320
                        'yellow': (False, curses.COLOR_YELLOW, ''),
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   321
                        'blue': (False, curses.COLOR_BLUE, ''),
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   322
                        'magenta': (False, curses.COLOR_MAGENTA, ''),
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   323
                        'cyan': (False, curses.COLOR_CYAN, ''),
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   324
                        'white': (False, curses.COLOR_WHITE, '')}
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   325
except ImportError:
21227
75aaae8ad660 color: don't fail on error messages when no curses (issue4237)
Mads Kiilerich <madski@unity3d.com>
parents: 21190
diff changeset
   326
    _terminfo_params = {}
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   327
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   328
_styles = {'grep.match': 'red bold',
17806
dc7010ed0101 grep: colorize all fields
Idan Kamara <idankk86@gmail.com>
parents: 17424
diff changeset
   329
           'grep.linenumber': 'green',
dc7010ed0101 grep: colorize all fields
Idan Kamara <idankk86@gmail.com>
parents: 17424
diff changeset
   330
           'grep.rev': 'green',
dc7010ed0101 grep: colorize all fields
Idan Kamara <idankk86@gmail.com>
parents: 17424
diff changeset
   331
           'grep.change': 'green',
dc7010ed0101 grep: colorize all fields
Idan Kamara <idankk86@gmail.com>
parents: 17424
diff changeset
   332
           'grep.sep': 'cyan',
dc7010ed0101 grep: colorize all fields
Idan Kamara <idankk86@gmail.com>
parents: 17424
diff changeset
   333
           'grep.filename': 'magenta',
dc7010ed0101 grep: colorize all fields
Idan Kamara <idankk86@gmail.com>
parents: 17424
diff changeset
   334
           'grep.user': 'magenta',
dc7010ed0101 grep: colorize all fields
Idan Kamara <idankk86@gmail.com>
parents: 17424
diff changeset
   335
           'grep.date': 'magenta',
25347
ceec79b5657a bookmarks: name label for active bookmark correctly
Ryan McElroy <rmcelroy@fb.com>
parents: 25186
diff changeset
   336
           'bookmarks.active': 'green',
11969
52ec5c813723 color: enable branches support
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 11750
diff changeset
   337
           'branches.active': 'none',
52ec5c813723 color: enable branches support
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 11750
diff changeset
   338
           'branches.closed': 'black bold',
52ec5c813723 color: enable branches support
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 11750
diff changeset
   339
           'branches.current': 'green',
52ec5c813723 color: enable branches support
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 11750
diff changeset
   340
           'branches.inactive': 'none',
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   341
           'diff.changed': 'white',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   342
           'diff.deleted': 'red',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   343
           'diff.diffline': 'bold',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   344
           'diff.extended': 'cyan bold',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   345
           'diff.file_a': 'red bold',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   346
           'diff.file_b': 'green bold',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   347
           'diff.hunk': 'magenta',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   348
           'diff.inserted': 'green',
22710
b07fd3ac8882 color: document the possibility to colourise tabs in diffs
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22465
diff changeset
   349
           'diff.tab': '',
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   350
           'diff.trailingwhitespace': 'bold red_background',
22465
f8e2aebbb24c color: document that changeset phases have labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22464
diff changeset
   351
           'changeset.public' : '',
f8e2aebbb24c color: document that changeset phases have labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22464
diff changeset
   352
           'changeset.draft' : '',
f8e2aebbb24c color: document that changeset phases have labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22464
diff changeset
   353
           'changeset.secret' : '',
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   354
           'diffstat.deleted': 'red',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   355
           'diffstat.inserted': 'green',
19215
f184fe1e2ac5 summary: add a histedit hook
Bryan O'Sullivan <bryano@fb.com>
parents: 19214
diff changeset
   356
           'histedit.remaining': 'red bold',
13774
1ce0e80799c0 ui: label prompts, default to yellow prompts
Martin Geisler <mg@lazybytes.net>
parents: 13648
diff changeset
   357
           'ui.prompt': 'yellow',
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   358
           'log.changeset': 'yellow',
23173
122f5c3f3308 patchbomb: add label and color to the confirm output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22772
diff changeset
   359
           'patchbomb.finalsummary': '',
122f5c3f3308 patchbomb: add label and color to the confirm output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22772
diff changeset
   360
           'patchbomb.from': 'magenta',
122f5c3f3308 patchbomb: add label and color to the confirm output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22772
diff changeset
   361
           'patchbomb.to': 'cyan',
122f5c3f3308 patchbomb: add label and color to the confirm output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22772
diff changeset
   362
           'patchbomb.subject': 'green',
122f5c3f3308 patchbomb: add label and color to the confirm output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22772
diff changeset
   363
           'patchbomb.diffstats': '',
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19073
diff changeset
   364
           'rebase.rebased': 'blue',
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19073
diff changeset
   365
           'rebase.remaining': 'red bold',
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   366
           'resolve.resolved': 'green bold',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   367
           'resolve.unresolved': 'red bold',
19854
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents: 19298
diff changeset
   368
           'shelve.age': 'cyan',
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents: 19298
diff changeset
   369
           'shelve.newest': 'green bold',
49d4919d21c2 shelve: add a shelve extension to save/restore working changes
David Soria Parra <dsp@experimentalworks.net>
parents: 19298
diff changeset
   370
           'shelve.name': 'blue bold',
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   371
           'status.added': 'green bold',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   372
           'status.clean': 'none',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   373
           'status.copied': 'none',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   374
           'status.deleted': 'cyan bold underline',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   375
           'status.ignored': 'black bold',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   376
           'status.modified': 'blue bold',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   377
           'status.removed': 'red bold',
15048
2f0a3977c939 color: add styles for tags
Marc Simpson <marc@0branch.com>
parents: 14989
diff changeset
   378
           'status.unknown': 'magenta bold underline',
2f0a3977c939 color: add styles for tags
Marc Simpson <marc@0branch.com>
parents: 14989
diff changeset
   379
           'tags.normal': 'green',
2f0a3977c939 color: add styles for tags
Marc Simpson <marc@0branch.com>
parents: 14989
diff changeset
   380
           'tags.local': 'black bold'}
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   381
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
   382
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   383
def _effect_str(effect):
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   384
    '''Helper function for render_effects().'''
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   385
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   386
    bg = False
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   387
    if effect.endswith('_background'):
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   388
        bg = True
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   389
        effect = effect[:-11]
30174
5d777fe4615d color: ignore effects missing from terminfo
Danek Duvall <danek.duvall@oracle.com>
parents: 30173
diff changeset
   390
    try:
5d777fe4615d color: ignore effects missing from terminfo
Danek Duvall <danek.duvall@oracle.com>
parents: 30173
diff changeset
   391
        attr, val, termcode = _terminfo_params[effect]
5d777fe4615d color: ignore effects missing from terminfo
Danek Duvall <danek.duvall@oracle.com>
parents: 30173
diff changeset
   392
    except KeyError:
5d777fe4615d color: ignore effects missing from terminfo
Danek Duvall <danek.duvall@oracle.com>
parents: 30173
diff changeset
   393
        return ''
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   394
    if attr:
30173
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   395
        if termcode:
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   396
            return termcode
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   397
        else:
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   398
            return curses.tigetstr(val)
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   399
    elif bg:
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   400
        return curses.tparm(curses.tigetstr('setab'), val)
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   401
    else:
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   402
        return curses.tparm(curses.tigetstr('setaf'), val)
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   403
8622
0a4f6e1b78dc color: use lists instead of tuples for effects
Martin Geisler <mg@lazybytes.net>
parents: 8278
diff changeset
   404
def render_effects(text, effects):
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
   405
    'Wrap text in commands to turn on each effect.'
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   406
    if not text:
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   407
        return text
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   408
    if not _terminfo_params:
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   409
        start = [str(_effects[e]) for e in ['none'] + effects.split()]
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   410
        start = '\033[' + ';'.join(start) + 'm'
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   411
        stop = '\033[' + str(_effects['none']) + 'm'
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   412
    else:
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   413
        start = ''.join(_effect_str(effect)
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   414
                        for effect in ['none'] + effects.split())
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   415
        stop = _effect_str('none')
7459
3fb5c142a9f0 color: replace effect-specific reset control codes with general purpose one
Brodie Rao <me+hg@dackz.net>
parents: 7457
diff changeset
   416
    return ''.join([start, text, stop])
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
   417
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   418
def extstyles():
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   419
    for name, ext in extensions.extensions():
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   420
        _styles.update(getattr(ext, 'colortable', {}))
7456
79eb16db5e4a color: diff colorization
Brodie Rao <me+hg@dackz.net>
parents: 7455
diff changeset
   421
20992
05086b56b564 color: extract method for determining a valid effect
Sean Farley <sean.michael.farley@gmail.com>
parents: 20670
diff changeset
   422
def valideffect(effect):
05086b56b564 color: extract method for determining a valid effect
Sean Farley <sean.michael.farley@gmail.com>
parents: 20670
diff changeset
   423
    'Determine if the effect is valid or not.'
05086b56b564 color: extract method for determining a valid effect
Sean Farley <sean.michael.farley@gmail.com>
parents: 20670
diff changeset
   424
    good = False
05086b56b564 color: extract method for determining a valid effect
Sean Farley <sean.michael.farley@gmail.com>
parents: 20670
diff changeset
   425
    if not _terminfo_params and effect in _effects:
05086b56b564 color: extract method for determining a valid effect
Sean Farley <sean.michael.farley@gmail.com>
parents: 20670
diff changeset
   426
        good = True
05086b56b564 color: extract method for determining a valid effect
Sean Farley <sean.michael.farley@gmail.com>
parents: 20670
diff changeset
   427
    elif effect in _terminfo_params or effect[:-11] in _terminfo_params:
05086b56b564 color: extract method for determining a valid effect
Sean Farley <sean.michael.farley@gmail.com>
parents: 20670
diff changeset
   428
        good = True
05086b56b564 color: extract method for determining a valid effect
Sean Farley <sean.michael.farley@gmail.com>
parents: 20670
diff changeset
   429
    return good
05086b56b564 color: extract method for determining a valid effect
Sean Farley <sean.michael.farley@gmail.com>
parents: 20670
diff changeset
   430
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   431
def configstyles(ui):
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   432
    for status, cfgeffects in ui.configitems('color'):
30173
f34a8cff51d9 color: allow for user-configurable terminfo codes for effects
Danek Duvall <danek.duvall@oracle.com>
parents: 29890
diff changeset
   433
        if '.' not in status or status.startswith(('color.', 'terminfo.')):
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   434
            continue
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   435
        cfgeffects = ui.configlist('color', status)
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   436
        if cfgeffects:
8945
7b3d837ca60e color: don't blow up if configured with unknown color (just warn).
Greg Ward <greg-hg@gerg.ca>
parents: 8894
diff changeset
   437
            good = []
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   438
            for e in cfgeffects:
20992
05086b56b564 color: extract method for determining a valid effect
Sean Farley <sean.michael.farley@gmail.com>
parents: 20670
diff changeset
   439
                if valideffect(e):
8945
7b3d837ca60e color: don't blow up if configured with unknown color (just warn).
Greg Ward <greg-hg@gerg.ca>
parents: 8894
diff changeset
   440
                    good.append(e)
7b3d837ca60e color: don't blow up if configured with unknown color (just warn).
Greg Ward <greg-hg@gerg.ca>
parents: 8894
diff changeset
   441
                else:
7b3d837ca60e color: don't blow up if configured with unknown color (just warn).
Greg Ward <greg-hg@gerg.ca>
parents: 8894
diff changeset
   442
                    ui.warn(_("ignoring unknown color/effect %r "
7b3d837ca60e color: don't blow up if configured with unknown color (just warn).
Greg Ward <greg-hg@gerg.ca>
parents: 8894
diff changeset
   443
                              "(configured in color.%s)\n")
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   444
                            % (e, status))
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   445
            _styles[status] = ' '.join(good)
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   446
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   447
class colorui(uimod.ui):
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   448
    _colormode = 'ansi'
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   449
    def write(self, *args, **opts):
19072
b7b50a54bec9 color: turn colorui functions into forwards when color is None
Siddharth Agarwal <sid0@fb.com>
parents: 19063
diff changeset
   450
        if self._colormode is None:
b7b50a54bec9 color: turn colorui functions into forwards when color is None
Siddharth Agarwal <sid0@fb.com>
parents: 19063
diff changeset
   451
            return super(colorui, self).write(*args, **opts)
b7b50a54bec9 color: turn colorui functions into forwards when color is None
Siddharth Agarwal <sid0@fb.com>
parents: 19063
diff changeset
   452
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   453
        label = opts.get('label', '')
28633
e35d7f131483 ui: add prompt argument to write (issue5154) (API)
timeless <timeless@mozdev.org>
parents: 28374
diff changeset
   454
        if self._buffers and not opts.get('prompt', False):
27108
717b75ae5bb0 color: evaluate labels at write time
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
   455
            if self._bufferapplylabels:
27110
f04bd381e8c0 ui: avoid needless casting to a str
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27109
diff changeset
   456
                self._buffers[-1].extend(self.label(a, label) for a in args)
27108
717b75ae5bb0 color: evaluate labels at write time
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
   457
            else:
27110
f04bd381e8c0 ui: avoid needless casting to a str
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27109
diff changeset
   458
                self._buffers[-1].extend(args)
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   459
        elif self._colormode == 'win32':
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   460
            for a in args:
11727
c34a1ab80550 color: pass write/write_err to win32print correctly (issue2312)
Brodie Rao <brodie@bitheap.org>
parents: 11555
diff changeset
   461
                win32print(a, super(colorui, self).write, **opts)
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   462
        else:
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   463
            return super(colorui, self).write(
27110
f04bd381e8c0 ui: avoid needless casting to a str
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27109
diff changeset
   464
                *[self.label(a, label) for a in args], **opts)
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   465
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   466
    def write_err(self, *args, **opts):
19072
b7b50a54bec9 color: turn colorui functions into forwards when color is None
Siddharth Agarwal <sid0@fb.com>
parents: 19063
diff changeset
   467
        if self._colormode is None:
b7b50a54bec9 color: turn colorui functions into forwards when color is None
Siddharth Agarwal <sid0@fb.com>
parents: 19063
diff changeset
   468
            return super(colorui, self).write_err(*args, **opts)
b7b50a54bec9 color: turn colorui functions into forwards when color is None
Siddharth Agarwal <sid0@fb.com>
parents: 19063
diff changeset
   469
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   470
        label = opts.get('label', '')
24848
2f88821856eb ui: allow capture of subprocess output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24535
diff changeset
   471
        if self._bufferstates and self._bufferstates[-1][0]:
21190
2606e7f227f6 color: add missing handling of stderr capture introduced by 350dc24a553d
Yuya Nishihara <yuya@tcha.org>
parents: 21037
diff changeset
   472
            return self.write(*args, **opts)
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   473
        if self._colormode == 'win32':
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   474
            for a in args:
11727
c34a1ab80550 color: pass write/write_err to win32print correctly (issue2312)
Brodie Rao <brodie@bitheap.org>
parents: 11555
diff changeset
   475
                win32print(a, super(colorui, self).write_err, **opts)
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   476
        else:
11732
386e56ecfb78 color: call correct superclass method in write_err
Brodie Rao <brodie@bitheap.org>
parents: 11727
diff changeset
   477
            return super(colorui, self).write_err(
27110
f04bd381e8c0 ui: avoid needless casting to a str
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27109
diff changeset
   478
                *[self.label(a, label) for a in args], **opts)
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   479
22463
1c4ae0f6a30f color: enable debug option to show labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22462
diff changeset
   480
    def showlabel(self, msg, label):
22763
7ebf91426f6a color: omit debug label output on empty strings
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22711
diff changeset
   481
        if label and msg:
7ebf91426f6a color: omit debug label output on empty strings
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22711
diff changeset
   482
            if msg[-1] == '\n':
22464
964dd1c491ca color: change the debug output format
Matt Mackall <mpm@selenic.com>
parents: 22463
diff changeset
   483
                return "[%s|%s]\n" % (label, msg[:-1])
22463
1c4ae0f6a30f color: enable debug option to show labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22462
diff changeset
   484
            else:
22464
964dd1c491ca color: change the debug output format
Matt Mackall <mpm@selenic.com>
parents: 22463
diff changeset
   485
                return "[%s|%s]" % (label, msg)
22463
1c4ae0f6a30f color: enable debug option to show labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22462
diff changeset
   486
        else:
1c4ae0f6a30f color: enable debug option to show labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22462
diff changeset
   487
            return msg
1c4ae0f6a30f color: enable debug option to show labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22462
diff changeset
   488
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   489
    def label(self, msg, label):
19072
b7b50a54bec9 color: turn colorui functions into forwards when color is None
Siddharth Agarwal <sid0@fb.com>
parents: 19063
diff changeset
   490
        if self._colormode is None:
b7b50a54bec9 color: turn colorui functions into forwards when color is None
Siddharth Agarwal <sid0@fb.com>
parents: 19063
diff changeset
   491
            return super(colorui, self).label(msg, label)
b7b50a54bec9 color: turn colorui functions into forwards when color is None
Siddharth Agarwal <sid0@fb.com>
parents: 19063
diff changeset
   492
22463
1c4ae0f6a30f color: enable debug option to show labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22462
diff changeset
   493
        if self._colormode == 'debug':
1c4ae0f6a30f color: enable debug option to show labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22462
diff changeset
   494
            return self.showlabel(msg, label)
1c4ae0f6a30f color: enable debug option to show labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22462
diff changeset
   495
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   496
        effects = []
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   497
        for l in label.split():
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   498
            s = _styles.get(l, '')
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   499
            if s:
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   500
                effects.append(s)
20993
a8db48e997b5 color: fallback and test label as an effect
Sean Farley <sean.michael.farley@gmail.com>
parents: 20992
diff changeset
   501
            elif valideffect(l):
a8db48e997b5 color: fallback and test label as an effect
Sean Farley <sean.michael.farley@gmail.com>
parents: 20992
diff changeset
   502
                effects.append(l)
14145
4b7e4b9db8fb color: fix using multiple effects
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 14139
diff changeset
   503
        effects = ' '.join(effects)
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   504
        if effects:
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   505
            return '\n'.join([render_effects(s, effects)
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   506
                              for s in msg.split('\n')])
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   507
        return msg
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   508
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   509
def uisetup(ui):
10871
3f30190781a3 color: respect HGPLAIN
Steve Borho <steve@borho.org>
parents: 10870
diff changeset
   510
    if ui.plain():
3f30190781a3 color: respect HGPLAIN
Steve Borho <steve@borho.org>
parents: 10870
diff changeset
   511
        return
19298
6cd8403e070f color: use pythons isinstance method instead of reprogramming it
Simon Heimberg <simohe@besonet.ch>
parents: 19297
diff changeset
   512
    if not isinstance(ui, colorui):
19063
7ae12ce87594 color: set the ui class in reposetup, before a repo is created
Simon Heimberg <simohe@besonet.ch>
parents: 18921
diff changeset
   513
        colorui.__bases__ = (ui.__class__,)
7ae12ce87594 color: set the ui class in reposetup, before a repo is created
Simon Heimberg <simohe@besonet.ch>
parents: 18921
diff changeset
   514
        ui.__class__ = colorui
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   515
    def colorcmd(orig, ui_, opts, cmd, cmdfunc):
19297
8ddc3cd962ba color: only provide the required opt to _modesetup
Simon Heimberg <simohe@besonet.ch>
parents: 19215
diff changeset
   516
        mode = _modesetup(ui_, opts['color'])
19073
d78d0256198e color: set _colormode to None when mode is unset (issue3895)
Siddharth Agarwal <sid0@fb.com>
parents: 19072
diff changeset
   517
        colorui._colormode = mode
22463
1c4ae0f6a30f color: enable debug option to show labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22462
diff changeset
   518
        if mode and mode != 'debug':
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   519
            extstyles()
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   520
            configstyles(ui_)
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   521
        return orig(ui_, opts, cmd, cmdfunc)
23780
a857755144dc color: add support for colorizing git subrepo diffs
Mathias De Maré <mathias.demare@gmail.com>
parents: 23173
diff changeset
   522
    def colorgit(orig, gitsub, commands, env=None, stream=False, cwd=None):
a857755144dc color: add support for colorizing git subrepo diffs
Mathias De Maré <mathias.demare@gmail.com>
parents: 23173
diff changeset
   523
        if gitsub.ui._colormode and len(commands) and commands[0] == "diff":
a857755144dc color: add support for colorizing git subrepo diffs
Mathias De Maré <mathias.demare@gmail.com>
parents: 23173
diff changeset
   524
                # insert the argument in the front,
a857755144dc color: add support for colorizing git subrepo diffs
Mathias De Maré <mathias.demare@gmail.com>
parents: 23173
diff changeset
   525
                # the end of git diff arguments is used for paths
a857755144dc color: add support for colorizing git subrepo diffs
Mathias De Maré <mathias.demare@gmail.com>
parents: 23173
diff changeset
   526
                commands.insert(1, '--color')
a857755144dc color: add support for colorizing git subrepo diffs
Mathias De Maré <mathias.demare@gmail.com>
parents: 23173
diff changeset
   527
        return orig(gitsub, commands, env, stream, cwd)
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   528
    extensions.wrapfunction(dispatch, '_runcommand', colorcmd)
23780
a857755144dc color: add support for colorizing git subrepo diffs
Mathias De Maré <mathias.demare@gmail.com>
parents: 23173
diff changeset
   529
    extensions.wrapfunction(subrepo.gitsubrepo, '_gitnodir', colorgit)
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   530
12693
33f0682ba8b1 color: add global option in extsetup() instead of globally
Brodie Rao <brodie@bitheap.org>
parents: 12278
diff changeset
   531
def extsetup(ui):
33f0682ba8b1 color: add global option in extsetup() instead of globally
Brodie Rao <brodie@bitheap.org>
parents: 12278
diff changeset
   532
    commands.globalopts.append(
33f0682ba8b1 color: add global option in extsetup() instead of globally
Brodie Rao <brodie@bitheap.org>
parents: 12278
diff changeset
   533
        ('', 'color', 'auto',
22463
1c4ae0f6a30f color: enable debug option to show labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22462
diff changeset
   534
         # i18n: 'always', 'auto', 'never', and 'debug' are keywords
1c4ae0f6a30f color: enable debug option to show labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22462
diff changeset
   535
         # and should not be translated
1c4ae0f6a30f color: enable debug option to show labels
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22462
diff changeset
   536
         _("when to colorize (boolean, always, auto, never, or debug)"),
12693
33f0682ba8b1 color: add global option in extsetup() instead of globally
Brodie Rao <brodie@bitheap.org>
parents: 12278
diff changeset
   537
         _('TYPE')))
10870
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   538
21249
2b8697e20978 color: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21227
diff changeset
   539
@command('debugcolor', [], 'hg debugcolor')
20455
a2c08adbb86e color: add debugcolor command (issue4094)
Olle Lundberg <geek@nerd.sh>
parents: 20067
diff changeset
   540
def debugcolor(ui, repo, **opts):
30282
7a53458fae4e color: add basic documentation to 'debugcolor'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30176
diff changeset
   541
    """show available colors and effects"""
20455
a2c08adbb86e color: add debugcolor command (issue4094)
Olle Lundberg <geek@nerd.sh>
parents: 20067
diff changeset
   542
    global _styles
30283
e1f6898a80e1 color: restore _style global after debugcolor ran
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30282
diff changeset
   543
    oldstyle = _styles
e1f6898a80e1 color: restore _style global after debugcolor ran
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30282
diff changeset
   544
    try:
e1f6898a80e1 color: restore _style global after debugcolor ran
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30282
diff changeset
   545
        _styles = {}
e1f6898a80e1 color: restore _style global after debugcolor ran
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30282
diff changeset
   546
        for effect in _effects.keys():
e1f6898a80e1 color: restore _style global after debugcolor ran
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30282
diff changeset
   547
            _styles[effect] = effect
e1f6898a80e1 color: restore _style global after debugcolor ran
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30282
diff changeset
   548
        if _terminfo_params:
e1f6898a80e1 color: restore _style global after debugcolor ran
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30282
diff changeset
   549
            for k, v in ui.configitems('color'):
e1f6898a80e1 color: restore _style global after debugcolor ran
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30282
diff changeset
   550
                if k.startswith('color.'):
e1f6898a80e1 color: restore _style global after debugcolor ran
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30282
diff changeset
   551
                    _styles[k] = k[6:]
e1f6898a80e1 color: restore _style global after debugcolor ran
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30282
diff changeset
   552
                elif k.startswith('terminfo.'):
e1f6898a80e1 color: restore _style global after debugcolor ran
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30282
diff changeset
   553
                    _styles[k] = k[9:]
e1f6898a80e1 color: restore _style global after debugcolor ran
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30282
diff changeset
   554
        ui.write(('color mode: %s\n') % ui._colormode)
e1f6898a80e1 color: restore _style global after debugcolor ran
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30282
diff changeset
   555
        ui.write(_('available colors:\n'))
e1f6898a80e1 color: restore _style global after debugcolor ran
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30282
diff changeset
   556
        for colorname, label in _styles.items():
e1f6898a80e1 color: restore _style global after debugcolor ran
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30282
diff changeset
   557
            ui.write(('%s\n') % colorname, label=label)
e1f6898a80e1 color: restore _style global after debugcolor ran
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30282
diff changeset
   558
    finally:
e1f6898a80e1 color: restore _style global after debugcolor ran
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30282
diff changeset
   559
        _styles = oldstyle
20455
a2c08adbb86e color: add debugcolor command (issue4094)
Olle Lundberg <geek@nerd.sh>
parents: 20067
diff changeset
   560
13641
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   561
if os.name != 'nt':
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   562
    w32effects = None
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   563
else:
28968
a5d449a7bc8f py3: make color use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28633
diff changeset
   564
    import ctypes
a5d449a7bc8f py3: make color use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28633
diff changeset
   565
    import re
13641
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   566
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   567
    _kernel32 = ctypes.windll.kernel32
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   568
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   569
    _WORD = ctypes.c_ushort
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   570
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   571
    _INVALID_HANDLE_VALUE = -1
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   572
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   573
    class _COORD(ctypes.Structure):
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   574
        _fields_ = [('X', ctypes.c_short),
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   575
                    ('Y', ctypes.c_short)]
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   576
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   577
    class _SMALL_RECT(ctypes.Structure):
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   578
        _fields_ = [('Left', ctypes.c_short),
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   579
                    ('Top', ctypes.c_short),
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   580
                    ('Right', ctypes.c_short),
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   581
                    ('Bottom', ctypes.c_short)]
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   582
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   583
    class _CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure):
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   584
        _fields_ = [('dwSize', _COORD),
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   585
                    ('dwCursorPosition', _COORD),
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   586
                    ('wAttributes', _WORD),
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   587
                    ('srWindow', _SMALL_RECT),
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   588
                    ('dwMaximumWindowSize', _COORD)]
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   589
29890
31a6d5e14508 py3: remove use of *L syntax
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29841
diff changeset
   590
    _STD_OUTPUT_HANDLE = 0xfffffff5 # (DWORD)-11
31a6d5e14508 py3: remove use of *L syntax
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29841
diff changeset
   591
    _STD_ERROR_HANDLE = 0xfffffff4  # (DWORD)-12
13641
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   592
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   593
    _FOREGROUND_BLUE = 0x0001
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   594
    _FOREGROUND_GREEN = 0x0002
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   595
    _FOREGROUND_RED = 0x0004
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   596
    _FOREGROUND_INTENSITY = 0x0008
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   597
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   598
    _BACKGROUND_BLUE = 0x0010
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   599
    _BACKGROUND_GREEN = 0x0020
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   600
    _BACKGROUND_RED = 0x0040
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   601
    _BACKGROUND_INTENSITY = 0x0080
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   602
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   603
    _COMMON_LVB_REVERSE_VIDEO = 0x4000
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   604
    _COMMON_LVB_UNDERSCORE = 0x8000
10870
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   605
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   606
    # http://msdn.microsoft.com/en-us/library/ms682088%28VS.85%29.aspx
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   607
    w32effects = {
12277
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   608
        'none': -1,
10870
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   609
        'black': 0,
13641
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   610
        'red': _FOREGROUND_RED,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   611
        'green': _FOREGROUND_GREEN,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   612
        'yellow': _FOREGROUND_RED | _FOREGROUND_GREEN,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   613
        'blue': _FOREGROUND_BLUE,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   614
        'magenta': _FOREGROUND_BLUE | _FOREGROUND_RED,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   615
        'cyan': _FOREGROUND_BLUE | _FOREGROUND_GREEN,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   616
        'white': _FOREGROUND_RED | _FOREGROUND_GREEN | _FOREGROUND_BLUE,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   617
        'bold': _FOREGROUND_INTENSITY,
12278
c4c2ba553401 merge with stable
Sune Foldager <cryo@cyanite.org>
parents: 12089 12277
diff changeset
   618
        'black_background': 0x100,                  # unused value > 0x0f
13641
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   619
        'red_background': _BACKGROUND_RED,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   620
        'green_background': _BACKGROUND_GREEN,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   621
        'yellow_background': _BACKGROUND_RED | _BACKGROUND_GREEN,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   622
        'blue_background': _BACKGROUND_BLUE,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   623
        'purple_background': _BACKGROUND_BLUE | _BACKGROUND_RED,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   624
        'cyan_background': _BACKGROUND_BLUE | _BACKGROUND_GREEN,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   625
        'white_background': (_BACKGROUND_RED | _BACKGROUND_GREEN |
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   626
                             _BACKGROUND_BLUE),
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   627
        'bold_background': _BACKGROUND_INTENSITY,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   628
        'underline': _COMMON_LVB_UNDERSCORE,  # double-byte charsets only
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   629
        'inverse': _COMMON_LVB_REVERSE_VIDEO, # double-byte charsets only
10870
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   630
    }
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   631
13641
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   632
    passthrough = set([_FOREGROUND_INTENSITY,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   633
                       _BACKGROUND_INTENSITY,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   634
                       _COMMON_LVB_UNDERSCORE,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   635
                       _COMMON_LVB_REVERSE_VIDEO])
12277
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   636
13641
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   637
    stdout = _kernel32.GetStdHandle(
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   638
                  _STD_OUTPUT_HANDLE)  # don't close the handle returned
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   639
    if stdout is None or stdout == _INVALID_HANDLE_VALUE:
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   640
        w32effects = None
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   641
    else:
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   642
        csbi = _CONSOLE_SCREEN_BUFFER_INFO()
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   643
        if not _kernel32.GetConsoleScreenBufferInfo(
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   644
                    stdout, ctypes.byref(csbi)):
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   645
            # stdout may not support GetConsoleScreenBufferInfo()
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   646
            # when called from subprocess or redirected
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   647
            w32effects = None
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   648
        else:
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   649
            origattr = csbi.wAttributes
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   650
            ansire = re.compile('\033\[([^m]*)m([^\033]*)(.*)',
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   651
                                re.MULTILINE | re.DOTALL)
10870
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   652
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   653
    def win32print(text, orig, **opts):
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   654
        label = opts.get('label', '')
12277
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   655
        attr = origattr
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   656
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   657
        def mapcolor(val, attr):
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   658
            if val == -1:
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   659
                return origattr
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   660
            elif val in passthrough:
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   661
                return attr | val
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   662
            elif val > 0x0f:
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   663
                return (val & 0x70) | (attr & 0x8f)
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   664
            else:
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   665
                return (val & 0x07) | (attr & 0xf8)
10870
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   666
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   667
        # determine console attributes based on labels
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   668
        for l in label.split():
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   669
            style = _styles.get(l, '')
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   670
            for effect in style.split():
21991
aca137619a45 color: pass on key error for win32 (issue4298)
Sean Farley <sean.michael.farley@gmail.com>
parents: 21723
diff changeset
   671
                try:
aca137619a45 color: pass on key error for win32 (issue4298)
Sean Farley <sean.michael.farley@gmail.com>
parents: 21723
diff changeset
   672
                    attr = mapcolor(w32effects[effect], attr)
aca137619a45 color: pass on key error for win32 (issue4298)
Sean Farley <sean.michael.farley@gmail.com>
parents: 21723
diff changeset
   673
                except KeyError:
aca137619a45 color: pass on key error for win32 (issue4298)
Sean Farley <sean.michael.farley@gmail.com>
parents: 21723
diff changeset
   674
                    # w32effects could not have certain attributes so we skip
aca137619a45 color: pass on key error for win32 (issue4298)
Sean Farley <sean.michael.farley@gmail.com>
parents: 21723
diff changeset
   675
                    # them if not found
aca137619a45 color: pass on key error for win32 (issue4298)
Sean Farley <sean.michael.farley@gmail.com>
parents: 21723
diff changeset
   676
                    pass
10870
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   677
        # hack to ensure regexp finds data
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   678
        if not text.startswith('\033['):
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   679
            text = '\033[m' + text
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   680
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   681
        # Look for ANSI-like codes embedded in text
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   682
        m = re.match(ansire, text)
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   683
13919
67f20625703f color: reset win32 console color in a finally block
Idan Kamara <idankk86@gmail.com>
parents: 13774
diff changeset
   684
        try:
67f20625703f color: reset win32 console color in a finally block
Idan Kamara <idankk86@gmail.com>
parents: 13774
diff changeset
   685
            while m:
67f20625703f color: reset win32 console color in a finally block
Idan Kamara <idankk86@gmail.com>
parents: 13774
diff changeset
   686
                for sattr in m.group(1).split(';'):
67f20625703f color: reset win32 console color in a finally block
Idan Kamara <idankk86@gmail.com>
parents: 13774
diff changeset
   687
                    if sattr:
67f20625703f color: reset win32 console color in a finally block
Idan Kamara <idankk86@gmail.com>
parents: 13774
diff changeset
   688
                        attr = mapcolor(int(sattr), attr)
67f20625703f color: reset win32 console color in a finally block
Idan Kamara <idankk86@gmail.com>
parents: 13774
diff changeset
   689
                _kernel32.SetConsoleTextAttribute(stdout, attr)
67f20625703f color: reset win32 console color in a finally block
Idan Kamara <idankk86@gmail.com>
parents: 13774
diff changeset
   690
                orig(m.group(2), **opts)
67f20625703f color: reset win32 console color in a finally block
Idan Kamara <idankk86@gmail.com>
parents: 13774
diff changeset
   691
                m = re.match(ansire, m.group(3))
67f20625703f color: reset win32 console color in a finally block
Idan Kamara <idankk86@gmail.com>
parents: 13774
diff changeset
   692
        finally:
17424
e7cfe3587ea4 fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents: 16743
diff changeset
   693
            # Explicitly reset original attributes
13919
67f20625703f color: reset win32 console color in a finally block
Idan Kamara <idankk86@gmail.com>
parents: 13774
diff changeset
   694
            _kernel32.SetConsoleTextAttribute(stdout, origattr)