[PATCH v2] dispatch: refactor tortured debugger setup logic
Yuya Nishihara
yuya at tcha.org
Wed Jan 6 13:25:18 UTC 2016
On Tue, 05 Jan 2016 11:27:21 -0800, Bryan O'Sullivan wrote:
> # HG changeset patch
> # User Bryan O'Sullivan <bos at serpentine.com>
> # Date 1452022007 28800
> # Tue Jan 05 11:26:47 2016 -0800
> # Node ID 82033eb9055b83fe7e6b1500dc893c3ca4adcf2a
> # Parent f9a7e04fb6e1d31887c9a866fef852e52db7ca21
> dispatch: refactor tortured debugger setup logic
>
> This patch was triggered by observing that the pdb debugger was
> always loaded regardless of whether a debugger was to be used.
>
> The logic as it existed was a thicket of accidental complexity.
> It's now much easier to follow (and only loads a debugger if needed).
>
> diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py
> --- a/mercurial/dispatch.py
> +++ b/mercurial/dispatch.py
> @@ -139,14 +139,6 @@ def _runcatch(req):
>
> try:
> try:
> - debugger = 'pdb'
> - debugtrace = {
> - 'pdb' : pdb.set_trace
> - }
> - debugmortem = {
> - 'pdb' : pdb.post_mortem
> - }
> -
> # read --config before doing anything else
> # (e.g. to change trust settings for reading .hg/hgrc)
> cfgs = _parseconfig(req.ui, _earlygetopt(['--config'], req.args))
> @@ -157,36 +149,29 @@ def _runcatch(req):
> for sec, name, val in cfgs:
> req.repo.ui.setconfig(sec, name, val, source='--config')
>
> - # developer config: ui.debugger
> - debugger = ui.config("ui", "debugger")
> - debugmod = pdb
> - if not debugger or ui.plain():
> - # if we are in HGPLAIN mode, then disable custom debugging
> + if '--debugger' in req.args:
> + # if we are in HGPLAIN mode, ignore custom debugging
> debugger = 'pdb'
> - elif '--debugger' in req.args:
> + if not ui.plain():
> + # developer config: ui.debugger
> + debugger = ui.config('ui', 'debugger', default='pdb')
> +
> + debugmod = pdb
> # This import can be slow for fancy debuggers, so only
> # do it when absolutely necessary, i.e. when actual
> # debugging has been requested
> with demandimport.deactivated():
> try:
> debugmod = __import__(debugger)
> - except ImportError:
> - pass # Leave debugmod = pdb
> + except (ImportError, ValueError):
> + ui.warn(_("%r debugger specified "
> + "but its module was not found\n") % debugger)
>
> - debugtrace[debugger] = debugmod.set_trace
> - debugmortem[debugger] = debugmod.post_mortem
> + # enter the debugger before command execution
> + ui.warn(_("entering debugger - "
> + "type c to continue starting hg or h for help\n"))
>
> - # enter the debugger before command execution
> - if '--debugger' in req.args:
> - ui.warn(_("entering debugger - "
> - "type c to continue starting hg or h for help\n"))
> -
> - if (debugger != 'pdb' and
> - debugtrace[debugger] == debugtrace['pdb']):
> - ui.warn(_("%s debugger specified "
> - "but its module was not found\n") % debugger)
> - with demandimport.deactivated():
> - debugtrace[debugger]()
> + debugmod.set_trace()
> try:
> return _dispatch(req)
> finally:
> @@ -195,7 +180,7 @@ def _runcatch(req):
> # enter the debugger when we hit an exception
> if '--debugger' in req.args:
> traceback.print_exc()
> - debugmortem[debugger](sys.exc_info()[2])
> + debugmod.post_mortem(sys.exc_info()[2])
Still it has unbound debugmod issue for "--debugger --config foo=bar=baz".
Perhaps we could do
debugmod = None
try:
...
if '--debugger' in req.args:
debugmod = pdb or something
except:
if debugmod: # in place of '--debugger' in req.args
debugmod.post_mortem(...)
More information about the Mercurial-devel
mailing list