third_party.pigweed.src/pw_env_setup/util.sh
Rob Mohr 061f97248f pw_env_setup: Add deactivate steps to environment
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>
2020-10-30 23:31:17 +00:00

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
}