[PATCH RFC] color: fix --color=always when output is piped
Matt Mackall
mpm at selenic.com
Thu May 26 14:57:22 CDT 2011
On Wed, 2011-05-25 at 18:49 +0200, Peter Arrenbrecht wrote:
> # HG changeset patch
> # User Peter Arrenbrecht <peter.arrenbrecht at gmail.com>
> # Date 1306342080 -7200
> # Node ID 30850bc97c5c1f6ba8bb0d07bc0d57fb32a0b1dd
> # Parent 9d31f762cdf263329aa80e0b8d9ecc38a2b3bf44
> color: fix --color=always when output is piped
What was broken?
Is this the terminfo vs less thing?
> Also restructures the mode determination as discussed on IRC.
> I tried to simplify the code too, while keeping the original
> semantics except for the case of --color=always.
> diff --git a/hgext/color.py b/hgext/color.py
> --- a/hgext/color.py
> +++ b/hgext/color.py
> @@ -114,7 +114,7 @@
> 'blue_background': 44, 'purple_background': 45,
> 'cyan_background': 46, 'white_background': 47}
>
> -def _terminfosetup(ui):
> +def _terminfosetup(ui, mode):
> '''Initialize terminfo data and the terminal if we're in terminfo mode.'''
>
> global _terminfo_params
> @@ -122,7 +122,6 @@
> if not _terminfo_params:
> return
> # Otherwise, see what the config file says.
> - mode = ui.config('color', 'mode', 'auto')
> if mode not in ('auto', 'terminfo'):
> return
>
> @@ -149,6 +148,51 @@
> "ECMA-48 color\n"))
> _terminfo_params = {}
>
> +def _modesetup(ui, opts):
> + global _terminfo_params
> +
> + coloropt = opts['color']
> + auto = coloropt == 'auto'
> + always = not auto and util.parsebool(coloropt)
> + if not always and not auto:
> + return None
> +
> + formatted = always or (os.environ.get('TERM') != 'dumb' and ui.formatted())
> +
> + mode = ui.config('color', 'mode', 'auto')
> + realmode = mode
> + if mode == 'auto':
> + if os.name == 'nt' and 'TERM' not in os.environ:
> + # looks line a cmd.exe console, use win32 API or nothing
> + realmode = 'win32'
> + elif not formatted:
> + realmode = 'ansi'
> + else:
> + realmode = 'terminfo'
> +
> + if realmode == 'win32':
> + if not w32effects and mode == 'win32':
> + # only warn if color.mode is explicitly set to win32
> + ui.warn(_('warning: failed to set color mode to %s\n') % mode)
> + return None
> + _effects.update(w32effects)
> + elif realmode == 'ansi':
> + _terminfo_params = {}
> + elif realmode == 'terminfo':
> + _terminfosetup(ui, mode)
> + if not _terminfo_params:
> + if mode == 'terminfo':
> + ## FIXME Shouldn't we return None in this case too?
> + # only warn if color.mode is explicitly set to win32
> + ui.warn(_('warning: failed to set color mode to %s\n') % mode)
> + realmode = 'ansi'
> + else:
> + return None
> +
> + if always or (auto and formatted):
> + return realmode
> + return None
> +
> try:
> import curses
> # Mapping from effect name to terminfo attribute name or color number.
> @@ -301,40 +345,9 @@
> global _terminfo_params
> if ui.plain():
> return
> -
> - formatted = (os.environ.get('TERM') != 'dumb' and ui.formatted())
> - mode = ui.config('color', 'mode', 'auto')
> - if mode == 'auto':
> - if os.name == 'nt' and 'TERM' not in os.environ:
> - # looks line a cmd.exe console, use win32 API or nothing
> - mode = w32effects and 'win32' or 'none'
> - else:
> - if not formatted:
> - _terminfo_params = False
> - else:
> - _terminfosetup(ui)
> - if not _terminfo_params:
> - mode = 'ansi'
> - else:
> - mode = 'terminfo'
> - if mode == 'win32':
> - if w32effects is None:
> - # only warn if color.mode is explicitly set to win32
> - ui.warn(_('warning: failed to set color mode to %s\n') % mode)
> - return
> - _effects.update(w32effects)
> - elif mode == 'ansi':
> - _terminfo_params = {}
> - elif mode == 'terminfo':
> - _terminfosetup(ui)
> - else:
> - return
> def colorcmd(orig, ui_, opts, cmd, cmdfunc):
> - coloropt = opts['color']
> - auto = coloropt == 'auto'
> - always = util.parsebool(coloropt)
> - if (always or
> - (always is None and auto and formatted)):
> + mode = _modesetup(ui_, opts)
> + if mode:
> colorui._colormode = mode
> colorui.__bases__ = (ui_.__class__,)
> ui_.__class__ = colorui
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
--
Mathematics is the supreme nostalgia of our time.
More information about the Mercurial-devel
mailing list