git reset --hard prints 'HEAD is now at …' to stdout, which polluted read -r previous_sha target_sha < <(git_fetch_and_checkout) and wrote invalid values into .evo-deploy/state.json. Redirect git stdout to stderr inside git_fetch_and_checkout and rollback; validate SHAs before write_state and rollback. Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
41 lines
1.6 KiB
Bash
Executable File
41 lines
1.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Regression: git_fetch_and_checkout must emit only two SHAs on stdout.
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
TMP="$(mktemp -d)"
|
|
trap 'rm -rf "$TMP"' EXIT
|
|
|
|
git init -q "$TMP/repo"
|
|
git -C "$TMP/repo" config user.email "test@example.com"
|
|
git -C "$TMP/repo" config user.name "Test"
|
|
echo first >"$TMP/repo/file.txt"
|
|
git -C "$TMP/repo" add file.txt
|
|
git -C "$TMP/repo" commit -q -m "first"
|
|
FIRST_SHA="$(git -C "$TMP/repo" rev-parse HEAD)"
|
|
echo second >"$TMP/repo/file.txt"
|
|
git -C "$TMP/repo" commit -q -am "second"
|
|
SECOND_SHA="$(git -C "$TMP/repo" rev-parse HEAD)"
|
|
|
|
# Minimal reimplementation of the capture contract under test.
|
|
git_fetch_and_checkout() {
|
|
local previous_sha target_sha deploy_dir="$1" ref="$2"
|
|
previous_sha="$(git -C "$deploy_dir" rev-parse HEAD)"
|
|
git -C "$deploy_dir" fetch origin --prune >&2 2>/dev/null || true
|
|
target_sha="$(git -C "$deploy_dir" rev-parse "${ref}^{commit}")"
|
|
git -C "$deploy_dir" reset --hard "$target_sha" >&2
|
|
printf '%s %s\n' "$previous_sha" "$target_sha"
|
|
}
|
|
|
|
git -C "$TMP/repo" remote add origin "$TMP/repo"
|
|
git -C "$TMP/repo" checkout -q "$FIRST_SHA"
|
|
|
|
capture="$(git_fetch_and_checkout "$TMP/repo" "$SECOND_SHA")"
|
|
read -r got_previous got_target <<<"$capture"
|
|
|
|
[[ "$got_previous" == "$FIRST_SHA" ]] || { echo "expected previous $FIRST_SHA, got $got_previous"; exit 1; }
|
|
[[ "$got_target" == "$SECOND_SHA" ]] || { echo "expected target $SECOND_SHA, got $got_target"; exit 1; }
|
|
[[ "$capture" != *"HEAD is now at"* ]] || { echo "git reset output leaked into capture: $capture"; exit 1; }
|
|
|
|
echo "ok: deploy-sha-capture regression passed"
|