/** * Состояние ветки задачи относительно `dev` (#364). * * Конвейер приводит ветку к `dev` сам (#257) и при конфликте возвращает задачу, * не тратя цикл ревью. Но конфликт при этом обнаруживается в комментарии через * сорок минут, а чинится всё равно на машине автора. Дешевле сказать ему это до * пуша — тогда конвейеру нечего ребейзить, а конфликт виден там, где есть руки. * * Отставание — предупреждение, а не запрет: гейтом остаётся конвейер, который * забыть не может. Локальная проверка лишь убирает лишний круг. */ /** * Совет по ребейзу. `null` означает «ветка содержит весь dev, делать нечего». * * @param {{ behind: number, base?: string }} state */ export function rebaseAdvice({ behind, base = 'origin/dev' }) { const count = Number(behind); if (!Number.isFinite(count) || count <= 0) return null; const commits = count === 1 ? 'коммит' : count < 5 ? 'коммита' : 'коммитов'; return `ветка отстала от ${base} на ${count} ${commits}.` + ` Конвейер приведёт её сам перед ревью, но после ребейза разбор станет` + ` полным, а не по дельте (§2.10). Дешевле сделать это здесь:` + ` git fetch origin && git rebase ${base}`; } /** * Пути, на которых встал ребейз, из вывода `git diff --name-only --diff-filter=U`. * * Читается ДО `git rebase --abort`: abort снимает состояние конфликта вместе с * этим списком, и тогда автору остаётся только «не ребейзится», без единого * имени файла. */ export function conflictingPaths(output) { return [...new Set(String(output ?? '').split('\n') .map((line) => line.trim()) .filter(Boolean))].sort(); } /** Строка о том, что `dev` ушёл вперёд, пока шло ревью. `null`, если не ушёл. */ export function devMovedNote({ moved, sha }) { const count = Number(moved); if (!Number.isFinite(count) || count <= 0) return null; const commits = count === 1 ? 'коммит' : count < 5 ? 'коммита' : 'коммитов'; const at = sha ? ` Материал ревью — \`${sha}\`.` : ''; return `Пока шло ревью, \`dev\` продвинулся на ${count} ${commits}.${at}` + ' Вердикт вынесен по дереву, которое уже не совпадает с вершиной линии:' + ' слияние приведёт ветку к dev, и это другой код (§2.10).'; }