|
|
|
@ -1638,16 +1638,14 @@ def get_filesystem_encoding():
|
|
|
|
|
return encoding if encoding is not None else 'utf-8'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_WINDOWS_QUOTE_TRANS = str.maketrans({'"': '\\"', '\\': '\\\\'})
|
|
|
|
|
_WINDOWS_QUOTE_TRANS = str.maketrans({'"': R'\"'})
|
|
|
|
|
_CMD_QUOTE_TRANS = str.maketrans({
|
|
|
|
|
# Keep quotes balanced by replacing them with `""` instead of `\\"`
|
|
|
|
|
'"': '""',
|
|
|
|
|
# Requires a variable `=` containing `"^\n\n"` (set in `utils.Popen`)
|
|
|
|
|
# These require an env-variable `=` containing `"^\n\n"` (set in `utils.Popen`)
|
|
|
|
|
# `=` should be unique since variables containing `=` cannot be set using cmd
|
|
|
|
|
'\n': '%=%',
|
|
|
|
|
# While we are only required to escape backslashes immediately before quotes,
|
|
|
|
|
# we instead escape all of 'em anyways to be consistent
|
|
|
|
|
'\\': '\\\\',
|
|
|
|
|
'\r': '%=%',
|
|
|
|
|
# Use zero length variable replacement so `%` doesn't get expanded
|
|
|
|
|
# `cd` is always set as long as extensions are enabled (`/E:ON` in `utils.Popen`)
|
|
|
|
|
'%': '%%cd:~,%',
|
|
|
|
@ -1656,19 +1654,14 @@ _CMD_QUOTE_TRANS = str.maketrans({
|
|
|
|
|
|
|
|
|
|
def shell_quote(args, *, shell=False):
|
|
|
|
|
args = list(variadic(args))
|
|
|
|
|
if any(isinstance(item, bytes) for item in args):
|
|
|
|
|
deprecation_warning('Passing bytes to utils.shell_quote is deprecated')
|
|
|
|
|
encoding = get_filesystem_encoding()
|
|
|
|
|
for index, item in enumerate(args):
|
|
|
|
|
if isinstance(item, bytes):
|
|
|
|
|
args[index] = item.decode(encoding)
|
|
|
|
|
|
|
|
|
|
if compat_os_name != 'nt':
|
|
|
|
|
return shlex.join(args)
|
|
|
|
|
|
|
|
|
|
trans = _CMD_QUOTE_TRANS if shell else _WINDOWS_QUOTE_TRANS
|
|
|
|
|
return ' '.join(
|
|
|
|
|
s if re.fullmatch(r'[\w#$*\-+./:?@\\]+', s, re.ASCII) else s.translate(trans).join('""')
|
|
|
|
|
s if re.fullmatch(r'[\w#$*\-+./:?@\\]+', s, re.ASCII)
|
|
|
|
|
else re.sub(r'(\\+)("|$)', r'\1\1\2', s).translate(trans).join('""')
|
|
|
|
|
for s in args)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|