What is the format of a patch file?

PatchFile Format

Patch Problem Overview


What does the following mean ?

diff -rBNu src.orig/java/org/apache/nutch/analysis/NutchAnalysisConstants.java src/java/org/apache/nutch/analysis/NutchAnalysisConstants.java
--- src.orig/java/org/apache/nutch/analysis/NutchAnalysisConstants.java	2009-03-10 11:34:01.000000000 -0700
+++ src/java/org/apache/nutch/analysis/NutchAnalysisConstants.java	2009-03-10 14:11:55.000000000 -0700
@@ -4,9 +4,12 @@

+  int CJK = 21;
+  int DIGIT = 22;
 
   int DEFAULT = 0;
 
   String[] tokenImage = {
     "<EOF>",
+    "\"OR\"",
     "<WORD>",
     "<ACRONYM>",
     "<SIGRAM>",
@@ -39,6 +42,8 @@
     "\"\\\"\"",
     "\":\"",
     "\"/\"",
+    "\"(\"",
+    "\")\"",
     "\".\"",
     "\"@\"",
     "\"\\\'\"",

Patch Solutions


Solution 1 - Patch

The -u option you used specifies the unified format. In that format the first two lines is a header: --- is the original file, +++ is the new file, and the timestamps.

@@ block headers

That is then followed by chunks (change hunks) that starts with the @@ -R,r +R,r @@ syntax.

Those are two ranges, the one with the - is the range for the chunk in the original file, and the one with the + the range in the new file. The R designates the line number where the diff operation is started.

The numbers after the comma are the number of affected lines in each file.

  • Every time you remove a line, the +r number will be smaller than -r.
  • Every time you add a line, the +r number will be bigger than -r
  • Changing a line will add 0 to the +r number. (same scope of lines)
Chunks of code lines

Within these chunks lines are identified as additions or deletions - means delete, + means addition. Lines that did not change in that chunk will have neither + or - front of it.

In your example it means there are two chunks, or sections, that changed between the two files and the lines with + in it are the new ones added, nothing was deleted.

You can find much more information about the syntax by doing a google search for unified diff.

Solution 2 - Patch

The old file name

--- src.orig/java/org/apache/nutch/analysis/NutchAnalysisConstants.java 2009-03-10 11:34:01.000000000 -0700

The new file name

+++ src/java/org/apache/nutch/analysis/NutchAnalysisConstants.java  2009-03-10 14:11:55.000000000 -0700
  • -4: chunk begins at line 4 in old file (including context lines);
  • 9: number of lines in the chunk in old file including context lines (so total of lines that have a - or nothing in front of them);
  • +4: chunk begins at line 4 in the new file;
  • 12: number of lines in the chunk in new file including context lines (so total of lines that have a + or nothing in front of them).

Notice: I changed the diff to include a modified line, so a deleted line followed by an added line.

@@ -4,9 +4,12 @@

+  int CJK = 21;
+  int DIGIT = 22;

-  int DEFAULT = 0;
+  int DEFAULT = 42;

   String[] tokenImage = {
     "<EOF>",
+    "\"OR\"",
     "<WORD>",
     "<ACRONYM>",
     "<SIGRAM>",

Same as above, but notice the chunk in the new file starts 3 lines further because the previous chunk added a net worth of 3 lines.

@@ -39,6 +42,8 @@
     "\"\\\"\"",
     "\":\"",
     "\"/\"",
+    "\"(\"",
+    "\")\"",
     "\".\"",
     "\"@\"",
     "\"\\\'\"",

Solution 3 - Patch

The + characters mean that those lines were added since the last version of NutchAnalysisConstants.java. The @@ line is telling you that the diff has jumped to another section of the file, in this case line 39 in the original, or line 43 in the new.

Solution 4 - Patch

That depends on what you're asking. Diff shows you the differences between two files. In your case you're diffing NutchAnalysisConstants.java from two different places and generating information about those differences.

-r to diff means "recursive diff," although in this case it does nothing since you're diffing files, not directories.

-B means to ignore changes that only involve blank lines.

-N means that if in directory1 I have a file, but it isn't present in directory2, diff should treat it as if the file is present but empty in directory2 (thus effectively giving you the full contents of the file in directory1).

-u means to use the unified output format, which is only supported by GNU diff and GNU patch.

As for what the output means, this link may be useful for you.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionomgView Question on Stackoverflow
Solution 1 - PatchAndre MillerView Answer on Stackoverflow
Solution 2 - PatchqwertzguyView Answer on Stackoverflow
Solution 3 - PatchJohn GView Answer on Stackoverflow
Solution 4 - PatchFreeMemoryView Answer on Stackoverflow