「パッチ」は非対称コンテキストで動作しますか?

「パッチ」は非対称コンテキストで動作しますか?

私はファイルを持っていますa

This
file
does
have
an error
in it
that
needs
to be
fixed.

そして同様のファイルb

This
file
does
have
no error
in it
that
needs
to be
fixed.

以下を使用して統合diffを作成できますdiff -u a b

--- a   2018-01-03 14:20:22 +0100
+++ b   2018-01-03 14:20:37 +0100
@@ -2,7 +2,7 @@
 file
 does
 have
-an error
+no error
 in it
 that
 needs

以下を使用して、コンテキストを各側で1行に減らすこともできますdiff -u1 a b

--- a   2018-01-03 14:20:22 +0100
+++ b   2018-01-03 14:20:37 +0100
@@ -4,3 +4,3 @@
 have
-an error
+no error
 in it

どちらのパッチもきれいに適用できますpatch。ただし、diff非対称コンテキストでパッチを生成する方法が見つかりませんでした。私はそれができないと仮定しています。それで、変更の前後に2行のコンテキストを持つパッチを作成するために、いくつかのコンテキストを手動で削除してみました。

--- a   2018-01-03 14:20:22 +0100
+++ b   2018-01-03 14:20:37 +0100
@@ -3,4 +3,4 @@
 does
 have
-an error
+no error
 in it

これは私には効果があるようです。統合フォーマット。ただし、patch苦情を申し立てるには、ファズテストに頼る必要があります。

patching file a
Hunk #1 succeeded at 3 with fuzz 1.

私は何か間違っているのでしょうか、それとも(GNU)を作成する方法がないので、誰も使用することを想像できpatchませんでした。diff

また、興味深いのは、非対称性を逆にすると(たとえば、前に1行、後に2行)、パッチが機能することです。

--- a   2018-01-03 14:20:22 +0100
+++ b   2018-01-03 14:20:37 +0100
@@ -4,4 +4,4 @@
 have
-an error
+no error
 in it
 that

答え1

これPOSIX規格非対称コンテキストを生成する方法は提供されません。場合によっては、GNUパッチが間違ったパッチを受け入れるのを助けます。

しかし、質問で指摘したマンページには間違った説明があります。

現時点では、GNU diffのみがこの形式を生成でき、GNUパッチのみがこの形式のdiffを自動的に適用できます。パッチが正しく機能するには、通常、少なくとも3行のコンテキストが必要です。

エラーがまだ発生します。拡散剤情報ファイル

POSIXパッチ均一な違いを処理します。

答え2

GNU は、patchサフィックスコンテキストよりもプレフィックスコンテキストが好きではありません。単純だが醜い解決策は、コンテキストの最初の行を次のように機能しない変更に変換することです。

--- a   2018-01-03 14:20:22 +0100
+++ b   2018-01-03 14:20:37 +0100
@@ -3,4 +3,4 @@
-does
+does
 have
-an error
+no error
 in it

これにより、すべてのプレフィックスコンテキストが削除されます。サフィックスのコンテキストが多いときは大丈夫です。

patchソースコードを見てみると問題のある作品。深く理解することなく、コードでプレフィックスコンテキストがすでに処理されている方法と同様の簡単な修正方法を見つけました。これは私の出力ですgit diff(パッチpatch)。

diff --git a/src/patch.c b/src/patch.c
index bba7e0e..e661af1 100644
--- a/src/patch.c
+++ b/src/patch.c
@@ -1171,7 +1171,7 @@ locate_hunk (lin fuzz)
     else if (prefix_fuzz < 0)
       prefix_fuzz = 0;

-    if (suffix_fuzz < 0)
+    if (suffix_fuzz < 0 && pch_first () + pat_lines > input_lines)
       {
    /* Can only match end of file.  */
    offset = first_guess - (input_lines - pat_lines + 1);
@@ -1184,6 +1184,8 @@ locate_hunk (lin fuzz)
    else
      return 0;
       }
+    else if (suffix_fuzz < 0)
+      suffix_fuzz = 0;

     min_offset = max_pos_offset < 0 ? first_guess - max_where
           : max_neg_offset < 0 ? first_guess - min_where
diff --git a/tests/asymmetric-hunks b/tests/asymmetric-hunks
index d6979d9..86e4ef9 100644
--- a/tests/asymmetric-hunks
+++ b/tests/asymmetric-hunks
@@ -77,5 +77,4 @@ seq 1 5 > a

 check 'patch < a.diff' <<EOF
 patching file a
-Hunk #1 succeeded at 2 with fuzz 1.
 EOF

@Patrick Mevzekが指摘したように、すでに非対称コンテキストの回帰テストがあります。したがって、この部分もファジングが予想されずに修正されました。残念ながら、マージテストも失敗することがありますが、その理由はわかりません。このためパッチを提出できないようです。より多くの洞察力を持つ人がより良い解決策を思い出すことができれば良いでしょう。

関連情報