
Инструмент командной строки на Rust, который рекурсивно находит Git-репозитории, фиксирует изменения состояния, создаёт диффы, извлекает элементы кода с полными фрагментами и формирует отчёты, ориентированные на безопасность, для рабочих процессов проверки кода и аудита.
Если этот проект помогает вашей работе, поддержите дальнейшее обслуживание и новые функции.
ETH-кошелёк для пожертвований
0x11282eE5726B3370c8B480e321b3B2aA13686582
Отсканируйте QR-код или скопируйте адрес кошелька выше.
CLI-инструмент на Rust для рекурсивного обнаружения Git-репозиториев, захвата изменений состояния, генерации диффов, извлечения элементов кода с полными фрагментами и создания отчётов, ориентированных на безопасность, для процессов проверки кода и аудита.
Почему не просто bash?
Однострочник вроде
ls | while read line; do git -C "$line" diff HEAD~1 HEAD || true; doneпоказывает только сырые диффы. DiffCatcher добавляет рекурсивное обнаружение, извлечение элементов кода, обнаружение шаблонов безопасности, вывод SARIF для CI/CD, параллельную обработку и межрепозиторную агрегацию безопасности. См. полное сравнение ниже.
git clone https://github.com/Teycir/DiffCatcher.git
cd DiffCatcher
cargo build --release
./target/release/diffcatcher --help
# Сканировать все репозитории в каталоге (только fetch, без изменений)
diffcatcher ~/projects
# Выполнить pull и сгенерировать отчёт по безопасности
diffcatcher ~/projects --pull -o ./report
# Сравнить две ветки в одном репозитории (режим ревью PR)
diffcatcher ./my-repo --diff main..feature/auth -o ./pr-report
# Сгенерировать вывод SARIF для GitHub Code Scanning
diffcatcher ~/projects --summary-format sarif,json -o ./report
# Пробный прогон для просмотра того, что будет сканироваться
diffcatcher ~/projects --dry-run
# Быстрое сканирование с 8 параллельными рабочими
diffcatcher ~/projects -j 8 --quiet
# Сканирование с настройками по умолчанию (только fetch)
diffcatcher <ROOT_DIR>
# Пользовательский выходной каталог
diffcatcher ~/projects -o ./my-report
# Включить вложенные репозитории и следовать симлинкам
diffcatcher ~/projects --nested --follow-symlinks
# Пропустить скрытые каталоги
diffcatcher ~/projects --skip-hidden
# Только fetch (по умолчанию — без изменений рабочего дерева)
diffcatcher ~/projects
# Фактически выполнить pull изменений
diffcatcher ~/projects --pull
# Принудительный pull с stash/pop для "грязных" репозиториев
diffcatcher ~/projects --pull --force-pull
# Использовать стратегию rebase
diffcatcher ~/projects --pull --pull-strategy rebase
# Пропустить fetch/pull полностью (только исторические диффы)
diffcatcher ~/projects --no-pull
# Пропустить извлечение элементов (только сырые диффы)
diffcatcher ~/projects --no-summary-extraction
# Извлекать элементы, но пропустить фрагменты кода
diffcatcher ~/projects --no-snippets
# Настроить контекст фрагментов и лимиты
diffcatcher ~/projects --snippet-context 10 --max-snippet-lines 300
# Ограничить количество элементов на дифф
diffcatcher ~/projects --max-elements 1000
# Пропустить маркировку безопасности
diffcatcher ~/projects --no-security-tags
# Включить тестовые файлы в анализ безопасности
diffcatcher ~/projects --include-test-security
# Использовать пользовательские шаблоны безопасности
diffcatcher ~/projects --security-tags-file ./custom-patterns.json
DiffCatcher может автоматически загружать локальную конфигурацию проекта из:
<ROOT_DIR>/.diffcatcher.toml (по умолчанию)--config <FILE>--no-configПример:
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"]
Флаги командной строки по-прежнему переопределяют значения конфигурации, если явно заданы.
DiffCatcher поддерживает два типа плагинов:
--security-plugin-file <FILE> (повторяется)--extractor-plugin-file <FILE> (повторяется)Формат плагина безопасности соответствует JSON --security-tags-file (version, mode, tags).
Формат плагина извлечения:
{
"version": 1,
"extractors": [
{
"name": "policy-rule",
"kind": "Config",
"regex": "^policy\\s+([A-Za-z_][A-Za-z0-9_]*)"
}
]
}
# Сравнить две ветки в одном репозитории
diffcatcher ./my-repo --diff main..feature/auth
# Сравнить конкретные коммиты
diffcatcher ./my-repo --diff abc123..def456
# Сравнить с выводом SARIF для интеграции с CI
diffcatcher ./my-repo --diff origin/main..HEAD --summary-format sarif -o ./pr-report
Флаг --diff BASE..HEAD пропускает обнаружение репозитория и fetch/pull — он напрямую сравнивает две ссылки (ветки, теги или SHA коммитов) и запускает полный конвейер извлечения + маркировки безопасности на результате.
# Генерация SARIF вместе с другими форматами
diffcatcher ~/projects --summary-format sarif,json,md
# Только SARIF для загрузки в CI/CD
diffcatcher ~/projects --summary-format sarif -o ./report
Когда sarif включён в --summary-format, в корне отчёта создаётся файл results.sarif. Этот файл соответствует стандарту SARIF 2.1.0 и интегрируется с GitHub Code Scanning, VS Code SARIF Viewer, Azure DevOps и другими инструментами, совместимыми с SARIF.
# Инкрементальный режим (пропустить неизменённые репозитории)
diffcatcher ~/projects --incremental -o ./report
# Фильтрация по шаблону ветки
diffcatcher ~/projects --branch-filter "main"
# Настройка глубины истории
diffcatcher ~/projects --history-depth 5
# Вывод JSON для CI/CD
diffcatcher ~/projects --quiet --json > result.json
# Подробный вывод с обнаруженными путями
diffcatcher ~/projects --verbose
<report_dir>/
├── summary.json # Глобальный сводный отчёт
├── summary.md # Сводка в формате Markdown
├── results.sarif # Вывод SARIF 2.1.0 (при --summary-format sarif)
├── security_overview.json # Агрегация безопасности по всем репозиториям
├── security_overview.md
├── <repo-name>/
│ ├── status.json # Состояние репозитория
│ ├── pull_log.txt
│ └── diffs/
│ ├── diff_N_vs_N-1.patch # Сырой унифицированный дифф
│ ├── changes_N_vs_N-1.txt # Манифест файлов
│ ├── summary_N_vs_N-1.json # Извлечение элементов
│ ├── 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
└── ...
Полный список опций см. в diffcatcher --help.
Создайте JSON-файл с собственными шаблонами:
{
"version": 1,
"mode": "extend",
"tags": [
{
"tag": "pii-handling",
"description": "PII data processing",
"severity": "High",
"patterns": ["ssn", "social_security", "passport"]
}
]
}
Используйте с --security-tags-file ./patterns.json
src/
├── cli.rs # Разбор аргументов
├── scanner.rs # Обнаружение репозиториев
├── git/ # Операции с Git
│ ├── commands.rs # Обёртки Git
│ ├── state.rs # Захват состояния
│ ├── diff.rs # Генерация диффов
│ └── file_retrieval.rs
├── extraction/ # Извлечение элементов
│ ├── parser.rs # Парсер унифицированных диффов
│ ├── elements.rs # Обнаружение элементов
│ ├── snippets.rs # Извлечение фрагментов кода
│ ├── boundary.rs # Отслеживание границ (скобки/отступы)
│ └── languages/ # Специфичные для языка шаблоны
├── security/ # Маркировка безопасности
│ ├── tagger.rs # Сопоставление шаблонов
│ ├── patterns.rs # Встроенные шаблоны
│ └── overview.rs # Агрегация по репозиториям
└── report/ # Генерация отчётов
├── writer.rs # Структура каталогов
├── json.rs # Сериализация JSON
├── sarif.rs # Вывод SARIF 2.1.0
├── markdown.rs # Форматирование Markdown
└── snippet_writer.rs
Простой однострочник на bash может вывести диффы:
ls | while read line; do git -C "$line" diff HEAD~1 HEAD || true; done
Это подходит для быстрых проверок, но DiffCatcher добавляет значительные возможности:
Однострочник на bash — это ~100 байт. DiffCatcher — это инструмент аудита, ориентированный на безопасность, с полным извлечением элементов кода.
# Запуск всех тестов
cargo test
# Запуск определённого набора тестов
cargo test security_tagger
# Запуск с выводом
cargo test -- --nocapture
Тестовое покрытие включает:
# Компиляция бенчмарк-бинарников
cargo bench --no-run
# Запуск тестов производительности
cargo bench --bench core_bench
Исходный код бенчмарков находится в benches/core_bench.rs и отслеживает пропускную способность парсера/извлечения.
Включены рабочие процессы GitHub Actions:
.github/workflows/ci.yml: проверка форматирования, clippy, тесты, сборка бенчмарков.github/workflows/release.yml: сборка пакетов по тегам и публикация релизов на GitHubsrc/security/patterns.rs)Все модули содержат исчерпывающую встроенную документацию. Ключевые модули:
src/extraction/parser.rs — Парсер унифицированных диффов с извлечением ханковsrc/extraction/elements.rs — Обнаружение элементов кода с учётом языкаsrc/extraction/snippets.rs — Извлечение полных фрагментов кода с определением границsrc/security/tagger.rs — Движок сопоставления шаблонов безопасностиsrc/git/commands.rs — Обёртки для операций GitГенерация полной документации 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
Вклад приветствуется! Пожалуйста:
cargo test проходитЛицензия MIT — подробности в файле LICENSE
| Флаг | По умолчанию | Описание |
|---|
-o, --output | ./reports/<timestamp> | Каталог для выходного отчёта |
-j, --parallel | 4 | Одновременная обработка репозиториев |
-t, --timeout | 120 | Таймаут операций Git (сек) |
-d, --history-depth | 2 | Количество исторических коммитов для сравнения |
--snippet-context | 5 | Строк контекста вокруг изменений |
--max-snippet-lines | 200 | Максимальное количество строк на фрагмент |
--max-elements | 500 | Максимальное количество элементов на дифф |
--diff | — | Сравнить две ссылки в одном репозитории (BASE..HEAD) |
--summary-format | json,md | Форматы вывода: json, md, txt, sarif |
| Возможность | Однострочник на bash | DiffCatcher |
|---|
| Рекурсивное обнаружение | Только элементы верхнего уровня | Вложенные репозитории, симлинки, фильтры |
| Отслеживание состояния | Нет | Хеши коммитов, определение "грязных" репозиториев, журналы pull |
| Понимание кода | Только сырой дифф | Извлечение функций/структур/классов на 10+ языках |
| Фрагменты кода | Нет | Полный код до/после с контекстными окнами |
| Анализ безопасности | Нет | 18 встроенных шаблонов (аутентификация, криптография, секреты, SQLi, XSS) |
| Форматы вывода | Только терминал | JSON, Markdown, SARIF (GitHub Code Scanning) |
| Межрепозиторный обзор | Только по отдельным репозиториям | Агрегированный отчёт безопасности по всем репозиториям |
| Производительность | Последовательная | Параллельные рабочие, LRU кэширование, инкрементальный режим |
| Интеграция с CI/CD | Нет | Загрузка SARIF в GitHub/Azure DevOps |
| Обработка ошибок | Подавление ` | |
| Обработка путей | Сбой при пробелах | Корректная обработка всех имён путей |
| Исторический контекст | Фиксированный HEAD~1 | Настраиваемая глубина, отслеживание состояния |