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