#!/bin/sh
# vi: ts=4 expandtab

error() { echo "$@" 1>&2; }
fail() { [ $# -eq 0 ] || error "$@"; exit 1; }
list_environments() {
    local tox_d="$1" tox_ini="$2" prefix="  "
    envs=$(tox -c "$tox_ini" --listenvs) || return 1
    ( 
        cd "$tox_d" &&
        for d in ${envs}; do
            [ -f "$d/bin/activate" ] && s="*" || s=""
            echo "${prefix}$d$s";
        done
    )
}

Usage() {
    local tox_d="$1" tox_ini="$2"
    cat <<EOF
Usage: ${0##*/} [--no-create] tox-environment [command [args]]
   run command with provided arguments in the provided tox environment
   command defaults to \${SHELL:-/bin/sh}.

   run with '--list' to show available environments
EOF
    if [ -d "$tox_d" -a -f "$tox_ini" ]; then
        echo
        echo "existing environments in $tox_d"
        list_environments "$tox_d" "$tox_ini"
    fi
}

if [ -f tox.ini -a -d .tox ]; then
    tox_d="./.tox"
    tox_ini="$PWD/tox.ini"
else
    tox_d="${0%/*}/../.tox"
    tox_ini="${0%/*}/../tox.ini"
fi

[ $# -eq 0 ] && { Usage "$tox_d" "$tox_ini" 1>&2; exit 1; }
[ "$1" = "-h" -o "$1" = "--help" ] && { Usage "$tox_d" "$tox_ini"; exit 0; }

[ -d "$tox_d" ] || fail "$tox_d: not a dir. maybe run 'tox'?"
[ -f "$tox_ini" ] || fail "$tox_ini: did not find tox.ini"

if [ "$1" = "-l" -o "$1" = "--list" ]; then
    list_environments "$tox_d" "$tox_ini"
    exit
fi

nocreate="false"
if [ "$1" = "--no-create" ]; then
    nocreate="true"
    shift
fi

env="$1"
shift
activate="$tox_d/$env/bin/activate"

if [ ! -f "$activate" ]; then
    if $nocreate; then
        fail "tox env '$env' did not exist, and no-create specified"
    elif list_environments "$tox_d" "$tox_ini" | grep -q " $env$"; then
        error "attempting to create $env:"
        error "    tox -c $tox_ini --recreate --notest -e $env"
        tox -c "$tox_ini" --recreate --notest -e "$env" ||
            fail "failed creation of env $env"
    else
        error "$env: not a valid tox environment?"
        error "found tox_d=$tox_d"
        error "try one of:"
        list_environments "$tox_d" "$tox_ini" 1>&2
        fail
    fi
fi
. "$activate"

[ "$#" -gt 0 ] || set -- ${SHELL:-/bin/bash}
debian_chroot="tox:$env" exec "$@"
