Общие правила применения пэтчей

Главные вкладки

Аватар пользователя univerico univerico 12 июня 2018 в 12:31

Здравствуйте! Подкажите, как правильно применять пэтчи?
Обязательно ли искать какие-то файлы и там что-то закомментировать, раскомментировать и добавлять или
можно сделать одной командой?

Самая близкая тема эта по пэтчу для 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?

Комментарии

Аватар пользователя ivnish ivnish 12 июня 2018 в 16:35
1

Открываете файл патча, там прописан путь (относительно родительского каталога) к файлу, который патчил автор. Затем кладёте патч в тот же (родительский) каталог, переходите в него (команда cd) и патчите

patch -p0 < имя_патча

Аватар пользователя ivnish ivnish 12 июня 2018 в 20:15
1

Специально написал. Читайте 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.

Аватар пользователя univerico univerico 13 июня 2018 в 23:54

Спасибо. Вроде относительно понятно, что написано что нужно поставить такое число, которое соответсвует числу файлов, указанных в пэтче, но ясная картина не вырисовывается, что нужно делать? посчитать сколько файлов указано для редактирования в патче? и как учитывать слэши и двойные слэши?

Также не могу понять где искать путь в каталог, где должен быть пэтч
Например здесь:
#45 для feeds
Начало файла такое

diff --git a/plugins/FeedsProcessor.inc b/plugins/FeedsProcessor.inc
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 - это же путь к файлу который нужно редактировать а не место расположения пэтча?

Аватар пользователя ivnish ivnish 14 июня 2018 в 15:29
1

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

patch -p1 < feeds-orphaned-feeds-item-1394320-45.patch

Аватар пользователя univerico univerico 14 июня 2018 в 15:12

Спасибо. Буду пробовать этот способ для других пэтчей, в конкретном случае пока что-то видимо не так делаю, так как не работает,
например, если я работаю с модулем 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, который рядом с файлом пэтча на дорге как интерпретировать, например

diff --git a/plugins/FeedsProcessor.inc b/plugins/FeedsProcessor.inc
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);
       }
     }
Аватар пользователя univerico univerico 14 июня 2018 в 19:09

Спасибо. А из какой все же папки Вы делали: feeds или feeds/plugins?
И на какое указание в пэтче нужно ориентироваться для выбора?

Аватар пользователя univerico univerico 14 июня 2018 в 19:34

Спасибо.
У меня сработала команда 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

А остальное вроде нормально
(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.)
скриншот

Аватар пользователя univerico univerico 12 июня 2018 в 20:04

Там в примере было
patch -p1 < path/any_name.patch
там предполагалось что еще нудно перед именем патча указать путь/?

а в Вашем вариане выполняем комнаду из той же папки где и файл, пишем  -p0 и путь не указываем совсем?

Аватар пользователя VasyOK VasyOK 12 июня 2018 в 18:35
1

Угу, а если патч к предыдущей версии модуля, а в новой что-то наворотили? И может быть, что патч подходит, может нет. Может подходит с минимальными правками так что и без знаний РНР можно допереть.
Открываем патч и добавляем и удаляем строки ручками ориентируясь на плюски и минусики

Аватар пользователя univerico univerico 14 июня 2018 в 19:47

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

Аватар пользователя sas@drupal.org sas@drupal.org 12 июня 2018 в 19:02
1

Механизм patch ей накопительный с открытым кодом, поэтому почти всегда пишут к чему применять, а случае возникновения вопросов и проблем - смотрим в patch.

Аватар пользователя univerico univerico 12 июня 2018 в 20:01

Спасибо большое всем за ответы. И еще такой вопрос, а можно ли (кроме git и использования бэкапов) какой-то специальной командой для патча делать откат патча?

Аватар пользователя univerico univerico 13 июня 2018 в 23:51

Ясно, спасибо, буду использовать этот способ, особенно если откат придется делать когда уже сделаны другие важные изменения, которые не нужно откатывать.

Аватар пользователя bumble bumble 14 июня 2018 в 0:05
1

VCS -> Apply Patch:
Apply patch from PHP Storm menu

Или, просто перетащите файл патча в открытый проект мышью Smile
При необходимости, подправьте эндпоинты.

Аватар пользователя univerico univerico 14 июня 2018 в 0:43

Спасибо! Т.е. для сайта на удаленном хостинге сначала мне нужно открыть проект на хостинге (папку модуля открыть?) и потом просто в него перетащить пэтч и команду не нужно применять через командную строку?
А как открыть проект на хостинге через php storm? Я выбираю file/open URL пишу путь к папке полностью, но мне пишет Can not load ...

Аватар пользователя univerico univerico 14 июня 2018 в 19:45

А что такое hunk в отчете о работе пэтча?
Если в отчете ошибка об одном hunk то можно его уже руками доделать?
Как найти в файле инструкцию для нужного hunk?

Аватар пользователя univerico univerico 14 июня 2018 в 19:54

