view contrib/debugshell.py @ 47269:6be2a7ca4b1d

revlog: do not call Rust code if the index is not compatible with it This will avoid hitting the TypeError we defined in the previous changesets. This is the simplest fix but not the most elegant. Ideally we would teach the Rust code to use any kind of revlog. However this is an adventure for another time. Differential Revision: https://phab.mercurial-scm.org/D10666
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Tue, 04 May 2021 14:18:06 +0200
parents 86e4daa2d54c
children 6000f5b25c9b
line wrap: on
line source

# debugshell extension
"""a python shell with repo, changelog & manifest objects"""

from __future__ import absolute_import
import code
import mercurial
import sys
from mercurial import (
    demandimport,
    pycompat,
    registrar,
)

cmdtable = {}
command = registrar.command(cmdtable)


def pdb(ui, repo, msg, **opts):
    objects = {
        'mercurial': mercurial,
        'repo': repo,
        'cl': repo.changelog,
        'mf': repo.manifestlog,
    }

    code.interact(msg, local=objects)


def ipdb(ui, repo, msg, **opts):
    import IPython

    cl = repo.changelog
    mf = repo.manifestlog
    cl, mf  # use variables to appease pyflakes

    IPython.embed()


@command(b'debugshell|dbsh', [])
def debugshell(ui, repo, **opts):
    bannermsg = "loaded repo : %s\n" "using source: %s" % (
        pycompat.sysstr(repo.root),
        mercurial.__path__[0],
    )

    pdbmap = {'pdb': 'code', 'ipdb': 'IPython'}

    debugger = ui.config(b"ui", b"debugger")
    if not debugger:
        debugger = 'pdb'
    else:
        debugger = pycompat.sysstr(debugger)

    # if IPython doesn't exist, fallback to code.interact
    try:
        with demandimport.deactivated():
            __import__(pdbmap[debugger])
    except ImportError:
        ui.warnnoi18n(
            b"%s debugger specified but %s module was not found\n"
            % (debugger, pdbmap[debugger])
        )
        debugger = b'pdb'

    getattr(sys.modules[__name__], debugger)(ui, repo, bannermsg, **opts)