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] sorhed.livejournal.com 2010-11-21 12:46 pm (UTC)(link)
Мечта миллионов программистов реализована в IntelliJ IDEA. Но из командной строки не работает.

(весь код в редакторе парсится в AST в реальном времени, оттого и рефакторинги все работают как положено).

[identity profile] sergiej.livejournal.com 2010-11-21 01:05 pm (UTC)(link)
Кто бы сомневался. А Эклипс, конечно, не умеет :)

[identity profile] altmind.livejournal.com 2010-11-21 03:07 pm (UTC)(link)
неверно. в eclipse для java - structured compare. только вот толку, все равно текстовой дифф удобне.

[identity profile] sergiej.livejournal.com 2010-11-21 05:08 pm (UTC)(link)
Ну как кому, там текстовый дифф присутствует рядом, структуральное сравнение только для навигации. ИМХО это в тысячу раз удобнее чем бегать по тексту.

[identity profile] basanov.livejournal.com 2010-11-21 02:09 pm (UTC)(link)
Не работает дифф. Если я делаю ренейм класса, после чего изменяется 50 файлов, то любой другой программист видит 50 изменившихся файлов, а не "произведен ренейм".

[identity profile] thesz.livejournal.com 2010-11-21 05:12 pm (UTC)(link)
В darcs есть изменение "переименование".

[identity profile] aamonster.livejournal.com 2010-11-21 04:16 pm (UTC)(link)
+1.

[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] 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-е случайно нет для этого фишек?

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

[identity profile] denisioru.livejournal.com 2010-11-21 12:42 pm (UTC)(link)
XML несравненно проще AST-дерева

[identity profile] permea-kra.livejournal.com 2010-11-21 01:00 pm (UTC)(link)
Любую древовидную структуру можно отразить в XML. Так что неправда ваша.

[identity profile] denisioru.livejournal.com 2010-11-21 01:02 pm (UTC)(link)
Я с этим не спорю, просто тогда надо будет писать свой компилятор на каждый язык, исходники которого будешь сравнивать. Или брать исходники компилера и точить свой инструмент из него. А чуть сложнее "сравнить XML".

[identity profile] permea-kra.livejournal.com 2010-11-21 01:43 pm (UTC)(link)
Ну, есть gcc-xml, как минимум. Для F# нужно потроха компилятора смотреть, это да.

[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] alexott.livejournal.com 2010-11-21 01:35 pm (UTC)(link)
на хаскеле насколько я помню есть несколько парсеров для разных языков, так что можно написать

[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