mercurial/debugcommands.py
changeset 33112 05906b8e1d23
parent 33074 e21b750c9b9e
child 33113 b257aaa0743a
equal deleted inserted replaced
33111:4a8db3538c39 33112:05906b8e1d23
   289             ui.write("%s%s\n" % (indent_string, hex(node)))
   289             ui.write("%s%s\n" % (indent_string, hex(node)))
   290             chain = node
   290             chain = node
   291 
   291 
   292 def _debugobsmarkers(ui, part, indent=0, **opts):
   292 def _debugobsmarkers(ui, part, indent=0, **opts):
   293     """display version and markers contained in 'data'"""
   293     """display version and markers contained in 'data'"""
       
   294     opts = pycompat.byteskwargs(opts)
   294     data = part.read()
   295     data = part.read()
   295     indent_string = ' ' * indent
   296     indent_string = ' ' * indent
   296     try:
   297     try:
   297         version, markers = obsolete._readmarkers(data)
   298         version, markers = obsolete._readmarkers(data)
   298     except error.UnknownVersion as exc:
   299     except error.UnknownVersion as exc:
   509         ui.write("\n")
   510         ui.write("\n")
   510 
   511 
   511 @command('debugdata', cmdutil.debugrevlogopts, _('-c|-m|FILE REV'))
   512 @command('debugdata', cmdutil.debugrevlogopts, _('-c|-m|FILE REV'))
   512 def debugdata(ui, repo, file_, rev=None, **opts):
   513 def debugdata(ui, repo, file_, rev=None, **opts):
   513     """dump the contents of a data file revision"""
   514     """dump the contents of a data file revision"""
       
   515     opts = pycompat.byteskwargs(opts)
   514     if opts.get('changelog') or opts.get('manifest') or opts.get('dir'):
   516     if opts.get('changelog') or opts.get('manifest') or opts.get('dir'):
   515         if rev is not None:
   517         if rev is not None:
   516             raise error.CommandError('debugdata', _('invalid arguments'))
   518             raise error.CommandError('debugdata', _('invalid arguments'))
   517         file_, rev = None, file_
   519         file_, rev = None, file_
   518     elif rev is None:
   520     elif rev is None:
   565                     of how much extra data we need to read/seek across to read
   567                     of how much extra data we need to read/seek across to read
   566                     the delta chain for this revision
   568                     the delta chain for this revision
   567     :``extraratio``: extradist divided by chainsize; another representation of
   569     :``extraratio``: extradist divided by chainsize; another representation of
   568                     how much unrelated data is needed to load this delta chain
   570                     how much unrelated data is needed to load this delta chain
   569     """
   571     """
       
   572     opts = pycompat.byteskwargs(opts)
   570     r = cmdutil.openrevlog(repo, 'debugdeltachain', file_, opts)
   573     r = cmdutil.openrevlog(repo, 'debugdeltachain', file_, opts)
   571     index = r.index
   574     index = r.index
   572     generaldelta = r.version & revlog.FLAG_GENERALDELTA
   575     generaldelta = r.version & revlog.FLAG_GENERALDELTA
   573 
   576 
   574     def revinfo(rev):
   577     def revinfo(rev):
   677      _('use old-style discovery with non-heads included')),
   680      _('use old-style discovery with non-heads included')),
   678     ] + cmdutil.remoteopts,
   681     ] + cmdutil.remoteopts,
   679     _('[-l REV] [-r REV] [-b BRANCH]... [OTHER]'))
   682     _('[-l REV] [-r REV] [-b BRANCH]... [OTHER]'))
   680 def debugdiscovery(ui, repo, remoteurl="default", **opts):
   683 def debugdiscovery(ui, repo, remoteurl="default", **opts):
   681     """runs the changeset discovery protocol in isolation"""
   684     """runs the changeset discovery protocol in isolation"""
       
   685     opts = pycompat.byteskwargs(opts)
   682     remoteurl, branches = hg.parseurl(ui.expandpath(remoteurl),
   686     remoteurl, branches = hg.parseurl(ui.expandpath(remoteurl),
   683                                       opts.get('branch'))
   687                                       opts.get('branch'))
   684     remote = hg.peer(repo, opts, remoteurl)
   688     remote = hg.peer(repo, opts, remoteurl)
   685     ui.status(_('comparing with %s\n') % util.hidepassword(remoteurl))
   689     ui.status(_('comparing with %s\n') % util.hidepassword(remoteurl))
   686 
   690 
   738         doit(localrevs, remoterevs)
   742         doit(localrevs, remoterevs)
   739 
   743 
   740 @command('debugextensions', cmdutil.formatteropts, [], norepo=True)
   744 @command('debugextensions', cmdutil.formatteropts, [], norepo=True)
   741 def debugextensions(ui, **opts):
   745 def debugextensions(ui, **opts):
   742     '''show information about active extensions'''
   746     '''show information about active extensions'''
       
   747     opts = pycompat.byteskwargs(opts)
   743     exts = extensions.extensions(ui)
   748     exts = extensions.extensions(ui)
   744     hgver = util.version()
   749     hgver = util.version()
   745     fm = ui.formatter('debugextensions', opts)
   750     fm = ui.formatter('debugextensions', opts)
   746     for extname, extmod in sorted(exts, key=operator.itemgetter(0)):
   751     for extname, extmod in sorted(exts, key=operator.itemgetter(0)):
   747         isinternal = extensions.ismoduleinternal(extmod)
   752         isinternal = extensions.ismoduleinternal(extmod)
   820     """retrieves a bundle from a repo
   825     """retrieves a bundle from a repo
   821 
   826 
   822     Every ID must be a full-length hex node id string. Saves the bundle to the
   827     Every ID must be a full-length hex node id string. Saves the bundle to the
   823     given file.
   828     given file.
   824     """
   829     """
       
   830     opts = pycompat.byteskwargs(opts)
   825     repo = hg.peer(ui, opts, repopath)
   831     repo = hg.peer(ui, opts, repopath)
   826     if not repo.capable('getbundle'):
   832     if not repo.capable('getbundle'):
   827         raise error.Abort("getbundle() not supported by target repository")
   833         raise error.Abort("getbundle() not supported by target repository")
   828     args = {}
   834     args = {}
   829     if common:
   835     if common:
   889     [('f', 'format', 0, _('revlog format'), _('FORMAT'))],
   895     [('f', 'format', 0, _('revlog format'), _('FORMAT'))],
   890     _('[-f FORMAT] -c|-m|FILE'),
   896     _('[-f FORMAT] -c|-m|FILE'),
   891     optionalrepo=True)
   897     optionalrepo=True)
   892 def debugindex(ui, repo, file_=None, **opts):
   898 def debugindex(ui, repo, file_=None, **opts):
   893     """dump the contents of an index file"""
   899     """dump the contents of an index file"""
       
   900     opts = pycompat.byteskwargs(opts)
   894     r = cmdutil.openrevlog(repo, 'debugindex', file_, opts)
   901     r = cmdutil.openrevlog(repo, 'debugindex', file_, opts)
   895     format = opts.get('format', 0)
   902     format = opts.get('format', 0)
   896     if format not in (0, 1):
   903     if format not in (0, 1):
   897         raise error.Abort(_("unknown format %d") % format)
   904         raise error.Abort(_("unknown format %d") % format)
   898 
   905 
   943 
   950 
   944 @command('debugindexdot', cmdutil.debugrevlogopts,
   951 @command('debugindexdot', cmdutil.debugrevlogopts,
   945     _('-c|-m|FILE'), optionalrepo=True)
   952     _('-c|-m|FILE'), optionalrepo=True)
   946 def debugindexdot(ui, repo, file_=None, **opts):
   953 def debugindexdot(ui, repo, file_=None, **opts):
   947     """dump an index DAG as a graphviz dot file"""
   954     """dump an index DAG as a graphviz dot file"""
       
   955     opts = pycompat.byteskwargs(opts)
   948     r = cmdutil.openrevlog(repo, 'debugindexdot', file_, opts)
   956     r = cmdutil.openrevlog(repo, 'debugindexdot', file_, opts)
   949     ui.write(("digraph G {\n"))
   957     ui.write(("digraph G {\n"))
   950     for i in r:
   958     for i in r:
   951         node = r.node(i)
   959         node = r.node(i)
   952         pp = r.parents(node)
   960         pp = r.parents(node)
   959 def debuginstall(ui, **opts):
   967 def debuginstall(ui, **opts):
   960     '''test Mercurial installation
   968     '''test Mercurial installation
   961 
   969 
   962     Returns 0 on success.
   970     Returns 0 on success.
   963     '''
   971     '''
       
   972     opts = pycompat.byteskwargs(opts)
   964 
   973 
   965     def writetemp(contents):
   974     def writetemp(contents):
   966         (fd, name) = tempfile.mkstemp(prefix="hg-debuginstall-")
   975         (fd, name) = tempfile.mkstemp(prefix="hg-debuginstall-")
   967         f = os.fdopen(fd, pycompat.sysstr("wb"))
   976         f = os.fdopen(fd, pycompat.sysstr("wb"))
   968         f.write(contents)
   977         f.write(contents)
  1127     """test whether node ids are known to a repo
  1136     """test whether node ids are known to a repo
  1128 
  1137 
  1129     Every ID must be a full-length hex node id string. Returns a list of 0s
  1138     Every ID must be a full-length hex node id string. Returns a list of 0s
  1130     and 1s indicating unknown/known.
  1139     and 1s indicating unknown/known.
  1131     """
  1140     """
       
  1141     opts = pycompat.byteskwargs(opts)
  1132     repo = hg.peer(ui, opts, repopath)
  1142     repo = hg.peer(ui, opts, repopath)
  1133     if not repo.capable('known'):
  1143     if not repo.capable('known'):
  1134         raise error.Abort("known() not supported by target repository")
  1144         raise error.Abort("known() not supported by target repository")
  1135     flags = repo.known([bin(s) for s in ids])
  1145     flags = repo.known([bin(s) for s in ids])
  1136     ui.write("%s\n" % ("".join([f and "1" or "0" for f in flags])))
  1146     ui.write("%s\n" % ("".join([f and "1" or "0" for f in flags])))
  1344          _('[OBSOLETED [REPLACEMENT ...]]'))
  1354          _('[OBSOLETED [REPLACEMENT ...]]'))
  1345 def debugobsolete(ui, repo, precursor=None, *successors, **opts):
  1355 def debugobsolete(ui, repo, precursor=None, *successors, **opts):
  1346     """create arbitrary obsolete marker
  1356     """create arbitrary obsolete marker
  1347 
  1357 
  1348     With no arguments, displays the list of obsolescence markers."""
  1358     With no arguments, displays the list of obsolescence markers."""
       
  1359 
       
  1360     opts = pycompat.byteskwargs(opts)
  1349 
  1361 
  1350     def parsenodeid(s):
  1362     def parsenodeid(s):
  1351         try:
  1363         try:
  1352             # We do not use revsingle/revrange functions here to accept
  1364             # We do not use revsingle/revrange functions here to accept
  1353             # arbitrary node identifiers, possibly not present in the
  1365             # arbitrary node identifiers, possibly not present in the
  1556     If merge tool is chosen before matching against
  1568     If merge tool is chosen before matching against
  1557     ``merge-patterns``, this command can't show any helpful
  1569     ``merge-patterns``, this command can't show any helpful
  1558     information, even with --debug. In such case, information above is
  1570     information, even with --debug. In such case, information above is
  1559     useful to know why a merge tool is chosen.
  1571     useful to know why a merge tool is chosen.
  1560     """
  1572     """
       
  1573     opts = pycompat.byteskwargs(opts)
  1561     overrides = {}
  1574     overrides = {}
  1562     if opts['tool']:
  1575     if opts['tool']:
  1563         overrides[('ui', 'forcemerge')] = opts['tool']
  1576         overrides[('ui', 'forcemerge')] = opts['tool']
  1564         ui.note(('with --tool %r\n') % (opts['tool']))
  1577         ui.note(('with --tool %r\n') % (opts['tool']))
  1565 
  1578 
  1677     [('r', 'rev', '', _('revision to debug'), _('REV'))],
  1690     [('r', 'rev', '', _('revision to debug'), _('REV'))],
  1678     _('[-r REV] FILE'))
  1691     _('[-r REV] FILE'))
  1679 def debugrename(ui, repo, file1, *pats, **opts):
  1692 def debugrename(ui, repo, file1, *pats, **opts):
  1680     """dump rename information"""
  1693     """dump rename information"""
  1681 
  1694 
       
  1695     opts = pycompat.byteskwargs(opts)
  1682     ctx = scmutil.revsingle(repo, opts.get('rev'))
  1696     ctx = scmutil.revsingle(repo, opts.get('rev'))
  1683     m = scmutil.match(ctx, (file1,) + pats, opts)
  1697     m = scmutil.match(ctx, (file1,) + pats, opts)
  1684     for abs in ctx.walk(m):
  1698     for abs in ctx.walk(m):
  1685         fctx = ctx[abs]
  1699         fctx = ctx[abs]
  1686         o = fctx.filelog().renamed(fctx.filenode())
  1700         o = fctx.filelog().renamed(fctx.filenode())
  1694     [('d', 'dump', False, _('dump index data'))],
  1708     [('d', 'dump', False, _('dump index data'))],
  1695     _('-c|-m|FILE'),
  1709     _('-c|-m|FILE'),
  1696     optionalrepo=True)
  1710     optionalrepo=True)
  1697 def debugrevlog(ui, repo, file_=None, **opts):
  1711 def debugrevlog(ui, repo, file_=None, **opts):
  1698     """show data and statistics about a revlog"""
  1712     """show data and statistics about a revlog"""
       
  1713     opts = pycompat.byteskwargs(opts)
  1699     r = cmdutil.openrevlog(repo, 'debugrevlog', file_, opts)
  1714     r = cmdutil.openrevlog(repo, 'debugrevlog', file_, opts)
  1700 
  1715 
  1701     if opts.get("dump"):
  1716     if opts.get("dump"):
  1702         numrevs = len(r)
  1717         numrevs = len(r)
  1703         ui.write(("# rev p1rev p2rev start   end deltastart base   p1   p2"
  1718         ui.write(("# rev p1rev p2rev start   end deltastart base   p1   p2"
  1941     representation or the parsed tree respectively.
  1956     representation or the parsed tree respectively.
  1942 
  1957 
  1943     Use --verify-optimized to compare the optimized result with the unoptimized
  1958     Use --verify-optimized to compare the optimized result with the unoptimized
  1944     one. Returns 1 if the optimized result differs.
  1959     one. Returns 1 if the optimized result differs.
  1945     """
  1960     """
       
  1961     opts = pycompat.byteskwargs(opts)
  1946     stages = [
  1962     stages = [
  1947         ('parsed', lambda tree: tree),
  1963         ('parsed', lambda tree: tree),
  1948         ('expanded', lambda tree: revsetlang.expandaliases(ui, tree)),
  1964         ('expanded', lambda tree: revsetlang.expandaliases(ui, tree)),
  1949         ('concatenated', revsetlang.foldconcat),
  1965         ('concatenated', revsetlang.foldconcat),
  1950         ('analyzed', revsetlang.analyze),
  1966         ('analyzed', revsetlang.analyze),
  2186 
  2202 
  2187 @command('debugwalk', cmdutil.walkopts, _('[OPTION]... [FILE]...'),
  2203 @command('debugwalk', cmdutil.walkopts, _('[OPTION]... [FILE]...'),
  2188          inferrepo=True)
  2204          inferrepo=True)
  2189 def debugwalk(ui, repo, *pats, **opts):
  2205 def debugwalk(ui, repo, *pats, **opts):
  2190     """show how files match on given patterns"""
  2206     """show how files match on given patterns"""
       
  2207     opts = pycompat.byteskwargs(opts)
  2191     m = scmutil.match(repo[None], pats, opts)
  2208     m = scmutil.match(repo[None], pats, opts)
  2192     ui.write(('matcher: %r\n' % m))
  2209     ui.write(('matcher: %r\n' % m))
  2193     items = list(repo[None].walk(m))
  2210     items = list(repo[None].walk(m))
  2194     if not items:
  2211     if not items:
  2195         return
  2212         return
  2209     ('', 'five', '', 'five'),
  2226     ('', 'five', '', 'five'),
  2210     ] + cmdutil.remoteopts,
  2227     ] + cmdutil.remoteopts,
  2211     _('REPO [OPTIONS]... [ONE [TWO]]'),
  2228     _('REPO [OPTIONS]... [ONE [TWO]]'),
  2212     norepo=True)
  2229     norepo=True)
  2213 def debugwireargs(ui, repopath, *vals, **opts):
  2230 def debugwireargs(ui, repopath, *vals, **opts):
       
  2231     opts = pycompat.byteskwargs(opts)
  2214     repo = hg.peer(ui, opts, repopath)
  2232     repo = hg.peer(ui, opts, repopath)
  2215     for opt in cmdutil.remoteopts:
  2233     for opt in cmdutil.remoteopts:
  2216         del opts[opt[1]]
  2234         del opts[opt[1]]
  2217     args = {}
  2235     args = {}
  2218     for k, v in opts.iteritems():
  2236     for k, v in opts.iteritems():