Ethereal-dev: Re: [Ethereal-dev] What's the recommended way to use the patch tool?
Ulf Lamping wrote:
Given the file "new.diff" containing a unified diff, what is the right
way to call the patch tool?
That depends on what the pathnames in "new.diff" look like. If they're
relative to the top-level source directory - for example, if a patch to
"prefs.c" just has "prefs.c" as the file name - you'd run it as
patch -p0 <new.diff
If they're relative to a higher-level directory, you'd replace 0 with
the number of higher-level directories in the path, e.g. if the names
are "ethereal.orig/prefs.c" and "ethereal.mine/prefs.c", you'd run it with
patch -p1 <new.diff
If they're relative to a *subdirectory* of the top-level directory,
you'd run "patch" in *that* directory and run it with "-p0".
If you run it without "-p" at all, it flattens path names, so that if
you have a patch file with patches to "Makefile.am" and
"wiretap/Makefile.am", it'll try to apply the first patch to the
top-level "Makefile.am" and then apply the "wiretap/Makefile.am" patch
to the top-level "Makefile.am" as well. (No, I don't know why "-p0"
isn't the default; perhaps their idea was that most software to which
you apply patches doesn't have subdirectories in the source tree, and
stripping directories makes sure that the patches will apply regardless
of how many extraneous directory names are in the path names.)
Is there a difference when the diff file contains one file "diff -u" or
more files "diff -ur"?
There isn't a difference in the arguments to "patch".
(However, there is a difference in the number of times you have to run
"patch" - and the number of times you have to save a patch file from
mail - so I, at least, prefer it when people send a single patch file
with patches for all the files to be changed.)
At which position in the filesystem has the patch tool to be called?
If the pathnames are relative to the top-level source directory, or to a
directory above that directory, you'd run it in the top-level source
directory.
If they're relative to a *subdirectory* - for example, if somebody did a
patch to "packet-ip.c" and ran "diff" or "svn diff" in the
"epan/dissectors" directory - you'd run it in that subdirectory. (I
would really prefer that people *NOT* submit patches like that -
especially if they're only patching files that exist in multiple
directories, such as "Makefile.am".)