[Dev] Re: embarrassing patch question
David Filion
dev@trilug.org
Thu, 28 Feb 2002 11:39:42 -0500
John F Davis wrote:
>
> Hello
>
> Ok. I've been using patch and I've asked some questions about it on IRC,
> but I'm still not
> sure about how to use it "CORRECTLY" or in the "PRESCRIBED-METHOD". So,
> please correct me.
>
> I want to create a patch file to give to my co-workers and instructions on
> how to use it.
>
> With that said, here is the scenario:
>
> I have a original directory called foo.orig and a "up-to-date" directory
> called foo.latest.
> So, I created a patch file using this syntax:
> diff -Naur foo.orig foo.latest > foo.patch
>
> Then to apply the patch, I did:
> patch -p1 foo < foo.patch
> or
> patch -p1 foo.orig < foo.patch
> I can't remember which one I did.
>
> I think this is right. However, it would be great if someone would clear
> up the bit
> about the target directory. Does the target directory have to called the
> same as the
> "patched" or "orig" directory? Is there a way to specify or edit the patch
> file so
> that the end user can have their own custom directory name. For instance,
> I used foo and foo.orig, but the end user might have directory names
> like foo2 or foo.nfs, etc.
>
> JD
>
> --
> Kernelnewbies: Help each other learn about the Linux kernel.
> Archive: http://mail.nl.linux.org/kernelnewbies/
> IRC Channel: irc.openprojects.net / #kernelnewbies
> Web Page: http://www.kernelnewbies.org/
I threw together something a while ago when I was in the same
situation, I've included it below. Because we are using Solaris
at work, it covers the older and newer versions of diff/patch.
HTH
David Filion
--- Start of doc ---
Creating a patch
Below is a cheat sheet for creating and applying patch files. For more
details about each command, check the commands manpage, info document or
try "command --help".
1.0 Using older versions of diff/patch.
The older diff/patch utilities don't understand the newer unified
format. Thus, the older conext format must be used. Thus the -c
option that appears.
1.1 Create the patch
diff -c -b -r /original /new > filename.patch
diff options:
-c Produces a listing of differences with three lines of context.
-b Ignores trailing blanks (spaces and tabs) and treats other strings
of blanks as equivalent.
-r Applies diff recursively to common subdirectories encountered.
1.2 Apply the patch
patch -c -l -p1 -d /original < filename.patch
patch options:
-c Interpret the patch file as a context difference (the output of
the command diff when the -c or -C options are specified).
-l Cause any sequence of blank characters in the difference script
to match any sequence of blank characters in the input file.
Other characters will be matched exactly.
-d Change the current directory to dir before processing.
-p NUM Strip NUM leading components from file names.
2.0 Using newer/GNU diff and patch utilities.
Unlike their older counterparts, the newer/GNU versions of diff
understand the unified format of patch file. This is the format used
by the Linux kernel developers.
2.1 Create the patch
diff -u oldfile newfile > filename.patch
or diff -urN /olddir /newdir > filename.patch
or diff -urN -X excludes /olddir /newdir > filename.patch
diff options:
-u Output (default 2) lines of unified context.
-r Recursively compare any subdirectories found.
-N Treat absent files as empty.
-X FILE Exclude files that match any pattern in FILE.
Note: The -u options can be replaced with -c to create a context format diff
file with a setting of two lines.
2.2 Apply the patch
gzip -cd patch.gz | patch -p0
or bzip2 -dc patch.bz2 | patch -p0
or patch -p0 < filename.patch
patch options:
-p NUM Strip NUM leading components from file names.
3.0 Creating a patch using CVS.
A patch is created in CVS using the rdiff cvs command.
3.1 Create the patch.
o Create a context (default) format diff of release tags rel1 and
rel2 for module.
cvs rdiff -r rel1 -r rel2 module
o Create a unidiff format diff of release tags rel1 and rel2
for module.
cvs rdiff -u -r rel1 -r rel2 module
cvs rdiff options:
-r tag Use revision <tag>
-u Use the unidiff format.
-c Use the context format (default).
Copyright (c) David Filion (filiond@videotron.ca)
Created 2001/09/12.