[890c29b4c99f25bd21ec5f5b5b551cf3358b7121]
#git
Разные способы code review
https://nasamuffin.github.io/git/open-source/email/code-review/2019/05/22/how-i-learned-to-love-email-patches.html
https://gist.github.com/thoughtpolice/9c45287550a56b2047c6311fbadebed2
https://drewdevault.com/blog/Email-driven-git/
Отрывок от моего сообщения коллегам.
Табличка сравнения подходов. Тильда означает "зависит от".
┌───────────────┬──────┬──────┬───────┬─────────┬─────┬─────┬──────────┬──────┐
│ │GitLab│Gerrit│tracker│schwabrak│Почта│notes│send-email│inband│
├───────────────┼──────┼──────┼───────┼─────────┼─────┼─────┼──────────┼──────┤
│не нужно доп ПО│- │- │~ │+ │+ │+ │+ │+ │
├───────────────┼──────┼──────┼───────┼─────────┼─────┼─────┼──────────┼──────┤
│ не нужен доп │~ │- │- │+ │+ │+ │+ │+ │
│ сервер │ │ │ │ │ │ │ │ │
├───────────────┼──────┼──────┼───────┼─────────┼─────┼─────┼──────────┼──────┤
│локальная копия│- │- │- │+ │+ │+ │+ │+ │
│ review │ │ │ │ │ │ │ │ │
├───────────────┼──────┼──────┼───────┼─────────┼─────┼─────┼──────────┼──────┤
│ чёткое │ │ │ │ │ │ │ │ │
│ понимание что │- │+ │- │- │- │- │- │+ │
│ resolved │ │ │ │ │ │ │ │ │
├───────────────┼──────┼──────┼───────┼─────────┼─────┼─────┼──────────┼──────┤
│архив коммитов │- │+ │~ │~ │~ │~ │+ │~ │
│ review │ │ │ │ │ │ │ │ │
├───────────────┼──────┼──────┼───────┼─────────┼─────┼─────┼──────────┼──────┤
│автоматические │+ │+ │- │- │- │- │+ │- │
│ оповещения │ │ │ │ │ │ │ │ │
├───────────────┼──────┼──────┼───────┼─────────┼─────┼─────┼──────────┼──────┤
│ доступная │ │ │ │ │ │ │ │ │
│ история для │+ │+ │+ │+ │- │+ │- │+ │
│ всех │ │ │ │ │ │ │ │ │
└───────────────┴──────┴──────┴───────┴─────────┴─────┴─────┴──────────┴──────┘
* не нужно доп ПО -- предполагаем, что у нас у всех имеется Git и почта,
плюс возможность работать с issue tracker. Наличие только
web-приложения, как в случае с Gerrit или GitLab -- не считается
приемлемым удобным вариантом и нужны дополнительные инструменты для
работы с ними
* не нужен доп сервер -- нужно ли что-то дополнительно поднимать? Gerrit
у нас нет, который бы кто-то поддерживал. GitLab есть, но... его
обновление может привести к каким угодно последствиям и потерям (уже
случалось), которыми мы не управляем
* локальная копия review -- есть ли возможность полностью иметь
локальную историю проведённых review? Речь про адекватную простую
возможность получения, типа git fetch/clone. В случае с schwabrak
issue tracker, мы просто git clone-ом получаем все issues
* чёткое понимание что было resolved -- рецензент пишет с десяток
замечаний. Во время fixup/whatever коммитов часть из них исправляется.
Есть ли простой способ чётко понять были все замечания исправлены?
* архив коммитов review -- есть ли архив со всеми версиями коммитов,
которые были отправлены на review? Если договориться о том, чтобы мы
делали push в какой-нибудь refs/review/... ветку, в которой не будет
rebase-ов и которую мы не будем удалять, то тогда можно иметь и архив.
Gerrit сам по себе хранит все версии и ни о чём договариваться не надо.
Если всё же надо сделать rebase или что-то подобное, то тогда сделать
новую review ветку
* автоматические оповещения -- после отправки новых коммитов, нужно ли
самостоятельно предпринимать какие-то действия для оповещения о push?
* доступная история для всех -- доступна ли история review сообщений для
всех? Если, например, обсуждение идёт чисто по почте между двумя
участниками, то другие это никак не могут получить. Если только оно не
будет отправляться в почтовую рассылку или особый адрес где вся
корреспонденция будет архивироваться (как это происходит в Linux проекте)
Какие подходы мне приходят в голову?
* Gerrit: многие из нас имели с ним дело. Выступает отдельным сервером,
в который делается git push, а также предустанавливаются .git/hooks
для вставки change-id поля в commit message, чтобы была понятна связь
между новыми версиями патча (коммита). Этого сервера у нас нет, так
как некому поддерживать. Плюс он на Java, что мало кто из нас умеет.
* GitLab: делается merge request (MR), добавляется assignee,
комментариями обсуждается сам review и код. Обновлённые версии
push --force-атся в ту же ветку MR. В самом web-приложении GitLab
показывает прежде загруженные версии коммитов, но через git ls-remote
я не увидел веток с которых можно бы было достать их. Есть штатная
утилита glab, на Go, в которой можно смотреть/писать эти комментарии.
Через glab mr note list можно увидеть упоминание хэшей этих коммитов,
но попытка сделать fetch мне выдаёт, что нет таких объектов
* tracker -- под этим я подразумеваю некий general purpose issue tracker
в котором в виде комментариев к задаче пишутся сами review и идёт
обсуждение. Несколько лет на моём прошлом месте работы десятки людей в
команде так работали вполне себе успешно. Статус задачи переводится в
review, назначается assignee, в комментарии указывается ветка которую
надо отрецензировать
* schwabrak -- аналогично tracker, но гарантированно имеется полная
копия всего tracker, так как это очередной git-репозиторий. Так как
наш текущий schwabrak для pkit и okz2 проектов расположен не на
"обычном" git-репозитории, а на GitLab, то туда мы не можем добавить
просто так свои .git/hooks, где можно бы было отсылать оповещения об
изменениях только участвующим в задаче людям. Сейчас у нас
широковещательная рассылка всех действий над tracker отправляемая
всем. Поэтому если review бы проходило через правку issue/commit файл,
то об этом оповещения бы шли всем, что наверное может надоесть
* почта -- под этим подразумеваю то, что происходило сейчас. Просто
отправляем почтовое сообщение о том, что надо сделать review. И само
review просто является ответом. И дальше перебрасывание сообщениями в
пределах этого thread-а. Для этого кстати удобно бы было использовать
git-request-pull команду
* notes -- никогда не пробовал такого на практике (не сами git notes, а
именно review делать), но идея в том, чтобы почтовые сообщения (review
и обсуждение) писать в виде notes к коммитам которые надо рецензировать.
Прямо вместе с кодом будет параллельно существовать и текстовые review
* send-email -- под этим подразумевается самый классический способ
использования git-а, применяемых во многих крупных (крупнейших!)
проектах, типа того же Linux. git-format-patch, git-send-email, git-am
команды для работы со всем этим. Исправленные (amended) коммиты
отправляются всем скопом, под увеличивающейся версией (format-patch -v),
не забывая указывать --in-reply-to, для соединения новой пачки с
оригинальным сообщением о review в thread. Обсуждение/review прямо
внутри thread-а происходит, над прямо конкретным патчем. Крайне
полезен функционал --interdiff, который может показать разницу в новых
версиях относительно прошлых
* inband -- под этим подразумеваю то, на чём вчера и остановились. По
почте/whatever отправляется оповещение о ветке где надо сделать
review (наверное имеет смысл в schwabrak commit message писать, при
переводе состояния задачи в review). В той же ветке рецензент
добавляет коммит поверх всех остальных, где прямо внутри кода
оставляет комментарии. Далее, оповещает о том, что закончил (в
schwabrak, переводя статус задачи в wip). Исправления в ветке делаются
поверх этого коммита, удаляя "# REVIEW" (whatever) комментарии
рецензента, показывая что замечание исправлено. И под конец diff между
первым и последним коммитом ветки не должен будет содержать REVIEW
комментарии, означая что всё исправлено
По идее, штатный способ работы через send-email -- наиболее удобный и
гибкий в общем случае. Судя по всему, это единственный разумный способ
работы на огромных проектах, где большая нагрузка на рецензента (как в
Linux).
Но вместо привычного нам git push, нужно подготавливать патчи для
отправки. Делать format-patch, возможно редактировать их немного, не
забывать связывать в thread-ы. На приёмной стороне, видимо, плодить
ветки для новой версии патчей, чтобы review-ить не просто патч в
почтовом клиенте, а видеть весь код. Немного побольше телодвижений.
Плюс это требует полноценную Unix-like рабочую экосистему: работающую
почту. То есть локальный MTA и адекватный MUA. У кого-то это всё есть, у
кого-то нет. Применять штатный Git подход не получится без полноценного
настроенного Unix окружения (именно поэтому из коробки во всех
нормальных дистрибутивах/ОС и устанавливается MTA). Хотя это совсем не
сложно настроить.
Но вот "inband" подход, не требует ничего сложнее привычных fetch/push.
Вести обсуждение в нём: ну так себе наверное по удобству, но не
невозможно. Плюс всё равно надо как-то оповещать о том, что был
произведён push с ответом. Но учитывая, сколько нас тут человек, как не
много review в принципе производится, то не вижу тут большой проблемы.
[оставить комментарий]