Mercurial > hg
diff mercurial/color.py @ 31101:9021a94a7dbf
color: move 'modesetup' into the core module
Yet another piece of code moving from the extensions to the module in core!
author | Pierre-Yves David <pierre-yves.david@ens-lyon.org> |
---|---|
date | Thu, 22 Dec 2016 14:30:46 +0100 |
parents | 8903f67b9ca8 |
children | c1997c5d1ae3 |
line wrap: on
line diff
--- a/mercurial/color.py Thu Dec 22 14:17:52 2016 +0100 +++ b/mercurial/color.py Thu Dec 22 14:30:46 2016 +0100 @@ -9,7 +9,11 @@ from .i18n import _ -from . import pycompat +from . import ( + encoding, + pycompat, + util +) try: import curses @@ -157,6 +161,71 @@ "ECMA-48 color\n")) _terminfo_params.clear() +def _modesetup(ui, coloropt): + if coloropt == 'debug': + return 'debug' + + auto = (coloropt == 'auto') + always = not auto and util.parsebool(coloropt) + if not always and not auto: + return None + + formatted = (always or (encoding.environ.get('TERM') != 'dumb' + and ui.formatted())) + + mode = ui.config('color', 'mode', 'auto') + + # If pager is active, color.pagermode overrides color.mode. + if getattr(ui, 'pageractive', False): + mode = ui.config('color', 'pagermode', mode) + + realmode = mode + if mode == 'auto': + if pycompat.osname == 'nt': + term = encoding.environ.get('TERM') + # TERM won't be defined in a vanilla cmd.exe environment. + + # UNIX-like environments on Windows such as Cygwin and MSYS will + # set TERM. They appear to make a best effort attempt at setting it + # to something appropriate. However, not all environments with TERM + # defined support ANSI. Since "ansi" could result in terminal + # gibberish, we error on the side of selecting "win32". However, if + # w32effects is not defined, we almost certainly don't support + # "win32", so don't even try. + if (term and 'xterm' in term) or not w32effects: + realmode = 'ansi' + else: + realmode = 'win32' + else: + realmode = 'ansi' + + def modewarn(): + # only warn if color.mode was explicitly set and we're in + # a formatted terminal + if mode == realmode and ui.formatted(): + ui.warn(_('warning: failed to set color mode to %s\n') % mode) + + if realmode == 'win32': + _terminfo_params.clear() + if not w32effects: + modewarn() + return None + _effects.update(w32effects) + elif realmode == 'ansi': + _terminfo_params.clear() + elif realmode == 'terminfo': + _terminfosetup(ui, mode) + if not _terminfo_params: + ## FIXME Shouldn't we return None in this case too? + modewarn() + realmode = 'ansi' + else: + return None + + if always or (auto and formatted): + return realmode + return None + def configstyles(ui): for status, cfgeffects in ui.configitems('color'): if '.' not in status or status.startswith(('color.', 'terminfo.')):