comparison mercurial/debugcommands.py @ 30971:f44b96aef81b

debugcommands: move 'debugrevlog' in the new module
author Pierre-Yves David <pierre-yves.david@ens-lyon.org>
date Thu, 02 Feb 2017 10:02:40 +0100
parents 7236f949ce3f
children 85c3c879c43a
comparison
equal deleted inserted replaced
30970:7236f949ce3f 30971:f44b96aef81b
10 import errno 10 import errno
11 import operator 11 import operator
12 import os 12 import os
13 import random 13 import random
14 import socket 14 import socket
15 import string
15 import sys 16 import sys
16 import tempfile 17 import tempfile
17 import time 18 import time
18 19
19 from .i18n import _ 20 from .i18n import _
20 from .node import ( 21 from .node import (
21 bin, 22 bin,
22 hex, 23 hex,
23 nullhex, 24 nullhex,
24 nullid, 25 nullid,
26 nullrev,
25 short, 27 short,
26 ) 28 )
27 from . import ( 29 from . import (
28 bundle2, 30 bundle2,
29 changegroup, 31 changegroup,
1515 if o: 1517 if o:
1516 ui.write(_("%s renamed from %s:%s\n") % (rel, o[0], hex(o[1]))) 1518 ui.write(_("%s renamed from %s:%s\n") % (rel, o[0], hex(o[1])))
1517 else: 1519 else:
1518 ui.write(_("%s not renamed\n") % rel) 1520 ui.write(_("%s not renamed\n") % rel)
1519 1521
1522 @command('debugrevlog', commands.debugrevlogopts +
1523 [('d', 'dump', False, _('dump index data'))],
1524 _('-c|-m|FILE'),
1525 optionalrepo=True)
1526 def debugrevlog(ui, repo, file_=None, **opts):
1527 """show data and statistics about a revlog"""
1528 r = cmdutil.openrevlog(repo, 'debugrevlog', file_, opts)
1529
1530 if opts.get("dump"):
1531 numrevs = len(r)
1532 ui.write(("# rev p1rev p2rev start end deltastart base p1 p2"
1533 " rawsize totalsize compression heads chainlen\n"))
1534 ts = 0
1535 heads = set()
1536
1537 for rev in xrange(numrevs):
1538 dbase = r.deltaparent(rev)
1539 if dbase == -1:
1540 dbase = rev
1541 cbase = r.chainbase(rev)
1542 clen = r.chainlen(rev)
1543 p1, p2 = r.parentrevs(rev)
1544 rs = r.rawsize(rev)
1545 ts = ts + rs
1546 heads -= set(r.parentrevs(rev))
1547 heads.add(rev)
1548 try:
1549 compression = ts / r.end(rev)
1550 except ZeroDivisionError:
1551 compression = 0
1552 ui.write("%5d %5d %5d %5d %5d %10d %4d %4d %4d %7d %9d "
1553 "%11d %5d %8d\n" %
1554 (rev, p1, p2, r.start(rev), r.end(rev),
1555 r.start(dbase), r.start(cbase),
1556 r.start(p1), r.start(p2),
1557 rs, ts, compression, len(heads), clen))
1558 return 0
1559
1560 v = r.version
1561 format = v & 0xFFFF
1562 flags = []
1563 gdelta = False
1564 if v & revlog.REVLOGNGINLINEDATA:
1565 flags.append('inline')
1566 if v & revlog.REVLOGGENERALDELTA:
1567 gdelta = True
1568 flags.append('generaldelta')
1569 if not flags:
1570 flags = ['(none)']
1571
1572 nummerges = 0
1573 numfull = 0
1574 numprev = 0
1575 nump1 = 0
1576 nump2 = 0
1577 numother = 0
1578 nump1prev = 0
1579 nump2prev = 0
1580 chainlengths = []
1581
1582 datasize = [None, 0, 0]
1583 fullsize = [None, 0, 0]
1584 deltasize = [None, 0, 0]
1585 chunktypecounts = {}
1586 chunktypesizes = {}
1587
1588 def addsize(size, l):
1589 if l[0] is None or size < l[0]:
1590 l[0] = size
1591 if size > l[1]:
1592 l[1] = size
1593 l[2] += size
1594
1595 numrevs = len(r)
1596 for rev in xrange(numrevs):
1597 p1, p2 = r.parentrevs(rev)
1598 delta = r.deltaparent(rev)
1599 if format > 0:
1600 addsize(r.rawsize(rev), datasize)
1601 if p2 != nullrev:
1602 nummerges += 1
1603 size = r.length(rev)
1604 if delta == nullrev:
1605 chainlengths.append(0)
1606 numfull += 1
1607 addsize(size, fullsize)
1608 else:
1609 chainlengths.append(chainlengths[delta] + 1)
1610 addsize(size, deltasize)
1611 if delta == rev - 1:
1612 numprev += 1
1613 if delta == p1:
1614 nump1prev += 1
1615 elif delta == p2:
1616 nump2prev += 1
1617 elif delta == p1:
1618 nump1 += 1
1619 elif delta == p2:
1620 nump2 += 1
1621 elif delta != nullrev:
1622 numother += 1
1623
1624 # Obtain data on the raw chunks in the revlog.
1625 chunk = r._chunkraw(rev, rev)[1]
1626 if chunk:
1627 chunktype = chunk[0]
1628 else:
1629 chunktype = 'empty'
1630
1631 if chunktype not in chunktypecounts:
1632 chunktypecounts[chunktype] = 0
1633 chunktypesizes[chunktype] = 0
1634
1635 chunktypecounts[chunktype] += 1
1636 chunktypesizes[chunktype] += size
1637
1638 # Adjust size min value for empty cases
1639 for size in (datasize, fullsize, deltasize):
1640 if size[0] is None:
1641 size[0] = 0
1642
1643 numdeltas = numrevs - numfull
1644 numoprev = numprev - nump1prev - nump2prev
1645 totalrawsize = datasize[2]
1646 datasize[2] /= numrevs
1647 fulltotal = fullsize[2]
1648 fullsize[2] /= numfull
1649 deltatotal = deltasize[2]
1650 if numrevs - numfull > 0:
1651 deltasize[2] /= numrevs - numfull
1652 totalsize = fulltotal + deltatotal
1653 avgchainlen = sum(chainlengths) / numrevs
1654 maxchainlen = max(chainlengths)
1655 compratio = 1
1656 if totalsize:
1657 compratio = totalrawsize / totalsize
1658
1659 basedfmtstr = '%%%dd\n'
1660 basepcfmtstr = '%%%dd %s(%%5.2f%%%%)\n'
1661
1662 def dfmtstr(max):
1663 return basedfmtstr % len(str(max))
1664 def pcfmtstr(max, padding=0):
1665 return basepcfmtstr % (len(str(max)), ' ' * padding)
1666
1667 def pcfmt(value, total):
1668 if total:
1669 return (value, 100 * float(value) / total)
1670 else:
1671 return value, 100.0
1672
1673 ui.write(('format : %d\n') % format)
1674 ui.write(('flags : %s\n') % ', '.join(flags))
1675
1676 ui.write('\n')
1677 fmt = pcfmtstr(totalsize)
1678 fmt2 = dfmtstr(totalsize)
1679 ui.write(('revisions : ') + fmt2 % numrevs)
1680 ui.write((' merges : ') + fmt % pcfmt(nummerges, numrevs))
1681 ui.write((' normal : ') + fmt % pcfmt(numrevs - nummerges, numrevs))
1682 ui.write(('revisions : ') + fmt2 % numrevs)
1683 ui.write((' full : ') + fmt % pcfmt(numfull, numrevs))
1684 ui.write((' deltas : ') + fmt % pcfmt(numdeltas, numrevs))
1685 ui.write(('revision size : ') + fmt2 % totalsize)
1686 ui.write((' full : ') + fmt % pcfmt(fulltotal, totalsize))
1687 ui.write((' deltas : ') + fmt % pcfmt(deltatotal, totalsize))
1688
1689 def fmtchunktype(chunktype):
1690 if chunktype == 'empty':
1691 return ' %s : ' % chunktype
1692 elif chunktype in string.ascii_letters:
1693 return ' 0x%s (%s) : ' % (hex(chunktype), chunktype)
1694 else:
1695 return ' 0x%s : ' % hex(chunktype)
1696
1697 ui.write('\n')
1698 ui.write(('chunks : ') + fmt2 % numrevs)
1699 for chunktype in sorted(chunktypecounts):
1700 ui.write(fmtchunktype(chunktype))
1701 ui.write(fmt % pcfmt(chunktypecounts[chunktype], numrevs))
1702 ui.write(('chunks size : ') + fmt2 % totalsize)
1703 for chunktype in sorted(chunktypecounts):
1704 ui.write(fmtchunktype(chunktype))
1705 ui.write(fmt % pcfmt(chunktypesizes[chunktype], totalsize))
1706
1707 ui.write('\n')
1708 fmt = dfmtstr(max(avgchainlen, compratio))
1709 ui.write(('avg chain length : ') + fmt % avgchainlen)
1710 ui.write(('max chain length : ') + fmt % maxchainlen)
1711 ui.write(('compression ratio : ') + fmt % compratio)
1712
1713 if format > 0:
1714 ui.write('\n')
1715 ui.write(('uncompressed data size (min/max/avg) : %d / %d / %d\n')
1716 % tuple(datasize))
1717 ui.write(('full revision size (min/max/avg) : %d / %d / %d\n')
1718 % tuple(fullsize))
1719 ui.write(('delta size (min/max/avg) : %d / %d / %d\n')
1720 % tuple(deltasize))
1721
1722 if numdeltas > 0:
1723 ui.write('\n')
1724 fmt = pcfmtstr(numdeltas)
1725 fmt2 = pcfmtstr(numdeltas, 4)
1726 ui.write(('deltas against prev : ') + fmt % pcfmt(numprev, numdeltas))
1727 if numprev > 0:
1728 ui.write((' where prev = p1 : ') + fmt2 % pcfmt(nump1prev,
1729 numprev))
1730 ui.write((' where prev = p2 : ') + fmt2 % pcfmt(nump2prev,
1731 numprev))
1732 ui.write((' other : ') + fmt2 % pcfmt(numoprev,
1733 numprev))
1734 if gdelta:
1735 ui.write(('deltas against p1 : ')
1736 + fmt % pcfmt(nump1, numdeltas))
1737 ui.write(('deltas against p2 : ')
1738 + fmt % pcfmt(nump2, numdeltas))
1739 ui.write(('deltas against other : ') + fmt % pcfmt(numother,
1740 numdeltas))
1741
1520 @command('debugupgraderepo', [ 1742 @command('debugupgraderepo', [
1521 ('o', 'optimize', [], _('extra optimization to perform'), _('NAME')), 1743 ('o', 'optimize', [], _('extra optimization to perform'), _('NAME')),
1522 ('', 'run', False, _('performs an upgrade')), 1744 ('', 'run', False, _('performs an upgrade')),
1523 ]) 1745 ])
1524 def debugupgraderepo(ui, repo, run=False, optimize=None): 1746 def debugupgraderepo(ui, repo, run=False, optimize=None):