hgext/color.py
author Alexander Solovyov <alexander@solovyov.net>
Sun, 13 Mar 2011 15:53:38 +0100
changeset 14042 9966c95b8c4f
parent 13998 14c7526fed89
child 14095 877390020477
permissions -rw-r--r--
graphmod: use revsets internally Thanks for the idea and most of the implementation to Klaus Koch Backs revisions() and filerevs() with DAG walker which can iterate through arbitrary list of revisions instead of strict one by one iteration from start to stop. When a gap occurs in a revisions (i.e. in file log), the next topological parent within the revset is searched and the connection to it is printed in the ascii graph. File graph can draw sometimes more connections than previous version, because graph is produced according to the revset, not according to a file's filelog. In case the graph contains several branches where the left parent is null, the graphs for each are printed sequentially, not in parallel as it was a case earlier (see for example the graph for README in hg-dev).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
     1
# color.py color output for the status and qseries commands
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
#
5792
956e01c31914 color extension: change from GPL3 to 2
Kevin Christen <kevin.christen@gmail.com>
parents: 5787
diff changeset
     5
# This program is free software; you can redistribute it and/or modify it
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
     6
# under the terms of the GNU General Public License as published by the
5792
956e01c31914 color extension: change from GPL3 to 2
Kevin Christen <kevin.christen@gmail.com>
parents: 5787
diff changeset
     7
# Free Software Foundation; either version 2 of the License, or (at your
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
     8
# option) any later version.
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
     9
#
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
    10
# This program is distributed in the hope that it will be useful, but
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
    11
# WITHOUT ANY WARRANTY; without even the implied warranty of
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
    12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
    13
# Public License for more details.
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
    14
#
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
    15
# You should have received a copy of the GNU General Public License along
5792
956e01c31914 color extension: change from GPL3 to 2
Kevin Christen <kevin.christen@gmail.com>
parents: 5787
diff changeset
    16
# with this program; if not, write to the Free Software Foundation, Inc.,
956e01c31914 color extension: change from GPL3 to 2
Kevin Christen <kevin.christen@gmail.com>
parents: 5787
diff changeset
    17
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
    18
8894
868670dbc237 extensions: improve the consistency of synopses
Cédric Duval <cedricduval@free.fr>
parents: 8866
diff changeset
    19
