11import os
22import sys
33
4- terminal_supports_color = True
54if sys .platform == 'win32' : # pragma: no cover (windows)
6- from pre_commit .color_windows import enable_virtual_terminal_processing
5+ def _enable () -> None :
6+ from ctypes import POINTER
7+ from ctypes import windll
8+ from ctypes import WinError
9+ from ctypes import WINFUNCTYPE
10+ from ctypes .wintypes import BOOL
11+ from ctypes .wintypes import DWORD
12+ from ctypes .wintypes import HANDLE
13+
14+ STD_OUTPUT_HANDLE = - 11
15+ ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4
16+
17+ def bool_errcheck (result , func , args ):
18+ if not result :
19+ raise WinError ()
20+ return args
21+
22+ GetStdHandle = WINFUNCTYPE (HANDLE , DWORD )(
23+ ('GetStdHandle' , windll .kernel32 ), ((1 , 'nStdHandle' ),),
24+ )
25+
26+ GetConsoleMode = WINFUNCTYPE (BOOL , HANDLE , POINTER (DWORD ))(
27+ ('GetConsoleMode' , windll .kernel32 ),
28+ ((1 , 'hConsoleHandle' ), (2 , 'lpMode' )),
29+ )
30+ GetConsoleMode .errcheck = bool_errcheck
31+
32+ SetConsoleMode = WINFUNCTYPE (BOOL , HANDLE , DWORD )(
33+ ('SetConsoleMode' , windll .kernel32 ),
34+ ((1 , 'hConsoleHandle' ), (1 , 'dwMode' )),
35+ )
36+ SetConsoleMode .errcheck = bool_errcheck
37+
38+ # As of Windows 10, the Windows console supports (some) ANSI escape
39+ # sequences, but it needs to be enabled using `SetConsoleMode` first.
40+ #
41+ # More info on the escape sequences supported:
42+ # https://msdn.microsoft.com/en-us/library/windows/desktop/mt638032(v=vs.85).aspx
43+ stdout = GetStdHandle (STD_OUTPUT_HANDLE )
44+ flags = GetConsoleMode (stdout )
45+ SetConsoleMode (stdout , flags | ENABLE_VIRTUAL_TERMINAL_PROCESSING )
46+
747 try :
8- enable_virtual_terminal_processing ()
48+ _enable ()
949 except OSError :
1050 terminal_supports_color = False
51+ else :
52+ terminal_supports_color = True
53+ else : # pragma: windows no cover
54+ terminal_supports_color = True
1155
1256RED = '\033 [41m'
1357GREEN = '\033 [42m'
1458YELLOW = '\033 [43;30m'
1559TURQUOISE = '\033 [46;30m'
1660SUBTLE = '\033 [2m'
17- NORMAL = '\033 [0m'
18-
19-
20- class InvalidColorSetting (ValueError ):
21- pass
61+ NORMAL = '\033 [m'
2262
2363
2464def format_color (text : str , color : str , use_color_setting : bool ) -> str :
@@ -29,10 +69,10 @@ def format_color(text: str, color: str, use_color_setting: bool) -> str:
2969 color - The color start string
3070 use_color_setting - Whether or not to color
3171 """
32- if not use_color_setting :
33- return text
34- else :
72+ if use_color_setting :
3573 return f'{ color } { text } { NORMAL } '
74+ else :
75+ return text
3676
3777
3878COLOR_CHOICES = ('auto' , 'always' , 'never' )
@@ -45,7 +85,7 @@ def use_color(setting: str) -> bool:
4585 setting - Either `auto`, `always`, or `never`
4686 """
4787 if setting not in COLOR_CHOICES :
48- raise InvalidColorSetting (setting )
88+ raise ValueError (setting )
4989
5090 return (
5191 setting == 'always' or (
0 commit comments