|
|
1.1 ! root 1: ! 2: ! 3: ! 4: PATCH(1) UNIX Programmer's Manual PATCH(1) ! 5: ! 6: ! 7: ! 8: NAME ! 9: patch - a program for applying a diff file to an original ! 10: ! 11: SYNOPSIS ! 12: patch [options] orig patchfile [+ [options] orig] ! 13: ! 14: but usually just ! 15: ! 16: patch <patchfile ! 17: ! 18: DESCRIPTION ! 19: _P_a_t_c_h will take a patch file containing any of the three ! 20: forms of difference listing produced by the _d_i_f_f program and ! 21: apply those differences to an original file, producing a ! 22: patched version. By default, the patched version is put in ! 23: place of the original, with the original file backed up to ! 24: the same name with the extension ".orig", or as specified by ! 25: the -b switch. You may also specify where you want the out- ! 26: put to go with a -o switch. If _p_a_t_c_h_f_i_l_e is omitted, or is ! 27: a hyphen, the patch will be read from standard input. ! 28: ! 29: Upon startup, patch will attempt to determine the type of ! 30: the diff listing, unless over-ruled by a -c, -e, or -n ! 31: switch. Context diffs and normal diffs are applied by the ! 32: _p_a_t_c_h program itself, while ed diffs are simply fed to the ! 33: _e_d editor via a pipe. ! 34: ! 35: _P_a_t_c_h will try to skip any leading garbage, apply the diff, ! 36: and then skip any trailing garbage. Thus you could feed an ! 37: article or message containing a diff listing to _p_a_t_c_h, and ! 38: it should work. If the entire diff is indented by a con- ! 39: sistent amount, this will be taken into account. ! 40: ! 41: With context diffs, and to a lesser extent with normal ! 42: diffs, _p_a_t_c_h can detect when the line numbers mentioned in ! 43: the patch are incorrect, and will attempt to find the ! 44: correct place to apply each hunk of the patch. As a first ! 45: guess, it takes the line number mentioned for the hunk, plus ! 46: or minus any offset used in applying the previous hunk. If ! 47: that is not the correct place, _p_a_t_c_h will scan both forwards ! 48: and backwards for a set of lines matching the context given ! 49: in the hunk. First _p_a_t_c_h looks for a place where all lines ! 50: of the context match. If no such place is found, and it's a ! 51: context diff, and the maximum fuzz factor is set to 1 or ! 52: more, then another scan takes place ignoring the first and ! 53: last line of context. If that fails, and the maximum fuzz ! 54: factor is set to 2 or more, the first two and last two lines ! 55: of context are ignored, and another scan is made. (The ! 56: default maximum fuzz factor is 2.) If _p_a_t_c_h cannot find a ! 57: place to install that hunk of the patch, it will put the ! 58: hunk out to a reject file, which normally is the name of the ! 59: output file plus ".rej". (Note that the rejected hunk will ! 60: ! 61: ! 62: ! 63: Printed 2/18/88 LOCAL 1 ! 64: ! 65: ! 66: ! 67: ! 68: ! 69: ! 70: PATCH(1) UNIX Programmer's Manual PATCH(1) ! 71: ! 72: ! 73: ! 74: come out in context diff form whether the input patch was a ! 75: context diff or a normal diff. If the input was a normal ! 76: diff, many of the contexts will simply be null.) The line ! 77: numbers on the hunks in the reject file may be different ! 78: than in the patch file: they reflect the approximate loca- ! 79: tion patch thinks the failed hunks belong in the new file ! 80: rather than the old one. ! 81: ! 82: As each hunk is completed, you will be told whether the hunk ! 83: succeeded or failed, and which line (in the new file) _p_a_t_c_h ! 84: thought the hunk should go on. If this is different from ! 85: the line number specified in the diff you will be told the ! 86: offset. A single large offset MAY be an indication that a ! 87: hunk was installed in the wrong place. You will also be ! 88: told if a fuzz factor was used to make the match, in which ! 89: case you should also be slightly suspicious. ! 90: ! 91: If no original file is specified on the command line, _p_a_t_c_h ! 92: will try to figure out from the leading garbage what the ! 93: name of the file to edit is. In the header of a context ! 94: diff, the filename is found from lines beginning with "***" ! 95: or "---", with the shortest name of an existing file win- ! 96: ning. Only context diffs have lines like that, but if there ! 97: is an "Index:" line in the leading garbage, _p_a_t_c_h will try ! 98: to use the filename from that line. The context diff header ! 99: takes precedence over an Index line. If no filename can be ! 100: intuited from the leading garbage, you will be asked for the ! 101: name of the file to patch. ! 102: ! 103: (If the original file cannot be found, but a suitable SCCS ! 104: or RCS file is handy, _p_a_t_c_h will attempt to get or check out ! 105: the file.) ! 106: ! 107: Additionally, if the leading garbage contains a "Prereq: " ! 108: line, _p_a_t_c_h will take the first word from the prerequisites ! 109: line (normally a version number) and check the input file to ! 110: see if that word can be found. If not, _p_a_t_c_h will ask for ! 111: confirmation before proceeding. ! 112: ! 113: The upshot of all this is that you should be able to say, ! 114: while in a news interface, the following: ! 115: ! 116: | patch -d /usr/src/local/blurfl ! 117: ! 118: and patch a file in the blurfl directory directly from the ! 119: article containing the patch. ! 120: ! 121: If the patch file contains more than one patch, _p_a_t_c_h will ! 122: try to apply each of them as if they came from separate ! 123: patch files. This means, among other things, that it is ! 124: assumed that the name of the file to patch must be deter- ! 125: mined for each diff listing, and that the garbage before ! 126: ! 127: ! 128: ! 129: Printed 2/18/88 LOCAL 2 ! 130: ! 131: ! 132: ! 133: ! 134: ! 135: ! 136: PATCH(1) UNIX Programmer's Manual PATCH(1) ! 137: ! 138: ! 139: ! 140: each diff listing will be examined for interesting things ! 141: such as filenames and revision level, as mentioned previ- ! 142: ously. You can give switches (and another original file ! 143: name) for the second and subsequent patches by separating ! 144: the corresponding argument lists by a '+'. (The argument ! 145: list for a second or subsequent patch may not specify a new ! 146: patch file, however.) ! 147: ! 148: _P_a_t_c_h recognizes the following switches: ! 149: ! 150: -b causes the next argument to be interpreted as the ! 151: backup extension, to be used in place of ".orig". ! 152: ! 153: -c forces _p_a_t_c_h to interpret the patch file as a context ! 154: diff. ! 155: ! 156: -d causes _p_a_t_c_h to interpret the next argument as a direc- ! 157: tory, and cd to it before doing anything else. ! 158: ! 159: -D causes _p_a_t_c_h to use the "#ifdef...#endif" construct to ! 160: mark changes. The argument following will be used as ! 161: the differentiating symbol. Note that, unlike the C ! 162: compiler, there must be a space between the -D and the ! 163: argument. ! 164: ! 165: -e forces _p_a_t_c_h to interpret the patch file as an ed ! 166: script. ! 167: ! 168: -f forces _p_a_t_c_h to assume that the user knows exactly what ! 169: he or she is doing, and to not ask any questions. It ! 170: does not suppress commentary, however. Use -s for ! 171: that. ! 172: ! 173: -F<number> ! 174: sets the maximum fuzz factor. This switch only applied ! 175: to context diffs, and causes _p_a_t_c_h to ignore up to that ! 176: many lines in looking for places to install a hunk. ! 177: Note that a larger fuzz factor increases the odds of a ! 178: faulty patch. The default fuzz factor is 2, and it may ! 179: not be set to more than the number of lines of context ! 180: in the context diff, ordinarily 3. ! 181: ! 182: -l causes the pattern matching to be done loosely, in case ! 183: the tabs and spaces have been munged in your input ! 184: file. Any sequence of whitespace in the pattern line ! 185: will match any sequence in the input file. Normal ! 186: characters must still match exactly. Each line of the ! 187: context must still match a line in the input file. ! 188: ! 189: -n forces _p_a_t_c_h to interpret the patch file as a normal ! 190: diff. ! 191: ! 192: ! 193: ! 194: ! 195: Printed 2/18/88 LOCAL 3 ! 196: ! 197: ! 198: ! 199: ! 200: ! 201: ! 202: PATCH(1) UNIX Programmer's Manual PATCH(1) ! 203: ! 204: ! 205: ! 206: -N causes _p_a_t_c_h to ignore patches that it thinks are ! 207: reversed or already applied. See also -R . ! 208: ! 209: -o causes the next argument to be interpreted as the out- ! 210: put file name. ! 211: ! 212: -p<number> ! 213: sets the pathname strip count, which controls how path- ! 214: names found in the patch file are treated, in case the ! 215: you keep your files in a different directory than the ! 216: person who sent out the patch. The strip count speci- ! 217: fies how many backslashes are to be stripped from the ! 218: front of the pathname. (Any intervening directory ! 219: names also go away.) For example, supposing the ! 220: filename in the patch file was ! 221: ! 222: /u/howard/src/blurfl/blurfl.c ! 223: ! 224: setting -p or -p0 gives the entire pathname unmodified, ! 225: -p1 gives ! 226: ! 227: u/howard/src/blurfl/blurfl.c ! 228: ! 229: without the leading slash, -p4 gives ! 230: ! 231: blurfl/blurfl.c ! 232: ! 233: and not specifying -p at all just gives you "blurfl.c". ! 234: Whatever you end up with is looked for either in the ! 235: current directory, or the directory specified by the -d ! 236: switch. ! 237: ! 238: -r causes the next argument to be interpreted as the ! 239: reject file name. ! 240: ! 241: -R tells _p_a_t_c_h that this patch was created with the old ! 242: and new files swapped. (Yes, I'm afraid that does hap- ! 243: pen occasionally, human nature being what it is.) _P_a_t_c_h ! 244: will attempt to swap each hunk around before applying ! 245: it. Rejects will come out in the swapped format. The ! 246: -R switch will not work with ed diff scripts because ! 247: there is too little information to reconstruct the ! 248: reverse operation. ! 249: ! 250: If the first hunk of a patch fails, _p_a_t_c_h will reverse ! 251: the hunk to see if it can be applied that way. If it ! 252: can, you will be asked if you want to have the -R ! 253: switch set. If it can't, the patch will continue to be ! 254: applied normally. (Note: this method cannot detect a ! 255: reversed patch if it is a normal diff and if the first ! 256: command is an append (i.e. it should have been a ! 257: delete) since appends always succeed, due to the fact ! 258: ! 259: ! 260: ! 261: Printed 2/18/88 LOCAL 4 ! 262: ! 263: ! 264: ! 265: ! 266: ! 267: ! 268: PATCH(1) UNIX Programmer's Manual PATCH(1) ! 269: ! 270: ! 271: ! 272: that a null context will match anywhere. Luckily, most ! 273: patches add or change lines rather than delete them, so ! 274: most reversed normal diffs will begin with a delete, ! 275: which will fail, triggering the heuristic.) ! 276: ! 277: -s makes _p_a_t_c_h do its work silently, unless an error ! 278: occurs. ! 279: ! 280: -S causes _p_a_t_c_h to ignore this patch from the patch file, ! 281: but continue on looking for the next patch in the file. ! 282: Thus ! 283: ! 284: patch -S + -S + <patchfile ! 285: ! 286: will ignore the first and second of three patches. ! 287: ! 288: -v causes _p_a_t_c_h to print out it's revision header and ! 289: patch level. ! 290: ! 291: -x<number> ! 292: sets internal debugging flags, and is of interest only ! 293: to _p_a_t_c_h patchers. ! 294: ! 295: ENVIRONMENT ! 296: No environment variables are used by _p_a_t_c_h. ! 297: ! 298: FILES ! 299: /tmp/patch* ! 300: ! 301: SEE ALSO ! 302: diff(1) ! 303: ! 304: NOTES FOR PATCH SENDERS ! 305: There are several things you should bear in mind if you are ! 306: going to be sending out patches. First, you can save people ! 307: a lot of grief by keeping a patchlevel.h file which is ! 308: patched to increment the patch level as the first diff in ! 309: the patch file you send out. If you put a Prereq: line in ! 310: with the patch, it won't let them apply patches out of order ! 311: without some warning. Second, make sure you've specified ! 312: the filenames right, either in a context diff header, or ! 313: with an Index: line. If you are patching something in a ! 314: subdirectory, be sure to tell the patch user to specify a -p ! 315: switch as needed. Third, you can create a file by sending ! 316: out a diff that compares a null file to the file you want to ! 317: create. This will only work if the file you want to create ! 318: doesn't exist already in the target directory. Fourth, take ! 319: care not to send out reversed patches, since it makes people ! 320: wonder whether they already applied the patch. Fifth, while ! 321: you may be able to get away with putting 582 diff listings ! 322: into one file, it is probably wiser to group related patches ! 323: into separate files in case something goes haywire. ! 324: ! 325: ! 326: ! 327: Printed 2/18/88 LOCAL 5 ! 328: ! 329: ! 330: ! 331: ! 332: ! 333: ! 334: PATCH(1) UNIX Programmer's Manual PATCH(1) ! 335: ! 336: ! 337: ! 338: DIAGNOSTICS ! 339: Too many to list here, but generally indicative that _p_a_t_c_h ! 340: couldn't parse your patch file. ! 341: ! 342: The message "Hmm..." indicates that there is unprocessed ! 343: text in the patch file and that _p_a_t_c_h is attempting to ! 344: intuit whether there is a patch in that text and, if so, ! 345: what kind of patch it is. ! 346: ! 347: CAVEATS ! 348: _P_a_t_c_h cannot tell if the line numbers are off in an ed ! 349: script, and can only detect bad line numbers in a normal ! 350: diff when it finds a "change" or a "delete" command. A con- ! 351: text diff using fuzz factor 3 may have the same problem. ! 352: Until a suitable interactive interface is added, you should ! 353: probably do a context diff in these cases to see if the ! 354: changes made sense. Of course, compiling without errors is ! 355: a pretty good indication that the patch worked, but not ! 356: always. ! 357: ! 358: _P_a_t_c_h usually produces the correct results, even when it has ! 359: to do a lot of guessing. However, the results are ! 360: guaranteed to be correct only when the patch is applied to ! 361: exactly the same version of the file that the patch was gen- ! 362: erated from. ! 363: ! 364: BUGS ! 365: Could be smarter about partial matches, excessively deviant ! 366: offsets and swapped code, but that would take an extra pass. ! 367: ! 368: If code has been duplicated (for instance with #ifdef OLD- ! 369: CODE ... #else ... #endif), _p_a_t_c_h is incapable of patching ! 370: both versions, and, if it works at all, will likely patch ! 371: the wrong one, and tell you that it succeeded to boot. ! 372: ! 373: If you apply a patch you've already applied, _p_a_t_c_h will ! 374: think it is a reversed patch, and offer to un-apply the ! 375: patch. This could be construed as a feature. ! 376: ! 377: ! 378: ! 379: ! 380: ! 381: ! 382: ! 383: ! 384: ! 385: ! 386: ! 387: ! 388: ! 389: ! 390: ! 391: ! 392: ! 393: Printed 2/18/88 LOCAL 6 ! 394: ! 395: ! 396:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.