2009-10-30 1 views
3

G'day,Почему исправление GNU не подходит для этого diff?

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

Мне был добавлен патч для добавления в Apache 2.2.14, и один унифицированный diff не исправляет файл вообще. Я использую GNU patch 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. 

линия.

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

... 

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) 

... 

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

Любые идеи, почему эта особенность не воспринимается?

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

Спасибо Адаму Гуду, если бы я мог дать вам еще один голос за ответ, который я бы хотел! Вот вам relevant paragraph for fuzz в руководстве GNU diffutils, если вам интересно.

Edit 2: BTW Там это весьма актуально предостережение в нижней части этого пуха пункта:

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

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

+0

Похоже, что это удалось ...? – bdonlan

+0

@ bdonian это не помогло. Четыре макроса из DEFAULT_CACHE_MAXAGE не находятся в конечном файле. –

+1

... и комментарий не изменяется. –

ответ

6

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

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

+0

@Adam, спасибо за ответ. +1! К сожалению, у меня нет контроля над созданием патча. И что еще хуже, люди, создающие патч, используют то, что они думают *, это Apache v2.2.14 в качестве базовой линии, применяя серию патчей самостоятельно на независимо поддерживаемом исходном дереве! Похоже, они это делали с 2.2.9. Они, похоже, не хотят, чтобы они были в порядке с ссылкой на Apache org.) -: –

Смежные вопросы