Инструмент командной строки на 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