[PATCH 2 of 4] color: refactor how terminfo colors are defined

Gregory Szorc gregory.szorc at gmail.com
Sun Jul 9 19:46:15 EDT 2017


# HG changeset patch
# User Gregory Szorc <gregory.szorc at gmail.com>
# Date 1499639997 25200
#      Sun Jul 09 15:39:57 2017 -0700
# Node ID 98c54db9407a7e0ba94a632aafdbbec3fc76fa8b
# Parent  129c9709980108beecfa1c02a52c679654de8b21
color: refactor how terminfo colors are defined

Terminfo colors are currently lumped together with terminfo control
and styling attributes. As part of implementing 16 and 256 color
support, it will help to differentiate terminfo colors from other
attributes. So this commit does that.

Colors are split to their own dict. A new function for obtaining
a dict of color name to color number has been implemented and code
has been refactored to use it.

The color dict preserves whether the color is user-defined so that
`hg debugcolors` output remains consistent. I'm not sure if this is
worth it. I kept the old behavior to avoid a BC break.

diff --git a/mercurial/color.py b/mercurial/color.py
--- a/mercurial/color.py
+++ b/mercurial/color.py
@@ -32,18 +32,23 @@ try:
         'bold': (True, 'bold', ''),
         'invisible': (True, 'invis', ''),
         'italic': (True, 'sitm', ''),
-        'black': (False, curses.COLOR_BLACK, ''),
-        'red': (False, curses.COLOR_RED, ''),
-        'green': (False, curses.COLOR_GREEN, ''),
-        'yellow': (False, curses.COLOR_YELLOW, ''),
-        'blue': (False, curses.COLOR_BLUE, ''),
-        'magenta': (False, curses.COLOR_MAGENTA, ''),
-        'cyan': (False, curses.COLOR_CYAN, ''),
-        'white': (False, curses.COLOR_WHITE, ''),
     }
+
+    TERMINFO_COLOR_8 = {
+        'black': curses.COLOR_BLACK,
+        'red': curses.COLOR_RED,
+        'green': curses.COLOR_GREEN,
+        'yellow': curses.COLOR_YELLOW,
+        'blue': curses.COLOR_BLUE,
+        'magenta': curses.COLOR_MAGENTA,
+        'cyan': curses.COLOR_CYAN,
+        'white': curses.COLOR_WHITE,
+    }
+
 except ImportError:
     curses = None
     _baseterminfoparams = {}
+    TERMINFO_COLOR_8 = {}
 
 _enabledbydefault = True
 
@@ -132,6 +137,21 @@ except ImportError:
 def loadcolortable(ui, extname, colortable):
     _defaultstyles.update(colortable)
 
+def _terminfocolors(ui):
+    """Obtain defined terminfo colors as a dict.
+
+    Keys are color names. Values are tuples of (value, user-defined).
+    """
+    colors = {}
+    for color, value in TERMINFO_COLOR_8.items():
+        colors[color] = (value, False)
+
+    for key, value in ui.configitems('color'):
+        if key.startswith('color.'):
+            colors[key[6:]] = (int(value), True)
+
+    return colors
+
 def _terminfosetup(ui, mode):
     '''Initialize terminfo data and the terminal if we're in terminfo mode.'''
 
@@ -150,11 +170,11 @@ def _terminfosetup(ui, mode):
 
     ui._terminfoparams.update(_baseterminfoparams)
 
+    for color, value in _terminfocolors(ui).items():
+        ui._terminfoparams[color] = (False, value[0], '')
+
     for key, val in ui.configitems('color'):
-        if key.startswith('color.'):
-            newval = (False, int(val), '')
-            ui._terminfoparams[key[6:]] = newval
-        elif key.startswith('terminfo.'):
+        if key.startswith('terminfo.'):
             newval = (True, '', val.replace('\\E', '\x1b'))
             ui._terminfoparams[key[9:]] = newval
 
diff --git a/mercurial/debugcommands.py b/mercurial/debugcommands.py
--- a/mercurial/debugcommands.py
+++ b/mercurial/debugcommands.py
@@ -405,10 +405,11 @@ def _debugdisplaycolor(ui):
     for effect in color._activeeffects(ui).keys():
         ui._styles[effect] = effect
     if ui._terminfoparams:
+        for k, v in color._terminfocolors(ui).items():
+            ui._styles['color.%s' % k if v[1] else k] = k
+
         for k, v in ui.configitems('color'):
-            if k.startswith('color.'):
-                ui._styles[k] = k[6:]
-            elif k.startswith('terminfo.'):
+            if k.startswith('terminfo.'):
                 ui._styles[k] = k[9:]
     ui.write(_('available colors:\n'))
     # sort label with a '_' after the other to group '_background' entry.


More information about the Mercurial-devel mailing list