Uno strumento CLI in Rust che scopre ricorsivamente repository Git, cattura le modifiche di stato, genera diff, estrae elementi di codice con snippet completi e produce report incentrati sulla sicurezza per flussi di lavoro di revisione e audit del codice.
Se questo progetto aiuta il tuo lavoro, supporta la manutenzione continua e le nuove funzionalità.
Portafoglio per Donazioni ETH
0x11282eE5726B3370c8B480e321b3B2aA13686582
Scansiona il QR code o copia l'indirizzo del portafoglio sopra.
Uno strumento CLI in Rust che scopre ricorsivamente repository Git, cattura cambiamenti di stato, genera diff, estrae elementi di codice con frammenti completi e produce report orientati alla sicurezza per flussi di revisione del codice e audit.
Perché non usare semplicemente bash?
Un one-liner come
ls | while read line; do git -C "$line" diff HEAD~1 HEAD || true; donemostra solo diff grezzi. DiffCatcher aggiunge scoperta ricorsiva, estrazione di elementi di codice, rilevamento di pattern di sicurezza, output SARIF per CI/CD, elaborazione parallela e aggregazione della sicurezza tra repository. Vedi confronto completo più sotto.
git clone https://github.com/Teycir/DiffCatcher.git
cd DiffCatcher
cargo build --release
./target/release/diffcatcher --help
# Scansiona tutti i repo in una directory (solo fetch, nessuna modifica)
diffcatcher ~/projects
# Esegui pull e genera report di sicurezza
diffcatcher ~/projects --pull -o ./report
# Crea diff tra due branch in un singolo repo (modalità revisione PR)
diffcatcher ./my-repo --diff main..feature/auth -o ./pr-report
# Genera output SARIF per GitHub Code Scanning
diffcatcher ~/projects --summary-format sarif,json -o ./report
# Esecuzione a secco per vedere cosa verrebbe scansionato
diffcatcher ~/projects --dry-run
# Scansione veloce con 8 lavoratori paralleli
diffcatcher ~/projects -j 8 --quiet
# Scansiona con impostazioni predefinite (solo fetch)
diffcatcher <ROOT_DIR>
# Directory di output personalizzata
diffcatcher ~/projects -o ./my-report
# Includi repo nidificati e segui i link simbolici
diffcatcher ~/projects --nested --follow-symlinks
# Salta directory nascoste
diffcatcher ~/projects --skip-hidden
# Solo fetch (predefinito - nessuna modifica al working tree)
diffcatcher ~/projects
# Esegui effettivamente il pull delle modifiche
diffcatcher ~/projects --pull
# Forza pull con stash/pop per repo sporchi
diffcatcher ~/projects --pull --force-pull
# Usa strategia rebase
diffcatcher ~/projects --pull --pull-strategy rebase
# Salta fetch/pull completamente (solo diff storici)
diffcatcher ~/projects --no-pull
# Salta estrazione elementi (solo diff grezzi)
diffcatcher ~/projects --no-summary-extraction
# Estrai elementi ma salta i frammenti di codice
diffcatcher ~/projects --no-snippets
# Regola contesto e limiti dei frammenti
diffcatcher ~/projects --snippet-context 10 --max-snippet-lines 300
# Limita elementi per diff
diffcatcher ~/projects --max-elements 1000
# Salta marcatura di sicurezza
diffcatcher ~/projects --no-security-tags
# Includi file di test nell'analisi di sicurezza
diffcatcher ~/projects --include-test-security
# Usa pattern di sicurezza personalizzati
diffcatcher ~/projects --security-tags-file ./custom-patterns.json
DiffCatcher può caricare automaticamente la configurazione locale del progetto da:
<ROOT_DIR>/.diffcatcher.toml (predefinito)--config <FILE>--no-configEsempio:
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"]
I flag CLI sovrascrivono comunque i valori di configurazione quando esplicitamente impostati.
DiffCatcher supporta due tipi di plugin:
--security-plugin-file <FILE> (ripetibile)--extractor-plugin-file <FILE> (ripetibile)Il formato del plugin di sicurezza corrisponde al JSON di --security-tags-file (version, mode, tags).
Formato del plugin di estrazione:
{
"version": 1,
"extractors": [
{
"name": "policy-rule",
"kind": "Config",
"regex": "^policy\\s+([A-Za-z_][A-Za-z0-9_]*)"
}
]
}
# Crea diff tra due branch in un singolo repo
diffcatcher ./my-repo --diff main..feature/auth
# Crea diff tra commit specifici
diffcatcher ./my-repo --diff abc123..def456
# Crea diff con output SARIF per integrazione CI
diffcatcher ./my-repo --diff origin/main..HEAD --summary-format sarif -o ./pr-report
Il flag --diff BASE..HEAD salta la scoperta del repository e il fetch/pull — crea direttamente il diff tra due riferimenti (branch, tag o SHA di commit) ed esegue l'intera pipeline di estrazione + marcatura di sicurezza sul risultato.
# Genera SARIF insieme ad altri formati
diffcatcher ~/projects --summary-format sarif,json,md
# Solo SARIF per upload CI/CD
diffcatcher ~/projects --summary-format sarif -o ./report
Quando sarif è incluso in --summary-format, viene scritto un file results.sarif nella directory principale del report. Questo file segue lo standard SARIF 2.1.0 ed è integrabile con GitHub Code Scanning, VS Code SARIF Viewer, Azure DevOps e altri strumenti compatibili con SARIF.
# Modalità incrementale (salta repo invariati)
diffcatcher ~/projects --incremental -o ./report
# Filtra per pattern di branch
diffcatcher ~/projects --branch-filter "main"
# Regola profondità storica
diffcatcher ~/projects --history-depth 5
# Output JSON per CI/CD
diffcatcher ~/projects --quiet --json > result.json
# Output verboso con percorsi scoperti
diffcatcher ~/projects --verbose
<report_dir>/
├── summary.json # Riepilogo globale
├── summary.md # Riepilogo in Markdown
├── results.sarif # Output SARIF 2.1.0 (quando --summary-format sarif)
├── security_overview.json # Aggregazione sicurezza cross-repo
├── security_overview.md
├── <repo-name>/
│ ├── status.json # Stato del repo
│ ├── pull_log.txt
│ └── diffs/
│ ├── diff_N_vs_N-1.patch # Diff unificato grezzo
│ ├── changes_N_vs_N-1.txt # Manifest dei file
│ ├── summary_N_vs_N-1.json # Estrazione elementi
│ ├── 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
└── ...
| Flag | Predefinito | Descrizione |
|---|---|---|
-o, --output | ./reports/<timestamp> | Directory di output del report |
-j, --parallel | 4 | Elaborazione concorrente dei repo |
-t, --timeout | 120 | Timeout operazioni Git (secondi) |
-d, --history-depth | 2 | Commit storici da confrontare |
--snippet-context | 5 | Righe di contesto intorno alle modifiche |
--max-snippet-lines | 200 | Numero massimo di righe per frammento |
--max-elements | 500 | Numero massimo di elementi per diff |
--diff | — | Crea diff tra due riferimenti in un singolo repo (BASE..HEAD) |
--summary-format | json,md | Formati di output: json, md, txt, sarif |
Vedi diffcatcher --help per tutte le opzioni.
Crea un file JSON con pattern personalizzati:
{
"version": 1,
"mode": "extend",
"tags": [
{
"tag": "pii-handling",
"description": "Elaborazione dati PII",
"severity": "High",
"patterns": ["ssn", "social_security", "passport"]
}
]
}
Usalo con --security-tags-file ./patterns.json
src/
├── cli.rs # Analisi argomenti
├── scanner.rs # Scoperta repository
├── git/ # Operazioni Git
│ ├── commands.rs # Wrapper Git
│ ├── state.rs # Cattura stato
│ ├── diff.rs # Generazione diff
│ └── file_retrieval.rs
├── extraction/ # Estrazione elementi
│ ├── parser.rs # Parser diff unificato
│ ├── elements.rs # Rilevamento elementi
│ ├── snippets.rs # Estrazione frammenti di codice
│ ├── boundary.rs # Tracciamento parentesi/indentazione
│ └── languages/ # Pattern specifici per linguaggio
├── security/ # Marcatura di sicurezza
│ ├── tagger.rs # Matching pattern
│ ├── patterns.rs # Pattern integrati
│ └── overview.rs # Aggregazione cross-repo
└── report/ # Generazione report
├── writer.rs # Struttura directory
├── json.rs # Serializzazione JSON
├── sarif.rs # Output SARIF 2.1.0
├── markdown.rs # Formattazione Markdown
└── snippet_writer.rs
Un semplice one-liner bash può elencare i diff:
ls | while read line; do git -C "$line" diff HEAD~1 HEAD || true; done
Funziona per controlli rapidi, ma DiffCatcher aggiunge capacità significative:
| Capacità | One-Liner Bash | DiffCatcher |
|---|---|---|
| Scoperta ricorsiva | Solo elementi di primo livello | Repo nidificati, link simbolici, filtri |
| Tracciamento stato | Nessuno | Hash dei commit, rilevamento sporcizia, log pull |
| Comprensione del codice | Solo diff grezzo | Estrae funzioni/struct/classi in oltre 10 linguaggi |
| Frammenti di codice | Nessuno | Codice completo prima/dopo con finestre di contesto |
| Analisi di sicurezza | Nessuna | 18 pattern integrati (auth, crypto, segreti, SQLi, XSS) |
| Formati di output | Solo terminale | JSON, Markdown, SARIF (GitHub Code Scanning) |
| Vista cross-repo | Solo per repo | Report di sicurezza aggregato su tutti i repo |
| Prestazioni | Sequenziale | Lavoratori paralleli, caching LRU, modalità incrementale |
| Integrazione CI/CD | Nessuna | Upload SARIF su GitHub/Azure DevOps |
| Gestione errori | Soppressione con ` | |
| Gestione percorsi | Fallisce con spazi | Gestisce correttamente tutti i nomi di percorso |
| Contesto storico | HEAD~1 fisso | Profondità configurabile, tracciamento stato |
L'one-liner bash è di circa 100 byte. DiffCatcher è uno strumento di audit orientato alla sicurezza con estrazione completa di elementi di codice.
# Esegui tutti i test
cargo test
# Esegui una suite di test specifica
cargo test security_tagger
# Esegui con output
cargo test -- --nocapture
La copertura dei test include:
# Compila i binary di benchmark
cargo bench --no-run
# Esegui l'harness di benchmark
cargo bench --bench core_bench
Il sorgente del benchmark si trova in benches/core_bench.rs e monitora il throughput di parser/estrazione.
Sono inclusi flussi di lavoro GitHub Actions:
.github/workflows/ci.yml: controllo formato, clippy, test, build bench.github/workflows/release.yml: packaging basato su tag e pubblicazione delle release su GitHubsrc/security/patterns.rs)Tutti i moduli includono documentazione inline completa. Moduli chiave:
src/extraction/parser.rs - Parser diff unificato con estrazione di hunksrc/extraction/elements.rs - Rilevamento elementi di codice sensibile al linguaggiosrc/extraction/snippets.rs - Estrazione completa di frammenti di codice con rilevamento confinisrc/security/tagger.rs - Motore di matching pattern di sicurezzasrc/git/commands.rs - Wrapper per operazioni GitGenera la documentazione API completa:
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
I contributi sono benvenuti! Per favore:
cargo test passiLicenza MIT - vedi il file LICENSE per i dettagli