git-format-patch should show the correct version
[git.git] / git-format-patch.sh
index 0207ab1..daa3cae 100755 (executable)
@@ -3,14 +3,8 @@
 # Copyright (c) 2005 Junio C Hamano
 #
 
 # Copyright (c) 2005 Junio C Hamano
 #
 
-. git-sh-setup || die "Not a git archive."
-
-usage () {
-    echo >&2 "usage: $0"' [-n] [-o dir | --stdout] [--keep-subject] [--mbox]
-    [--check] [--signoff] [-<diff options>...]
-    ( from..to ... | upstream [ our-head ] )
-
-Prepare each commit with its patch since our-head forked from upstream,
+USAGE='[-n | -k] [-o <dir> | --stdout] [--signoff] [--check] [--mbox] [--diff-options] <upstream> [<our-head>]'
+LONG_USAGE='Prepare each commit with its patch since our-head forked from upstream,
 one file per patch, for e-mail submission.  Each output file is
 numbered sequentially from 1, and uses the first line of the commit
 message (massaged for pathname safety) as the filename.
 one file per patch, for e-mail submission.  Each output file is
 numbered sequentially from 1, and uses the first line of the commit
 message (massaged for pathname safety) as the filename.
@@ -23,10 +17,12 @@ as "[PATCH N/M] Subject", unless you have only one patch.
 
 When --mbox is specified, the output is formatted to resemble
 UNIX mailbox format, and can be concatenated together for processing
 
 When --mbox is specified, the output is formatted to resemble
 UNIX mailbox format, and can be concatenated together for processing
-with applymbox.
-'
-    exit 1
-}
+with applymbox.'
+. git-sh-setup
+
+# Force diff to run in C locale.
+LANG=C LC_ALL=C
+export LANG LC_ALL
 
 diff_opts=
 LF='
 
 diff_opts=
 LF='
@@ -63,6 +59,9 @@ do
     --output-directo|--output-director|--output-directory)
     case "$#" in 1) usage ;; esac; shift
     outdir="$1" ;;
     --output-directo|--output-director|--output-directory)
     case "$#" in 1) usage ;; esac; shift
     outdir="$1" ;;
+    -h|--h|--he|--hel|--help)
+        usage
+       ;;
     -*' '* | -*"$LF"* | -*'    '*)
        # Ignore diff option that has whitespace for now.
        ;;
     -*' '* | -*"$LF"* | -*'    '*)
        # Ignore diff option that has whitespace for now.
        ;;
@@ -92,11 +91,18 @@ filelist=$tmp-files
 # 3. "rev1" "rev2      is equivalent to "rev1..rev2"
 #
 # We want to take a sequence of "rev1..rev2" in general.
 # 3. "rev1" "rev2      is equivalent to "rev1..rev2"
 #
 # We want to take a sequence of "rev1..rev2" in general.
+# Also, "rev1.." should mean "rev1..HEAD"; git-diff users are
+# familiar with that syntax.
 
 
-case "$#,$1" in
+case "$#,$1$2" in
 1,?*..?*)
        # single "rev1..rev2"
        ;;
 1,?*..?*)
        # single "rev1..rev2"
        ;;
+1,?*..)
+       # single "rev1.." should mean "rev1..HEAD"
+       set x "$1"HEAD
+       shift
+       ;;
 1,*)
        # single rev1
        set x "$1..HEAD"
 1,*)
        # single rev1
        set x "$1..HEAD"
@@ -120,7 +126,8 @@ do
                rev2=`expr "$revpair" : '.*\.\.\(.*\)'`
                ;;
        *)
                rev2=`expr "$revpair" : '.*\.\.\(.*\)'`
                ;;
        *)
-               usage
+               rev1="$revpair^"
+               rev2="$revpair"
                ;;
        esac
        git-rev-parse --verify "$rev1^0" >/dev/null 2>&1 ||
                ;;
        esac
        git-rev-parse --verify "$rev1^0" >/dev/null 2>&1 ||
@@ -203,6 +210,8 @@ Date: '"$ad"
        }
 
        mailScript="$mailScript"'
        }
 
        mailScript="$mailScript"'
+       a\
+
        : body
        p
        n
        : body
        p
        n
@@ -226,9 +235,8 @@ Date: '"$ad"
        echo
        git-diff-tree -p $diff_opts "$commit" | git-apply --stat --summary
        echo
        echo
        git-diff-tree -p $diff_opts "$commit" | git-apply --stat --summary
        echo
-       git-cat-file commit "$commit^" | sed -e 's/^tree /applies-to: /' -e q
        git-diff-tree -p $diff_opts "$commit"
        git-diff-tree -p $diff_opts "$commit"
-       echo "---"
+       echo "-- "
        echo "@@GIT_VERSION@@"
 
        case "$mbox" in
        echo "@@GIT_VERSION@@"
 
        case "$mbox" in
@@ -239,6 +247,15 @@ Date: '"$ad"
 }
 
 total=`wc -l <$series | tr -dc "[0-9]"`
 }
 
 total=`wc -l <$series | tr -dc "[0-9]"`
+case "$total,$numbered" in
+1,*)
+       numfmt='' ;;
+*,t)
+       numfmt=`echo "$total" | wc -c`
+       numfmt=$(($numfmt-1))
+       numfmt=" %0${numfmt}d/$total"
+esac
+
 i=1
 while read commit
 do
 i=1
 while read commit
 do
@@ -247,16 +264,13 @@ do
     case "$numbered" in
     '') num= ;;
     *)
     case "$numbered" in
     '') num= ;;
     *)
-       case $total in
-       1) num= ;;
-       *) num=' '`printf "%d/%d" $i $total` ;;
-       esac
+        num=`printf "$numfmt" $i` ;;
     esac
 
     file=`printf '%04d-%stxt' $i "$title"`
     if test '' = "$stdout"
     then
     esac
 
     file=`printf '%04d-%stxt' $i "$title"`
     if test '' = "$stdout"
     then
-           echo "$file"
+           echo "$file"
            process_one >"$outdir$file"
            if test t = "$check"
            then
            process_one >"$outdir$file"
            if test t = "$check"
            then
@@ -267,7 +281,7 @@ do
                :
            fi
     else
                :
            fi
     else
-           echo >&2 "$file"
+           echo >&2 "$file"
            process_one
     fi
     i=`expr "$i" + 1`
            process_one
     fi
     i=`expr "$i" + 1`