В настоящее время я работаю над инструментом генерации исходного кода. Чтобы убедиться, что мои изменения не привносят никаких новых ошибок, a diff
между выводом программы до и после моих изменений теоретически будет полезным инструментом.
Однако это оказывается сложнее, чем можно подумать, потому что инструмент выводит строки, в которых порядок не имеет значения (например, import
операторы, объявления функций и т. Д.), В полуслучайном порядке. Из-за этого выходные данные diff
загромождены многими изменениями, которые фактически являются только строками, перемещенными в другую позицию в том же файле.
Есть ли способ заставить diff игнорировать эти шаги и выводить только те строки, которые действительно были добавлены или удалены?
diff
инструмент сможет отделить действительные ходы от недействительных, так как порядок инструкций в коде имеет значение, и случаи, когда это не так, ограничены (импорт, объявление функций и классов, так далее.) ?Ответы:
Вы можете сделать простой diff, сохранить результат где-нибудь (чтобы избежать другого diff), пройти через линии в любой версии, а затем удалить их с другой стороны.
Это породило отдельный проект для рабочего кода. Код.
источник
/tmp/old
и/tmp/new
результатов различий не будет, так как есть только строки, которые были перемещены. Этот код, однако, дает результаты.Вы можете попытаться отсортировать их в первую очередь. Что-то вроде:
Bash (и zsh) могут сделать это в одной строке с подстановкой процесса
источник
Похоже, у вас есть контроль над инструментом. Затем сделайте его вывод предсказуемым: вместо генерации объявлений в полуслучайном порядке используйте (скажем) алфавитный порядок в качестве последнего средства. Это позволит не только удалить бесполезные помехи из различий, но и упростить чтение и проверку выходных данных инструмента для человека.
источник
Если файл структурирован по разделам, это просто разделы, которые не в порядке, и существует регулярное выражение, которое вы можете использовать для распознавания заголовка раздела, вы можете разбить файлы на их разделы, а затем сравнить попарно разделы.
Например, я просто сделал это на двух дампах MySQL, чтобы сравнить их после того, как некоторые имена баз данных изменили регистр (и, следовательно, дамп перечислил их в другом порядке):
источник