А что значат символы перед строками?
+ добавить
- убрать
А что значит
+++
---
@@
?
И почему иногда не перед всеми строками знаки, как тогда действовать?
Например, плюс потом просто строки, то что делать?
например
+ * 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();
}

Аватар пользователя ivnish ivnish 14 июня 2018 в 20:04
1

+++ и --- указывают из каких файлов формировался файл патча (разность между этими файлами)
@@ и числа означают номера строк, где будут происходить изменения.

Не хочу вас обидеть, но это можно понять просто взглянув на любой файл патча Smile

Аватар пользователя univerico univerico 14 июня 2018 в 20:21

Кстати, наверное нужно было смотреть в редакторе или php storm
Я смотрю просто в браузере в редакторе на хостинге, там с непривычки вообще все сливается без подсветки и в той теме по hierarhicak select уже отчасти эти вопросы обсуждали, вылетело из головы.

Аватар пользователя gun_dose gun_dose 14 июня 2018 в 21:22
1

Кстати, не забудьте о том, что при обновлении модуля патч слетит. И сам файл патча тоже удалится безвозвратно. Именно поэтому в семёрке патчи надо накатывать через drush make, а в восьмёрке через композер.

Аватар пользователя univerico univerico 15 июня 2018 в 0:54

Да, спасибо. А как в норме должна работать эта команда?
Я пробую по образцу из 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.

Аватар пользователя univerico univerico 15 июня 2018 в 11:03

Спасибо. У меня уже на сервере на хостинге есть композер, но я не могу найти команду для запуска патча.
Как искать? Или какая команда?
Удалось найти только (но это не то):
Плагин cweagans/composer-patches (входящий в состав Drupal Composer template) использует патчи описаные в секции «extra» файла composer.json:

"extra": {
       "patches": {
           "<PACKAGE/NAME>": {
               "<PATCH DESCRIPTION>": "<PATH/TO/PATCH/OR/URL>",
               ...
           },
           ...
       }
   }
Аватар пользователя univerico univerico 15 июня 2018 в 17:25

Т.е. нужно просто установить feeds через композер?

Из какой папки это нужно делать?
А обязательно версию указывать?

Вот в этом примере из этой статьи, по месту откуда выполнять команду сказано что, нужно устанавливать
"путем выполнения composer команд из корня проекта. (это на один уровень выше корневой директории Drupal)":
composer require drupal/migrate_plus 8.1.*@Dev

т.е. для feeds
мне достаточно
composer require drupal/feeds

а из какой папки?

Аватар пользователя univerico univerico 15 июня 2018 в 17:49

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"

Аватар пользователя bumble bumble 16 июня 2018 в 10:27
1

univerico wrote:

composer require drupal/feeds
а из какой папки?

Да, из корня.

  • Конфиг композера там должен быть (наличие composer.json), репозитории должны смотреть на Drupalorg'овский
  • Директива "minimum-stability" должна быть установлена на "dev", для поддержания модулей находящихся в не стабильной версии.

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

Аватар пользователя univerico univerico 16 июня 2018 в 9:36

Спасибо. Видимо что-то из описанных Вами натсроек сайта или акаунта не так. Жду ответ от службы поддержки.
После ввода 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]

Аватар пользователя univerico univerico 16 июня 2018 в 23:45

bumble wrote:

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

Подскажите, а из рекомендованнной ссылки на 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

Аватар пользователя bumble bumble 17 июня 2018 в 0:41

univerico wrote:

достаточно ли просто окрыть файл

и скопировать его содержимое вручную?

Нет.

univerico wrote:

Чтобы репозитории смотрели на друпаловские этого достаточно?

Да.

univerico wrote:

там это уже прописано или нужно еще что-то добавлять?

Добавляете то что нужно вашему проекту. Этот файл - всего стартовая точка.

univerico wrote:

просто из этого файла на гитхаб скачать файл composer.json и папку драш и начать работать с ними или все равно нужно через командную строку?

Звучит неправильно. Не делайте так. Работайте инструментами в том виде, в котором они должны работать, не придумывайте лишних глупостей.

univerico wrote:

Could not find a version of package drupal/feeds matching your minimum-stability (dev).

Показывайте свой composer.json, а то у вас с комментария в комментарий - разные вариации ошибки.

univerico wrote:

Could not scan for classes inside "scripts/composer/ScriptHandler.php" which does not appear to be a file nor a folder

Это следствие "ручных" копирований.

Аватар пользователя univerico univerico 17 июня 2018 в 1:03

Спасибо.

bumble wrote:

Показывайте свой composer.json, а то у вас с комментария в комментарий - разные вариации ошибки.
...
Это следствие "ручных" копирований.

Пока жду ответ службы поддержки хостинга файл json отсюда полностью
https://github.com/drupal-composer/drupal-project/tree/7.x
только то что там
А как через командную строку именно этот composer.json установить?