mercurial/patch.py
changeset 12167 d2c5b0927c28
parent 12144 be9c4131a8f4
child 12266 00658492e2aa
equal deleted inserted replaced
12166:441a74b8def1 12167:d2c5b0927c28
  1402         ignorewsamount=get('ignore_space_change', 'ignorewsamount'),
  1402         ignorewsamount=get('ignore_space_change', 'ignorewsamount'),
  1403         ignoreblanklines=get('ignore_blank_lines', 'ignoreblanklines'),
  1403         ignoreblanklines=get('ignore_blank_lines', 'ignoreblanklines'),
  1404         context=get('unified', getter=ui.config))
  1404         context=get('unified', getter=ui.config))
  1405 
  1405 
  1406 def diff(repo, node1=None, node2=None, match=None, changes=None, opts=None,
  1406 def diff(repo, node1=None, node2=None, match=None, changes=None, opts=None,
  1407          losedatafn=None):
  1407          losedatafn=None, prefix=''):
  1408     '''yields diff of changes to files between two nodes, or node and
  1408     '''yields diff of changes to files between two nodes, or node and
  1409     working directory.
  1409     working directory.
  1410 
  1410 
  1411     if node1 is None, use first dirstate parent instead.
  1411     if node1 is None, use first dirstate parent instead.
  1412     if node2 is None, compare node1 with working directory.
  1412     if node2 is None, compare node1 with working directory.
  1416     patch format. Return False to upgrade to git patch format, True to
  1416     patch format. Return False to upgrade to git patch format, True to
  1417     accept the loss or raise an exception to abort the diff. It is
  1417     accept the loss or raise an exception to abort the diff. It is
  1418     called with the name of current file being diffed as 'fn'. If set
  1418     called with the name of current file being diffed as 'fn'. If set
  1419     to None, patches will always be upgraded to git format when
  1419     to None, patches will always be upgraded to git format when
  1420     necessary.
  1420     necessary.
       
  1421 
       
  1422     prefix is a filename prefix that is prepended to all filenames on
       
  1423     display (used for subrepos).
  1421     '''
  1424     '''
  1422 
  1425 
  1423     if opts is None:
  1426     if opts is None:
  1424         opts = mdiff.defaultopts
  1427         opts = mdiff.defaultopts
  1425 
  1428 
  1460     copy = {}
  1463     copy = {}
  1461     if opts.git or opts.upgrade:
  1464     if opts.git or opts.upgrade:
  1462         copy = copies.copies(repo, ctx1, ctx2, repo[nullid])[0]
  1465         copy = copies.copies(repo, ctx1, ctx2, repo[nullid])[0]
  1463 
  1466 
  1464     difffn = lambda opts, losedata: trydiff(repo, revs, ctx1, ctx2,
  1467     difffn = lambda opts, losedata: trydiff(repo, revs, ctx1, ctx2,
  1465                  modified, added, removed, copy, getfilectx, opts, losedata)
  1468                  modified, added, removed, copy, getfilectx, opts, losedata, prefix)
  1466     if opts.upgrade and not opts.git:
  1469     if opts.upgrade and not opts.git:
  1467         try:
  1470         try:
  1468             def losedata(fn):
  1471             def losedata(fn):
  1469                 if not losedatafn or not losedatafn(fn=fn):
  1472                 if not losedatafn or not losedatafn(fn=fn):
  1470                     raise GitDiffRequired()
  1473                     raise GitDiffRequired()
  1516     if omode != nmode:
  1519     if omode != nmode:
  1517         header.append('old mode %s\n' % omode)
  1520         header.append('old mode %s\n' % omode)
  1518         header.append('new mode %s\n' % nmode)
  1521         header.append('new mode %s\n' % nmode)
  1519 
  1522 
  1520 def trydiff(repo, revs, ctx1, ctx2, modified, added, removed,
  1523 def trydiff(repo, revs, ctx1, ctx2, modified, added, removed,
  1521             copy, getfilectx, opts, losedatafn):
  1524             copy, getfilectx, opts, losedatafn, prefix):
       
  1525 
       
  1526     def join(f):
       
  1527         return os.path.join(prefix, f)
  1522 
  1528 
  1523     date1 = util.datestr(ctx1.date())
  1529     date1 = util.datestr(ctx1.date())
  1524     man1 = ctx1.manifest()
  1530     man1 = ctx1.manifest()
  1525 
  1531 
  1526     gone = set()
  1532     gone = set()
  1555                         if a in removed and a not in gone:
  1561                         if a in removed and a not in gone:
  1556                             op = 'rename'
  1562                             op = 'rename'
  1557                             gone.add(a)
  1563                             gone.add(a)
  1558                         else:
  1564                         else:
  1559                             op = 'copy'
  1565                             op = 'copy'
  1560                         header.append('%s from %s\n' % (op, a))
  1566                         header.append('%s from %s\n' % (op, join(a)))
  1561                         header.append('%s to %s\n' % (op, f))
  1567                         header.append('%s to %s\n' % (op, join(f)))
  1562                         to = getfilectx(a, ctx1).data()
  1568                         to = getfilectx(a, ctx1).data()
  1563                     else:
  1569                     else:
  1564                         losedatafn(f)
  1570                         losedatafn(f)
  1565                 else:
  1571                 else:
  1566                     if opts.git:
  1572                     if opts.git:
  1598                     if binary:
  1604                     if binary:
  1599                         dodiff = 'binary'
  1605                         dodiff = 'binary'
  1600                 elif binary or nflag != oflag:
  1606                 elif binary or nflag != oflag:
  1601                     losedatafn(f)
  1607                     losedatafn(f)
  1602             if opts.git:
  1608             if opts.git:
  1603                 header.insert(0, mdiff.diffline(revs, a, b, opts))
  1609                 header.insert(0, mdiff.diffline(revs, join(a), join(b), opts))
  1604 
  1610 
  1605         if dodiff:
  1611         if dodiff:
  1606             if dodiff == 'binary':
  1612             if dodiff == 'binary':
  1607                 text = b85diff(to, tn)
  1613                 text = b85diff(to, tn)
  1608             else:
  1614             else:
  1609                 text = mdiff.unidiff(to, date1,
  1615                 text = mdiff.unidiff(to, date1,
  1610                                     # ctx2 date may be dynamic
  1616                                     # ctx2 date may be dynamic
  1611                                     tn, util.datestr(ctx2.date()),
  1617                                     tn, util.datestr(ctx2.date()),
  1612                                     a, b, revs, opts=opts)
  1618                                     join(a), join(b), revs, opts=opts)
  1613             if header and (text or len(header) > 1):
  1619             if header and (text or len(header) > 1):
  1614                 yield ''.join(header)
  1620                 yield ''.join(header)
  1615             if text:
  1621             if text:
  1616                 yield text
  1622                 yield text
  1617 
  1623