diff -r 7e35d31b41fd -r 9bc36198338e mercurial/debugcommands.py --- a/mercurial/debugcommands.py Sat May 13 03:31:42 2017 +0900 +++ b/mercurial/debugcommands.py Sat May 13 03:37:50 2017 +0900 @@ -40,6 +40,7 @@ error, exchange, extensions, + filemerge, fileset, formatter, hg, @@ -1502,6 +1503,84 @@ ui.write('\n'.join(repo.pathto(p, cwd) for p in sorted(files))) ui.write('\n') +@command('debugpickmergetool', + [('r', 'rev', '', _('check for files in this revision'), _('REV')), + ('', 'changedelete', None, _('emulate merging change and delete')), + ] + commands.walkopts + commands.mergetoolopts, + _('[PATTERN]...'), + inferrepo=True) +def debugpickmergetool(ui, repo, *pats, **opts): + """examine which merge tool is chosen for specified file + + As described in :hg:`help merge-tools`, Mercurial examines + configurations below in this order to decide which merge tool is + chosen for specified file. + + 1. ``--tool`` option + 2. ``HGMERGE`` environment variable + 3. configurations in ``merge-patterns`` section + 4. configuration of ``ui.merge`` + 5. configurations in ``merge-tools`` section + 6. ``hgmerge`` tool (for historical reason only) + 7. default tool for fallback (``:merge`` or ``:prompt``) + + This command writes out examination result in the style below:: + + FILE = MERGETOOL + + By default, all files known in the first parent context of the + working directory are examined. Use file patterns and/or -I/-X + options to limit target files. -r/--rev is also useful to examine + files in another context without actual updating to it. + + With --debug, this command shows warning messages while matching + against ``merge-patterns`` and so on, too. It is recommended to + use this option with explicit file patterns and/or -I/-X options, + because this option increases amount of output per file according + to configurations in hgrc. + + With -v/--verbose, this command shows configurations below at + first (only if specified). + + - ``--tool`` option + - ``HGMERGE`` environment variable + - configuration of ``ui.merge`` + + If merge tool is chosen before matching against + ``merge-patterns``, this command can't show any helpful + information, even with --debug. In such case, information above is + useful to know why a merge tool is chosen. + """ + overrides = {} + if opts['tool']: + overrides[('ui', 'forcemerge')] = opts['tool'] + ui.note(('with --tool %r\n') % (opts['tool'])) + + with ui.configoverride(overrides, 'debugmergepatterns'): + hgmerge = encoding.environ.get("HGMERGE") + if hgmerge is not None: + ui.note(('with HGMERGE=%r\n') % (hgmerge)) + uimerge = ui.config("ui", "merge") + if uimerge: + ui.note(('with ui.merge=%r\n') % (uimerge)) + + ctx = scmutil.revsingle(repo, opts.get('rev')) + m = scmutil.match(ctx, pats, opts) + changedelete = opts['changedelete'] + for path in ctx.walk(m): + fctx = ctx[path] + try: + if not ui.debugflag: + ui.pushbuffer(error=True) + tool, toolpath = filemerge._picktool(repo, ui, path, + fctx.isbinary(), + 'l' in fctx.flags(), + changedelete) + finally: + if not ui.debugflag: + ui.popbuffer() + ui.write(('%s = %s\n') % (path, tool)) + @command('debugpushkey', [], _('REPO NAMESPACE [KEY OLD NEW]'), norepo=True) def debugpushkey(ui, repopath, namespace, *keyinfo, **opts): '''access the pushkey key/value protocol