Reading and applying patches

Cameron Simpson cs at zip.com.au
Tue Sep 5 08:12:01 UTC 2006


On 05Sep2006 01:44, Todd Zullinger <tmz at pobox.com> wrote:
| Chong Yu Meng wrote:
| > --- mlrate/mlrate.c 2003-01-27 10:31:31.000000000 +0100 
| > +++ mlrate.new/mlrate.c 2004-11-22 12:37:52.086783325 +0100 
| > @@ -25,6 +25,8 @@ 
| > #include <string.h> 
| > ... and continues for a bit longer
| > 
| > I assume that I should copy and paste the text into a separate file
| > and save it. But how do I apply the patch to the source file, which
| > is mlrate.c? 
| 
| You assume correctly.

It's worth mentioning that patch is pretty forgiving. You can usually
save the entire message to a file; patch is happy to skip past the leading
text up to the actual patch data (the output of a diff command, btw).

[...]
| > Also, how do I read the file? From some patch files I have come
| > across, they have "pluses" and "minuses" and other notation. What do
| > they mean?
| 
| Lines beginning with a plus are being added by the patch, lines with a
| minus are being removed.  The lines that start with either 3 minuses
| or plusses indicate the path of file that's being patched.

Also "!" prefixes lines in both parts that replace each other; the "+"
and "-" prefixes  are where lines are removes or added respectively
without any new (or old, respectively) text.

Patch understands output from diff(1), which comes in three basic flavours:

  - original diff (rarely used) which is actually a set of ed(1)
    commands to turn the old files into the new file.
  
  - context diff, as produced by "diff -c", which is more human readable,
    surrounding the changed lines with some unchanged lines from the files.
    This also has the advantage or permitting patch to cope a bit with
    mismatches. For example, if you have a diff between versions 1.21
    and 1.22, and you're trying to apply it to 1.20; if the files are
    similar enough patch can use the context lines to guess where the
    patch should go.

  - unified diff, as produced by "diff -U", which is a more compact form
    of context diff, and just as human readable, if not more so.

Make yourself a text file (eg a copy of this message). Then copy it and
modify the copy in various ways. Then compare the two using "diff -U".

A larger patch will normally be made from two complete source trees (the
old and the new) by running diff with the -r option (recursive) which
produces diffs for all the changes files.

For program version change patches, often the "old" tree will be inside
some source control system instead of being a real distinct directory
tree. Commands like "cvs diff" will generate diff output, comparing your
working area against the version inside the system.

Cheers,
-- 
Cameron Simpson <cs at zip.com.au> DoD#743
http://www.cskk.ezoshosting.com/cs/

[He] is the only man I know who would regard a naked, beautiful woman staring
deep into his eyes as an uncomplaining audience for his views on the latest
version of the twm window manager.      - igb at fulcrum.co.uk (Ian G Batten)




More information about the fedora-list mailing list