summaryrefslogtreecommitdiff
path: root/git-mergetool.sh
diff options
context:
space:
mode:
authorJohannes Sixt <j6t@kdbg.org>2019-06-12 16:33:48 (GMT)
committerJunio C Hamano <gitster@pobox.com>2019-06-12 20:20:56 (GMT)
commit7e6d6f7610965906d071022615bf64f14c60c0d2 (patch)
treea04175fd1059c00b5bb837413d4e46135ce915f5 /git-mergetool.sh
parent8b014655105e27d44cf62f61dd6b24322a57048f (diff)
downloadgit-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-xgit-mergetool.sh25
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