comparison mercurial/commands.py @ 30951: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
30950:7236f949ce3f 30951:f44b96aef81b
9 9
10 import difflib 10 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 _
18 from .node import ( 17 from .node import (
19 hex, 18 hex,
45 minirst, 44 minirst,
46 obsolete, 45 obsolete,
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,
54 smartset, 52 smartset,
55 sshserver, 53 sshserver,
1856 Returns 0 on success, 1 if errors are encountered. 1854 Returns 0 on success, 1 if errors are encountered.
1857 """ 1855 """
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)')),
2084 ('p', 'show-stage', [], 1862 ('p', 'show-stage', [],
2085 _('print parsed tree at the given stage'), _('NAME')), 1863 _('print parsed tree at the given stage'), _('NAME')),