# 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 /environment exists, use it. Otherwise, if /.environment # exists, use it. Finally, use /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