mercurial/patch.py
changeset 2892 8b02af865990
parent 2880 eab07a7b7491
child 2907 b70740aefa4d
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