Применить патч из файла с расширением ".patch" или ".diff"

Нужно перейти в ту папку, где создавался этот файл.
Ее можно узнать, посмотрев внутрь файла любым текстовым редактором, например nano. Там первой строчкой будет указан файл, который заменяется. Ищем этот файл у себя, и копируем файл с патчем в ту папку. Затем внутри той папки выполняем команду
patch -p1

Все.

The -p option tells patch how many leading prefixes to strip. For patches created using git, -p1 is normally the right option, and is the default for git apply. If that doesn't work, try either of the above commands with -p0 instead.

Если при этом вы получаете следущую ошибку:
bash: patch: команда не найдена
То нужно установить программу "patch". В АрхЛинкусе ее найти очень сложно - она оказывается прячется в пакете base-devel:
sudo pacman -S base-devel

Также можно сделать по-другому.
Такой способ будет необходим, если нас не устраивают пути, по которым делался патч. Например, в моём случае человек сделал патч через пути editview.newnodeajax/theme/editview.js , а я не хочу у себя создавать kbiy.. папку editview.newnodeajax для применения этого патча.
Тогда:

Сначала смотрим содержимое этого файла. Там должна быть одна или несколько шапок типа такого

diff -U 3 -H -B -E -p -t -r -N -- editview/theme/editview.js editview.newnodeajax/theme/editview.js
--- editview/theme/editview.js	2010-11-11 06:04:30.000000000 +1100
+++ editview.newnodeajax/theme/editview.js	2011-03-10 16:07:30.220180542 +1100

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

Соответственно разделяем файл на столько файлов, сколько таких шапок есть. Т.е. если у меня примерно такой файл

