- H11: .husky/pre-push calls .claude/hooks/prepush-rebase-check.sh, which blocks a push whose branch is behind origin/main (rebase first; do not merge main in — a merge drags in files you didn't touch, e.g. legacy-BOM .cs, tripping the format hook on code that isn't yours). Fail-open; escape ETV_SKIP_REBASE_CHECK=1. - New blocking `format` CI job: dotnet format --verify-no-changes scoped to the PR's changed .cs only (style + charset=utf-8/no-BOM), enforcing fix-as-you-touch without a big-bang reformat of the ~2500 legacy BOM files. .cs-free PRs skip and pass (always reports a status). Closes the "CI never checks charset" gap that let #269 land 17 BOM files (#310). Docs (contributing.md §7 / decisions.md / lore) follow in the next commit. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
33 lines
1.7 KiB
Bash
Executable File
33 lines
1.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# H11 (ersatztv#311) — refuse to push a branch that is BEHIND origin/main: rebase first, do NOT
|
|
# merge main in. A merge commit drags in files you never touched (e.g. the ~2500 legacy-BOM .cs),
|
|
# which then trips the pre-commit `dotnet format` hook on code that isn't yours (the #309 session).
|
|
# Rebasing keeps your diff to exactly what you changed.
|
|
#
|
|
# Fail-OPEN on anything we can't decide (a git pre-push hook has no "ask"): not a git repo,
|
|
# offline / fetch fails, no origin/main, HEAD unresolved -> allow the push. The only hard block is
|
|
# a positively-proven "behind origin/main". Deliberate exception: ETV_SKIP_REBASE_CHECK=1.
|
|
set -uo pipefail
|
|
|
|
[ "${ETV_SKIP_REBASE_CHECK:-}" = "1" ] && exit 0
|
|
git rev-parse --git-dir >/dev/null 2>&1 || exit 0
|
|
|
|
# Best-effort fetch of the latest main; offline / no network -> don't block.
|
|
git fetch origin main --quiet 2>/dev/null || exit 0
|
|
git rev-parse --verify --quiet origin/main >/dev/null 2>&1 || exit 0
|
|
|
|
# Pushing main itself, or a branch already rebased on top of it, means origin/main is an ANCESTOR
|
|
# of HEAD -> nothing to rebase, allow.
|
|
if git merge-base --is-ancestor origin/main HEAD 2>/dev/null; then
|
|
exit 0
|
|
fi
|
|
|
|
behind=$(git rev-list --count HEAD..origin/main 2>/dev/null || echo '?')
|
|
branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo HEAD)
|
|
echo "husky - push blocked (H11): '$branch' is behind origin/main by $behind commit(s)."
|
|
echo " Rebase before pushing — do NOT merge main in (a merge drags in files you didn't touch,"
|
|
echo " e.g. legacy-BOM .cs, and trips the format hook on code that isn't yours):"
|
|
echo " git fetch origin main && git rebase origin/main"
|
|
echo " Deliberate exception: ETV_SKIP_REBASE_CHECK=1 git push"
|
|
exit 1
|