Mercurial > public > mercurial-scm > hg-stable
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): |