version 1.8, 2003/07/22 20:17:06 |
version 1.9, 2003/07/24 04:41:19 |
|
|
.\" $OpenBSD$ -*- nroff -*- |
.\" $OpenBSD$ |
.\" Copyright 1986, Larry Wall |
.\" Copyright 1986, Larry Wall |
.\" |
.\" |
.\" Redistribution and use in source and binary forms, with or without |
.\" Redistribution and use in source and binary forms, with or without |
|
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
.\" SUCH DAMAGE. |
.\" SUCH DAMAGE. |
.\" |
.\" |
.rn '' }` |
.Dd July 23, 2003 |
.de Sh |
.Dt PATCH 1 |
.br |
.Os |
.ne 5 |
.Sh NAME |
.PP |
.Nm patch |
\fB\\$1\fR |
.Nd apply a diff file to an original |
.PP |
.Sh SYNOPSIS |
.. |
.Nm patch |
.de Sp |
.Op Cm options |
.if t .sp .5v |
.Op Ar origfile Op Ar patchfile |
.if n .sp |
.Nm patch |
.. |
.Pf \*(Lt Ar patchfile |
'\" |
.Sh DESCRIPTION |
'\" Set up \*(-- to give an unbreakable dash; |
.Nm |
'\" string Tr holds user defined translation string. |
|
'\" Bell System Logo is used as a dummy character. |
|
'\" |
|
'\" Shut up a groff -ww warning. |
|
.if \n(.g .if !dTr .ds Tr |
|
.ie n \{\ |
|
.tr \(*W-\*(Tr |
|
.ds -- \(*W- |
|
.if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch |
|
.if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch |
|
.ds L" "" |
|
.ds R" "" |
|
.ds L' ' |
|
.ds R' ' |
|
'br \} |
|
.el \{\ |
|
.ds -- \(em\| |
|
.tr \*(Tr |
|
.ds L" `` |
|
.ds R" '' |
|
.ds L' ` |
|
.ds R' ' |
|
'br\} |
|
.TH PATCH 1 |
|
.SH NAME |
|
patch - apply a diff file to an original |
|
.SH SYNOPSIS |
|
.B patch |
|
[options] [origfile [patchfile]] |
|
.sp |
|
but usually just |
|
.sp |
|
.B patch |
|
<patchfile |
|
.SH DESCRIPTION |
|
.I Patch |
|
will take a patch file containing any of the four forms of difference |
will take a patch file containing any of the four forms of difference |
listing produced by the |
listing produced by the |
.I diff |
.Xr diff 1 |
program and apply those differences to an original file, producing a patched |
program and apply those differences to an original file, |
version. |
producing a patched version. |
By default, the patched version is put in place of the original, with |
By default, the patched version is put in place of the original, with |
the original file backed up to the same name with the |
the original file backed up to the same name with the extension |
extension \*(L".orig\*(R" (\*(L"~\*(R" on systems that do not |
.Qq .orig |
support long filenames), or as specified by the |
.Po |
.BR -b , |
|
.BR -B , |
|
or |
or |
.B -V |
.Qq ~ |
|
on systems that do not support long filenames |
|
.Pc , |
|
or as specified by the |
|
.Fl b , |
|
.Fl B , |
|
or |
|
.Fl V |
switches. |
switches. |
The extension used for making backup files may also be specified in the |
The extension used for making backup files may also be specified in the |
.B SIMPLE_BACKUP_SUFFIX |
.Ev SIMPLE_BACKUP_SUFFIX |
environment variable, which is overridden by the above switches. |
environment variable, which is overridden by the above switches. |
.PP |
.Pp |
If the backup file already exists, |
If the backup file already exists, |
.B patch |
.Nm |
creates a new backup file name by changing the first lowercase letter |
creates a new backup file name by changing the first lowercase letter |
in the last component of the file's name into uppercase. If there are |
in the last component of the file's name into uppercase. |
no more lowercase letters in the name, it removes the first character |
If there are no more lowercase letters in the name, |
from the name. It repeats this process until it comes up with a |
it removes the first character from the name. |
|
It repeats this process until it comes up with a |
backup file that does not already exist. |
backup file that does not already exist. |
.PP |
.Pp |
You may also specify where you want the output to go with a |
You may also specify where you want the output to go with the |
.B -o |
.Fl o |
switch; if that file already exists, it is backed up first. |
switch; if that file already exists, it is backed up first. |
.PP |
.Pp |
If |
If |
.I patchfile |
.Ar patchfile |
is omitted, or is a hyphen, the patch will be read from standard input. |
is omitted, or is a hyphen, the patch will be read from standard input. |
.PP |
.Pp |
Upon startup, patch will attempt to determine the type of the diff listing, |
Upon startup, |
|
.Nm |
|
will attempt to determine the type of the diff listing, |
unless over-ruled by a |
unless over-ruled by a |
.BR -c , |
.Fl c , |
.BR -e , |
.Fl e , |
.BR -n , |
.Fl n , |
or |
or |
.B -u |
.Fl u |
switch. |
switch. |
Context diffs (old-style, new-style, and unified) and |
Context diffs (old-style, new-style, and unified) and |
normal diffs are applied by the |
normal diffs are applied by the |
.I patch |
.Nm |
program itself, while ed diffs are simply fed to the |
program itself, while ed diffs are simply fed to the |
.I ed |
.Xr ed 1 |
editor via a pipe. |
editor via a pipe. |
.PP |
.Pp |
.I Patch |
.Nm |
will try to skip any leading garbage, apply the diff, |
will try to skip any leading garbage, apply the diff, |
and then skip any trailing garbage. |
and then skip any trailing garbage. |
Thus you could feed an article or message containing a |
Thus you could feed an article or message containing a |
diff listing to |
diff listing to |
.IR patch , |
.Nm patch , |
and it should work. |
and it should work. |
If the entire diff is indented by a consistent amount, |
If the entire diff is indented by a consistent amount, |
this will be taken into account. |
this will be taken into account. |
.PP |
.Pp |
With context diffs, and to a lesser extent with normal diffs, |
With context diffs, and to a lesser extent with normal diffs, |
.I patch |
.Nm |
can detect when the line numbers mentioned in the patch are incorrect, |
can detect when the line numbers mentioned in the patch are incorrect, |
and will attempt to find the correct place to apply each hunk of the patch. |
and will attempt to find the correct place to apply each hunk of the patch. |
As a first guess, it takes the line number mentioned for the hunk, plus or |
As a first guess, it takes the line number mentioned for the hunk, plus or |
minus any offset used in applying the previous hunk. |
minus any offset used in applying the previous hunk. |
If that is not the correct place, |
If that is not the correct place, |
.I patch |
.Nm |
will scan both forwards and backwards for a set of lines matching the context |
will scan both forwards and backwards for a set of lines matching the context |
given in the hunk. |
given in the hunk. |
First |
First |
.I patch |
.Nm |
looks for a place where all lines of the context match. |
looks for a place where all lines of the context match. |
If no such place is found, and it's a context diff, and the maximum fuzz factor |
If no such place is found, and it's a context diff, and the maximum fuzz factor |
is set to 1 or more, then another scan takes place ignoring the first and last |
is set to 1 or more, then another scan takes place ignoring the first and last |
|
|
If that fails, and the maximum fuzz factor is set to 2 or more, |
If that fails, and the maximum fuzz factor is set to 2 or more, |
the first two and last two lines of context are ignored, |
the first two and last two lines of context are ignored, |
and another scan is made. |
and another scan is made. |
(The default maximum fuzz factor is 2.) |
.Pq The default maximum fuzz factor is 2. |
|
.Pp |
If |
If |
.I patch |
.Nm |
cannot find a place to install that hunk of the patch, it will put the |
cannot find a place to install that hunk of the patch, it will put the hunk |
hunk out to a reject file, which normally is the name of the output file |
out to a reject file, which normally is the name of the output file plus |
plus \*(L".rej\*(R" (\*(L"#\*(R" on systems that do not support |
.Qq .rej |
long filenames). |
.Po |
|
or |
|
.Qq # |
|
on systems that do not support long filenames |
|
.Pc . |
(Note that the rejected hunk will come out in context diff form whether the |
(Note that the rejected hunk will come out in context diff form whether the |
input patch was a context diff or a normal diff. |
input patch was a context diff or a normal diff. |
If the input was a normal diff, many of the contexts will simply be null.) |
If the input was a normal diff, many of the contexts will simply be null.) |
The line numbers on the hunks in the reject file may be different than |
The line numbers on the hunks in the reject file may be different than |
in the patch file: they reflect the approximate location patch thinks the |
in the patch file: they reflect the approximate location patch thinks the |
failed hunks belong in the new file rather than the old one. |
failed hunks belong in the new file rather than the old one. |
.PP |
.Pp |
As each hunk is completed, you will be told whether the hunk succeeded or |
As each hunk is completed, you will be told whether the hunk succeeded or |
failed, and which line (in the new file) |
failed, and which line (in the new file) |
.I patch |
.Nm |
thought the hunk should go on. |
thought the hunk should go on. |
If this is different from the line number specified in the diff you will |
If this is different from the line number specified in the diff, |
be told the offset. |
you will be told the offset. |
A single large offset MAY be an indication that a hunk was installed in the |
A single large offset MAY be an indication that a hunk was installed in the |
wrong place. |
wrong place. |
You will also be told if a fuzz factor was used to make the match, in which |
You will also be told if a fuzz factor was used to make the match, in which |
case you should also be slightly suspicious. |
case you should also be slightly suspicious. |
.PP |
.Pp |
If no original file is specified on the command line, |
If no original file is specified on the command line, |
.I patch |
.Nm |
will try to figure out from the leading garbage what the name of the file |
will try to figure out from the leading garbage what the name of the file |
to edit is. |
to edit is. |
In the header of a context diff, the filename is found from lines beginning |
In the header of a context diff, the filename is found from lines beginning |
with \*(L"***\*(R" or \*(L"---\*(R", with the shortest name of an existing |
with |
file winning. |
.Qq *** |
Only context diffs have lines like that, but if there is an \*(L"Index:\*(R" |
or |
|
.Qq --- , |
|
with the shortest name of an existing file winning. |
|
Only context diffs have lines like that, but if there is an |
|
.Qq Index: |
line in the leading garbage, |
line in the leading garbage, |
.I patch |
.Nm |
will try to use the filename from that line. |
will try to use the filename from that line. |
The context diff header takes precedence over an Index line. |
The context diff header takes precedence over an Index line. |
If no filename can be intuited from the leading garbage, you will be asked |
If no filename can be intuited from the leading garbage, you will be asked |
for the name of the file to patch. |
for the name of the file to patch. |
.PP |
.Pp |
If the original file cannot be found or is read-only, but a suitable |
If the original file cannot be found or is read-only, but a suitable |
SCCS or RCS file is handy, |
SCCS or RCS file is handy, |
.I patch |
.Nm |
will attempt to get or check out the file. |
will attempt to get or check out the file. |
.PP |
.Pp |
Additionally, if the leading garbage contains a \*(L"Prereq: \*(R" line, |
Additionally, if the leading garbage contains a |
.I patch |
.Qq Prereq:\ \& |
|
line, |
|
.Nm |
will take the first word from the prerequisites line (normally a version |
will take the first word from the prerequisites line (normally a version |
number) and check the input file to see if that word can be found. |
number) and check the input file to see if that word can be found. |
If not, |
If not, |
.I patch |
.Nm |
will ask for confirmation before proceeding. |
will ask for confirmation before proceeding. |
.PP |
.Pp |
The upshot of all this is that you should be able to say, while in a news |
The upshot of all this is that you should be able to say, while in a news |
interface, the following: |
interface, the following: |
.Sp |
.Pp |
| patch -d /usr/src/local/blurfl |
.Dl | patch -d /usr/src/local/blurfl |
.Sp |
.Pp |
and patch a file in the blurfl directory directly from the article containing |
and patch a file in the blurfl directory directly from the article containing |
the patch. |
the patch. |
.PP |
.Pp |
If the patch file contains more than one patch, |
If the patch file contains more than one patch, |
.I patch |
.Nm |
will try to apply each of them as if they came from separate patch files. |
will try to apply each of them as if they came from separate patch files. |
This means, among other things, that it is assumed that the name of the file |
This means, among other things, that it is assumed that the name of the file |
to patch must be determined for each diff listing, |
to patch must be determined for each diff listing, |
and that the garbage before each diff listing will |
and that the garbage before each diff listing will |
be examined for interesting things such as filenames and revision level, as |
be examined for interesting things such as filenames and revision level, as |
mentioned previously. |
mentioned previously. |
.PP |
.Pp |
.I Patch |
.Nm |
recognizes the following switches: |
recognizes the following switches: |
.TP 5 |
.Bl -tag -width Ds |
.B \-b or \-\-suffix |
.It Fl b , Fl Fl suffix |
causes the next argument to be interpreted as the backup extension, to be |
Causes the next argument to be interpreted as the backup extension, to be |
used in place of \*(L".orig\*(R" or \*(L"~\*(R". |
used in place of |
.TP 5 |
.Qq .orig |
.B \-B or \-\-prefix |
or |
causes the next argument to be interpreted as a prefix to the backup file |
.Qq ~ . |
name. If this argument is specified any argument from -b will be ignored. |
.It Fl B , Fl Fl prefix |
.TP 5 |
Causes the next argument to be interpreted as a prefix to the backup file |
.B \-c or \-\-context |
name. |
forces |
If this argument is specified, any argument from |
.I patch |
.Fl b |
|
will be ignored. |
|
.It Fl c , Fl Fl context |
|
Forces |
|
.Nm |
to interpret the patch file as a context diff. |
to interpret the patch file as a context diff. |
.TP 5 |
.It Fl C , Fl Fl check |
.B \-C or \-\-check |
Checks that the patch would apply cleanly, but does not modify anything. |
checks that the patch would apply cleanly, but does not modify anything. |
.It Fl d , Fl Fl directory |
.TP 5 |
Causes |
.B \-d or \-\-directory |
.Nm |
causes |
to interpret the next argument as a directory, and |
.I patch |
.Xr cd 1 |
to interpret the next argument as a directory, and cd to it before doing |
to it before doing anything else. |
anything else. |
.It Fl D , Fl Fl ifdef |
.TP 5 |
Causes |
.B \-D or \-\-ifdef |
.Nm |
causes |
to use the |
.I patch |
.Qq #ifdef...#endif |
to use the "#ifdef...#endif" construct to mark changes. |
construct to mark changes. |
The argument following will be used as the differentiating symbol. |
The argument following will be used as the differentiating symbol. |
Note that, unlike the C compiler, there must be a space between the |
Note that, unlike the C compiler, there must be a space between the |
.B \-D |
.Fl D |
and the argument. |
and the argument. |
.TP 5 |
.It Fl e , Fl Fl ed |
.B \-e or \-\-ed |
Forces |
forces |
.Nm |
.I patch |
to interpret the patch file as an |
to interpret the patch file as an ed script. |
.Xr ed 1 |
.TP 5 |
script. |
.B \-E or \-\-remove-empty-files |
.It Fl E , Fl Fl remove-empty-files |
causes |
Causes |
.I patch |
.Nm |
to remove output files that are empty after the patches have been applied. |
to remove output files that are empty after the patches have been applied. |
.TP 5 |
.It Fl f , Fl Fl force |
.B \-f or \-\-force |
Forces |
forces |
.Nm |
.I patch |
|
to assume that the user knows exactly what he or she is doing, and to not |
to assume that the user knows exactly what he or she is doing, and to not |
ask any questions. It assumes the following: skip patches for which a |
ask any questions. |
file to patch can't be found; patch files even though they have the |
It assumes the following: |
wrong version for the ``Prereq:'' line in the patch; and assume that |
skip patches for which a file to patch can't be found; |
patches are not reversed even if they look like they are. |
patch files even though they have the wrong version for the |
|
.Qq Prereq: |
|
line in the patch; |
|
and assume that patches are not reversed even if they look like they are. |
This option does not suppress commentary; use |
This option does not suppress commentary; use |
.B \-s |
.Fl s |
for that. |
for that. |
.TP 5 |
.It Fl t , Fl Fl batch |
.B \-t or \-\-batch |
Similar to |
similar to |
.Fl f , |
.BR \-f , |
|
in that it suppresses questions, but makes some different assumptions: |
in that it suppresses questions, but makes some different assumptions: |
skip patches for which a file to patch can't be found (the same as \fB\-f\fP); |
skip patches for which a file to patch can't be found (the same as |
skip patches for which the file has the wrong version for the ``Prereq:'' line |
.Fl f ) ; |
in the patch; and assume that patches are reversed if they look like |
skip patches for which the file has the wrong version for the |
they are. |
.Qq Prereq: |
.TP 5 |
line in the patch; |
.B \-F<number> or \-\-fuzz <number> |
and assume that patches are reversed if they look like they are. |
sets the maximum fuzz factor. |
.It Xo |
|
.Fl F Ns Aq Ar number , |
|
.Fl Fl fuzz Aq Ar number |
|
.Xc |
|
Sets the maximum fuzz factor. |
This switch only applies to context diffs, and causes |
This switch only applies to context diffs, and causes |
.I patch |
.Nm |
to ignore up to that many lines in looking for places to install a hunk. |
to ignore up to that many lines in looking for places to install a hunk. |
Note that a larger fuzz factor increases the odds of a faulty patch. |
Note that a larger fuzz factor increases the odds of a faulty patch. |
The default fuzz factor is 2, and it may not be set to more than |
The default fuzz factor is 2, and it may not be set to more than |
the number of lines of context in the context diff, ordinarily 3. |
the number of lines of context in the context diff, ordinarily 3. |
.TP 5 |
.It Fl l , Fl Fl ignore-whitespace |
.B \-l or \-\-ignore-whitespace |
Causes the pattern matching to be done loosely, in case the tabs and |
causes the pattern matching to be done loosely, in case the tabs and |
|
spaces have been munged in your input file. |
spaces have been munged in your input file. |
Any sequence of whitespace in the pattern line will match any sequence |
Any sequence of whitespace in the pattern line will match any sequence |
in the input file. |
in the input file. |
Normal characters must still match exactly. |
Normal characters must still match exactly. |
Each line of the context must still match a line in the input file. |
Each line of the context must still match a line in the input file. |
.TP 5 |
.It Fl n , Fl Fl normal |
.B \-n or \-\-normal |
Forces |
forces |
.Nm |
.I patch |
|
to interpret the patch file as a normal diff. |
to interpret the patch file as a normal diff. |
.TP 5 |
.It Fl N , Fl Fl forward |
.B \-N or \-\-forward |
Causes |
causes |
.Nm |
.I patch |
|
to ignore patches that it thinks are reversed or already applied. |
to ignore patches that it thinks are reversed or already applied. |
See also |
See also |
.B \-R . |
.Fl R . |
.TP 5 |
.It Fl o , Fl Fl output |
.B \-o or \-\-output |
Causes the next argument to be interpreted as the output file name. |
causes the next argument to be interpreted as the output file name. |
.It Xo |
.TP 5 |
.Fl p Ns Aq Ar number , |
.B \-p<number> or \-\-strip <number> |
.Fl Fl strip Aq Ar number |
sets the pathname strip count, |
.Xc |
which controls how pathnames found in the patch file are treated, in case |
Sets the pathname strip count, |
you keep your files in a different directory than the person who sent |
which controls how pathnames found in the patch file are treated, |
|
in case you keep your files in a different directory than the person who sent |
out the patch. |
out the patch. |
The strip count specifies how many slashes are to be stripped from |
The strip count specifies how many slashes are to be stripped from |
the front of the pathname. |
the front of the pathname. |
(Any intervening directory names also go away.) |
(Any intervening directory names also go away.) |
For example, supposing the filename in the patch file was |
For example, supposing the filename in the patch file was |
.sp |
.Pa /u/howard/src/blurfl/blurfl.c : |
/u/howard/src/blurfl/blurfl.c |
.Pp |
.sp |
Setting |
setting |
.Fl p |
.B \-p |
|
or |
or |
.B \-p0 |
.Fl p Ns Ar 0 |
gives the entire pathname unmodified, |
gives the entire pathname unmodified. |
.B \-p1 |
.Pp |
|
.Fl p Ns Ar 1 |
gives |
gives |
.sp |
.Pp |
u/howard/src/blurfl/blurfl.c |
.D1 Pa u/howard/src/blurfl/blurfl.c |
.sp |
.Pp |
without the leading slash, |
without the leading slash. |
.B \-p4 |
.Pp |
|
.Fl p Ns Ar 4 |
gives |
gives |
.sp |
.Pp |
blurfl/blurfl.c |
.D1 Pa blurfl/blurfl.c |
.sp |
.Pp |
and not specifying |
Not specifying |
.B \-p |
.Fl p |
at all just gives you "blurfl.c", unless all of the directories in the |
at all just gives you |
leading path (u/howard/src/blurfl) exist and that path is relative, |
.Pa blurfl.c , |
|
unless all of the directories in the leading path |
|
.Pq Pa u/howard/src/blurfl |
|
exist and that path is relative, |
in which case you get the entire pathname unmodified. |
in which case you get the entire pathname unmodified. |
Whatever you end up with is looked for either in the current directory, |
Whatever you end up with is looked for either in the current directory, |
or the directory specified by the |
or the directory specified by the |
.B \-d |
.Fl d |
switch. |
switch. |
.TP 5 |
.It Fl r , Fl Fl reject-file |
.B \-r or \-\-reject-file |
Causes the next argument to be interpreted as the reject file name. |
causes the next argument to be interpreted as the reject file name. |
.It Fl R , Fl Fl reverse |
.TP 5 |
Tells |
.B \-R or \-\-reverse |
.Nm |
tells |
|
.I patch |
|
that this patch was created with the old and new files swapped. |
that this patch was created with the old and new files swapped. |
(Yes, I'm afraid that does happen occasionally, human nature being what it |
(Yes, I'm afraid that does happen occasionally, human nature being what it |
is.) |
is.) |
.I Patch |
.Nm |
will attempt to swap each hunk around before applying it. |
will attempt to swap each hunk around before applying it. |
Rejects will come out in the swapped format. |
Rejects will come out in the swapped format. |
The |
The |
.B \-R |
.Fl R |
switch will not work with ed diff scripts because there is too little |
switch will not work with ed diff scripts because there is too little |
information to reconstruct the reverse operation. |
information to reconstruct the reverse operation. |
.Sp |
.Pp |
If the first hunk of a patch fails, |
If the first hunk of a patch fails, |
.I patch |
.Nm |
will reverse the hunk to see if it can be applied that way. |
will reverse the hunk to see if it can be applied that way. |
If it can, you will be asked if you want to have the |
If it can, you will be asked if you want to have the |
.B \-R |
.Fl R |
switch set. |
switch set. |
If it can't, the patch will continue to be applied normally. |
If it can't, the patch will continue to be applied normally. |
(Note: this method cannot detect a reversed patch if it is a normal diff |
(Note: this method cannot detect a reversed patch if it is a normal diff |
|
|
Luckily, most patches add or change lines rather than delete them, so most |
Luckily, most patches add or change lines rather than delete them, so most |
reversed normal diffs will begin with a delete, which will fail, triggering |
reversed normal diffs will begin with a delete, which will fail, triggering |
the heuristic.) |
the heuristic.) |
.TP 5 |
.It Xo |
.B \-s or \-\-quiet or \-\-silent |
.Fl s , Fl Fl quiet , |
makes |
.Fl Fl silent |
.I patch |
.Xc |
|
Makes |
|
.Nm |
do its work silently, unless an error occurs. |
do its work silently, unless an error occurs. |
.TP 5 |
.It Fl u , Fl Fl unified |
.B \-u or \-\-unified |
Forces |
forces |
.Nm |
.I patch |
|
to interpret the patch file as a unified context diff (a unidiff). |
to interpret the patch file as a unified context diff (a unidiff). |
.TP 5 |
.It Fl v , Fl Fl version |
.B \-v or \-\-version |
Causes |
causes |
.Nm |
.I patch |
|
to print out its revision header and patch level. |
to print out its revision header and patch level. |
.TP 5 |
.It Fl V , Fl Fl version-control |
.B \-V or \-\-version-control |
Causes the next argument to be interpreted as a method for creating |
causes the next argument to be interpreted as a method for creating |
backup file names. |
backup file names. The type of backups made can also be given in the |
The type of backups made can also be given in the |
.B VERSION_CONTROL |
.Ev VERSION_CONTROL |
environment variable, which is overridden by this option. |
environment variable, which is overridden by this option. |
The |
The |
.B -B |
.Fl B |
option overrides this option, causing the prefix to always be used for |
option overrides this option, causing the prefix to always be used for |
making backup file names. |
making backup file names. |
The value of the |
The value of the |
.B VERSION_CONTROL |
.Ev VERSION_CONTROL |
environment variable and the argument to the |
environment variable and the argument to the |
.B -V |
.Fl V |
option are like the GNU |
option are like the GNU Emacs |
Emacs `version-control' variable; they also recognize synonyms that |
.Dq version-control |
are more descriptive. The valid values are (unique abbreviations are |
variable; they also recognize synonyms that are more descriptive. |
accepted): |
The valid values are (unique abbreviations are accepted): |
.RS |
.Bl -tag -width Ds -offset indent |
.TP |
.It t , numbered |
`t' or `numbered' |
|
Always make numbered backups. |
Always make numbered backups. |
.TP |
.It nil , existing |
`nil' or `existing' |
Make numbered backups of files that already have them, |
Make numbered backups of files that already |
simple backups of the others. |
have them, simple backups of the others. |
|
This is the default. |
This is the default. |
.TP |
.It never , simple |
`never' or `simple' |
|
Always make simple backups. |
Always make simple backups. |
.RE |
.El |
.TP 5 |
.It Xo |
.B \-x<number> or \-\-debug <number> |
.Fl x Ns Aq Ar number , |
sets internal debugging flags, and is of interest only to |
.Fl Fl debug Aq Ar number |
.I patch |
.Xc |
|
Sets internal debugging flags, and is of interest only to |
|
.Nm |
patchers. |
patchers. |
.SH AUTHOR |
.El |
Larry Wall <lwall@netlabs.com> |
.Sh NOTES FOR PATCH SENDERS |
.br |
|
with many other contributors. |
|
.SH ENVIRONMENT |
|
.TP |
|
.B TMPDIR |
|
Directory to put temporary files in; default is /tmp. |
|
.TP |
|
.B SIMPLE_BACKUP_SUFFIX |
|
Extension to use for backup file names instead of \*(L".orig\*(R" or |
|
\*(L"~\*(R". |
|
.TP |
|
.B VERSION_CONTROL |
|
Selects when numbered backup files are made. |
|
.SH FILES |
|
$TMPDIR/patch* |
|
.SH SEE ALSO |
|
diff(1) |
|
.SH NOTES FOR PATCH SENDERS |
|
There are several things you should bear in mind if you are going to |
There are several things you should bear in mind if you are going to |
be sending out patches. |
be sending out patches: |
First, you can save people a lot of grief by keeping a patchlevel.h file |
.Pp |
which is patched to increment the patch level as the first diff in the |
First, you can save people a lot of grief by keeping a |
|
.Pa patchlevel.h |
|
file which is patched to increment the patch level as the first diff in the |
patch file you send out. |
patch file you send out. |
If you put a Prereq: line in with the patch, it won't let them apply |
If you put a |
|
.Qq Prereq: |
|
line in with the patch, it won't let them apply |
patches out of order without some warning. |
patches out of order without some warning. |
|
.Pp |
Second, make sure you've specified the filenames right, either in a |
Second, make sure you've specified the filenames right, either in a |
context diff header, or with an Index: line. |
context diff header, or with an |
|
.Qq Index: |
|
line. |
If you are patching something in a subdirectory, be sure to tell the patch |
If you are patching something in a subdirectory, be sure to tell the patch |
user to specify a |
user to specify a |
.B \-p |
.Fl p |
switch as needed. |
switch as needed. |
|
.Pp |
Third, you can create a file by sending out a diff that compares a |
Third, you can create a file by sending out a diff that compares a |
null file to the file you want to create. |
null file to the file you want to create. |
This will only work if the file you want to create doesn't exist already in |
This will only work if the file you want to create doesn't exist already in |
the target directory. |
the target directory. |
|
.Pp |
Fourth, take care not to send out reversed patches, since it makes people wonder |
Fourth, take care not to send out reversed patches, since it makes people wonder |
whether they already applied the patch. |
whether they already applied the patch. |
|
.Pp |
Fifth, while you may be able to get away with putting 582 diff listings into |
Fifth, while you may be able to get away with putting 582 diff listings into |
one file, it is probably wiser to group related patches into separate files in |
one file, it is probably wiser to group related patches into separate files in |
case something goes haywire. |
case something goes haywire. |
.SH DIAGNOSTICS |
.Sh ENVIRONMENT |
|
.Bl -tag -width "SIMPLE_BACKUP_SUFFIX" -compact |
|
.It Ev TMPDIR |
|
Directory to put temporary files in; default is |
|
.Pa /tmp . |
|
.It Ev SIMPLE_BACKUP_SUFFIX |
|
Extension to use for backup file names instead of |
|
.Qq .orig |
|
or |
|
.Qq ~ . |
|
.It Ev VERSION_CONTROL |
|
Selects when numbered backup files are made. |
|
.El |
|
.Sh FILES |
|
.Bl -tag -width Ds |
|
.It Pa $TMPDIR/patch* |
|
.El |
|
.Sh DIAGNOSTICS |
Too many to list here, but generally indicative that |
Too many to list here, but generally indicative that |
.I patch |
.Nm |
couldn't parse your patch file. |
couldn't parse your patch file. |
.PP |
.Pp |
The message \*(L"Hmm...\*(R" indicates that there is unprocessed text in |
The message |
the patch file and that |
.Qq Hmm... |
.I patch |
indicates that there is unprocessed text in the patch file and that |
|
.Nm |
is attempting to intuit whether there is a patch in that text and, if so, |
is attempting to intuit whether there is a patch in that text and, if so, |
what kind of patch it is. |
what kind of patch it is. |
.PP |
.Pp |
.I Patch |
.Nm |
will exit with a non-zero status if any reject files were created. |
will exit with a non-zero status if any reject files were created. |
When applying a set of patches in a loop it behooves you to check this |
When applying a set of patches in a loop it behooves you to check this |
exit status so you don't apply a later patch to a partially patched file. |
exit status so you don't apply a later patch to a partially patched file. |
.SH CAVEATS |
.Sh SEE ALSO |
.I Patch |
.Xr diff 1 |
|
.Sh AUTHORS |
|
.An Larry Wall Aq lwall@netlabs.com |
|
with many other contributors. |
|
.Sh CAVEATS |
|
.Nm |
cannot tell if the line numbers are off in an ed script, and can only detect |
cannot tell if the line numbers are off in an ed script, and can only detect |
bad line numbers in a normal diff when it finds a \*(L"change\*(R" or |
bad line numbers in a normal diff when it finds a |
a \*(L"delete\*(R" command. |
.Qq change |
|
or a |
|
.Qq delete |
|
command. |
A context diff using fuzz factor 3 may have the same problem. |
A context diff using fuzz factor 3 may have the same problem. |
Until a suitable interactive interface is added, you should probably do |
Until a suitable interactive interface is added, you should probably do |
a context diff in these cases to see if the changes made sense. |
a context diff in these cases to see if the changes made sense. |
Of course, compiling without errors is a pretty good indication that the patch |
Of course, compiling without errors is a pretty good indication that the patch |
worked, but not always. |
worked, but not always. |
.PP |
.Pp |
.I Patch |
.Nm |
usually produces the correct results, even when it has to do a lot of |
usually produces the correct results, even when it has to do a lot of |
guessing. |
guessing. |
However, the results are guaranteed to be correct only when the patch is |
However, the results are guaranteed to be correct only when the patch is |
applied to exactly the same version of the file that the patch was |
applied to exactly the same version of the file that the patch was |
generated from. |
generated from. |
.SH BUGS |
.Sh BUGS |
Could be smarter about partial matches, excessively \&deviant offsets and |
Could be smarter about partial matches, excessively deviant offsets and |
swapped code, but that would take an extra pass. |
swapped code, but that would take an extra pass. |
.PP |
.Pp |
Check patch mode ( |
Check patch mode |
.BR -C ) |
.Pq Fl C |
will fail if you try to check several patches in succession that build on |
will fail if you try to check several patches in succession that build on |
each other. The whole code of |
each other. |
.I patch |
The whole code of |
|
.Nm |
would have to be restructured to keep temporary files around so that it can |
would have to be restructured to keep temporary files around so that it can |
handle this situation. |
handle this situation. |
.PP |
.Pp |
If code has been duplicated (for instance with #ifdef OLDCODE ... #else ... |
If code has been duplicated (for instance with #ifdef OLDCODE ... #else ... |
#endif), |
#endif), |
.I patch |
.Nm |
is incapable of patching both versions, and, if it works at all, will likely |
is incapable of patching both versions, and, if it works at all, will likely |
patch the wrong one, and tell you that it succeeded to boot. |
patch the wrong one, and tell you that it succeeded to boot. |
.PP |
.Pp |
If you apply a patch you've already applied, |
If you apply a patch you've already applied, |
.I patch |
.Nm |
will think it is a reversed patch, and offer to un-apply the patch. |
will think it is a reversed patch, and offer to un-apply the patch. |
This could be construed as a feature. |
This could be construed as a feature. |
.rn }` '' |
|