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