diff options
author | Johannes Sixt <j6t@kdbg.org> | 2019-06-12 16:33:48 (GMT) |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2019-06-12 20:20:56 (GMT) |
commit | 7e6d6f7610965906d071022615bf64f14c60c0d2 (patch) | |
tree | a04175fd1059c00b5bb837413d4e46135ce915f5 /git-mergetool.sh | |
parent | 8b014655105e27d44cf62f61dd6b24322a57048f (diff) | |
download | git-7e6d6f7610965906d071022615bf64f14c60c0d2.zip git-7e6d6f7610965906d071022615bf64f14c60c0d2.tar.gz git-7e6d6f7610965906d071022615bf64f14c60c0d2.tar.bz2 |
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>
Diffstat (limited to 'git-mergetool.sh')
-rwxr-xr-x | git-mergetool.sh | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/git-mergetool.sh b/git-mergetool.sh index 8a937f6..e3f6d54 100755 --- a/git-mergetool.sh +++ b/git-mergetool.sh @@ -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 |