O GNU patch
simplesmente não gosta quando há mais contexto de prefixo que o contexto de sufixo. Uma solução simples, mas feia, é converter a primeira linha de contexto em uma alteração sem operação como esta:
--- 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
Isso remove todo o contexto do prefixo. Tudo bem quando há mais contexto de sufixo.
Eu passei pelo código-fonte de patch
e encontrei o peça ofensiva . Sem entender muito profundamente, criei uma correção simples semelhante à forma como o contexto do prefixo já foi tratado no código. Aqui está minha saída de git diff
(um patch para 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
Como apontou @Patrick Mevzek, já existe um teste de regressão para contextos assimétricos. Então, isso também é corrigido para não esperar fuzzing. Infelizmente, o teste de mesclagem também falha em um caso e não sei por quê. Eu acho que não posso enviar o patch por causa disso. Seria bom se alguém com mais discernimento pudesse encontrar uma solução melhor.