
Ein Rust-CLI-Tool, das rekursiv Git-Repositorys entdeckt, Zustandsänderungen erfasst, Diffs generiert, Code-Elemente mit vollständigen Snippets extrahiert und sicherheitsorientierte Berichte für Code-Review- und Audit-Workflows erstellt.
Wenn dieses Projekt Ihre Arbeit unterstützt, tragen Sie zur laufenden Wartung und zu neuen Funktionen bei.
ETH-Spenden-Wallet
0x11282eE5726B3370c8B480e321b3B2aA13686582
Scannen Sie den QR-Code oder kopieren Sie die obige Wallet-Adresse.
Ein Rust-CLI-Tool, das rekursiv Git-Repositorys findet, Zustandsänderungen erfasst, Diffs erstellt, Code-Elemente mit vollständigen Snippets extrahiert und sicherheitsorientierte Berichte für Code-Review- und Audit-Workflows erzeugt.
Warum nicht einfach Bash?
Ein Einzeiler wie
ls | while read line; do git -C "$line" diff HEAD~1 HEAD || true; donezeigt nur rohe Diffs. DiffCatcher bietet rekursive Erkennung, Code-Element-Extraktion, Sicherheitsmustererkennung, SARIF-Ausgabe für CI/CD, parallele Verarbeitung und Repo-übergreifende Sicherheits-Aggregation. Siehe den vollständigen Vergleich unten.
git clone https://github.com/Teycir/DiffCatcher.git
cd DiffCatcher
cargo build --release
./target/release/diffcatcher --help
# Alle Repos in einem Verzeichnis scannen (nur fetch, keine Änderungen)
diffcatcher ~/projects
# Updates pullen und Sicherheitsbericht erstellen
diffcatcher ~/projects --pull -o ./report
# Zwei Branches in einem einzelnen Repo difffen (PR-Review-Modus)
diffcatcher ./my-repo --diff main..feature/auth -o ./pr-report
# SARIF-Ausgabe für GitHub Code Scanning erzeugen
diffcatcher ~/projects --summary-format sarif,json -o ./report
# Trockenlauf, um zu sehen, was gescannt würde
diffcatcher ~/projects --dry-run
# Schnelles Scannen mit 8 parallelen Arbeitern
diffcatcher ~/projects -j 8 --quiet
# Standard-Scan (nur fetch)
diffcatcher <ROOT_DIR>
# Benutzerdefiniertes Ausgabeverzeichnis
diffcatcher ~/projects -o ./my-report
# Verschachtelte Repos einbeziehen und Symlinks folgen
diffcatcher ~/projects --nested --follow-symlinks
# Versteckte Verzeichnisse überspringen
diffcatcher ~/projects --skip-hidden
# Nur fetch (Standard – keine Arbeitsverzeichnis-Änderungen)
diffcatcher ~/projects
# Änderungen tatsächlich pullen
diffcatcher ~/projects --pull
# Force pull mit stash/pop für schmutzige Repos
diffcatcher ~/projects --pull --force-pull
# Rebase-Strategie verwenden
diffcatcher ~/projects --pull --pull-strategy rebase
# Fetch/Pull komplett überspringen (nur historische Diffs)
diffcatcher ~/projects --no-pull
# Element-Extraktion überspringen (nur rohe Diffs)
diffcatcher ~/projects --no-summary-extraction
# Elemente extrahieren, aber Code-Snippets überspringen
diffcatcher ~/projects --no-snippets
# Snippet-Kontext und -Grenzen anpassen
diffcatcher ~/projects --snippet-context 10 --max-snippet-lines 300
# Elemente pro Diff begrenzen
diffcatcher ~/projects --max-elements 1000
# Sicherheits-Tagging überspringen
diffcatcher ~/projects --no-security-tags
# Testdateien in die Sicherheitsanalyse einbeziehen
diffcatcher ~/projects --include-test-security
# Benutzerdefinierte Sicherheitsmuster verwenden
diffcatcher ~/projects --security-tags-file ./custom-patterns.json
DiffCatcher kann automatisch eine projektspezifische Konfiguration laden von:
<ROOT_DIR>/.diffcatcher.toml (Standard)--config <FILE>--no-configBeispiel:
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"]
CLI-Flags überschreiben Konfigurationswerte, wenn sie explizit gesetzt sind.
DiffCatcher unterstützt zwei Plugin-Typen:
--security-plugin-file <FILE> (wiederholbar)--extractor-plugin-file <FILE> (wiederholbar)Das Sicherheitsplugin-Format entspricht dem --security-tags-file JSON (version, mode, tags).
Extraktor-Plugin-Format:
{
"version": 1,
"extractors": [
{
"name": "policy-rule",
"kind": "Config",
"regex": "^policy\\s+([A-Za-z_][A-Za-z0-9_]*)"
}
]
}
# Zwei Branches in einem einzelnen Repo difffen
diffcatcher ./my-repo --diff main..feature/auth
# Bestimmte Commits difffen
diffcatcher ./my-repo --diff abc123..def456
# Diff mit SARIF-Ausgabe für CI-Integration
diffcatcher ./my-repo --diff origin/main..HEAD --summary-format sarif -o ./pr-report
Das Flag --diff BASE..HEAD überspringt die Repository-Erkennung und Fetch/Pull – es erstellt direkt ein Diff zwischen zwei Referenzen (Branches, Tags oder Commit-SHAs) und führt die vollständige Pipeline aus Extraktion und Sicherheits-Tagging auf dem Ergebnis aus.
# SARIF zusammen mit anderen Formaten erzeugen
diffcatcher ~/projects --summary-format sarif,json,md
# Nur SARIF für CI/CD-Upload
diffcatcher ~/projects --summary-format sarif -o ./report
Wenn sarif in --summary-format enthalten ist, wird eine Datei results.sarif im Berichtsstammverzeichnis geschrieben. Diese Datei folgt dem SARIF 2.1.0-Standard und kann mit GitHub Code Scanning, VS Code SARIF Viewer, Azure DevOps und anderen SARIF-kompatiblen Tools integriert werden.
# Inkrementeller Modus (unveränderte Repos überspringen)
diffcatcher ~/projects --incremental -o ./report
# Nach Branch-Muster filtern
diffcatcher ~/projects --branch-filter "main"
# Historientiefe anpassen
diffcatcher ~/projects --history-depth 5
# JSON-Ausgabe für CI/CD
diffcatcher ~/projects --quiet --json > result.json
# Ausführliche Ausgabe mit gefundenen Pfaden
diffcatcher ~/projects --verbose
<report_dir>/
├── summary.json # Globale Zusammenfassung
├── summary.md # Markdown-Zusammenfassung
├── results.sarif # SARIF 2.1.0-Ausgabe (wenn --summary-format sarif)
├── security_overview.json # Repo-übergreifende Sicherheits-Aggregation
├── security_overview.md
├── <repo-name>/
│ ├── status.json # Repo-Zustand
│ ├── pull_log.txt
│ └── diffs/
│ ├── diff_N_vs_N-1.patch # Roh-Unified-Diff
│ ├── changes_N_vs_N-1.txt # Dateimanifest
│ ├── summary_N_vs_N-1.json # Element-Extraktion
│ ├── 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
└── ...
Alle Optionen mit diffcatcher --help anzeigen.
Erstellen Sie eine JSON-Datei mit benutzerdefinierten Mustern:
{
"version": 1,
"mode": "extend",
"tags": [
{
"tag": "pii-handling",
"description": "Verarbeitung personenbezogener Daten",
"severity": "High",
"patterns": ["ssn", "social_security", "passport"]
}
]
}
Verwendung mit --security-tags-file ./patterns.json
src/
├── cli.rs # Argument-Parsing
├── scanner.rs # Repository-Erkennung
├── git/ # Git-Operationen
│ ├── commands.rs # Git-Wrapper
│ ├── state.rs # Zustandserfassung
│ ├── diff.rs # Diff-Generierung
│ └── file_retrieval.rs
├── extraction/ # Element-Extraktion
│ ├── parser.rs # Unified-Diff-Parser
│ ├── elements.rs # Element-Erkennung
│ ├── snippets.rs # Code-Snippet-Extraktion
│ ├── boundary.rs # Klammer/Einrückungs-Verfolgung
│ └── languages/ # Sprachspezifische Muster
├── security/ # Sicherheits-Tagging
│ ├── tagger.rs # Mustervergleich
│ ├── patterns.rs # Integrierte Muster
│ └── overview.rs # Repo-übergreifende Aggregation
└── report/ # Berichtserstellung
├── writer.rs # Verzeichnisstruktur
├── json.rs # JSON-Serialisierung
├── sarif.rs # SARIF 2.1.0-Ausgabe
├── markdown.rs # Markdown-Formatierung
└── snippet_writer.rs
Ein einfacher Bash-Einzeiler kann Diffs auflisten:
ls | while read line; do git -C "$line" diff HEAD~1 HEAD || true; done
Dies funktioniert für schnelle Überprüfungen, aber DiffCatcher bietet erweiterte Funktionen:
Der Bash-Einzeiler ist ~100 Bytes groß. DiffCatcher ist ein sicherheitsorientiertes Audit-Tool mit vollständiger Code-Element-Extraktion.
# Alle Tests ausführen
cargo test
# Bestimmte Test-Suite ausführen
cargo test security_tagger
# Mit Ausgabe ausführen
cargo test -- --nocapture
Die Testabdeckung umfasst:
# Benchmark-Binärdateien kompilieren
cargo bench --no-run
# Benchmark-Harness ausführen
cargo bench --bench core_bench
Der Benchmark-Quellcode befindet sich in benches/core_bench.rs und misst den Durchsatz von Parser/Extraktion.
GitHub Actions-Workflows sind enthalten:
.github/workflows/ci.yml: Format-Check, Clippy, Tests, Bench-Build.github/workflows/release.yml: Tag-basierte Release-Paketierung und GitHub-Release-Veröffentlichungsrc/security/patterns.rs)Alle Module enthalten umfassende Inline-Dokumentation. Schlüsselmodule:
src/extraction/parser.rs - Unified-Diff-Parser mit Hunk-Extraktionsrc/extraction/elements.rs - Sprachbewusste Code-Element-Erkennungsrc/extraction/snippets.rs - Vollständige Code-Snippet-Extraktion mit Grenzerkennungsrc/security/tagger.rs - Engine für Sicherheitsmustervergleichsrc/git/commands.rs - Git-Operation-WrapperVollständige API-Dokumentation erstellen:
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
Beiträge sind willkommen! Bitte:
cargo test bestanden wirdMIT-Lizenz – siehe Datei LICENSE für Details
| Flag | Standard | Beschreibung |
|---|
-o, --output | ./reports/<timestamp> | Ausgabeverzeichnis für Berichte |
-j, --parallel | 4 | Gleichzeitige Repo-Verarbeitung |
-t, --timeout | 120 | Git-Operation-Timeout (Sekunden) |
-d, --history-depth | 2 | Zu diffende historische Commits |
--snippet-context | 5 | Kontextzeilen um Änderungen |
--max-snippet-lines | 200 | Max. Zeilen pro Snippet |
--max-elements | 500 | Max. Elemente pro Diff |
--diff | — | Diff zweier Referenzen in einem Repo (BASE..HEAD) |
--summary-format | json,md | Ausgabeformate: json, md, txt, sarif |
| Fähigkeit | Bash-Einzeiler | DiffCatcher |
|---|
| Rekursive Erkennung | Nur Elemente der obersten Ebene | Verschachtelte Repos, Symlinks, Filter |
| Zustandsverfolgung | Keine | Commit-Hashes, Erkennung von Uncommitted, Pull-Protokolle |
| Code-Verständnis | Nur rohes Diff | Extrahiert Funktionen/Structs/Klassen in über 10 Sprachen |
| Code-Snippets | Keine | Vollständiger Vorher/Nachher-Code mit Kontextfenstern |
| Sicherheitsanalyse | Keine | 18 integrierte Muster (Authentifizierung, Krypto, Geheimnisse, SQLi, XSS) |
| Ausgabeformate | Nur Terminal | JSON, Markdown, SARIF (GitHub Code Scanning) |
| Repo-übergreifende Ansicht | Pro Repo | Aggregierter Sicherheitsbericht über alle Repos |
| Leistung | Sequentiell | Parallele Arbeiter, LRU-Caching, inkrementeller Modus |
| CI/CD-Integration | Keine | SARIF-Upload zu GitHub/Azure DevOps |
| Fehlerbehandlung | ` | |
| Pfadbehandlung | Scheitert bei Leerzeichen | Behandelt alle Pfadnamen korrekt |
| Historischer Kontext | Fest HEAD~1 | Konfigurierbare Tiefe, Zustandsverfolgung |