The pathnames output by the 'git rerere remaining' command are relative to the top-level directory but the 'git diff --name-only' command expects its pathname arguments to be relative to the current working directory. Run cd_to_toplevel before running 'git diff --name-only' and adjust any relative pathnames so that 'git mergetool' does not fail when run from a subdirectory with rerere enabled. This fixes a regression introduced in 57937f70a09c12ef484c290865dac4066d207c9c (v2.11.0). Based-on-patch-by: Junio C Hamano <gitster@xxxxxxxxx> Signed-off-by: Richard Hansen <hansenr@xxxxxxxxxx> --- git-mergetool.sh | 16 ++++++++++++++-- t/t7610-mergetool.sh | 7 ++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/git-mergetool.sh b/git-mergetool.sh index b506896dc..cba6bbd05 100755 --- a/git-mergetool.sh +++ b/git-mergetool.sh @@ -454,6 +454,15 @@ main () { merge_keep_backup="$(git config --bool mergetool.keepBackup || echo true)" merge_keep_temporaries="$(git config --bool mergetool.keepTemporaries || echo false)" + prefix=$(git rev-parse --show-prefix) || exit 1 + cd_to_toplevel + + if test -n "$orderfile" + then + orderfile=$(git rev-parse --prefix "$prefix" -- "$orderfile") || exit 1 + orderfile=$(printf %s\\n "$orderfile" | sed -e 1d) + fi + if test $# -eq 0 && test -e "$GIT_DIR/MERGE_RR" then set -- $(git rerere remaining) @@ -461,14 +470,17 @@ main () { then print_noop_and_exit fi + elif test $# -ge 0 + then + files_quoted=$(git rev-parse --sq --prefix "$prefix" -- "$@") || exit 1 + eval "set -- $files_quoted" + shift fi files=$(git -c core.quotePath=false \ diff --name-only --diff-filter=U \ ${orderfile:+"-O$orderfile"} -- "$@") - cd_to_toplevel - if test -z "$files" then print_noop_and_exit diff --git a/t/t7610-mergetool.sh b/t/t7610-mergetool.sh index b36fde1c0..820fc8597 100755 --- a/t/t7610-mergetool.sh +++ b/t/t7610-mergetool.sh @@ -234,7 +234,7 @@ test_expect_success 'mergetool merges all from subdir (rerere disabled)' ' ) ' -test_expect_failure 'mergetool merges all from subdir (rerere enabled)' ' +test_expect_success 'mergetool merges all from subdir (rerere enabled)' ' test_when_finished "git reset --hard" && git checkout -b test$test_count branch1 && test_config rerere.enabled true && @@ -677,6 +677,11 @@ test_expect_success 'diff.orderFile configuration is honored' ' b a EOF + + # make sure "order-file" that is ambiguous between + # rev and path is understood correctly. + git branch order-file HEAD && + git mergetool --no-prompt --tool myecho >output && git grep --no-index -h -A2 Merging: output >actual && test_cmp expect actual -- 2.11.0.390.gc69c2f50cf-goog
<<attachment: smime.p7s>>