Skip to content

fix(husky): pre-push pula validação em delete-only push (F1-1.x)#123

Merged
adm01-debug merged 1 commit into
mainfrom
fix/husky-pre-push-skip-on-delete
May 9, 2026
Merged

fix(husky): pre-push pula validação em delete-only push (F1-1.x)#123
adm01-debug merged 1 commit into
mainfrom
fix/husky-pre-push-skip-on-delete

Conversation

@adm01-debug
Copy link
Copy Markdown
Owner

@adm01-debug adm01-debug commented May 9, 2026

Bug

Ao fazer git push origin :branch (delete remote), o pre-push hook roda npm run lint:baseline mesmo sem código pra validar. Sintomas:

  • 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

Reproduzido 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):

<local_ref> <local_sha> <remote_ref> <remote_sha>

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.

Mudança

Arquivo Linhas
.husky/pre-push +24 (lógica de detecção + early-exit)

Validação

  • 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 apenas (não afeta CI). CI continua validando 100% dos pushes.

📋 Test plan

  • Lógica de detecção testada manualmente (cat com fake stdin)
  • CI verde
  • CodeRabbit OK

Summary by CodeRabbit

Notas da Release

  • Chores
    • Otimizada a validação de push ao deletar branches, permitindo que operações de deleção de referências sejam executadas sem executar verificações de validação.

Review Change Stack

## 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):

```
<local_ref> <local_sha> <remote_ref> <remote_sha>
```

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%.
Copilot AI review requested due to automatic review settings May 9, 2026 22:10
@vercel
Copy link
Copy Markdown

vercel Bot commented May 9, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
promo-gifts Ready Ready Preview, Comment May 9, 2026 10:11pm

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 9, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: bfd8b4e3-e210-4949-bb46-c58522fc4dfe

📥 Commits

Reviewing files that changed from the base of the PR and between 22d19c1 and c987b13.

📒 Files selected for processing (1)
  • .husky/pre-push

Walkthrough

O hook .husky/pre-push ganhou lógica para detectar operações puras de deleção de branches (onde todos local_sha são zero), pulando validação nesse cenário. O fluxo existente de validação condicional via HUSKY_FULL é preservado para pushes que alteram referências.

Changes

Detecção de Delete e Validação Condicional

Layer / File(s) Summary
Lógica de Detecção de Deletions
.husky/pre-push
Novo bloco (linhas 11–30) escaneia stdin para determinar se todos refs têm local_sha=0; quando detecta operação pura de delete, imprime mensagem e sai com código 0, pulando todas as validações.
Execução Condicional de Validação
.husky/pre-push
Condicional HUSKY_FULL mantida (linhas 35–38): modo completo executa npm run typecheck && npm run lint:baseline; modo padrão executa apenas npm run lint:baseline.

Estimated code review effort

🎯 2 (Simples) | ⏱️ ~8 minutos

Possibly related PRs


Observações de Segurança e Performance

Potencial de Regressão: A detecção de delete via local_sha=0 é padrão Git e segura. Porém, considere: se uma ferramenta ou wrapper de push enviar refs com local_sha=0 em cenários que não são deletes puros (ex: refs temporários), a validação será pulada indevidamente. Recomenda-se validar com equipe que nenhum tooling local ou CI injeta esse padrão.

Sem riscos críticos observados: Sem secrets hardcoded, SQL injection, promises sem await, ou any sem narrowing. O hook shell é direto; sem regressões lógicas aparentes.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed O título descreve corretamente a mudança principal: detecção de deletes no pre-push do Husky e skip de validação nesse cenário.
Description check ✅ Passed A descrição está completa com contexto do bug, explicação técnica da solução, validação manual e avaliação de risco, mas não segue exatamente o template padrão do repositório (seções de tipo de mudança e checklist não estão preenchidas).
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/husky-pre-push-skip-on-delete

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Ajusta o hook local .husky/pre-push para detectar delete-only push (ex.: git push origin :branch / git push --delete) e pular as validações quando não há código novo sendo enviado, reduzindo tempo de push e evitando falhas locais por OOM durante deleções remotas.

Changes:

  • Lê as refs do pre-push via stdin e detecta quando todas as refs são deleções (local_sha = 40 zeros).
  • Adiciona early-exit com mensagem quando o push contém apenas deletes.
  • Mantém o comportamento atual para pushes “mistos” (delete + update) e para o modo HUSKY_FULL=1.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread .husky/pre-push
while read -r local_ref local_sha remote_ref remote_sha; do
if [ "$local_sha" != "$ZERO" ]; then
HAS_NON_DELETE=1
break
@adm01-debug adm01-debug merged commit d94b684 into main May 9, 2026
18 of 19 checks passed
@adm01-debug adm01-debug deleted the fix/husky-pre-push-skip-on-delete branch May 9, 2026 22:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants