view contrib/debugshell.py @ 42240:39b63f9d7464

localrepo: don't use defaults arguments that will never be overridden The commithook() callback will be called when the lock is released. lock.release() calls the callback without arguments, so it was quite confusing to me that this function declared extra arguments. We can just close on the variables in the outer scope instead. Differential Revision: https://phab.mercurial-scm.org/D6336
author Martin von Zweigbergk <martinvonz@google.com>
date Fri, 03 May 2019 08:37:10 -0700
parents b10bbbe995eb
children 2372284d9457
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.warn((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)