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

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

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

[identity profile] basanov.livejournal.com 2010-11-21 11:46 am (UTC)(link)
Ты только что описал мечту миллионов программистов. =)

Чтобы дифф понимал ренеймы и рефакторинг в качестве изменений не текста, но смысла.

[identity profile] avnik.livejournal.com 2010-11-21 11:55 am (UTC)(link)
Я помню, я как-то писал diff (точнее cmp но получился дифф) сравнивающий 2 куска (x)html c учетом незначащих пробелов, потому что готового не нашел, и сделал жуткий ad-hoc

[identity profile] hshhhhh.livejournal.com 2010-11-21 11:57 am (UTC)(link)
напиши на F# свой дифф и продавай задорого :).

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

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

[identity profile] permea-kra.livejournal.com 2010-11-21 12:08 pm (UTC)(link)
есть для xml

[identity profile] alexandr0.livejournal.com 2010-11-21 12:43 pm (UTC)(link)
diff <(нормализатор file1) <(нормализатор file2)
Осталось сделать удовлетворяющий нуждам нормализатор.

[identity profile] sorhed.livejournal.com 2010-11-21 12:47 pm (UTC)(link)
А, кстати, если мне не изменяет память, то такой дифф есть в Darcs. Но только для хаскела, разумеется.

[identity profile] sergiej.livejournal.com 2010-11-21 01:07 pm (UTC)(link)
Эклипс с джавой работает именно так, показывает структуру класса, сразу видно какие методы или там декларации добавлены, какие изменены, какие удалены.

[identity profile] sdfgh153.livejournal.com 2010-11-22 10:25 am (UTC)(link)
В Smalltalk diff так и работает. Ну и про darcs уже упоминали.

(Anonymous) 2010-11-23 02:47 am (UTC)(link)
вроде есть какой-то хмл-дифф

[identity profile] sbj-ss.livejournal.com 2010-11-23 08:40 am (UTC)(link)
Да вы там все упоротые (c)
раз) KDiff 3
два) CSDiff