comparison mercurial/patch.py @ 2920:ef8ee4477019

merge with mpm.
author Vadim Gelfer <vadim.gelfer@gmail.com>
date Wed, 16 Aug 2006 10:46:24 -0700
parents b70740aefa4d 3848488244fc
children 773c5b82d052
comparison
equal deleted inserted replaced
2907:b70740aefa4d 2920:ef8ee4477019
213 raise 213 raise
214 214
215 tmpfp.close() 215 tmpfp.close()
216 return patchname 216 return patchname
217 217
218 def patch(patchname, ui, strip=1, cwd=None): 218 def patch(strip, patchname, ui, cwd=None):
219 """apply the patch <patchname> to the working directory. 219 """apply the patch <patchname> to the working directory.
220 a list of patched files is returned""" 220 a list of patched files is returned"""
221 221
222 (dopatch, gitpatches) = readgitpatch(patchname) 222 (dopatch, gitpatches) = readgitpatch(patchname)
223 223
224 files = {} 224 files = {}
225 fuzz = False
226 if dopatch: 225 if dopatch:
227 if dopatch == 'filter': 226 if dopatch == 'filter':
228 patchname = dogitpatch(patchname, gitpatches) 227 patchname = dogitpatch(patchname, gitpatches)
229 patcher = util.find_in_path('gpatch', os.environ.get('PATH', ''), 'patch') 228 patcher = util.find_in_path('gpatch', os.environ.get('PATH', ''), 'patch')
230 args = [] 229 args = []
236 if dopatch == 'filter': 235 if dopatch == 'filter':
237 False and os.unlink(patchname) 236 False and os.unlink(patchname)
238 237
239 for line in fp: 238 for line in fp:
240 line = line.rstrip() 239 line = line.rstrip()
241 ui.note(line + '\n') 240 ui.status("%s\n" % line)
242 if line.startswith('patching file '): 241 if line.startswith('patching file '):
243 pf = util.parse_patch_output(line) 242 pf = util.parse_patch_output(line)
244 printed_file = False
245 files.setdefault(pf, (None, None)) 243 files.setdefault(pf, (None, None))
246 elif line.find('with fuzz') >= 0:
247 fuzz = True
248 if not printed_file:
249 ui.warn(pf + '\n')
250 printed_file = True
251 ui.warn(line + '\n')
252 elif line.find('saving rejects to file') >= 0:
253 ui.warn(line + '\n')
254 elif line.find('FAILED') >= 0:
255 if not printed_file:
256 ui.warn(pf + '\n')
257 printed_file = True
258 ui.warn(line + '\n')
259
260 code = fp.close() 244 code = fp.close()
261 if code: 245 if code:
262 raise util.Abort(_("patch command failed: %s") % 246 raise util.Abort(_("patch command failed: %s") %
263 util.explain_exit(code)[0]) 247 util.explain_exit(code)[0])
264 248
265 for gp in gitpatches: 249 for gp in gitpatches:
266 files[gp.path] = (gp.op, gp) 250 files[gp.path] = (gp.op, gp)
267 251
268 return (files, fuzz) 252 return files
253
254 def diffopts(ui, opts={}):
255 return mdiff.diffopts(
256 text=opts.get('text'),
257 showfunc=(opts.get('show_function') or
258 ui.configbool('diff', 'showfunc', None)),
259 ignorews=(opts.get('ignore_all_space') or
260 ui.configbool('diff', 'ignorews', None)),
261 ignorewsamount=(opts.get('ignore_space_change') or
262 ui.configbool('diff', 'ignorewsamount', None)),
263 ignoreblanklines=(opts.get('ignore_blank_lines') or
264 ui.configbool('diff', 'ignoreblanklines', None)))
269 265
270 def diff(repo, node1=None, node2=None, files=None, match=util.always, 266 def diff(repo, node1=None, node2=None, files=None, match=util.always,
271 fp=None, changes=None, opts=None): 267 fp=None, changes=None, opts=None):
272 '''print diff of changes to files between two nodes, or node and 268 '''print diff of changes to files between two nodes, or node and
273 working directory. 269 working directory.
312 _date2 = util.datestr(change[2]) 308 _date2 = util.datestr(change[2])
313 def date2(f): 309 def date2(f):
314 return _date2 310 return _date2
315 def read(f): 311 def read(f):
316 return repo.file(f).read(mmap2[f]) 312 return repo.file(f).read(mmap2[f])
317 def renamed(f):
318 src = repo.file(f).renamed(mmap2[f])
319 return src and src[0] or None
320 else: 313 else:
321 tz = util.makedate()[1] 314 tz = util.makedate()[1]
322 _date2 = util.datestr() 315 _date2 = util.datestr()
323 def date2(f): 316 def date2(f):
324 try: 317 try:
326 except OSError, err: 319 except OSError, err:
327 if err.errno != errno.ENOENT: raise 320 if err.errno != errno.ENOENT: raise
328 return _date2 321 return _date2
329 def read(f): 322 def read(f):
330 return repo.wread(f) 323 return repo.wread(f)
331 def renamed(f):
332 return repo.dirstate.copies.get(f)
333 324
334 if repo.ui.quiet: 325 if repo.ui.quiet:
335 r = None 326 r = None
336 else: 327 else:
337 hexfunc = repo.ui.verbose and hex or short 328 hexfunc = repo.ui.verbose and hex or short
338 r = [hexfunc(node) for node in [node1, node2] if node] 329 r = [hexfunc(node) for node in [node1, node2] if node]
339 330
340 if opts.git:
341 copied = {}
342 for f in added:
343 src = renamed(f)
344 if src:
345 copied[f] = src
346 srcs = [x[1] for x in copied.items()]
347
348 all = modified + added + removed 331 all = modified + added + removed
349 all.sort() 332 all.sort()
350 for f in all: 333 for f in all:
351 to = None 334 to = None
352 tn = None 335 tn = None
353 dodiff = True
354 if f in mmap: 336 if f in mmap:
355 to = repo.file(f).read(mmap[f]) 337 to = repo.file(f).read(mmap[f])
356 if f not in removed: 338 if f not in removed:
357 tn = read(f) 339 tn = read(f)
358 if opts.git: 340 fp.write(mdiff.unidiff(to, date1, tn, date2(f), f, r, opts=opts))
359 def gitmode(x):
360 return x and '100755' or '100644'
361 def addmodehdr(header, omode, nmode):
362 if omode != nmode:
363 header.append('old mode %s\n' % omode)
364 header.append('new mode %s\n' % nmode)
365
366 a, b = f, f
367 header = []
368 if f in added:
369 if node2:
370 mode = gitmode(mmap2.execf(f))
371 else:
372 mode = gitmode(util.is_exec(repo.wjoin(f), None))
373 if f in copied:
374 a = copied[f]
375 omode = gitmode(mmap.execf(a))
376 addmodehdr(header, omode, mode)
377 op = a in removed and 'rename' or 'copy'
378 header.append('%s from %s\n' % (op, a))
379 header.append('%s to %s\n' % (op, f))
380 to = repo.file(a).read(mmap[a])
381 else:
382 header.append('new file mode %s\n' % mode)
383 elif f in removed:
384 if f in srcs:
385 dodiff = False
386 else:
387 mode = gitmode(mmap.execf(f))
388 header.append('deleted file mode %s\n' % mode)
389 else:
390 omode = gitmode(mmap.execf(f))
391 nmode = gitmode(util.is_exec(repo.wjoin(f), mmap.execf(f)))
392 addmodehdr(header, omode, nmode)
393 r = None
394 if dodiff:
395 header.insert(0, 'diff --git a/%s b/%s\n' % (a, b))
396 fp.write(''.join(header))
397 if dodiff:
398 fp.write(mdiff.unidiff(to, date1, tn, date2(f), f, r, opts=opts))
399 341
400 def export(repo, revs, template='hg-%h.patch', fp=None, switch_parent=False, 342 def export(repo, revs, template='hg-%h.patch', fp=None, switch_parent=False,
401 opts=None): 343 opts=None):
402 '''export changesets as hg patches.''' 344 '''export changesets as hg patches.'''
403 345