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 |