Code

filter-branch: also don't fail in map() if a commit cannot be mapped
[git.git] / git-am.sh
index 1252f26bbd46484f25e58e92680e553f7fd7c1da..8b5712968ebcfe3f8fb5426e5104de2e7d2d3334 100755 (executable)
--- a/git-am.sh
+++ b/git-am.sh
@@ -3,7 +3,7 @@
 # Copyright (c) 2005, 2006 Junio C Hamano
 
 USAGE='[--signoff] [--dotest=<dir>] [--utf8 | --no-utf8] [--binary] [--3way]
-  [--interactive] [--whitespace=<option>] <mbox>...
+  [--interactive] [--whitespace=<option>] [-C<n>] [-p<n>] <mbox>...
   or, when resuming [--skip | --resolved]'
 . git-sh-setup
 set_reflog_action am
@@ -18,7 +18,7 @@ stop_here () {
 
 stop_here_user_resolve () {
     if [ -n "$resolvemsg" ]; then
-           echo "$resolvemsg"
+           printf '%s\n' "$resolvemsg"
            stop_here $1
     fi
     cmdline=$(basename $0)
@@ -66,7 +66,7 @@ fall_back_3way () {
     git-update-index -z --index-info <"$dotest/patch-merge-index-info" &&
     GIT_INDEX_FILE="$dotest/patch-merge-tmp-index" \
     git-write-tree >"$dotest/patch-merge-base+" ||
-    cannot_fallback "Patch does not record usable index information."
+    cannot_fallback "Repository lacks necessary blobs to fall back on 3-way merge."
 
     echo Using index info to reconstruct a base tree...
     if GIT_INDEX_FILE="$dotest/patch-merge-tmp-index" \
@@ -106,7 +106,8 @@ It does not apply to blobs recorded in its index."
 }
 
 prec=4
-dotest=.dotest sign= utf8=t keep= skip= interactive= resolved= binary= ws= resolvemsg=
+dotest=.dotest sign= utf8=t keep= skip= interactive= resolved= binary= resolvemsg=
+git_apply_opt=
 
 while case "$#" in 0) break;; esac
 do
@@ -141,11 +142,11 @@ do
        --sk|--ski|--skip)
        skip=t; shift ;;
 
-       --whitespace=*)
-       ws=$1; shift ;;
+       --whitespace=*|-C*|-p*)
+       git_apply_opt="$git_apply_opt $1"; shift ;;
 
        --resolvemsg=*)
-       resolvemsg=$(echo "$1" | sed -e "s/^--resolvemsg=//"); shift ;;
+       resolvemsg=${1#--resolvemsg=}; shift ;;
 
        --)
        shift; break ;;
@@ -289,6 +290,10 @@ do
                git-mailinfo $keep $utf8 "$dotest/msg" "$dotest/patch" \
                        <"$dotest/$msgnum" >"$dotest/info" ||
                        stop_here $this
+               test -s $dotest/patch || {
+                       echo "Patch is empty.  Was it split wrong?"
+                       stop_here $this
+               }
                git-stripspace < "$dotest/msg" > "$dotest/msg-clean"
                ;;
        esac
@@ -326,7 +331,7 @@ do
                ADD_SIGNOFF=
            fi
            {
-               echo "$SUBJECT"
+               printf '%s\n' "$SUBJECT"
                if test -s "$dotest/msg-clean"
                then
                        echo
@@ -389,12 +394,12 @@ do
        fi
 
        echo
-       echo "Applying '$SUBJECT'"
+       printf 'Applying %s\n' "$SUBJECT"
        echo
 
        case "$resolved" in
        '')
-               git-apply $binary --index $ws "$dotest/patch"
+               git-apply $git_apply_opt $binary --index "$dotest/patch"
                apply_status=$?
                ;;
        t)
@@ -403,12 +408,10 @@ do
                # trust what the user has in the index file and the
                # working tree.
                resolved=
-               changed="$(git-diff-index --cached --name-only HEAD)"
-               if test '' = "$changed"
-               then
+               git-diff-index --quiet --cached HEAD && {
                        echo "No changes - did you forget to use 'git add'?"
                        stop_here_user_resolve $this
-               fi
+               }
                unmerged=$(git-ls-files -u)
                if test -n "$unmerged"
                then
@@ -430,13 +433,11 @@ do
                then
                    # Applying the patch to an earlier tree and merging the
                    # result may have produced the same tree as ours.
-                   changed="$(git-diff-index --cached --name-only HEAD)"
-                   if test '' = "$changed"
-                   then
-                           echo No changes -- Patch already applied.
-                           go_next
-                           continue
-                   fi
+                   git-diff-index --quiet --cached HEAD && {
+                       echo No changes -- Patch already applied.
+                       go_next
+                       continue
+                   }
                    # clear apply_status -- we have successfully merged.
                    apply_status=0
                fi