metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2010-11-21 01:44 pm

diff и смысл сравниваемых файлов

А вот скажите, есть ли какая-нибудь вариация diff, умеющая не только сравнивать текст, а кроме того, еще и пользоваться информацией о структуре или смысле этого текста?
Например, сравнение двух исходников было бы намного гуманнее, если сначала их оба отпарсить в AST, а потом только сравнивать - сразу прекратились бы всевозможные заморочки типа "поменяли порядок расположения методов, переформатировали код - diff показывает хрень".
Если сравнивать что-то вроде таблиц БД, то очевидно, что сначала надо сравнить их метаданные, построить (возможно, при помощи человекопользователя) трансформацию одной таблицы в другую, а потом уже с ее учетом сравнивать, "что изменилось в записях".
В принципе, наверно можно такое сделать, прикрутив между diff и файлами какие-то промежуточные фильтры.

[identity profile] g-rub.livejournal.com 2010-11-21 12:07 pm (UTC)(link)
Если как-то определено понятие "нормализованной" версии текста -- просто используйте (или напишите) соответствующую утилиту-нормализатор (например, под линуксом для XML/HTML есть tidy). Причем не на этапе diff, а на этапе сохранения документа. Т.е. отредактировал->сохранился->tidy->коммит. И дальше вся работа только с нормализованными версиями.

Для каждого типа текста иметь свой патченный diff мне кажется извратом, но некоторые по этому пути идут. xmldiff в репозитории наблюдаю.

[identity profile] d4s.livejournal.com 2010-11-21 10:19 pm (UTC)(link)
угу-угу. всемерно согласен.
1 задача - 1 утилита.

[identity profile] aamonster.livejournal.com 2010-11-21 10:47 pm (UTC)(link)
1. Кто бы написал нормализатор для грёбанного C# (мелкософт при редактировании форм норовит переставлять местами члены класса и менять порядок их инициализации...)
2. Иногда изменение порядка имеет смысл - и не хотелось бы, чтобы нормализатор его пришиб.

[identity profile] osdm.livejournal.com 2010-11-21 11:38 pm (UTC)(link)
А в ReSharper-е случайно нет для этого фишек?