История имеет значение

В какой-то момент вашей работы инженером-программистом возникают вопросы, связанные с историей. Рассмотрим типичный исходный файл, который много раз изменялся с момента его создания. Первоначальный замысел авторов был утерян под множеством изменений, внесенных с течением времени. Несмотря на трудности, мы хотим понять исходную идею, а также причину конкретных изменений.

Какие инструменты мы могли бы использовать, чтобы упростить процесс понимания кодовой базы?

git blame на помощь

Часто мы сводим проблему понимания кодовой базы к некоторым конкретным вопросам о конкретном фрагменте кода. А именно, в какой коммит был введен этот фрагмент? Какое сообщение и автор этого коммита? На эти вопросы можно легко ответить с помощью git blame. Во многих случаях достаточно git blame (или соответствующей функции в среде IDE). git blame основан на строке, поэтому мы можем видеть, что данная строка была затронута конкретной фиксацией - но как насчет отдельного токена (метода, параметра или переменной)? Конечно, вы можете продолжить детализацию истории с помощью git blame, чтобы выяснить, почему был добавлен данный параметр, но это требует времени. Остаются аналогичные вопросы: кто, почему и когда ввел или модифицировал данный токен?

Познакомьтесь со своим приятелем

Context Buddy помогает решить именно эту проблему: история на основе токенов. Давайте посмотрим на его конкретный вариант использования, чтобы увидеть инструмент в действии. Для этого примера мы собираемся использовать расширение Visual Studio Code от Buddy, но функциональность плагина IntelliJ IDEA очень похожа. Код примера на самом деле является существующим действием GitHub, которое используется для предоставления более продвинутых функций, которые будут представлены в будущем и описаны в следующих статьях. Понимание того, как работает этот код, не требуется для целей этой статьи. Мы рассмотрим только историю внесенных в него изменений.

Начнем со следующего фрагмента:

Предполагая, что репозиторий git уже существует, давайте зафиксируем файл в системе контроля версий с помощью команд git add и git commit . На данный момент мы уже можем использовать Context Buddy! Для этого установите расширение Context Buddy, которое можно найти в Visual Studio Marketplace.

Теперь нажмите кнопку «Enable Context Buddy» в древовидной структуре плагинов.

Мы видим, что каждый токен выделен одним цветом. Более того, когда вы наводите указатель мыши на токен, появляется всплывающая подсказка с информацией о последнем коммите, изменившем его. Чтобы увидеть мощь плагина, мы собираемся внести некоторые изменения. Давайте посмотрим на следующую версию файла:

Как видите, второй коммит внес ряд дополнений. Как эта версия файла соотносится с исходной? Какие токены были добавлены или изменены во втором коммите? В этот момент становится очевидным преимущество Context Buddy перед git blame.

Как инструмент реагирует на новые изменения? Если видимые токены происходят из разных коммитов, каждая фиксация выделяется другим цветом.

В нашем следующем примере мы увидим, как файл выделяется после трех коммитов. Сразу перейдем к рабочему примеру:

На этом этапе полезно начать использовать дополнительные визуальные функции, предоставляемые Context Buddy. Щелкните один из перечисленных контекстов фиксации, чтобы понять, какие фрагменты кода соответствуют заданному моменту в истории. Кроме того, вы можете начать экспериментировать с различными цветовыми вариантами и настройками. В приведенных выше примерах для каждой отдельной фиксации указан разный цвет, но, по мнению автора, код также может быть выделен. Стоит отметить, что в нашем примере все изменения были внесены одним человеком, но такие варианты становятся более полезными по мере роста вашей команды, а также по мере роста истории вашего репозитория.

В заключение давайте рассмотрим еще один пример, демонстрирующий, как Context Buddy обрабатывает более сложную историю фиксации. Это файл из open-source проекта falcon.

Другие соответствующие приложения

Примеры показывают, что инструмент очень полезен даже в простых случаях. Он обеспечивает детальное и ясное представление об истории нашего кода. Однако его настоящая сила проявляется в более сложных ситуациях.

Одна из таких ситуаций - последствия изменения форматирования кода в рамках проекта. После такого изменения информация, предоставленная git blame, становится бесполезной. Однако Context Buddy сохраняет соответствующую информацию благодаря отслеживанию изменений для токенов кода, а не строк. Переформатирование больше не оказывает нежелательного влияния на нашу историю.

Под капотом

Как на самом деле работает Context Buddy? Чтобы понять механизм, лежащий в основе этого инструмента, мы можем начать с другого вопроса - как git diff на самом деле сравнивает версии файлов? Он делает это построчно. Вот отрывок из разницы при фиксации предыдущего примера.

Git распознает это изменение как удаление строки и добавление другой строки. А вот токен «name» вообще не изменился. Этот факт не учитывается git, но распознается Context Buddy. Как это делается?

Context Buddy разбивает файл на токены (в соответствии с языком или форматом файла) и отдельно отслеживает каждый токен и его позицию в файле. Давайте посмотрим на наш пример:

Начиная с приведенного выше фрагмента кода - он будет отслеживаться так:

При изменении на:

Преобразованный фрагмент кода будет представлен следующим образом:

Context Buddy берет фрагмент кода из столбца «Токен» и обновляет информацию о его положении. Значения в столбце «Позиция» соответствуют началу строки, концу строки, началу столбца и концу столбца. Бадди будет использовать контекст последней фиксации, в которой был изменен токен.

Языковая поддержка

Идентификация и локализация токенов в исходном коде - это процесс, уникальный для грамматики языка. Вот почему Context Buddy требует явной поддержки каждого языка программирования. Текущая реализация охватывает довольно широкий спектр популярных форматов файлов. Список поддерживаемых расширений файлов можно найти здесь в документации. Не стесняйтесь создавать проблему, если вы хотите, чтобы Buddy поддерживал любой другой язык.

Гораздо больше предстоит

Отслеживание истории для каждого отдельного токена - это то место, с которого мы начинаем, - это строительный блок для более продвинутых функций. Наша цель - раскрыть информацию, которая до сих пор была скрыта и недоступна. Мы собираемся получать и обрабатывать комментарии проверки запросов на вытягивание, семантические изменения и даже результаты тестов или производственные инциденты из вашего удаленного репозитория и связывать их с исходным кодом. Мы собираемся выпустить и представить эти идеи в ближайшем будущем - следите за обновлениями!

Получите и начните использовать

На данный момент Context Buddy доступен для IntelliJ IDEA и Visual Studio Code. Оба плагина доступны на соответствующих торговых площадках VS Code и IntelliJ IDEA. Если вы найдете этот инструмент полезным и у вас есть какие-либо пожелания по функциям, пожалуйста, создайте проблему в нашем общедоступном репозитории.