Почему этот патч применяется с нечеткостью, равной 1, и завершается неудачей с нечеткостью, равной 0?

#diff #patch

#разница #исправление

Вопрос:

 $ vim patch
Index: toPatch
===================================================================
--- toPatch
    toPatch
@@ -2,4  2,4 @@
  */
-final public class XMLWriter {
 public class XMLWriter {

$ vim toPatch
 */
final public class XMLWriter {

  public static float CURRENT_VERSION=2.2f;
    $ patch -p0 -ui patch
patching file toPatch
Hunk #1 succeeded at 1 with fuzz 2 (offset -1 lines).
  

Почему нечеткость и смещение строки? Это демонстрационный пример, в котором делается попытка разобраться в различиях и исправлениях, поскольку инструменты иногда / часто, похоже, работают не так, как ожидалось.

Ответ №1:

Патч выполняет некоторую базовую проверку согласованности diff и вашего файла, и если эти проверки завершаются неудачей, вы получаете смещение или нечеткость.

У вас смещение -1, поскольку исправление ожидает, что содержимое разницы соответствует строкам 2-4 вашего файла. Однако в вашем файле это строки 1-3.

У вас нечеткость> 0, поскольку первая строка контекста (два пробела и a */ ) не соответствует строке в реальном файле (один пробел и a */ ). Из-за этого патч выполнил второй проход, где он проигнорировал первую и последнюю строку контекста.

Это не объясняет, почему вы видите fuzz = 2, а не 1. Возможно, ошибка копирования-вставки файлов? Есть еще идеи, у кого-нибудь?

Комментарии:

1. все еще не уверен в актуальной проблеме тогда.. Я только что перешел

2. это случилось со мной при копировании / вставке содержимого файла исправления в мой редактор. В некоторых строках были только пробелы, но они были обрезаны до пустых строк, поэтому файл исправления применен правильно, но с предупреждениями о факторах нечеткости…

3. В первой строке патча нет двух пробелов. Первый пробел идентифицирует его только как контекстную строку. Второй пробел является частью строки.

Ответ №2:

Индексы в вашем patch файле (числа между @@ ) неверны.

  • Как сказал @xofon, у вас проблема со стартовой строкой, у вас есть 2, но должно быть 1
  • Но также второе число должно быть 3, а не 4, поскольку у вас есть 3 строки кода в вашем patch файле до применения исправления и 3 строки кода в вашем patch файле после применения исправления.
  • но с первой строкой проблемы нет */ . В patch файле есть 2 пробела, но это ожидаемо, поскольку в первом столбце используется символ - или . Полученная вами нечеткость касалась используемого смещения (перемещение всех строк вверх на 1)

Итак, ваш patch файл должен быть

 $ cat patch
--- toPatch
    toPatch
@@ -1,3  1,3 @@
  */
-final public class XMLWriter {
 public class XMLWriter {
   public static float CURRENT_VERSION=2.2f;
  

и с данным toPatch файлом

 $ cat toPatch
 */
final public class XMLWriter {
  public static float CURRENT_VERSION=2.2f;
  

Тогда патч будет применяться без нечетких предупреждений...

 $ patch -p0 -ui patch
patching file toPatch