diff -r 9a3e88d4a030 -r f40dc6f7c12f mercurial/profiling.py --- a/mercurial/profiling.py Mon May 22 00:51:56 2017 -0700 +++ b/mercurial/profiling.py Mon May 22 01:17:49 2017 -0700 @@ -13,9 +13,21 @@ from . import ( encoding, error, + extensions, util, ) +def _loadprofiler(ui, profiler): + """load profiler extension. return profile method, or None on failure""" + extname = profiler + extensions.loadall(ui, whitelist=[extname]) + try: + mod = extensions.find(extname) + except KeyError: + return None + else: + return getattr(mod, 'profile', None) + @contextlib.contextmanager def lsprofile(ui, fp): format = ui.config('profiling', 'format', default='text') @@ -137,11 +149,15 @@ manager exits, profiling results will be written to the configured output. """ profiler = encoding.environ.get('HGPROF') + proffn = None if profiler is None: profiler = ui.config('profiling', 'type', default='stat') if profiler not in ('ls', 'stat', 'flame'): - ui.warn(_("unrecognized profiler '%s' - ignored\n") % profiler) - profiler = 'stat' + # try load profiler from extension with the same name + proffn = _loadprofiler(ui, profiler) + if proffn is None: + ui.warn(_("unrecognized profiler '%s' - ignored\n") % profiler) + profiler = 'stat' output = ui.config('profiling', 'output') @@ -154,7 +170,9 @@ fp = ui.ferr try: - if profiler == 'ls': + if proffn is not None: + pass + elif profiler == 'ls': proffn = lsprofile elif profiler == 'flame': proffn = flameprofile