diff -U 3 -H -B -E -p -t -r -N -- editview/includes/editview.views.inc editview.newnodeajax/includes/editview.views.inc
--- editview/includes/editview.views.inc	2011-01-24 07:48:54.000000000 +1100
+++ editview.newnodeajax/includes/editview.views.inc	2011-03-10 16:06:43.050180542 +1100
@@ -70,40 +70,66 @@ function editview_js() {
   if (isset($_POST['form_build_id']) && isset($_POST['editview_view'])) {
     // We are going to need to load nodes 
     module_load_include('inc', 'node', 'node.pages');
-
-    // Build the view so all necessary classes will be defined.
+    
+    // Build the view so all necessary classes will be defined
+    // and so we can re-render it if necessary
     $view = views_get_view($_POST['editview_view']);
-    $view->build();
-
+    $view->set_arguments(unserialize($_POST['editview_view_args']));
+    //inlude input (exposed filters) and pager in case of re-render
+    $view->set_exposed_input(unserialize($_POST['editview_view_input']));
+    $view->pager = unserialize($_POST['editview_view_pager']);
+    $view->build($_POST['editview_view_display']);
+    
     // Fast path is to get the form out of the cache. But if minimum cache
     // lifetimes have been specified, on post of a form all cached forms
     // except the posted one get invalidated. In that case we need to rebuild
     // the form from scratch.
+    $form_id = $_POST['form_id'];
     $form_build_id = $_POST['form_build_id'];
     $form_state = array('storage' => NULL, 'submitted' => FALSE);
     $form = form_get_cache($form_build_id, $form_state);
+    $is_new_node = $form_id == 'editview_node_form_new';
     if (empty($form)) {
-      $node = node_load($_POST["editview_nid"]);
-      $form = drupal_retrieve_form($_POST['form_id'], $form_state, $node, $view, $_POST["editview_order"], $_POST["editview_uri"]);
+      if (!$is_new_node) {
+        $node = node_load($_POST["editview_nid"]);
+      }
diff -U 3 -H -B -E -p -t -r -N -- editview/theme/editview.js editview.newnodeajax/theme/editview.js
--- editview/theme/editview.js	2010-11-11 06:04:30.000000000 +1100
+++ editview.newnodeajax/theme/editview.js	2011-03-10 16:07:30.220180542 +1100
@@ -9,7 +9,9 @@ var Editview = Editview || {
     var form = this;
     var form_id = $('[name=form_id]', form).val();
     var node_form = form_id && form_id.match(/^editview_node_form_\d+/);
+    var node_form_new = form_id && form_id.match(/^editview_node_form_new/);
     if (node_form) {
+      var wrapper = $(form).parent();
       var options = {
         url: Drupal.settings.editview.submit_url,
         beforeSubmit: function(form_values, form, options) {
@@ -26,14 +28,12 @@ var Editview = Editview || {
           if (deleted && !confirm(Drupal.t('Are you sure you want to delete @name?', {'@name': name}) +"\n"+ Drupal.t('This action cannot be undone.'))) {
             return false;
           }
-          var wrapper = $(form).parent();
           wrapper.slideUp('slow');
         },

То я разделяю его на два файла с такими содержимыми:
1й файл:

diff -U 3 -H -B -E -p -t -r -N -- editview/includes/editview.views.inc editview.newnodeajax/includes/editview.views.inc
--- editview/includes/editview.views.inc	2011-01-24 07:48:54.000000000 +1100
+++ editview.newnodeajax/includes/editview.views.inc	2011-03-10 16:06:43.050180542 +1100
@@ -70,40 +70,66 @@ function editview_js() {
   if (isset($_POST['form_build_id']) && isset($_POST['editview_view'])) {
     // We are going to need to load nodes 
     module_load_include('inc', 'node', 'node.pages');
-
-    // Build the view so all necessary classes will be defined.
+    
+    // Build the view so all necessary classes will be defined
+    // and so we can re-render it if necessary
     $view = views_get_view($_POST['editview_view']);
-    $view->build();
-
+    $view->set_arguments(unserialize($_POST['editview_view_args']));
+    //inlude input (exposed filters) and pager in case of re-render
+    $view->set_exposed_input(unserialize($_POST['editview_view_input']));
+    $view->pager = unserialize($_POST['editview_view_pager']);
+    $view->build($_POST['editview_view_display']);
+    
     // Fast path is to get the form out of the cache. But if minimum cache
     // lifetimes have been specified, on post of a form all cached forms
     // except the posted one get invalidated. In that case we need to rebuild
     // the form from scratch.
+    $form_id = $_POST['form_id'];
     $form_build_id = $_POST['form_build_id'];
     $form_state = array('storage' => NULL, 'submitted' => FALSE);
     $form = form_get_cache($form_build_id, $form_state);
+    $is_new_node = $form_id == 'editview_node_form_new';
     if (empty($form)) {
-      $node = node_load($_POST["editview_nid"]);
-      $form = drupal_retrieve_form($_POST['form_id'], $form_state, $node, $view, $_POST["editview_order"], $_POST["editview_uri"]);
+      if (!$is_new_node) {
+        $node = node_load($_POST["editview_nid"]);
+      }

2й файл:

diff -U 3 -H -B -E -p -t -r -N -- editview/theme/editview.js editview.newnodeajax/theme/editview.js
--- editview/theme/editview.js	2010-11-11 06:04:30.000000000 +1100
+++ editview.newnodeajax/theme/editview.js	2011-03-10 16:07:30.220180542 +1100
@@ -9,7 +9,9 @@ var Editview = Editview || {
     var form = this;
     var form_id = $('[name=form_id]', form).val();
     var node_form = form_id && form_id.match(/^editview_node_form_\d+/);
+    var node_form_new = form_id && form_id.match(/^editview_node_form_new/);
     if (node_form) {
+      var wrapper = $(form).parent();
       var options = {
         url: Drupal.settings.editview.submit_url,
         beforeSubmit: function(form_values, form, options) {
@@ -26,14 +28,12 @@ var Editview = Editview || {
           if (deleted && !confirm(Drupal.t('Are you sure you want to delete @name?', {'@name': name}) +"\n"+ Drupal.t('This action cannot be undone.'))) {
             return false;
           }
-          var wrapper = $(form).parent();
           wrapper.slideUp('slow');
         },

Далее я копирую соответсвующий файл в ту папку, где находится тот файл, который указан в шапке diff (в моём случае это файлы editview.newnodeajax/includes/editview.views.inc и editview/theme/editview.js), и далее применяем такую команду

patch originalfile -i patchfile.patch -o name.of.updatedfile

Например, в моём случае это выглядит так:

 patch editview.views.inc -i editview.newnodeajax.diff -o editview.views.patched.inc

(я файл с отделённой первой шапкой назвал editview.newnodeajax.diff)
Консоль вам должна выдать лишь одну строчку типа такого

patching file editview.js

Это означает что всё хорошо.

Удачи!

Комментарии

Добавить комментарий