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

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

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

Date: 2010-11-21 12:46 pm (UTC)
From: [identity profile] sorhed.livejournal.com
Мечта миллионов программистов реализована в IntelliJ IDEA. Но из командной строки не работает.

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

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

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

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

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

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

Date: 2010-11-21 04:16 pm (UTC)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Date: 2010-11-21 01:35 pm (UTC)
From: [identity profile] alexott.livejournal.com
на хаскеле насколько я помню есть несколько парсеров для разных языков, так что можно написать

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

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

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

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

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Oct. 7th, 2025 08:30 pm
Powered by Dreamwidth Studios