"패치"는 비대칭 컨텍스트에서 작동합니까?

"패치"는 비대칭 컨텍스트에서 작동합니까?

나는 파일을 가지고 있습니다 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

다음을 사용하여 컨텍스트를 각 측면에서 한 줄로 줄일 수도 있습니다 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비대칭 컨텍스트로 패치를 생성하는 방법을 찾지 못했습니다 . 나는 그것이 그렇게 할 수 없다고 가정하고 있습니다. 그래서 변경 전후에 두 줄의 컨텍스트가 있는 패치를 만들기 위해 일부 컨텍스트를 수동으로 제거해 보았습니다.

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

또한 흥미로운 점은 비대칭성을 반대로 하면(예: 앞에 한 행, 뒤에 두 행) 패치가 작동한다는 것입니다.

--- 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를 자동으로 적용할 수 있습니다. 패치가 올바르게 작동하려면 일반적으로 최소한 세 줄의 컨텍스트가 필요합니다.

오류가 여전히 발생합니다.확산제정보 파일.

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이 지적했듯이 이미 비대칭 컨텍스트에 대한 회귀 테스트가 있습니다. 따라서 이 부분도 퍼징이 예상되지 않아 수정되었습니다. 불행하게도 병합 테스트도 실패하는 경우가 있는데 그 이유는 모르겠습니다. 이 때문에 패치를 제출할 수 없는 것 같습니다. 더 많은 통찰력을 가진 사람이 더 나은 솔루션을 생각해 낼 수 있다면 좋을 것입니다.

관련 정보