mercurial/debugcommands.py
changeset 30951 f44b96aef81b
parent 30950 7236f949ce3f
child 30952 85c3c879c43a
equal deleted inserted replaced
30950:7236f949ce3f 30951: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):