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>
This commit is contained in:
Johannes Sixt 2019-06-12 18:33:48 +02:00 коммит произвёл Junio C Hamano
Родитель 8b01465510
Коммит 7e6d6f7610
1 изменённых файлов: 20 добавлений и 5 удалений

Просмотреть файл

@ -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