git-commit-vandalism/mergetools
Johannes Schindelin ccc7b5148b mergetool(vimdiff): allow paths to contain spaces again
In 0041797449 (vimdiff: new implementation with layout support,
2022-03-30), we introduced a completely new implementation of the
`vimdiff` backend for `git mergetool`.

In this implementation, we no longer call `vim` directly but we
accumulate in the variable `FINAL_CMD` an arbitrary number of commands
for `vim` to execute, which necessitates the use of `eval` to split the
commands properly into multiple command-line arguments.

That same `eval` command also needs to pass the paths to `vim`, and
while it looks as if they are quoted correctly, that quoting only
reaches the `eval` instruction and is lost after that, therefore paths
that contain whitespace characters (or other characters that are
interpreted by the POSIX shell) are handled incorrectly.

This is a simple reproducer:

	git init -b main bam-merge-fail
	cd bam-merge-fail
	echo a>"a file.txt"
	git add "a file.txt"
	git commit -m "added 'a file.txt'"
	echo b>"a file.txt"
	git add "a file.txt"
	git commit -m "diverged b 'a file.txt'"
	git checkout -b c HEAD~
	echo c>"a file.txt"
	git add "a file.txt"
	git commit -m "diverged c 'a file.txt'"
	git checkout main
	git merge c
	git mergetool --tool=vimdiff

With Git v2.37.0/v2.37.1, this will open 7 buffers, not four, and not
display the correct contents at all.

To fix this, let's not expand the variables containing the path
parameters before passing them to the `eval` command, but let that
command expand the variables instead.

This fixes https://github.com/git-for-windows/git/issues/3945

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2022-07-14 10:37:44 -07:00
..
araxis mergetools: add description to all diff/merge tools 2022-04-03 15:10:04 -07:00
bc mergetools: add description to all diff/merge tools 2022-04-03 15:10:04 -07:00
codecompare mergetools: add description to all diff/merge tools 2022-04-03 15:10:04 -07:00
deltawalker mergetools: add description to all diff/merge tools 2022-04-03 15:10:04 -07:00
diffmerge mergetools: add description to all diff/merge tools 2022-04-03 15:10:04 -07:00
diffuse mergetools: add description to all diff/merge tools 2022-04-03 15:10:04 -07:00
ecmerge mergetools: add description to all diff/merge tools 2022-04-03 15:10:04 -07:00
emerge mergetools: add description to all diff/merge tools 2022-04-03 15:10:04 -07:00
examdiff mergetools: add description to all diff/merge tools 2022-04-03 15:10:04 -07:00
guiffy mergetools: add description to all diff/merge tools 2022-04-03 15:10:04 -07:00
gvimdiff mergetools: simplify how we handle "vim" and "defaults" 2013-01-28 19:00:38 -08:00
kdiff3 mergetools: add description to all diff/merge tools 2022-04-03 15:10:04 -07:00
kompare mergetools: add description to all diff/merge tools 2022-04-03 15:10:04 -07:00
meld mergetools: add description to all diff/merge tools 2022-04-03 15:10:04 -07:00
nvimdiff mergetools: add support for nvimdiff (neovim) family 2020-07-29 14:44:49 -07:00
opendiff mergetools: add description to all diff/merge tools 2022-04-03 15:10:04 -07:00
p4merge mergetools: add description to all diff/merge tools 2022-04-03 15:10:04 -07:00
smerge mergetools: add description to all diff/merge tools 2022-04-03 15:10:04 -07:00
tkdiff mergetools: add description to all diff/merge tools 2022-04-03 15:10:04 -07:00
tortoisemerge mergetools: add description to all diff/merge tools 2022-04-03 15:10:04 -07:00
vimdiff mergetool(vimdiff): allow paths to contain spaces again 2022-07-14 10:37:44 -07:00
winmerge mergetools: add description to all diff/merge tools 2022-04-03 15:10:04 -07:00
xxdiff mergetools: add description to all diff/merge tools 2022-04-03 15:10:04 -07:00