partial-merge: add support for `.args` config (`$local` etc.)
It will be useful to be able to define custom command-line arguments
per partial merge tool just like we have for regular merge tools. In
particular, I expect the same binary to handle multiple languages, so
it will be useful to be able to pass some argument indicating the
language, or perhaps simply an argument defining a regex that's used
for finding lines to merge as a sorted set.
Differential Revision: https://phab.mercurial-scm.org/D12383
--- a/mercurial/configitems.py Tue Jan 18 13:05:21 2022 -0800
+++ b/mercurial/configitems.py Thu Mar 17 11:19:06 2022 -0700
@@ -1601,6 +1601,14 @@
experimental=True,
)
coreconfigitem(
+ b'partial-merge-tools',
+ br'.*\.args',
+ default=b"$local $base $other",
+ generic=True,
+ priority=-1,
+ experimental=True,
+)
+coreconfigitem(
b'merge-tools',
b'.*',
default=None,
--- a/mercurial/filemerge.py Tue Jan 18 13:05:21 2022 -0800
+++ b/mercurial/filemerge.py Thu Mar 17 11:19:06 2022 -0700
@@ -1119,7 +1119,7 @@
def _run_partial_resolution_tools(repo, local, other, base):
"""Runs partial-resolution tools on the three inputs and updates them."""
ui = repo.ui
- # Tuples of (order, name, executable path)
+ # Tuples of (order, name, executable path, args)
tools = []
seen = set()
section = b"partial-merge-tools"
@@ -1135,7 +1135,8 @@
if is_match:
order = ui.configint(section, b'%s.order' % name, 0)
executable = ui.config(section, b'%s.executable' % name, name)
- tools.append((order, name, executable))
+ args = ui.config(section, b'%s.args' % name)
+ tools.append((order, name, executable, args))
if not tools:
return
@@ -1151,11 +1152,21 @@
with _maketempfiles(files) as temppaths:
localpath, basepath, otherpath = temppaths
- for order, name, executable in tools:
+ for order, name, executable, args in tools:
cmd = procutil.shellquote(executable)
- # TODO: Allow the user to configure the command line using
- # $local, $base, $other.
- cmd = b'%s %s %s %s' % (cmd, localpath, basepath, otherpath)
+ replace = {
+ b'local': localpath,
+ b'base': basepath,
+ b'other': otherpath,
+ }
+ args = util.interpolate(
+ br'\$',
+ replace,
+ args,
+ lambda s: procutil.shellquote(util.localpath(s)),
+ )
+
+ cmd = b'%s %s' % (cmd, args)
r = ui.system(cmd, cwd=repo.root, blockedtag=b'partial-mergetool')
if r:
raise error.StateError(
--- a/tests/test-merge-partial-tool.t Tue Jan 18 13:05:21 2022 -0800
+++ b/tests/test-merge-partial-tool.t Thu Mar 17 11:19:06 2022 -0700
@@ -207,3 +207,35 @@
c
d
e3
+
+Test that arguments get passed as expected.
+
+ $ cat >> "$TESTTMP/log-args.sh" <<'EOF'
+ > #!/bin/sh
+ > echo "$@" > args.log
+ > EOF
+ $ chmod +x "$TESTTMP/log-args.sh"
+ $ cat >> "$HGRCPATH" <<EOF
+ > [partial-merge-tools]
+ > log-args.executable=$TESTTMP/log-args.sh
+ > EOF
+ $ hg up -C 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg merge 1
+ merging file
+ warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
+ [1]
+ $ cat args.log
+ */hgmerge-*/file~local */hgmerge-*/file~base */hgmerge-*/file~other (glob)
+ $ hg up -C 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg merge 1 --config partial-merge-tools.log-args.args='--other $other $base --foo --local $local --also-other $other'
+ merging file
+ warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
+ [1]
+ $ cat args.log
+ --other */hgmerge-*/file~other */hgmerge-*/file~base --foo --local */hgmerge-*/file~local --also-other */hgmerge-*/file~other (glob)