Files
unstract/dev-env-cli.sh
Chandrasekharan M 189ef5bf64 fix: Fixed use of --force within dev env script (#194)
Fixed use of --force within dev env script

Co-authored-by: Neha <115609453+nehabagdia@users.noreply.github.com>
2024-04-02 09:43:32 +05:30

318 lines
8.6 KiB
Bash
Executable File

#!/usr/bin/env bash
set -o nounset # exit if a variable is not set
set -o errexit # exit for any command failure"
# text color escape codes (\033 == \e but OSX doesn't respect the \e)
blue_text='\033[94m'
green_text='\033[32m'
red_text='\033[31m'
default_text='\033[39m'
# set -x/xtrace uses PS4 for more info
PS4="$blue_text""${0}:${LINENO}: ""$default_text"
debug() {
if [ "$opt_verbose" = true ]; then
echo $1
fi
}
check_dependencies() {
if ! command -v python3 &> /dev/null; then
echo "$red_text""python3 not found. Exiting.""$default_text"
exit 1
fi
if ! command -v docker compose &> /dev/null; then
echo "$red_text""docker not found. Exiting.""$default_text"
exit 1
fi
# For 'docker compose' vs 'docker-compose', see https://stackoverflow.com/a/66526176.
if command -v docker compose &> /dev/null; then
docker_compose_cmd="docker compose"
elif command -v docker-compose &> /dev/null; then
docker_compose_cmd="docker-compose"
else
echo "$red_text""Both 'docker compose' and 'docker-compose' not found. Exiting.""$default_text"
exit 1
fi
if ! command -v pdm &> /dev/null; then
echo "$red_text""pdm not found. Exiting.""$default_text"
exit 1
fi
}
display_banner() {
# Make sure the console is huge
if test $(tput cols) -ge 64; then
echo " █████ █████"
echo "░░███ ░░███ "
echo " ░███ ░███ "
echo " ░███ ░███ "
echo " ░███ ░███ "
echo " ░███ ░███ "
echo " ░░█████████ >UNSTRACT COMMUNITY EDITION"
echo " ░░░░░░░░░ "
echo ""
sleep 1
fi
}
display_help() {
printf "Dev environment CLI for Unstract platform services\n"
echo
echo -e "Syntax: $0 [options] -s service"
echo -e "Options:"
echo -e " -h, --help Display help information"
echo -e " -e, --setup-venv Setup venv (requires service)"
echo -e " -a, --activate-venv Activate venv (requires service)"
echo -e " -i, --install-deps Install dependencies in venv (requires service)"
echo -e " -d, --destroy-venv Destroy venv (requires service)"
echo -e " -p, --install-pre-commit-hook Install Git pre-commit hook"
echo -e " -r, --run-pre-commit-hook Run Git pre-commit hook"
echo -e " -f, --force Force operation"
echo -e " -s, --service Service name"
echo -e " -x, --trace Enables trace mode"
echo -e " -V, --verbose Print verbose logs"
echo -e ""
}
parse_args() {
while [[ $# -gt 0 ]]; do
arg="$1"
case $arg in
-h | --help)
display_help
exit
;;
-e | --setup-venv)
opt_setup_venv=true
;;
-a | --activate-venv)
opt_activate_venv=true
;;
-i | --install-deps)
opt_install_deps=true
;;
-d | --destroy-venv)
opt_destroy_venv=true
;;
-p | --install-pre-commit-hook)
opt_install_pre_commit_hook=true
;;
-r | --run-pre-commit-hook)
opt_run_pre_commit_hook=true
;;
-f | --force)
opt_force="--force"
;;
-s | --service)
if [ -z "${2-}" ]; then
echo "No service specified."
echo
display_help
exit
else
opt_service="$2"
fi
shift
;;
-x | --trace)
set -o xtrace # display every line before execution; enables PS4
;;
-V | --verbose)
opt_verbose=true
;;
*)
echo "'$1' is not a known command."
echo
display_help
exit
;;
esac
shift
done
if [ "$opt_install_pre_commit_hook" = false ] && [ "$opt_run_pre_commit_hook" = false ]; then
if [ "$opt_service" = "" ]; then
echo "No service specified."
echo
display_help
exit
fi
ret=$(echo ${services[@]} | grep -ow "$opt_service" | wc -w)
if [ $ret -eq 0 ]; then
echo "Unknown service '$opt_service'."
echo
display_help
exit
fi
fi
if [ "$opt_setup_venv" = false ] && [ "$opt_activate_venv" = false ] &&
[ "$opt_install_deps" = false ] && [ "$opt_destroy_venv" = false ] &&
[ "$opt_install_pre_commit_hook" = false ] && [ "$opt_run_pre_commit_hook" = false ]; then
echo "One of -e,-a,-i,-d,-p,-r options should be specified."
echo
display_help
exit
fi
debug "OPTION setup venv: $opt_setup_venv"
debug "OPTION activate venv: $opt_activate_venv"
debug "OPTION install deps: $opt_install_deps"
debug "OPTION destroy venv: $opt_destroy_venv"
debug "OPTION install pre-commit hook: $opt_install_pre_commit_hook"
debug "OPTION run pre-commit hook: $opt_run_pre_commit_hook"
debug "OPTION service: $opt_service"
debug "OPTION verbose: $opt_verbose"
}
setup_venv() {
if [ "$opt_setup_venv" = false ]; then
return
fi
pushd ${script_dir}/$opt_service 1>/dev/null
if [ -e "package.json" ]; then
echo -e "Nothing to do for ""$blue_text""$opt_service""$default_text"
elif [ -e "pyproject.toml" ]; then
echo -e "Setting up ""$blue_text""Python venv""$default_text"" for ""$blue_text""$opt_service""$default_text"
pdm venv create -w virtualenv --with-pip $opt_force
fi
popd 1>/dev/null
}
activate_venv() {
if [ "$opt_activate_venv" = false ]; then
return
fi
pushd ${script_dir}/$opt_service 1>/dev/null
if [ -e "package.json" ]; then
echo -e "Nothing to do for ""$blue_text""$opt_service""$default_text"
elif [ -e "pyproject.toml" ]; then
if [ ! -e ".venv" ]; then
echo -e "venv not found for ""$blue_text""$opt_service""$default_text"". Please run setup first."
return
fi
echo -e "Run the following in a ""$blue_text""new terminal""$default_text"" to activate venv for ""$blue_text""$opt_service""$default_text"":"
echo ""
echo "cd ${script_dir}/$opt_service"
echo "eval \"$(pdm venv activate in-project)\""
fi
popd 1>/dev/null
}
install_deps() {
if [ "$opt_install_deps" = false ]; then
return
fi
pushd ${script_dir}/$opt_service 1>/dev/null
if [ -e "package.json" ]; then
echo -e "Installing dependencies for ""$blue_text""$opt_service""$default_text"
npm ci
elif [ -e "pyproject.toml" ]; then
if [ ! -e ".venv" ]; then
echo -e "venv not found for ""$blue_text""$opt_service""$default_text"". Please run setup first."
return
fi
echo -e "Installing dependencies in venv for ""$blue_text""$opt_service""$default_text"
eval "$(pdm venv activate in-project)"
pdm sync
fi
popd 1>/dev/null
}
destroy_venv() {
if [ "$opt_destroy_venv" = false ]; then
return
fi
pushd ${script_dir}/$opt_service 1>/dev/null
if [ -e "package.json" ]; then
echo -e "$blue_text""Nothing to do for $opt_service""$default_text"
elif [ -e "pyproject.toml" ]; then
if [ ! -e ".venv" ]; then
echo -e "venv not found for ""$blue_text""$opt_service""$default_text"". Please run setup first."
return
fi
echo -e "Destroying venv for ""$blue_text""$opt_service""$default_text"
pdm venv remove in-project
fi
popd 1>/dev/null
}
install_pre_commit_hook() {
if [ "$opt_install_pre_commit_hook" = false ]; then
return
fi
pushd ${script_dir} 1>/dev/null
echo -e "Installing ""$blue_text""Git pre-commit hook""$default_text"
pdm venv create -w virtualenv --with-pip $opt_force
eval $(pdm venv activate in-project)
pdm sync --dev -G lint -G hook-check-django-migrations
pre-commit install
popd 1>/dev/null
}
run_pre_commit_hook() {
if [ "$opt_run_pre_commit_hook" = false ]; then
return
fi
pushd ${script_dir} 1>/dev/null
if [ ! -e ".venv" ]; then
echo -e "$blue_text""Git pre-commit hook""$default_text"" not found. Please run install first."
return
fi
eval "$(pdm venv activate in-project)"
pre-commit run
popd 1>/dev/null
}
#
# Run Unstract platform - BEGIN
#
check_dependencies
opt_setup_venv=false
opt_activate_venv=false
opt_install_deps=false
opt_destroy_venv=false
opt_install_pre_commit_hook=false
opt_run_pre_commit_hook=false
opt_force=""
opt_service=""
opt_verbose=false
script_dir=$(dirname "$(readlink -f "$BASH_SOURCE")")
# Extract service names from docker compose file.
services=($(VERSION="latest" $docker_compose_cmd -f $script_dir/docker/docker-compose.build.yaml config --services))
display_banner
parse_args $*
setup_venv
activate_venv
install_deps
destroy_venv
install_pre_commit_hook
run_pre_commit_hook
#
# Run Unstract platform - END
#