summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Sixt <j6t@kdbg.org>2019-06-12 16:33:47 (GMT)
committerJunio C Hamano <gitster@pobox.com>2019-06-12 20:20:56 (GMT)
commit8b014655105e27d44cf62f61dd6b24322a57048f (patch)
tree3c0ebfd1c99268f879ce0b37bc049a742c88bffd
parente10dffd067002ea83c5293c9440adc5f23825110 (diff)
downloadgit-8b014655105e27d44cf62f61dd6b24322a57048f.zip
git-8b014655105e27d44cf62f61dd6b24322a57048f.tar.gz
git-8b014655105e27d44cf62f61dd6b24322a57048f.tar.bz2
mergetool: dissect strings with shell variable magic instead of `expr`
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. Do so with `expr`. Signed-off-by: Johannes Sixt <j6t@kdbg.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rwxr-xr-xgit-mergetool.sh20
1 files changed, 11 insertions, 9 deletions
diff --git a/git-mergetool.sh b/git-mergetool.sh
index 88fa6a9..8a937f6 100755
--- a/git-mergetool.sh
+++ b/git-mergetool.sh
@@ -228,9 +228,8 @@ stage_submodule () {
}
checkout_staged_file () {
- tmpfile=$(expr \
- "$(git checkout-index --temp --stage="$1" "$2" 2>/dev/null)" \
- : '\([^ ]*\) ')
+ tmpfile="$(git checkout-index --temp --stage="$1" "$2" 2>/dev/null)" &&
+ tmpfile=${tmpfile%%' '*}
if test $? -eq 0 && test -n "$tmpfile"
then
@@ -255,13 +254,16 @@ merge_file () {
return 1
fi
- if BASE=$(expr "$MERGED" : '\(.*\)\.[^/]*$')
- then
- ext=$(expr "$MERGED" : '.*\(\.[^/]*\)$')
- else
+ # extract file extension from the last path component
+ case "${MERGED##*/}" in
+ *.*)
+ ext=.${MERGED##*.}
+ BASE=${MERGED%"$ext"}
+ ;;
+ *)
BASE=$MERGED
ext=
- fi
+ esac
mergetool_tmpdir_init
@@ -406,7 +408,7 @@ main () {
-t|--tool*)
case "$#,$1" in
*,*=*)
- merge_tool=$(expr "z$1" : 'z-[^=]*=\(.*\)')
+ merge_tool=${1#*=}
;;
1,*)
usage ;;