'''colorize output from some commands
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
    20
13638
72040d98ff0a color: wrap lines in docstring
Martin Geisler <mg@aragost.com>
parents: 13635
diff changeset
    21
This extension modifies the status and resolve commands to add color
72040d98ff0a color: wrap lines in docstring
Martin Geisler <mg@aragost.com>
parents: 13635
diff changeset
    22
to their output to reflect file status, the qseries command to add
72040d98ff0a color: wrap lines in docstring
Martin Geisler <mg@aragost.com>
parents: 13635
diff changeset
    23
color to reflect patch status (applied, unapplied, missing), and to
72040d98ff0a color: wrap lines in docstring
Martin Geisler <mg@aragost.com>
parents: 13635
diff changeset
    24
diff-related commands to highlight additions, removals, diff headers,
72040d98ff0a color: wrap lines in docstring
Martin Geisler <mg@aragost.com>
parents: 13635
diff changeset
    25
and trailing whitespace.
7457
a70fb83cbb9e diff colorization: finish highlighting trailing whitespace
Georg Brandl <georg@python.org>
parents: 7456
diff changeset
    26
7988
0447939b4b97 color: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
    27
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
    28
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
    29
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
    30
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
    31
function (aka ANSI escape codes).
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
    32
12083
ebfc46929f3e help: refer to user configuration file more consistently
Brodie Rao <brodie@bitheap.org>
parents: 11732
diff changeset
    33
Default 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
    34
9206
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    35
  [color]
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    36
  status.modified = blue bold underline red_background
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    37
  status.added = green bold
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    38
  status.removed = red bold blue_background
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    39
  status.deleted = cyan bold underline
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    40
  status.unknown = magenta bold underline
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    41
  status.ignored = black bold
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
    42
9206
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    43
  # 'none' turns off all effects
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    44
  status.clean = none
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    45
  status.copied = none
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
    46
9206
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    47
  qseries.applied = blue bold underline
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    48
  qseries.unapplied = black bold
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    49
  qseries.missing = red bold
7456
79eb16db5e4a color: diff colorization
Brodie Rao <me+hg@dackz.net>
parents: 7455
diff changeset
    50
9206
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    51
  diff.diffline = bold
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    52
  diff.extended = cyan bold
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    53
  diff.file_a = red bold
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    54
  diff.file_b = green bold
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    55
  diff.hunk = magenta
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    56
  diff.deleted = red
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    57
  diff.inserted = green
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    58
  diff.changed = white
c1a1b49221e3 color: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9057
diff changeset
    59
  diff.trailingwhitespace = bold red_background
10046
0c23b0b3516b color: Add support for bookmarks
David Soria Parra <dsp@php.net>
parents: 10045
diff changeset
    60
10223
51421ab573de color: colorize output of hg resolve -l
Georg Brandl <georg@python.org>
parents: 10222
diff changeset
    61
  resolve.unresolved = red bold
51421ab573de color: colorize output of hg resolve -l
Georg Brandl <georg@python.org>
parents: 10222
diff changeset
    62
  resolve.resolved = green bold
51421ab573de color: colorize output of hg resolve -l
Georg Brandl <georg@python.org>
parents: 10222
diff changeset
    63
10046
0c23b0b3516b color: Add support for bookmarks
David Soria Parra <dsp@php.net>
parents: 10045
diff changeset
    64
  bookmarks.current = green
10870
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
    65
11969
52ec5c813723 color: enable branches support
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 11750
diff changeset
    66
  branches.active = none
52ec5c813723 color: enable branches support
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 11750
diff changeset
    67
  branches.closed = black bold
52ec5c813723 color: enable branches support
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 11750
diff changeset
    68
  branches.current = green
52ec5c813723 color: enable branches support
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 11750
diff changeset
    69
  branches.inactive = none
52ec5c813723 color: enable branches support
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 11750
diff changeset
    70
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
    71
The available effects in terminfo mode are 'blink', 'bold', 'dim',
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
    72
'inverse', 'invisible', 'italic', 'standout', and 'underline'; in
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
    73
ECMA-48 mode, the options are 'bold', 'inverse', 'italic', and
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
    74
'underline'.  How each is rendered depends on the terminal emulator.
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
    75
Some may not be available for a given terminal type, and will be
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
    76
silently ignored.
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
    77
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
    78
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
    79
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
    80
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
    81
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
    82
  color.brightblue = 12
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
    83
  color.pink = 207
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
    84
  color.orange = 202
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
    85
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
    86
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
    87
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
    88
'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
    89
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
    90
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
    91
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
    92
The color extension will try to detect whether to use terminfo, ANSI
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
    93
codes or Win32 console APIs, unless it is made explicit; e.g.::
10870
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
    94
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
    95
  [color]
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
    96
  mode = ansi
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
    97
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
    98
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
    99
disable color.
10870
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   100
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
   101
'''
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
   102
12062
c327bfa5e831 cleanup: remove unused imports
Brodie Rao <brodie@bitheap.org>
parents: 11969
diff changeset
   103
import os
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
   104
12089
70f4a0f4e9a3 color: accept usual boolean values as synonyms for always and never
Augie Fackler <durin42@gmail.com>
parents: 12084
diff changeset
   105
from mercurial import commands, dispatch, extensions, ui as uimod, util
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
   106
from mercurial.i18n import _
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
   107
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
   108
# 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
   109
