Почему патч GNU не подходит для этой разницы?

StackOverflow https://stackoverflow.com/questions/1651996

  •  22-07-2019
  •  | 
  •  

Вопрос

Добрый день,

Редактировать:Просто подумал, что отмечу, что этот довольно длинный вопрос теперь исправлен благодаря ответу Адама Гуда ниже, если вы просто просматриваете, проходя мимо.

Мне дали патч для добавления в Apache 2.2.14, и один унифицированный файл различий вообще не исправляет файл.Я использую патч GNU 2.5.4.

Мне приходится игнорировать пробелы, потому что исходный патч был сделан некачественно, т.е.многие различия, по-видимому, предназначены для преобразования табуляции -> пробелов.Подобные различия еще менее полезны, поскольку файл патча был изменен где-то в цепочке доставки, например.svn-репозиторий, система Jira, веб-интерфейс и т. д., чтобы все табы в любом случае были преобразованы в пробелы!

Команда, которую я использую в Solaris 10:

/usr/bin/gpatch --verbose --ignore-whitespace -p1 -d . \
    <mod_cache.diff

и результат:

...

Hmm...  The next patch looks like a unified diff to me...
The text leading up to this was:
--------------------------
|Index: httpd/modules/cache/mod_cache.h
|===================================================================
|--- httpd/modules/cache/mod_cache.h
|+++ httpd/modules/cache/mod_cache.h
--------------------------
Patching file modules/cache/mod_cache.h using Plan A...
Hunk #1 succeeded at 24.
Hunk #2 succeeded at 86.
Hunk #3 succeeded at 138.
Hunk #4 succeeded at 163.
Hunk #5 succeeded at 184.
Hunk #6 succeeded at 217.
Hunk #7 succeeded at 271.
Hunk #8 succeeded at 380.

...

Обратите внимание на

Hunk #2 succeeded at 86.

линия.

Файл патча содержит несколько унифицированных различий, но соответствующий diff:

...

Index: httpd/modules/cache/mod_cache.h
===================================================================
--- httpd/modules/cache/mod_cache.h
+++ httpd/modules/cache/mod_cache.h
@@ -86,9 +86,13 @@
 #define DEFAULT_CACHE_MAXEXPIRE MSEC_ONE_DAY
 #define DEFAULT_CACHE_EXPIRE    MSEC_ONE_HR
 #define DEFAULT_CACHE_LMFACTOR  (0.1)
+#define DEFAULT_CACHE_MAXAGE    5
+#define DEFAULT_CACHE_LOCKPATH "/mod_cache-lock"
+#define CACHE_LOCKNAME_KEY "mod_cache-lockname"
+#define CACHE_LOCKFILE_KEY "mod_cache-lockfile"

-/* Create a set of PROXY_DECLARE(type), PROXY_DECLARE_NONSTD(type) and
- * PROXY_DECLARE_DATA with appropriate export and import tags for the platform
+/* Create a set of CACHE_DECLARE(type), CACHE_DECLARE_NONSTD(type) and
+ * CACHE_DECLARE_DATA with appropriate export and import tags for the platform
  */
 #if !defined(WIN32)
 #define CACHE_DECLARE(type)            type

...

и соответствующую часть источника, после применения патча (предположительно), с некоторым добавленным контекстом, это:

...

#define MSEC_ONE_DAY    ((apr_time_t)(86400*APR_USEC_PER_SEC)) /* one day, in microseconds */
#define MSEC_ONE_HR     ((apr_time_t)(3600*APR_USEC_PER_SEC))  /* one hour, in microseconds */
#define MSEC_ONE_MIN    ((apr_time_t)(60*APR_USEC_PER_SEC))    /* one minute, in microseconds */
#define MSEC_ONE_SEC    ((apr_time_t)(APR_USEC_PER_SEC))       /* one second, in microseconds */
#define DEFAULT_CACHE_MAXEXPIRE MSEC_ONE_DAY
#define DEFAULT_CACHE_EXPIRE    MSEC_ONE_HR
#define DEFAULT_CACHE_LMFACTOR  (0.1)

/* Create a set of PROXY_DECLARE(type), PROXY_DECLARE_NONSTD(type) and 
 * PROXY_DECLARE_DATA with appropriate export and import tags for the platform
 */
#if !defined(WIN32)
#define CACHE_DECLARE(type)            type
#define CACHE_DECLARE_NONSTD(type)     type
#define CACHE_DECLARE_DATA
#elif defined(CACHE_DECLARE_STATIC)

...

Все остальные патчи, похоже, либо были успешно применены, либо проигнорированы.

Есть идеи, почему этот конкретный дифференциал не принимается?

Редактировать: После снижения коэффициента нечеткости патча до нуля, как рекомендовал Адам ниже, патч заработал успешно.

Спасибо Адаму Гуду, если бы я мог дать вам еще один голос за ответ, я бы это сделал!Вот соответствующий абзац для фуза в руководстве GNU diffutils, если вам интересно.

Редактировать 2: Кстати, в конце этого абзаца есть очень важное предостережение:

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

К сожалению, в данном случае я не могу быть уверен, что их mod_cache.h совпадает с официальным mod_cache,h версии 2.2.14!)-:

Это было полезно?

Решение

Когда вы используете --ignore-whitespace и не используй --fuzz=0, вы, по сути, говорите патчу, что он должен выполнить исправление с максимальной эффективностью, а не полностью провалиться.Поскольку это максимально возможное усилие, на самом деле невозможно гарантировать, что оно будет работать идеально.По этой причине набор RPM для git и Fedora --fuzz=0 по умолчанию, чтобы эти типы проблем не возникали во время исправления (а не во время компиляции или выполнения).

Если вы хотите сохранить файлы в виде исходного архива + патчей, вам следует переустановить патч и убедиться, что его можно применить с помощью --fuzz=0.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top