mergetool: honor diff.orderFile
Teach mergetool to get the list of files to edit via `diff` so that we gain support for diff.orderFile. Suggested-by: Luis Gutierrez <luisgutz@gmail.com> Helped-by: Johannes Sixt <j6t@kdbg.org> Signed-off-by: David Aguilar <davvid@gmail.com> Reviewed-by: Johannes Sixt <j6t@kdbg.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
David Aguilar committed
Oct 7, 2016 at 16:58 UTC
57937f70a09c12ef484c290865dac4066d207c9c
3 files changed
+53
-15
Documentation/git-mergetool.txt
+5
@@ -79,6 +79,11 @@ success of the resolution after the custom tool has exited.
79
Prompt before each invocation of the merge resolution program
80
to give the user a chance to skip the path.
81
82
+DIFF ORDER FILES
83
+----------------
84
+`git mergetool` honors the `diff.orderFile` configuration variable
85
+used by `git diff`. See linkgit:git-config[1] for more details.
86
+
87
TEMPORARY FILES
88
---------------
89
`git mergetool` creates `*.orig` backup files while resolving merges.
git-mergetool.sh
+15
-15
@@ -382,6 +382,11 @@ prompt_after_failed_merge () {
382
done
383
}
384
385
+print_noop_and_exit () {
386
+ echo "No files need merging"
387
+ exit 0
388
+}
389
+
390
main () {
391
prompt=$(git config --bool mergetool.prompt)
392
guessed_merge_tool=false
@@ -445,28 +450,23 @@ main () {
450
merge_keep_backup="$(git config --bool mergetool.keepBackup || echo true)"
451
merge_keep_temporaries="$(git config --bool mergetool.keepTemporaries || echo false)"
452
448
- files=
449
-
450
- if test $# -eq 0
453
+ if test $# -eq 0 && test -e "$GIT_DIR/MERGE_RR"
454
then
452
- cd_to_toplevel
453
-
454
- if test -e "$GIT_DIR/MERGE_RR"
455
+ set -- $(git rerere remaining)
456
+ if test $# -eq 0
457
then
456
- files=$(git rerere remaining)
457
- else
458
- files=$(git ls-files -u |
459
- sed -e 's/^[^ ]* //' | sort -u)
458
+ print_noop_and_exit
459
fi
461
- else
462
- files=$(git ls-files -u -- "$@" |
463
- sed -e 's/^[^ ]* //' | sort -u)
460
fi
461
462
+ files=$(git -c core.quotePath=false \
463
+ diff --name-only --diff-filter=U -- "$@")
464
+
465
+ cd_to_toplevel
466
+
467
if test -z "$files"
468
then
468
- echo "No files need merging"
469
- exit 0
469
+ print_noop_and_exit
470
fi
471
472
printf "Merging:\n"
t/t7610-mergetool.sh
+33
@@ -606,4 +606,37 @@ test_expect_success MKTEMP 'temporary filenames are used with mergetool.writeToT
606
git reset --hard master >/dev/null 2>&1
607
'
608
609
+test_expect_success 'diff.orderFile configuration is honored' '
610
+ test_config diff.orderFile order-file &&
611
+ test_config mergetool.myecho.cmd "echo \"\$LOCAL\"" &&
612
+ test_config mergetool.myecho.trustExitCode true &&
613
+ echo b >order-file &&
614
+ echo a >>order-file &&
615
+ git checkout -b order-file-start master &&
616
+ echo start >a &&
617
+ echo start >b &&
618
+ git add a b &&
619
+ git commit -m start &&
620
+ git checkout -b order-file-side1 order-file-start &&
621
+ echo side1 >a &&
622
+ echo side1 >b &&
623
+ git add a b &&
624
+ git commit -m side1 &&
625
+ git checkout -b order-file-side2 order-file-start &&
626
+ echo side2 >a &&
627
+ echo side2 >b &&
628
+ git add a b &&
629
+ git commit -m side2 &&
630
+ test_must_fail git merge order-file-side1 &&
631
+ cat >expect <<-\EOF &&
632
+ Merging:
633
+ b
634
+ a
635
+ EOF
636
+ git mergetool --no-prompt --tool myecho >output &&
637
+ git grep --no-index -h -A2 Merging: output >actual &&
638
+ test_cmp expect actual &&
639
+ git reset --hard >/dev/null
640
+'
641
+
642
test_done