[utils] Fix bug in 0b9c08b47b

* Cache of `supports_terminal_sequences` must be reset after enabling VT mode
* and move `windows_enable_vt_mode` to utils to avoid cyclic imports
This commit is contained in:
pukkandan 2022-05-20 03:02:25 +05:30
parent b801cd7179
commit 53973b4d2c
No known key found for this signature in database
GPG key ID: 7EEE9E1E817D0A39
4 changed files with 27 additions and 19 deletions

View file

@ -33,7 +33,6 @@
compat_str,
compat_urllib_error,
compat_urllib_request,
windows_enable_vt_mode,
)
from .cookies import load_cookies
from .downloader import FFmpegFD, get_suitable_downloader, shorten_protocol_name
@ -142,6 +141,7 @@
url_basename,
variadic,
version_tuple,
windows_enable_vt_mode,
write_json_file,
write_string,
)
@ -3605,7 +3605,7 @@ def print_debug_header(self):
def get_encoding(stream):
ret = str(getattr(stream, 'encoding', 'missing (%s)' % type(stream).__name__))
if not supports_terminal_sequences(stream):
from .compat import WINDOWS_VT_MODE # Must be imported locally
from .utils import WINDOWS_VT_MODE # Must be imported locally
ret += ' (No VT)' if WINDOWS_VT_MODE is False else ' (No ANSI)'
return ret

View file

@ -1,6 +1,4 @@
import contextlib
import os
import subprocess
import sys
import warnings
import xml.etree.ElementTree as etree
@ -74,17 +72,3 @@ def compat_expanduser(path):
return userhome + path[i:]
else:
compat_expanduser = os.path.expanduser
WINDOWS_VT_MODE = False if compat_os_name == 'nt' else None
def windows_enable_vt_mode(): # TODO: Do this the proper way https://bugs.python.org/issue30075
if compat_os_name != 'nt':
return
global WINDOWS_VT_MODE
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
with contextlib.suppress(Exception):
subprocess.Popen('', shell=True, startupinfo=startupinfo).wait()
WINDOWS_VT_MODE = True

View file

@ -55,3 +55,10 @@ def compat_ctypes_WINFUNCTYPE(*args, **kwargs):
compat_xpath = lambda xpath: xpath
compat_zip = zip
workaround_optparse_bug9161 = lambda: None
def __getattr__(name):
if name in ('WINDOWS_VT_MODE', 'windows_enable_vt_mode'):
from .. import utils
return getattr(utils, name)
raise AttributeError(name)

View file

@ -5094,10 +5094,12 @@ def jwt_decode_hs256(jwt):
return payload_data
WINDOWS_VT_MODE = False if compat_os_name == 'nt' else None
@functools.cache
def supports_terminal_sequences(stream):
if compat_os_name == 'nt':
from .compat import WINDOWS_VT_MODE # Must be imported locally
if not WINDOWS_VT_MODE or get_windows_version() < (10, 0, 10586):
return False
elif not os.getenv('TERM'):
@ -5108,6 +5110,21 @@ def supports_terminal_sequences(stream):
return False
def windows_enable_vt_mode(): # TODO: Do this the proper way https://bugs.python.org/issue30075
if compat_os_name != 'nt':
return
global WINDOWS_VT_MODE
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
try:
subprocess.Popen('', shell=True, startupinfo=startupinfo).wait()
except Exception:
return
WINDOWS_VT_MODE = True
supports_terminal_sequences.cache_clear()
_terminal_sequences_re = re.compile('\033\\[[^m]+m')