dopatchによってパッチされるツリーが mkpatchに現れる元のツリーと完全に同じものではない場合は どうなるのでしょう?
以下は、どうなるかについての概略です。dopatch 処理の完全な ドキュメントは、ソースコード中に含まれています。
dopatch はパッチされるツリーの目録を使います。それは、 チェンジセットによって期待されるどのファイルとディレクトリがツリー中に 存在し、また消えてしまっているかを決定し、それぞれのファイルやディレクトリ がツリー中のどこに位置しているかを明らかにするために目録タグを使います。
単純なパッチ もしチェンジセットが通常のパッチ か、リンク、ディレクトリまたはファイルに対するメタデータのパッチを含んでいて、 そのファイルがツリー中に存在している場合、dopatchはそのパッチ を普通の方法で適用します。もしパッチがきれいに適用されれば、修正されたファイル、 リンク、ディレクトリはその場所に残ります。
もし単純なパッチがきれいに適用できなかった場合は、dopatch は 常に.orig ファイル(変更されることのない、パッチされる 前のツリー中にあったもともとのファイル)と、.rej ファイル(適用 できなかったパッチの一部)を残します。
もしパッチがコンテキスト diff だった場合dopatch はファイルそれ自身 も残します — 一部だけパッチされたものです。
もし (成功しなかった) パッチがバイナリファイルに対するものであった場合、 部分的なパッチのファイルは残されません。その代わり、以下のようになります:
.orig -- パッチされるツリーにもともとあったファイルの修正される前の形のもの。 .rej -- 修正されたツリーのファイルの完全なコピーで、ファイルパーミッションは .origと同一のもの。 .patch-orig -- mkpatchに現れた元のツリーからのファイルの 完全なコピーで、ファイルパーミッションは元のものを保持した形のもの -であるかまたは- mkpatch に現れた元のツリーからのシンボリックリンク で、パーミッションは元のツリーのもの。
もし (成功しなかった) パッチがシンボリックリンクである場合は、 部分的なパッチファイルは残りません。そのかわり:
.orig -- 元のツリーからのファイルで、まだ修正されていないもの。 .rej -- パッチの目的となるターゲットへのシンボリックリンクで、 パーミッションは .orig からのコピーであるもの。 .patch-orig -- mkpatchに現れた元のツリーからのファイルの 完全なコピーで、パーミッションは元のファイルからのものを保持 しているもの -であるかまたは- mkpatchに現れた元のツリーからのシンボリックリンク で、パーミッションは元のツリーのものと同じ。
失われたファイルに対するパッチ
失われたファイルやディレクトリに対するパッチはすべてパッチが 呼び出されたツリーの根元のサブディレクトリ中に保存されます。
==missing-file-patches-PATCH-DATE
ここで PATCH はチェンジセットディレクトリのベース名で、 DATE はタイムスタンプです。
ディレクトリの再配置と新しいディレクトリ
ディレクトリはあなたが思っているよりもずっと追加、削除、再配置される もので、実際にはあなたがそれを意識していない場合もあります。
mkpatch が呼び出されたとき、ORIGINAL ツリーが以下のよう だったとしましょう:
ディレクトリまたはファイル: タグ: a/x.c tag_1 a/bar.c tag_2
しかし MODIFIED は以下の形だったします:
a/x.c tag_1 a/y.c tag_2
そして、この両方のファイルには変更が加えられているものとします。 パッチはtag_2 のタグを持ったファイルをy.c に名称変更し、タグtag_1 と tag_2をもった ファイルの内容を変更したいとします。
たとえば、以下のようなツリーがあり:
a/foo.c tag_1 a/zip.c tag_2
そのツリーにパッチを適用するとします。パッチの後では以下のようなファイル が残り:
a/foo.c tag_1 a/y.c (was zip.c) tag_2
パッチは両方のファイルの内容に対して適用されます。
微妙な場合で、衝突をどのように扱うかの例をあげます:
mkpatch に現れる元のツリーが以下のようであるとします:
ディレクトリまたはファイル: タグ: ./a tag_a ./a/b tag_b ./a/b/c tag_c
そして修正後のディレクトリは:
./a tag_a ./a/c tag_c ./a/c/b tag_b
最後に、ツリーが以下のようであるとします:
./x tag_a ./x/b tag_b ./x/c tag_new_directory ./x/c/b tag_different_file_named_b ./x/c/q tag_c
ツリーにたいしてパッチが適用されると、以下のようになります:
./x tag_a そのパッチは tag_a のディレクトリには 何も変更しないので。 ./x/c.orig tag_new_directory ./x/c.rej tag_c Since the patch wants to make the directory with tag_c a subdirectory named "c" of the directory with tag_a, but the tree already had a different directory there, with the tag tag_new_directory. ./x/c.rej/b tag_b Since the patch wants to rename the directory with tag_b to be a subdirectory named "b" of the directory with tag_c. ./x/c.orig/b tag_different_file_named_b Since the patch made new changes to this file, it stayed with its parent directory.