From c987b1323b506fb3749373dd238d22c1b4978b65 Mon Sep 17 00:00:00 2001 From: "Claude Code (DevOps)" Date: Sat, 9 May 2026 19:10:07 -0300 Subject: [PATCH] =?UTF-8?q?fix(husky):=20pre-push=20pula=20valida=C3=A7?= =?UTF-8?q?=C3=A3o=20em=20delete-only=20push?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Bug Hoje, ao fazer `git push origin :branch` (delete remote), o pre-push hook roda `npm run lint:baseline` mesmo sem código pra validar. Sintomas observados: - Demora desnecessária (5-30s) - Em máquinas com pouca RAM, eslint mata com OOM (status 137) - Push falha mesmo o GitHub aceitando o delete Reproduzi durante a faxina de branches (sessão F1): ``` $ git push origin :fix/ci-test-env-stubs ❌ eslint falhou com status 137 husky - pre-push script failed (code 2) error: failed to push some refs ``` ## Fix Detecta delete-only push lendo stdin (formato padrão do git pre-push): ``` ``` Pra deletes, `local_sha` é todo zeros (40 zeros). Se TODAS as refs sendo enviadas têm sha zero, é delete-only → pula tudo e `exit 0`. Caso misto (push de uma branch + delete de outra) ainda roda validação, porque pelo menos uma ref tem sha real. ## Validação Testei localmente: - `git push origin :alguma-branch` → "somente deletes — pulando validação" - `git push origin main` → roda lint:baseline normal - `HUSKY_FULL=1 git push origin main` → roda typecheck + lint:baseline ## Risk 🟢 Zero. Hook de Husky local; CI continua validando 100%. --- .husky/pre-push | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/.husky/pre-push b/.husky/pre-push index ec28dac3a..f31c439e4 100644 --- a/.husky/pre-push +++ b/.husky/pre-push @@ -8,6 +8,30 @@ # por causa dos 1620 arquivos do app. Isso atrapalha DX em pushes frequentes. # O CI já roda o typecheck completo em todo PR — não precisa duplicar localmente. +# ───────────────────────────────────────────────────────────────── +# Skip on delete-only push (git push origin :branch / git push --delete) +# ───────────────────────────────────────────────────────────────── +# Git invoca pre-push passando refs via stdin no formato: +# +# Pra um delete, local_ref="(delete)" e local_sha é todo zeros. +# Se TODAS as refs sendo enviadas são deletes, não há código a checar. +ZERO="0000000000000000000000000000000000000000" +HAS_NON_DELETE=0 +while read -r local_ref local_sha remote_ref remote_sha; do + if [ "$local_sha" != "$ZERO" ]; then + HAS_NON_DELETE=1 + break + fi +done + +if [ "$HAS_NON_DELETE" = "0" ]; then + echo "✓ pre-push: somente deletes — pulando validação" + exit 0 +fi + +# ───────────────────────────────────────────────────────────────── +# Modo normal +# ───────────────────────────────────────────────────────────────── if [ "${HUSKY_FULL:-0}" = "1" ]; then npm run typecheck && npm run lint:baseline else