blob: 20ee6da42ca22e8983ba25a78f0b958b27a5c35d [file] [log] [blame]
# Copyright 2024 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.
# This script must be tested on fish 3.6.0
# 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
# - pw_env_setup/util.fish
# - pw_env_setup/util.sh
#
# So please keep them matching then modifying them.
function pw_none
set_color normal
echo -e $argv
end
function pw_red
set_color red
echo -e $argv
set_color normal
end
function pw_bold_red
set_color --bold red
echo -e $argv
set_color normal
end
function pw_yellow
set_color yellow
echo -e $argv
set_color normal
end
function pw_bold_yellow
set_color --bold yellow
echo -e $argv
set_color normal
end
function pw_green
set_color green
echo -e $argv
set_color normal
end
function pw_bold_green
set_color --bold green
echo -e $argv
set_color normal
end
function pw_blue
set_color blue
echo -e $argv
set_color normal
end
function pw_cyan
set_color cyan
echo -e $argv
set_color normal
end
function pw_magenta
set_color magenta
echo -e $argv
set_color normal
end
function pw_bold_white
set_color --bold white
echo -e $argv
set_color normal
end
function pw_error
set_color --bold brred
echo -e $argv 1>&2
set_color normal
end
function pw_error_info
set_color red
echo -e $argv 1>&2
set_color normal
end
# Print an error and exit if $is_sourced == 0 (the first argument).
function pw_eval_sourced --argument-names is_sourced bootstrap_path
if test $is_sourced -eq 0
set _PW_NAME (basename $bootstrap_path)
pw_error "Error: Attempting to $_PW_NAME in a subshell"
pw_error_info " Since $_PW_NAME modifies your shell's environment"
pw_error_info " variables, it must be sourced rather than executed. In"
pw_error_info " particular, 'fish $_PW_NAME' will not work since the "
pw_error_info " modified environment will get destroyed at the end of the"
pw_error_info " script. Instead, source the script's contents in your"
pw_error_info " shell:"
pw_error_info ""
pw_error_info " \$ source $_PW_NAME"
exit 1
end
end
# Check for spaces in $_PW_ROOT (the first argument).
function pw_check_root --argument-names _PW_ROOT
if string match --quiet '* *' $_PW_ROOT
pw_error "Error: The Pigweed path contains spaces"
pw_error_info " The path '$_PW_ROOT' contains spaces. "
pw_error_info " Pigweed's Python environment currently requires Pigweed to"
pw_error_info " be at a path without spaces. Please checkout Pigweed in a"
pw_error_info " directory without spaces and retry running bootstrap."
return -1
end
end
# Check for and return the environment directory location.
function pw_get_env_root
# PW_ENVIRONMENT_ROOT allows callers 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 caller and not from a previous bootstrap
# possibly from another workspace. PW_ENVIRONMENT_ROOT will be cleared after
# environment setup completes.
if set --query PW_ENVIRONMENT_ROOT
echo $PW_ENVIRONMENT_ROOT
return
end
# Determine project-level root directory.
if set --query PW_PROJECT_ROOT
set _PW_ENV_PREFIX $PW_PROJECT_ROOT
else
set _PW_ENV_PREFIX $PW_ROOT
end
# If <root>/environment exists, use it. Otherwise, if <root>/.environment
# exists, use it. Finally, use <root>/environment.
set _PW_DOTENV $_PW_ENV_PREFIX/.environment
set _PW_ENV $_PW_ENV_PREFIX/environment
if test -d $_PW_DOTENV
if test -d $_PW_ENV
pw_error "Error: both possible environment directories exist."
pw_error_info " $_PW_DOTENV"
pw_error_info " $_PW_ENV"
pw_error_info " If only one of these folders exists it will be used for"
pw_error_info " the Pigweed environment. If neither exists"
pw_error_info " '<...>/environment' will be used. Since both exist,"
pw_error_info " bootstrap doesn't know which to use. Please delete one"
pw_error_info " or both and rerun bootstrap."
exit 1
end
end
if test -d $_PW_ENV
echo $_PW_ENV
else if test -d $_PW_DOTENV
echo $_PW_DOTENV
else
echo $_PW_ENV
end
end
set --export _PW_BANNER "\
▒█████▄ █▓ ▄███▒ ▒█ ▒█ ░▓████▒ ░▓████▒ ▒▓████▄
▒█░ █░ ░█▒ ██▒ ▀█▒ ▒█░ █ ▒█ ▒█ ▀ ▒█ ▀ ▒█ ▀█▌
▒█▄▄▄█░ ░█▒ █▓░ ▄▄░ ▒█░ █ ▒█ ▒███ ▒███ ░█ █▌
▒█▀ ░█░ ▓█ █▓ ░█░ █ ▒█ ▒█ ▄ ▒█ ▄ ░█ ▄█▌
▒█ ░█░ ░▓███▀ ▒█▓▀▓█░ ░▓████▒ ░▓████▒ ▒▓████▀
"
function _default_pw_banner_func
pw_magenta $_PW_BANNER
end
set --export _PW_BANNER_FUNC _default_pw_banner_func
function _pw_hello --argument-names _PW_TEXT
# If $PW_BANNER_FUNC is defined, use that as the banner function
# instead of the default.
if set --query PW_BANNER_FUNC
set _PW_BANNER_FUNC $PW_BANNER_FUNC
end
# Display the banner unless PW_ENVSETUP_QUIET or
# PW_ENVSETUP_NO_BANNER is set.
if test -z "$PW_ENVSETUP_QUIET" && test -z "$PW_ENVSETUP_NO_BANNER"
pw_green "\n WELCOME TO...\n"
set_color normal
$_PW_BANNER_FUNC
set_color normal
pw_green $_PW_TEXT
end
end
function pw_deactivate
# Assume PW_ROOT and PW_PROJECT_ROOT have already been set and we need to
# preserve their values.
set _NEW_PW_ROOT $PW_ROOT
set _NEW_PW_PROJECT_ROOT $PW_PROJECT_ROOT
# Find deactivate script, run it, and then delete it. This way if the
# deactivate script is doing something wrong subsequent bootstraps still
# have a chance to pass.
set _PW_DEACTIVATE_SH $_PW_ACTUAL_ENVIRONMENT_ROOT/deactivate.fish
if test -f $_PW_DEACTIVATE_SH
. $_PW_DEACTIVATE_SH
rm -f $_PW_DEACTIVATE_SH &>/dev/null
end
# If there's a _pw_deactivate function run it. Redirect output to /dev/null
# in case _pw_deactivate doesn't exist. Remove _pw_deactivate when complete.
if functions --query _pw_deactivate
_pw_deactivate >/dev/null 2>/dev/null
functions -e _pw_deactivate
end
# Restore.
set --export PW_ROOT $_NEW_PW_ROOT
set --export PW_PROJECT_ROOT $_NEW_PW_PROJECT_ROOT
end
function deactivate
pw_deactivate
functions -e pw_deactivate
functions -e deactivate
set -e PW_ROOT
set -e PW_PROJECT_ROOT
set -e PW_BRANDING_BANNER
set -e PW_BRANDING_BANNER_COLOR
end
# 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_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.fish.
function pw_bootstrap
_pw_hello " BOOTSTRAP! Bootstrap may take a few minutes; please be patient.\n"
if functions --query python
pw_error "Error: 'python' is an alias"
pw_error_info "The shell has a 'python' alias set. This causes many obscure"
pw_error_info "Python-related issues both in and out of Pigweed. Please"
pw_error_info "remove the Python alias from your shell init file or at"
pw_error_info "least run the following command before bootstrapping"
pw_error_info "Pigweed."
pw_error_info
pw_error_info " functions --erase python"
pw_error_info
return
end
# Allow forcing a specific version of Python for testing pursposes.
if test -n "$PW_BOOTSTRAP_PYTHON"
set _PW_PYTHON "$PW_BOOTSTRAP_PYTHON"
else if command -v python3 >/dev/null 2>/dev/null
set _PW_PYTHON python3
else if command -v python2 >/dev/null 2>/dev/null
set _PW_PYTHON python2
else if command -v python >/dev/null 2>/dev/null
set _PW_PYTHON python
else
pw_error "Error: No system Python present\n"
pw_error_info " Pigweed's bootstrap process requires a local system"
pw_error_info " Python. Please install Python on your system, add it to "
pw_error_info " your PATH and re-try running bootstrap."
return
end
if test -n "$_PW_ENV_SETUP"
$_PW_ENV_SETUP $argv
set _PW_ENV_SETUP_STATUS $status
else
$_PW_PYTHON $PW_ROOT/pw_env_setup/py/pw_env_setup/env_setup.py $argv
set _PW_ENV_SETUP_STATUS $status
end
# Write the directory path at bootstrap time into the directory. This helps
# us double-check things are still in the same space when calling activate.
set _PW_ENV_ROOT_TXT $_PW_ACTUAL_ENVIRONMENT_ROOT/env_root.txt
echo $_PW_ACTUAL_ENVIRONMENT_ROOT >$_PW_ENV_ROOT_TXT 2>/dev/null
# Create the environment README file. Use quotes to prevent alias expansion.
cp $PW_ROOT/pw_env_setup/destination.md $_PW_ACTUAL_ENVIRONMENT_ROOT/README.md &>/dev/null
end
function pw_activate_message
_pw_hello " ACTIVATOR! This sets your shell environment variables.\n"
set _PW_ENV_SETUP_STATUS 0
end
function pw_finalize_pre_check --argument-names _PW_NAME _PW_SETUP_SH
# Check that the environment directory agrees that the path it's at matches
# where it thinks it should be. If not, bail.
set _PW_ENV_ROOT_TXT "$_PW_ACTUAL_ENVIRONMENT_ROOT/env_root.txt"
if test -f $_PW_ENV_ROOT_TXT
set _PW_PREV_ENV_ROOT (cat $_PW_ENV_ROOT_TXT)
if test "$_PW_ACTUAL_ENVIRONMENT_ROOT" != "$_PW_PREV_ENV_ROOT"
pw_error "Error: Environment directory moved"
pw_error_info "This Pigweed environment was created at"
pw_error_info
pw_error_info " $_PW_PREV_ENV_ROOT"
pw_error_info
pw_error_info "But it is now being activated from"
pw_error_info
pw_error_info " $_PW_ACTUAL_ENVIRONMENT_ROOT"
pw_error_info
pw_error_info "This is likely because the checkout moved. After moving "
pw_error_info "the checkout a full '. ./bootstrap.fish' is required."
pw_error_info
set _PW_ENV_SETUP_STATUS 1
end
end
if test -n "$_PW_ENV_SETUP_STATUS" && test "$_PW_ENV_SETUP_STATUS" -ne 0
return
end
if not test -f "$_PW_SETUP_SH"
pw_error "Error during $_PW_NAME--see messages above."
end
end
function pw_finalize_post_check --argument-names _PW_NAME _PW_SETUP_SH
if test "$status" -eq 0
if test "$_PW_NAME" = bootstrap && test -z "$PW_ENVSETUP_QUIET"
echo "To reactivate this environment in the future, run this in your "
echo "terminal:"
echo
pw_green " source ./activate.fish"
echo
echo "To deactivate this environment, run this:"
echo
pw_green " deactivate"
echo
end
else
pw_error "Error during $_PW_NAME--see messages above."
end
end
function pw_install_post_checkout_hook
cp $PW_ROOT/pw_env_setup/post-checkout-hook.sh $PW_PROJECT_ROOT/.git/hooks/post-checkout
end
function pw_cleanup
set -e _PW_BANNER
set -e _PW_BANNER_FUNC
set -e PW_BANNER_FUNC
set -e _PW_ENV_SETUP
set -e _PW_NAME
set -e PW_ENVIRONMENT_ROOT
set -e _PW_PYTHON
set -e _PW_ENV_ROOT_TXT
set -e _PW_PREV_ENV_ROOT
set -e _PW_SETUP_SH
set -e _PW_DEACTIVATE_SH
set -e _NEW_PW_ROOT
set -e _PW_ENV_SETUP_STATUS
set -e _PW_ENV_PREFIX
set -e _PW_ENV
set -e _PW_DOTENV
functions -e pw_none
functions -e pw_red
functions -e pw_bold_red
functions -e pw_yellow
functions -e pw_bold_yellow
functions -e pw_green
functions -e pw_bold_green
functions -e pw_blue
functions -e pw_cyan
functions -e pw_magenta
functions -e pw_bold_white
functions -e pw_eval_sourced
functions -e pw_check_root
functions -e pw_get_env_root
functions -e _pw_banner
functions -e pw_bootstrap
functions -e pw_activate
functions -e pw_finalize
functions -e pw_install_post_checkout_hook
functions -e pw_cleanup
functions -e _pw_hello
functions -e pw_error
functions -e pw_error_info
end