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) , - , - ?