[PATCH RFC] color: fix --color=always when output is piped

Peter Arrenbrecht peter.arrenbrecht at gmail.com
Thu May 26 15:27:51 CDT 2011


On Thu, May 26, 2011 at 9:57 PM, Matt Mackall <mpm at selenic.com> wrote:
> 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?

Yes. Now --color=always really does emit colors into the pipe for less.
-parren

>> 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