ci_utils.py - Utilities supporting continuous integration tests¶
Imports¶
These are listed in the order prescribed by PEP 8.
Standard library¶
OS detection¶
This follows the Python recommendations.
Copied from https://docs.python.org/3.5/library/platform.html#cross-platform.
Support code¶
xqt¶
Pronounced “execute”: provides a simple way to execute a system command.
Commands to run. For example, 'foo -param firstArg secondArg', 'bar |
grep alpha'.
Optional keyword arguments to pass on to subprocess.run.
Although https://docs.python.org/3/library/subprocess.html#subprocess.Popen
states, “The only time you need to specify shell=True on Windows is
when the command you wish to execute is built into the shell (e.g.
dir or copy). You do not need shell=True to run a batch file
or console-based executable.”, use shell=True to both allow shell
commands and to support simple redirection (such as blah > nul,
instead of passing stdout=subprocess.DEVNULL to check_call).
Per http://stackoverflow.com/questions/15931526/why-subprocess-stdout-to-a-file-is-written-out-of-order,
the check_call below will flush stdout and stderr, causing all
the subprocess output to appear first, followed by all the Python
output (such as the print statement above). So, flush the buffers to
avoid this.
Use bash instead of sh, so that source and other bash syntax
works. See https://docs.python.org/3/library/subprocess.html#subprocess.Popen.
executable = "/bin/bash" if is_linux or is_darwin else None
try:
cp = subprocess.run(
_, shell=True, executable=executable, check=True, **kwargs # type: ignore
)
except subprocess.CalledProcessError as e:
flush_print(
"Subprocess output:\n{}\n{}".format(e.stderr or "", e.stdout or "")
)
raise
ret.append(cp)
Return a list only if there were multiple commands to execute.
pushd¶
A context manager for pushd.
The path to change to upon entering the context manager.
path: str,
):
self.path = path
def __enter__(self):
flush_print("pushd {}".format(self.path))
self.cwd = os.getcwd()
os.chdir(self.path)
def __exit__(self, type_: Any, value: Any, traceback: Any) -> Literal[False]:
flush_print("popd - returning to {}.".format(self.cwd))
os.chdir(self.cwd)
return False
Common tools¶
chdir¶
mkdir¶
flush_print¶
Anything sent to print won’t be printed until Python flushes its buffers,
which means what CI logs report may be reflect what’s actually being executed
– until the buffers are flushed.
Flush both buffers, just in case there’s something in stdout.