Здравствуйте! Подкажите, как правильно применять пэтчи?
Обязательно ли искать какие-то файлы и там что-то закомментировать, раскомментировать и добавлять или
можно сделать одной командой?
Самая близкая тема эта по пэтчу для hierarchical_select.
И это описание на английском
Но остается ряд вопросов
Первый вариант - использование команды
patch -p1 < path/file.patch
если я правильно понимаю ее выполняют из папки модуля?
Но есть три вопроса:
1)Нужно ли помещать сам файл пэтча перед этим в корень модуля?
2)какую часть этой команды нужно заменить на имя пэтча?
path/file.patch
или только file.patch
Т.е. если имя пэтча any_name.patch
То как будет выглядеть команда?
как
patch -p1 < path/any_name.patch
или как
patch -p1 < any_name.patch
3)если есть подмодули и пэтч для них, то в папку подмодуля помещать или в папку самого модуля?
При применении git все то же самое только вместо
patch -p1 <
используют
git apply -v --index?
Комментарии
Открываете файл патча, там прописан путь (относительно родительского каталога) к файлу, который патчил автор. Затем кладёте патч в тот же (родительский) каталог, переходите в него (команда cd) и патчите
patch -p0 < имя_патча
Спасибо. p0 это Вы специально написали вместо p1 или случайно? Это на что-то влияет 1 или 0?
Специально написал. Читайте man patch
-pnum or --strip=num
Strip the smallest prefix containing num leading slashes from each file name found in the patch file. A
sequence of one or more adjacent slashes is counted as a single slash. This controls how file names found
in the patch file are treated, in case you keep your files in a different directory than the person who
sent out the patch. For example, supposing the file name in the patch file was
/u/howard/src/blurfl/blurfl.c
setting -p0 gives the entire file name unmodified, -p1 gives
u/howard/src/blurfl/blurfl.c
without the leading slash, -p4 gives
blurfl/blurfl.c
and not specifying -p at all just gives you blurfl.c. Whatever you end up with is looked for either in the
current directory, or the directory specified by the -d option.
Спасибо. Вроде относительно понятно, что написано что нужно поставить такое число, которое соответсвует числу файлов, указанных в пэтче, но ясная картина не вырисовывается, что нужно делать? посчитать сколько файлов указано для редактирования в патче? и как учитывать слэши и двойные слэши?
Также не могу понять где искать путь в каталог, где должен быть пэтч
Например здесь:
#45 для feeds
Начало файла такое
index 0644feb..6a1111e 100644
--- a/plugins/FeedsProcessor.inc
+++ b/plugins/FeedsProcessor.inc
@@ -32,6 +32,11 @@ class FeedsValidationException extends Exception {}
class FeedsAccessException extends Exception {}
/**
+ * Thrown if an entity could not be loaded.
Не вижу, где здесь нужный путь?
a/plugins/FeedsProcessor.inc
- это же путь к файлу который нужно редактировать а не место расположения пэтча?В данном случае я бы положил файл патча в каталог, где находится каталог plugins/ и использовал
patch -p1 < feeds-orphaned-feeds-item-1394320-45.patch
Спасибо. Буду пробовать этот способ для других пэтчей, в конкретном случае пока что-то видимо не так делаю, так как не работает,
например, если я работаю с модулем feeds и там есть каталог plugins
(получается feeds/plugins)
то мне нужно положить файл пэтча в feeds?
(получится feeds/name.patch)
в командной строке зайти в папку /sites/all/modules/feeds
и в ней выполнить команду
patch -p0 < name.patch
или все же пэтч положить, чтобы получилось feeds/plugins/name.patch
Первый варинт с расположением просто в папке feeds не сработал и с командой из папки feeds/plugins при расположении файла пэтча в ней же тоже не сработал пока (скриншот прилагаю), но по пэтчу для feeds есть отдельная тема (уже не знаю, где лучше этот пример приводить).
В общем, после ввода команды был ответный вопрос в командной строке с необходимостью указать файл, который нужно пэтчить.
(Stripping trailing CRs from patch.)
can't find file to patch at input line 5
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|diff --git a/plugins/FeedsProcessor.inc b/plugins/FeedsProcessor.inc
|index 0644feb..6a1111e 100644
|--- a/plugins/FeedsProcessor.inc
|+++ b/plugins/FeedsProcessor.inc
--------------------------
File to patch:
Пока не получилось на конкретном примере реализовать именно с этим патчем и есть еще 2 общих вопроса:
1)файл пэтча как-то можно скачать или нужно создавать с таким названием файл и помещать в него код пэтча?
2)дополнительный файл txt, который рядом с файлом пэтча на дорге как интерпретировать, например
index 58379fe..6a1111e 100644
--- a/plugins/FeedsProcessor.inc
+++ b/plugins/FeedsProcessor.inc
@@ -457,7 +457,7 @@ abstract class FeedsProcessor extends FeedsPlugin {
// the item to import is new.
$entity_id = NULL;
// Log the exception.
- $source->log('import', '@exception', array('@exception' => $e->getMessage(), WATCHDOG_WARNING);
+ $source->log('import', '@exception', array('@exception' => $e->getMessage()), WATCHDOG_WARNING);
}
}
скриншот почему-то ссылкой на изображение пришлось вставлять, а файлом к сообщению не прошел
![feeds](https://onlineassist.site/sites/default/files/inline-images/2018-06-14_13-39-35.png)
Пардон, в таком случае -p1 надо использовать. Я исправил свой ответ и протестировал на локалке
Спасибо. А из какой все же папки Вы делали: feeds или feeds/plugins?
И на какое указание в пэтче нужно ориентироваться для выбора?
feeds
Спасибо.
У меня сработала команда c p1 из папки feeds
Но не полностью
Ошибка
patching file tests/feeds_processor_node.test
patch unexpectedly ends in middle of line
Hunk #1 FAILED at 721.
1 out of 1 hunk FAILED -- saving rejects to file tests/feeds_processor_node.test .rej
А остальное вроде нормально
![скриншот](https://onlineassist.site/sites/default/files/inline-images/2018-06-14_19-27-16.png)
(Stripping trailing CRs from patch.)
patching file plugins/FeedsProcessor.inc
Hunk #2 succeeded at 140 (offset 19 lines).
Hunk #3 succeeded at 158 (offset 19 lines).
Hunk #4 succeeded at 337 (offset 87 lines).
Hunk #5 succeeded at 351 (offset 87 lines).
Hunk #6 succeeded at 507 (offset 87 lines).
(Stripping trailing CRs from patch.)
Rej - Это значит патч не нашел нужных строк. Возможно не ту версию патчите
Там в примере было
patch -p1 < path/any_name.patch
там предполагалось что еще нудно перед именем патча указать путь/?
а в Вашем вариане выполняем комнаду из той же папки где и файл, пишем
-p0
и путь не указываем совсем?Угу, а если патч к предыдущей версии модуля, а в новой что-то наворотили? И может быть, что патч подходит, может нет. Может подходит с минимальными правками так что и без знаний РНР можно допереть.
Открываем патч и добавляем и удаляем строки ручками ориентируясь на плюски и минусики
Спасибо. Возможно, в моем случае как раз придется руками.
Если у меня в файле пэтча только 2 раза есть фраза diff..., то значит только в двух файлах нужно править?
Всегда указание на новый файл с этой фразы начинается?
Механизм patch ей накопительный с открытым кодом, поэтому почти всегда пишут к чему применять, а случае возникновения вопросов и проблем - смотрим в patch.
Спасибо большое всем за ответы. И еще такой вопрос, а можно ли (кроме git и использования бэкапов) какой-то специальной командой для патча делать откат патча?
На крайняк всегда можно сделать
чтобы перезалить модуль с орга.
Ясно, спасибо, буду использовать этот способ, особенно если откат придется делать когда уже сделаны другие важные изменения, которые не нужно откатывать.
Очень удобно манипулировать в т.ч. патчами в https://www.jetbrains.com/phpstorm/
++
В общем, любая IDE справится с этим без каких-либо проблем.
Спасибо. Там специальный функционал для применения патчей? А в каком меню?
VCS -> Apply Patch:
![Apply patch from PHP Storm menu](/sites/default/files/field/comment_node_blog/phpstorm_apply_patch.gif)
Или, просто перетащите файл патча в открытый проект мышью![Smile](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/smile.gif)
При необходимости, подправьте эндпоинты.
Спасибо! Т.е. для сайта на удаленном хостинге сначала мне нужно открыть проект на хостинге (папку модуля открыть?) и потом просто в него перетащить пэтч и команду не нужно применять через командную строку?
А как открыть проект на хостинге через php storm? Я выбираю file/open URL пишу путь к папке полностью, но мне пишет Can not load ...
https://www.jetbrains.com/help/phpstorm/create-new-project-add-remote-se...
Спасибо. И напишу на хостинг, возможно там еще точнее подскажут именно для моего хостинга.
А что такое hunk в отчете о работе пэтча?
Если в отчете ошибка об одном hunk то можно его уже руками доделать?
Как найти в файле инструкцию для нужного hunk?
А что значат символы перед строками?
+ добавить
- убрать
А что значит
+++
---
@@
?
И почему иногда не перед всеми строками знаки, как тогда действовать?
Например, плюс потом просто строки, то что делать?
например
+ * When an entity could not be loaded.
*/
protected function entityLoad(FeedsSource $source, $entity_id) {
$info = $this->entityInfo();
@@ -131,7 +139,13 @@ abstract class FeedsProcessor extends FeedsPlugin {
$entity = db_query("SELECT * FROM {" . $table . "} WHERE $key = :entity_id", $args)->fetchObject();
}
+++ и --- указывают из каких файлов формировался файл патча (разность между этими файлами)
@@ и числа означают номера строк, где будут происходить изменения.
Не хочу вас обидеть, но это можно понять просто взглянув на любой файл патча![Smile](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/smile.gif)
Кстати, наверное нужно было смотреть в редакторе или php storm
Я смотрю просто в браузере в редакторе на хостинге, там с непривычки вообще все сливается без подсветки и в той теме по hierarhicak select уже отчасти эти вопросы обсуждали, вылетело из головы.
Спасибо. Ну теперь когда Вы сказали точно уже можно посмотреть и понять )))
Кстати, не забудьте о том, что при обновлении модуля патч слетит. И сам файл патча тоже удалится безвозвратно. Именно поэтому в семёрке патчи надо накатывать через drush make, а в восьмёрке через композер.
Да, спасибо. А как в норме должна работать эта команда?
Я пробую по образцу из help
drush make example.make example Build the example.make makefile in the example directory.
Делаю
drush make name.patch feeds
Но получаю сообщение
file_get_contents(feeds-orphaned-feeds-item-1394320-45.patch): failed to open stream: No such file or directory make.utilities.inc:526 [warning]
Invalid or empty make file: feeds-orphaned-feeds-item-1394320-45.patch [error]
Beginning to build feeds-orphaned-feeds-item-1394320-45.patch. [ok]
No core project specified.
Можно и в 7ке композером![Wink](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/wink.gif)
Спасибо. У меня уже на сервере на хостинге есть композер, но я не могу найти команду для запуска патча.
Как искать? Или какая команда?
Удалось найти только (но это не то):
Плагин cweagans/composer-patches (входящий в состав Drupal Composer template) использует патчи описаные в секции «extra» файла composer.json:
"patches": {
"<PACKAGE/NAME>": {
"<PATCH DESCRIPTION>": "<PATH/TO/PATCH/OR/URL>",
...
},
...
}
}
Композер применяет патчи при установке / обновлении пакета, к которому патч применяется.
Т.е. нужно просто установить feeds через композер?
Из какой папки это нужно делать?
А обязательно версию указывать?
Вот в этом примере из этой статьи, по месту откуда выполнять команду сказано что, нужно устанавливать
"путем выполнения composer команд из корня проекта. (это на один уровень выше корневой директории Drupal)":
composer require drupal/migrate_plus 8.1.*@Dev
т.е. для feeds
мне достаточно
composer require drupal/feeds
а из какой папки?
composer require drupal/feeds
из папки сайте не работает
(похоже пишет, что нет стабильной версии)
Пишет:
Could not find a version of package drupal/feeds matching your minimum-stab
ility (stable). Require it with an explicit version constraint allowing its
desired stability.
require [--dev] [--prefer-source] [--prefer-dist] [--no-progress] [--no-suggest] [--no-update] [--no-scripts] [--update-no-dev] [--update-with-dependencies] [-- update-with-all-dependencies] [--ignore-platform-reqs] [--prefer-stable] [--pref er-lowest] [--sort-packages] [-o|--optimize-autoloader] [-a|--classmap-authorita tive] [--apcu-autoloader] [--] []...
При попытке ввода
composer require drupal/feeds 7.x-2.0-beta4
или
composer require drupal/feeds 7.x-2.0 *@beta4
[UnexpectedValueException]
Could not parse version constraint 7.x-2.0-beta4: Invalid version string "7.x-2.0-beta4"
Да, из корня.
Смотрите, а лучше применяйте конфигурации Composer проектов подготовленных сообществом.
Спасибо. Из корня сайта или аккаунта над сайтом?
Корень проекта.
Спасибо. Видимо что-то из описанных Вами натсроек сайта или акаунта не так. Жду ответ от службы поддержки.
![скриншот](https://onlineassist.site/sites/default/files/inline-images/2018-06-15_18-19-32.png)
После ввода composer require drupal/feeds
получаю ответ (скриншот)
[InvalidArgumentException]
Could not find package drupal/feeds at any version for your minimum-stability (stable). Check the package spelling or your minimum-stability
require [--dev] [--prefer-source] [--prefer-dist] [--no-progress] [--no-update] [--update-no-dev] [--update-with-dependencies] [--ignore-platform-reqs] [--sort-packages] [packages1] ... [packagesN]
Ссылка про конфигурации Composer проектов
у меня не открывается, выдается ошибка 404
Поправил.
Спасибо. Пытаюсь уладить на хостинге. Если будет какя-то информация оттуда отпишусь.
Подскажите, а из рекомендованнной ссылки на github
достаточно ли просто окрыть файл
и скопировать его содержимое вручную?
Чтобы репозитории смотрели на друпаловские этого достаточно? там это уже прописано или нужно еще что-то добавлять?
Если у меня сложности при установке композера и драш через командную строку, но работать с командами их удобно, могу ли я просто из этого файла на гитхаб скачать файл composer.json и папку драш и начать работать с ними или все равно нужно через командную строку?
У меня после настройки только директивы
Could not find a version of package drupal/feeds matching your minimum-stability (dev).
после попытки самостоятельного ручного переноса содержимого composer.json в мой файл снова ошибка и модуль не устанваливается (еще пока жду что возможно в службе поддержки нормально настроят, но у меня пока не работает все равно),
[RuntimeException]
Could not scan for classes inside "scripts/composer/ScriptHandler.php" which does not appear to be a file nor a folder
Could not scan for classes inside "scripts/composer/ScriptHandler.php" which does not appear to be a file nor a folder
Class DrupalProject\composer\ScriptHandler is not autoloadable, can not call pre-update-cmd script
Нет.
Да.
Добавляете то что нужно вашему проекту. Этот файл - всего стартовая точка.
Звучит неправильно. Не делайте так. Работайте инструментами в том виде, в котором они должны работать, не придумывайте лишних глупостей.
Показывайте свой composer.json, а то у вас с комментария в комментарий - разные вариации ошибки.
Это следствие "ручных" копирований.
Спасибо.
Пока жду ответ службы поддержки хостинга файл json отсюда полностью
https://github.com/drupal-composer/drupal-project/tree/7.x
только то что там
А как через командную строку именно этот composer.json установить?
https://getcomposer.org/doc/00-intro.md