annotate mercurial/color.py @ 39646:9c2c77c73f23

wireprotov2: define and implement "changesetdata" command This commit introduces the "changesetdata" wire protocol command. The role of the command is to expose data associated with changelog revisions, including the raw revision data itself. This command is the first piece of a new clone/pull strategy that is built on top of domain-specific commands for data retrieval. Instead of a monolithic "getbundle" command that transfers all of the things, we'll be introducing commands for fetching specific pieces of data. Since the changeset is the fundamental unit from which we derive pointers to other data (manifests, file nodes, etc), it makes sense to start reimplementing pull with this data. The command accepts as arguments a set of root and head revisions defining the changesets that should be fetched as well as an explicit list of nodes. By default, the command returns only the node values: the client must explicitly request additional fields be added to the response. Current supported fields are the list of parent nodes and the revision fulltext. My plan is to eventually add support for transferring other data associated with changesets, including phases, bookmarks, obsolescence markers, etc. Since the response format is CBOR, we'll be able to add this data into the response object relatively easily (it should be as simple as adding a key in a map). The documentation captures a number of TODO items. Some of these may require BC breaking changes. That's fine: wire protocol v2 is still highly experimental. Differential Revision: https://phab.mercurial-scm.org/D4481
author Gregory Szorc <gregory.szorc@gmail.com>
date Wed, 12 Sep 2018 10:01:16 -0700
parents ddc1da134772
children 3b421154d2ca
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
30656
1ec42bdd7874 color: move hgext.color._styles to mercurial.color.style
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
1 # utility for color output for Mercurial commands
1ec42bdd7874 color: move hgext.color._styles to mercurial.color.style
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
2 #
1ec42bdd7874 color: move hgext.color._styles to mercurial.color.style
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
3 # Copyright (C) 2007 Kevin Christen <kevin.christen@gmail.com> and other
1ec42bdd7874 color: move hgext.color._styles to mercurial.color.style
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
4 #
1ec42bdd7874 color: move hgext.color._styles to mercurial.color.style
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
5 # This software may be used and distributed according to the terms of the
1ec42bdd7874 color: move hgext.color._styles to mercurial.color.style
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
6 # GNU General Public License version 2 or any later version.
1ec42bdd7874 color: move hgext.color._styles to mercurial.color.style
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
7
1ec42bdd7874 color: move hgext.color._styles to mercurial.color.style
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
8 from __future__ import absolute_import
1ec42bdd7874 color: move hgext.color._styles to mercurial.color.style
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
9
31527
44c591f63458 templater: make pad() strip color codes before computing width (issue5416)
Yuya Nishihara <yuya@tcha.org>
parents: 31524
diff changeset
10 import re
44c591f63458 templater: make pad() strip color codes before computing width (issue5416)
Yuya Nishihara <yuya@tcha.org>
parents: 31524
diff changeset
11
30991
bb6385882cfa color: move configstyles into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30990
diff changeset
12 from .i18n import _
bb6385882cfa color: move configstyles into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30990
diff changeset
13
31118
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
14 from . import (
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
15 encoding,
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
16 pycompat,
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36532
diff changeset
17 )
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36532
diff changeset
18
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36532
diff changeset
19 from .utils import (
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36532
diff changeset
20 stringutil,
31118
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
21 )
31084
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
22
30988
0d2a58a04080 color: move '_terminfo_params' into the core 'color' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30987
diff changeset
23 try:
0d2a58a04080 color: move '_terminfo_params' into the core 'color' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30987
diff changeset
24 import curses
0d2a58a04080 color: move '_terminfo_params' into the core 'color' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30987
diff changeset
25 # Mapping from effect name to terminfo attribute name (or raw code) or
0d2a58a04080 color: move '_terminfo_params' into the core 'color' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30987
diff changeset
26 # color number. This will also force-load the curses module.
31130
268caf97c38f color: move the dict with terminfo parameters on the ui object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31129
diff changeset
27 _baseterminfoparams = {
31126
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
28 'none': (True, 'sgr0', ''),
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
29 'standout': (True, 'smso', ''),
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
30 'underline': (True, 'smul', ''),
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
31 'reverse': (True, 'rev', ''),
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
32 'inverse': (True, 'rev', ''),
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
33 'blink': (True, 'blink', ''),
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
34 'dim': (True, 'dim', ''),
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
35 'bold': (True, 'bold', ''),
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
36 'invisible': (True, 'invis', ''),
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
37 'italic': (True, 'sitm', ''),
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
38 'black': (False, curses.COLOR_BLACK, ''),
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
39 'red': (False, curses.COLOR_RED, ''),
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
40 'green': (False, curses.COLOR_GREEN, ''),
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
41 'yellow': (False, curses.COLOR_YELLOW, ''),
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
42 'blue': (False, curses.COLOR_BLUE, ''),
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
43 'magenta': (False, curses.COLOR_MAGENTA, ''),
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
44 'cyan': (False, curses.COLOR_CYAN, ''),
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
45 'white': (False, curses.COLOR_WHITE, ''),
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
46 }
30988
0d2a58a04080 color: move '_terminfo_params' into the core 'color' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30987
diff changeset
47 except ImportError:
0d2a58a04080 color: move '_terminfo_params' into the core 'color' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30987
diff changeset
48 curses = None
31130
268caf97c38f color: move the dict with terminfo parameters on the ui object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31129
diff changeset
49 _baseterminfoparams = {}
30988
0d2a58a04080 color: move '_terminfo_params' into the core 'color' module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30987
diff changeset
50
30987
20990991d384 color: move '_effect' mapping into core
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30657
diff changeset
51 # start and stop parameters for effects
31126
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
52 _effects = {
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
53 'none': 0,
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
54 'black': 30,
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
55 'red': 31,
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
56 'green': 32,
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
57 'yellow': 33,
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
58 'blue': 34,
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
59 'magenta': 35,
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
60 'cyan': 36,
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
61 'white': 37,
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
62 'bold': 1,
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
63 'italic': 3,
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
64 'underline': 4,
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
65 'inverse': 7,
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
66 'dim': 2,
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
67 'black_background': 40,
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
68 'red_background': 41,
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
69 'green_background': 42,
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
70 'yellow_background': 43,
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
71 'blue_background': 44,
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
72 'purple_background': 45,
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
73 'cyan_background': 46,
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
74 'white_background': 47,
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
75 }
30987
20990991d384 color: move '_effect' mapping into core
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30657
diff changeset
76
31133
6483e49204ee color: rename '_styles' to '_defaultstyles' for clarity
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31132
diff changeset
77 _defaultstyles = {
31126
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
78 'grep.match': 'red bold',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
79 'grep.linenumber': 'green',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
80 'grep.rev': 'green',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
81 'grep.change': 'green',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
82 'grep.sep': 'cyan',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
83 'grep.filename': 'magenta',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
84 'grep.user': 'magenta',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
85 'grep.date': 'magenta',
39128
ddc1da134772 addremove: add associated color for the new labels
Boris Feld <boris.feld@octobus.net>
parents: 38809
diff changeset
86 'addremove.added': 'green',
ddc1da134772 addremove: add associated color for the new labels
Boris Feld <boris.feld@octobus.net>
parents: 38809
diff changeset
87 'addremove.removed': 'red',
31126
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
88 'bookmarks.active': 'green',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
89 'branches.active': 'none',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
90 'branches.closed': 'black bold',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
91 'branches.current': 'green',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
92 'branches.inactive': 'none',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
93 'diff.changed': 'white',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
94 'diff.deleted': 'red',
37799
1770d8b3e554 diff: restore original color scheme for worddiff
Yuya Nishihara <yuya@tcha.org>
parents: 37732
diff changeset
95 'diff.deleted.changed': 'red bold underline',
1770d8b3e554 diff: restore original color scheme for worddiff
Yuya Nishihara <yuya@tcha.org>
parents: 37732
diff changeset
96 'diff.deleted.unchanged': 'red',
31126
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
97 'diff.diffline': 'bold',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
98 'diff.extended': 'cyan bold',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
99 'diff.file_a': 'red bold',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
100 'diff.file_b': 'green bold',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
101 'diff.hunk': 'magenta',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
102 'diff.inserted': 'green',
37799
1770d8b3e554 diff: restore original color scheme for worddiff
Yuya Nishihara <yuya@tcha.org>
parents: 37732
diff changeset
103 'diff.inserted.changed': 'green bold underline',
1770d8b3e554 diff: restore original color scheme for worddiff
Yuya Nishihara <yuya@tcha.org>
parents: 37732
diff changeset
104 'diff.inserted.unchanged': 'green',
31126
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
105 'diff.tab': '',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
106 'diff.trailingwhitespace': 'bold red_background',
34486
a57c938e7ac8 style: never use a space before a colon or comma
Alex Gaynor <agaynor@mozilla.com>
parents: 34146
diff changeset
107 'changeset.public': '',
a57c938e7ac8 style: never use a space before a colon or comma
Alex Gaynor <agaynor@mozilla.com>
parents: 34146
diff changeset
108 'changeset.draft': '',
a57c938e7ac8 style: never use a space before a colon or comma
Alex Gaynor <agaynor@mozilla.com>
parents: 34146
diff changeset
109 'changeset.secret': '',
31126
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
110 'diffstat.deleted': 'red',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
111 'diffstat.inserted': 'green',
35347
bd326f3e0e14 debugformat: update label depending on value difference
Boris Feld <boris.feld@octobus.net>
parents: 35286
diff changeset
112 'formatvariant.name.mismatchconfig': 'red',
bd326f3e0e14 debugformat: update label depending on value difference
Boris Feld <boris.feld@octobus.net>
parents: 35286
diff changeset
113 'formatvariant.name.mismatchdefault': 'yellow',
bd326f3e0e14 debugformat: update label depending on value difference
Boris Feld <boris.feld@octobus.net>
parents: 35286
diff changeset
114 'formatvariant.name.uptodate': 'green',
bd326f3e0e14 debugformat: update label depending on value difference
Boris Feld <boris.feld@octobus.net>
parents: 35286
diff changeset
115 'formatvariant.repo.mismatchconfig': 'red',
bd326f3e0e14 debugformat: update label depending on value difference
Boris Feld <boris.feld@octobus.net>
parents: 35286
diff changeset
116 'formatvariant.repo.mismatchdefault': 'yellow',
bd326f3e0e14 debugformat: update label depending on value difference
Boris Feld <boris.feld@octobus.net>
parents: 35286
diff changeset
117 'formatvariant.repo.uptodate': 'green',
bd326f3e0e14 debugformat: update label depending on value difference
Boris Feld <boris.feld@octobus.net>
parents: 35286
diff changeset
118 'formatvariant.config.special': 'yellow',
bd326f3e0e14 debugformat: update label depending on value difference
Boris Feld <boris.feld@octobus.net>
parents: 35286
diff changeset
119 'formatvariant.config.default': 'green',
bd326f3e0e14 debugformat: update label depending on value difference
Boris Feld <boris.feld@octobus.net>
parents: 35286
diff changeset
120 'formatvariant.default': '',
31126
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
121 'histedit.remaining': 'red bold',
38809
afc4ad706f9c dispatch: making all hg abortions be output with a specific label
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 37799
diff changeset
122 'ui.error': 'red',
31126
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
123 'ui.prompt': 'yellow',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
124 'log.changeset': 'yellow',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
125 'patchbomb.finalsummary': '',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
126 'patchbomb.from': 'magenta',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
127 'patchbomb.to': 'cyan',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
128 'patchbomb.subject': 'green',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
129 'patchbomb.diffstats': '',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
130 'rebase.rebased': 'blue',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
131 'rebase.remaining': 'red bold',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
132 'resolve.resolved': 'green bold',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
133 'resolve.unresolved': 'red bold',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
134 'shelve.age': 'cyan',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
135 'shelve.newest': 'green bold',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
136 'shelve.name': 'blue bold',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
137 'status.added': 'green bold',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
138 'status.clean': 'none',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
139 'status.copied': 'none',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
140 'status.deleted': 'cyan bold underline',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
141 'status.ignored': 'black bold',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
142 'status.modified': 'blue bold',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
143 'status.removed': 'red bold',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
144 'status.unknown': 'magenta bold underline',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
145 'tags.normal': 'green',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
146 'tags.local': 'black bold',
53230c5bb273 color: reinvent dictionary
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31123
diff changeset
147 }
30657
b2be4ccaff1d color: load 'colortable' from extension using an 'extraloader'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30656
diff changeset
148
b2be4ccaff1d color: load 'colortable' from extension using an 'extraloader'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30656
diff changeset
149 def loadcolortable(ui, extname, colortable):
31133
6483e49204ee color: rename '_styles' to '_defaultstyles' for clarity
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31132
diff changeset
150 _defaultstyles.update(colortable)
30989
ddc80d1777a6 color: move 'valideffect' function into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30988
diff changeset
151
33706
f9f28ee41cac color: remove warnings if term is not formatted (==dumb or !ui.formatted())
Kyle Lippincott <spectral@google.com>
parents: 33522
diff changeset
152 def _terminfosetup(ui, mode, formatted):
31117
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
153 '''Initialize terminfo data and the terminal if we're in terminfo mode.'''
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
154
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
155 # If we failed to load curses, we go ahead and return.
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
156 if curses is None:
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
157 return
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
158 # Otherwise, see what the config file says.
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
159 if mode not in ('auto', 'terminfo'):
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
160 return
31130
268caf97c38f color: move the dict with terminfo parameters on the ui object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31129
diff changeset
161 ui._terminfoparams.update(_baseterminfoparams)
31117
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
162
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
163 for key, val in ui.configitems('color'):
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
164 if key.startswith('color.'):
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
165 newval = (False, int(val), '')
31130
268caf97c38f color: move the dict with terminfo parameters on the ui object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31129
diff changeset
166 ui._terminfoparams[key[6:]] = newval
31117
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
167 elif key.startswith('terminfo.'):
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
168 newval = (True, '', val.replace('\\E', '\x1b'))
31130
268caf97c38f color: move the dict with terminfo parameters on the ui object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31129
diff changeset
169 ui._terminfoparams[key[9:]] = newval
31117
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
170 try:
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
171 curses.setupterm()
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
172 except curses.error as e:
31130
268caf97c38f color: move the dict with terminfo parameters on the ui object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31129
diff changeset
173 ui._terminfoparams.clear()
31117
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
174 return
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
175
37662
5340daa85c62 py3: iterate over a copy of dict while changing it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 37087
diff changeset
176 for key, (b, e, c) in ui._terminfoparams.copy().items():
31117
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
177 if not b:
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
178 continue
37664
483cafc3762a py3: make sure curses.tigetstr() first argument is a str
Pulkit Goyal <7895pulkit@gmail.com>
parents: 37662
diff changeset
179 if not c and not curses.tigetstr(pycompat.sysstr(e)):
31117
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
180 # Most terminals don't support dim, invis, etc, so don't be
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
181 # noisy and use ui.debug().
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
182 ui.debug("no terminfo entry for %s\n" % e)
31130
268caf97c38f color: move the dict with terminfo parameters on the ui object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31129
diff changeset
183 del ui._terminfoparams[key]
37664
483cafc3762a py3: make sure curses.tigetstr() first argument is a str
Pulkit Goyal <7895pulkit@gmail.com>
parents: 37662
diff changeset
184 if not curses.tigetstr(r'setaf') or not curses.tigetstr(r'setab'):
31117
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
185 # Only warn about missing terminfo entries if we explicitly asked for
33706
f9f28ee41cac color: remove warnings if term is not formatted (==dumb or !ui.formatted())
Kyle Lippincott <spectral@google.com>
parents: 33522
diff changeset
186 # terminfo mode and we're in a formatted terminal.
f9f28ee41cac color: remove warnings if term is not formatted (==dumb or !ui.formatted())
Kyle Lippincott <spectral@google.com>
parents: 33522
diff changeset
187 if mode == "terminfo" and formatted:
31117
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
188 ui.warn(_("no terminfo entry for setab/setaf: reverting to "
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
189 "ECMA-48 color\n"))
31130
268caf97c38f color: move the dict with terminfo parameters on the ui object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31129
diff changeset
190 ui._terminfoparams.clear()
31117
8903f67b9ca8 color: move 'terminfosetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31106
diff changeset
191
31127
7fec37746417 color: add a 'ui.color' option to control color behavior
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31126
diff changeset
192 def setup(ui):
31122
45be7590301d color: move triggering of the initialisation logic in core
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31120
diff changeset
193 """configure color on a ui
45be7590301d color: move triggering of the initialisation logic in core
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31120
diff changeset
194
31127
7fec37746417 color: add a 'ui.color' option to control color behavior
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31126
diff changeset
195 That function both set the colormode for the ui object and read
31122
45be7590301d color: move triggering of the initialisation logic in core
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31120
diff changeset
196 the configuration looking for custom colors and effect definitions."""
31127
7fec37746417 color: add a 'ui.color' option to control color behavior
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31126
diff changeset
197 mode = _modesetup(ui)
31123
a185b903bda3 color: have the 'ui' object carry the '_colormode' directly
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31122
diff changeset
198 ui._colormode = mode
31122
45be7590301d color: move triggering of the initialisation logic in core
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31120
diff changeset
199 if mode and mode != 'debug':
45be7590301d color: move triggering of the initialisation logic in core
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31120
diff changeset
200 configstyles(ui)
45be7590301d color: move triggering of the initialisation logic in core
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31120
diff changeset
201
31127
7fec37746417 color: add a 'ui.color' option to control color behavior
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31126
diff changeset
202 def _modesetup(ui):
35192
d4805a5e7e70 color: respect HGPLAINEXCEPT=color to allow colors while scripting (issue5749)
Augie Fackler <augie@google.com>
parents: 34645
diff changeset
203 if ui.plain('color'):
31120
c1997c5d1ae3 color: handle 'ui.plain()' directly in mode setup
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31118
diff changeset
204 return None
33522
62b29ca72d1a configitems: register the 'ui.color' config
Boris Feld <boris.feld@octobus.net>
parents: 33521
diff changeset
205 config = ui.config('ui', 'color')
31127
7fec37746417 color: add a 'ui.color' option to control color behavior
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31126
diff changeset
206 if config == 'debug':
31118
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
207 return 'debug'
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
208
31127
7fec37746417 color: add a 'ui.color' option to control color behavior
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31126
diff changeset
209 auto = (config == 'auto')
32102
9a85ea1daf49 color: turn 'ui.color' into a boolean (auto or off)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32027
diff changeset
210 always = False
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36532
diff changeset
211 if not auto and stringutil.parsebool(config):
32103
9a98023ac8db color: special case 'always' in 'ui.color'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32102
diff changeset
212 # We want the config to behave like a boolean, "on" is actually auto,
9a98023ac8db color: special case 'always' in 'ui.color'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32102
diff changeset
213 # but "always" value is treated as a special case to reduce confusion.
9a98023ac8db color: special case 'always' in 'ui.color'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32102
diff changeset
214 if ui.configsource('ui', 'color') == '--color' or config == 'always':
32102
9a85ea1daf49 color: turn 'ui.color' into a boolean (auto or off)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32027
diff changeset
215 always = True
9a85ea1daf49 color: turn 'ui.color' into a boolean (auto or off)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32027
diff changeset
216 else:
9a85ea1daf49 color: turn 'ui.color' into a boolean (auto or off)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32027
diff changeset
217 auto = True
9a85ea1daf49 color: turn 'ui.color' into a boolean (auto or off)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32027
diff changeset
218
31118
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
219 if not always and not auto:
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
220 return None
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
221
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
222 formatted = (always or (encoding.environ.get('TERM') != 'dumb'
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
223 and ui.formatted()))
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
224
33181
95c57596b380 configitems: register the 'color.mode' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32685
diff changeset
225 mode = ui.config('color', 'mode')
31118
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
226
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
227 # If pager is active, color.pagermode overrides color.mode.
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
228 if getattr(ui, 'pageractive', False):
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
229 mode = ui.config('color', 'pagermode', mode)
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
230
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
231 realmode = mode
34645
75979c8d4572 codemod: use pycompat.iswindows
Jun Wu <quark@fb.com>
parents: 34486
diff changeset
232 if pycompat.iswindows:
32685
98c2b44bdf9a color: enable ANSI support on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 32331
diff changeset
233 from . import win32
98c2b44bdf9a color: enable ANSI support on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 32331
diff changeset
234
98c2b44bdf9a color: enable ANSI support on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 32331
diff changeset
235 term = encoding.environ.get('TERM')
98c2b44bdf9a color: enable ANSI support on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 32331
diff changeset
236 # TERM won't be defined in a vanilla cmd.exe environment.
31118
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
237
32685
98c2b44bdf9a color: enable ANSI support on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 32331
diff changeset
238 # UNIX-like environments on Windows such as Cygwin and MSYS will
98c2b44bdf9a color: enable ANSI support on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 32331
diff changeset
239 # set TERM. They appear to make a best effort attempt at setting it
98c2b44bdf9a color: enable ANSI support on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 32331
diff changeset
240 # to something appropriate. However, not all environments with TERM
98c2b44bdf9a color: enable ANSI support on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 32331
diff changeset
241 # defined support ANSI.
98c2b44bdf9a color: enable ANSI support on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 32331
diff changeset
242 ansienviron = term and 'xterm' in term
98c2b44bdf9a color: enable ANSI support on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 32331
diff changeset
243
98c2b44bdf9a color: enable ANSI support on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 32331
diff changeset
244 if mode == 'auto':
98c2b44bdf9a color: enable ANSI support on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 32331
diff changeset
245 # Since "ansi" could result in terminal gibberish, we error on the
98c2b44bdf9a color: enable ANSI support on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 32331
diff changeset
246 # side of selecting "win32". However, if w32effects is not defined,
98c2b44bdf9a color: enable ANSI support on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 32331
diff changeset
247 # we almost certainly don't support "win32", so don't even try.
98c2b44bdf9a color: enable ANSI support on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 32331
diff changeset
248 # w32ffects is not populated when stdout is redirected, so checking
98c2b44bdf9a color: enable ANSI support on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 32331
diff changeset
249 # it first avoids win32 calls in a state known to error out.
98c2b44bdf9a color: enable ANSI support on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 32331
diff changeset
250 if ansienviron or not w32effects or win32.enablevtmode():
31118
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
251 realmode = 'ansi'
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
252 else:
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
253 realmode = 'win32'
32685
98c2b44bdf9a color: enable ANSI support on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 32331
diff changeset
254 # An empty w32effects is a clue that stdout is redirected, and thus
98c2b44bdf9a color: enable ANSI support on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 32331
diff changeset
255 # cannot enable VT mode.
98c2b44bdf9a color: enable ANSI support on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 32331
diff changeset
256 elif mode == 'ansi' and w32effects and not ansienviron:
98c2b44bdf9a color: enable ANSI support on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 32331
diff changeset
257 win32.enablevtmode()
98c2b44bdf9a color: enable ANSI support on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 32331
diff changeset
258 elif mode == 'auto':
98c2b44bdf9a color: enable ANSI support on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 32331
diff changeset
259 realmode = 'ansi'
31118
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
260
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
261 def modewarn():
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
262 # only warn if color.mode was explicitly set and we're in
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
263 # a formatted terminal
33706
f9f28ee41cac color: remove warnings if term is not formatted (==dumb or !ui.formatted())
Kyle Lippincott <spectral@google.com>
parents: 33522
diff changeset
264 if mode == realmode and formatted:
31118
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
265 ui.warn(_('warning: failed to set color mode to %s\n') % mode)
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
266
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
267 if realmode == 'win32':
31130
268caf97c38f color: move the dict with terminfo parameters on the ui object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31129
diff changeset
268 ui._terminfoparams.clear()
31118
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
269 if not w32effects:
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
270 modewarn()
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
271 return None
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
272 elif realmode == 'ansi':
31130
268caf97c38f color: move the dict with terminfo parameters on the ui object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31129
diff changeset
273 ui._terminfoparams.clear()
31118
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
274 elif realmode == 'terminfo':
33706
f9f28ee41cac color: remove warnings if term is not formatted (==dumb or !ui.formatted())
Kyle Lippincott <spectral@google.com>
parents: 33522
diff changeset
275 _terminfosetup(ui, mode, formatted)
31130
268caf97c38f color: move the dict with terminfo parameters on the ui object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31129
diff changeset
276 if not ui._terminfoparams:
31118
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
277 ## FIXME Shouldn't we return None in this case too?
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
278 modewarn()
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
279 realmode = 'ansi'
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
280 else:
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
281 return None
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
282
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
283 if always or (auto and formatted):
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
284 return realmode
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
285 return None
9021a94a7dbf color: move 'modesetup' into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31117
diff changeset
286
30991
bb6385882cfa color: move configstyles into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30990
diff changeset
287 def configstyles(ui):
31133
6483e49204ee color: rename '_styles' to '_defaultstyles' for clarity
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31132
diff changeset
288 ui._styles.update(_defaultstyles)
30991
bb6385882cfa color: move configstyles into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30990
diff changeset
289 for status, cfgeffects in ui.configitems('color'):
bb6385882cfa color: move configstyles into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30990
diff changeset
290 if '.' not in status or status.startswith(('color.', 'terminfo.')):
bb6385882cfa color: move configstyles into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30990
diff changeset
291 continue
bb6385882cfa color: move configstyles into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30990
diff changeset
292 cfgeffects = ui.configlist('color', status)
bb6385882cfa color: move configstyles into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30990
diff changeset
293 if cfgeffects:
bb6385882cfa color: move configstyles into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30990
diff changeset
294 good = []
bb6385882cfa color: move configstyles into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30990
diff changeset
295 for e in cfgeffects:
31129
7f056fdbe37e color: add ui to effect rendering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31127
diff changeset
296 if valideffect(ui, e):
30991
bb6385882cfa color: move configstyles into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30990
diff changeset
297 good.append(e)
bb6385882cfa color: move configstyles into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30990
diff changeset
298 else:
bb6385882cfa color: move configstyles into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30990
diff changeset
299 ui.warn(_("ignoring unknown color/effect %r "
bb6385882cfa color: move configstyles into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30990
diff changeset
300 "(configured in color.%s)\n")
bb6385882cfa color: move configstyles into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30990
diff changeset
301 % (e, status))
31132
f5131d4f512a color: move 'styles' definition on the 'ui' object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31131
diff changeset
302 ui._styles[status] = ' '.join(good)
30991
bb6385882cfa color: move configstyles into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30990
diff changeset
303
31694
57a22f699179 color: stop mutating the default effects map
Matt Harbison <matt_harbison@yahoo.com>
parents: 31527
diff changeset
304 def _activeeffects(ui):
57a22f699179 color: stop mutating the default effects map
Matt Harbison <matt_harbison@yahoo.com>
parents: 31527
diff changeset
305 '''Return the effects map for the color mode set on the ui.'''
57a22f699179 color: stop mutating the default effects map
Matt Harbison <matt_harbison@yahoo.com>
parents: 31527
diff changeset
306 if ui._colormode == 'win32':
57a22f699179 color: stop mutating the default effects map
Matt Harbison <matt_harbison@yahoo.com>
parents: 31527
diff changeset
307 return w32effects
57a22f699179 color: stop mutating the default effects map
Matt Harbison <matt_harbison@yahoo.com>
parents: 31527
diff changeset
308 elif ui._colormode is not None:
57a22f699179 color: stop mutating the default effects map
Matt Harbison <matt_harbison@yahoo.com>
parents: 31527
diff changeset
309 return _effects
57a22f699179 color: stop mutating the default effects map
Matt Harbison <matt_harbison@yahoo.com>
parents: 31527
diff changeset
310 return {}
57a22f699179 color: stop mutating the default effects map
Matt Harbison <matt_harbison@yahoo.com>
parents: 31527
diff changeset
311
31129
7f056fdbe37e color: add ui to effect rendering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31127
diff changeset
312 def valideffect(ui, effect):
30989
ddc80d1777a6 color: move 'valideffect' function into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30988
diff changeset
313 'Determine if the effect is valid or not.'
31694
57a22f699179 color: stop mutating the default effects map
Matt Harbison <matt_harbison@yahoo.com>
parents: 31527
diff changeset
314 return ((not ui._terminfoparams and effect in _activeeffects(ui))
31130
268caf97c38f color: move the dict with terminfo parameters on the ui object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31129
diff changeset
315 or (effect in ui._terminfoparams
268caf97c38f color: move the dict with terminfo parameters on the ui object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31129
diff changeset
316 or effect[:-11] in ui._terminfoparams))
30992
a3c7e42c7a1f color: move '_effect_str' function into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30991
diff changeset
317
31129
7f056fdbe37e color: add ui to effect rendering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31127
diff changeset
318 def _effect_str(ui, effect):
30992
a3c7e42c7a1f color: move '_effect_str' function into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30991
diff changeset
319 '''Helper function for render_effects().'''
a3c7e42c7a1f color: move '_effect_str' function into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30991
diff changeset
320
a3c7e42c7a1f color: move '_effect_str' function into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30991
diff changeset
321 bg = False
a3c7e42c7a1f color: move '_effect_str' function into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30991
diff changeset
322 if effect.endswith('_background'):
a3c7e42c7a1f color: move '_effect_str' function into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30991
diff changeset
323 bg = True
a3c7e42c7a1f color: move '_effect_str' function into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30991
diff changeset
324 effect = effect[:-11]
a3c7e42c7a1f color: move '_effect_str' function into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30991
diff changeset
325 try:
31130
268caf97c38f color: move the dict with terminfo parameters on the ui object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31129
diff changeset
326 attr, val, termcode = ui._terminfoparams[effect]
30992
a3c7e42c7a1f color: move '_effect_str' function into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30991
diff changeset
327 except KeyError:
a3c7e42c7a1f color: move '_effect_str' function into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30991
diff changeset
328 return ''
a3c7e42c7a1f color: move '_effect_str' function into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30991
diff changeset
329 if attr:
a3c7e42c7a1f color: move '_effect_str' function into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30991
diff changeset
330 if termcode:
a3c7e42c7a1f color: move '_effect_str' function into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30991
diff changeset
331 return termcode
a3c7e42c7a1f color: move '_effect_str' function into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30991
diff changeset
332 else:
37664
483cafc3762a py3: make sure curses.tigetstr() first argument is a str
Pulkit Goyal <7895pulkit@gmail.com>
parents: 37662
diff changeset
333 return curses.tigetstr(pycompat.sysstr(val))
30992
a3c7e42c7a1f color: move '_effect_str' function into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30991
diff changeset
334 elif bg:
37664
483cafc3762a py3: make sure curses.tigetstr() first argument is a str
Pulkit Goyal <7895pulkit@gmail.com>
parents: 37662
diff changeset
335 return curses.tparm(curses.tigetstr(r'setab'), val)
30992
a3c7e42c7a1f color: move '_effect_str' function into the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30991
diff changeset
336 else:
37664
483cafc3762a py3: make sure curses.tigetstr() first argument is a str
Pulkit Goyal <7895pulkit@gmail.com>
parents: 37662
diff changeset
337 return curses.tparm(curses.tigetstr(r'setaf'), val)
30993
e5363cb96233 color: move the '_render_effects' function to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30992
diff changeset
338
31524
43d6ef658874 color: insert color code after every "\e[0m" (issue5413)
Yuya Nishihara <yuya@tcha.org>
parents: 31506
diff changeset
339 def _mergeeffects(text, start, stop):
43d6ef658874 color: insert color code after every "\e[0m" (issue5413)
Yuya Nishihara <yuya@tcha.org>
parents: 31506
diff changeset
340 """Insert start sequence at every occurrence of stop sequence
43d6ef658874 color: insert color code after every "\e[0m" (issue5413)
Yuya Nishihara <yuya@tcha.org>
parents: 31506
diff changeset
341
34146
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 33706
diff changeset
342 >>> s = _mergeeffects(b'cyan', b'[C]', b'|')
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 33706
diff changeset
343 >>> s = _mergeeffects(s + b'yellow', b'[Y]', b'|')
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 33706
diff changeset
344 >>> s = _mergeeffects(b'ma' + s + b'genta', b'[M]', b'|')
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 33706
diff changeset
345 >>> s = _mergeeffects(b'red' + s, b'[R]', b'|')
31524
43d6ef658874 color: insert color code after every "\e[0m" (issue5413)
Yuya Nishihara <yuya@tcha.org>
parents: 31506
diff changeset
346 >>> s
43d6ef658874 color: insert color code after every "\e[0m" (issue5413)
Yuya Nishihara <yuya@tcha.org>
parents: 31506
diff changeset
347 '[R]red[M]ma[Y][C]cyan|[R][M][Y]yellow|[R][M]genta|'
43d6ef658874 color: insert color code after every "\e[0m" (issue5413)
Yuya Nishihara <yuya@tcha.org>
parents: 31506
diff changeset
348 """
43d6ef658874 color: insert color code after every "\e[0m" (issue5413)
Yuya Nishihara <yuya@tcha.org>
parents: 31506
diff changeset
349 parts = []
43d6ef658874 color: insert color code after every "\e[0m" (issue5413)
Yuya Nishihara <yuya@tcha.org>
parents: 31506
diff changeset
350 for t in text.split(stop):
43d6ef658874 color: insert color code after every "\e[0m" (issue5413)
Yuya Nishihara <yuya@tcha.org>
parents: 31506
diff changeset
351 if not t:
43d6ef658874 color: insert color code after every "\e[0m" (issue5413)
Yuya Nishihara <yuya@tcha.org>
parents: 31506
diff changeset
352 continue
43d6ef658874 color: insert color code after every "\e[0m" (issue5413)
Yuya Nishihara <yuya@tcha.org>
parents: 31506
diff changeset
353 parts.extend([start, t, stop])
43d6ef658874 color: insert color code after every "\e[0m" (issue5413)
Yuya Nishihara <yuya@tcha.org>
parents: 31506
diff changeset
354 return ''.join(parts)
43d6ef658874 color: insert color code after every "\e[0m" (issue5413)
Yuya Nishihara <yuya@tcha.org>
parents: 31506
diff changeset
355
31129
7f056fdbe37e color: add ui to effect rendering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31127
diff changeset
356 def _render_effects(ui, text, effects):
30993
e5363cb96233 color: move the '_render_effects' function to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30992
diff changeset
357 'Wrap text in commands to turn on each effect.'
e5363cb96233 color: move the '_render_effects' function to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30992
diff changeset
358 if not text:
e5363cb96233 color: move the '_render_effects' function to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30992
diff changeset
359 return text
31130
268caf97c38f color: move the dict with terminfo parameters on the ui object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31129
diff changeset
360 if ui._terminfoparams:
31129
7f056fdbe37e color: add ui to effect rendering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31127
diff changeset
361 start = ''.join(_effect_str(ui, effect)
31088
350d737e059d color: minor reversal of two conditional clause for clarity
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31084
diff changeset
362 for effect in ['none'] + effects.split())
31129
7f056fdbe37e color: add ui to effect rendering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31127
diff changeset
363 stop = _effect_str(ui, 'none')
31088
350d737e059d color: minor reversal of two conditional clause for clarity
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31084
diff changeset
364 else:
31694
57a22f699179 color: stop mutating the default effects map
Matt Harbison <matt_harbison@yahoo.com>
parents: 31527
diff changeset
365 activeeffects = _activeeffects(ui)
31721
439a387ca6f1 color: replace str() with pycompat.bytestr()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31694
diff changeset
366 start = [pycompat.bytestr(activeeffects[e])
439a387ca6f1 color: replace str() with pycompat.bytestr()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31694
diff changeset
367 for e in ['none'] + effects.split()]
30993
e5363cb96233 color: move the '_render_effects' function to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30992
diff changeset
368 start = '\033[' + ';'.join(start) + 'm'
31721
439a387ca6f1 color: replace str() with pycompat.bytestr()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31694
diff changeset
369 stop = '\033[' + pycompat.bytestr(activeeffects['none']) + 'm'
31524
43d6ef658874 color: insert color code after every "\e[0m" (issue5413)
Yuya Nishihara <yuya@tcha.org>
parents: 31506
diff changeset
370 return _mergeeffects(text, start, stop)
31084
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
371
31527
44c591f63458 templater: make pad() strip color codes before computing width (issue5416)
Yuya Nishihara <yuya@tcha.org>
parents: 31524
diff changeset
372 _ansieffectre = re.compile(br'\x1b\[[0-9;]*m')
44c591f63458 templater: make pad() strip color codes before computing width (issue5416)
Yuya Nishihara <yuya@tcha.org>
parents: 31524
diff changeset
373
44c591f63458 templater: make pad() strip color codes before computing width (issue5416)
Yuya Nishihara <yuya@tcha.org>
parents: 31524
diff changeset
374 def stripeffects(text):
44c591f63458 templater: make pad() strip color codes before computing width (issue5416)
Yuya Nishihara <yuya@tcha.org>
parents: 31524
diff changeset
375 """Strip ANSI control codes which could be inserted by colorlabel()"""
44c591f63458 templater: make pad() strip color codes before computing width (issue5416)
Yuya Nishihara <yuya@tcha.org>
parents: 31524
diff changeset
376 return _ansieffectre.sub('', text)
44c591f63458 templater: make pad() strip color codes before computing width (issue5416)
Yuya Nishihara <yuya@tcha.org>
parents: 31524
diff changeset
377
31103
e6082078c853 color: move the 'colorlabel' function in the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31088
diff changeset
378 def colorlabel(ui, msg, label):
e6082078c853 color: move the 'colorlabel' function in the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31088
diff changeset
379 """add color control code according to the mode"""
e6082078c853 color: move the 'colorlabel' function in the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31088
diff changeset
380 if ui._colormode == 'debug':
e6082078c853 color: move the 'colorlabel' function in the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31088
diff changeset
381 if label and msg:
36532
faaabe0dc4d1 py3: use bytes.endswith('\n') to strip off '\n' from debug color output
Yuya Nishihara <yuya@tcha.org>
parents: 35360
diff changeset
382 if msg.endswith('\n'):
31103
e6082078c853 color: move the 'colorlabel' function in the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31088
diff changeset
383 msg = "[%s|%s]\n" % (label, msg[:-1])
e6082078c853 color: move the 'colorlabel' function in the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31088
diff changeset
384 else:
e6082078c853 color: move the 'colorlabel' function in the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31088
diff changeset
385 msg = "[%s|%s]" % (label, msg)
e6082078c853 color: move the 'colorlabel' function in the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31088
diff changeset
386 elif ui._colormode is not None:
e6082078c853 color: move the 'colorlabel' function in the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31088
diff changeset
387 effects = []
e6082078c853 color: move the 'colorlabel' function in the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31088
diff changeset
388 for l in label.split():
31132
f5131d4f512a color: move 'styles' definition on the 'ui' object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31131
diff changeset
389 s = ui._styles.get(l, '')
31103
e6082078c853 color: move the 'colorlabel' function in the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31088
diff changeset
390 if s:
e6082078c853 color: move the 'colorlabel' function in the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31088
diff changeset
391 effects.append(s)
31129
7f056fdbe37e color: add ui to effect rendering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31127
diff changeset
392 elif valideffect(ui, l):
31103
e6082078c853 color: move the 'colorlabel' function in the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31088
diff changeset
393 effects.append(l)
e6082078c853 color: move the 'colorlabel' function in the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31088
diff changeset
394 effects = ' '.join(effects)
e6082078c853 color: move the 'colorlabel' function in the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31088
diff changeset
395 if effects:
31129
7f056fdbe37e color: add ui to effect rendering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31127
diff changeset
396 msg = '\n'.join([_render_effects(ui, line, effects)
31103
e6082078c853 color: move the 'colorlabel' function in the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31088
diff changeset
397 for line in msg.split('\n')])
e6082078c853 color: move the 'colorlabel' function in the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31088
diff changeset
398 return msg
e6082078c853 color: move the 'colorlabel' function in the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31088
diff changeset
399
31084
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
400 w32effects = None
34645
75979c8d4572 codemod: use pycompat.iswindows
Jun Wu <quark@fb.com>
parents: 34486
diff changeset
401 if pycompat.iswindows:
31084
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
402 import ctypes
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
403
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
404 _kernel32 = ctypes.windll.kernel32
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
405
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
406 _WORD = ctypes.c_ushort
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
407
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
408 _INVALID_HANDLE_VALUE = -1
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
409
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
410 class _COORD(ctypes.Structure):
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
411 _fields_ = [('X', ctypes.c_short),
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
412 ('Y', ctypes.c_short)]
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
413
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
414 class _SMALL_RECT(ctypes.Structure):
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
415 _fields_ = [('Left', ctypes.c_short),
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
416 ('Top', ctypes.c_short),
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
417 ('Right', ctypes.c_short),
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
418 ('Bottom', ctypes.c_short)]
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
419
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
420 class _CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure):
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
421 _fields_ = [('dwSize', _COORD),
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
422 ('dwCursorPosition', _COORD),
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
423 ('wAttributes', _WORD),
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
424 ('srWindow', _SMALL_RECT),
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
425 ('dwMaximumWindowSize', _COORD)]
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
426
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
427 _STD_OUTPUT_HANDLE = 0xfffffff5 # (DWORD)-11
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
428 _STD_ERROR_HANDLE = 0xfffffff4 # (DWORD)-12
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
429
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
430 _FOREGROUND_BLUE = 0x0001
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
431 _FOREGROUND_GREEN = 0x0002
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
432 _FOREGROUND_RED = 0x0004
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
433 _FOREGROUND_INTENSITY = 0x0008
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
434
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
435 _BACKGROUND_BLUE = 0x0010
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
436 _BACKGROUND_GREEN = 0x0020
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
437 _BACKGROUND_RED = 0x0040
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
438 _BACKGROUND_INTENSITY = 0x0080
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
439
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
440 _COMMON_LVB_REVERSE_VIDEO = 0x4000
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
441 _COMMON_LVB_UNDERSCORE = 0x8000
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
442
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
443 # http://msdn.microsoft.com/en-us/library/ms682088%28VS.85%29.aspx
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
444 w32effects = {
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
445 'none': -1,
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
446 'black': 0,
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
447 'red': _FOREGROUND_RED,
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
448 'green': _FOREGROUND_GREEN,
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
449 'yellow': _FOREGROUND_RED | _FOREGROUND_GREEN,
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
450 'blue': _FOREGROUND_BLUE,
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
451 'magenta': _FOREGROUND_BLUE | _FOREGROUND_RED,
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
452 'cyan': _FOREGROUND_BLUE | _FOREGROUND_GREEN,
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
453 'white': _FOREGROUND_RED | _FOREGROUND_GREEN | _FOREGROUND_BLUE,
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
454 'bold': _FOREGROUND_INTENSITY,
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
455 'black_background': 0x100, # unused value > 0x0f
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
456 'red_background': _BACKGROUND_RED,
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
457 'green_background': _BACKGROUND_GREEN,
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
458 'yellow_background': _BACKGROUND_RED | _BACKGROUND_GREEN,
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
459 'blue_background': _BACKGROUND_BLUE,
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
460 'purple_background': _BACKGROUND_BLUE | _BACKGROUND_RED,
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
461 'cyan_background': _BACKGROUND_BLUE | _BACKGROUND_GREEN,
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
462 'white_background': (_BACKGROUND_RED | _BACKGROUND_GREEN |
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
463 _BACKGROUND_BLUE),
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
464 'bold_background': _BACKGROUND_INTENSITY,
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
465 'underline': _COMMON_LVB_UNDERSCORE, # double-byte charsets only
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
466 'inverse': _COMMON_LVB_REVERSE_VIDEO, # double-byte charsets only
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
467 }
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
468
32331
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32103
diff changeset
469 passthrough = {_FOREGROUND_INTENSITY,
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32103
diff changeset
470 _BACKGROUND_INTENSITY,
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32103
diff changeset
471 _COMMON_LVB_UNDERSCORE,
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32103
diff changeset
472 _COMMON_LVB_REVERSE_VIDEO}
31084
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
473
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
474 stdout = _kernel32.GetStdHandle(
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
475 _STD_OUTPUT_HANDLE) # don't close the handle returned
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
476 if stdout is None or stdout == _INVALID_HANDLE_VALUE:
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
477 w32effects = None
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
478 else:
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
479 csbi = _CONSOLE_SCREEN_BUFFER_INFO()
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
480 if not _kernel32.GetConsoleScreenBufferInfo(
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
481 stdout, ctypes.byref(csbi)):
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
482 # stdout may not support GetConsoleScreenBufferInfo()
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
483 # when called from subprocess or redirected
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
484 w32effects = None
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
485 else:
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
486 origattr = csbi.wAttributes
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
487 ansire = re.compile('\033\[([^m]*)m([^\033]*)(.*)',
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
488 re.MULTILINE | re.DOTALL)
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
489
31131
1613c55ad3d6 color: pass 'ui' to 'win32print'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31130
diff changeset
490 def win32print(ui, writefunc, *msgs, **opts):
31106
a2ee25ff75e5 color: add multiple messages input support to 'win32print'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31105
diff changeset
491 for text in msgs:
31131
1613c55ad3d6 color: pass 'ui' to 'win32print'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31130
diff changeset
492 _win32print(ui, text, writefunc, **opts)
31106
a2ee25ff75e5 color: add multiple messages input support to 'win32print'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31105
diff changeset
493
31131
1613c55ad3d6 color: pass 'ui' to 'win32print'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31130
diff changeset
494 def _win32print(ui, text, writefunc, **opts):
35360
a4478f74ad56 py3: handle keyword arguments correctly in color.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
495 label = opts.get(r'label', '')
31084
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
496 attr = origattr
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
497
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
498 def mapcolor(val, attr):
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
499 if val == -1:
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
500 return origattr
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
501 elif val in passthrough:
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
502 return attr | val
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
503 elif val > 0x0f:
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
504 return (val & 0x70) | (attr & 0x8f)
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
505 else:
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
506 return (val & 0x07) | (attr & 0xf8)
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
507
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
508 # determine console attributes based on labels
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
509 for l in label.split():
31132
f5131d4f512a color: move 'styles' definition on the 'ui' object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31131
diff changeset
510 style = ui._styles.get(l, '')
31084
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
511 for effect in style.split():
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
512 try:
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
513 attr = mapcolor(w32effects[effect], attr)
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
514 except KeyError:
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
515 # w32effects could not have certain attributes so we skip
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
516 # them if not found
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
517 pass
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
518 # hack to ensure regexp finds data
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
519 if not text.startswith('\033['):
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
520 text = '\033[m' + text
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
521
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
522 # Look for ANSI-like codes embedded in text
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
523 m = re.match(ansire, text)
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
524
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
525 try:
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
526 while m:
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
527 for sattr in m.group(1).split(';'):
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
528 if sattr:
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
529 attr = mapcolor(int(sattr), attr)
31506
31d2ddfd338c color: sync text attributes and buffered text output on Windows (issue5508)
Matt Harbison <matt_harbison@yahoo.com>
parents: 31138
diff changeset
530 ui.flush()
31084
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
531 _kernel32.SetConsoleTextAttribute(stdout, attr)
31105
75c4aafee490 color: clarify name of an argument of 'win32print'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31103
diff changeset
532 writefunc(m.group(2), **opts)
31084
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
533 m = re.match(ansire, m.group(3))
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
534 finally:
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
535 # Explicitly reset original attributes
31506
31d2ddfd338c color: sync text attributes and buffered text output on Windows (issue5508)
Matt Harbison <matt_harbison@yahoo.com>
parents: 31138
diff changeset
536 ui.flush()
31084
a0bde5ec3a46 color: move 'win32' declaration to the core module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30993
diff changeset
537 _kernel32.SetConsoleTextAttribute(stdout, origattr)