|
|
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.