Подтвердить что ты не робот

Извлечь соответствующие изменения для проверки кода

Я работаю над проектом с командой, где мы проверяем раньше и часто. Индивидуальные проверки завершаются в соответствии с тем, что разработчик делает изменения (включая тесты, где это возможно), но иногда направление работы меняется незначительно, и предыдущие фиксации необходимо отменить и сделать другим способом. Или код заглушки заполняется в последующих коммитах.

Когда придет время для просмотра кода, существует последовательность фиксации всех тегов с одинаковым номером идентификатора ошибки. Легко получить список таких изменений. Когда рецензент просматривает изменения один за другим, иногда происходит фиксация A, которая отменяется или модифицируется последующим фиксацией B как часть одного и того же обзора. Это может затруднить анализ.

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

Как вы справляетесь с этой ситуацией? Существуют ли инструменты, которые, учитывая последовательность патчей к файлу, могут дать моральный эквивалент разницы между первой и последней версиями, но включают только подмножество этих патчей?

Подумайте об этом, я мог бы создать временную ветвь в git начиная с первого связанного изменения, а вишня - выбрать изменения, относящиеся к обзору. Надеюсь, не будет слишком много конфликтов, которые должны быть решены (и если есть, тогда вся партия должна быть пересмотрена одновременно). Любые другие идеи?

Дополнительная информация: Это большая устаревшая система, где одно изменение может касаться нескольких файлов. Файлы большие и крутые - слишком большие, чтобы просто просмотреть конечный продукт без указания того, что могло бы измениться.

4b9b3361

Ответ 1

Один подход (с использованием терминологии подрывной деятельности, но аналогичные подходы должны работать и с другими системами):

Проверьте рабочую копию при пересмотре непосредственно перед первыми изменениями. Затем объедините все связанные коммиты в свою рабочую копию.

Теперь у вас есть рабочая копия, которая отличается от ее базы только соответствующими изменениями. Вы можете просмотреть это напрямую или создать патч из него для просмотра.

Если какое-то несвязанное изменение после базовой ревизии перекрывается с пересмотренными изменениями, вы можете получить конфликт слияния, но это должно быть редко.

Ответ 3

Оказывается, вы можете сделать это довольно хорошо в IntelliJ IDEA, если у вас есть этот инструмент:

Выберите "Управление версиями" | Показать изменения изменений.

С левой стороны вы выбираете репозиторий и нажимаете на все изменения, которые хотите просмотреть.

В правой панели вы получите список всех файлов, на которые повлияли изменения, которые вы выбрали. Когда вы выберете "diff", вы увидите внутренние изменения в выбранных наборах изменений. Внутренние повторные работы, которые происходят внутри коммитов, не отображаются (как и следовало ожидать)

Ответ 4

С точки зрения Subversion

Учитывая ваши требования, я буду запускать обзоры кода, сравнивая их с тегом из последнего обзора; то есть между двумя тегами.

Ответ 5

Если у вас есть возможность переключать системы управления версиями, вы можете серьезно рассмотреть git (или меркурийный или другой аналогичный инструмент).

Каждый разработчик создает свой собственный локальный репозиторий.

Для каждой ошибки, над которой они работают, они создают ветку.

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

Затем разработчик отправляет обновленный набор изменений для просмотра.

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

Ответ 6

Я бы сделал очень многое, что вы предложили. Создайте ветку обзора. Получить разработчика (ов), чьи изменения пересматриваются, чтобы сделать вишневый сбор в эту ветку. Разверните корень ветки головой.

Я бы, вероятно, также создал небольшой инструмент для захвата всех проверок, которые соответствуют указанному тегу id отслеживания ошибок, и объединить их в примерный script, чтобы сделать выбор вишни. Я бы определенно дал пользователю возможность отредактировать этот script, прежде чем запускать его, хотя, как я могу поспорить, некоторые вещи теряют свою оценку.

Сделайте обзор в ветке. Внесите необходимые изменения в ветку. Черри выбирает правки обратно в багажник. Отмените ветвь обзора, если вы этого больше не хотите.

Ответ 7

Uh, просто посмотрите на последнее состояние файла.

(Ветвление для каждого изменения - это PITA. Не делайте этого.)

Ответ 8

См. наш http://www.semdesigns.com/Products/SmartDifferencer/index.html для инструмента, который параметризуется языковой грамматикой, и производит дельта в терминах элементов языка (идентификаторы, выражения, утверждения, блоки, методы...), вставленных, удаленных, перемещенных, замененных или имеющих одинаковые подписи. Этот инструмент игнорирует переформатирование в виде пробелов (например, различные разрывы строк или макеты) и семантически неотличимые значения (например, он знает, что 0x0F и 15 являются одинаковым значением).

Это не будет распутывать два набора изменений, сделанных по принципиально иным причинам. Но это позволит свести к минимуму размер дельт, который вы должны проверить, и это наверняка помощь.

Вы говорите, что файлы имеют тысячи строк. Это звучит как COBOL. Там есть умный инструмент differencer для С#, PHP, Java, С++... и COBOL, с примерами для большинства из них на веб-сайте.

Ответ 9

Пакет patchutils содержит complexiff, который может "создать совокупный унифицированный патч из двух инкрементных патчей".

Ответ 10

Если вы являетесь разработчиком .NET, вы можете найти Возможности NDepend для разбора кода, полезные для такого сценария. Отказ от ответственности: я являюсь одним из разработчиков этого инструмента

В основном NDepend может анализировать базу кода и создавать, а затем сохранять моментальный снимок кода. Два таких снимка, взятых в два разных раза, можно сравнить. Затем NDepend позволяет писать кодовый запрос по LINQ (CQLinq) для запроса новых методов/классов, удаленных методов/классов, методов/классов, где код был изменен... так же легко, как и запись:

from m in Application.Methods where m.CodeWasChanged() select m

Затем вы можете уточнить свой запрос кода и запросить определенные свойства, например, если имя метода содержит слово "Извлечь" и содержит более 30 строк кода:

from m in Application.Methods 
where m.CodeWasChanged() && m.NameLike("Extract") && m.NbLinesOfCode > 30
select m

Кроме того, NDepend может подключиться к любому инструменту diff. Затем пользователь может сравнить 2 версии измененного метода или класса.

Еще одна интересная возможность - подключить NDepend к RedGate Reflector, декомпилировать 2 версии метода/класса и сравнить эти 2 версии с инструмент для анализа текста. Эта возможность может быть особенно полезна в вашем сценарии, потому что таким образом вы выполняете различие кода только по одному методу или классу, даже если он действительно вложен в огромный исходный файл.

Кроме того, чтобы избежать написания запроса самостоятельно, панель "Поиск по изменениям" генерирует такой кодовый запрос для diff для вас:

NDepend Search by Changes Panel

Надеюсь, что этот оригинальный подход может помочь.