_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
   110
            'blue': 34, 'magenta': 35, 'cyan': 36, 'white': 37, 'bold': 1,
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   111
            'italic': 3, 'underline': 4, 'inverse': 7,
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   112
            '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
   113
            '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
   114
            '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
   115
            '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
   116
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   117
def _terminfosetup(ui):
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   118
    '''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
   119
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   120
    global _terminfo_params
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   121
    # 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
   122
    if not _terminfo_params:
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   123
        return
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   124
    # 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
   125
    mode = ui.config('color', 'mode', 'auto')
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   126
    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
   127
        return
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   128
13998
14c7526fed89 color: code simplification
Patrick Mezard <pmezard@gmail.com>
parents: 13987
diff changeset
   129
    _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
   130
        for key, val in ui.configitems('color')
13998
14c7526fed89 color: code simplification
Patrick Mezard <pmezard@gmail.com>
parents: 13987
diff changeset
   131
        if key.startswith('color.'))
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   132
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   133
    try:
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   134
        curses.setupterm()
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   135
    except curses.error, e:
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   136
        _terminfo_params = {}
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   137
        return
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   138
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   139
    for key, (b, e) in _terminfo_params.items():
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   140
        if not b:
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   141
            continue
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   142
        if not curses.tigetstr(e):
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   143
            # 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
   144
            # noisy and use ui.debug().
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   145
            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
   146
            del _terminfo_params[key]
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   147
    if not curses.tigetstr('setaf') or not curses.tigetstr('setab'):
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   148
        ui.warn(_("no terminfo entry for setab/setaf: reverting to "
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   149
          "ECMA-48 color\n"))
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   150
        _terminfo_params = {}
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   151
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   152
try:
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   153
    import curses
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   154
    # Mapping from effect name to terminfo attribute name or color number.
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   155
    # This will also force-load the curses module.
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   156
    _terminfo_params = {'none': (True, 'sgr0'),
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   157
                        'standout': (True, 'smso'),
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   158
                        'underline': (True, 'smul'),
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   159
                        'reverse': (True, 'rev'),
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   160
                        'inverse': (True, 'rev'),
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   161
                        'blink': (True, 'blink'),
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   162
                        'dim': (True, 'dim'),
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   163
                        'bold': (True, 'bold'),
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   164
                        'invisible': (True, 'invis'),
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   165
                        'italic': (True, 'sitm'),
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   166
                        'black': (False, curses.COLOR_BLACK),
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   167
                        'red': (False, curses.COLOR_RED),
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   168
                        'green': (False, curses.COLOR_GREEN),
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   169
                        'yellow': (False, curses.COLOR_YELLOW),
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   170
                        'blue': (False, curses.COLOR_BLUE),
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   171
                        'magenta': (False, curses.COLOR_MAGENTA),
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   172
                        'cyan': (False, curses.COLOR_CYAN),
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   173
                        'white': (False, curses.COLOR_WHITE)}
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   174
except ImportError:
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   175
    _terminfo_params = False
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   176
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   177
_styles = {'grep.match': 'red bold',
13361
5b4252364ff9 bookmarks: move color style to color
Matt Mackall <mpm@selenic.com>
parents: 12807
diff changeset
   178
           'bookmarks.current': 'green',
11969
52ec5c813723 color: enable branches support
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 11750
diff changeset
   179
           'branches.active': 'none',
52ec5c813723 color: enable branches support
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 11750
diff changeset
   180
           'branches.closed': 'black bold',
52ec5c813723 color: enable branches support
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 11750
diff changeset
   181
           'branches.current': 'green',
52ec5c813723 color: enable branches support
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 11750
diff changeset
   182
           'branches.inactive': 'none',
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   183
           'diff.changed': 'white',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   184
           'diff.deleted': 'red',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   185
           'diff.diffline': 'bold',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   186
           'diff.extended': 'cyan bold',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   187
           '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
   188
           '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
   189
           'diff.hunk': 'magenta',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   190
           'diff.inserted': 'green',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   191
           'diff.trailingwhitespace': 'bold red_background',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   192
           'diffstat.deleted': 'red',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   193
           'diffstat.inserted': 'green',
13774
1ce0e80799c0 ui: label prompts, default to yellow prompts
Martin Geisler <mg@lazybytes.net>
parents: 13648
diff changeset
   194
           'ui.prompt': 'yellow',
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   195
           'log.changeset': 'yellow',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   196
           'resolve.resolved': 'green bold',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   197
           'resolve.unresolved': 'red bold',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   198
           'status.added': 'green bold',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   199
           'status.clean': 'none',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   200
           'status.copied': 'none',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   201
           '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
   202
           'status.ignored': 'black bold',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   203
           'status.modified': 'blue bold',
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   204
           'status.removed': 'red bold',
11310
ac873ecfc3c2 Backed out changeset: e1dde7363601
Steve Borho <steve@borho.org>
parents: 11302
diff changeset
   205
           'status.unknown': 'magenta bold underline'}
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   206
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
   207
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   208
def _effect_str(effect):
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   209
    '''Helper function for render_effects().'''
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   210
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   211
    bg = False
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   212
    if effect.endswith('_background'):
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   213
        bg = True
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   214
        effect = effect[:-11]
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   215
    attr, val = _terminfo_params[effect]
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   216
    if attr:
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   217
        return curses.tigetstr(val)
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   218
    elif bg:
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   219
        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
   220
    else:
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   221
        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
   222
8622
0a4f6e1b78dc color: use lists instead of tuples for effects
Martin Geisler <mg@lazybytes.net>
parents: 8278
diff changeset
   223
def render_effects(text, effects):
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
   224
    '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
   225
    if not text:
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   226
        return text
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   227
    if not _terminfo_params:
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   228
        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
   229
        start = '\033[' + ';'.join(start) + 'm'
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   230
        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
   231
    else:
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   232
        start = ''.join(_effect_str(effect)
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   233
                        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
   234
        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
   235
    return ''.join([start, text, stop])
5787
b7b22a2ade2e Add colored output to status and qseries commands
Kevin Christen <kevin.christen@gmail.com>
parents:
diff changeset
   236
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   237
def extstyles():
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   238
    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
   239
        _styles.update(getattr(ext, 'colortable', {}))
7456
79eb16db5e4a color: diff colorization
Brodie Rao <me+hg@dackz.net>
parents: 7455
diff changeset
   240
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   241
def configstyles(ui):
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   242
    for status, cfgeffects in ui.configitems('color'):
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   243
        if '.' not in status or status.startswith('color.'):
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   244
            continue
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   245
        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
   246
        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
   247
            good = []
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   248
            for e in cfgeffects:
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   249
                if not _terminfo_params and e in _effects:
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   250
                    good.append(e)
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   251
                elif e in _terminfo_params or e[:-11] in _terminfo_params:
8945
7b3d837ca60e color: don't blow up if configured with unknown color (just warn).
Greg Ward <greg-hg@gerg.ca>
parents: 8894
diff changeset
   252
                    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
   253
                else:
7b3d837ca60e color: don't blow up if configured with unknown color (just warn).
Greg Ward <greg-hg@gerg.ca>
parents: 8894
diff changeset
   254
                    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
   255
                              "(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
   256
                            % (e, status))
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   257
            _styles[status] = ' '.join(good)
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   258
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   259
class colorui(uimod.ui):
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   260
    def popbuffer(self, labeled=False):
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   261
        if labeled:
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   262
            return ''.join(self.label(a, label) for a, label
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   263
                           in self._buffers.pop())
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   264
        return ''.join(a for a, label in self._buffers.pop())
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   265
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   266
    _colormode = 'ansi'
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   267
    def write(self, *args, **opts):
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   268
        label = opts.get('label', '')
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   269
        if self._buffers:
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   270
            self._buffers[-1].extend([(str(a), label) for a in args])
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   271
        elif self._colormode == 'win32':
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   272
            for a in args:
11727
c34a1ab80550 color: pass write/write_err to win32print correctly (issue2312)
Brodie Rao <brodie@bitheap.org>
parents: 11555
diff changeset
   273
                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
   274
        else:
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   275
            return super(colorui, self).write(
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   276
                *[self.label(str(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
   277
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   278
    def write_err(self, *args, **opts):
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   279
        label = opts.get('label', '')
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   280
        if self._colormode == 'win32':
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   281
            for a in args:
11727
c34a1ab80550 color: pass write/write_err to win32print correctly (issue2312)
Brodie Rao <brodie@bitheap.org>
parents: 11555
diff changeset
   282
                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
   283
        else:
11732
386e56ecfb78 color: call correct superclass method in write_err
Brodie Rao <brodie@bitheap.org>
parents: 11727
diff changeset
   284
            return super(colorui, self).write_err(
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   285
                *[self.label(str(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
   286
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   287
    def label(self, msg, label):
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   288
        effects = []
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   289
        for l in label.split():
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   290
            s = _styles.get(l, '')
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   291
            if s:
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   292
                effects.append(s)
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   293
        effects = ''.join(effects)
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   294
        if effects:
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   295
            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
   296
                              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
   297
        return msg
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   298
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   299
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   300
def uisetup(ui):
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   301
    global _terminfo_params
10871
3f30190781a3 color: respect HGPLAIN
Steve Borho <steve@borho.org>
parents: 10870
diff changeset
   302
    if ui.plain():
3f30190781a3 color: respect HGPLAIN
Steve Borho <steve@borho.org>
parents: 10870
diff changeset
   303
        return
10870
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   304
    mode = ui.config('color', 'mode', 'auto')
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   305
    if mode == 'auto':
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   306
        if os.name == 'nt' and 'TERM' not in os.environ:
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   307
            # looks line a cmd.exe console, use win32 API or nothing
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   308
            mode = w32effects and 'win32' or 'none'
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   309
        else:
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   310
            _terminfosetup(ui)
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   311
            if not _terminfo_params:
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   312
                mode = 'ansi'
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   313
            else:
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   314
                mode = 'terminfo'
10870
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   315
    if mode == 'win32':
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   316
        if w32effects is None:
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   317
            # only warn if color.mode is explicitly set to win32
13641
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   318
            ui.warn(_('warning: failed to set color mode to %s\n') % mode)
10870
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   319
            return
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   320
        _effects.update(w32effects)
13987
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   321
    elif mode == 'ansi':
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   322
        _terminfo_params = {}
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   323
    elif mode == 'terminfo':
e0f07847f8de color: add support for terminfo-based attributes and color
Danek Duvall <duvall@comfychair.org>
parents: 13919
diff changeset
   324
        _terminfosetup(ui)
13998
14c7526fed89 color: code simplification
Patrick Mezard <pmezard@gmail.com>
parents: 13987
diff changeset
   325
    else:
10870
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   326
        return
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   327
    def colorcmd(orig, ui_, opts, cmd, cmdfunc):
12089
70f4a0f4e9a3 color: accept usual boolean values as synonyms for always and never
Augie Fackler <durin42@gmail.com>
parents: 12084
diff changeset
   328
        coloropt = opts['color']
70f4a0f4e9a3 color: accept usual boolean values as synonyms for always and never
Augie Fackler <durin42@gmail.com>
parents: 12084
diff changeset
   329
        auto = coloropt == 'auto'
70f4a0f4e9a3 color: accept usual boolean values as synonyms for always and never
Augie Fackler <durin42@gmail.com>
parents: 12084
diff changeset
   330
        always = util.parsebool(coloropt)
70f4a0f4e9a3 color: accept usual boolean values as synonyms for always and never
Augie Fackler <durin42@gmail.com>
parents: 12084
diff changeset
   331
        if (always or
70f4a0f4e9a3 color: accept usual boolean values as synonyms for always and never
Augie Fackler <durin42@gmail.com>
parents: 12084
diff changeset
   332
            (always is None and
70f4a0f4e9a3 color: accept usual boolean values as synonyms for always and never
Augie Fackler <durin42@gmail.com>
parents: 12084
diff changeset
   333
             (auto and (os.environ.get('TERM') != 'dumb' and ui_.formatted())))):
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   334
            colorui._colormode = mode
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   335
            colorui.__bases__ = (ui_.__class__,)
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   336
            ui_.__class__ = colorui
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   337
            extstyles()
11555
d8d0fc3988ca color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents: 11326
diff changeset
   338
            configstyles(ui_)
10826
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   339
        return orig(ui_, opts, cmd, cmdfunc)
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   340
    extensions.wrapfunction(dispatch, '_runcommand', colorcmd)
717c35d55fb3 color: colorize based on output labels instead of parsing output
Brodie Rao <brodie@bitheap.org>
parents: 10477
diff changeset
   341
12693
33f0682ba8b1 color: add global option in extsetup() instead of globally
Brodie Rao <brodie@bitheap.org>
parents: 12278
diff changeset
   342
def extsetup(ui):
33f0682ba8b1 color: add global option in extsetup() instead of globally
Brodie Rao <brodie@bitheap.org>
parents: 12278
diff changeset
   343
    commands.globalopts.append(
33f0682ba8b1 color: add global option in extsetup() instead of globally
Brodie Rao <brodie@bitheap.org>
parents: 12278
diff changeset
   344
        ('', 'color', 'auto',
12807
6bbf0139a36d color: give hint to translators about untranslated keywords
Martin Geisler <mg@lazybytes.net>
parents: 12693
diff changeset
   345
         # i18n: 'always', 'auto', and 'never' are keywords and should
6bbf0139a36d color: give hint to translators about untranslated keywords
Martin Geisler <mg@lazybytes.net>
parents: 12693
diff changeset
   346
         # not be translated
12693
33f0682ba8b1 color: add global option in extsetup() instead of globally
Brodie Rao <brodie@bitheap.org>
parents: 12278
diff changeset
   347
         _("when to colorize (boolean, always, auto, or never)"),
33f0682ba8b1 color: add global option in extsetup() instead of globally
Brodie Rao <brodie@bitheap.org>
parents: 12278
diff changeset
   348
         _('TYPE')))
10870
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   349
13641
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   350
if os.name != 'nt':
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   351
    w32effects = None
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   352
else:
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   353
    import re, ctypes
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   354
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   355
    _kernel32 = ctypes.windll.kernel32
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   356
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   357
    _WORD = ctypes.c_ushort
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   358
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   359
    _INVALID_HANDLE_VALUE = -1
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   360
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   361
    class _COORD(ctypes.Structure):
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   362
        _fields_ = [('X', ctypes.c_short),
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   363
                    ('Y', ctypes.c_short)]
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   364
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   365
    class _SMALL_RECT(ctypes.Structure):
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   366
        _fields_ = [('Left', ctypes.c_short),
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   367
                    ('Top', ctypes.c_short),
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   368
                    ('Right', ctypes.c_short),
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   369
                    ('Bottom', ctypes.c_short)]
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   370
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   371
    class _CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure):
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   372
        _fields_ = [('dwSize', _COORD),
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   373
                    ('dwCursorPosition', _COORD),
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   374
                    ('wAttributes', _WORD),
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   375
                    ('srWindow', _SMALL_RECT),
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   376
                    ('dwMaximumWindowSize', _COORD)]
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   377
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   378
    _STD_OUTPUT_HANDLE = 0xfffffff5L # (DWORD)-11
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   379
    _STD_ERROR_HANDLE = 0xfffffff4L  # (DWORD)-12
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   380
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   381
    _FOREGROUND_BLUE = 0x0001
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   382
    _FOREGROUND_GREEN = 0x0002
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   383
    _FOREGROUND_RED = 0x0004
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   384
    _FOREGROUND_INTENSITY = 0x0008
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   385
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   386
    _BACKGROUND_BLUE = 0x0010
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   387
    _BACKGROUND_GREEN = 0x0020
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   388
    _BACKGROUND_RED = 0x0040
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   389
    _BACKGROUND_INTENSITY = 0x0080
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   390
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   391
    _COMMON_LVB_REVERSE_VIDEO = 0x4000
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   392
    _COMMON_LVB_UNDERSCORE = 0x8000
10870
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   393
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   394
    # 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
   395
    w32effects = {
12277
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   396
        'none': -1,
10870
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   397
        'black': 0,
13641
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   398
        'red': _FOREGROUND_RED,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   399
        'green': _FOREGROUND_GREEN,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   400
        'yellow': _FOREGROUND_RED | _FOREGROUND_GREEN,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   401
        'blue': _FOREGROUND_BLUE,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   402
        'magenta': _FOREGROUND_BLUE | _FOREGROUND_RED,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   403
        'cyan': _FOREGROUND_BLUE | _FOREGROUND_GREEN,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   404
        'white': _FOREGROUND_RED | _FOREGROUND_GREEN | _FOREGROUND_BLUE,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   405
        'bold': _FOREGROUND_INTENSITY,
12278
c4c2ba553401 merge with stable
Sune Foldager <cryo@cyanite.org>
parents: 12089 12277
diff changeset
   406
        'black_background': 0x100,                  # unused value > 0x0f
13641
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   407
        'red_background': _BACKGROUND_RED,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   408
        'green_background': _BACKGROUND_GREEN,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   409
        'yellow_background': _BACKGROUND_RED | _BACKGROUND_GREEN,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   410
        'blue_background': _BACKGROUND_BLUE,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   411
        'purple_background': _BACKGROUND_BLUE | _BACKGROUND_RED,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   412
        'cyan_background': _BACKGROUND_BLUE | _BACKGROUND_GREEN,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   413
        'white_background': (_BACKGROUND_RED | _BACKGROUND_GREEN |
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   414
                             _BACKGROUND_BLUE),
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   415
        'bold_background': _BACKGROUND_INTENSITY,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   416
        'underline': _COMMON_LVB_UNDERSCORE,  # double-byte charsets only
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   417
        '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
   418
    }
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   419
13641
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   420
    passthrough = set([_FOREGROUND_INTENSITY,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   421
                       _BACKGROUND_INTENSITY,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   422
                       _COMMON_LVB_UNDERSCORE,
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   423
                       _COMMON_LVB_REVERSE_VIDEO])
12277
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   424
13641
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   425
    stdout = _kernel32.GetStdHandle(
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   426
                  _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
   427
    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
   428
        w32effects = None
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   429
    else:
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   430
        csbi = _CONSOLE_SCREEN_BUFFER_INFO()
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   431
        if not _kernel32.GetConsoleScreenBufferInfo(
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   432
                    stdout, ctypes.byref(csbi)):
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   433
            # stdout may not support GetConsoleScreenBufferInfo()
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   434
            # when called from subprocess or redirected
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   435
            w32effects = None
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   436
        else:
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   437
            origattr = csbi.wAttributes
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   438
            ansire = re.compile('\033\[([^m]*)m([^\033]*)(.*)',
2420cb1ea1d6 color: port to using ctypes (issue2687)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13635
diff changeset
   439
                                re.MULTILINE | re.DOTALL)
10870
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   440
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   441
    def win32print(text, orig, **opts):
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   442
        label = opts.get('label', '')
12277
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   443
        attr = origattr
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   444
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   445
        def mapcolor(val, attr):
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   446
            if val == -1:
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   447
                return origattr
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   448
            elif val in passthrough:
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   449
                return attr | val
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   450
            elif val > 0x0f:
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   451
                return (val & 0x70) | (attr & 0x8f)
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   452
            else:
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   453
                return (val & 0x07) | (attr & 0xf8)
10870
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   454
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   455
        # determine console attributes based on labels
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   456
        for l in label.split():
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   457
            style = _styles.get(l, '')
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   458
            for effect in style.split():
12277
a7d3147bd4b3 color: add win32 support for non-black background
Sune Foldager <cryo@cyanite.org>
parents: 12083
diff changeset
   459
                attr = mapcolor(w32effects[effect], attr)
10870
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   460
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   461
        # hack to ensure regexp finds data
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   462
        if not text.startswith('\033['):
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   463
            text = '\033[m' + text
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   464
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   465
        # Look for ANSI-like codes embedded in text
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   466
        m = re.match(ansire, text)
a4944b430417 color: add support for Windows consoles
Steve Borho <steve@borho.org>
parents: 10869
diff changeset
   467
13919
67f20625703f color: reset win32 console color in a finally block
Idan Kamara <idankk86@gmail.com>
parents: 13774
diff changeset
   468
        try:
67f20625703f color: reset win32 console color in a finally block
Idan Kamara <idankk86@gmail.com>
parents: 13774
diff changeset
   469
            while m:
67f20625703f color: reset win32 console color in a finally block
Idan Kamara <idankk86@gmail.com>
parents: 13774
diff changeset
   470
                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
   471
                    if sattr:
67f20625703f color: reset win32 console color in a finally block
Idan Kamara <idankk86@gmail.com>
parents: 13774
diff changeset
   472
                        attr = mapcolor(int(sattr), attr)
67f20625703f color: reset win32 console color in a finally block
Idan Kamara <idankk86@gmail.com>
parents: 13774
diff changeset
   473
                _kernel32.SetConsoleTextAttribute(stdout, attr)
67f20625703f color: reset win32 console color in a finally block
Idan Kamara <idankk86@gmail.com>
parents: 13774
diff changeset
   474
                orig(m.group(2), **opts)
67f20625703f color: reset win32 console color in a finally block
Idan Kamara <idankk86@gmail.com>
parents: 13774
diff changeset
   475
                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
   476
        finally:
67f20625703f color: reset win32 console color in a finally block
Idan Kamara <idankk86@gmail.com>
parents: 13774
diff changeset
   477
            # Explicity reset original attributes
67f20625703f color: reset win32 console color in a finally block
Idan Kamara <idankk86@gmail.com>
parents: 13774
diff changeset
   478
            _kernel32.SetConsoleTextAttribute(stdout, origattr)