]> git.ipfire.org Git - thirdparty/git.git/commitdiff
mergetool--lib: fix '--tool-help' to correctly show available tools
authorPhilippe Blain <levraiphilippeblain@gmail.com>
Thu, 7 Jan 2021 01:09:05 +0000 (01:09 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 7 Jan 2021 02:31:27 +0000 (18:31 -0800)
Commit 83bbf9b92e (mergetool--lib: improve support for vimdiff-style tool
variants, 2020-07-29) introduced a regression in the output of `git mergetool
--tool-help` and `git difftool --tool-help` [1].

In function 'show_tool_names' in git-mergetool--lib.sh, we loop over the
supported mergetools and their variants and accumulate them in the variable
'variants', separating them with a literal '\n'.

The code then uses 'echo $variants' to turn these '\n' into newlines, but this
behaviour is not portable, it just happens to work in some shells, like
dash(1)'s 'echo' builtin.

For shells in which 'echo' does not turn '\n' into newlines, the end
result is that the only tools that are shown are the existing variants
(except the last variant alphabetically), since the variants are
separated by actual newlines in '$variants' because of the several
'echo' calls in mergetools/{bc,vimdiff}::list_tool_variants.

Fix this bug by embedding an actual line feed into `variants` in
show_tool_names(). While at it, replace `sort | uniq` by `sort -u`.

To prevent future regressions, add a simple test that checks that a few
known tools are correctly shown (let's avoid counting the total number
of tools to lessen the maintenance burden when new tools are added or if
'--tool-help' learns additional logic, like hiding tools depending on
the current platform).

[1] https://lore.kernel.org/git/CADtb9DyozjgAsdFYL8fFBEWmq7iz4=prZYVUdH9W-J5CKVS4OA@mail.gmail.com/

Reported-by: Philippe Blain <levraiphilippeblain@gmail.com>
Based-on-patch-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-mergetool--lib.sh
t/t7610-mergetool.sh

index 2defef28cd931fc9dca041ee7ec0ea5d440c3dd7..f7853906f7600934e66b404c17e8df7d2dc8a8d4 100644 (file)
@@ -46,9 +46,11 @@ show_tool_names () {
                while read scriptname
                do
                        setup_tool "$scriptname" 2>/dev/null
-                       variants="$variants$(list_tool_variants)\n"
+                       # We need an actual line feed here
+                       variants="$variants
+$(list_tool_variants)"
                done
-               variants="$(echo "$variants" | sort | uniq)"
+               variants="$(echo "$variants" | sort -u)"
 
                for toolname in $variants
                do
index ad288ddc695f7cce0990e3f2bab696f3aff09eb1..5c4e7783c53bb1ac3ca1042a5b4022c72a7c4971 100755 (executable)
@@ -802,4 +802,15 @@ test_expect_success 'mergetool -Oorder-file is honored' '
        test_cmp expect actual
 '
 
+test_expect_success 'mergetool --tool-help shows recognized tools' '
+       # Check a few known tools are correctly shown
+       git mergetool --tool-help >mergetools &&
+       grep vimdiff mergetools &&
+       grep vimdiff3 mergetools &&
+       grep gvimdiff2 mergetools &&
+       grep araxis mergetools &&
+       grep xxdiff mergetools &&
+       grep meld mergetools
+'
+
 test_done