[PATCH 1 of 1 RESEND] color: add support for Windows consoles

Steve Borho steve at borho.org
Tue Apr 6 10:59:10 CDT 2010


On Tue, Apr 6, 2010 at 10:52 AM, Brodie Rao <dackze at gmail.com> wrote:
> On Apr 6, 2010, at 10:47 AM, steve at borho.org wrote:
>
>> # HG changeset patch
>> # User Steve Borho <steve at borho.org>
>> # Date 1270561759 18000
>> # Node ID 89c4c895bddc709c3f680dc0e07a73449608e2c8
>> # Parent  06ede55eb9b0f0df9775b15291fd64d7b3255f76
>> color: add support for Windows consoles
>>
>> Introduces ui.color configurable with values 'auto', 'ansi', or 'win32'.  Any
>> other value disables coloring.  When 'auto' is selected, the win32 console
>> method will be used if the win32console Python module is detected (requires
>> pywin32 to be installed).
>
> Why ui.color? Why not color.mode or color.format?
>
> It also seems a little confusing considering there's also --color which takes auto, always, and never, but doesn't have anything to do with the output format.

I was just looking at this, and agree it's confusing.  color.mode is fine.

>>
>> diff --git a/hgext/color.py b/hgext/color.py
>> --- a/hgext/color.py
>> +++ b/hgext/color.py
>> @@ -150,19 +150,35 @@
>>         return ''.join(style(a, label) for a, label in _buffers.pop())
>>     return ''.join(a for a, label in _buffers.pop())
>>
>> +mode = 'ansi'
>> def write(orig, *args, **opts):
>>     label = opts.get('label', '')
>>     global _buffers
>>     if _buffers:
>>         _buffers[-1].extend([(str(a), label) for a in args])
>> +    elif mode == 'win32':
>> +        for a in args:
>> +            win32print(a, orig, **opts)
>>     else:
>>         return orig(*[style(str(a), label) for a in args], **opts)
>>
>> def write_err(orig, *args, **opts):
>>     label = opts.get('label', '')
>> -    return orig(*[style(str(a), label) for a in args], **opts)
>> +    if mode == 'win32':
>> +        for a in args:
>> +            win32print(a, orig, **opts)
>> +    else:
>> +        return orig(*[style(str(a), label) for a in args], **opts)
>>
>> def uisetup(ui):
>> +    global mode
>> +    mode = ui.config('ui', 'color', 'auto')
>> +    if mode == 'auto':
>> +        mode = _w32effects and 'win32' or 'ansi'
>
> What if someone's on win32 but is using an ANSI terminal?

Currently. they have to override auto-detection if they want ANSI on
Windows.  Is there a bullet-proof way to detect an ANSI capable term
on Windows?

I'll post a new patch with color.mode and docs for it.

--
Steve Borho


More information about the Mercurial-devel mailing list