Я ищу приложение, которое может сравнить два источника C ++ и найти значимые для кода различия (для сравнения версий, которые могли быть переформатированы по-разному). Как минимум, то, что имеет возможность игнорировать изменения в пробелах, символах табуляции и новых строках, которые не влияют на функциональность источника (обратите внимание, что вопрос о том, считается ли символ новой строки пробелом, зависит от языка , и C и C ++ делают это ). И, в идеале, то, что может точно идентифицировать все значимые для кода различия. Я нахожусь под Ubuntu.
В соответствии с этим diff --help | grep ignore
, я ожидал, diff -bBwZ
что сделаю разумную работу (я ожидал получить несколько ложных негативов, которые будут рассмотрены позже). Тем не менее, это не так.
если у меня есть следующие файлы с фрагментами
test_diff1.txt
else if (prop == "P1") { return 0; }
и test_diff2.txt
else if (prop == "P1") {
return 0;
}
тогда
$ diff -bBwZ test_diff1.txt test_diff2.txt
1c1,3
< else if (prop == "P1") { return 0; }
---
> else if (prop == "P1") {
> return 0;
> }
вместо пустых результатов.
Использование средства форматирования кода в качестве «фильтра» на обоих входах может отфильтровывать эти различия, но затем полученный результат должен быть привязан к исходным входам для окончательного отчета о различиях, чтобы сохранить фактический текст и номера строк. Таким образом, цель достижима без необходимости должного компилятора ... Хотя я не знаю, доступно ли что-то.
Можно ли достичь цели diff
?
Иначе есть ли альтернатива (желательно для командной строки)?
источник
В аналогичной ситуации, когда мне нужно было сравнить две
git
ветви без учета форматирования кода, я сделал это:созданные временные филиалы:
отформатировал обе ветви используя
clang-format
:сделал реальное сравнение:
(
-w -b
позволяет игнорировать разницу в пространстве, на всякий случай).Вы можете предпочесть
uncrustify
болееclang-format
(uncrustify
«smod_full_brace_if
может быть использован для обеспечения ввода / удалений фигурных скобок вокруг одной строкиif
» ы тела).Также, если GNU
parallel
не установлен, используйтеxargs
- он делает то же самое, но немного дольше.источник