From 9d67890b681d560e9e39df9f8dbdede4a3c5a118 Mon Sep 17 00:00:00 2001 From: Lucas Rayan Date: Fri, 23 Oct 2026 11:22:23 -0300 Subject: [PATCH] =?UTF-8?q?Verifica=C3=A7=C3=A3o=20local=20(scripts/verifi?= =?UTF-8?q?car.sh),=20hook=20de=20pre-push=20e=20CI=20que=20pula=20s=C3=B3?= =?UTF-8?q?=20documenta=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit scripts/verificar.sh roda em segundos o mesmo que o CI roda (fmt, clippy -D warnings no workspace inteiro, tradução, scripts, workflows) e, com --completo, os testes e o cargo audit. O hook de pre-push (scripts/instalar-hooks.sh) a roda antes de cada push. O CI deixa de rodar em mudanças só de documentação. Co-Authored-By: Claude Sonnet 5.5 --- .githooks/pre-push | 3 +++ .github/workflows/ci.yml | 3 +++ CONTRIBUTING.md | 8 ++++--- CONTRIBUTING.pt-BR.md | 8 ++++--- scripts/instalar-hooks.sh | 6 +++++ scripts/verificar.sh | 49 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 71 insertions(+), 6 deletions(-) create mode 100755 .githooks/pre-push create mode 100755 scripts/instalar-hooks.sh create mode 100755 scripts/verificar.sh diff --git a/.githooks/pre-push b/.githooks/pre-push new file mode 100755 index 0000000..a9b68e1 --- /dev/null +++ b/.githooks/pre-push @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +# Antes de cada push: a verificação rápida. Ignore com `git push --no-verify` (use com parcimônia). +exec "$(git rev-parse --show-toplevel)/scripts/verificar.sh" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3f31fba..c7c80a1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,9 +1,12 @@ name: CI on: + # Mudança só de documentação não precisa de 6 jobs em 3 sistemas. push: branches: [main] + paths-ignore: ['**.md', 'docs/**', 'LICENSE*', '.gitignore', '.githooks/**'] pull_request: + paths-ignore: ['**.md', 'docs/**', 'LICENSE*', '.gitignore', '.githooks/**'] concurrency: group: ci-${{ github.ref }} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ef602b6..b389cf0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,11 +11,13 @@ Thanks for helping! Golden rules: ## Workflow ```bash -cargo fmt --all -cargo clippy --workspace --all-targets -cargo test --workspace +scripts/instalar-hooks.sh # uma vez: roda a verificação rápida antes de cada push +scripts/verificar.sh # rápido (segundos): fmt, clippy como no CI, tradução, scripts, workflows +scripts/verificar.sh --completo # inclui cargo test --workspace e cargo audit ``` +The CI takes 5 to 30 minutes on three systems, so run the check before pushing: almost everything that makes the CI fail shows up locally in seconds. Documentation-only changes (`*.md`, `docs/`) skip the CI. + On Linux the tests build images with `mtools`, `ntfs-3g`, `e2fsprogs`, `exfatprogs`, `imagemagick`, `zip` and `python3`. Without these tools the image tests are skipped (set `GUARA_REQUIRE_FIXTURES=1` to make them fail). For the external reference images (BitLocker, FileVault 2, dfvfs, AFF4), run `scripts/fetch-testdata.sh`; without them those tests are skipped. The BitLocker test takes about 75 s. diff --git a/CONTRIBUTING.pt-BR.md b/CONTRIBUTING.pt-BR.md index 86375cd..cbb9a6d 100644 --- a/CONTRIBUTING.pt-BR.md +++ b/CONTRIBUTING.pt-BR.md @@ -11,11 +11,13 @@ Obrigado por ajudar! Regras de ouro: ## Fluxo ```bash -cargo fmt --all -cargo clippy --workspace --all-targets -cargo test --workspace +scripts/instalar-hooks.sh # uma vez: roda a verificação rápida antes de cada push +scripts/verificar.sh # rápido (segundos): fmt, clippy como no CI, tradução, scripts, workflows +scripts/verificar.sh --completo # inclui cargo test --workspace e cargo audit ``` +O CI leva de 5 a 30 minutos em três sistemas, então rode a verificação antes do push: quase tudo que faz o CI falhar aparece aqui em segundos. Mudanças só de documentação (`*.md`, `docs/`) pulam o CI. + No Linux os testes geram imagens com `mtools`, `ntfs-3g`, `e2fsprogs`, `exfatprogs`, `imagemagick`, `zip` e `python3`. Sem essas ferramentas os testes com imagem são ignorados (defina `GUARA_REQUIRE_FIXTURES=1` para falhar). Para as imagens de referência externas (BitLocker, FileVault 2, dfvfs, AFF4), rode `scripts/fetch-testdata.sh`; sem elas esses testes são pulados. O teste de BitLocker leva cerca de 75 s. diff --git a/scripts/instalar-hooks.sh b/scripts/instalar-hooks.sh new file mode 100755 index 0000000..dc71deb --- /dev/null +++ b/scripts/instalar-hooks.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +# Liga o hook de pre-push do repositório (roda scripts/verificar.sh antes de cada push). +set -euo pipefail +cd "$(dirname "$0")/.." +git config core.hooksPath .githooks +echo "hook ligado: git push passa a rodar scripts/verificar.sh (desligue com: git config --unset core.hooksPath)" diff --git a/scripts/verificar.sh b/scripts/verificar.sh new file mode 100755 index 0000000..64749e7 --- /dev/null +++ b/scripts/verificar.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +# Verificação local: roda o mesmo que o CI roda, antes de você dar push. +# +# scripts/verificar.sh rápido (~1 min): formatação, clippy, tradução, scripts, workflows +# scripts/verificar.sh --completo inclui os testes do workspace e o cargo audit +# +# O CI leva de 5 a 30 minutos por execução e roda em 3 sistemas; quase tudo que o faz falhar +# aparece aqui em segundos. Se isto passa, o CI só deve revelar o que é próprio dele (Windows, +# macOS, imagens baixadas, apt do runner). +set -uo pipefail +cd "$(dirname "$0")/.." +completo=0 +[ "${1:-}" = "--completo" ] && completo=1 +falhas=() +passo() { # passo "nome" comando... + local nome="$1"; shift + printf '\n\033[1m== %s\033[0m\n' "$nome" + if "$@"; then printf '\033[32mok\033[0m %s\n' "$nome"; else printf '\033[31mFALHOU\033[0m %s\n' "$nome"; falhas+=("$nome"); fi +} + +passo "formatação (cargo fmt)" cargo fmt --all -- --check +# as mesmas flags do CI: avisos viram erro, inclusive nos testes +passo "clippy (workspace, todos os alvos)" env RUSTFLAGS="-D warnings" cargo clippy --workspace --all-targets +passo "cobertura da tradução da interface" node scripts/check-ui-i18n.mjs +passo "teste do latest.json" python3 -B scripts/test_make_latest_json.py +passo "sintaxe dos scripts bash" bash -c 'for f in scripts/*.sh .githooks/*; do bash -n "$f" || exit 1; done' +passo "workflows (YAML válido)" python3 -c " +import glob, yaml +for f in glob.glob('.github/workflows/*.yml'): + yaml.safe_load(open(f)) +" +if [ -f apps/gui/src-tauri/Cargo.toml ] && pkg-config --exists webkit2gtk-4.1 2>/dev/null; then + passo "app desktop (cargo check)" env RUSTFLAGS="" cargo check --manifest-path apps/gui/src-tauri/Cargo.toml +else + printf '\n(app desktop: pulado, faltam as bibliotecas do WebKitGTK; o CI compila)\n' +fi + +if [ "$completo" = 1 ]; then + passo "testes (cargo test --workspace)" cargo test --workspace + passo "auditoria de dependências (cargo audit)" cargo audit +fi + +printf '\n' +if [ ${#falhas[@]} -eq 0 ]; then + printf '\033[32mtudo certo\033[0m: pode dar push.\n' +else + printf '\033[31mfalhou:\033[0m %s\n' "${falhas[*]}" + exit 1 +fi