__all__ = [
"RUSTUP",
"USE_ANSI",
"load_globals_from_metadata",
"load_metadata_from_manifest",
"msg",
"msg_trace",
"set_toolbox_trace",
"sh",
"sh_eval",
"which",
]
import os
import os.path
import subprocess
import sys
import toml
from itertools import chain
TRACE = os.environ.get('TRACE_TOOLBOX', '') != ''
USE_ANSI = True if sys.platform != 'win32' else os.environ.get('FORCE_ANSI', '') != '' or os.environ.get('ConEmuANSI', 'OFF') == 'ON'
def which(programname, all=False):
path_exts = os.environ.get('PATHEXT', '').split(os.path.pathsep)
path_exts = [e for e in path_exts if e.lstrip() != '']
def matches():
for path in os.environ['PATH'].split(os.path.pathsep):
base_path = os.path.join(path, programname)
for ext in chain(('',), path_exts):
ext_path = base_path+ext
if os.path.exists(os.path.normcase(ext_path)):
yield ext_path
if all:
return matches()
else:
return next(matches(), None)
RUSTUP = "rustup" if which("rustup") is not None else "multirust"
def load_metadata_from_manifest(section):
with open('Cargo.toml', 'rt') as manifest_file:
manifest = toml.loads(manifest_file.read())
return (manifest
.get('package', {})
.get('metadata', {})
.get(section, {})
)
def load_globals_from_metadata(section, globals, names):
metadata = load_metadata_from_manifest(section)
for (k, v) in metadata.items():
k_ss = k.upper().replace('-', '_')
if k_ss not in names:
continue
globals[k_ss] = v
def msg(*args):
if USE_ANSI: sys.stdout.write('\x1b[1;34m')
sys.stdout.write('> ')
if USE_ANSI: sys.stdout.write('\x1b[1;32m')
for arg in args:
sys.stdout.write(str(arg))
if USE_ANSI: sys.stdout.write('\x1b[0m')
sys.stdout.write('\n')
sys.stdout.flush()
def msg_trace(*args):
if TRACE:
if USE_ANSI: sys.stderr.write('\x1b[1;31m')
sys.stderr.write('$ ')
if USE_ANSI: sys.stderr.write('\x1b[0m')
for arg in args:
sys.stderr.write(str(arg))
sys.stderr.write('\n')
sys.stderr.flush()
def set_toolbox_trace(env_var):
global TRACE
TRACE = TRACE or os.environ.get(env_var, '') != ''
def sh(cmd, env=None, stdout=None, stderr=None, checked=True):
msg_trace('sh(%r, env=%r)' % (cmd, env))
try:
subprocess.check_call(cmd, env=env, stdout=stdout, stderr=stderr, shell=True)
except Exception as e:
msg_trace('FAILED: %s' % e)
if checked:
raise
else:
return False
if not checked:
return True
def sh_eval(cmd, codec='utf-8', dont_strip=False):
msg_trace('sh_eval(%r)' % cmd)
result = None
try:
result = subprocess.check_output(cmd, shell=True).decode(codec)
if not dont_strip:
result = result.strip()
except:
msg_trace('FAILED!')
raise
return result