##// END OF EJS Templates
debugcommands: move 'debugrevlog' in the new module
Pierre-Yves David -
r30951:f44b96ae default
parent child Browse files
Show More
@@ -11,7 +11,6 import difflib
11 import errno
11 import errno
12 import os
12 import os
13 import re
13 import re
14 import string
15 import time
14 import time
16
15
17 from .i18n import _
16 from .i18n import _
@@ -47,7 +46,6 from . import (
47 patch,
46 patch,
48 phases,
47 phases,
49 pycompat,
48 pycompat,
50 revlog,
51 revset,
49 revset,
52 scmutil,
50 scmutil,
53 server,
51 server,
@@ -1858,226 +1856,6 def copy(ui, repo, *pats, **opts):
1858 with repo.wlock(False):
1856 with repo.wlock(False):
1859 return cmdutil.copy(ui, repo, pats, opts)
1857 return cmdutil.copy(ui, repo, pats, opts)
1860
1858
1861 @command('debugrevlog', debugrevlogopts +
1862 [('d', 'dump', False, _('dump index data'))],
1863 _('-c|-m|FILE'),
1864 optionalrepo=True)
1865 def debugrevlog(ui, repo, file_=None, **opts):
1866 """show data and statistics about a revlog"""
1867 r = cmdutil.openrevlog(repo, 'debugrevlog', file_, opts)
1868
1869 if opts.get("dump"):
1870 numrevs = len(r)
1871 ui.write(("# rev p1rev p2rev start end deltastart base p1 p2"
1872 " rawsize totalsize compression heads chainlen\n"))
1873 ts = 0
1874 heads = set()
1875
1876 for rev in xrange(numrevs):
1877 dbase = r.deltaparent(rev)
1878 if dbase == -1:
1879 dbase = rev
1880 cbase = r.chainbase(rev)
1881 clen = r.chainlen(rev)
1882 p1, p2 = r.parentrevs(rev)
1883 rs = r.rawsize(rev)
1884 ts = ts + rs
1885 heads -= set(r.parentrevs(rev))
1886 heads.add(rev)
1887 try:
1888 compression = ts / r.end(rev)
1889 except ZeroDivisionError:
1890 compression = 0
1891 ui.write("%5d %5d %5d %5d %5d %10d %4d %4d %4d %7d %9d "
1892 "%11d %5d %8d\n" %
1893 (rev, p1, p2, r.start(rev), r.end(rev),
1894 r.start(dbase), r.start(cbase),
1895 r.start(p1), r.start(p2),
1896 rs, ts, compression, len(heads), clen))
1897 return 0
1898
1899 v = r.version
1900 format = v & 0xFFFF
1901 flags = []
1902 gdelta = False
1903 if v & revlog.REVLOGNGINLINEDATA:
1904 flags.append('inline')
1905 if v & revlog.REVLOGGENERALDELTA:
1906 gdelta = True
1907 flags.append('generaldelta')
1908 if not flags:
1909 flags = ['(none)']
1910
1911 nummerges = 0
1912 numfull = 0
1913 numprev = 0
1914 nump1 = 0
1915 nump2 = 0
1916 numother = 0
1917 nump1prev = 0
1918 nump2prev = 0
1919 chainlengths = []
1920
1921 datasize = [None, 0, 0]
1922 fullsize = [None, 0, 0]
1923 deltasize = [None, 0, 0]
1924 chunktypecounts = {}
1925 chunktypesizes = {}
1926
1927 def addsize(size, l):
1928 if l[0] is None or size < l[0]:
1929 l[0] = size
1930 if size > l[1]:
1931 l[1] = size
1932 l[2] += size
1933
1934 numrevs = len(r)
1935 for rev in xrange(numrevs):
1936 p1, p2 = r.parentrevs(rev)
1937 delta = r.deltaparent(rev)
1938 if format > 0:
1939 addsize(r.rawsize(rev), datasize)
1940 if p2 != nullrev:
1941 nummerges += 1
1942 size = r.length(rev)
1943 if delta == nullrev:
1944 chainlengths.append(0)
1945 numfull += 1
1946 addsize(size, fullsize)
1947 else:
1948 chainlengths.append(chainlengths[delta] + 1)
1949 addsize(size, deltasize)
1950 if delta == rev - 1:
1951 numprev += 1
1952 if delta == p1:
1953 nump1prev += 1
1954 elif delta == p2:
1955 nump2prev += 1
1956 elif delta == p1:
1957 nump1 += 1
1958 elif delta == p2:
1959 nump2 += 1
1960 elif delta != nullrev:
1961 numother += 1
1962
1963 # Obtain data on the raw chunks in the revlog.
1964 chunk = r._chunkraw(rev, rev)[1]
1965 if chunk:
1966 chunktype = chunk[0]
1967 else:
1968 chunktype = 'empty'
1969
1970 if chunktype not in chunktypecounts:
1971 chunktypecounts[chunktype] = 0
1972 chunktypesizes[chunktype] = 0
1973
1974 chunktypecounts[chunktype] += 1
1975 chunktypesizes[chunktype] += size
1976
1977 # Adjust size min value for empty cases
1978 for size in (datasize, fullsize, deltasize):
1979 if size[0] is None:
1980 size[0] = 0
1981
1982 numdeltas = numrevs - numfull
1983 numoprev = numprev - nump1prev - nump2prev
1984 totalrawsize = datasize[2]
1985 datasize[2] /= numrevs
1986 fulltotal = fullsize[2]
1987 fullsize[2] /= numfull
1988 deltatotal = deltasize[2]
1989 if numrevs - numfull > 0:
1990 deltasize[2] /= numrevs - numfull
1991 totalsize = fulltotal + deltatotal
1992 avgchainlen = sum(chainlengths) / numrevs
1993 maxchainlen = max(chainlengths)
1994 compratio = 1
1995 if totalsize:
1996 compratio = totalrawsize / totalsize
1997
1998 basedfmtstr = '%%%dd\n'
1999 basepcfmtstr = '%%%dd %s(%%5.2f%%%%)\n'
2000
2001 def dfmtstr(max):
2002 return basedfmtstr % len(str(max))
2003 def pcfmtstr(max, padding=0):
2004 return basepcfmtstr % (len(str(max)), ' ' * padding)
2005
2006 def pcfmt(value, total):
2007 if total:
2008 return (value, 100 * float(value) / total)
2009 else:
2010 return value, 100.0
2011
2012 ui.write(('format : %d\n') % format)
2013 ui.write(('flags : %s\n') % ', '.join(flags))
2014
2015 ui.write('\n')
2016 fmt = pcfmtstr(totalsize)
2017 fmt2 = dfmtstr(totalsize)
2018 ui.write(('revisions : ') + fmt2 % numrevs)
2019 ui.write((' merges : ') + fmt % pcfmt(nummerges, numrevs))
2020 ui.write((' normal : ') + fmt % pcfmt(numrevs - nummerges, numrevs))
2021 ui.write(('revisions : ') + fmt2 % numrevs)
2022 ui.write((' full : ') + fmt % pcfmt(numfull, numrevs))
2023 ui.write((' deltas : ') + fmt % pcfmt(numdeltas, numrevs))
2024 ui.write(('revision size : ') + fmt2 % totalsize)
2025 ui.write((' full : ') + fmt % pcfmt(fulltotal, totalsize))
2026 ui.write((' deltas : ') + fmt % pcfmt(deltatotal, totalsize))
2027
2028 def fmtchunktype(chunktype):
2029 if chunktype == 'empty':
2030 return ' %s : ' % chunktype
2031 elif chunktype in string.ascii_letters:
2032 return ' 0x%s (%s) : ' % (hex(chunktype), chunktype)
2033 else:
2034 return ' 0x%s : ' % hex(chunktype)
2035
2036 ui.write('\n')
2037 ui.write(('chunks : ') + fmt2 % numrevs)
2038 for chunktype in sorted(chunktypecounts):
2039 ui.write(fmtchunktype(chunktype))
2040 ui.write(fmt % pcfmt(chunktypecounts[chunktype], numrevs))
2041 ui.write(('chunks size : ') + fmt2 % totalsize)
2042 for chunktype in sorted(chunktypecounts):
2043 ui.write(fmtchunktype(chunktype))
2044 ui.write(fmt % pcfmt(chunktypesizes[chunktype], totalsize))
2045
2046 ui.write('\n')
2047 fmt = dfmtstr(max(avgchainlen, compratio))
2048 ui.write(('avg chain length : ') + fmt % avgchainlen)
2049 ui.write(('max chain length : ') + fmt % maxchainlen)
2050 ui.write(('compression ratio : ') + fmt % compratio)
2051
2052 if format > 0:
2053 ui.write('\n')
2054 ui.write(('uncompressed data size (min/max/avg) : %d / %d / %d\n')
2055 % tuple(datasize))
2056 ui.write(('full revision size (min/max/avg) : %d / %d / %d\n')
2057 % tuple(fullsize))
2058 ui.write(('delta size (min/max/avg) : %d / %d / %d\n')
2059 % tuple(deltasize))
2060
2061 if numdeltas > 0:
2062 ui.write('\n')
2063 fmt = pcfmtstr(numdeltas)
2064 fmt2 = pcfmtstr(numdeltas, 4)
2065 ui.write(('deltas against prev : ') + fmt % pcfmt(numprev, numdeltas))
2066 if numprev > 0:
2067 ui.write((' where prev = p1 : ') + fmt2 % pcfmt(nump1prev,
2068 numprev))
2069 ui.write((' where prev = p2 : ') + fmt2 % pcfmt(nump2prev,
2070 numprev))
2071 ui.write((' other : ') + fmt2 % pcfmt(numoprev,
2072 numprev))
2073 if gdelta:
2074 ui.write(('deltas against p1 : ')
2075 + fmt % pcfmt(nump1, numdeltas))
2076 ui.write(('deltas against p2 : ')
2077 + fmt % pcfmt(nump2, numdeltas))
2078 ui.write(('deltas against other : ') + fmt % pcfmt(numother,
2079 numdeltas))
2080
2081 @command('debugrevspec',
1859 @command('debugrevspec',
2082 [('', 'optimize', None,
1860 [('', 'optimize', None,
2083 _('print parsed tree after optimizing (DEPRECATED)')),
1861 _('print parsed tree after optimizing (DEPRECATED)')),
@@ -12,6 +12,7 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
@@ -22,6 +23,7 from .node import (
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 (
@@ -1517,6 +1519,226 def debugrename(ui, repo, file1, *pats,
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')),
General Comments 0
You need to be logged in to leave comments. Login now