comparison mercurial/patch.py @ 14402:f03f08240c32

patch: use diffstatsum in diffstat
author Matt Mackall <mpm@selenic.com>
date Sat, 21 May 2011 15:06:38 -0500
parents 7bb7be1c1385
children 0174d1f79280
comparison
equal deleted inserted replaced
14401:7bb7be1c1385 14402:f03f08240c32
1719 addresult() 1719 addresult()
1720 return results 1720 return results
1721 1721
1722 def diffstat(lines, width=80, git=False): 1722 def diffstat(lines, width=80, git=False):
1723 output = [] 1723 output = []
1724 stats = list(diffstatdata(lines)) 1724 stats = diffstatdata(lines)
1725 1725 maxname, totaladds, totalremoves, hasbinary = diffstatsum(stats)
1726 maxtotal, maxname = 0, 0 1726 maxtotal = totaladds + totalremoves
1727 totaladds, totalremoves = 0, 0
1728 hasbinary = False
1729
1730 sized = [(filename, adds, removes, isbinary, encoding.colwidth(filename))
1731 for filename, adds, removes, isbinary in stats]
1732
1733 for filename, adds, removes, isbinary, namewidth in sized:
1734 totaladds += adds
1735 totalremoves += removes
1736 maxname = max(maxname, namewidth)
1737 maxtotal = max(maxtotal, adds + removes)
1738 if isbinary:
1739 hasbinary = True
1740 1727
1741 countwidth = len(str(maxtotal)) 1728 countwidth = len(str(maxtotal))
1742 if hasbinary and countwidth < 3: 1729 if hasbinary and countwidth < 3:
1743 countwidth = 3 1730 countwidth = 3
1744 graphwidth = width - countwidth - maxname - 6 1731 graphwidth = width - countwidth - maxname - 6
1751 # If diffstat runs out of room it doesn't print anything, 1738 # If diffstat runs out of room it doesn't print anything,
1752 # which isn't very useful, so always print at least one + or - 1739 # which isn't very useful, so always print at least one + or -
1753 # if there were at least some changes. 1740 # if there were at least some changes.
1754 return max(i * graphwidth // maxtotal, int(bool(i))) 1741 return max(i * graphwidth // maxtotal, int(bool(i)))
1755 1742
1756 for filename, adds, removes, isbinary, namewidth in sized: 1743 for filename, adds, removes, isbinary in stats:
1757 if git and isbinary: 1744 if git and isbinary:
1758 count = 'Bin' 1745 count = 'Bin'
1759 else: 1746 else:
1760 count = adds + removes 1747 count = adds + removes
1761 pluses = '+' * scale(adds) 1748 pluses = '+' * scale(adds)
1762 minuses = '-' * scale(removes) 1749 minuses = '-' * scale(removes)
1763 output.append(' %s%s | %*s %s%s\n' % 1750 output.append(' %s%s | %*s %s%s\n' %
1764 (filename, ' ' * (maxname - namewidth), 1751 (filename, ' ' * (maxname - encoding.colwidth(filename)),
1765 countwidth, count, 1752 countwidth, count, pluses, minuses))
1766 pluses, minuses))
1767 1753
1768 if stats: 1754 if stats:
1769 output.append(_(' %d files changed, %d insertions(+), %d deletions(-)\n') 1755 output.append(_(' %d files changed, %d insertions(+), %d deletions(-)\n')
1770 % (len(stats), totaladds, totalremoves)) 1756 % (len(stats), totaladds, totalremoves))
1771 1757