X-Cart:To apply a patch manually

From X-Cart 4 Classic
Revision as of 11:40, 1 October 2011 by Seyfin (talk | contribs) (What is diff file?)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

What is diff (patch) file?

Diff (or patch) is a file that displays the changes made per line for text files, and in particular, for X-Cart source files.

Diff can include changes for several files. The name of each modified file is specified under a header line that may look something like this:

Index: include/func/func.category.php

The above header line indicates that the diff displays the changes for <xcart_dir>/include/func/func.category.php file.

Each header line is then followed with one or several "hunks". Each "hunk" starts with a line that may look something like this:

@@ -942,8 +940,7 @@

where:

  • 942 - indicates the number of the first line in the original code (before patch application)
  • 8 - indicates the number of lines in the original code (before patch application)
  • 940 - indicates the number of the first line in the changed code (after patch application)
  • 7 - indicates the number of lines in the changed code (after patch application)

Then follows the file code that includes lines marked with the "+" and "-" signs.

Lines marked with "+" are the lines that you need to add in the file to be patched.

Lines marked with "-" are the lines that you need to remove from the file to be patched.

Example of diff file

Index: include/func/func.category.php
@@ -585,9 +585,7 @@

$cat = abs(intval($cat));

-    $to_search =
-    $search_condition =
-    $join_tbl = array();
+    $to_search = $search_condition = $join_tbl = array();

$from = "$sql_tbl[categories] AS node ";

@@ -942,8 +940,7 @@
'c.rpos'
);

-    $search_condition =
-    $join_tbl = array();
+    $search_condition = $join_tbl = array();

if ($current_area == 'A' || $current_area == 'P') {

General instructions

1. Open the diff file in a text editor.

2. Edit the file (in our example, include/func/func.category.php):

  • Find the lines marked with "-" in the text of the patch and remove them.
  • Insert the lines marked with "+" in the text of the patch.

In our example, the original code (before applying the patch) would look like:

line 585:
line 586:    $cat = abs(intval($cat));
line 587:
line 588:    $to_search =
line 589:    $search_condition =
line 590:    $join_tbl = array();
line 591:
line 593:    $from = "$sql_tbl[categories] AS node ";
line 594:
...
line 942:        'c.rpos'
line 943:    );
line 944:
line 945:    $search_condition =
line 946:    $join_tbl = array();
line 947:
line 948:    if ($current_area == 'A' || $current_area == 'P') {
line 949:

Total lines: 9 and 8 in each hunk correspondingly.

The changed code (after applying the patch) would look like:

line 585:
line 586:    $cat = abs(intval($cat));
line 587:
line 588:    $to_search = $search_condition = $join_tbl = array();
line 589:
line 590:    $from = "$sql_tbl[categories] AS node ";
line 591:
...
line 940:        'c.rpos'
line 941:    );
line 942:
line 943:    $search_condition = $join_tbl = array();
line 944:
line 945:    if ($current_area == 'A' || $current_area == 'P') {
line 946:

Total lines: 7 and 7 in each hunk correspondingly.

Understanding the process

In simple words, the patch application procedure for each hunk is as follows:

  • Search for the code to be replaced around (above and below) the expected line.
  • If found, change it to the new code.

Let us take another look at the second hunk of the example patch provided above to understand the process:

@@ -942,8 +940,7 @@
'c.rpos'
);

-    $search_condition =
-    $join_tbl = array();
+    $search_condition = $join_tbl = array();

if ($current_area == 'A' || $current_area == 'P') {
  • Original code to search for (8 lines of code around the line 942):
'c.rpos'
);

$search_condition =
$join_tbl = array();

if ($current_area == 'A' || $current_area == 'P') {

  • New code to change to (7 lines of code):
'c.rpos'
);

$search_condition = $join_tbl = array();

if ($current_area == 'A' || $current_area == 'P') {

The built-in patch/upgrade utility basically works in the same way.