mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2026-11-06 19:01:54 +00:00
scripts/tests/environment/ becomes scripts/tests/workspace/ with one subdirectory per track. base/ prepares the workspace and is a prerequisite; compose/ and swarm/ are independent of each other, so CI can run them as separate jobs with a budget each. 00_orchestrator.sh runs the tracks named by INFINITO_WORKSPACE_TRACKS and aborts on an unknown one. The job count stays at five: cli.meta.ci.dev_runtime matrix assigns exactly one track per distro and flips the split with the run number, so two consecutive runs cover both tracks on every distro without doubling the matrix. The workspace_track input (rotate|compose|swarm) pins it from manual steer through the orchestrator for a targeted re-run. Job names carry the track glyph from utils/symbol_glossary and the image shortened to its last two segments, so quay.io/centos/centos:latest reads as centos:latest. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
123 lines
4.8 KiB
Bash
Executable File
123 lines
4.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Validate pre-commit hook enforcement and --no-verify bypass.
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
# shellcheck source=scripts/tests/workspace/utils/common.sh
|
|
source "${SCRIPT_DIR}/../utils/common.sh"
|
|
|
|
cd "${REPO_ROOT}"
|
|
|
|
ORIGINAL_GIT_USER_NAME="$(git config --local --get user.name || true)"
|
|
ORIGINAL_GIT_USER_EMAIL="$(git config --local --get user.email || true)"
|
|
|
|
if [[ -z "${ORIGINAL_GIT_USER_NAME}" ]]; then
|
|
git config --local user.name "Environment Test"
|
|
fi
|
|
|
|
if [[ -z "${ORIGINAL_GIT_USER_EMAIL}" ]]; then
|
|
git config --local user.email "environment-test@example.invalid"
|
|
fi
|
|
|
|
if ORIGINAL_REF="$(git symbolic-ref --quiet --short HEAD)"; then
|
|
:
|
|
else
|
|
ORIGINAL_REF="$(git rev-parse --verify HEAD)"
|
|
fi
|
|
|
|
TEST_BRANCH="test/pre-commit-hook-$(date +%s)"
|
|
WORKTREE_STASH=""
|
|
|
|
if [[ -n "$(git status --short)" ]]; then
|
|
WORKTREE_STASH="environment-pre-commit-hook-$(date +%s)"
|
|
echo "Stashing existing repository changes before commit hook validation."
|
|
git stash push --include-untracked --message "${WORKTREE_STASH}" >/dev/null
|
|
fi
|
|
|
|
cleanup() {
|
|
local exit_code="$1"
|
|
set +e
|
|
|
|
if git rev-parse --verify "${TEST_BRANCH}" >/dev/null 2>&1; then
|
|
local current_ref
|
|
current_ref="$(git rev-parse --abbrev-ref HEAD 2>/dev/null || true)"
|
|
if [[ "${current_ref}" == "${TEST_BRANCH}" ]]; then
|
|
git reset --hard HEAD >/dev/null 2>&1 || true # nocheck: shell-or-true -- grandfathered: worked in practice; TODO: sharpen to catch only the exact tolerated error
|
|
git clean -fd >/dev/null 2>&1 || true # nocheck: shell-or-true -- grandfathered: worked in practice; TODO: sharpen to catch only the exact tolerated error
|
|
git checkout "${ORIGINAL_REF}" >/dev/null 2>&1 || true # nocheck: shell-or-true -- grandfathered: worked in practice; TODO: sharpen to catch only the exact tolerated error
|
|
fi
|
|
git branch -D "${TEST_BRANCH}" >/dev/null 2>&1 || true # nocheck: shell-or-true -- grandfathered: worked in practice; TODO: sharpen to catch only the exact tolerated error
|
|
fi
|
|
|
|
if [[ -n "${ORIGINAL_GIT_USER_NAME}" ]]; then
|
|
git config --local user.name "${ORIGINAL_GIT_USER_NAME}" >/dev/null 2>&1 || true # nocheck: shell-or-true -- grandfathered: worked in practice; TODO: sharpen to catch only the exact tolerated error
|
|
else
|
|
git config --local --unset user.name >/dev/null 2>&1 || true # nocheck: shell-or-true -- grandfathered: worked in practice; TODO: sharpen to catch only the exact tolerated error
|
|
fi
|
|
|
|
if [[ -n "${ORIGINAL_GIT_USER_EMAIL}" ]]; then
|
|
git config --local user.email "${ORIGINAL_GIT_USER_EMAIL}" >/dev/null 2>&1 || true # nocheck: shell-or-true -- grandfathered: worked in practice; TODO: sharpen to catch only the exact tolerated error
|
|
else
|
|
git config --local --unset user.email >/dev/null 2>&1 || true # nocheck: shell-or-true -- grandfathered: worked in practice; TODO: sharpen to catch only the exact tolerated error
|
|
fi
|
|
|
|
if [[ -n "${WORKTREE_STASH}" ]] && git stash list | grep -F "${WORKTREE_STASH}" >/dev/null 2>&1; then
|
|
if ! git stash pop --index >/dev/null 2>&1; then
|
|
echo "[FAIL] Failed to restore the stashed repository changes after commit validation." >&2
|
|
exit_code=1
|
|
fi
|
|
fi
|
|
|
|
exit "${exit_code}"
|
|
}
|
|
trap 'cleanup "$?"' EXIT
|
|
|
|
git checkout -b "${TEST_BRANCH}"
|
|
|
|
echo "Creating a unit test that fails intentionally."
|
|
cat >tests/unit/test_pre_commit_hook_failure.py <<'EOF'
|
|
import unittest
|
|
|
|
|
|
class TestPreCommitHookFailure(unittest.TestCase):
|
|
def test_intentional_failure(self) -> None:
|
|
self.fail("intentional failure to verify pre-commit hook enforcement")
|
|
EOF
|
|
git add tests/unit/test_pre_commit_hook_failure.py
|
|
|
|
echo "Attempting to commit the failing unit test — pre-commit hook must block it."
|
|
if git commit -m "test: failing unit test (should be blocked)"; then
|
|
echo "[FAIL] Commit should have been blocked by pre-commit hook." >&2
|
|
exit 1
|
|
fi
|
|
echo "[OK] Commit correctly blocked by pre-commit hook."
|
|
|
|
echo "Committing the failing unit test with --no-verify to bypass the hook."
|
|
git commit --no-verify -m "test: failing unit test committed with --no-verify"
|
|
echo "[OK] Commit with --no-verify succeeded."
|
|
|
|
echo "Reverting the --no-verify commit."
|
|
git revert --no-edit HEAD
|
|
echo "[OK] Revert succeeded."
|
|
|
|
echo "Creating a clean unit test that passes."
|
|
cat >tests/unit/test_pre_commit_hook_success.py <<'EOF'
|
|
import unittest
|
|
|
|
|
|
class TestPreCommitHookSuccess(unittest.TestCase):
|
|
def test_success(self) -> None:
|
|
self.assertTrue(True)
|
|
EOF
|
|
git add tests/unit/test_pre_commit_hook_success.py
|
|
|
|
echo "Committing the passing unit test without --no-verify — pre-commit hook must pass."
|
|
git commit -m "test: passing unit test committed via pre-commit hook"
|
|
echo "[OK] Commit without --no-verify succeeded."
|
|
|
|
echo "Returning to the original ref and deleting the temporary test branch."
|
|
git checkout "${ORIGINAL_REF}"
|
|
git branch -D "${TEST_BRANCH}"
|
|
trap - EXIT
|
|
cleanup 0
|