怠zyな開発者向けのdiffまたは比類のない比較方法

昔、Windowsでは、oracle-schemes(データベースの読み取り)を比較するために、Quest Software TOADに統合されたコンパイラに満足していました。 彼は悪くありませんでした、そして彼は彼の仕事に対処しました。 しかし、Linuxでの再シードでは失望しました。 [わずかな]ツールは、以前の快適さの半分さえ提供しません。 つまり、それぞれ数千行の2つのファイル (DDL、SQL、ソースコードは本質ではない)の基本的な比較とマージで あり、それぞれが独自の方法でフォーマットされ、実際の変更は何もありません、それは自然な拷問になります。







1つのツールで必要な機能を見つけようとする無駄を認識して、サードパーティツールの形式で松葉杖を探すことにしました。 つまり、独立した比較およびマージツール([ビジュアル]比較およびマージツール)。 人気のあるツールのほとんどすべてを調べた後、2つのテキストファイルを比較するときに行末文字をスキップできるものはほとんどない(ほとんど読めない)ことがわかりました。



明確にするために、例を挙げて説明します。 通常、古いファイルと新しいファイルの2つのファイルがあるとします。



古い(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 ;








新規(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 ;











探究する人間の目で見ることができるように、ora1.sqlファイルとora2.sqlファイルの違いの本質は、1つの単語と異なるフォーマットだけですが、それらの差分は完全に判読できません。 それらを比較した典型的な結果を次に示します。



[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');









「すべてのスペースに置く」キー-wは状況を改善しません。



[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');









オリジナルのドキュメントには文字行末の文字であると書かれているという事実にもかかわらず、私が始めたバグは「NOT BAG」とマークされたredhat bugzillaで閉じられました。 。 そして最後の手紙で、彼らは世界のすべてを修正すると約束した。



試行され、テストされたすべてのユーティリティのうち、xxdiffが最も便利であることがわかりました(具体的には、 ハンクごとの空白スペースを無視するオプション )。 その場でファイルを「修正」するために、他のツールとの統合を可能にするCLIを提供していませんでした。また、最も快適なインターフェイスもありませんでした。



しかし、最も近い意味はdwdiffコマンドラインのユーティリティでした。 diffのこの小さなラッパーは、まさに私が必要とするものを生成します-WORDSのレベルでの違い。 しかし、軟膏にハエがありました-このユーティリティの出力はオリジナルであり、diff形式に違いをもたらすための標準オプションがありません:



[bugman@localhost 1]$ dwdiff -P -i ora1.sql 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 [-exception-]');

end;









一方、これは驚くことではありません。標準パッチには行レベルがあり、各行で異なる方法で異なる場合に2つのファイルの違いを表示する形式は何ですか? 私はこの質問に戸惑い、このユーティリティの作成者であるGP 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の一部になり、怠け者の喜びのために配布されますが、今すぐ試してみるのを待つことができないスクリプト自体には魔法がありません。



[bugman@localhost 1]$ cat ~/diffwrap.sh

#!/bin/bash



if [ $# -lt 3 ] ; then

echo "Usage: script.sh "

exit 1

fi



OLD="$1"

NEW="$2"

shift 2



# First create a version of the old file that is formated like

# the new file...

TMP="`mktemp oldconvertXXXXXX`"

dwdiff -P -2 -w '' -x '' "$OLD" "$NEW" > "$TMP"



# ... and then call a diff program to show the changes (per line).

"$@" "$TMP" "$NEW"



# Finally, clean up the temporary file

rm "$TMP"





PS . - - . : 1) coding style guide, , , ; 2) , - , - ?







All Articles