mirror of
https://fuchsia.googlesource.com/third_party/pigweed.googlesource.com/pigweed/pigweed
synced 2024-09-21 14:16:26 +00:00
061f97248f
Add deactivate steps to the environment itself and not just to the environment folder. This means deactivate can still be run even if the environment folder has been deleted. Bug: 278 Change-Id: I2169d9b8c4282b97645d3c7f3385f1d9b94f0171 Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/23022 Commit-Queue: Auto-Submit <auto-submit@pigweed.google.com.iam.gserviceaccount.com> Pigweed-Auto-Submit: Rob Mohr <mohrr@google.com> Reviewed-by: Wyatt Hepler <hepler@google.com>
262 lines
7.3 KiB
Bash
262 lines
7.3 KiB
Bash
# Copyright 2020 The Pigweed Authors
|
|
#
|
|
# 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
|
|
#
|
|
# https://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.
|
|
|
|
_pw_abspath () {
|
|
python -c "import os.path; print(os.path.abspath('$@'))"
|
|
}
|
|
|
|
|
|
# Note: Colors are unfortunately duplicated in several places; and removing the
|
|
# duplication is not easy. Their locations are:
|
|
#
|
|
# - bootstrap.sh
|
|
# - pw_cli/color.py
|
|
# - pw_env_setup/py/pw_env_setup/colors.py
|
|
#
|
|
# So please keep them matching then modifying them.
|
|
pw_none() {
|
|
echo -e "$*"
|
|
}
|
|
|
|
pw_red() {
|
|
echo -e "\033[0;31m$*\033[0m"
|
|
}
|
|
|
|
pw_bold_red() {
|
|
echo -e "\033[1;31m$*\033[0m"
|
|
}
|
|
|
|
pw_yellow() {
|
|
echo -e "\033[0;33m$*\033[0m"
|
|
}
|
|
|
|
pw_bold_yellow() {
|
|
echo -e "\033[1;33m$*\033[0m"
|
|
}
|
|
|
|
pw_green() {
|
|
echo -e "\033[0;32m$*\033[0m"
|
|
}
|
|
|
|
pw_bold_green() {
|
|
echo -e "\033[1;32m$*\033[0m"
|
|
}
|
|
|
|
pw_blue() {
|
|
echo -e "\033[1;34m$*\033[0m"
|
|
}
|
|
|
|
pw_cyan() {
|
|
echo -e "\033[1;36m$*\033[0m"
|
|
}
|
|
|
|
pw_magenta() {
|
|
echo -e "\033[0;35m$*\033[0m"
|
|
}
|
|
|
|
pw_bold_white() {
|
|
echo -e "\033[1;37m$*\033[0m"
|
|
}
|
|
|
|
pw_eval_sourced() {
|
|
if [ "$1" -eq 0 ]; then
|
|
_PW_NAME=$(basename "$PW_SETUP_SCRIPT_PATH" .sh)
|
|
pw_bold_red "Error: Attempting to $_PW_NAME in a subshell"
|
|
pw_red " Since $_PW_NAME.sh modifies your shell's environment variables,"
|
|
pw_red " it must be sourced rather than executed. In particular, "
|
|
pw_red " 'bash $_PW_NAME.sh' will not work since the modified "
|
|
pw_red " environment will get destroyed at the end of the script. "
|
|
pw_red " Instead, source the script's contents in your shell:"
|
|
pw_red ""
|
|
pw_red " \$ source $_PW_NAME.sh"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
pw_check_root() {
|
|
_PW_ROOT="$1"
|
|
if [[ "$_PW_ROOT" = *" "* ]]; then
|
|
pw_bold_red "Error: The Pigweed path contains spaces\n"
|
|
pw_red " The path '$_PW_ROOT' contains spaces. "
|
|
pw_red " Pigweed's Python environment currently requires Pigweed to be "
|
|
pw_red " at a path without spaces. Please checkout Pigweed in a "
|
|
pw_red " directory without spaces and retry running bootstrap."
|
|
return
|
|
fi
|
|
}
|
|
|
|
pw_get_env_root() {
|
|
# PW_ENVIRONMENT_ROOT allows developers to specify where the environment
|
|
# should be installed. bootstrap.sh scripts should not use that variable to
|
|
# store the result of this function. This separation allows scripts to assume
|
|
# PW_ENVIRONMENT_ROOT came from the developer and not from a previous
|
|
# bootstrap possibly from another workspace.
|
|
if [ -z "$PW_ENVIRONMENT_ROOT" ]; then
|
|
echo "$PW_ROOT/.environment"
|
|
else
|
|
echo "$PW_ENVIRONMENT_ROOT"
|
|
fi
|
|
}
|
|
|
|
# Note: This banner is duplicated in three places; which is a lesser evil than
|
|
# the contortions that would be needed to share this snippet across shell,
|
|
# batch, and Python. Locations:
|
|
#
|
|
# - pw_env_setup/util.sh
|
|
# - pw_cli/branding.py
|
|
# - pw_env_setup/py/pw_env_setup/windows_env_start.py
|
|
#
|
|
_PW_BANNER=$(cat <<EOF
|
|
▒█████▄ █▓ ▄███▒ ▒█ ▒█ ░▓████▒ ░▓████▒ ▒▓████▄
|
|
▒█░ █░ ░█▒ ██▒ ▀█▒ ▒█░ █ ▒█ ▒█ ▀ ▒█ ▀ ▒█ ▀█▌
|
|
▒█▄▄▄█░ ░█▒ █▓░ ▄▄░ ▒█░ █ ▒█ ▒███ ▒███ ░█ █▌
|
|
▒█▀ ░█░ ▓█ █▓ ░█░ █ ▒█ ▒█ ▄ ▒█ ▄ ░█ ▄█▌
|
|
▒█ ░█░ ░▓███▀ ▒█▓▀▓█░ ░▓████▒ ░▓████▒ ▒▓████▀
|
|
EOF
|
|
)
|
|
|
|
_pw_banner() {
|
|
if [ -z "$PW_ENVSETUP_QUIET" ] && [ -z "$PW_ENVSETUP_NO_BANNER" ]; then
|
|
pw_magenta "$_PW_BANNER\n"
|
|
fi
|
|
}
|
|
|
|
_PW_BANNER_FUNC="_pw_banner"
|
|
|
|
_pw_hello() {
|
|
_PW_TEXT="$1"
|
|
if [ -n "$PW_BANNER_FUNC" ]; then
|
|
_PW_BANNER_FUNC="$PW_BANNER_FUNC"
|
|
fi
|
|
if [ -z "$PW_ENVSETUP_QUIET" ]; then
|
|
pw_green "\n WELCOME TO...\n"
|
|
"$_PW_BANNER_FUNC"
|
|
pw_green "$_PW_TEXT"
|
|
fi
|
|
}
|
|
|
|
pw_deactivate() {
|
|
# Assume PW_ROOT has already been set and we need to preserve its value.
|
|
_NEW_PW_ROOT="$PW_ROOT"
|
|
|
|
# Find deactivate script and run it.
|
|
_PW_DEACTIVATE_SH="$_PW_ACTUAL_ENVIRONMENT_ROOT/deactivate.sh"
|
|
if [ -f "$_PW_DEACTIVATE_SH" ]; then
|
|
. "$_PW_DEACTIVATE_SH"
|
|
fi
|
|
|
|
# If there's a _pw_deactivate function run it. Redirect output to /dev/null
|
|
# in case _pw_deactivate doesn't exist.
|
|
_pw_deactivate &> /dev/null
|
|
|
|
# Restore PW_ROOT.
|
|
PW_ROOT="$_NEW_PW_ROOT"
|
|
export PW_ROOT
|
|
}
|
|
|
|
# The next three functions use the following variables.
|
|
# * PW_BANNER_FUNC: function to print banner
|
|
# * PW_BOOTSTRAP_PYTHON: specific Python interpreter to use for bootstrap
|
|
# * PW_USE_GCS_ENVSETUP: attempt to grab env setup executable from GCS if "true"
|
|
# * PW_ROOT: path to Pigweed root
|
|
# * PW_ENVSETUP_QUIET: limit output if "true"
|
|
#
|
|
# All arguments passed in are passed on to env_setup.py in pw_bootstrap,
|
|
# pw_activate takes no arguments, and pw_finalize takes the name of the script
|
|
# "bootstrap" or "activate" and the path to the setup script written by
|
|
# bootstrap.sh.
|
|
pw_bootstrap() {
|
|
_pw_hello " BOOTSTRAP! Bootstrap may take a few minutes; please be patient.\n"
|
|
|
|
# Allow forcing a specific version of Python for testing pursposes.
|
|
if [ -n "$PW_BOOTSTRAP_PYTHON" ]; then
|
|
_PW_PYTHON="$PW_BOOTSTRAP_PYTHON"
|
|
elif which python &> /dev/null; then
|
|
_PW_PYTHON=python
|
|
else
|
|
pw_bold_red "Error: No system Python present\n"
|
|
pw_red " Pigweed's bootstrap process requires a local system Python."
|
|
pw_red " Please install Python on your system, add it to your PATH"
|
|
pw_red " and re-try running bootstrap."
|
|
return
|
|
fi
|
|
|
|
if [ -n "$PW_USE_GCS_ENVSETUP" ]; then
|
|
_PW_ENV_SETUP="$("$PW_ROOT/pw_env_setup/get_pw_env_setup.sh")"
|
|
fi
|
|
|
|
if [ -n "$_PW_ENV_SETUP" ]; then
|
|
"$_PW_ENV_SETUP" "$@"
|
|
else
|
|
"$_PW_PYTHON" "$PW_ROOT/pw_env_setup/py/pw_env_setup/env_setup.py" "$@"
|
|
fi
|
|
}
|
|
|
|
pw_activate() {
|
|
_pw_hello " ACTIVATOR! This sets your shell environment variables.\n"
|
|
}
|
|
|
|
pw_finalize() {
|
|
_PW_NAME="$1"
|
|
_PW_SETUP_SH="$2"
|
|
if [ -f "$_PW_SETUP_SH" ]; then
|
|
. "$_PW_SETUP_SH"
|
|
|
|
if [ "$?" -eq 0 ]; then
|
|
if [ "$_PW_NAME" = "bootstrap" ] && [ -z "$PW_ENVSETUP_QUIET" ]; then
|
|
echo "To activate this environment in the future, run this in your "
|
|
echo "terminal:"
|
|
echo
|
|
pw_green " source ./activate.sh\n"
|
|
fi
|
|
else
|
|
pw_red "Error during $_PW_NAME--see messages above."
|
|
fi
|
|
else
|
|
pw_red "Error during $_PW_NAME--see messages above."
|
|
fi
|
|
}
|
|
|
|
pw_cleanup() {
|
|
unset _PW_BANNER
|
|
unset _PW_BANNER_FUNC
|
|
unset _PW_ENV_SETUP
|
|
unset _PW_NAME
|
|
unset _PW_PYTHON
|
|
unset _PW_SETUP_SH
|
|
unset _PW_DEACTIVATE_SH
|
|
unset _NEW_PW_ROOT
|
|
|
|
unset _pw_abspath
|
|
unset pw_none
|
|
unset pw_red
|
|
unset pw_bold_red
|
|
unset pw_yellow
|
|
unset pw_bold_yellow
|
|
unset pw_green
|
|
unset pw_bold_green
|
|
unset pw_blue
|
|
unset pw_cyan
|
|
unset pw_magenta
|
|
unset pw_bold_white
|
|
unset pw_eval_sourced
|
|
unset pw_check_root
|
|
unset pw_get_env_root
|
|
unset _pw_banner
|
|
unset pw_bootstrap
|
|
unset pw_activate
|
|
unset pw_finalize
|
|
unset _pw_cleanup
|
|
}
|