Files
computer-playbook/scripts/tests/workspace/base/05_commit.sh
T
kevinveenbirkenbachandClaude Opus 5 ac7b98f342 refactor(workspace): split the environment suite into base, compose and swarm tracks
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>
2026-08-10 22:57:05 +02:00

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