feat(install): derive CLUSEV_REPOSITORY from the clone origin

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
feat/v1-foundation
boban 2026-06-22 20:43:25 +02:00
parent a1386b0533
commit ee111bfa9a
4 changed files with 53 additions and 0 deletions

View File

@ -244,6 +244,9 @@ HOST_TZ="$(timedatectl show -p Timezone --value 2>/dev/null || true)"
force_kv APP_TIMEZONE "$HOST_TZ"
info "Secrets ok; Proxy/URL aus APP_DOMAIN abgeleitet; Zeitzone ${HOST_TZ}"
# Pin the update source to wherever this was cloned from (keeps private URLs out of tracked files).
[ -x "$(pwd)/scripts/set-repository-url.sh" ] && "$(pwd)/scripts/set-repository-url.sh" "$(pwd)" "$(pwd)/.env" || true
# ── [4/9] image ──────────────────────────────────────────────────────
phase 4/9 "Image bauen"
set_stage build

20
scripts/set-repository-url.sh Executable file
View File

@ -0,0 +1,20 @@
#!/usr/bin/env bash
# Derive the update source (CLUSEV_REPOSITORY) from the clone origin and write it into the given .env.
# Called by install.sh + update.sh. The private (Gitea/GitHub-private) URL therefore lives ONLY in the
# gitignored .env — never in a tracked file. No-op (exit 0) when there is no origin remote.
# usage: set-repository-url.sh <project-dir> <env-file>
set -euo pipefail
proj="${1:?project dir required}"
envfile="${2:?env file required}"
url="$(git -C "$proj" remote get-url origin 2>/dev/null || true)"
url="${url%.git}" # normalise — the API host is the same with or without .git
url="${url%/}" # drop a trailing slash
[ -n "$url" ] || exit 0 # no origin (e.g. tarball install) → leave .env untouched
if grep -q '^CLUSEV_REPOSITORY=' "$envfile" 2>/dev/null; then
# Drop every existing line, then re-append once — collapses any duplicates to a single entry.
sed -i '/^CLUSEV_REPOSITORY=/d' "$envfile"
fi
printf 'CLUSEV_REPOSITORY=%s\n' "$url" >> "$envfile"

View File

@ -0,0 +1,27 @@
#!/usr/bin/env bash
# Test: set-repository-url.sh writes CLUSEV_REPOSITORY (derived from the clone origin) into the .env,
# creating or replacing the line, and strips a trailing .git.
set -euo pipefail
here="$(cd "$(dirname "$0")" && pwd)"
work="$(mktemp -d)"; trap 'rm -rf "$work"' EXIT
git init -q "$work/proj"
git -C "$work/proj" remote add origin https://git.example.com/o/clusev.git
printf 'APP_ENV=local\n' > "$work/proj/.env"
bash "$here/set-repository-url.sh" "$work/proj" "$work/proj/.env"
grep -qx 'CLUSEV_REPOSITORY=https://git.example.com/o/clusev' "$work/proj/.env" || { echo "FAIL: append/strip-.git"; exit 1; }
# replace an existing line
printf 'CLUSEV_REPOSITORY=old\n' >> "$work/proj/.env"
git -C "$work/proj" remote set-url origin https://gitea.local/u/clusev
bash "$here/set-repository-url.sh" "$work/proj" "$work/proj/.env"
test "$(grep -c '^CLUSEV_REPOSITORY=' "$work/proj/.env")" = 1 || { echo "FAIL: duplicate line"; exit 1; }
grep -qx 'CLUSEV_REPOSITORY=https://gitea.local/u/clusev' "$work/proj/.env" || { echo "FAIL: replace"; exit 1; }
# no origin → no-op, no crash
git init -q "$work/noremote"; printf '' > "$work/noremote/.env"
bash "$here/set-repository-url.sh" "$work/noremote" "$work/noremote/.env"
grep -q 'CLUSEV_REPOSITORY' "$work/noremote/.env" && { echo "FAIL: wrote without origin"; exit 1; }
echo "PASS"

View File

@ -62,6 +62,9 @@ if [ "${CLUSEV_UPDATE_REEXEC:-0}" != 1 ]; then
fi
fi
# Refresh the update source from the (possibly changed) clone origin before handing off.
[ -x ./scripts/set-repository-url.sh ] && ./scripts/set-repository-url.sh "$(pwd)" ./.env || true
# 4. apply via the idempotent installer, non-interactively (no prompts; config preserved)
info "Wende Update an (install.sh) ..."
exec ./install.sh </dev/null