xref: /dflybsd-src/usr.bin/patch/patch.1 (revision b94b84ca5c08efb447331811e050106ac4c7d3f1)
15027f2b8SJohn Marino.\"-
248d201a5SJoerg Sonnenberger.\" Copyright 1986, Larry Wall
348d201a5SJoerg Sonnenberger.\"
448d201a5SJoerg Sonnenberger.\" Redistribution and use in source and binary forms, with or without
548d201a5SJoerg Sonnenberger.\" modification, are permitted provided that the following condition
648d201a5SJoerg Sonnenberger.\" is met:
748d201a5SJoerg Sonnenberger.\"  1. Redistributions of source code must retain the above copyright
848d201a5SJoerg Sonnenberger.\"     notice, this condition and the following disclaimer.
948d201a5SJoerg Sonnenberger.\"
1048d201a5SJoerg Sonnenberger.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1148d201a5SJoerg Sonnenberger.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1248d201a5SJoerg Sonnenberger.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1348d201a5SJoerg Sonnenberger.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1448d201a5SJoerg Sonnenberger.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1548d201a5SJoerg Sonnenberger.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1648d201a5SJoerg Sonnenberger.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
1748d201a5SJoerg Sonnenberger.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
1848d201a5SJoerg Sonnenberger.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
1948d201a5SJoerg Sonnenberger.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2048d201a5SJoerg Sonnenberger.\" SUCH DAMAGE.
2148d201a5SJoerg Sonnenberger.\"
22*b94b84caSDaniel Fojt.\" $OpenBSD: patch.1,v 1.27 2014/04/15 06:26:54 jmc Exp $
23*b94b84caSDaniel Fojt.\" $FreeBSD: head/usr.bin/patch/patch.1 354328 2019-11-04 03:07:01Z kevans $
24*b94b84caSDaniel Fojt.Dd May 26, 2020
2548d201a5SJoerg Sonnenberger.Dt PATCH 1
2648d201a5SJoerg Sonnenberger.Os
2748d201a5SJoerg Sonnenberger.Sh NAME
2848d201a5SJoerg Sonnenberger.Nm patch
2948d201a5SJoerg Sonnenberger.Nd apply a diff file to an original
3048d201a5SJoerg Sonnenberger.Sh SYNOPSIS
319b5a9965SSascha Wildner.Nm
329d62a0f9SSascha Wildner.Bk -words
339d62a0f9SSascha Wildner.Op Fl bCcEeflNnRstuv
349d62a0f9SSascha Wildner.Op Fl B Ar backup-prefix
359d62a0f9SSascha Wildner.Op Fl D Ar symbol
369d62a0f9SSascha Wildner.Op Fl d Ar directory
379d62a0f9SSascha Wildner.Op Fl F Ar max-fuzz
389d62a0f9SSascha Wildner.Op Fl i Ar patchfile
399d62a0f9SSascha Wildner.Op Fl o Ar out-file
409d62a0f9SSascha Wildner.Op Fl p Ar strip-count
419d62a0f9SSascha Wildner.Op Fl r Ar rej-name
42*b94b84caSDaniel Fojt.Op Fl V Cm t | nil | never | none
439d62a0f9SSascha Wildner.Op Fl x Ar number
449d62a0f9SSascha Wildner.Op Fl z Ar backup-ext
459d62a0f9SSascha Wildner.Op Fl Fl posix
4648d201a5SJoerg Sonnenberger.Op Ar origfile Op Ar patchfile
479d62a0f9SSascha Wildner.Ek
489b5a9965SSascha Wildner.Nm
4948d201a5SJoerg Sonnenberger.Pf \*(Lt Ar patchfile
5048d201a5SJoerg Sonnenberger.Sh DESCRIPTION
5148d201a5SJoerg Sonnenberger.Nm
5248d201a5SJoerg Sonnenbergerwill take a patch file containing any of the four forms of difference
5348d201a5SJoerg Sonnenbergerlisting produced by the
5448d201a5SJoerg Sonnenberger.Xr diff 1
5548d201a5SJoerg Sonnenbergerprogram and apply those differences to an original file,
5648d201a5SJoerg Sonnenbergerproducing a patched version.
5748d201a5SJoerg SonnenbergerIf
5848d201a5SJoerg Sonnenberger.Ar patchfile
5948d201a5SJoerg Sonnenbergeris omitted, or is a hyphen, the patch will be read from the standard input.
6048d201a5SJoerg Sonnenberger.Pp
6148d201a5SJoerg Sonnenberger.Nm
625027f2b8SJohn Marinowill attempt to determine the type of the diff listing, unless overruled by a
6348d201a5SJoerg Sonnenberger.Fl c ,
6448d201a5SJoerg Sonnenberger.Fl e ,
6548d201a5SJoerg Sonnenberger.Fl n ,
6648d201a5SJoerg Sonnenbergeror
6748d201a5SJoerg Sonnenberger.Fl u
6848d201a5SJoerg Sonnenbergeroption.
6948d201a5SJoerg SonnenbergerContext diffs (old-style, new-style, and unified) and
7048d201a5SJoerg Sonnenbergernormal diffs are applied directly by the
7148d201a5SJoerg Sonnenberger.Nm
7248d201a5SJoerg Sonnenbergerprogram itself, whereas ed diffs are simply fed to the
7348d201a5SJoerg Sonnenberger.Xr ed 1
7448d201a5SJoerg Sonnenbergereditor via a pipe.
7548d201a5SJoerg Sonnenberger.Pp
7648d201a5SJoerg SonnenbergerIf the
7748d201a5SJoerg Sonnenberger.Ar patchfile
7848d201a5SJoerg Sonnenbergercontains more than one patch,
7948d201a5SJoerg Sonnenberger.Nm
8048d201a5SJoerg Sonnenbergerwill try to apply each of them as if they came from separate patch files.
8148d201a5SJoerg SonnenbergerThis means, among other things, that it is assumed that the name of the file
8248d201a5SJoerg Sonnenbergerto patch must be determined for each diff listing, and that the garbage before
8348d201a5SJoerg Sonnenbergereach diff listing will be examined for interesting things such as file names
8448d201a5SJoerg Sonnenbergerand revision level (see the section on
8548d201a5SJoerg Sonnenberger.Sx Filename Determination
8648d201a5SJoerg Sonnenbergerbelow).
8748d201a5SJoerg Sonnenberger.Pp
8848d201a5SJoerg SonnenbergerThe options are as follows:
8948d201a5SJoerg Sonnenberger.Bl -tag -width Ds
909d62a0f9SSascha Wildner.It Xo
919d62a0f9SSascha Wildner.Fl B Ar backup-prefix ,
929d62a0f9SSascha Wildner.Fl Fl prefix Ar backup-prefix
939d62a0f9SSascha Wildner.Xc
949d62a0f9SSascha WildnerCauses the next argument to be interpreted as a prefix to the backup file
959d62a0f9SSascha Wildnername.
969d62a0f9SSascha WildnerIf this argument is specified, any argument to
979d62a0f9SSascha Wildner.Fl z
989d62a0f9SSascha Wildnerwill be ignored.
9988147647SSascha Wildner.It Fl b , Fl Fl backup
10048d201a5SJoerg SonnenbergerSave a backup copy of the file before it is modified.
10148d201a5SJoerg SonnenbergerBy default the original file is saved with a backup extension of
10248d201a5SJoerg Sonnenberger.Qq .orig
10348d201a5SJoerg Sonnenbergerunless the file already has a numbered backup, in which case a numbered
10448d201a5SJoerg Sonnenbergerbackup is made.
10548d201a5SJoerg SonnenbergerThis is equivalent to specifying
1069d62a0f9SSascha Wildner.Qo Fl V Cm existing Qc .
10799d56977SJoerg SonnenbergerThis option is currently the default, unless
10899d56977SJoerg Sonnenberger.Fl -posix
10999d56977SJoerg Sonnenbergeris specified.
110c4be1ed5SRobin Hahling.It Fl C , Fl Fl check , Fl Fl dry-run
1119d62a0f9SSascha WildnerChecks that the patch would apply cleanly, but does not modify anything.
11248d201a5SJoerg Sonnenberger.It Fl c , Fl Fl context
11348d201a5SJoerg SonnenbergerForces
11448d201a5SJoerg Sonnenberger.Nm
11548d201a5SJoerg Sonnenbergerto interpret the patch file as a context diff.
1169d62a0f9SSascha Wildner.It Xo
1179d62a0f9SSascha Wildner.Fl D Ar symbol ,
1189d62a0f9SSascha Wildner.Fl Fl ifdef Ar symbol
1199d62a0f9SSascha Wildner.Xc
12048d201a5SJoerg SonnenbergerCauses
12148d201a5SJoerg Sonnenberger.Nm
12248d201a5SJoerg Sonnenbergerto use the
12348d201a5SJoerg Sonnenberger.Qq #ifdef...#endif
12448d201a5SJoerg Sonnenbergerconstruct to mark changes.
12548d201a5SJoerg SonnenbergerThe argument following will be used as the differentiating symbol.
12648d201a5SJoerg SonnenbergerNote that, unlike the C compiler, there must be a space between the
12748d201a5SJoerg Sonnenberger.Fl D
12848d201a5SJoerg Sonnenbergerand the argument.
1299d62a0f9SSascha Wildner.It Xo
1309d62a0f9SSascha Wildner.Fl d Ar directory ,
1319d62a0f9SSascha Wildner.Fl Fl directory Ar directory
1329d62a0f9SSascha Wildner.Xc
1339d62a0f9SSascha WildnerCauses
1349d62a0f9SSascha Wildner.Nm
13599d56977SJoerg Sonnenbergerto interpret the next argument as a directory,
13699d56977SJoerg Sonnenbergerand change the working directory to it before doing anything else.
1379d62a0f9SSascha Wildner.It Fl E , Fl Fl remove-empty-files
1389d62a0f9SSascha WildnerCauses
1399d62a0f9SSascha Wildner.Nm
1409d62a0f9SSascha Wildnerto remove output files that are empty after the patches have been applied.
1419d62a0f9SSascha WildnerThis option is useful when applying patches that create or remove files.
14248d201a5SJoerg Sonnenberger.It Fl e , Fl Fl ed
14348d201a5SJoerg SonnenbergerForces
14448d201a5SJoerg Sonnenberger.Nm
14548d201a5SJoerg Sonnenbergerto interpret the patch file as an
14648d201a5SJoerg Sonnenberger.Xr ed 1
14748d201a5SJoerg Sonnenbergerscript.
1489d62a0f9SSascha Wildner.It Xo
1499d62a0f9SSascha Wildner.Fl F Ar max-fuzz ,
1509d62a0f9SSascha Wildner.Fl Fl fuzz Ar max-fuzz
1519d62a0f9SSascha Wildner.Xc
1529d62a0f9SSascha WildnerSets the maximum fuzz factor.
1539d62a0f9SSascha WildnerThis option only applies to context diffs, and causes
15448d201a5SJoerg Sonnenberger.Nm
1559d62a0f9SSascha Wildnerto ignore up to that many lines in looking for places to install a hunk.
1569d62a0f9SSascha WildnerNote that a larger fuzz factor increases the odds of a faulty patch.
1579d62a0f9SSascha WildnerThe default fuzz factor is 2, and it may not be set to more than
1589d62a0f9SSascha Wildnerthe number of lines of context in the context diff, ordinarily 3.
15948d201a5SJoerg Sonnenberger.It Fl f , Fl Fl force
16048d201a5SJoerg SonnenbergerForces
16148d201a5SJoerg Sonnenberger.Nm
16248d201a5SJoerg Sonnenbergerto assume that the user knows exactly what he or she is doing, and to not
16348d201a5SJoerg Sonnenbergerask any questions.
16448d201a5SJoerg SonnenbergerIt assumes the following:
1655027f2b8SJohn Marinoskip patches for which a file to patch cannot be found;
16648d201a5SJoerg Sonnenbergerpatch files even though they have the wrong version for the
16748d201a5SJoerg Sonnenberger.Qq Prereq:
16848d201a5SJoerg Sonnenbergerline in the patch;
16948d201a5SJoerg Sonnenbergerand assume that patches are not reversed even if they look like they are.
17048d201a5SJoerg SonnenbergerThis option does not suppress commentary; use
17148d201a5SJoerg Sonnenberger.Fl s
17248d201a5SJoerg Sonnenbergerfor that.
17348d201a5SJoerg Sonnenberger.It Xo
1749d62a0f9SSascha Wildner.Fl i Ar patchfile ,
1759d62a0f9SSascha Wildner.Fl Fl input Ar patchfile
17648d201a5SJoerg Sonnenberger.Xc
17748d201a5SJoerg SonnenbergerCauses the next argument to be interpreted as the input file name
17848d201a5SJoerg Sonnenberger(i.e. a patchfile).
17948d201a5SJoerg SonnenbergerThis option may be specified multiple times.
18048d201a5SJoerg Sonnenberger.It Fl l , Fl Fl ignore-whitespace
18148d201a5SJoerg SonnenbergerCauses the pattern matching to be done loosely, in case the tabs and
18248d201a5SJoerg Sonnenbergerspaces have been munged in your input file.
18348d201a5SJoerg SonnenbergerAny sequence of whitespace in the pattern line will match any sequence
18448d201a5SJoerg Sonnenbergerin the input file.
18548d201a5SJoerg SonnenbergerNormal characters must still match exactly.
18648d201a5SJoerg SonnenbergerEach line of the context must still match a line in the input file.
18748d201a5SJoerg Sonnenberger.It Fl N , Fl Fl forward
18848d201a5SJoerg SonnenbergerCauses
18948d201a5SJoerg Sonnenberger.Nm
19048d201a5SJoerg Sonnenbergerto ignore patches that it thinks are reversed or already applied.
19148d201a5SJoerg SonnenbergerSee also
19248d201a5SJoerg Sonnenberger.Fl R .
1939d62a0f9SSascha Wildner.It Fl n , Fl Fl normal
1949d62a0f9SSascha WildnerForces
1959d62a0f9SSascha Wildner.Nm
1969d62a0f9SSascha Wildnerto interpret the patch file as a normal diff.
1979d62a0f9SSascha Wildner.It Xo
1989d62a0f9SSascha Wildner.Fl o Ar out-file ,
1999d62a0f9SSascha Wildner.Fl Fl output Ar out-file
2009d62a0f9SSascha Wildner.Xc
20148d201a5SJoerg SonnenbergerCauses the next argument to be interpreted as the output file name.
20248d201a5SJoerg Sonnenberger.It Xo
2039d62a0f9SSascha Wildner.Fl p Ar strip-count ,
2049d62a0f9SSascha Wildner.Fl Fl strip Ar strip-count
20548d201a5SJoerg Sonnenberger.Xc
20648d201a5SJoerg SonnenbergerSets the pathname strip count,
20748d201a5SJoerg Sonnenbergerwhich controls how pathnames found in the patch file are treated,
20848d201a5SJoerg Sonnenbergerin case you keep your files in a different directory than the person who sent
20948d201a5SJoerg Sonnenbergerout the patch.
21048d201a5SJoerg SonnenbergerThe strip count specifies how many slashes are to be stripped from
21148d201a5SJoerg Sonnenbergerthe front of the pathname.
21248d201a5SJoerg Sonnenberger(Any intervening directory names also go away.)
21348d201a5SJoerg SonnenbergerFor example, supposing the file name in the patch file was
21448d201a5SJoerg Sonnenberger.Pa /u/howard/src/blurfl/blurfl.c :
21548d201a5SJoerg Sonnenberger.Pp
21648d201a5SJoerg SonnenbergerSetting
21748d201a5SJoerg Sonnenberger.Fl p Ns Ar 0
21848d201a5SJoerg Sonnenbergergives the entire pathname unmodified.
21948d201a5SJoerg Sonnenberger.Pp
22048d201a5SJoerg Sonnenberger.Fl p Ns Ar 1
22148d201a5SJoerg Sonnenbergergives
22248d201a5SJoerg Sonnenberger.Pp
22348d201a5SJoerg Sonnenberger.D1 Pa u/howard/src/blurfl/blurfl.c
22448d201a5SJoerg Sonnenberger.Pp
22548d201a5SJoerg Sonnenbergerwithout the leading slash.
22648d201a5SJoerg Sonnenberger.Pp
22748d201a5SJoerg Sonnenberger.Fl p Ns Ar 4
22848d201a5SJoerg Sonnenbergergives
22948d201a5SJoerg Sonnenberger.Pp
23048d201a5SJoerg Sonnenberger.D1 Pa blurfl/blurfl.c
23148d201a5SJoerg Sonnenberger.Pp
23248d201a5SJoerg SonnenbergerNot specifying
23348d201a5SJoerg Sonnenberger.Fl p
23448d201a5SJoerg Sonnenbergerat all just gives you
23548d201a5SJoerg Sonnenberger.Pa blurfl.c ,
23648d201a5SJoerg Sonnenbergerunless all of the directories in the leading path
23748d201a5SJoerg Sonnenberger.Pq Pa u/howard/src/blurfl
23848d201a5SJoerg Sonnenbergerexist and that path is relative,
23948d201a5SJoerg Sonnenbergerin which case you get the entire pathname unmodified.
24048d201a5SJoerg SonnenbergerWhatever you end up with is looked for either in the current directory,
24148d201a5SJoerg Sonnenbergeror the directory specified by the
24248d201a5SJoerg Sonnenberger.Fl d
24348d201a5SJoerg Sonnenbergeroption.
24448d201a5SJoerg Sonnenberger.It Fl R , Fl Fl reverse
24548d201a5SJoerg SonnenbergerTells
24648d201a5SJoerg Sonnenberger.Nm
24748d201a5SJoerg Sonnenbergerthat this patch was created with the old and new files swapped.
24848d201a5SJoerg Sonnenberger(Yes, I'm afraid that does happen occasionally, human nature being what it
24948d201a5SJoerg Sonnenbergeris.)
25048d201a5SJoerg Sonnenberger.Nm
25148d201a5SJoerg Sonnenbergerwill attempt to swap each hunk around before applying it.
25248d201a5SJoerg SonnenbergerRejects will come out in the swapped format.
25348d201a5SJoerg SonnenbergerThe
25448d201a5SJoerg Sonnenberger.Fl R
25548d201a5SJoerg Sonnenbergeroption will not work with ed diff scripts because there is too little
25648d201a5SJoerg Sonnenbergerinformation to reconstruct the reverse operation.
25748d201a5SJoerg Sonnenberger.Pp
25848d201a5SJoerg SonnenbergerIf the first hunk of a patch fails,
25948d201a5SJoerg Sonnenberger.Nm
26048d201a5SJoerg Sonnenbergerwill reverse the hunk to see if it can be applied that way.
26148d201a5SJoerg SonnenbergerIf it can, you will be asked if you want to have the
26248d201a5SJoerg Sonnenberger.Fl R
26348d201a5SJoerg Sonnenbergeroption set.
2645027f2b8SJohn MarinoIf it cannot, the patch will continue to be applied normally.
26548d201a5SJoerg Sonnenberger(Note: this method cannot detect a reversed patch if it is a normal diff
26648d201a5SJoerg Sonnenbergerand if the first command is an append (i.e. it should have been a delete)
26748d201a5SJoerg Sonnenbergersince appends always succeed, due to the fact that a null context will match
26848d201a5SJoerg Sonnenbergeranywhere.
26948d201a5SJoerg SonnenbergerLuckily, most patches add or change lines rather than delete them, so most
27048d201a5SJoerg Sonnenbergerreversed normal diffs will begin with a delete, which will fail, triggering
27148d201a5SJoerg Sonnenbergerthe heuristic.)
27248d201a5SJoerg Sonnenberger.It Xo
2739d62a0f9SSascha Wildner.Fl r Ar rej-name ,
2749d62a0f9SSascha Wildner.Fl Fl reject-file Ar rej-name
2759d62a0f9SSascha Wildner.Xc
2769d62a0f9SSascha WildnerCauses the next argument to be interpreted as the reject file name.
2779d62a0f9SSascha Wildner.It Xo
27848d201a5SJoerg Sonnenberger.Fl s , Fl Fl quiet ,
27948d201a5SJoerg Sonnenberger.Fl Fl silent
28048d201a5SJoerg Sonnenberger.Xc
28148d201a5SJoerg SonnenbergerMakes
28248d201a5SJoerg Sonnenberger.Nm
28348d201a5SJoerg Sonnenbergerdo its work silently, unless an error occurs.
28448d201a5SJoerg Sonnenberger.It Fl t , Fl Fl batch
28548d201a5SJoerg SonnenbergerSimilar to
28648d201a5SJoerg Sonnenberger.Fl f ,
28748d201a5SJoerg Sonnenbergerin that it suppresses questions, but makes some different assumptions:
2885027f2b8SJohn Marinoskip patches for which a file to patch cannot be found (the same as
28948d201a5SJoerg Sonnenberger.Fl f ) ;
29048d201a5SJoerg Sonnenbergerskip patches for which the file has the wrong version for the
29148d201a5SJoerg Sonnenberger.Qq Prereq:
29248d201a5SJoerg Sonnenbergerline in the patch;
29348d201a5SJoerg Sonnenbergerand assume that patches are reversed if they look like they are.
29448d201a5SJoerg Sonnenberger.It Fl u , Fl Fl unified
29548d201a5SJoerg SonnenbergerForces
29648d201a5SJoerg Sonnenberger.Nm
29748d201a5SJoerg Sonnenbergerto interpret the patch file as a unified context diff (a unidiff).
2989d62a0f9SSascha Wildner.It Xo
299*b94b84caSDaniel Fojt.Fl V Cm t | nil | never | none ,
300*b94b84caSDaniel Fojt.Fl Fl version-control Cm t | nil | never | none
3019d62a0f9SSascha Wildner.Xc
30248d201a5SJoerg SonnenbergerCauses the next argument to be interpreted as a method for creating
30348d201a5SJoerg Sonnenbergerbackup file names.
30448d201a5SJoerg SonnenbergerThe type of backups made can also be given in the
30548d201a5SJoerg Sonnenberger.Ev PATCH_VERSION_CONTROL
30648d201a5SJoerg Sonnenbergeror
30748d201a5SJoerg Sonnenberger.Ev VERSION_CONTROL
30848d201a5SJoerg Sonnenbergerenvironment variables, which are overridden by this option.
30948d201a5SJoerg SonnenbergerThe
31048d201a5SJoerg Sonnenberger.Fl B
31148d201a5SJoerg Sonnenbergeroption overrides this option, causing the prefix to always be used for
31248d201a5SJoerg Sonnenbergermaking backup file names.
31348d201a5SJoerg SonnenbergerThe values of the
31448d201a5SJoerg Sonnenberger.Ev PATCH_VERSION_CONTROL
31548d201a5SJoerg Sonnenbergerand
31648d201a5SJoerg Sonnenberger.Ev VERSION_CONTROL
31748d201a5SJoerg Sonnenbergerenvironment variables and the argument to the
31848d201a5SJoerg Sonnenberger.Fl V
31948d201a5SJoerg Sonnenbergeroption are like the GNU Emacs
32048d201a5SJoerg Sonnenberger.Dq version-control
32148d201a5SJoerg Sonnenbergervariable; they also recognize synonyms that are more descriptive.
32248d201a5SJoerg SonnenbergerThe valid values are (unique abbreviations are accepted):
32348d201a5SJoerg Sonnenberger.Bl -tag -width Ds -offset indent
3249d62a0f9SSascha Wildner.It Cm t , numbered
32548d201a5SJoerg SonnenbergerAlways make numbered backups.
3269d62a0f9SSascha Wildner.It Cm nil , existing
32748d201a5SJoerg SonnenbergerMake numbered backups of files that already have them,
32848d201a5SJoerg Sonnenbergersimple backups of the others.
3299d62a0f9SSascha Wildner.It Cm never , simple
33048d201a5SJoerg SonnenbergerAlways make simple backups.
331*b94b84caSDaniel Fojt.It Cm none
332*b94b84caSDaniel FojtDo not make backups.
33348d201a5SJoerg Sonnenberger.El
3349d62a0f9SSascha Wildner.It Fl v , Fl Fl version
3359d62a0f9SSascha WildnerCauses
3369d62a0f9SSascha Wildner.Nm
3379d62a0f9SSascha Wildnerto print out its revision header and patch level.
33848d201a5SJoerg Sonnenberger.It Xo
3399d62a0f9SSascha Wildner.Fl x Ar number ,
3409d62a0f9SSascha Wildner.Fl Fl debug Ar number
34148d201a5SJoerg Sonnenberger.Xc
34248d201a5SJoerg SonnenbergerSets internal debugging flags, and is of interest only to
34348d201a5SJoerg Sonnenberger.Nm
34448d201a5SJoerg Sonnenbergerpatchers.
3459d62a0f9SSascha Wildner.It Xo
3469d62a0f9SSascha Wildner.Fl z Ar backup-ext ,
3479d62a0f9SSascha Wildner.Fl Fl suffix Ar backup-ext
3489d62a0f9SSascha Wildner.Xc
34948d201a5SJoerg SonnenbergerCauses the next argument to be interpreted as the backup extension, to be
35048d201a5SJoerg Sonnenbergerused in place of
35148d201a5SJoerg Sonnenberger.Qq .orig .
35248d201a5SJoerg Sonnenberger.It Fl Fl posix
35348d201a5SJoerg SonnenbergerEnables strict
3545027f2b8SJohn Marino.St -p1003.1-2008
35548d201a5SJoerg Sonnenbergerconformance, specifically:
35648d201a5SJoerg Sonnenberger.Bl -enum
35748d201a5SJoerg Sonnenberger.It
35848d201a5SJoerg SonnenbergerBackup files are not created unless the
35988147647SSascha Wildner.Fl b
36048d201a5SJoerg Sonnenbergeroption is specified.
36148d201a5SJoerg Sonnenberger.It
36248d201a5SJoerg SonnenbergerIf unspecified, the file name used is the first of the old, new and
36348d201a5SJoerg Sonnenbergerindex files that exists.
36448d201a5SJoerg Sonnenberger.El
36548d201a5SJoerg Sonnenberger.El
36648d201a5SJoerg Sonnenberger.Ss Patch Application
36748d201a5SJoerg Sonnenberger.Nm
36848d201a5SJoerg Sonnenbergerwill try to skip any leading garbage, apply the diff,
36948d201a5SJoerg Sonnenbergerand then skip any trailing garbage.
37048d201a5SJoerg SonnenbergerThus you could feed an article or message containing a
37148d201a5SJoerg Sonnenbergerdiff listing to
3729b5a9965SSascha Wildner.Nm ,
37348d201a5SJoerg Sonnenbergerand it should work.
37448d201a5SJoerg SonnenbergerIf the entire diff is indented by a consistent amount,
37548d201a5SJoerg Sonnenbergerthis will be taken into account.
37648d201a5SJoerg Sonnenberger.Pp
37748d201a5SJoerg SonnenbergerWith context diffs, and to a lesser extent with normal diffs,
37848d201a5SJoerg Sonnenberger.Nm
37948d201a5SJoerg Sonnenbergercan detect when the line numbers mentioned in the patch are incorrect,
38048d201a5SJoerg Sonnenbergerand will attempt to find the correct place to apply each hunk of the patch.
38148d201a5SJoerg SonnenbergerAs a first guess, it takes the line number mentioned for the hunk, plus or
38248d201a5SJoerg Sonnenbergerminus any offset used in applying the previous hunk.
38348d201a5SJoerg SonnenbergerIf that is not the correct place,
38448d201a5SJoerg Sonnenberger.Nm
38548d201a5SJoerg Sonnenbergerwill scan both forwards and backwards for a set of lines matching the context
38648d201a5SJoerg Sonnenbergergiven in the hunk.
38748d201a5SJoerg SonnenbergerFirst
38848d201a5SJoerg Sonnenberger.Nm
38948d201a5SJoerg Sonnenbergerlooks for a place where all lines of the context match.
39048d201a5SJoerg SonnenbergerIf no such place is found, and it's a context diff, and the maximum fuzz factor
39148d201a5SJoerg Sonnenbergeris set to 1 or more, then another scan takes place ignoring the first and last
39248d201a5SJoerg Sonnenbergerline of context.
39348d201a5SJoerg SonnenbergerIf that fails, and the maximum fuzz factor is set to 2 or more,
39448d201a5SJoerg Sonnenbergerthe first two and last two lines of context are ignored,
39548d201a5SJoerg Sonnenbergerand another scan is made.
39648d201a5SJoerg Sonnenberger.Pq The default maximum fuzz factor is 2.
39748d201a5SJoerg Sonnenberger.Pp
39848d201a5SJoerg SonnenbergerIf
39948d201a5SJoerg Sonnenberger.Nm
40048d201a5SJoerg Sonnenbergercannot find a place to install that hunk of the patch, it will put the hunk
40148d201a5SJoerg Sonnenbergerout to a reject file, which normally is the name of the output file plus
40248d201a5SJoerg Sonnenberger.Qq .rej .
403fcc20555SSascha Wildner(Note that the rejected hunk will come out in context diff form whether the
404fcc20555SSascha Wildnerinput patch was a context diff or a normal diff.
405fcc20555SSascha WildnerIf the input was a normal diff, many of the contexts will simply be null.)
40648d201a5SJoerg SonnenbergerThe line numbers on the hunks in the reject file may be different than
40748d201a5SJoerg Sonnenbergerin the patch file: they reflect the approximate location patch thinks the
40848d201a5SJoerg Sonnenbergerfailed hunks belong in the new file rather than the old one.
40948d201a5SJoerg Sonnenberger.Pp
41048d201a5SJoerg SonnenbergerAs each hunk is completed, you will be told whether the hunk succeeded or
41148d201a5SJoerg Sonnenbergerfailed, and which line (in the new file)
41248d201a5SJoerg Sonnenberger.Nm
41348d201a5SJoerg Sonnenbergerthought the hunk should go on.
41448d201a5SJoerg SonnenbergerIf this is different from the line number specified in the diff,
41548d201a5SJoerg Sonnenbergeryou will be told the offset.
41648d201a5SJoerg SonnenbergerA single large offset MAY be an indication that a hunk was installed in the
41748d201a5SJoerg Sonnenbergerwrong place.
41848d201a5SJoerg SonnenbergerYou will also be told if a fuzz factor was used to make the match, in which
41948d201a5SJoerg Sonnenbergercase you should also be slightly suspicious.
42048d201a5SJoerg Sonnenberger.Ss Filename Determination
42148d201a5SJoerg SonnenbergerIf no original file is specified on the command line,
42248d201a5SJoerg Sonnenberger.Nm
42348d201a5SJoerg Sonnenbergerwill try to figure out from the leading garbage what the name of the file
42448d201a5SJoerg Sonnenbergerto edit is.
42548d201a5SJoerg SonnenbergerWhen checking a prospective file name, pathname components are stripped
42648d201a5SJoerg Sonnenbergeras specified by the
42748d201a5SJoerg Sonnenberger.Fl p
42848d201a5SJoerg Sonnenbergeroption and the file's existence and writability are checked relative
42948d201a5SJoerg Sonnenbergerto the current working directory (or the directory specified by the
43048d201a5SJoerg Sonnenberger.Fl d
43148d201a5SJoerg Sonnenbergeroption).
43248d201a5SJoerg Sonnenberger.Pp
43348d201a5SJoerg SonnenbergerIf the diff is a context or unified diff,
43448d201a5SJoerg Sonnenberger.Nm
43548d201a5SJoerg Sonnenbergeris able to determine the old and new file names from the diff header.
43648d201a5SJoerg SonnenbergerFor context diffs, the
43748d201a5SJoerg Sonnenberger.Dq old
43848d201a5SJoerg Sonnenbergerfile is specified in the line beginning with
43948d201a5SJoerg Sonnenberger.Qq ***
44048d201a5SJoerg Sonnenbergerand the
44148d201a5SJoerg Sonnenberger.Dq new
44248d201a5SJoerg Sonnenbergerfile is specified in the line beginning with
44348d201a5SJoerg Sonnenberger.Qq --- .
44448d201a5SJoerg SonnenbergerFor a unified diff, the
44548d201a5SJoerg Sonnenberger.Dq old
44648d201a5SJoerg Sonnenbergerfile is specified in the line beginning with
44748d201a5SJoerg Sonnenberger.Qq ---
44848d201a5SJoerg Sonnenbergerand the
44948d201a5SJoerg Sonnenberger.Dq new
45048d201a5SJoerg Sonnenbergerfile is specified in the line beginning with
45148d201a5SJoerg Sonnenberger.Qq +++ .
45248d201a5SJoerg SonnenbergerIf there is an
45348d201a5SJoerg Sonnenberger.Qq Index:
45448d201a5SJoerg Sonnenbergerline in the leading garbage (regardless of the diff type),
45548d201a5SJoerg Sonnenberger.Nm
45648d201a5SJoerg Sonnenbergerwill use the file name from that line as the
45748d201a5SJoerg Sonnenberger.Dq index
45848d201a5SJoerg Sonnenbergerfile.
45948d201a5SJoerg Sonnenberger.Pp
46048d201a5SJoerg Sonnenberger.Nm
46148d201a5SJoerg Sonnenbergerwill choose the file name by performing the following steps, with the first
46248d201a5SJoerg Sonnenbergermatch used:
46348d201a5SJoerg Sonnenberger.Bl -enum
46448d201a5SJoerg Sonnenberger.It
46548d201a5SJoerg SonnenbergerIf
46648d201a5SJoerg Sonnenberger.Nm
46748d201a5SJoerg Sonnenbergeris operating in strict
4685027f2b8SJohn Marino.St -p1003.1-2008
46948d201a5SJoerg Sonnenbergermode, the first of the
47048d201a5SJoerg Sonnenberger.Dq old ,
47148d201a5SJoerg Sonnenberger.Dq new
47248d201a5SJoerg Sonnenbergerand
47348d201a5SJoerg Sonnenberger.Dq index
47448d201a5SJoerg Sonnenbergerfile names that exist is used.
47548d201a5SJoerg SonnenbergerOtherwise,
47648d201a5SJoerg Sonnenberger.Nm
47748d201a5SJoerg Sonnenbergerwill examine either the
47848d201a5SJoerg Sonnenberger.Dq old
47948d201a5SJoerg Sonnenbergerand
48048d201a5SJoerg Sonnenberger.Dq new
48148d201a5SJoerg Sonnenbergerfile names or, for a non-context diff, the
48248d201a5SJoerg Sonnenberger.Dq index
48348d201a5SJoerg Sonnenbergerfile name, and choose the file name with the fewest path components,
48448d201a5SJoerg Sonnenbergerthe shortest basename, and the shortest total file name length (in that order).
48548d201a5SJoerg Sonnenberger.It
48648d201a5SJoerg SonnenbergerIf no suitable file was found to patch, the patch file is a context or
48748d201a5SJoerg Sonnenbergerunified diff, and the old file was zero length, the new file name is
48848d201a5SJoerg Sonnenbergercreated and used.
48948d201a5SJoerg Sonnenberger.It
49048d201a5SJoerg SonnenbergerIf the file name still cannot be determined,
49148d201a5SJoerg Sonnenberger.Nm
49248d201a5SJoerg Sonnenbergerwill prompt the user for the file name to use.
49348d201a5SJoerg Sonnenberger.El
49448d201a5SJoerg Sonnenberger.Pp
49548d201a5SJoerg SonnenbergerAdditionally, if the leading garbage contains a
49648d201a5SJoerg Sonnenberger.Qq Prereq:\ \&
49748d201a5SJoerg Sonnenbergerline,
49848d201a5SJoerg Sonnenberger.Nm
49948d201a5SJoerg Sonnenbergerwill take the first word from the prerequisites line (normally a version
50048d201a5SJoerg Sonnenbergernumber) and check the input file to see if that word can be found.
50148d201a5SJoerg SonnenbergerIf not,
50248d201a5SJoerg Sonnenberger.Nm
50348d201a5SJoerg Sonnenbergerwill ask for confirmation before proceeding.
50448d201a5SJoerg Sonnenberger.Pp
50548d201a5SJoerg SonnenbergerThe upshot of all this is that you should be able to say, while in a news
50648d201a5SJoerg Sonnenbergerinterface, the following:
50748d201a5SJoerg Sonnenberger.Pp
50848d201a5SJoerg Sonnenberger.Dl | patch -d /usr/src/local/blurfl
50948d201a5SJoerg Sonnenberger.Pp
51048d201a5SJoerg Sonnenbergerand patch a file in the blurfl directory directly from the article containing
51148d201a5SJoerg Sonnenbergerthe patch.
51248d201a5SJoerg Sonnenberger.Ss Backup Files
51348d201a5SJoerg SonnenbergerBy default, the patched version is put in place of the original, with
51448d201a5SJoerg Sonnenbergerthe original file backed up to the same name with the extension
51548d201a5SJoerg Sonnenberger.Qq .orig ,
51648d201a5SJoerg Sonnenbergeror as specified by the
51748d201a5SJoerg Sonnenberger.Fl B ,
51848d201a5SJoerg Sonnenberger.Fl V ,
51948d201a5SJoerg Sonnenbergeror
52048d201a5SJoerg Sonnenberger.Fl z
52148d201a5SJoerg Sonnenbergeroptions.
52248d201a5SJoerg SonnenbergerThe extension used for making backup files may also be specified in the
52348d201a5SJoerg Sonnenberger.Ev SIMPLE_BACKUP_SUFFIX
52448d201a5SJoerg Sonnenbergerenvironment variable, which is overridden by the options above.
52548d201a5SJoerg Sonnenberger.Pp
52648d201a5SJoerg SonnenbergerIf the backup file is a symbolic or hard link to the original file,
52748d201a5SJoerg Sonnenberger.Nm
52848d201a5SJoerg Sonnenbergercreates a new backup file name by changing the first lowercase letter
52948d201a5SJoerg Sonnenbergerin the last component of the file's name into uppercase.
53048d201a5SJoerg SonnenbergerIf there are no more lowercase letters in the name,
53148d201a5SJoerg Sonnenbergerit removes the first character from the name.
53248d201a5SJoerg SonnenbergerIt repeats this process until it comes up with a
53348d201a5SJoerg Sonnenbergerbackup file that does not already exist or is not linked to the original file.
53448d201a5SJoerg Sonnenberger.Pp
53548d201a5SJoerg SonnenbergerYou may also specify where you want the output to go with the
53648d201a5SJoerg Sonnenberger.Fl o
53748d201a5SJoerg Sonnenbergeroption; if that file already exists, it is backed up first.
53848d201a5SJoerg Sonnenberger.Ss Notes For Patch Senders
53948d201a5SJoerg SonnenbergerThere are several things you should bear in mind if you are going to
54048d201a5SJoerg Sonnenbergerbe sending out patches:
54148d201a5SJoerg Sonnenberger.Pp
54248d201a5SJoerg SonnenbergerFirst, you can save people a lot of grief by keeping a
54348d201a5SJoerg Sonnenberger.Pa patchlevel.h
54448d201a5SJoerg Sonnenbergerfile which is patched to increment the patch level as the first diff in the
54548d201a5SJoerg Sonnenbergerpatch file you send out.
54648d201a5SJoerg SonnenbergerIf you put a
54748d201a5SJoerg Sonnenberger.Qq Prereq:
5485027f2b8SJohn Marinoline in with the patch, it will not let them apply
54948d201a5SJoerg Sonnenbergerpatches out of order without some warning.
55048d201a5SJoerg Sonnenberger.Pp
5515027f2b8SJohn MarinoSecond, make sure you have specified the file names right, either in a
55248d201a5SJoerg Sonnenbergercontext diff header, or with an
55348d201a5SJoerg Sonnenberger.Qq Index:
55448d201a5SJoerg Sonnenbergerline.
55548d201a5SJoerg SonnenbergerIf you are patching something in a subdirectory, be sure to tell the patch
55648d201a5SJoerg Sonnenbergeruser to specify a
55748d201a5SJoerg Sonnenberger.Fl p
55848d201a5SJoerg Sonnenbergeroption as needed.
55948d201a5SJoerg Sonnenberger.Pp
56048d201a5SJoerg SonnenbergerThird, you can create a file by sending out a diff that compares a
56148d201a5SJoerg Sonnenbergernull file to the file you want to create.
562*b94b84caSDaniel FojtIf the file you want to create already exists in the target directory when the
563*b94b84caSDaniel Fojtdiff is applied, then
564*b94b84caSDaniel Fojt.Nm
565*b94b84caSDaniel Fojtwill identify the patch as potentially reversed and offer to reverse the patch.
56648d201a5SJoerg Sonnenberger.Pp
56748d201a5SJoerg SonnenbergerFourth, take care not to send out reversed patches, since it makes people wonder
56848d201a5SJoerg Sonnenbergerwhether they already applied the patch.
56948d201a5SJoerg Sonnenberger.Pp
57048d201a5SJoerg SonnenbergerFifth, while you may be able to get away with putting 582 diff listings into
57148d201a5SJoerg Sonnenbergerone file, it is probably wiser to group related patches into separate files in
57248d201a5SJoerg Sonnenbergercase something goes haywire.
57348d201a5SJoerg Sonnenberger.Sh ENVIRONMENT
57448d201a5SJoerg Sonnenberger.Bl -tag -width "PATCH_VERSION_CONTROL" -compact
57548d201a5SJoerg Sonnenberger.It Ev POSIXLY_CORRECT
57648d201a5SJoerg SonnenbergerWhen set,
57748d201a5SJoerg Sonnenberger.Nm
57848d201a5SJoerg Sonnenbergerbehaves as if the
57948d201a5SJoerg Sonnenberger.Fl Fl posix
58048d201a5SJoerg Sonnenbergeroption has been specified.
58148d201a5SJoerg Sonnenberger.It Ev SIMPLE_BACKUP_SUFFIX
58248d201a5SJoerg SonnenbergerExtension to use for backup file names instead of
58348d201a5SJoerg Sonnenberger.Qq .orig .
58448d201a5SJoerg Sonnenberger.It Ev TMPDIR
58548d201a5SJoerg SonnenbergerDirectory to put temporary files in; default is
58648d201a5SJoerg Sonnenberger.Pa /tmp .
58748d201a5SJoerg Sonnenberger.It Ev PATCH_VERSION_CONTROL
58848d201a5SJoerg SonnenbergerSelects when numbered backup files are made.
58948d201a5SJoerg Sonnenberger.It Ev VERSION_CONTROL
59048d201a5SJoerg SonnenbergerSame as
59148d201a5SJoerg Sonnenberger.Ev PATCH_VERSION_CONTROL .
59248d201a5SJoerg Sonnenberger.El
59348d201a5SJoerg Sonnenberger.Sh FILES
59448d201a5SJoerg Sonnenberger.Bl -tag -width "$TMPDIR/patch*" -compact
59548d201a5SJoerg Sonnenberger.It Pa $TMPDIR/patch*
59648d201a5SJoerg Sonnenberger.Nm
59748d201a5SJoerg Sonnenbergertemporary files
59848d201a5SJoerg Sonnenberger.It Pa /dev/tty
59948d201a5SJoerg Sonnenbergerused to read input when
60048d201a5SJoerg Sonnenberger.Nm
60148d201a5SJoerg Sonnenbergerprompts the user
60248d201a5SJoerg Sonnenberger.El
60397861a1dSSascha Wildner.Sh EXIT STATUS
60448d201a5SJoerg SonnenbergerThe
60548d201a5SJoerg Sonnenberger.Nm
60648d201a5SJoerg Sonnenbergerutility exits with one of the following values:
60748d201a5SJoerg Sonnenberger.Pp
6085027f2b8SJohn Marino.Bl -tag -width Ds -offset indent -compact
609*b94b84caSDaniel Fojt.It 0
61048d201a5SJoerg SonnenbergerSuccessful completion.
611*b94b84caSDaniel Fojt.It 1
61248d201a5SJoerg SonnenbergerOne or more lines were written to a reject file.
613*b94b84caSDaniel Fojt.It \*(Gt1
61448d201a5SJoerg SonnenbergerAn error occurred.
61548d201a5SJoerg Sonnenberger.El
61648d201a5SJoerg Sonnenberger.Pp
61748d201a5SJoerg SonnenbergerWhen applying a set of patches in a loop it behooves you to check this
6185027f2b8SJohn Marinoexit status so you do not apply a later patch to a partially patched file.
61997861a1dSSascha Wildner.Sh DIAGNOSTICS
62097861a1dSSascha WildnerToo many to list here, but generally indicative that
62197861a1dSSascha Wildner.Nm
62297861a1dSSascha Wildnercouldn't parse your patch file.
62397861a1dSSascha Wildner.Pp
62497861a1dSSascha WildnerThe message
62597861a1dSSascha Wildner.Qq Hmm...
62697861a1dSSascha Wildnerindicates that there is unprocessed text in the patch file and that
62797861a1dSSascha Wildner.Nm
62897861a1dSSascha Wildneris attempting to intuit whether there is a patch in that text and, if so,
62997861a1dSSascha Wildnerwhat kind of patch it is.
63048d201a5SJoerg Sonnenberger.Sh SEE ALSO
63148d201a5SJoerg Sonnenberger.Xr diff 1
6329d62a0f9SSascha Wildner.Sh STANDARDS
6339d62a0f9SSascha WildnerThe
6349d62a0f9SSascha Wildner.Nm
6359d62a0f9SSascha Wildnerutility is compliant with the
6365027f2b8SJohn Marino.St -p1003.1-2008
637*b94b84caSDaniel Fojtspecification,
638*b94b84caSDaniel Fojtexcept as detailed above for the
63999d56977SJoerg Sonnenberger.Fl -posix
640*b94b84caSDaniel Fojtoption.
6419d62a0f9SSascha Wildner.Pp
6429d62a0f9SSascha WildnerThe flags
6435027f2b8SJohn Marino.Op Fl BCEFfstVvxz
6449d62a0f9SSascha Wildnerand
6459d62a0f9SSascha Wildner.Op Fl -posix
6469d62a0f9SSascha Wildnerare extensions to that specification.
64748d201a5SJoerg Sonnenberger.Sh AUTHORS
64848d201a5SJoerg Sonnenberger.An Larry Wall
64948d201a5SJoerg Sonnenbergerwith many other contributors.
65048d201a5SJoerg Sonnenberger.Sh CAVEATS
65148d201a5SJoerg Sonnenberger.Nm
65248d201a5SJoerg Sonnenbergercannot tell if the line numbers are off in an ed script, and can only detect
65348d201a5SJoerg Sonnenbergerbad line numbers in a normal diff when it finds a
65448d201a5SJoerg Sonnenberger.Qq change
65548d201a5SJoerg Sonnenbergeror a
65648d201a5SJoerg Sonnenberger.Qq delete
65748d201a5SJoerg Sonnenbergercommand.
65848d201a5SJoerg SonnenbergerA context diff using fuzz factor 3 may have the same problem.
65948d201a5SJoerg SonnenbergerUntil a suitable interactive interface is added, you should probably do
66048d201a5SJoerg Sonnenbergera context diff in these cases to see if the changes made sense.
66148d201a5SJoerg SonnenbergerOf course, compiling without errors is a pretty good indication that the patch
66248d201a5SJoerg Sonnenbergerworked, but not always.
66348d201a5SJoerg Sonnenberger.Pp
66448d201a5SJoerg Sonnenberger.Nm
66548d201a5SJoerg Sonnenbergerusually produces the correct results, even when it has to do a lot of
66648d201a5SJoerg Sonnenbergerguessing.
66748d201a5SJoerg SonnenbergerHowever, the results are guaranteed to be correct only when the patch is
66848d201a5SJoerg Sonnenbergerapplied to exactly the same version of the file that the patch was
66948d201a5SJoerg Sonnenbergergenerated from.
67048d201a5SJoerg Sonnenberger.Sh BUGS
67148d201a5SJoerg SonnenbergerCould be smarter about partial matches, excessively deviant offsets and
67248d201a5SJoerg Sonnenbergerswapped code, but that would take an extra pass.
67348d201a5SJoerg Sonnenberger.Pp
67448d201a5SJoerg SonnenbergerCheck patch mode
67548d201a5SJoerg Sonnenberger.Pq Fl C
67648d201a5SJoerg Sonnenbergerwill fail if you try to check several patches in succession that build on
67748d201a5SJoerg Sonnenbergereach other.
67848d201a5SJoerg SonnenbergerThe entire
67948d201a5SJoerg Sonnenberger.Nm
68048d201a5SJoerg Sonnenbergercode would have to be restructured to keep temporary files around so that it
68148d201a5SJoerg Sonnenbergercan handle this situation.
68248d201a5SJoerg Sonnenberger.Pp
68348d201a5SJoerg SonnenbergerIf code has been duplicated (for instance with #ifdef OLDCODE ... #else ...
68448d201a5SJoerg Sonnenberger#endif),
68548d201a5SJoerg Sonnenberger.Nm
68648d201a5SJoerg Sonnenbergeris incapable of patching both versions, and, if it works at all, will likely
68748d201a5SJoerg Sonnenbergerpatch the wrong one, and tell you that it succeeded to boot.
68848d201a5SJoerg Sonnenberger.Pp
6895027f2b8SJohn MarinoIf you apply a patch you have already applied,
69048d201a5SJoerg Sonnenberger.Nm
69148d201a5SJoerg Sonnenbergerwill think it is a reversed patch, and offer to un-apply the patch.
69248d201a5SJoerg SonnenbergerThis could be construed as a feature.
693