Blame tools/tox-venv

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