mirror of https://github.com/sbt/sbt.git
103 lines
3.6 KiB
Bash
Executable File
103 lines
3.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
|
|
# Licensed under the Apache License, Version 2.0 (see 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
|
|
|
|
PYTHON=${PYTHON:-$(which python2.7)}
|
|
|
|
PANTS_HOME="${PANTS_HOME:-${HOME}/.cache/pants/setup}"
|
|
PANTS_BOOTSTRAP="${PANTS_HOME}/bootstrap-$(uname -s)-$(uname -m)"
|
|
|
|
VENV_VERSION=15.0.2
|
|
|
|
# This requirement is installed before pantsbuild.pants to hack around
|
|
# interpreters that have newer setuptools already installed, effectively
|
|
# re-installing an older setuptools and pinning low to a version known to be
|
|
# ingestable by both pants and pex for all reasonable versions of pants.
|
|
# See:
|
|
# https://github.com/pantsbuild/pants/issues/3948
|
|
# https://github.com/pantsbuild/setup/issues/14
|
|
# https://github.com/pantsbuild/setup/issues/19
|
|
SETUPTOOLS_REQUIREMENT="setuptools==5.4.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
|
|
(
|
|
# NB: We setup the virtualenv with no setuptools to ensure our
|
|
# ${SETUPTOOLS_REQUIREMENT} wins.
|
|
venv_path="$(bootstrap_venv)" && \
|
|
staging_dir=$(tempdir "${PANTS_BOOTSTRAP}") && \
|
|
"${PYTHON}" "${venv_path}/virtualenv.py" --no-setuptools --no-download \
|
|
"${staging_dir}/install" && \
|
|
"${staging_dir}/install/bin/python" \
|
|
"${staging_dir}/install/bin/pip" install \
|
|
"${SETUPTOOLS_REQUIREMENT}" && \
|
|
"${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" "$@"
|