##// END OF EJS Templates
diff: make use of output labeling
Brodie Rao -
r10818:d14d45fa default
parent child Browse files
Show More
@@ -1174,14 +1174,16 b' def diff(ui, repo, *pats, **opts):'
1174 diffopts = patch.diffopts(ui, opts)
1174 diffopts = patch.diffopts(ui, opts)
1175
1175
1176 m = cmdutil.match(repo, pats, opts)
1176 m = cmdutil.match(repo, pats, opts)
1177 it = patch.diff(repo, node1, node2, match=m, opts=diffopts)
1178 if stat:
1177 if stat:
1178 it = patch.diff(repo, node1, node2, match=m, opts=diffopts)
1179 width = ui.interactive() and util.termwidth() or 80
1179 width = ui.interactive() and util.termwidth() or 80
1180 ui.write(patch.diffstat(util.iterlines(it), width=width,
1180 for chunk, label in patch.diffstatui(util.iterlines(it), width=width,
1181 git=diffopts.git))
1181 git=diffopts.git):
1182 ui.write(chunk, label=label)
1182 else:
1183 else:
1183 for chunk in it:
1184 it = patch.diffui(repo, node1, node2, match=m, opts=diffopts)
1184 ui.write(chunk)
1185 for chunk, label in it:
1186 ui.write(chunk, label=label)
1185
1187
1186 def export(ui, repo, *changesets, **opts):
1188 def export(ui, repo, *changesets, **opts):
1187 """dump the header and diffs for one or more changesets
1189 """dump the header and diffs for one or more changesets
@@ -1466,6 +1466,43 b' def diff(repo, node1=None, node2=None, m'
1466 else:
1466 else:
1467 return difffn(opts, None)
1467 return difffn(opts, None)
1468
1468
1469 def difflabel(func, *args, **kw):
1470 '''yields 2-tuples of (output, label) based on the output of func()'''
1471 prefixes = [('diff', 'diff.diffline'),
1472 ('copy', 'diff.extended'),
1473 ('rename', 'diff.extended'),
1474 ('old', 'diff.extended'),
1475 ('new', 'diff.extended'),
1476 ('deleted', 'diff.extended'),
1477 ('---', 'diff.file_a'),
1478 ('+++', 'diff.file_b'),
1479 ('@@', 'diff.hunk'),
1480 ('-', 'diff.deleted'),
1481 ('+', 'diff.inserted')]
1482
1483 for chunk in func(*args, **kw):
1484 lines = chunk.split('\n')
1485 for i, line in enumerate(lines):
1486 if i != 0:
1487 yield ('\n', '')
1488 stripline = line
1489 if line and line[0] in '+-':
1490 # highlight trailing whitespace, but only in changed lines
1491 stripline = line.rstrip()
1492 for prefix, label in prefixes:
1493 if stripline.startswith(prefix):
1494 yield (stripline, label)
1495 break
1496 else:
1497 yield (line, '')
1498 if line != stripline:
1499 yield (line[len(stripline):], 'diff.trailingwhitespace')
1500
1501 def diffui(*args, **kw):
1502 '''like diff(), but yields 2-tuples of (output, label) for ui.write()'''
1503 return difflabel(diff, *args, **kw)
1504
1505
1469 def _addmodehdr(header, omode, nmode):
1506 def _addmodehdr(header, omode, nmode):
1470 if omode != nmode:
1507 if omode != nmode:
1471 header.append('old mode %s\n' % omode)
1508 header.append('old mode %s\n' % omode)
@@ -1636,3 +1673,22 b' def diffstat(lines, width=80, git=False)'
1636 % (len(stats), totaladds, totalremoves))
1673 % (len(stats), totaladds, totalremoves))
1637
1674
1638 return ''.join(output)
1675 return ''.join(output)
1676
1677 def diffstatui(*args, **kw):
1678 '''like diffstat(), but yields 2-tuples of (output, label) for
1679 ui.write()
1680 '''
1681
1682 for line in diffstat(*args, **kw).splitlines():
1683 if line and line[-1] in '+-':
1684 name, graph = line.rsplit(' ', 1)
1685 yield (name + ' ', '')
1686 m = re.search(r'\++', graph)
1687 if m:
1688 yield (m.group(0), 'diffstat.inserted')
1689 m = re.search(r'-+', graph)
1690 if m:
1691 yield (m.group(0), 'diffstat.deleted')
1692 else:
1693 yield (line, '')
1694 yield ('\n', '')
General Comments 0
You need to be logged in to leave comments. Login now