| #!/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. | |
| # =============================== NOTE =============================== | |
| # This pants bootstrap script comes from the pantsbuild/setup | |
| # project and is intended to be checked into your code repository so | |
| # that any developer can check out your code and be building it with | |
| # pants with no prior setup needed. | |
| # | |
| # You can learn more here: https://pantsbuild.github.io/setup | |
| # ==================================================================== | |
| set -e | |
| # AURORA-1717: If the PYTHONPATH is tainted, calling `./pants` may fail | |
| # with `ImportError: No module named pants.bin.pants_exe` | |
| unset PYTHONPATH | |
| PYTHON=${PYTHON:-$(which python2.7)} | |
| PANTS_HOME="${PANTS_HOME:-${HOME}/.cache/pants/setup}" | |
| PANTS_BOOTSTRAP="${PANTS_HOME}/bootstrap-$(uname -s)-$(uname -m)" | |
| VENV_VERSION=16.6.1 | |
| VENV_PACKAGE=virtualenv-${VENV_VERSION} | |
| VENV_TARBALL=${VENV_PACKAGE}.tar.gz | |
| # The high-level flow: | |
| # 1.) Grab pants version from pants.ini or default to latest. | |
| # 2.) Check for a venv via a naming/path convention and execute if found. | |
| # 3.) Otherwise create venv and re-exec self. | |
| # | |
| # After that pants itself will handle making sure any requested plugins | |
| # are installed and up to date. | |
| function tempdir { | |
| mktemp -d "$1"/pants.XXXXXX | |
| } | |
| # TODO(John Sirois): GC race loser tmp dirs leftover from bootstrap_XXX | |
| # functions. Any tmp dir w/o a symlink pointing to it can go. | |
| function bootstrap_venv { | |
| if [[ ! -d "${PANTS_BOOTSTRAP}/${VENV_PACKAGE}" ]] | |
| then | |
| ( | |
| mkdir -p "${PANTS_BOOTSTRAP}" && \ | |
| staging_dir=$(tempdir "${PANTS_BOOTSTRAP}") && \ | |
| cd "${staging_dir}" && \ | |
| curl -LO https://pypi.io/packages/source/v/virtualenv/${VENV_TARBALL} && \ | |
| tar -xzf ${VENV_TARBALL} && \ | |
| ln -s "${staging_dir}/${VENV_PACKAGE}" "${staging_dir}/latest" && \ | |
| mv "${staging_dir}/latest" "${PANTS_BOOTSTRAP}/${VENV_PACKAGE}" | |
| ) 1>&2 | |
| fi | |
| echo "${PANTS_BOOTSTRAP}/${VENV_PACKAGE}" | |
| } | |
| function bootstrap_pants { | |
| pants_requirement="pantsbuild.pants" | |
| pants_version=$( | |
| grep -E "^[[:space:]]*pants_version" pants.ini 2>/dev/null | \ | |
| cut -f2 -d: | tr -d " " | |
| ) | |
| if [[ -n "${pants_version}" ]] | |
| then | |
| pants_requirement="${pants_requirement}==${pants_version}" | |
| else | |
| pants_version="unspecified" | |
| fi | |
| if [[ ! -d "${PANTS_BOOTSTRAP}/${pants_version}" ]] | |
| then | |
| ( | |
| venv_path="$(bootstrap_venv)" && \ | |
| staging_dir=$(tempdir "${PANTS_BOOTSTRAP}") && \ | |
| "${PYTHON}" "${venv_path}/virtualenv.py" --no-download "${staging_dir}/install" && \ | |
| "${staging_dir}/install/bin/python" "${staging_dir}/install/bin/pip" install "${pants_requirement}" && \ | |
| ln -s "${staging_dir}/install" "${staging_dir}/${pants_version}" && \ | |
| mv "${staging_dir}/${pants_version}" "${PANTS_BOOTSTRAP}/${pants_version}" | |
| ) 1>&2 | |
| fi | |
| echo "${PANTS_BOOTSTRAP}/${pants_version}" | |
| } | |
| pants_dir=$(bootstrap_pants) && \ | |
| exec "${pants_dir}/bin/python" "${pants_dir}/bin/pants" "$@" |