mercurial/debugcommands.py
changeset 43080 86e4daa2d54c
parent 43077 687b865b95ad
child 43085 eef9a2d67051
equal deleted inserted replaced
43079:5209fc94b982 43080:86e4daa2d54c
   302 
   302 
   303 
   303 
   304 def _debugchangegroup(ui, gen, all=None, indent=0, **opts):
   304 def _debugchangegroup(ui, gen, all=None, indent=0, **opts):
   305     indent_string = b' ' * indent
   305     indent_string = b' ' * indent
   306     if all:
   306     if all:
   307         ui.write(
   307         ui.writenoi18n(
   308             b"%sformat: id, p1, p2, cset, delta base, len(delta)\n"
   308             b"%sformat: id, p1, p2, cset, delta base, len(delta)\n"
   309             % indent_string
   309             % indent_string
   310         )
   310         )
   311 
   311 
   312         def showchunks(named):
   312         def showchunks(named):
   436 def debugcapabilities(ui, path, **opts):
   436 def debugcapabilities(ui, path, **opts):
   437     """lists the capabilities of a remote peer"""
   437     """lists the capabilities of a remote peer"""
   438     opts = pycompat.byteskwargs(opts)
   438     opts = pycompat.byteskwargs(opts)
   439     peer = hg.peer(ui, opts, path)
   439     peer = hg.peer(ui, opts, path)
   440     caps = peer.capabilities()
   440     caps = peer.capabilities()
   441     ui.write(b'Main capabilities:\n')
   441     ui.writenoi18n(b'Main capabilities:\n')
   442     for c in sorted(caps):
   442     for c in sorted(caps):
   443         ui.write(b'  %s\n' % c)
   443         ui.write(b'  %s\n' % c)
   444     b2caps = bundle2.bundle2caps(peer)
   444     b2caps = bundle2.bundle2caps(peer)
   445     if b2caps:
   445     if b2caps:
   446         ui.write(b'Bundle2 capabilities:\n')
   446         ui.writenoi18n(b'Bundle2 capabilities:\n')
   447         for key, values in sorted(b2caps.iteritems()):
   447         for key, values in sorted(b2caps.iteritems()):
   448             ui.write(b'  %s\n' % key)
   448             ui.write(b'  %s\n' % key)
   449             for v in values:
   449             for v in values:
   450                 ui.write(b'    %s\n' % v)
   450                 ui.write(b'    %s\n' % v)
   451 
   451 
   485     [(b'', b'style', None, _(b'show all configured styles'))],
   485     [(b'', b'style', None, _(b'show all configured styles'))],
   486     b'hg debugcolor',
   486     b'hg debugcolor',
   487 )
   487 )
   488 def debugcolor(ui, repo, **opts):
   488 def debugcolor(ui, repo, **opts):
   489     """show available color, effects or style"""
   489     """show available color, effects or style"""
   490     ui.write(b'color mode: %s\n' % stringutil.pprint(ui._colormode))
   490     ui.writenoi18n(b'color mode: %s\n' % stringutil.pprint(ui._colormode))
   491     if opts.get(r'style'):
   491     if opts.get(r'style'):
   492         return _debugdisplaystyle(ui)
   492         return _debugdisplaystyle(ui)
   493     else:
   493     else:
   494         return _debugdisplaycolor(ui)
   494         return _debugdisplaycolor(ui)
   495 
   495 
   649     """parse and display a date"""
   649     """parse and display a date"""
   650     if opts[r"extended"]:
   650     if opts[r"extended"]:
   651         d = dateutil.parsedate(date, util.extendeddateformats)
   651         d = dateutil.parsedate(date, util.extendeddateformats)
   652     else:
   652     else:
   653         d = dateutil.parsedate(date)
   653         d = dateutil.parsedate(date)
   654     ui.write(b"internal: %d %d\n" % d)
   654     ui.writenoi18n(b"internal: %d %d\n" % d)
   655     ui.write(b"standard: %s\n" % dateutil.datestr(d))
   655     ui.writenoi18n(b"standard: %s\n" % dateutil.datestr(d))
   656     if range:
   656     if range:
   657         m = dateutil.matchdate(range)
   657         m = dateutil.matchdate(range)
   658         ui.write(b"match: %s\n" % m(d[0]))
   658         ui.writenoi18n(b"match: %s\n" % m(d[0]))
   659 
   659 
   660 
   660 
   661 @command(
   661 @command(
   662     b'debugdeltachain',
   662     b'debugdeltachain',
   663     cmdutil.debugrevlogopts + cmdutil.formatteropts,
   663     cmdutil.debugrevlogopts + cmdutil.formatteropts,
   920             common, _in, hds = treediscovery.findcommonincoming(
   920             common, _in, hds = treediscovery.findcommonincoming(
   921                 repo, remote, force=True
   921                 repo, remote, force=True
   922             )
   922             )
   923             common = set(common)
   923             common = set(common)
   924             if not opts.get(b'nonheads'):
   924             if not opts.get(b'nonheads'):
   925                 ui.write(
   925                 ui.writenoi18n(
   926                     b"unpruned common: %s\n"
   926                     b"unpruned common: %s\n"
   927                     % b" ".join(sorted(short(n) for n in common))
   927                     % b" ".join(sorted(short(n) for n in common))
   928                 )
   928                 )
   929 
   929 
   930                 clnode = repo.changelog.node
   930                 clnode = repo.changelog.node
   967     data[b'nb-revs'] = len(repo.revs(b'all()'))
   967     data[b'nb-revs'] = len(repo.revs(b'all()'))
   968     data[b'nb-revs-common'] = len(repo.revs(b'::%ln', common))
   968     data[b'nb-revs-common'] = len(repo.revs(b'::%ln', common))
   969     data[b'nb-revs-missing'] = data[b'nb-revs'] - data[b'nb-revs-common']
   969     data[b'nb-revs-missing'] = data[b'nb-revs'] - data[b'nb-revs-common']
   970 
   970 
   971     # display discovery summary
   971     # display discovery summary
   972     ui.write(b"elapsed time:  %(elapsed)f seconds\n" % data)
   972     ui.writenoi18n(b"elapsed time:  %(elapsed)f seconds\n" % data)
   973     ui.write(b"heads summary:\n")
   973     ui.writenoi18n(b"heads summary:\n")
   974     ui.write(b"  total common heads:  %(nb-common)9d\n" % data)
   974     ui.writenoi18n(b"  total common heads:  %(nb-common)9d\n" % data)
   975     ui.write(b"    also local heads:  %(nb-common-local)9d\n" % data)
   975     ui.writenoi18n(b"    also local heads:  %(nb-common-local)9d\n" % data)
   976     ui.write(b"    also remote heads: %(nb-common-remote)9d\n" % data)
   976     ui.writenoi18n(b"    also remote heads: %(nb-common-remote)9d\n" % data)
   977     ui.write(b"    both:              %(nb-common-both)9d\n" % data)
   977     ui.writenoi18n(b"    both:              %(nb-common-both)9d\n" % data)
   978     ui.write(b"  local heads:         %(nb-local)9d\n" % data)
   978     ui.writenoi18n(b"  local heads:         %(nb-local)9d\n" % data)
   979     ui.write(b"    common:            %(nb-common-local)9d\n" % data)
   979     ui.writenoi18n(b"    common:            %(nb-common-local)9d\n" % data)
   980     ui.write(b"    missing:           %(nb-local-missing)9d\n" % data)
   980     ui.writenoi18n(b"    missing:           %(nb-local-missing)9d\n" % data)
   981     ui.write(b"  remote heads:        %(nb-remote)9d\n" % data)
   981     ui.writenoi18n(b"  remote heads:        %(nb-remote)9d\n" % data)
   982     ui.write(b"    common:            %(nb-common-remote)9d\n" % data)
   982     ui.writenoi18n(b"    common:            %(nb-common-remote)9d\n" % data)
   983     ui.write(b"    unknown:           %(nb-remote-unknown)9d\n" % data)
   983     ui.writenoi18n(b"    unknown:           %(nb-remote-unknown)9d\n" % data)
   984     ui.write(b"local changesets:      %(nb-revs)9d\n" % data)
   984     ui.writenoi18n(b"local changesets:      %(nb-revs)9d\n" % data)
   985     ui.write(b"  common:              %(nb-revs-common)9d\n" % data)
   985     ui.writenoi18n(b"  common:              %(nb-revs-common)9d\n" % data)
   986     ui.write(b"  missing:             %(nb-revs-missing)9d\n" % data)
   986     ui.writenoi18n(b"  missing:             %(nb-revs-missing)9d\n" % data)
   987 
   987 
   988     if ui.verbose:
   988     if ui.verbose:
   989         ui.write(
   989         ui.writenoi18n(
   990             b"common heads: %s\n" % b" ".join(sorted(short(n) for n in common))
   990             b"common heads: %s\n" % b" ".join(sorted(short(n) for n in common))
   991         )
   991         )
   992 
   992 
   993 
   993 
   994 _chunksize = 4 << 10
   994 _chunksize = 4 << 10
  1161         files.update(ctx.files())
  1161         files.update(ctx.files())
  1162         files.update(ctx.substate)
  1162         files.update(ctx.substate)
  1163 
  1163 
  1164     m = ctx.matchfileset(expr)
  1164     m = ctx.matchfileset(expr)
  1165     if opts[b'show_matcher'] or (opts[b'show_matcher'] is None and ui.verbose):
  1165     if opts[b'show_matcher'] or (opts[b'show_matcher'] is None and ui.verbose):
  1166         ui.write(b'* matcher:\n', stringutil.prettyrepr(m), b'\n')
  1166         ui.writenoi18n(b'* matcher:\n', stringutil.prettyrepr(m), b'\n')
  1167     for f in sorted(files):
  1167     for f in sorted(files):
  1168         if not m(f):
  1168         if not m(f):
  1169             continue
  1169             continue
  1170         ui.write(b"%s\n" % f)
  1170         ui.write(b"%s\n" % f)
  1171 
  1171 
  1243 
  1243 
  1244 
  1244 
  1245 @command(b'debugfsinfo', [], _(b'[PATH]'), norepo=True)
  1245 @command(b'debugfsinfo', [], _(b'[PATH]'), norepo=True)
  1246 def debugfsinfo(ui, path=b"."):
  1246 def debugfsinfo(ui, path=b"."):
  1247     """show information detected about current filesystem"""
  1247     """show information detected about current filesystem"""
  1248     ui.write(b'path: %s\n' % path)
  1248     ui.writenoi18n(b'path: %s\n' % path)
  1249     ui.write(b'mounted on: %s\n' % (util.getfsmountpoint(path) or b'(unknown)'))
  1249     ui.writenoi18n(b'mounted on: %s\n' % (util.getfsmountpoint(path) or b'(unknown)'))
  1250     ui.write(b'exec: %s\n' % (util.checkexec(path) and b'yes' or b'no'))
  1250     ui.writenoi18n(b'exec: %s\n' % (util.checkexec(path) and b'yes' or b'no'))
  1251     ui.write(b'fstype: %s\n' % (util.getfstype(path) or b'(unknown)'))
  1251     ui.writenoi18n(b'fstype: %s\n' % (util.getfstype(path) or b'(unknown)'))
  1252     ui.write(b'symlink: %s\n' % (util.checklink(path) and b'yes' or b'no'))
  1252     ui.writenoi18n(b'symlink: %s\n' % (util.checklink(path) and b'yes' or b'no'))
  1253     ui.write(b'hardlink: %s\n' % (util.checknlink(path) and b'yes' or b'no'))
  1253     ui.writenoi18n(b'hardlink: %s\n' % (util.checknlink(path) and b'yes' or b'no'))
  1254     casesensitive = b'(unknown)'
  1254     casesensitive = b'(unknown)'
  1255     try:
  1255     try:
  1256         with pycompat.namedtempfile(prefix=b'.debugfsinfo', dir=path) as f:
  1256         with pycompat.namedtempfile(prefix=b'.debugfsinfo', dir=path) as f:
  1257             casesensitive = util.fscasesensitive(f.name) and b'yes' or b'no'
  1257             casesensitive = util.fscasesensitive(f.name) and b'yes' or b'no'
  1258     except OSError:
  1258     except OSError:
  1259         pass
  1259         pass
  1260     ui.write(b'case-sensitive: %s\n' % casesensitive)
  1260     ui.writenoi18n(b'case-sensitive: %s\n' % casesensitive)
  1261 
  1261 
  1262 
  1262 
  1263 @command(
  1263 @command(
  1264     b'debuggetbundle',
  1264     b'debuggetbundle',
  1265     [
  1265     [
  1407 )
  1407 )
  1408 def debugindexdot(ui, repo, file_=None, **opts):
  1408 def debugindexdot(ui, repo, file_=None, **opts):
  1409     """dump an index DAG as a graphviz dot file"""
  1409     """dump an index DAG as a graphviz dot file"""
  1410     opts = pycompat.byteskwargs(opts)
  1410     opts = pycompat.byteskwargs(opts)
  1411     r = cmdutil.openstorage(repo, b'debugindexdot', file_, opts)
  1411     r = cmdutil.openstorage(repo, b'debugindexdot', file_, opts)
  1412     ui.write(b"digraph G {\n")
  1412     ui.writenoi18n(b"digraph G {\n")
  1413     for i in r:
  1413     for i in r:
  1414         node = r.node(i)
  1414         node = r.node(i)
  1415         pp = r.parents(node)
  1415         pp = r.parents(node)
  1416         ui.write(b"\t%d -> %d\n" % (r.rev(pp[0]), i))
  1416         ui.write(b"\t%d -> %d\n" % (r.rev(pp[0]), i))
  1417         if pp[1] != nullid:
  1417         if pp[1] != nullid:
  1816                         locker = b'user %s, process %s, host %s' % (
  1816                         locker = b'user %s, process %s, host %s' % (
  1817                             user or b'None',
  1817                             user or b'None',
  1818                             pid,
  1818                             pid,
  1819                             host,
  1819                             host,
  1820                         )
  1820                         )
  1821                 ui.write(b"%-6s %s (%ds)\n" % (name + b":", locker, age))
  1821                 ui.writenoi18n(b"%-6s %s (%ds)\n" % (name + b":", locker, age))
  1822                 return 1
  1822                 return 1
  1823             except OSError as e:
  1823             except OSError as e:
  1824                 if e.errno != errno.ENOENT:
  1824                 if e.errno != errno.ENOENT:
  1825                     raise
  1825                     raise
  1826 
  1826 
  1827         ui.write(b"%-6s free\n" % (name + b":"))
  1827         ui.writenoi18n(b"%-6s free\n" % (name + b":"))
  1828         return 0
  1828         return 0
  1829 
  1829 
  1830     held += report(repo.svfs, b"lock", repo.lock)
  1830     held += report(repo.svfs, b"lock", repo.lock)
  1831     held += report(repo.vfs, b"wlock", repo.wlock)
  1831     held += report(repo.vfs, b"wlock", repo.wlock)
  1832 
  1832 
  1918             return b'null'
  1918             return b'null'
  1919         else:
  1919         else:
  1920             return h
  1920             return h
  1921 
  1921 
  1922     def printrecords(version):
  1922     def printrecords(version):
  1923         ui.write(b'* version %d records\n' % version)
  1923         ui.writenoi18n(b'* version %d records\n' % version)
  1924         if version == 1:
  1924         if version == 1:
  1925             records = v1records
  1925             records = v1records
  1926         else:
  1926         else:
  1927             records = v2records
  1927             records = v2records
  1928 
  1928 
  1929         for rtype, record in records:
  1929         for rtype, record in records:
  1930             # pretty print some record types
  1930             # pretty print some record types
  1931             if rtype == b'L':
  1931             if rtype == b'L':
  1932                 ui.write(b'local: %s\n' % record)
  1932                 ui.writenoi18n(b'local: %s\n' % record)
  1933             elif rtype == b'O':
  1933             elif rtype == b'O':
  1934                 ui.write(b'other: %s\n' % record)
  1934                 ui.writenoi18n(b'other: %s\n' % record)
  1935             elif rtype == b'm':
  1935             elif rtype == b'm':
  1936                 driver, mdstate = record.split(b'\0', 1)
  1936                 driver, mdstate = record.split(b'\0', 1)
  1937                 ui.write(b'merge driver: %s (state "%s")\n' % (driver, mdstate))
  1937                 ui.writenoi18n(b'merge driver: %s (state "%s")\n' % (driver, mdstate))
  1938             elif rtype in b'FDC':
  1938             elif rtype in b'FDC':
  1939                 r = record.split(b'\0')
  1939                 r = record.split(b'\0')
  1940                 f, state, hash, lfile, afile, anode, ofile = r[0:7]
  1940                 f, state, hash, lfile, afile, anode, ofile = r[0:7]
  1941                 if version == 1:
  1941                 if version == 1:
  1942                     onode = b'not stored in v1 format'
  1942                     onode = b'not stored in v1 format'
  1943                     flags = r[7]
  1943                     flags = r[7]
  1944                 else:
  1944                 else:
  1945                     onode, flags = r[7:9]
  1945                     onode, flags = r[7:9]
  1946                 ui.write(
  1946                 ui.writenoi18n(
  1947                     b'file: %s (record type "%s", state "%s", hash %s)\n'
  1947                     b'file: %s (record type "%s", state "%s", hash %s)\n'
  1948                     % (f, rtype, state, _hashornull(hash))
  1948                     % (f, rtype, state, _hashornull(hash))
  1949                 )
  1949                 )
  1950                 ui.write(b'  local path: %s (flags "%s")\n' % (lfile, flags))
  1950                 ui.writenoi18n(b'  local path: %s (flags "%s")\n' % (lfile, flags))
  1951                 ui.write(
  1951                 ui.writenoi18n(
  1952                     b'  ancestor path: %s (node %s)\n'
  1952                     b'  ancestor path: %s (node %s)\n'
  1953                     % (afile, _hashornull(anode))
  1953                     % (afile, _hashornull(anode))
  1954                 )
  1954                 )
  1955                 ui.write(
  1955                 ui.writenoi18n(
  1956                     b'  other path: %s (node %s)\n'
  1956                     b'  other path: %s (node %s)\n'
  1957                     % (ofile, _hashornull(onode))
  1957                     % (ofile, _hashornull(onode))
  1958                 )
  1958                 )
  1959             elif rtype == b'f':
  1959             elif rtype == b'f':
  1960                 filename, rawextras = record.split(b'\0', 1)
  1960                 filename, rawextras = record.split(b'\0', 1)
  1963                 extrastrings = []
  1963                 extrastrings = []
  1964                 while i < len(extras):
  1964                 while i < len(extras):
  1965                     extrastrings.append(b'%s = %s' % (extras[i], extras[i + 1]))
  1965                     extrastrings.append(b'%s = %s' % (extras[i], extras[i + 1]))
  1966                     i += 2
  1966                     i += 2
  1967 
  1967 
  1968                 ui.write(
  1968                 ui.writenoi18n(
  1969                     b'file extras: %s (%s)\n'
  1969                     b'file extras: %s (%s)\n'
  1970                     % (filename, b', '.join(extrastrings))
  1970                     % (filename, b', '.join(extrastrings))
  1971                 )
  1971                 )
  1972             elif rtype == b'l':
  1972             elif rtype == b'l':
  1973                 labels = record.split(b'\0', 2)
  1973                 labels = record.split(b'\0', 2)
  1974                 labels = [l for l in labels if len(l) > 0]
  1974                 labels = [l for l in labels if len(l) > 0]
  1975                 ui.write(b'labels:\n')
  1975                 ui.writenoi18n(b'labels:\n')
  1976                 ui.write((b'  local: %s\n' % labels[0]))
  1976                 ui.write((b'  local: %s\n' % labels[0]))
  1977                 ui.write((b'  other: %s\n' % labels[1]))
  1977                 ui.write((b'  other: %s\n' % labels[1]))
  1978                 if len(labels) > 2:
  1978                 if len(labels) > 2:
  1979                     ui.write((b'  base:  %s\n' % labels[2]))
  1979                     ui.write((b'  base:  %s\n' % labels[2]))
  1980             else:
  1980             else:
  1981                 ui.write(
  1981                 ui.writenoi18n(
  1982                     b'unrecognized entry: %s\t%s\n'
  1982                     b'unrecognized entry: %s\t%s\n'
  1983                     % (rtype, record.replace(b'\0', b'\t'))
  1983                     % (rtype, record.replace(b'\0', b'\t'))
  1984                 )
  1984                 )
  1985 
  1985 
  1986     # Avoid mergestate.read() since it may raise an exception for unsupported
  1986     # Avoid mergestate.read() since it may raise an exception for unsupported
  2002 
  2002 
  2003     v1records.sort(key=key)
  2003     v1records.sort(key=key)
  2004     v2records.sort(key=key)
  2004     v2records.sort(key=key)
  2005 
  2005 
  2006     if not v1records and not v2records:
  2006     if not v1records and not v2records:
  2007         ui.write(b'no merge state found\n')
  2007         ui.writenoi18n(b'no merge state found\n')
  2008     elif not v2records:
  2008     elif not v2records:
  2009         ui.note(b'no version 2 merge state\n')
  2009         ui.notenoi18n(b'no version 2 merge state\n')
  2010         printrecords(1)
  2010         printrecords(1)
  2011     elif ms._v1v2match(v1records, v2records):
  2011     elif ms._v1v2match(v1records, v2records):
  2012         ui.note(b'v1 and v2 states match: using v2\n')
  2012         ui.notenoi18n(b'v1 and v2 states match: using v2\n')
  2013         printrecords(2)
  2013         printrecords(2)
  2014     else:
  2014     else:
  2015         ui.note(b'v1 and v2 states mismatch: using v1\n')
  2015         ui.notenoi18n(b'v1 and v2 states mismatch: using v1\n')
  2016         printrecords(1)
  2016         printrecords(1)
  2017         if ui.verbose:
  2017         if ui.verbose:
  2018             printrecords(2)
  2018             printrecords(2)
  2019 
  2019 
  2020 
  2020 
  2379     """
  2379     """
  2380     opts = pycompat.byteskwargs(opts)
  2380     opts = pycompat.byteskwargs(opts)
  2381     overrides = {}
  2381     overrides = {}
  2382     if opts[b'tool']:
  2382     if opts[b'tool']:
  2383         overrides[(b'ui', b'forcemerge')] = opts[b'tool']
  2383         overrides[(b'ui', b'forcemerge')] = opts[b'tool']
  2384         ui.note(b'with --tool %r\n' % (pycompat.bytestr(opts[b'tool'])))
  2384         ui.notenoi18n(b'with --tool %r\n' % (pycompat.bytestr(opts[b'tool'])))
  2385 
  2385 
  2386     with ui.configoverride(overrides, b'debugmergepatterns'):
  2386     with ui.configoverride(overrides, b'debugmergepatterns'):
  2387         hgmerge = encoding.environ.get(b"HGMERGE")
  2387         hgmerge = encoding.environ.get(b"HGMERGE")
  2388         if hgmerge is not None:
  2388         if hgmerge is not None:
  2389             ui.note(b'with HGMERGE=%r\n' % (pycompat.bytestr(hgmerge)))
  2389             ui.notenoi18n(b'with HGMERGE=%r\n' % (pycompat.bytestr(hgmerge)))
  2390         uimerge = ui.config(b"ui", b"merge")
  2390         uimerge = ui.config(b"ui", b"merge")
  2391         if uimerge:
  2391         if uimerge:
  2392             ui.note(b'with ui.merge=%r\n' % (pycompat.bytestr(uimerge)))
  2392             ui.notenoi18n(b'with ui.merge=%r\n' % (pycompat.bytestr(uimerge)))
  2393 
  2393 
  2394         ctx = scmutil.revsingle(repo, opts.get(b'rev'))
  2394         ctx = scmutil.revsingle(repo, opts.get(b'rev'))
  2395         m = scmutil.match(ctx, pats, opts)
  2395         m = scmutil.match(ctx, pats, opts)
  2396         changedelete = opts[b'changedelete']
  2396         changedelete = opts[b'changedelete']
  2397         for path in ctx.walk(m):
  2397         for path in ctx.walk(m):
  2783         if total:
  2783         if total:
  2784             return (value, 100 * float(value) / total)
  2784             return (value, 100 * float(value) / total)
  2785         else:
  2785         else:
  2786             return value, 100.0
  2786             return value, 100.0
  2787 
  2787 
  2788     ui.write(b'format : %d\n' % format)
  2788     ui.writenoi18n(b'format : %d\n' % format)
  2789     ui.write(b'flags  : %s\n' % b', '.join(flags))
  2789     ui.writenoi18n(b'flags  : %s\n' % b', '.join(flags))
  2790 
  2790 
  2791     ui.write(b'\n')
  2791     ui.write(b'\n')
  2792     fmt = pcfmtstr(totalsize)
  2792     fmt = pcfmtstr(totalsize)
  2793     fmt2 = dfmtstr(totalsize)
  2793     fmt2 = dfmtstr(totalsize)
  2794     ui.write(b'revisions     : ' + fmt2 % numrevs)
  2794     ui.writenoi18n(b'revisions     : ' + fmt2 % numrevs)
  2795     ui.write(b'    merges    : ' + fmt % pcfmt(nummerges, numrevs))
  2795     ui.writenoi18n(b'    merges    : ' + fmt % pcfmt(nummerges, numrevs))
  2796     ui.write(b'    normal    : ' + fmt % pcfmt(numrevs - nummerges, numrevs))
  2796     ui.writenoi18n(b'    normal    : ' + fmt % pcfmt(numrevs - nummerges, numrevs))
  2797     ui.write(b'revisions     : ' + fmt2 % numrevs)
  2797     ui.writenoi18n(b'revisions     : ' + fmt2 % numrevs)
  2798     ui.write(b'    empty     : ' + fmt % pcfmt(numempty, numrevs))
  2798     ui.writenoi18n(b'    empty     : ' + fmt % pcfmt(numempty, numrevs))
  2799     ui.write(
  2799     ui.writenoi18n(
  2800         b'                   text  : '
  2800         b'                   text  : '
  2801         + fmt % pcfmt(numemptytext, numemptytext + numemptydelta)
  2801         + fmt % pcfmt(numemptytext, numemptytext + numemptydelta)
  2802     )
  2802     )
  2803     ui.write(
  2803     ui.writenoi18n(
  2804         b'                   delta : '
  2804         b'                   delta : '
  2805         + fmt % pcfmt(numemptydelta, numemptytext + numemptydelta)
  2805         + fmt % pcfmt(numemptydelta, numemptytext + numemptydelta)
  2806     )
  2806     )
  2807     ui.write(b'    snapshot  : ' + fmt % pcfmt(numfull + numsemi, numrevs))
  2807     ui.writenoi18n(b'    snapshot  : ' + fmt % pcfmt(numfull + numsemi, numrevs))
  2808     for depth in sorted(numsnapdepth):
  2808     for depth in sorted(numsnapdepth):
  2809         ui.write(
  2809         ui.write(
  2810             (b'      lvl-%-3d :       ' % depth)
  2810             (b'      lvl-%-3d :       ' % depth)
  2811             + fmt % pcfmt(numsnapdepth[depth], numrevs)
  2811             + fmt % pcfmt(numsnapdepth[depth], numrevs)
  2812         )
  2812         )
  2813     ui.write(b'    deltas    : ' + fmt % pcfmt(numdeltas, numrevs))
  2813     ui.writenoi18n(b'    deltas    : ' + fmt % pcfmt(numdeltas, numrevs))
  2814     ui.write(b'revision size : ' + fmt2 % totalsize)
  2814     ui.writenoi18n(b'revision size : ' + fmt2 % totalsize)
  2815     ui.write(
  2815     ui.writenoi18n(
  2816         b'    snapshot  : ' + fmt % pcfmt(fulltotal + semitotal, totalsize)
  2816         b'    snapshot  : ' + fmt % pcfmt(fulltotal + semitotal, totalsize)
  2817     )
  2817     )
  2818     for depth in sorted(numsnapdepth):
  2818     for depth in sorted(numsnapdepth):
  2819         ui.write(
  2819         ui.write(
  2820             (b'      lvl-%-3d :       ' % depth)
  2820             (b'      lvl-%-3d :       ' % depth)
  2821             + fmt % pcfmt(snaptotal[depth], totalsize)
  2821             + fmt % pcfmt(snaptotal[depth], totalsize)
  2822         )
  2822         )
  2823     ui.write(b'    deltas    : ' + fmt % pcfmt(deltatotal, totalsize))
  2823     ui.writenoi18n(b'    deltas    : ' + fmt % pcfmt(deltatotal, totalsize))
  2824 
  2824 
  2825     def fmtchunktype(chunktype):
  2825     def fmtchunktype(chunktype):
  2826         if chunktype == b'empty':
  2826         if chunktype == b'empty':
  2827             return b'    %s     : ' % chunktype
  2827             return b'    %s     : ' % chunktype
  2828         elif chunktype in pycompat.bytestr(string.ascii_letters):
  2828         elif chunktype in pycompat.bytestr(string.ascii_letters):
  2829             return b'    0x%s (%s)  : ' % (hex(chunktype), chunktype)
  2829             return b'    0x%s (%s)  : ' % (hex(chunktype), chunktype)
  2830         else:
  2830         else:
  2831             return b'    0x%s      : ' % hex(chunktype)
  2831             return b'    0x%s      : ' % hex(chunktype)
  2832 
  2832 
  2833     ui.write(b'\n')
  2833     ui.write(b'\n')
  2834     ui.write(b'chunks        : ' + fmt2 % numrevs)
  2834     ui.writenoi18n(b'chunks        : ' + fmt2 % numrevs)
  2835     for chunktype in sorted(chunktypecounts):
  2835     for chunktype in sorted(chunktypecounts):
  2836         ui.write(fmtchunktype(chunktype))
  2836         ui.write(fmtchunktype(chunktype))
  2837         ui.write(fmt % pcfmt(chunktypecounts[chunktype], numrevs))
  2837         ui.write(fmt % pcfmt(chunktypecounts[chunktype], numrevs))
  2838     ui.write(b'chunks size   : ' + fmt2 % totalsize)
  2838     ui.writenoi18n(b'chunks size   : ' + fmt2 % totalsize)
  2839     for chunktype in sorted(chunktypecounts):
  2839     for chunktype in sorted(chunktypecounts):
  2840         ui.write(fmtchunktype(chunktype))
  2840         ui.write(fmtchunktype(chunktype))
  2841         ui.write(fmt % pcfmt(chunktypesizes[chunktype], totalsize))
  2841         ui.write(fmt % pcfmt(chunktypesizes[chunktype], totalsize))
  2842 
  2842 
  2843     ui.write(b'\n')
  2843     ui.write(b'\n')
  2844     fmt = dfmtstr(max(avgchainlen, maxchainlen, maxchainspan, compratio))
  2844     fmt = dfmtstr(max(avgchainlen, maxchainlen, maxchainspan, compratio))
  2845     ui.write(b'avg chain length  : ' + fmt % avgchainlen)
  2845     ui.writenoi18n(b'avg chain length  : ' + fmt % avgchainlen)
  2846     ui.write(b'max chain length  : ' + fmt % maxchainlen)
  2846     ui.writenoi18n(b'max chain length  : ' + fmt % maxchainlen)
  2847     ui.write(b'max chain reach   : ' + fmt % maxchainspan)
  2847     ui.writenoi18n(b'max chain reach   : ' + fmt % maxchainspan)
  2848     ui.write(b'compression ratio : ' + fmt % compratio)
  2848     ui.writenoi18n(b'compression ratio : ' + fmt % compratio)
  2849 
  2849 
  2850     if format > 0:
  2850     if format > 0:
  2851         ui.write(b'\n')
  2851         ui.write(b'\n')
  2852         ui.write(
  2852         ui.writenoi18n(
  2853             b'uncompressed data size (min/max/avg) : %d / %d / %d\n'
  2853             b'uncompressed data size (min/max/avg) : %d / %d / %d\n'
  2854             % tuple(datasize)
  2854             % tuple(datasize)
  2855         )
  2855         )
  2856     ui.write(
  2856     ui.writenoi18n(
  2857         b'full revision size (min/max/avg)     : %d / %d / %d\n'
  2857         b'full revision size (min/max/avg)     : %d / %d / %d\n'
  2858         % tuple(fullsize)
  2858         % tuple(fullsize)
  2859     )
  2859     )
  2860     ui.write(
  2860     ui.writenoi18n(
  2861         b'inter-snapshot size (min/max/avg)    : %d / %d / %d\n'
  2861         b'inter-snapshot size (min/max/avg)    : %d / %d / %d\n'
  2862         % tuple(semisize)
  2862         % tuple(semisize)
  2863     )
  2863     )
  2864     for depth in sorted(snapsizedepth):
  2864     for depth in sorted(snapsizedepth):
  2865         if depth == 0:
  2865         if depth == 0:
  2866             continue
  2866             continue
  2867         ui.write(
  2867         ui.writenoi18n(
  2868             b'    level-%-3d (min/max/avg)          : %d / %d / %d\n'
  2868             b'    level-%-3d (min/max/avg)          : %d / %d / %d\n'
  2869             % ((depth,) + tuple(snapsizedepth[depth]))
  2869             % ((depth,) + tuple(snapsizedepth[depth]))
  2870         )
  2870         )
  2871     ui.write(
  2871     ui.writenoi18n(
  2872         b'delta size (min/max/avg)             : %d / %d / %d\n'
  2872         b'delta size (min/max/avg)             : %d / %d / %d\n'
  2873         % tuple(deltasize)
  2873         % tuple(deltasize)
  2874     )
  2874     )
  2875 
  2875 
  2876     if numdeltas > 0:
  2876     if numdeltas > 0:
  2877         ui.write(b'\n')
  2877         ui.write(b'\n')
  2878         fmt = pcfmtstr(numdeltas)
  2878         fmt = pcfmtstr(numdeltas)
  2879         fmt2 = pcfmtstr(numdeltas, 4)
  2879         fmt2 = pcfmtstr(numdeltas, 4)
  2880         ui.write(b'deltas against prev  : ' + fmt % pcfmt(numprev, numdeltas))
  2880         ui.writenoi18n(b'deltas against prev  : ' + fmt % pcfmt(numprev, numdeltas))
  2881         if numprev > 0:
  2881         if numprev > 0:
  2882             ui.write(
  2882             ui.writenoi18n(
  2883                 b'    where prev = p1  : ' + fmt2 % pcfmt(nump1prev, numprev)
  2883                 b'    where prev = p1  : ' + fmt2 % pcfmt(nump1prev, numprev)
  2884             )
  2884             )
  2885             ui.write(
  2885             ui.writenoi18n(
  2886                 b'    where prev = p2  : ' + fmt2 % pcfmt(nump2prev, numprev)
  2886                 b'    where prev = p2  : ' + fmt2 % pcfmt(nump2prev, numprev)
  2887             )
  2887             )
  2888             ui.write(
  2888             ui.writenoi18n(
  2889                 b'    other            : ' + fmt2 % pcfmt(numoprev, numprev)
  2889                 b'    other            : ' + fmt2 % pcfmt(numoprev, numprev)
  2890             )
  2890             )
  2891         if gdelta:
  2891         if gdelta:
  2892             ui.write(b'deltas against p1    : ' + fmt % pcfmt(nump1, numdeltas))
  2892             ui.writenoi18n(b'deltas against p1    : ' + fmt % pcfmt(nump1, numdeltas))
  2893             ui.write(b'deltas against p2    : ' + fmt % pcfmt(nump2, numdeltas))
  2893             ui.writenoi18n(b'deltas against p2    : ' + fmt % pcfmt(nump2, numdeltas))
  2894             ui.write(
  2894             ui.writenoi18n(
  2895                 b'deltas against other : ' + fmt % pcfmt(numother, numdeltas)
  2895                 b'deltas against other : ' + fmt % pcfmt(numother, numdeltas)
  2896             )
  2896             )
  2897 
  2897 
  2898 
  2898 
  2899 @command(
  2899 @command(
  2927             ui.write(
  2927             ui.write(
  2928                 (b"   rev    offset  length linkrev" b" %s %s p2\n")
  2928                 (b"   rev    offset  length linkrev" b" %s %s p2\n")
  2929                 % (b"nodeid".ljust(idlen), b"p1".ljust(idlen))
  2929                 % (b"nodeid".ljust(idlen), b"p1".ljust(idlen))
  2930             )
  2930             )
  2931         else:
  2931         else:
  2932             ui.write(
  2932             ui.writenoi18n(
  2933                 b"   rev linkrev %s %s p2\n"
  2933                 b"   rev linkrev %s %s p2\n"
  2934                 % (b"nodeid".ljust(idlen), b"p1".ljust(idlen))
  2934                 % (b"nodeid".ljust(idlen), b"p1".ljust(idlen))
  2935             )
  2935             )
  2936     elif format == 1:
  2936     elif format == 1:
  2937         if ui.verbose:
  2937         if ui.verbose:
  2941                     b"     p2 %s\n"
  2941                     b"     p2 %s\n"
  2942                 )
  2942                 )
  2943                 % b"nodeid".rjust(idlen)
  2943                 % b"nodeid".rjust(idlen)
  2944             )
  2944             )
  2945         else:
  2945         else:
  2946             ui.write(
  2946             ui.writenoi18n(
  2947                 b"   rev flag     size   link     p1     p2 %s\n"
  2947                 b"   rev flag     size   link     p1     p2 %s\n"
  2948                 % b"nodeid".rjust(idlen)
  2948                 % b"nodeid".rjust(idlen)
  2949             )
  2949             )
  2950 
  2950 
  2951     for i in r:
  2951     for i in r:
  3107 
  3107 
  3108     if opts[b'verify_optimized']:
  3108     if opts[b'verify_optimized']:
  3109         arevs = revset.makematcher(treebystage[b'analyzed'])(repo)
  3109         arevs = revset.makematcher(treebystage[b'analyzed'])(repo)
  3110         brevs = revset.makematcher(treebystage[b'optimized'])(repo)
  3110         brevs = revset.makematcher(treebystage[b'optimized'])(repo)
  3111         if opts[b'show_set'] or (opts[b'show_set'] is None and ui.verbose):
  3111         if opts[b'show_set'] or (opts[b'show_set'] is None and ui.verbose):
  3112             ui.write(b"* analyzed set:\n", stringutil.prettyrepr(arevs), b"\n")
  3112             ui.writenoi18n(b"* analyzed set:\n", stringutil.prettyrepr(arevs), b"\n")
  3113             ui.write(b"* optimized set:\n", stringutil.prettyrepr(brevs), b"\n")
  3113             ui.writenoi18n(b"* optimized set:\n", stringutil.prettyrepr(brevs), b"\n")
  3114         arevs = list(arevs)
  3114         arevs = list(arevs)
  3115         brevs = list(brevs)
  3115         brevs = list(brevs)
  3116         if arevs == brevs:
  3116         if arevs == brevs:
  3117             return 0
  3117             return 0
  3118         ui.write(b'--- analyzed\n', label=b'diff.file_a')
  3118         ui.writenoi18n(b'--- analyzed\n', label=b'diff.file_a')
  3119         ui.write(b'+++ optimized\n', label=b'diff.file_b')
  3119         ui.writenoi18n(b'+++ optimized\n', label=b'diff.file_b')
  3120         sm = difflib.SequenceMatcher(None, arevs, brevs)
  3120         sm = difflib.SequenceMatcher(None, arevs, brevs)
  3121         for tag, alo, ahi, blo, bhi in sm.get_opcodes():
  3121         for tag, alo, ahi, blo, bhi in sm.get_opcodes():
  3122             if tag in (r'delete', r'replace'):
  3122             if tag in (r'delete', r'replace'):
  3123                 for c in arevs[alo:ahi]:
  3123                 for c in arevs[alo:ahi]:
  3124                     ui.write(b'-%d\n' % c, label=b'diff.deleted')
  3124                     ui.write(b'-%d\n' % c, label=b'diff.deleted')
  3131         return 1
  3131         return 1
  3132 
  3132 
  3133     func = revset.makematcher(tree)
  3133     func = revset.makematcher(tree)
  3134     revs = func(repo)
  3134     revs = func(repo)
  3135     if opts[b'show_set'] or (opts[b'show_set'] is None and ui.verbose):
  3135     if opts[b'show_set'] or (opts[b'show_set'] is None and ui.verbose):
  3136         ui.write(b"* set:\n", stringutil.prettyrepr(revs), b"\n")
  3136         ui.writenoi18n(b"* set:\n", stringutil.prettyrepr(revs), b"\n")
  3137     if not opts[b'show_revs']:
  3137     if not opts[b'show_revs']:
  3138         return
  3138         return
  3139     for c in revs:
  3139     for c in revs:
  3140         ui.write(b"%d\n" % c)
  3140         ui.write(b"%d\n" % c)
  3141 
  3141 
  3309     _(b'[-r REV] [REV]'),
  3309     _(b'[-r REV] [REV]'),
  3310 )
  3310 )
  3311 def debugsub(ui, repo, rev=None):
  3311 def debugsub(ui, repo, rev=None):
  3312     ctx = scmutil.revsingle(repo, rev, None)
  3312     ctx = scmutil.revsingle(repo, rev, None)
  3313     for k, v in sorted(ctx.substate.items()):
  3313     for k, v in sorted(ctx.substate.items()):
  3314         ui.write(b'path %s\n' % k)
  3314         ui.writenoi18n(b'path %s\n' % k)
  3315         ui.write(b' source   %s\n' % v[0])
  3315         ui.writenoi18n(b' source   %s\n' % v[0])
  3316         ui.write(b' revision %s\n' % v[1])
  3316         ui.writenoi18n(b' revision %s\n' % v[1])
  3317 
  3317 
  3318 
  3318 
  3319 @command(
  3319 @command(
  3320     b'debugsuccessorssets',
  3320     b'debugsuccessorssets',
  3321     [(b'', b'closest', False, _(b'return closest successors sets only'))],
  3321     [(b'', b'closest', False, _(b'return closest successors sets only'))],
  3412         aliases = ui.configitems(b'templatealias')
  3412         aliases = ui.configitems(b'templatealias')
  3413         tree = templater.parse(tmpl)
  3413         tree = templater.parse(tmpl)
  3414         ui.note(templater.prettyformat(tree), b'\n')
  3414         ui.note(templater.prettyformat(tree), b'\n')
  3415         newtree = templater.expandaliases(tree, aliases)
  3415         newtree = templater.expandaliases(tree, aliases)
  3416         if newtree != tree:
  3416         if newtree != tree:
  3417             ui.note(b"* expanded:\n", templater.prettyformat(newtree), b'\n')
  3417             ui.notenoi18n(b"* expanded:\n", templater.prettyformat(newtree), b'\n')
  3418 
  3418 
  3419     if revs is None:
  3419     if revs is None:
  3420         tres = formatter.templateresources(ui, repo)
  3420         tres = formatter.templateresources(ui, repo)
  3421         t = formatter.maketemplater(ui, tmpl, resources=tres)
  3421         t = formatter.maketemplater(ui, tmpl, resources=tres)
  3422         if ui.verbose:
  3422         if ui.verbose:
  3423             kwds, funcs = t.symbolsuseddefault()
  3423             kwds, funcs = t.symbolsuseddefault()
  3424             ui.write(b"* keywords: %s\n" % b', '.join(sorted(kwds)))
  3424             ui.writenoi18n(b"* keywords: %s\n" % b', '.join(sorted(kwds)))
  3425             ui.write(b"* functions: %s\n" % b', '.join(sorted(funcs)))
  3425             ui.writenoi18n(b"* functions: %s\n" % b', '.join(sorted(funcs)))
  3426         ui.write(t.renderdefault(props))
  3426         ui.write(t.renderdefault(props))
  3427     else:
  3427     else:
  3428         displayer = logcmdutil.maketemplater(ui, repo, tmpl)
  3428         displayer = logcmdutil.maketemplater(ui, repo, tmpl)
  3429         if ui.verbose:
  3429         if ui.verbose:
  3430             kwds, funcs = displayer.t.symbolsuseddefault()
  3430             kwds, funcs = displayer.t.symbolsuseddefault()
  3431             ui.write(b"* keywords: %s\n" % b', '.join(sorted(kwds)))
  3431             ui.writenoi18n(b"* keywords: %s\n" % b', '.join(sorted(kwds)))
  3432             ui.write(b"* functions: %s\n" % b', '.join(sorted(funcs)))
  3432             ui.writenoi18n(b"* functions: %s\n" % b', '.join(sorted(funcs)))
  3433         for r in revs:
  3433         for r in revs:
  3434             displayer.show(repo[r], **pycompat.strkwargs(props))
  3434             displayer.show(repo[r], **pycompat.strkwargs(props))
  3435         displayer.close()
  3435         displayer.close()
  3436 
  3436 
  3437 
  3437 
  3442     norepo=True,
  3442     norepo=True,
  3443 )
  3443 )
  3444 def debuguigetpass(ui, prompt=b''):
  3444 def debuguigetpass(ui, prompt=b''):
  3445     """show prompt to type password"""
  3445     """show prompt to type password"""
  3446     r = ui.getpass(prompt)
  3446     r = ui.getpass(prompt)
  3447     ui.write(b'respose: %s\n' % r)
  3447     ui.writenoi18n(b'respose: %s\n' % r)
  3448 
  3448 
  3449 
  3449 
  3450 @command(
  3450 @command(
  3451     b'debuguiprompt',
  3451     b'debuguiprompt',
  3452     [(b'p', b'prompt', b'', _(b'prompt text'), _(b'TEXT')),],
  3452     [(b'p', b'prompt', b'', _(b'prompt text'), _(b'TEXT')),],
  3454     norepo=True,
  3454     norepo=True,
  3455 )
  3455 )
  3456 def debuguiprompt(ui, prompt=b''):
  3456 def debuguiprompt(ui, prompt=b''):
  3457     """show plain prompt"""
  3457     """show plain prompt"""
  3458     r = ui.prompt(prompt)
  3458     r = ui.prompt(prompt)
  3459     ui.write(b'response: %s\n' % r)
  3459     ui.writenoi18n(b'response: %s\n' % r)
  3460 
  3460 
  3461 
  3461 
  3462 @command(b'debugupdatecaches', [])
  3462 @command(b'debugupdatecaches', [])
  3463 def debugupdatecaches(ui, repo, *pats, **opts):
  3463 def debugupdatecaches(ui, repo, *pats, **opts):
  3464     """warm all known caches in the repository"""
  3464     """warm all known caches in the repository"""
  3520 def debugwalk(ui, repo, *pats, **opts):
  3520 def debugwalk(ui, repo, *pats, **opts):
  3521     """show how files match on given patterns"""
  3521     """show how files match on given patterns"""
  3522     opts = pycompat.byteskwargs(opts)
  3522     opts = pycompat.byteskwargs(opts)
  3523     m = scmutil.match(repo[None], pats, opts)
  3523     m = scmutil.match(repo[None], pats, opts)
  3524     if ui.verbose:
  3524     if ui.verbose:
  3525         ui.write(b'* matcher:\n', stringutil.prettyrepr(m), b'\n')
  3525         ui.writenoi18n(b'* matcher:\n', stringutil.prettyrepr(m), b'\n')
  3526     items = list(repo[None].walk(m))
  3526     items = list(repo[None].walk(m))
  3527     if not items:
  3527     if not items:
  3528         return
  3528         return
  3529     f = lambda fn: fn
  3529     f = lambda fn: fn
  3530     if ui.configbool(b'ui', b'slash') and pycompat.ossep != b'/':
  3530     if ui.configbool(b'ui', b'slash') and pycompat.ossep != b'/':