Uma ferramenta CLI em Rust que descobre recursivamente repositórios Git, captura mudanças de estado, gera diffs, extrai elementos de código com snippets completos e produz relatórios focados em segurança para fluxos de trabalho de revisão de código e auditoria.
Se este projeto ajuda seu trabalho, apoie a manutenção contínua e novos recursos.
Carteira de Doação ETH
0x11282eE5726B3370c8B480e321b3B2aA13686582
Escaneie o código QR ou copie o endereço da carteira acima.
Uma ferramenta CLI em Rust que descobre recursivamente repositórios Git, captura mudanças de estado, gera diffs, extrai elementos de código com trechos completos e produz relatórios focados em segurança para fluxos de revisão de código e auditoria.
Por que não usar apenas bash?
Um one-liner como
ls | while read line; do git -C "$line" diff HEAD~1 HEAD || true; donemostra apenas diffs brutos. DiffCatcher adiciona descoberta recursiva, extração de elementos de código, detecção de padrões de segurança, saída SARIF para CI/CD, processamento paralelo e agregação de segurança entre repositórios. Veja a comparação completa abaixo.
git clone https://github.com/Teycir/DiffCatcher.git
cd DiffCatcher
cargo build --release
./target/release/diffcatcher --help
# Varre todos os repositórios em um diretório (apenas fetch, sem modificações)
diffcatcher ~/projects
# Atualiza com pull e gera relatório de segurança
diffcatcher ~/projects --pull -o ./report
# Diferença entre duas branches em um único repositório (modo revisão de PR)
diffcatcher ./my-repo --diff main..feature/auth -o ./pr-report
# Gera saída SARIF para GitHub Code Scanning
diffcatcher ~/projects --summary-format sarif,json -o ./report
# Simulação para ver o que seria varrido
diffcatcher ~/projects --dry-run
# Varredura rápida com 8 trabalhadores paralelos
diffcatcher ~/projects -j 8 --quiet
# Varre com configurações padrão (apenas fetch)
diffcatcher <ROOT_DIR>
# Diretório de saída personalizado
diffcatcher ~/projects -o ./my-report
# Inclui repositórios aninhados e segue links simbólicos
diffcatcher ~/projects --nested --follow-symlinks
# Pula diretórios ocultos
diffcatcher ~/projects --skip-hidden
# Apenas fetch (padrão - sem alterações na árvore de trabalho)
diffcatcher ~/projects
# Realmente puxa alterações
diffcatcher ~/projects --pull
# Força pull com stash/pop para repositórios sujos
diffcatcher ~/projects --pull --force-pull
# Usa estratégia rebase
diffcatcher ~/projects --pull --pull-strategy rebase
# Pula fetch/pull completamente (apenas diffs históricos)
diffcatcher ~/projects --no-pull
# Pula extração de elementos (apenas diffs brutos)
diffcatcher ~/projects --no-summary-extraction
# Extrai elementos mas pula trechos de código
diffcatcher ~/projects --no-snippets
# Ajusta contexto e limites dos trechos
diffcatcher ~/projects --snippet-context 10 --max-snippet-lines 300
# Limita elementos por diff
diffcatcher ~/projects --max-elements 1000
# Pula marcação de segurança
diffcatcher ~/projects --no-security-tags
# Inclui arquivos de teste na análise de segurança
diffcatcher ~/projects --include-test-security
# Usa padrões de segurança personalizados
diffcatcher ~/projects --security-tags-file ./custom-patterns.json
DiffCatcher pode carregar automaticamente a configuração local do projeto a partir de:
<ROOT_DIR>/.diffcatcher.toml (padrão)--config <FILE>--no-configExemplo:
output = "reports-local"
no_pull = true
history_depth = 2
summary_formats = ["json", "txt"]
no_security_tags = false
[plugins]
security_pattern_files = ["plugins/security-extra.json"]
extractor_files = ["plugins/extractors.json"]
As flags da linha de comando ainda sobrescrevem os valores de configuração quando definidas explicitamente.
DiffCatcher suporta dois tipos de plugins:
--security-plugin-file <FILE> (repetível)--extractor-plugin-file <FILE> (repetível)O formato do plugin de segurança corresponde ao JSON de --security-tags-file (version, mode, tags).
Formato do plugin de extrator:
{
"version": 1,
"extractors": [
{
"name": "policy-rule",
"kind": "Config",
"regex": "^policy\\s+([A-Za-z_][A-Za-z0-9_]*)"
}
]
}
# Diferença entre duas branches em um único repositório
diffcatcher ./my-repo --diff main..feature/auth
# Diferença entre commits específicos
diffcatcher ./my-repo --diff abc123..def456
# Diferença com saída SARIF para integração CI
diffcatcher ./my-repo --diff origin/main..HEAD --summary-format sarif -o ./pr-report
A flag --diff BASE..HEAD pula a descoberta de repositórios e fetch/pull — ela difere diretamente duas referências (branches, tags ou SHAs de commit) e executa o pipeline completo de extração + marcação de segurança no resultado.
# Gera SARIF junto com outros formatos
diffcatcher ~/projects --summary-format sarif,json,md
# Apenas SARIF para upload em CI/CD
diffcatcher ~/projects --summary-format sarif -o ./report
Quando sarif está incluído em --summary-format, um arquivo results.sarif é escrito na raiz do relatório. Este arquivo segue o padrão SARIF 2.1.0 e se integra com GitHub Code Scanning, Visualizador SARIF do VS Code, Azure DevOps e outras ferramentas compatíveis com SARIF.
# Modo incremental (pula repositórios inalterados)
diffcatcher ~/projects --incremental -o ./report
# Filtra por padrão de branch
diffcatcher ~/projects --branch-filter "main"
# Ajusta profundidade do histórico
diffcatcher ~/projects --history-depth 5
# Saída JSON para CI/CD
diffcatcher ~/projects --quiet --json > result.json
# Saída verbosa com caminhos descobertos
diffcatcher ~/projects --verbose
<report_dir>/
├── summary.json # Resumo global
├── summary.md # Resumo em Markdown
├── results.sarif # Saída SARIF 2.1.0 (quando --summary-format sarif)
├── security_overview.json # Agregação de segurança entre repositórios
├── security_overview.md
├── <repo-name>/
│ ├── status.json # Estado do repositório
│ ├── pull_log.txt
│ └── diffs/
│ ├── diff_N_vs_N-1.patch # Diff unificado bruto
│ ├── changes_N_vs_N-1.txt # Manifesto de arquivos
│ ├── summary_N_vs_N-1.json # Extração de elementos
│ ├── summary_N_vs_N-1.md
│ └── snippets/
│ ├── 001_validate_token_ADDED.rs
│ ├── 002_check_permissions_BEFORE.rs
│ ├── 002_check_permissions_AFTER.rs
│ └── 002_check_permissions.diff
└── ...
| Bandeira | Padrão | Descrição |
|---|---|---|
-o, --output | ./reports/<timestamp> | Diretório de saída do relatório |
-j, --parallel | 4 | Processamento concorrente de repositórios |
-t, --timeout | 120 | Timeout da operação Git (segundos) |
-d, --history-depth | 2 | Commits históricos para diff |
--snippet-context | 5 | Linhas de contexto ao redor das alterações |
--max-snippet-lines | 200 | Máximo de linhas por trecho |
--max-elements | 500 | Máximo de elementos por diff |
--diff | — | Diferença entre duas referências em um único repositório (BASE..HEAD) |
--summary-format | json,md | Formatos de saída: json, md, txt, sarif |
Veja diffcatcher --help para todas as opções.
Crie um arquivo JSON com padrões personalizados:
{
"version": 1,
"mode": "extend",
"tags": [
{
"tag": "pii-handling",
"description": "Processamento de dados PII",
"severity": "High",
"patterns": ["ssn", "social_security", "passport"]
}
]
}
Use com --security-tags-file ./patterns.json
src/
├── cli.rs # Análise de argumentos
├── scanner.rs # Descoberta de repositórios
├── git/ # Operações Git
│ ├── commands.rs # Wrappers Git
│ ├── state.rs # Captura de estado
│ ├── diff.rs # Geração de diffs
│ └── file_retrieval.rs
├── extraction/ # Extração de elementos
│ ├── parser.rs # Analisador de diff unificado
│ ├── elements.rs # Detecção de elementos
│ ├── snippets.rs # Extração de trechos de código
│ ├── boundary.rs # Rastreamento de colchetes/indentação
│ └── languages/ # Padrões específicos de linguagem
├── security/ # Marcação de segurança
│ ├── tagger.rs # Correspondência de padrões
│ ├── patterns.rs # Padrões incorporados
│ └── overview.rs # Agregação entre repositórios
└── report/ # Geração de relatórios
├── writer.rs # Estrutura de diretórios
├── json.rs # Serialização JSON
├── sarif.rs # Saída SARIF 2.1.0
├── markdown.rs # Formatação Markdown
└── snippet_writer.rs
Um one-liner simples em bash pode listar diffs:
ls | while read line; do git -C "$line" diff HEAD~1 HEAD || true; done
Isso funciona para verificações rápidas, mas DiffCatcher adiciona capacidades significativas:
| Capacidade | One-Liner Bash | DiffCatcher |
|---|---|---|
| Descoberta recursiva | Apenais itens de nível superior | Repositórios aninhados, links simbólicos, filtros |
| Rastreamento de estado | Nenhum | Hashes de commit, detecção de sujeira, logs de pull |
| Compreensão de código | Apenas diff bruto | Extrai funções/estruturas/classes em mais de 10 linguagens |
| Trechos de código | Nenhum | Completo antes/depois com janelas de contexto |
| Análise de segurança | Nenhum | 18 padrões incorporados (auth, crypto, segredos, SQLi, XSS) |
| Formatos de saída | Apenas terminal | JSON, Markdown, SARIF (GitHub Code Scanning) |
| Visão entre repositórios | Apenas por repositório | Relatório de segurança agregado em todos os repositórios |
| Desempenho | Sequencial | Trabalhadores paralelos, cache LRU, modo incremental |
| Integração CI/CD | Nenhum | Upload SARIF para GitHub/Azure DevOps |
| Tratamento de erros | Supressão com ` | |
| Manipulação de caminhos | Falha em espaços | Lida corretamente com todos os nomes de caminho |
| Contexto histórico | HEAD~1 fixo | Profundidade configurável, rastreamento de estado |
O one-liner bash tem ~100 bytes. DiffCatcher é uma ferramenta de auditoria focada em segurança com extração completa de elementos de código.
# Executa todos os testes
cargo test
# Executa suíte de testes específica
cargo test security_tagger
# Executa com saída
cargo test -- --nocapture
A cobertura de testes inclui:
# Compila binários de benchmark
cargo bench --no-run
# Executa harness de benchmark
cargo bench --bench core_bench
O código-fonte do benchmark está em benches/core_bench.rs e monitora a taxa de transferência do analisador/extrator.
Workflows do GitHub Actions estão incluídos:
.github/workflows/ci.yml: verificação de formatação, clippy, testes, compilação de bench.github/workflows/release.yml: empacotamento de release baseado em tag e publicação de release no GitHubsrc/security/patterns.rs)Todos os módulos incluem documentação inline abrangente. Módulos principais:
src/extraction/parser.rs - Analisador de diff unificado com extração de hunkssrc/extraction/elements.rs - Detecção de elementos de código consciente de linguagemsrc/extraction/snippets.rs - Extração completa de trechos de código com detecção de limitessrc/security/tagger.rs - Mecanismo de correspondência de padrões de segurançasrc/git/commands.rs - Wrappers de operações GitGere a documentação completa da API:
cargo doc --open
#rust #git #security #code-review #diff-analysis #static-analysis #devops #cli-tool #audit #vulnerability-detection #code-quality #snippet-extraction #parallel-processing #security-scanning
Contribuições são bem-vindas! Por favor:
cargo test passaLicença MIT - veja o arquivo LICENSE para detalhes