comparison mercurial/patch.py @ 2892:8b02af865990

Add diff --git option
author Brendan Cully <brendan@kublai.com>
date Mon, 14 Aug 2006 22:48:03 -0700
parents eab07a7b7491
children b70740aefa4d
comparison
equal deleted inserted replaced
2891:453097750fbf 2892:8b02af865990
296 _date2 = util.datestr(change[2]) 296 _date2 = util.datestr(change[2])
297 def date2(f): 297 def date2(f):
298 return _date2 298 return _date2
299 def read(f): 299 def read(f):
300 return repo.file(f).read(mmap2[f]) 300 return repo.file(f).read(mmap2[f])
301 def renamed(f):
302 src = repo.file(f).renamed(mmap2[f])
303 return src and src[0] or None
301 else: 304 else:
302 tz = util.makedate()[1] 305 tz = util.makedate()[1]
303 _date2 = util.datestr() 306 _date2 = util.datestr()
304 def date2(f): 307 def date2(f):
305 try: 308 try:
307 except OSError, err: 310 except OSError, err:
308 if err.errno != errno.ENOENT: raise 311 if err.errno != errno.ENOENT: raise
309 return _date2 312 return _date2
310 def read(f): 313 def read(f):
311 return repo.wread(f) 314 return repo.wread(f)
315 def renamed(f):
316 return repo.dirstate.copies.get(f)
312 317
313 if repo.ui.quiet: 318 if repo.ui.quiet:
314 r = None 319 r = None
315 else: 320 else:
316 hexfunc = repo.ui.verbose and hex or short 321 hexfunc = repo.ui.verbose and hex or short
317 r = [hexfunc(node) for node in [node1, node2] if node] 322 r = [hexfunc(node) for node in [node1, node2] if node]
318 323
324 if opts.git:
325 copied = {}
326 for f in added:
327 src = renamed(f)
328 if src:
329 copied[f] = src
330 srcs = [x[1] for x in copied.items()]
331
319 all = modified + added + removed 332 all = modified + added + removed
320 all.sort() 333 all.sort()
321 for f in all: 334 for f in all:
322 to = None 335 to = None
323 tn = None 336 tn = None
337 dodiff = True
324 if f in mmap: 338 if f in mmap:
325 to = repo.file(f).read(mmap[f]) 339 to = repo.file(f).read(mmap[f])
326 if f not in removed: 340 if f not in removed:
327 tn = read(f) 341 tn = read(f)
328 fp.write(mdiff.unidiff(to, date1, tn, date2(f), f, r, opts=opts)) 342 if opts.git:
343 def gitmode(x):
344 return x and '100755' or '100644'
345 def addmodehdr(header, omode, nmode):
346 if omode != nmode:
347 header.append('old mode %s\n' % omode)
348 header.append('new mode %s\n' % nmode)
349
350 a, b = f, f
351 header = []
352 if f in added:
353 if node2:
354 mode = gitmode(mmap2.execf(f))
355 else:
356 mode = gitmode(util.is_exec(repo.wjoin(f), None))
357 if f in copied:
358 a = copied[f]
359 omode = gitmode(mmap.execf(a))
360 addmodehdr(header, omode, mode)
361 op = a in removed and 'rename' or 'copy'
362 header.append('%s from %s\n' % (op, a))
363 header.append('%s to %s\n' % (op, f))
364 to = repo.file(a).read(mmap[a])
365 else:
366 header.append('new file mode %s\n' % mode)
367 elif f in removed:
368 if f in srcs:
369 dodiff = False
370 else:
371 mode = gitmode(mmap.execf(f))
372 header.append('deleted file mode %s\n' % mode)
373 else:
374 omode = gitmode(mmap.execf(f))
375 nmode = gitmode(util.is_exec(repo.wjoin(f), mmap.execf(f)))
376 addmodehdr(header, omode, nmode)
377 r = None
378 if dodiff:
379 header.insert(0, 'diff --git a/%s b/%s\n' % (a, b))
380 fp.write(''.join(header))
381 if dodiff:
382 fp.write(mdiff.unidiff(to, date1, tn, date2(f), f, r, opts=opts))
329 383
330 def export(repo, revs, template='hg-%h.patch', fp=None, switch_parent=False, 384 def export(repo, revs, template='hg-%h.patch', fp=None, switch_parent=False,
331 opts=None): 385 opts=None):
332 '''export changesets as hg patches.''' 386 '''export changesets as hg patches.'''
333 387