Does `patch` work with asymmetric context

diff()patch

I have file a:

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

and a similar file b:

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

I can create a unified diff with 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

And I can also reduce the context to one line on either side with 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

Both of these patches can be applied cleanly with patch. I did not however find a way to make diff produce a patch with asymmetric context. I am assuming it cannot do that. So I tried removing some context manually, to make a patch with two lines of context before the change and one after:

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

This seems valid to me in the unified format. However, patch complains that it had to resort to fuzzing:

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

Am I doing something wrong or is (GNU) patch actually broken for asymmetric contexts because no-one imagined they would ever be used, since diff cannot make them anyway?

Also interesting is that the patch works if I reverse the asymmetry, that is one line before and two after:

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

Best Answer

The POSIX standard doesn't provide a way to generate asymmetric contexts. GNU patch is being helpful in one case by accepting a malformed patch.

By the way, the manual page indicated in the question makes an incorrect statement:

At present, only GNU diff can produce this format and only GNU patch can automatically apply diffs in this format. For proper operation, patch typically needs at least three lines of context.

The error is still in the diffutils info file.

POSIX patch handles unified diffs.

Related Question