|
Packit Service |
a04d08 |
#!/bin/sh
|
|
Packit Service |
a04d08 |
# https://gist.github.com/smoser/2d4100a6a5d230ca937f
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
CR='
|
|
Packit Service |
a04d08 |
'
|
|
Packit Service |
a04d08 |
error() { echo "$@" 1>&2; }
|
|
Packit Service |
a04d08 |
fail() { [ $# -eq 0 ] || error "$@"; exit 1; }
|
|
Packit Service |
a04d08 |
get_env_dirs() {
|
|
Packit Service |
a04d08 |
# read 'tox --showconfig'. return list of
|
|
Packit Service |
a04d08 |
# envname:dir
|
|
Packit Service |
a04d08 |
local key="" equal="" val="" curenv="" out=""
|
|
Packit Service |
a04d08 |
while read key equal val; do
|
|
Packit Service |
a04d08 |
case "$key" in
|
|
Packit Service |
a04d08 |
"[testenv:"*)
|
|
Packit Service |
a04d08 |
curenv=${key#*:};
|
|
Packit Service |
a04d08 |
curenv=${curenv%%"]"*};
|
|
Packit Service |
a04d08 |
continue;;
|
|
Packit Service |
a04d08 |
esac
|
|
Packit Service |
a04d08 |
if [ "${key#*=}" != "$key" ]; then
|
|
Packit Service |
a04d08 |
# older tox shows key=value or key= value
|
|
Packit Service |
a04d08 |
# newer tox shows: key = value
|
|
Packit Service |
a04d08 |
key=${key%%=*}
|
|
Packit Service |
a04d08 |
val=${equal}
|
|
Packit Service |
a04d08 |
fi
|
|
Packit Service |
a04d08 |
[ "$key" = "envdir" ] || continue
|
|
Packit Service |
a04d08 |
out="${out:+${out}${CR}}${curenv}:$val"
|
|
Packit Service |
a04d08 |
done
|
|
Packit Service |
a04d08 |
echo "$out"
|
|
Packit Service |
a04d08 |
}
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
load_config() {
|
|
Packit Service |
a04d08 |
local tox_ini="$1" out="" envs=""
|
|
Packit Service |
a04d08 |
if [ "$tox_ini" = "${CACHED_ENVS_INI}" ]; then
|
|
Packit Service |
a04d08 |
_RET="$CACHED_ENVS"
|
|
Packit Service |
a04d08 |
return
|
|
Packit Service |
a04d08 |
fi
|
|
Packit Service |
a04d08 |
out=$(tox -c "$tox_ini" --showconfig) || return 1
|
|
Packit Service |
a04d08 |
envs=$(echo "$out" | get_env_dirs) || return 1
|
|
Packit Service |
a04d08 |
CACHED_ENVS="$envs"
|
|
Packit Service |
a04d08 |
CACHED_ENVS_INI="$tox_ini"
|
|
Packit Service |
a04d08 |
_RET="$envs"
|
|
Packit Service |
a04d08 |
}
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
list_environments() {
|
|
Packit Service |
a04d08 |
local tox_ini="$1" prefix=" " out="" envs="" oifs="$IFS"
|
|
Packit Service |
a04d08 |
load_config "$tox_ini" || return 1
|
|
Packit Service |
a04d08 |
envs="${_RET}"
|
|
Packit Service |
a04d08 |
IFS="$CR"
|
|
Packit Service |
a04d08 |
for d in ${envs}; do
|
|
Packit Service |
a04d08 |
env=${d%%:*}
|
|
Packit Service |
a04d08 |
dir=${d#*:}
|
|
Packit Service |
a04d08 |
[ -f "$dir/bin/activate" ] && s="*" || s=""
|
|
Packit Service |
a04d08 |
echo "${prefix}$env$s";
|
|
Packit Service |
a04d08 |
done
|
|
Packit Service |
a04d08 |
IFS="$oifs"
|
|
Packit Service |
a04d08 |
}
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
get_command() {
|
|
Packit Service |
a04d08 |
local tox_ini="$1" env="$2" out=""
|
|
Packit Service |
a04d08 |
shift 2
|
|
Packit Service |
a04d08 |
out=$(
|
|
Packit Service |
a04d08 |
sed -e ':x; /\\$/ { N; s/\\\n[ ]*//; tx };' "${tox_ini}" |
|
|
Packit Service |
a04d08 |
gawk '
|
|
Packit Service |
a04d08 |
$1 ~ /^\[testenv.*\]/ {
|
|
Packit Service |
a04d08 |
name=$1;
|
|
Packit Service |
a04d08 |
sub("\\[", "", name); sub(".*:", "", name);
|
|
Packit Service |
a04d08 |
sub("].*", "", name);
|
|
Packit Service |
a04d08 |
curenv=name; };
|
|
Packit Service |
a04d08 |
$1 == "basepython" && (name == "testenv" || name == n) { python=$3 }
|
|
Packit Service |
a04d08 |
$1 == "commands" && (name == "testenv" || name == n) {
|
|
Packit Service |
a04d08 |
sub("commands = ", ""); cmd = $0; };
|
|
Packit Service |
a04d08 |
END {
|
|
Packit Service |
a04d08 |
sub("{envpython}", python, cmd);
|
|
Packit Service |
a04d08 |
sub("{toxinidir}", toxinidir, cmd);
|
|
Packit Service |
a04d08 |
if (inargs == "") replacement = "\\1"
|
|
Packit Service |
a04d08 |
else replacement = inargs
|
|
Packit Service |
a04d08 |
cmd = gensub(/{posargs:?([^}]*)}/, replacement, "global", cmd)
|
|
Packit Service |
a04d08 |
print(cmd);
|
|
Packit Service |
a04d08 |
}' n="$env" toxinidir="$(dirname $tox_ini)" inargs="$*")
|
|
Packit Service |
a04d08 |
if [ -z "$out" ]; then
|
|
Packit Service |
a04d08 |
error "Failed to find command for $env in $tox_ini"
|
|
Packit Service |
a04d08 |
return 1
|
|
Packit Service |
a04d08 |
fi
|
|
Packit Service |
a04d08 |
echo "$out"
|
|
Packit Service |
a04d08 |
}
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
get_env_dir() {
|
|
Packit Service |
a04d08 |
local tox_ini="$1" env="$2" oifs="$IFS" t="" d="" envs=""
|
|
Packit Service |
a04d08 |
if [ "${TOX_VENV_SHORTCUT:-1}" != "0" ]; then
|
|
Packit Service |
a04d08 |
local stox_d="${tox_ini%/*}/.tox/${env}"
|
|
Packit Service |
a04d08 |
if [ -e "${stox_d}/bin/activate" ]; then
|
|
Packit Service |
a04d08 |
_RET="${stox_d}"
|
|
Packit Service |
a04d08 |
return
|
|
Packit Service |
a04d08 |
fi
|
|
Packit Service |
a04d08 |
fi
|
|
Packit Service |
a04d08 |
load_config "$tox_ini" && envs="$_RET" || return 1
|
|
Packit Service |
a04d08 |
IFS="$CR"
|
|
Packit Service |
a04d08 |
for t in $envs; do
|
|
Packit Service |
a04d08 |
[ "$env" = "${t%%:*}" ] && d="${t#*:}" && break
|
|
Packit Service |
a04d08 |
done
|
|
Packit Service |
a04d08 |
IFS=${oifs}
|
|
Packit Service |
a04d08 |
[ -n "$d" ] || return 1
|
|
Packit Service |
a04d08 |
_RET="$d"
|
|
Packit Service |
a04d08 |
}
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
Usage() {
|
|
Packit Service |
a04d08 |
local tox_ini="$1"
|
|
Packit Service |
a04d08 |
cat <
|
|
Packit Service |
a04d08 |
Usage: ${0##*/} [--no-create] tox-environment [command [args]]
|
|
Packit Service |
a04d08 |
run command with provided arguments in the provided tox environment
|
|
Packit Service |
a04d08 |
command defaults to 'cmd' (see below).
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
run with '--list' to show available environments
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
if 'command' above is literal 'cmd' or '-', then the 'command' will
|
|
Packit Service |
a04d08 |
be read from tox.ini. This allows you to do:
|
|
Packit Service |
a04d08 |
tox-venv py27 - tests/some/sub/dir
|
|
Packit Service |
a04d08 |
and have the 'command' read correctly and have that execute:
|
|
Packit Service |
751c4a |
python -m pytest tests/some/sub/dir
|
|
Packit Service |
a04d08 |
EOF
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
if [ -f "$tox_ini" ]; then
|
|
Packit Service |
a04d08 |
local oini=${tox_ini}
|
|
Packit Service |
a04d08 |
[ "${tox_ini}" -ef "$PWD/tox.ini" ] && oini="./tox.ini"
|
|
Packit Service |
a04d08 |
echo
|
|
Packit Service |
a04d08 |
echo "environments in $oini"
|
|
Packit Service |
a04d08 |
list_environments "$tox_ini"
|
|
Packit Service |
a04d08 |
fi
|
|
Packit Service |
a04d08 |
}
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
if [ -f tox.ini ]; then
|
|
Packit Service |
a04d08 |
tox_ini="$PWD/tox.ini"
|
|
Packit Service |
a04d08 |
else
|
|
Packit Service |
a04d08 |
tox_ini="${0%/*}/../tox.ini"
|
|
Packit Service |
a04d08 |
fi
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
[ $# -eq 0 ] && { Usage "$tox_ini" 1>&2; exit 1; }
|
|
Packit Service |
a04d08 |
[ "$1" = "-h" -o "$1" = "--help" ] && { Usage "$tox_ini"; exit 0; }
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
[ -f "$tox_ini" ] || fail "$tox_ini: did not find tox.ini"
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
if [ "$1" = "-l" -o "$1" = "--list" ]; then
|
|
Packit Service |
a04d08 |
list_environments "$tox_ini"
|
|
Packit Service |
a04d08 |
exit
|
|
Packit Service |
a04d08 |
fi
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
nocreate="false"
|
|
Packit Service |
a04d08 |
if [ "$1" = "--no-create" ]; then
|
|
Packit Service |
a04d08 |
nocreate="true"
|
|
Packit Service |
a04d08 |
shift
|
|
Packit Service |
a04d08 |
fi
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
env="$1"
|
|
Packit Service |
a04d08 |
shift
|
|
Packit Service |
a04d08 |
[ "$1" = "--" ] && shift
|
|
Packit Service |
a04d08 |
get_env_dir "$tox_ini" "$env" && activate="$_RET/bin/activate" || activate=""
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
if [ -z "$activate" -o ! -f "$activate" ]; then
|
|
Packit Service |
a04d08 |
if $nocreate; then
|
|
Packit Service |
a04d08 |
fail "tox env '$env' did not exist, and no-create specified"
|
|
Packit Service |
a04d08 |
elif [ -n "$activate" ]; then
|
|
Packit Service |
a04d08 |
error "attempting to create $env:"
|
|
Packit Service |
a04d08 |
error " tox -c $tox_ini --recreate --notest -e $env"
|
|
Packit Service |
a04d08 |
tox -c "$tox_ini" --recreate --notest -e "$env" ||
|
|
Packit Service |
a04d08 |
fail "failed creation of env $env"
|
|
Packit Service |
a04d08 |
else
|
|
Packit Service |
a04d08 |
error "$env: not a valid tox environment?"
|
|
Packit Service |
a04d08 |
error "found tox_ini=$tox_ini"
|
|
Packit Service |
a04d08 |
error "try one of:"
|
|
Packit Service |
a04d08 |
list_environments "$tox_ini" 1>&2
|
|
Packit Service |
a04d08 |
fail
|
|
Packit Service |
a04d08 |
fi
|
|
Packit Service |
a04d08 |
fi
|
|
Packit Service |
a04d08 |
. "$activate"
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
[ $# -eq 0 ] && set -- cmd
|
|
Packit Service |
a04d08 |
if [ "$1" = "cmd" -o "$1" = "-" ]; then
|
|
Packit Service |
a04d08 |
shift
|
|
Packit Service |
a04d08 |
out=$(get_command "$tox_ini" "$env" "$@") || exit
|
|
Packit Service |
a04d08 |
eval set -- "$out"
|
|
Packit Service |
a04d08 |
fi
|
|
Packit Service |
a04d08 |
echo "inside tox:$env running: $*" 1>&2
|
|
Packit Service |
a04d08 |
debian_chroot="tox:$env" exec "$@"
|
|
Packit Service |
a04d08 |
|
|
Packit Service |
a04d08 |
# vi: ts=4 expandtab
|