GNU @command{diff}と@command{patch}を改良するための考えとして以下の ものがあります.GNUプロジェクトには,ボランティアのプログラミングプ ロジェクトへの潜在能力として,いくつかの改良点を認識しました.見つけたバ グを報告することで,我々を助けることも可能です.
プロ グラマであって,GNUプロジェクトに何か貢献したい場合,これらの プロジェクトのボランティアになることを考えてみてください.真面目に作業を 考えている場合,他のボランティアと調整するためgnu@gnu.orgにメー ルを送ってください.
あらゆるのディレクトリの対からパッチを生成するため,GNU @command{diff}が使用できるようにし,与えられたパッチとそのようなツリーの コピーからもう一方のコピーに忠実なものを生成するため,,@command{patch} を使用できるようにすべきです.残念ながら,ディレクトリツリーの変更には, 現在のパッチ書式を使用して表現することが不可能なものもあります.また,既 存の書式には@command{patch}で処理しないものもあります.これらの欠点は, 以下のプロジェクトに提案されている動機付けにもなります.
@command{diff},@command{diff3},そして@command{sdiff}は,入力のそれぞれ の行を単一バイトの文字による文字列として扱います.これにより,状況によっ てはマルチバイト文字を誤って処理するはずです.例えば,スペースを無視する ように依頼されているとき,@command{diff}はマルチバイトのスペース文字を適 切に無視してくれません.
また,@command{diff}は現在,それぞれのバイトが一列の幅だと仮定していて, 例えば,UTF-8エンコーディングを使用しているロケールのように,この仮定が 正しくないロケールもあります.これは,@command{diff}の@option{-y}や @option{--side-by-side}オプションで問題が生じます.
これらの問題は,単一バイト環境でのユーティリティの性能にあまり影響しない ように修正する必要があります.
IBM GNU/Linux Technology Center Internationalization Teamは, @command{diff}の国際化をサポートするパッチ http://oss.software.ibm.com/developer/opensource/linux/patches/i18n/diffutils-2.7.2-i18n-0.1.patch.gz を提案しています.残念ながら,これらのパッチは不完全で,@command{diff}の 古いバージョンへのものなので,この領域でより多くの作業が必要です.
@command{diff}と@command{patch}は,ディレクトリ構造に関する変更で処理し ないものもあります.例えば,一つのディレクトリツリーには,補助的なファイ ルがある`D'という名前のディレクトリがあり,もう一方には同じ名前の `D'というファイルが含まれていると仮定します.`diff -r'は, @command{patch}がディレクトリのサブツリーをファイルに変換するための十分 な情報を出力しません.
パッチファイルに完全な内容を含める必要がないように,削除されたファイルを 指定する方法があるべきです.@command{diff}がそのような情報を生成する方法 がない場合でも,ファイル名が変更されたことを@command{patch}に伝える方法 もあるべきです.ファイルの内容が変更されていない場合でも,ファイルのタイ ムスタンプを変更するように@command{patch}に伝える方法があるべきです.
これらの問題は,ディレクトリ構造の変更を表現する@command{diff}の出力書式 を拡張し,これらの拡張を理解するよう@command{patch}を拡張することで修正 可能です.
ファイルには,ディレクトリでも通常のファイルでもないものもあります.それ らはシンボリックリンク,デバイスの特殊ファイル,名前付パイプ,そしてソケッ トのような通常ではないファイルです.現在,@command{diff} はシンボリック リンクを通常のファイルのように扱います.それ以外のファイルは,トップレベ ルで指定されている場合は通常のファイルのように扱いますが,ディレクトリを 比較しているときは存在していることを単純に報告するだけです.例えば,シン ボリックリンクが示しているファイルを変更している場合,@command{diff}はシ ンボリックリンクの変更ではなく,二つのファイルの間の差異を出力します.
@command{diff}は,オプションで特別に特殊ファイルの変更を報告するべきで, @command{patch}はこれらの拡張を理解するように拡張すべきです.
ファイル名に改行や空白のような通常ではない文字が含まれるとき,`diff -r'は,@command{patch}が解析不可能なパッチを生成します.@command{diff}の 出力書式でのその問題は@command{patch}だけではなく,それは奇妙な完全なファ イル名で,@command{diff}は構文的には正しいが間違ったファイルにパッチを当 てるパッチを生成します.@command{diff}の出力の書式は,可能性のあるすべて のファイル名を処理するよう拡張されるべきです.
複数ファイルの差分を@command{patch}で適用する結果としてファイルのタイム スタンプの順番が台無しになるはずです.GNU @command{patch}には,更新 されたファイルのタイムスタンプを維持するオプションがありますが (see section パッチファイルのタイムスタンプを更新),GNU @command{patch}がなかったりこれ らのオプションを使用しない局面でも動作するパッチを生成することが役に立つ こともあります.こうするための一つの方法は,出力する差分をタイムスタンプ の順番にする@command{diff}のオプションを実装することです.
from-fileとto-fileでマッチしていると考えられる二つの文字列を 指定する機能があれば素晴らしいでしょう.例えば,二つの文字列が`foo' と`bar'で,二つの行がファイル1では`foo'でファイル2の対応する部 分が`bar'の場合,その行が同じものとして処理されるということです.
この機能を一般化させる方法や,そこで使用するべき構文は明確ではありません.
部分的な置換は,比較する前に一つまたは両方のファイルでフィルタを通すこと です.例えば以下のようにします.
sed 's/foo/bar/g' file1 | diff - file2
しかし,この出力はフィルタを通したテキストでオリジナルのものではありませ ん.
二つの大きなディレクトリ構造を比較しているとき,元々は一方がもう一方から (例えば,`cp -pR'を用いて) タイムスタンプを維持したままコピーされて いれば,サイズが同じでタイムスタンプが同じ二つのファイルの内容は同じだと いう仮定を@command{diff}に伝えるオプションがある場合,パフォーマンスが大 幅に改善されることでしょう.See section @command{diff}の性能のトレードオフ.
GNU @command{cmp},@command{diff},@command{diff3},または @command{sdiff}にバグを見つけたと思う場合, GNU utilities bug report mailing list bug-gnu-utils@gnu.orgに電子メールで報 告してください.GNU @command{patch}のバグの報告は bug-patch@gnu.orgに送ってください.できるだけ問題を明確にし, @option{--version}オプションの出力と,できればバグを生成する入力ファイル のサンプルを含めて送ってください.些細ではないバグを修正した場合,それも 送ってください.パッチがあればそれも送ってください.パッチがディレクトリ ftp://alpha.gnu.org/gnu/diffutils/で見つけられる最新のテストリリー スに関連する場合,管理者の作業が簡単になるかもしれません.
Go to the first, previous, next, last section, table of contents.