Mercurial > public > mercurial-scm > hg
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')), |