Show More
@@ -229,88 +229,6 b' def readgitpatch(fp, firstline=None):' | |||
|
229 | 229 | |
|
230 | 230 | return (dopatch, gitpatches) |
|
231 | 231 | |
|
232 | def patch(patchname, ui, strip=1, cwd=None, files={}): | |
|
233 | """apply <patchname> to the working directory. | |
|
234 | returns whether patch was applied with fuzz factor.""" | |
|
235 | patcher = ui.config('ui', 'patch') | |
|
236 | args = [] | |
|
237 | try: | |
|
238 | if patcher: | |
|
239 | return externalpatch(patcher, args, patchname, ui, strip, cwd, | |
|
240 | files) | |
|
241 | else: | |
|
242 | try: | |
|
243 | return internalpatch(patchname, ui, strip, cwd, files) | |
|
244 | except NoHunks: | |
|
245 | patcher = util.find_exe('gpatch') or util.find_exe('patch') | |
|
246 | ui.debug(_('no valid hunks found; trying with %r instead\n') % | |
|
247 | patcher) | |
|
248 | if util.needbinarypatch(): | |
|
249 | args.append('--binary') | |
|
250 | return externalpatch(patcher, args, patchname, ui, strip, cwd, | |
|
251 | files) | |
|
252 | except PatchError, err: | |
|
253 | s = str(err) | |
|
254 | if s: | |
|
255 | raise util.Abort(s) | |
|
256 | else: | |
|
257 | raise util.Abort(_('patch failed to apply')) | |
|
258 | ||
|
259 | def externalpatch(patcher, args, patchname, ui, strip, cwd, files): | |
|
260 | """use <patcher> to apply <patchname> to the working directory. | |
|
261 | returns whether patch was applied with fuzz factor.""" | |
|
262 | ||
|
263 | fuzz = False | |
|
264 | if cwd: | |
|
265 | args.append('-d %s' % util.shellquote(cwd)) | |
|
266 | fp = util.popen('%s %s -p%d < %s' % (patcher, ' '.join(args), strip, | |
|
267 | util.shellquote(patchname))) | |
|
268 | ||
|
269 | for line in fp: | |
|
270 | line = line.rstrip() | |
|
271 | ui.note(line + '\n') | |
|
272 | if line.startswith('patching file '): | |
|
273 | pf = util.parse_patch_output(line) | |
|
274 | printed_file = False | |
|
275 | files.setdefault(pf, (None, None)) | |
|
276 | elif line.find('with fuzz') >= 0: | |
|
277 | fuzz = True | |
|
278 | if not printed_file: | |
|
279 | ui.warn(pf + '\n') | |
|
280 | printed_file = True | |
|
281 | ui.warn(line + '\n') | |
|
282 | elif line.find('saving rejects to file') >= 0: | |
|
283 | ui.warn(line + '\n') | |
|
284 | elif line.find('FAILED') >= 0: | |
|
285 | if not printed_file: | |
|
286 | ui.warn(pf + '\n') | |
|
287 | printed_file = True | |
|
288 | ui.warn(line + '\n') | |
|
289 | code = fp.close() | |
|
290 | if code: | |
|
291 | raise PatchError(_("patch command failed: %s") % | |
|
292 | util.explain_exit(code)[0]) | |
|
293 | return fuzz | |
|
294 | ||
|
295 | def internalpatch(patchobj, ui, strip, cwd, files={}): | |
|
296 | """use builtin patch to apply <patchobj> to the working directory. | |
|
297 | returns whether patch was applied with fuzz factor.""" | |
|
298 | try: | |
|
299 | fp = file(patchobj, 'rb') | |
|
300 | except TypeError: | |
|
301 | fp = patchobj | |
|
302 | if cwd: | |
|
303 | curdir = os.getcwd() | |
|
304 | os.chdir(cwd) | |
|
305 | try: | |
|
306 | ret = applydiff(ui, fp, files, strip=strip) | |
|
307 | finally: | |
|
308 | if cwd: | |
|
309 | os.chdir(curdir) | |
|
310 | if ret < 0: | |
|
311 | raise PatchError | |
|
312 | return ret > 0 | |
|
313 | ||
|
314 | 232 | # @@ -start,len +start,len @@ or @@ -start +start @@ if len is 1 |
|
315 | 233 | unidesc = re.compile('@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@') |
|
316 | 234 | contextdesc = re.compile('(---|\*\*\*) (\d+)(,(\d+))? (---|\*\*\*)') |
@@ -1118,6 +1036,88 b' def updatedir(ui, repo, patches):' | |||
|
1118 | 1036 | files.extend([r for r in removes if r not in files]) |
|
1119 | 1037 | return util.sort(files) |
|
1120 | 1038 | |
|
1039 | def externalpatch(patcher, args, patchname, ui, strip, cwd, files): | |
|
1040 | """use <patcher> to apply <patchname> to the working directory. | |
|
1041 | returns whether patch was applied with fuzz factor.""" | |
|
1042 | ||
|
1043 | fuzz = False | |
|
1044 | if cwd: | |
|
1045 | args.append('-d %s' % util.shellquote(cwd)) | |
|
1046 | fp = util.popen('%s %s -p%d < %s' % (patcher, ' '.join(args), strip, | |
|
1047 | util.shellquote(patchname))) | |
|
1048 | ||
|
1049 | for line in fp: | |
|
1050 | line = line.rstrip() | |
|
1051 | ui.note(line + '\n') | |
|
1052 | if line.startswith('patching file '): | |
|
1053 | pf = util.parse_patch_output(line) | |
|
1054 | printed_file = False | |
|
1055 | files.setdefault(pf, (None, None)) | |
|
1056 | elif line.find('with fuzz') >= 0: | |
|
1057 | fuzz = True | |
|
1058 | if not printed_file: | |
|
1059 | ui.warn(pf + '\n') | |
|
1060 | printed_file = True | |
|
1061 | ui.warn(line + '\n') | |
|
1062 | elif line.find('saving rejects to file') >= 0: | |
|
1063 | ui.warn(line + '\n') | |
|
1064 | elif line.find('FAILED') >= 0: | |
|
1065 | if not printed_file: | |
|
1066 | ui.warn(pf + '\n') | |
|
1067 | printed_file = True | |
|
1068 | ui.warn(line + '\n') | |
|
1069 | code = fp.close() | |
|
1070 | if code: | |
|
1071 | raise PatchError(_("patch command failed: %s") % | |
|
1072 | util.explain_exit(code)[0]) | |
|
1073 | return fuzz | |
|
1074 | ||
|
1075 | def internalpatch(patchobj, ui, strip, cwd, files={}): | |
|
1076 | """use builtin patch to apply <patchobj> to the working directory. | |
|
1077 | returns whether patch was applied with fuzz factor.""" | |
|
1078 | try: | |
|
1079 | fp = file(patchobj, 'rb') | |
|
1080 | except TypeError: | |
|
1081 | fp = patchobj | |
|
1082 | if cwd: | |
|
1083 | curdir = os.getcwd() | |
|
1084 | os.chdir(cwd) | |
|
1085 | try: | |
|
1086 | ret = applydiff(ui, fp, files, strip=strip) | |
|
1087 | finally: | |
|
1088 | if cwd: | |
|
1089 | os.chdir(curdir) | |
|
1090 | if ret < 0: | |
|
1091 | raise PatchError | |
|
1092 | return ret > 0 | |
|
1093 | ||
|
1094 | def patch(patchname, ui, strip=1, cwd=None, files={}): | |
|
1095 | """apply <patchname> to the working directory. | |
|
1096 | returns whether patch was applied with fuzz factor.""" | |
|
1097 | patcher = ui.config('ui', 'patch') | |
|
1098 | args = [] | |
|
1099 | try: | |
|
1100 | if patcher: | |
|
1101 | return externalpatch(patcher, args, patchname, ui, strip, cwd, | |
|
1102 | files) | |
|
1103 | else: | |
|
1104 | try: | |
|
1105 | return internalpatch(patchname, ui, strip, cwd, files) | |
|
1106 | except NoHunks: | |
|
1107 | patcher = util.find_exe('gpatch') or util.find_exe('patch') | |
|
1108 | ui.debug(_('no valid hunks found; trying with %r instead\n') % | |
|
1109 | patcher) | |
|
1110 | if util.needbinarypatch(): | |
|
1111 | args.append('--binary') | |
|
1112 | return externalpatch(patcher, args, patchname, ui, strip, cwd, | |
|
1113 | files) | |
|
1114 | except PatchError, err: | |
|
1115 | s = str(err) | |
|
1116 | if s: | |
|
1117 | raise util.Abort(s) | |
|
1118 | else: | |
|
1119 | raise util.Abort(_('patch failed to apply')) | |
|
1120 | ||
|
1121 | 1121 | def b85diff(to, tn): |
|
1122 | 1122 | '''print base85-encoded binary diff''' |
|
1123 | 1123 | def gitindex(text): |
General Comments 0
You need to be logged in to leave comments.
Login now