X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=git-format-patch.sh;h=d3979d76318a19746b02c3efcba1212de2fcce20;hb=075dd8ee5417899c9f41b90f0dceecdf85433468;hp=bc5687653150ff1e27720173b137d759d60c74c6;hpb=ae2b0f15180d4b044828c836bcab6a990efa5c8e;p=git.git diff --git a/git-format-patch.sh b/git-format-patch.sh index bc568765..d3979d76 100755 --- a/git-format-patch.sh +++ b/git-format-patch.sh @@ -3,31 +3,28 @@ # Copyright (c) 2005 Junio C Hamano # -. git-sh-setup - -usage () { - echo >&2 "usage: $0"' [-n] [-o dir | --stdout] [--keep-subject] [--mbox] - [--check] [--signoff] [-...] - [--help] - ( from..to ... | upstream [ our-head ] ) - -Prepare each commit with its patch since our-head forked from upstream, +USAGE='[-n | -k] [-o | --stdout] [--signoff] [--check] [--mbox] [--diff-options] []' +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. -When -o is specified, output files are created in that directory; otherwise in -the current working directory. +There are three output modes. By default, output files are created in +the current working directory; when -o is specified, they are created +in that directory instead; when --stdout is specified, they are spit +on standard output, and can be piped to git-am. When -n is specified, instead of "[PATCH] Subject", the first line is formatted 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 -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=' @@ -178,6 +175,7 @@ titleScript=' whosepatchScript=' /^author /{ + s/'\''/'\''\\'\'\''/g s/author \(.*>\) \(.*\)$/au='\''\1'\'' ad='\''\2'\''/p q }' @@ -202,7 +200,7 @@ process_one () { ;; esac - eval "$(LANG=C LC_ALL=C sed -ne "$whosepatchScript" $commsg)" + eval "$(sed -ne "$whosepatchScript" $commsg)" test "$author,$au" = ",$me" || { mailScript="$mailScript"' a\ @@ -215,6 +213,8 @@ Date: '"$ad" } mailScript="$mailScript"' + a\ + : body p n @@ -238,9 +238,8 @@ Date: '"$ad" 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" - echo "---" + echo "-- " echo "@@GIT_VERSION@@" case "$mbox" in @@ -251,6 +250,15 @@ Date: '"$ad" } 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 @@ -259,16 +267,13 @@ do 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 - echo "* $file" + echo "$file" process_one >"$outdir$file" if test t = "$check" then @@ -279,7 +284,7 @@ do : fi else - echo >&2 "* $file" + echo >&2 "$file" process_one fi i=`expr "$i" + 1`