#!/bin/bash
# Copyright 2017 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Starts a python interpreter in virtualenv.
#
# This script will set up a virtualenv when it has not been created yet and
# executes the Python interpreter.
#
# The canonical version of this script is in infra_virtualenv repository.
# See infra_virtualenv/README.md about how to adopt virtualenv to your project.

set -eu

# Change this constant to the path(s) to infra_virtualenv directory when you
# copy this script to other repos.
# A path can be a relative path from this script, or an absolute path. If this
# array contains multiple paths, they are searched in the listed order.
readonly -a infra_virtualenv_paths=(
    ".."
)

readonly bin_dir="$(readlink -e -- "$(dirname -- "$0")")"
if [[ ! -d "${bin_dir}" ]]; then
    echo "ERROR: Can not locate the location of python_env!" >&2
    exit 1
fi

realpath() {
    pushd "${bin_dir}" > /dev/null 2>&1
    readlink -e -- "$1"
    popd > /dev/null 2>&1
}

find_create_venv() {
    local p
    for p in "${infra_virtualenv_paths[@]}"; do
        local create_venv=$(realpath "${p}/bin/create_venv")
        if [[ -f "${create_venv}" ]]; then
            echo "${create_venv}"
            break
        fi
    done
}

readonly create_venv=$(find_create_venv)
if [[ ! -f "${create_venv}" ]]; then
    cat <<EOF >&2
ERROR: create_venv script could not be located.
You need to update a constant inside python_venv, or your checkout might be
incomplete.
EOF
    exit 1
fi

readonly extra_imports_dir=$(realpath ../venv)
if [[ ! -d "${extra_imports_dir}" ]]; then
    cat <<EOF >&2
ERROR: venv directory is not found at ${bin_dir}/..
See infra_virtualenv/README.md for details.
EOF
    exit 1
fi

readonly venv_dir=$("${create_venv}" "${extra_imports_dir}/requirements.txt")
if [[ ! -d "${venv_dir}" ]]; then
    echo "ERROR: Failed to set up a virtualenv." >&2
    exit 1
fi

export PYTHONPATH="${extra_imports_dir}"
exec "${venv_dir}/bin/python" "$@"
