В былые времена, на венде, для сравнения oracle-схем (читай баз) я удовлетворялся встроенным в Quest Software TOAD сравнивателем. Он был неплох, и со своей задачей справлялся. Но пересев в линух, меня ждало разочарование. Ни один из [и так небольшого количества] инструментов не предоставляет даже половины былого комфорта. А именно, элементарное сравнение и мёржинг двух пэкеджей (читай библиотек) по несколько тысяч строк в каждом, где каждый отформатирован по-своему а реальных изменений всего-ничего, становится натуральной пыткой. Поняв тщетность попыток найти необходимый функционал в одном инструменте, я решил поискать костыли в виде сторонних инструментов. А именно - самостоятельные сравниловки и мёржиловки ([visual] compare and merging tools). Перебрав практически все популярные инструменты, выяснилось, что очень немногие (читай почти никто) умели пропускать в сравнении двух текстовых файлов символы конца строки.
Поясню на примере:
[bugman@localhost 1]$ cat ora1.sql
declare
nfunctionresult NUMBER(9);
begin
nFunctionResult :=
orauser.pack_util.FGetNeededValue (
in_nSomeParam => somevalue
);
dbms_output.put_line('Function result: '||
nFunctionResult);
exception
when SOME_EXCEPTION THEN
orauser.pack_util.PReportError('SOME_EXCEPTION');
when OTHERS THEN
orauser.pack_util.PReportError('OTHER exception');
end;
[bugman@localhost 1]$ cat ora2.sql
declare
nFunctionResult NUMBER(9);
begin
nFunctionResult := orauser.pack_util.FGetNeededValue (in_nSomeParam => somevalue);
dbms_output.put_line('Function result: '||nFunctionResult);
exception
when SOME_EXCEPTION THEN
orauser.pack_util.PReportError('SOME_EXCEPTION');
when OTHERS THEN
orauser.pack_util.PReportError('OTHER');
end;
[bugman@localhost 1]$ diff ora1.sql ora2.sql
2c2
< nfunctionresult NUMBER(9);
---
> nFunctionResult NUMBER(9);
4,11c4,5
<
< nFunctionResult :=
< orauser.pack_util.FGetNeededValue (
< in_nSomeParam => somevalue
< );
<
< dbms_output.put_line('Function result: '||
< nFunctionResult);
---
> nFunctionResult := orauser.pack_util.FGetNeededValue (in_nSomeParam => somevalue);
> dbms_output.put_line('Function result: '||nFunctionResult);
16c10
< orauser.pack_util.PReportError('OTHER exception');
---
> orauser.pack_util.PReportError('OTHER');
[bugman@localhost 1]$ diff -wi ora1.sql ora2.sql
4,11c4,5
<
< nFunctionResult :=
< orauser.pack_util.FGetNeededValue (
< in_nSomeParam => somevalue
< );
<
< dbms_output.put_line('Function result: '||
< nFunctionResult);
---
> nFunctionResult := orauser.pack_util.FGetNeededValue (in_nSomeParam => somevalue);
> dbms_output.put_line('Function result: '||nFunctionResult);
16c10
< orauser.pack_util.PReportError('OTHER exception');
---
> orauser.pack_util.PReportError('OTHER');
Как видно пытливым человеческим глазом, суть различий файлов ora1.sql и ora2.sql в одном лишь слове и разном форматировании, но их diff абсолютно нечитаем. Не улучшает ситуацию и ключ "положить на все пробелы" -w. Не смотря на то, что в оригинальной документации сказано, что пробелами являются и <a href="http://www.gnu.org/software/diffutils/manual/html_node/White-Space.html#White...">символы конца строки</a>, заведённый мною баг был закрыт в redhat'ной багзилле с пометкой "НЕ БАГ", а сами ГНУшники отписались что мол да, это БАГ, но БАГ документации :)
Из всех переробованных утилит, наиболее удобная оказалась xxdiff (а конкретнее её опция <a href="http://furius.ca/xxdiff/doc/xxdiff-secrets.html#per-hunk-ignore-whitespace">ignore per-hunk whitespaces</a>), но к сожалению, сама утилита не умела работать с юникод файлами, не имела встроенного редактора. чтобы "на лету" править фалы, не предоставляла CLI для возможной интеграции с другими средствами да и к тому же имела не самый приятный интерфейс.
Но ближе всех по смыслу подошла утилитка коммандной строки dwdiff. Эта небольшая обёрточка вокруг diff выдаёт ровно то, что мне нужно - различия на уровне СЛОВ. Но и без ложки дёгтя не обошлось - вывод этой утилиты своеобразен и стандартных опций для приведения разницы в diff формат не имеет:
[bugman@localhost 1]$ dwdiff -i ora1.sql ora2.sql
declare
nFunctionResult NUMBER(9);
begin
nFunctionResult := orauser.pack_util.FGetNeededValue [-(
in_nSomeParam-] {+(in_nSomeParam+} => [-somevalue
);-] {+somevalue);+}
dbms_output.put_line('Function result: [-'||
nFunctionResult);-] {+'||nFunctionResult);+}
exception
when SOME_EXCEPTION THEN
orauser.pack_util.PReportError('SOME_EXCEPTION');
when OTHERS THEN
[-orauser.pack_util.PReportError('OTHER exception');-]
{+orauser.pack_util.PReportError('OTHER');+}
end;
С другой стороны, это и не мудрено, ибо стандарнтный patch имеет уровень строки, а в каком виде выводить разницу двух файлов, если они различаются по-дифовски в каждой строке? Этим вопросом я озадачился и списался с автором сей утилиты, коммрадом G.P. Halkes и вот к чему мы пришли:
[bugman@localhost 1]$ ~/Загрузки/diffwrap.sh ./ora1.sql ./ora2.sql diff -i
10c10
< orauser.pack_util.PReportError('OTHER exception');
---
> orauser.pack_util.PReportError('OTHER');
Сей замечательный враппер позволяет использовать эту тулзу в том числе и с визуальными дифферами, типа kdiff3. Сам скриптик скоро войдёт в состав dwdiff и будет распространятся вместе с ней на радость ленивым кодерам.
Ответ на:
комментарий
от DonkeyHot
Ответ на:
комментарий
от init_6
Ответ на:
комментарий
от xydo
Ответ на:
комментарий
от bugman
Ответ на:
комментарий
от DonkeyHot
Ответ на:
комментарий
от bugman
Ответ на:
комментарий
от www_linux_org_ru
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум ERROR: tuple concurrently updated в чем проблема? (2021)
- Форум И опять почти синхронно обновились nano и ed (2017)
- Форум Delta Partition Перенос данных из таблицы в таблицу с одного сервера Postgres на другой Postgres (2024)
- Галерея Ленивый... (2009)
- Форум sdcc 3.7.0 (2018)
- Форум diff такой diff (2009)
- Форум diff (2010)
- Форум .diff (2004)
- Новости Ленивое программирование и ленивые вычисления (2007)
- Форум ленивый deadbeef (2011)