Skip to content

Commit 5b4c45a

Browse files
committed
Merge branch 'da/mergetool-diff-order'
"git mergetool" learned to honor "-O<orderfile>" to control the order of paths to present to the end user. * da/mergetool-diff-order: mergetool: honor -O<orderfile> mergetool: honor diff.orderFile mergetool: move main program flow into a main() function mergetool: add copyright
2 parents 69e6544 + 654311b commit 5b4c45a

File tree

3 files changed

+165
-86
lines changed

3 files changed

+165
-86
lines changed

Documentation/git-mergetool.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,13 @@ success of the resolution after the custom tool has exited.
7979
Prompt before each invocation of the merge resolution program
8080
to give the user a chance to skip the path.
8181

82+
-O<orderfile>::
83+
Process files in the order specified in the
84+
<orderfile>, which has one shell glob pattern per line.
85+
This overrides the `diff.orderFile` configuration variable
86+
(see linkgit:git-config[1]). To cancel `diff.orderFile`,
87+
use `-O/dev/null`.
88+
8289
TEMPORARY FILES
8390
---------------
8491
`git mergetool` creates `*.orig` backup files while resolving merges.

git-mergetool.sh

Lines changed: 98 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@
33
# This program resolves merge conflicts in git
44
#
55
# Copyright (c) 2006 Theodore Y. Ts'o
6+
# Copyright (c) 2009-2016 David Aguilar
67
#
78
# This file is licensed under the GPL v2, or a later version
89
# at the discretion of Junio C Hamano.
910
#
1011

11-
USAGE='[--tool=tool] [--tool-help] [-y|--no-prompt|--prompt] [file to merge] ...'
12+
USAGE='[--tool=tool] [--tool-help] [-y|--no-prompt|--prompt] [-O<orderfile>] [file to merge] ...'
1213
SUBDIRECTORY_OK=Yes
1314
NONGIT_OK=Yes
1415
OPTIONS_SPEC=
@@ -365,51 +366,6 @@ merge_file () {
365366
return 0
366367
}
367368

368-
prompt=$(git config --bool mergetool.prompt)
369-
guessed_merge_tool=false
370-
371-
while test $# != 0
372-
do
373-
case "$1" in
374-
--tool-help=*)
375-
TOOL_MODE=${1#--tool-help=}
376-
show_tool_help
377-
;;
378-
--tool-help)
379-
show_tool_help
380-
;;
381-
-t|--tool*)
382-
case "$#,$1" in
383-
*,*=*)
384-
merge_tool=$(expr "z$1" : 'z-[^=]*=\(.*\)')
385-
;;
386-
1,*)
387-
usage ;;
388-
*)
389-
merge_tool="$2"
390-
shift ;;
391-
esac
392-
;;
393-
-y|--no-prompt)
394-
prompt=false
395-
;;
396-
--prompt)
397-
prompt=true
398-
;;
399-
--)
400-
shift
401-
break
402-
;;
403-
-*)
404-
usage
405-
;;
406-
*)
407-
break
408-
;;
409-
esac
410-
shift
411-
done
412-
413369
prompt_after_failed_merge () {
414370
while true
415371
do
@@ -426,57 +382,113 @@ prompt_after_failed_merge () {
426382
done
427383
}
428384

429-
git_dir_init
430-
require_work_tree
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
393+
orderfile=
394+
395+
while test $# != 0
396+
do
397+
case "$1" in
398+
--tool-help=*)
399+
TOOL_MODE=${1#--tool-help=}
400+
show_tool_help
401+
;;
402+
--tool-help)
403+
show_tool_help
404+
;;
405+
-t|--tool*)
406+
case "$#,$1" in
407+
*,*=*)
408+
merge_tool=$(expr "z$1" : 'z-[^=]*=\(.*\)')
409+
;;
410+
1,*)
411+
usage ;;
412+
*)
413+
merge_tool="$2"
414+
shift ;;
415+
esac
416+
;;
417+
-y|--no-prompt)
418+
prompt=false
419+
;;
420+
--prompt)
421+
prompt=true
422+
;;
423+
-O*)
424+
orderfile="$1"
425+
;;
426+
--)
427+
shift
428+
break
429+
;;
430+
-*)
431+
usage
432+
;;
433+
*)
434+
break
435+
;;
436+
esac
437+
shift
438+
done
439+
440+
git_dir_init
441+
require_work_tree
431442

