#!/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"