mergetool: use shell variable magic instead of `awk`

git-mergetool spawns an enormous amount of processes. For this reason,
the test script, t7610, is exceptionally slow, in particular, on
Windows. Most of the processes are invocations of git. There are
also some that can be replaced with shell builtins. Avoid repeated
calls of `git ls-files` and `awk`.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Johannes Sixt 2019-06-12 18:33:48 +02:00 committed by Junio C Hamano
parent 8b01465510
commit 7e6d6f7610
1 changed files with 20 additions and 5 deletions

View File

@ -279,15 +279,30 @@ merge_file () {
REMOTE="$MERGETOOL_TMPDIR/${BASE}_REMOTE_$$$ext"
BASE="$MERGETOOL_TMPDIR/${BASE}_BASE_$$$ext"

base_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==1) print $1;}')
local_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==2) print $1;}')
remote_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==3) print $1;}')
base_mode= local_mode= remote_mode=

# here, $IFS is just a LF
for line in $f
do
mode=${line%% *} # 1st word
sha1=${line#"$mode "}
sha1=${sha1%% *} # 2nd word
case "${line#$mode $sha1 }" in # remainder
'1 '*)
base_mode=$mode
;;
'2 '*)
local_mode=$mode local_sha1=$sha1
;;
'3 '*)
remote_mode=$mode remote_sha1=$sha1
;;
esac
done

if is_submodule "$local_mode" || is_submodule "$remote_mode"
then
echo "Submodule merge conflict for '$MERGED':"
local_sha1=$(git ls-files -u -- "$MERGED" | awk '{if ($3==2) print $2;}')
remote_sha1=$(git ls-files -u -- "$MERGED" | awk '{if ($3==3) print $2;}')
describe_file "$local_mode" "local" "$local_sha1"
describe_file "$remote_mode" "remote" "$remote_sha1"
resolve_submodule_merge