432-
if test -z "$merge_tool"
433-
then
434-
# Check if a merge tool has been configured
435-
merge_tool=$(get_configured_merge_tool)
436-
# Try to guess an appropriate merge tool if no tool has been set.
437443
if test -z "$merge_tool"
438444
then
439-
merge_tool=$(guess_merge_tool) || exit
440-
guessed_merge_tool=true
445+
# Check if a merge tool has been configured
446+
merge_tool=$(get_configured_merge_tool)
447+
# Try to guess an appropriate merge tool if no tool has been set.
448+
if test -z "$merge_tool"
449+
then
450+
merge_tool=$(guess_merge_tool) || exit
451+
guessed_merge_tool=true
452+
fi
453+
fi
454+
merge_keep_backup="$(git config --bool mergetool.keepBackup || echo true)"
455+
merge_keep_temporaries="$(git config --bool mergetool.keepTemporaries || echo false)"
456+
457+
if test $# -eq 0 && test -e "$GIT_DIR/MERGE_RR"
458+
then
459+
set -- $(git rerere remaining)
460+
if test $# -eq 0
461+
then
462+
print_noop_and_exit
463+
fi
441464
fi
442-
fi
443-
merge_keep_backup="$(git config --bool mergetool.keepBackup || echo true)"
444-
merge_keep_temporaries="$(git config --bool mergetool.keepTemporaries || echo false)"
445465

446-
files=
466+
files=$(git -c core.quotePath=false \
467+
diff --name-only --diff-filter=U \
468+
${orderfile:+"$orderfile"} -- "$@")
447469

448-
if test $# -eq 0
449-
then
450470
cd_to_toplevel
451471

452-
if test -e "$GIT_DIR/MERGE_RR"
472+
if test -z "$files"
453473
then
454-
files=$(git rerere remaining)
455-
else
456-
files=$(git ls-files -u | sed -e 's/^[^ ]* //' | sort -u)
474+
print_noop_and_exit
457475
fi
458-
else
459-
files=$(git ls-files -u -- "$@" | sed -e 's/^[^ ]* //' | sort -u)
460-
fi
461476

462-
if test -z "$files"
463-
then
464-
echo "No files need merging"
465-
exit 0
466-
fi
477+
printf "Merging:\n"
478+
printf "%s\n" "$files"
467479

468-
printf "Merging:\n"
469-
printf "%s\n" "$files"
480+
rc=0
481+
for i in $files
482+
do
483+
printf "\n"
484+
if ! merge_file "$i"
485+
then
486+
rc=1
487+
prompt_after_failed_merge || exit 1
488+
fi
489+
done
470490

471-
rc=0
472-
for i in $files
473-
do
474-
printf "\n"
475-
if ! merge_file "$i"
476-
then
477-
rc=1
478-
prompt_after_failed_merge || exit 1
479-
fi
480-
done
491+
exit $rc
492+
}
481493

482-
exit $rc
494+
main "$@"

t/t7610-mergetool.sh

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,4 +606,64 @@ test_expect_success MKTEMP 'temporary filenames are used with mergetool.writeToT
606606
git reset --hard master >/dev/null 2>&1
607607
'
608608

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+
test_expect_success 'mergetool -Oorder-file is honored' '
642+
test_config diff.orderFile order-file &&
643+
test_config mergetool.myecho.cmd "echo \"\$LOCAL\"" &&
644+
test_config mergetool.myecho.trustExitCode true &&
645+
test_must_fail git merge order-file-side1 &&
646+
cat >expect <<-\EOF &&
647+
Merging:
648+
a
649+
b
650+
EOF
651+
git mergetool -O/dev/null --no-prompt --tool myecho >output &&
652+
git grep --no-index -h -A2 Merging: output >actual &&
653+
test_cmp expect actual &&
654+
git reset --hard >/dev/null 2>&1 &&
655+
656+
git config --unset diff.orderFile &&
657+
test_must_fail git merge order-file-side1 &&
658+
cat >expect <<-\EOF &&
659+
Merging:
660+
b
661+
a
662+
EOF
663+
git mergetool -Oorder-file --no-prompt --tool myecho >output &&
664+
git grep --no-index -h -A2 Merging: output >actual &&
665+
test_cmp expect actual &&
666+
git reset --hard >/dev/null 2>&1
667+
'
668+
609669
test_done

0 commit comments

Comments
 (0)