mirror of
https://github.com/expo/turtle.git
synced 2026-11-15 09:38:07 -10:00
72 lines
1.8 KiB
Bash
Executable File
72 lines
1.8 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# expenv == dotenv-with-overrides
|
|
|
|
# Usage: expenv [-d secrets_directory] foo
|
|
# Will run `foo` with any environment variables provided by .secrets or overrides, optionally
|
|
# searching a specified directory for .secrets and overrides. The directory defaults to `pwd`.
|
|
#
|
|
# expenv will always attempt to load [secrets_directory]/.secrets before any overrides.
|
|
#
|
|
# Specify overrides with a comma-separated list in the EXPENV_OVERRIDES env var.
|
|
#
|
|
# Some example overrides and load orders:
|
|
#
|
|
# EXPENV_OVERRIDES=prod
|
|
# 1. .secrets
|
|
# 2. .secrets.prod
|
|
#
|
|
# EXPENV_OVERRIDES=local,prod
|
|
# 1. .secrets
|
|
# 2. .secrets.local
|
|
# 3. .secrets.prod
|
|
|
|
set -eo pipefail
|
|
|
|
secrets_directory="$(pwd)"
|
|
|
|
while getopts 'd:' OPTION; do
|
|
case "$OPTION" in
|
|
d)
|
|
secrets_directory="$OPTARG"
|
|
;;
|
|
|
|
?)
|
|
echo "script usage: $(basename $0) [-d secrets_directory] <command>" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
shift "$(($OPTIND -1))"
|
|
|
|
export_vars() {
|
|
local env_file="$secrets_directory/$1"
|
|
|
|
if [ -f "$env_file" ]
|
|
then
|
|
# loop over the lines of the .secrets file, which are `KEY="val"` formatted
|
|
while IFS='' read -r line || [ -n "$line" ]; do
|
|
# skip comment lines and make sure the line follows our expectations
|
|
# i don't like that this will fail silently, but seems much better than putting garbage in env
|
|
if echo "$line" | grep -E '^[A-Z0-9_]+=".+"$' >/dev/null; then
|
|
eval "export $line"
|
|
fi
|
|
done <"$env_file"
|
|
else
|
|
# this goes to stderr so machine-read stdout doesn't break
|
|
(>&2 echo "Unable to add env vars from $env_file.")
|
|
fi
|
|
}
|
|
|
|
# first lets export the vars from the base/default file
|
|
export_vars .secrets
|
|
|
|
# next process the overrides, in order
|
|
IFS=',' read -ra overrides <<< "$EXPENV_OVERRIDES"
|
|
for override in "${overrides[@]}"; do
|
|
to_export=".secrets.$override"
|
|
export_vars "$to_export"
|
|
done
|
|
|
|
eval "$@"
|