mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2026-11-08 19:56:53 +00:00
134 lines
5.3 KiB
Bash
Executable File
134 lines
5.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# shellcheck shell=bash
|
|
#
|
|
# Sources `.env` (auto-generates via `python -m cli.meta.env` if missing)
|
|
# with setdefault semantics: caller-set values win over `.env` defaults.
|
|
# Idempotent (INFINITO_ENV_LOADED). INFINITO_ENV_GENERATING short-circuits
|
|
# re-entry from generator subshells (BASH_ENV would otherwise recurse).
|
|
# PYTHON/PATH are re-resolved on every source so a venv created mid-chain wins;
|
|
# caller-set values are snapshotted and restored after the bulk .env source.
|
|
# INFINITO_CONTAINER, INFINITO_PARENT_IMAGE and INFINITO_IMAGE derive from the
|
|
# distro: a caller INFINITO_DISTRO other than the one `.env` was generated for
|
|
# loads a set generated for that distro instead, and `.env` stays untouched.
|
|
|
|
# zsh cannot run this loader's bash-isms (BASH_SOURCE, ${!indirect}, assoc-array
|
|
# key expansion). When sourced from zsh, delegate to bash and import the
|
|
# resulting INFINITO_*/PYTHON/VENV/PATH back into the current shell. The zsh-only
|
|
# ${(%):-%x} (this file's path) is hidden behind eval so bash still parses fine.
|
|
if [ -n "${ZSH_VERSION:-}" ]; then
|
|
_infinito_zsh_self=""
|
|
eval '_infinito_zsh_self=${(%):-%x}'
|
|
_infinito_zsh_root="$(cd "$(dirname "${_infinito_zsh_self}")/../../.." && pwd)"
|
|
while IFS= read -r _infinito_zsh_line; do
|
|
case "${_infinito_zsh_line}" in
|
|
INFINITO_*=* | PYTHON=* | VENV=* | PATH=*)
|
|
_infinito_zsh_key="${_infinito_zsh_line%%=*}"
|
|
_infinito_zsh_val="${_infinito_zsh_line#*=}"
|
|
export "${_infinito_zsh_key}=${_infinito_zsh_val}"
|
|
;;
|
|
esac
|
|
done < <(bash -c "source '${_infinito_zsh_root}/scripts/meta/env/load.sh' >/dev/null 2>&1; env") # nocheck: self-path-reference
|
|
unset _infinito_zsh_self _infinito_zsh_root _infinito_zsh_line \
|
|
_infinito_zsh_key _infinito_zsh_val
|
|
return 0
|
|
fi
|
|
|
|
_infinito_env_repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)"
|
|
_infinito_env_dotenv="${_infinito_env_repo_root}/.env"
|
|
|
|
# shellcheck source=scripts/meta/env/python.sh
|
|
source "${_infinito_env_repo_root}/scripts/meta/env/python.sh"
|
|
|
|
if [[ -n "${VENV:-}" && -d "${VENV%/}/bin" ]]; then
|
|
case ":${PATH:-}:" in
|
|
*:"${VENV%/}/bin":*) ;;
|
|
*) export PATH="${VENV%/}/bin${PATH:+:${PATH}}" ;;
|
|
esac
|
|
fi
|
|
|
|
_infinito_env_mtime="$(stat -c %Y "${_infinito_env_dotenv}" 2>/dev/null || echo 0)"
|
|
if [[ "${INFINITO_ENV_LOADED:-}" == "1" && "${INFINITO_ENV_LOADED_MTIME:-}" == "${_infinito_env_mtime}" && "${INFINITO_ENV_LOADED_DISTRO:-}" == "${INFINITO_DISTRO:-}" ]]; then # nocheck: env-loader-internal-guard
|
|
unset _infinito_env_repo_root _infinito_env_dotenv _infinito_env_mtime
|
|
return 0
|
|
fi
|
|
if [[ "${INFINITO_ENV_GENERATING:-}" == "1" ]]; then # nocheck: env-loader-internal-guard
|
|
unset _infinito_env_repo_root _infinito_env_dotenv _infinito_env_mtime
|
|
return 0
|
|
fi
|
|
|
|
if [[ -n "${INFINITO_ENV_LOADED_DISTRO:-}" && "${INFINITO_ENV_LOADED_DISTRO}" != "${INFINITO_DISTRO:-}" ]]; then # nocheck: env-loader-internal-guard
|
|
unset INFINITO_CONTAINER INFINITO_PARENT_IMAGE INFINITO_IMAGE
|
|
fi
|
|
|
|
_infinito_env_source="${_infinito_env_dotenv}"
|
|
_infinito_env_scratch=""
|
|
_infinito_env_distro="${INFINITO_DISTRO:-}"
|
|
if [[ -f "${_infinito_env_dotenv}" && -n "${_infinito_env_distro}" && "${_infinito_env_distro}" != "$(sed -n 's/^INFINITO_DISTRO=//p' "${_infinito_env_dotenv}")" ]]; then
|
|
_infinito_env_scratch="$(mktemp -d)"
|
|
_infinito_env_source="${_infinito_env_scratch}/env"
|
|
fi
|
|
|
|
if [[ ! -f "${_infinito_env_source}" ]]; then
|
|
(
|
|
cd "${_infinito_env_repo_root}" || exit 1
|
|
export INFINITO_ENV_GENERATING=1
|
|
"${PYTHON}" -m cli.meta.env --output "${_infinito_env_source}"
|
|
) >&2
|
|
fi
|
|
|
|
_infinito_env_slot="$(sed -n 's/^INFINITO_INSTANCE=//p' "${_infinito_env_dotenv}" | head -1)"
|
|
if [[ -n "${_infinito_env_slot}" && -n "${INFINITO_INSTANCE:-}" && "${INFINITO_INSTANCE}" != "${_infinito_env_slot}" ]]; then
|
|
while IFS='=' read -r _infinito_env_key _; do
|
|
unset "${_infinito_env_key}"
|
|
done < <(env | grep '^INFINITO_')
|
|
unset _infinito_env_key
|
|
fi
|
|
unset _infinito_env_slot
|
|
|
|
declare -A _infinito_env_preserved=()
|
|
while IFS= read -r _infinito_env_line; do
|
|
case "${_infinito_env_line}" in
|
|
"" | "#"*) continue ;;
|
|
esac
|
|
_infinito_env_key="${_infinito_env_line%%=*}"
|
|
if [[ "${_infinito_env_key}" == "${_infinito_env_line}" ]]; then
|
|
continue
|
|
fi
|
|
if [[ -n "${!_infinito_env_key:-}" ]]; then
|
|
_infinito_env_preserved["${_infinito_env_key}"]="${!_infinito_env_key}"
|
|
fi
|
|
done <"${_infinito_env_source}"
|
|
unset _infinito_env_line _infinito_env_key
|
|
|
|
set -a
|
|
# shellcheck disable=SC1090
|
|
source "${_infinito_env_source}"
|
|
set +a
|
|
|
|
if [[ -n "${_infinito_env_scratch}" ]]; then
|
|
rm -rf "${_infinito_env_scratch}"
|
|
fi
|
|
unset _infinito_env_source _infinito_env_scratch _infinito_env_distro
|
|
|
|
for _infinito_env_key in "${!_infinito_env_preserved[@]}"; do
|
|
declare -gx "${_infinito_env_key}=${_infinito_env_preserved[${_infinito_env_key}]}"
|
|
done
|
|
unset _infinito_env_key _infinito_env_preserved
|
|
|
|
if [[ -z "${REQUESTS_CA_BUNDLE:-}" ]]; then
|
|
for _infinito_env_ca in ${INFINITO_CA_BUNDLE_CANDIDATES}; do
|
|
if [[ -r "${_infinito_env_ca}" ]]; then
|
|
export REQUESTS_CA_BUNDLE="${_infinito_env_ca}"
|
|
export SSL_CERT_FILE="${SSL_CERT_FILE:-${_infinito_env_ca}}"
|
|
break
|
|
fi
|
|
done
|
|
unset _infinito_env_ca
|
|
fi
|
|
|
|
export INFINITO_ENV_LOADED="1"
|
|
_infinito_env_mtime="$(stat -c %Y "${_infinito_env_dotenv}" 2>/dev/null || echo 0)"
|
|
export INFINITO_ENV_LOADED_MTIME="${_infinito_env_mtime}"
|
|
export INFINITO_ENV_LOADED_DISTRO="${INFINITO_DISTRO:-}"
|
|
unset _infinito_env_repo_root _infinito_env_dotenv _infinito_env_mtime
|