merge: add a config to specify merge tool in interactive mode

Summary:
Add a way to specify different merge tools for interactive and non-interactive
mode.

This will be used for the default `editmerge` merge tool, which pops up the
`EDITOR` (vim) regardless of interactive mode, causing various user complains
and hangs, including `arc pull` running rebase triggering editor, or VS Code
running rebase triggering editor, and some other rebase hangs or vim errors.

Reviewed By: DurhamG

Differential Revision: D24069105

fbshipit-source-id: ec16fdc704cab6daeedb0c23d4028b4309d96d3f
This commit is contained in:
Jun Wu 2020-10-06 14:30:02 -07:00 committed by Facebook GitHub Bot
parent 4c08208f85
commit ecc8e7187a
3 changed files with 22 additions and 1 deletions

View File

@ -220,7 +220,12 @@ def _picktool(repo, ui, path, binary, symlink, changedelete):
disabled.add(t)
names = tools.keys()
tools = sorted([(-p, tool) for tool, p in tools.items() if tool not in disabled])
uimerge = ui.config("ui", "merge")
interactive = ui.interactive() and ui.formatted
uimerge = None
if interactive:
uimerge = ui.config("ui", "merge:interactive")
if not uimerge:
uimerge = ui.config("ui", "merge")
if uimerge:
# external tools defined in uimerge won't be able to handle
# change/delete conflicts

View File

@ -2492,6 +2492,10 @@ User interface controls.
For more information on merge tools see :hg:`help merge-tools`.
For configuring merge tools see the ``[merge-tools]`` section.
``merge:interactive``
If set, override ``ui.merge`` in interactive mode (usually when both
stdin and stdout are ttys).
``mergemarkers``
Sets the merge conflict marker label styling. The ``detailed``
style uses the ``mergemarkertemplate`` setting to style the labels.

View File

@ -1379,3 +1379,15 @@ specified file as expected
couldn't find merge tool true (for pattern f)
couldn't find merge tool true
f = false
test ui.merge:interactive
$ hg debugpickmergetool --config ui.formatted=false --config ui.interactive=false --config ui.merge=nonint --config ui.merge:interactive=int f
f = nonint
$ hg debugpickmergetool --config ui.formatted=false --config ui.interactive=true --config ui.merge=nonint --config ui.merge:interactive=int f
f = nonint
$ hg debugpickmergetool --config ui.formatted=true --config ui.interactive=false --config ui.merge=nonint --config ui.merge:interactive=int f
f = nonint
$ hg debugpickmergetool --config ui.formatted=true --config ui.interactive=true --config ui.merge=nonint --config ui.merge:interactive=int f
f = int