diff -r 2d56e6d23be7 -r 98c2b44bdf9a mercurial/color.py --- a/mercurial/color.py Mon May 22 22:00:56 2017 -0400 +++ b/mercurial/color.py Mon May 22 22:20:38 2017 -0400 @@ -215,24 +215,34 @@ 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. + if pycompat.osname == 'nt': + from . import win32 + + 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: + # 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. + ansienviron = term and 'xterm' in term + + if mode == 'auto': + # 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. + # w32ffects is not populated when stdout is redirected, so checking + # it first avoids win32 calls in a state known to error out. + if ansienviron or not w32effects or win32.enablevtmode(): realmode = 'ansi' else: realmode = 'win32' - else: - realmode = 'ansi' + # An empty w32effects is a clue that stdout is redirected, and thus + # cannot enable VT mode. + elif mode == 'ansi' and w32effects and not ansienviron: + win32.enablevtmode() + elif mode == 'auto': + realmode = 'ansi' def modewarn(): # only warn if color.mode was explicitly set and we're in