Граф коммитов
Визуализация истории репозитория: рендер на Canvas, виртуализация, поиск
Граф коммитов — главный экран GitBor. Реализован модулем src/renderer/src/features/graph/, layout считается в src/core/git/GraphLayout.ts.
Рендер на Canvas с виртуализацией
Каждая строка графа рисуется на HTML5 Canvas, а не через DOM. Для больших историй включается виртуализация: рендерятся только строки в видимой области и небольшой буфер сверху и снизу. Это позволяет работать с репозиториями на 15000+ коммитов без падения производительности — DOM-tree остаётся плоским.
Worker-поток для тяжёлых layout
Расчёт позиции каждого узла графа (какая ветка в какой полосе, как соединять линии между коммитами) делается в GraphLayout.ts. Для маленьких репозиториев — синхронно в main-процессе. Когда количество коммитов превышает 2000, layout уходит в WorkerPool (src/core/workers/), который держит 2 worker_threads с round-robin балансировкой и автоматическим перезапуском при падении.
Та же логика — для парсинга git log (порог 512 KB) и git status (256 KB).
Дедупликация payload между вкладками
MessageBridge.sentGraphByRepo хранит хеш последнего отправленного layout для каждого репозитория. Когда вы переключаетесь A → B → A, повторный layout с тем же хешем не отправляется в renderer — экономит мегабайты JSON через IPC при частых переключениях.
Цвета веток
Каждая полоса (lane) графа получает свой цвет. Цвет стабилен пока ветка существует — это упрощает отслеживание ветки взглядом при прокрутке.
Навигация
| Действие | Что делает |
|---|---|
| Клик по коммиту | Загружает детали + автоматически выбирает diff первого изменённого файла |
| Двойной клик по ветке (в сайдбаре) | git checkout |
| ↑ / ↓ в графе | Перемещение между коммитами с авто-скроллом, чтобы выбранный коммит оставался виден |
| Ctrl+F | Поиск по теме коммита, имени автора или префиксу хеша |
| Правый клик по коммиту | Контекстное меню: checkout, reset, cherry-pick, revert, rebase, compare, copy SHA |
Сравнение двух коммитов
Правый клик по первому коммиту → Compare From Here. Затем правый клик по второму → Compare with 'abc1234'. GitBor покажет diff между этими двумя точками — удобно для проверки серии изменений.
Подписанные коммиты
В графе показывается бейдж ✓ Signed для коммитов, прошедших GPG/SSH верификацию. Цветовая кодировка:
- Зелёный (Good) — подпись валидна и доверена.
- Оранжевый (Untrusted, Expired) — подпись валидна, но ключ не доверен или истёк.
- Красный (Bad, Revoked) — подпись невалидна или ключ отозван.
TODO: скриншот графа с цветными ветками и signed-бейджем.