diff --git a/test/runner/lib/executor.py b/test/runner/lib/executor.py index 054b964c3b..c394430113 100644 --- a/test/runner/lib/executor.py +++ b/test/runner/lib/executor.py @@ -10,7 +10,6 @@ import re import time import textwrap import functools -import pipes import sys import hashlib import difflib @@ -61,6 +60,7 @@ from lib.util import ( get_remote_completion, named_temporary_file, COVERAGE_OUTPUT_PATH, + cmd_quote, ) from lib.docker_util import ( @@ -219,7 +219,7 @@ def install_command_requirements(args, python_version=None): if changes: raise ApplicationError('Conflicts detected in requirements. The following commands reported changes during verification:\n%s' % - '\n'.join((' '.join(pipes.quote(c) for c in cmd) for cmd in changes))) + '\n'.join((' '.join(cmd_quote(c) for c in cmd) for cmd in changes))) # ask pip to check for conflicts between installed packages try: diff --git a/test/runner/lib/manage_ci.py b/test/runner/lib/manage_ci.py index 8376d06a1b..0e1df84a89 100644 --- a/test/runner/lib/manage_ci.py +++ b/test/runner/lib/manage_ci.py @@ -3,7 +3,6 @@ from __future__ import absolute_import, print_function import os -import pipes import tempfile import time @@ -14,6 +13,7 @@ from lib.util import ( ApplicationError, run_command, intercept_command, + cmd_quote, ) from lib.core_ci import ( @@ -107,7 +107,7 @@ class ManageWindowsCI(object): options.append('-tt') if isinstance(command, list): - command = ' '.join(pipes.quote(c) for c in command) + command = ' '.join(cmd_quote(c) for c in command) run_command(self.core_ci.args, ['ssh', '-q'] + self.ssh_args + @@ -273,14 +273,14 @@ class ManagePosixCI(object): options = [] if isinstance(command, list): - command = ' '.join(pipes.quote(c) for c in command) + command = ' '.join(cmd_quote(c) for c in command) run_command(self.core_ci.args, ['ssh', '-tt', '-q'] + self.ssh_args + options + ['-p', str(self.core_ci.connection.port), '%s@%s' % (self.core_ci.connection.username, self.core_ci.connection.hostname)] + - self.become + [pipes.quote(command)]) + self.become + [cmd_quote(command)]) def scp(self, src, dst): """ diff --git a/test/runner/lib/util.py b/test/runner/lib/util.py index 359e125000..203aa71467 100644 --- a/test/runner/lib/util.py +++ b/test/runner/lib/util.py @@ -9,7 +9,6 @@ import fcntl import inspect import json import os -import pipes import pkgutil import random import re @@ -38,6 +37,11 @@ except ImportError: # noinspection PyCompatibility from configparser import ConfigParser +try: + from shlex import quote as cmd_quote +except ImportError: + from pipes import quote as cmd_quote + DOCKER_COMPLETION = {} # type: dict[str, dict[str, str]] REMOTE_COMPLETION = {} # type: dict[str, dict[str, str]] PYTHON_PATHS = {} # type: dict[str, str] @@ -389,7 +393,7 @@ def raw_command(cmd, capture=False, env=None, data=None, cwd=None, explain=False cmd = list(cmd) - escaped_cmd = ' '.join(pipes.quote(c) for c in cmd) + escaped_cmd = ' '.join(cmd_quote(c) for c in cmd) display.info('Run command: %s' % escaped_cmd, verbosity=cmd_verbosity, truncate=True) display.info('Working directory: %s' % cwd, verbosity=2) @@ -763,7 +767,7 @@ class SubprocessError(ApplicationError): :type stderr: str | None :type runtime: float | None """ - message = 'Command "%s" returned exit status %s.\n' % (' '.join(pipes.quote(c) for c in cmd), status) + message = 'Command "%s" returned exit status %s.\n' % (' '.join(cmd_quote(c) for c in cmd), status) if stderr: message += '>>> Standard Error\n'