# HG changeset patch # User Martin von Zweigbergk # Date 1647541146 25200 # Node ID 9dfbea54b680db04fd915b5a372c042b8e294228 # Parent f3aafd785e659eec659328e78b3beae91a1c9667 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 diff -r f3aafd785e65 -r 9dfbea54b680 mercurial/configitems.py --- 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, diff -r f3aafd785e65 -r 9dfbea54b680 mercurial/filemerge.py --- 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( diff -r f3aafd785e65 -r 9dfbea54b680 tests/test-merge-partial-tool.t --- 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" < [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)