不完全パッチ処理 — どのようにして衝突が扱われるか

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_1tag_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.