##// END OF EJS Templates
patch: change functions definition order for readability
Patrick Mezard -
r7151:b5bc5293 default
parent child Browse files
Show More
@@ -229,88 +229,6 b' def readgitpatch(fp, firstline=None):'
229
229
230 return (dopatch, gitpatches)
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 # @@ -start,len +start,len @@ or @@ -start +start @@ if len is 1
232 # @@ -start,len +start,len @@ or @@ -start +start @@ if len is 1
315 unidesc = re.compile('@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@')
233 unidesc = re.compile('@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@')
316 contextdesc = re.compile('(---|\*\*\*) (\d+)(,(\d+))? (---|\*\*\*)')
234 contextdesc = re.compile('(---|\*\*\*) (\d+)(,(\d+))? (---|\*\*\*)')
@@ -1118,6 +1036,88 b' def updatedir(ui, repo, patches):'
1118 files.extend([r for r in removes if r not in files])
1036 files.extend([r for r in removes if r not in files])
1119 return util.sort(files)
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 def b85diff(to, tn):
1121 def b85diff(to, tn):
1122 '''print base85-encoded binary diff'''
1122 '''print base85-encoded binary diff'''
1123 def gitindex(text):
1123 def gitindex(text):
General Comments 0
You need to be logged in to leave comments. Login now