Patch Drupal под Windows

Когда у Вас какой-то модуль работает не совсем так, как задумал его разрабочик, не обижайтесь на него и не отчаивайтесь. Во-первых, ему никто денег не платил за модуль, а во-вторых, нужно посмотреть дискуссии про этот модуль. Обычно, баталии разворачиваются по адресу http://drupal.org/project/issues/ИМЯ_МОДУЛЯ, например http://drupal.org/project/issues/faq_ask  - здесь обсуждаются баги модуля faq_ask.

Итак, Вы нашли обсуждение своей проблемы и даже нашли патч. Осталось сверить версии кривого модуля и патча, чтоб совпадали. Если патч небольшой, то можно внеси исправления в модуль руками. Структура патча следующая.

После заголовка с именами файлов, патч состоит из контекстных блоков. Заголовок каждого блока начинается с @@ и заканчивается на @@. Первой цифрой после "двойной собаки" идет номер строки исходного файла, где начинается данный блок. В конце также может быть указано имя функции, к которой относится данный блок. Далее идут строки контекста исходного файла, строки добавляемые и строки удаляемые.

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

Строки начинающиеся со знака "минус" (-) требуется удалить из исходного файла.

Строки начинающиеся со знака "плюс" (+), соответственно добавить. Только не забывайте скопировав добавляемое в файл удалить с первых позиций все плюсы.

А если патч большой? Руками править утомительно. Тогда нужно воспользоваться командой UNIX - patch. Для этого нужно закинуть по FTP файл патча в корень Друпала, войти через Shell (например, с помощью Putty) и дать команду

patch < file.patch

 

либо запустить его из папки где он создавался командой (сама программа patch при этом запускается из корня дерева Drupal):

 

patch -p0 < path/file.patch

А если у Вас на хостинге нет SHELL-доступа? "Фу",- скажут специалисты, - "плохой хостинг, ищите другой". А если Вы не хотите изучать детали и тонкости работы через SHELL? Есть решение.

Вы можете пропатчить модуль непосредственно на домашнем компьютере и залить его на сервер в готовом виде. Для этого качайте patch.exe для Windows. Поместите этот файл в каталог своей операционки, например c:\Windows. Теперь команда patch доступна в любом каталоге Вашего диска.

Теперь берете файл с патчем и ... исправляете его. Дело в том, что файл сделан под UNIX и в нем конец строки не совсем такой, как в Windows. А поскольку вы бедете патчить под Windows, то откройте файл патча програмкой Notepad++, меню Правка.EOL конверсия.Преобразовать в Win-формат. Теперь патч готов. Копируете его в каталог с кривым модулем и даете команду

 

patch -p0 < path/file.patch


Ошибки

Иногда происходят ошибки или зацикливание выполнения команды patch, остановить которое можно только нажав Ctrl+C.

Вывод при этом выглядит так:
File to patch:
Skip this patch? [y]
Skipping patch.
missing header for unified diff at line 620 of patch
can't find file to patch at input line 620
Perhaps you should have used the -p or --strip option?

или такая

patching file `filename.ext'
Assertion failed: hunk, file patch.c, line 321

abnormal program termination

 

Эти ошибки возникают из-за различий символов конца строк в Unix и Windows. Значит вы проигнорировали совет по конвертации файла из Unix в Win,