diff --git a/backend/setup-dev-env.sh b/backend/setup-dev-env.sh index d7257648..0eaa03a0 100755 --- a/backend/setup-dev-env.sh +++ b/backend/setup-dev-env.sh @@ -5,33 +5,10 @@ # backend can only be built and run if the database is also running, due to # sqlx. -# Create .env file. -env_file=.env -if [ -f "$env_file" ]; then - while true; do - printf "You already have a $env_file file, are you sure you want to continue, as this will override your $env_file file? [yn] " - read -r answer - case "$answer" in - y) - # Continue with execution. - break - ;; - n) - echo "Aborting" - exit 0 - ;; - *) - # Try again. - echo "Invalid answer. Please type either 'y' for yes, or 'n' for no." - continue - ;; - esac - done -fi - -echo "Overwriting $env_file file" - -cat << 'EOF' > "$env_file" +# Write .env file to temporary file. +tmp_env_file="$(mktemp)" +trap 'rm -rf "$tmp_env_file"' EXIT INT TERM +cat << 'EOF' > "$tmp_env_file" DATABASE_URL="postgres://user:password@localhost:5432/chaos" JWT_SECRET="test_secret" GOOGLE_CLIENT_ID="test" @@ -44,6 +21,35 @@ S3_ENDPOINT="https://chaos-storage.s3.ap-southeast-1.amazonaws.com" S3_REGION_NAME="ap-southeast-1" EOF +# Check the user has all required tools installed. +for cmd in "which cargo" "which docker && docker info" "which docker-compose || docker compose"; do + if ! eval "$cmd" 1>/dev/null 2>&1; then + echo "The command '$cmd' failed, indicating you might not have that tool installed." >&2 + exit 1 + fi +done + +# Create .env file. +env_file=.env + +# The .env file already exists. +if [ -f "$env_file" ]; then + # If existing env file differs from new one, save the existing env file to a backup file. + if ! diff "$env_file" "$tmp_env_file" > /dev/null; then + backup_env_file="$env_file" + while [ -f "$backup_env_file" ]; do + # Append `.backup` to backup filename until we find a filename that doesn't exist yet. + backup_env_file="$backup_env_file.backup" + done + + echo "Saving existing env file '$env_file' to backup env file '$backup_env_file'" + mv "$env_file" "$backup_env_file" + fi +fi + +echo "Overwriting $env_file file" +cp "$tmp_env_file" "$env_file" + # Install sqlx if it isn't installed yet. if ! which sqlx >/dev/null; then echo "Installing sqlx" @@ -58,10 +64,10 @@ docker_compose_file_name="setup-test-database.yml" docker_compose_file_path="$this_script_dir/$docker_compose_file_name" echo 'Starting up postgres database in docker' -docker-compose -f "$docker_compose_file_path" up --detach +docker-compose -f "$docker_compose_file_path" up --detach || exit 1 # Ensure the docker container gets killed once this script exits. -trap 'echo "shutting down $docker_compose_file_path" && docker-compose -f "$docker_compose_file_path" down' EXIT +trap 'echo "shutting down $docker_compose_file_path" && docker-compose -f "$docker_compose_file_path" down' EXIT INT TERM # Wait for the database to be ready. echo "Waiting for database to be ready" @@ -69,7 +75,7 @@ sleep 3 # Setup sqlx. echo "Setting up sqlx" -sqlx database create -sqlx migrate run +sqlx database create || exit 1 +sqlx migrate run || exit 1 "$SHELL"