Files

111 lines
3.1 KiB
Bash
Executable File

#!/usr/bin/env bash
resolve_compose_env_path() {
local env_path="${1:-}"
local dir_part=""
local base_part=""
if [[ -z "${env_path}" ]]; then
echo ""
return 1
fi
if [[ "${env_path}" == /* ]]; then
echo "${env_path}"
return 0
fi
if [[ -e "${env_path}" ]]; then
dir_part="$(cd "$(dirname "${env_path}")" && pwd)"
base_part="$(basename "${env_path}")"
echo "${dir_part}/${base_part}"
return 0
fi
dir_part="$(dirname "${env_path}")"
base_part="$(basename "${env_path}")"
if [[ -d "${dir_part}" ]]; then
dir_part="$(cd "${dir_part}" && pwd)"
echo "${dir_part}/${base_part}"
return 0
fi
echo "${env_path}"
return 0
}
read_compose_project_name_from_env() {
local env_path="${1:-}"
local line=""
env_path="$(resolve_compose_env_path "${env_path}" || true)"
if [[ -z "${env_path}" || ! -f "${env_path}" ]]; then
return 1
fi
line="$(grep -m1 -E '^COMPOSE_PROJECT_NAME=' "${env_path}" || true)"
if [[ -z "${line}" ]]; then
return 1
fi
echo "${line#*=}" | tr -d '\r'
}
sanitize_compose_project_name() {
local raw="${1:-}"
raw="$(printf '%s' "${raw}" | tr '[:upper:]' '[:lower:]')"
raw="$(printf '%s' "${raw}" | sed -E 's/[^a-z0-9]+/-/g; s/^-+//; s/-+$//; s/-+/-/g')"
if [[ -z "${raw}" ]]; then
raw="nuqloud"
fi
if [[ ! "${raw}" =~ ^[a-z0-9] ]]; then
raw="nc-${raw}"
fi
printf '%s\n' "${raw}"
}
derive_compose_project_name_seed() {
local env_path="${1:-}"
local base_dir=""
env_path="$(resolve_compose_env_path "${env_path}" || true)"
if [[ -n "${env_path}" ]]; then
base_dir="$(basename "$(dirname "${env_path}")")"
fi
sanitize_compose_project_name "${base_dir}"
}
set_compose_project_name_in_env() {
local env_path="${1:-}"
local project_name="${2:-}"
local escaped tmp
env_path="$(resolve_compose_env_path "${env_path}" || true)"
if [[ -z "${env_path}" || -z "${project_name}" ]]; then
return 1
fi
escaped="${project_name//\\/\\\\}"
escaped="${escaped//&/\\&}"
escaped="${escaped//|/\\|}"
tmp="$(mktemp)"
if grep -q -E '^COMPOSE_PROJECT_NAME=' "${env_path}"; then
sed -E "s|^COMPOSE_PROJECT_NAME=.*$|COMPOSE_PROJECT_NAME=${escaped}|" "${env_path}" > "${tmp}"
else
cat "${env_path}" > "${tmp}"
printf '\nCOMPOSE_PROJECT_NAME=%s\n' "${project_name}" >> "${tmp}"
fi
mv "${tmp}" "${env_path}"
}
export_compose_project_name_from_env() {
local env_path="${1:-}"
local project_name=""
project_name="$(read_compose_project_name_from_env "${env_path}" || true)"
if [[ -z "${project_name}" ]]; then
project_name="$(derive_compose_project_name_seed "${env_path}")"
export COMPOSE_PROJECT_NAME="${project_name}"
return 1
fi
export COMPOSE_PROJECT_NAME="${project_name}"
return 0
}
warn_missing_compose_project_name() {
local env_path="${1:-}"
local display_path="${env_path:-.env.devprod}"
echo "Warning: COMPOSE_PROJECT_NAME is not set in ${display_path}."
echo "Folder renames can attach a cloud to new Docker volumes."
echo "Pin it with:"
echo " ./scripts/ensure-compose-project-name.sh --env-file ${display_path} --project-name <stable-name>"
}