Merge branch 'dl/rebase-i-keep-base'
[gitweb.git] / git-mergetool.sh
index 88fa6a914a172877991ae9890cae1a42ca51fb89..e3f6d543fb5bb0777483081fadaa7b66035ab5fa 100755 (executable)
@@ -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
 
@@ -277,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
@@ -406,7 +423,7 @@ main () {
                -t|--tool*)
                        case "$#,$1" in
                        *,*=*)
-                               merge_tool=$(expr "z$1" : 'z-[^=]*=\(.*\)')
+                               merge_tool=${1#*=}
                                ;;
                        1,*)
                                usage ;;