#!/usr/bin/env bash
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Wrapper script for self-bootstrapping rbt.
set -e

HERE=$(cd `dirname "${BASH_SOURCE[0]}"` && pwd)
RBTOOLS_VERSION=0.7.5
if ! [ -f "$HERE/build-support/rbt.venv/BOOTSTRAPPED" ] || \
    [ x`cat "$HERE/build-support/rbt.venv/BOOTSTRAPPED"` != x$RBTOOLS_VERSION ]; then

  echo Bootstrapping rbtools @ $RBTOOLS_VERSION
  rm -fr "$HERE/build-support/rbt.venv"
  "$HERE/build-support/virtualenv" "$HERE/build-support/rbt.venv"
  source "$HERE/build-support/rbt.venv/bin/activate"
  python -m pip install --use-wheel "RBTools==$RBTOOLS_VERSION"
  echo $RBTOOLS_VERSION > "$HERE/build-support/rbt.venv/BOOTSTRAPPED"
fi
source "$HERE/build-support/rbt.venv/bin/activate"
exec rbt "$@"
