aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xgit-format-patch.sh99
1 files changed, 63 insertions, 36 deletions
diff --git a/git-format-patch.sh b/git-format-patch.sh
index 09b635e49..0207ab18a 100755
--- a/git-format-patch.sh
+++ b/git-format-patch.sh
@@ -6,7 +6,9 @@
. git-sh-setup || die "Not a git archive."
usage () {
- echo >&2 "usage: $0"' [-n] [-o dir | --stdout] [--keep-subject] [--mbox] [--check] [--signoff] [-<diff options>...] upstream [ our-head ]
+ 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,
one file per patch, for e-mail submission. Each output file is
@@ -75,25 +77,70 @@ tt)
die '--keep-subject and --numbered are incompatible.' ;;
esac
-rev1= rev2=
-case "$#" in
-2)
- rev1="$1" rev2="$2" ;;
-1)
- case "$1" in
- *..*)
- rev1=`expr "$1" : '\(.*\)\.\.'`
- rev2=`expr "$1" : '.*\.\.\(.*\)'`
+tmp=.tmp-series$$
+trap 'rm -f $tmp-*' 0 1 2 3 15
+
+series=$tmp-series
+commsg=$tmp-commsg
+filelist=$tmp-files
+
+# Backward compatible argument parsing hack.
+#
+# Historically, we supported:
+# 1. "rev1" is equivalent to "rev1..HEAD"
+# 2. "rev1..rev2"
+# 3. "rev1" "rev2 is equivalent to "rev1..rev2"
+#
+# We want to take a sequence of "rev1..rev2" in general.
+
+case "$#,$1" in
+1,?*..?*)
+ # single "rev1..rev2"
;;
- *)
- rev1="$1"
- rev2="HEAD"
+1,*)
+ # single rev1
+ set x "$1..HEAD"
+ shift
+ ;;
+2,?*..?*)
+ # not traditional "rev1" "rev2"
+ ;;
+2,*)
+ set x "$1..$2"
+ shift
;;
- esac ;;
-*)
- usage ;;
esac
+# Now we have what we want in $@
+for revpair
+do
+ case "$revpair" in
+ ?*..?*)
+ rev1=`expr "$revpair" : '\(.*\)\.\.'`
+ rev2=`expr "$revpair" : '.*\.\.\(.*\)'`
+ ;;
+ *)
+ usage
+ ;;
+ esac
+ git-rev-parse --verify "$rev1^0" >/dev/null 2>&1 ||
+ die "Not a valid rev $rev1 ($revpair)"
+ git-rev-parse --verify "$rev2^0" >/dev/null 2>&1 ||
+ die "Not a valid rev $rev2 ($revpair)"
+ git-cherry -v "$rev1" "$rev2" |
+ while read sign rev comment
+ do
+ case "$sign" in
+ '-')
+ echo >&2 "Merged already: $comment"
+ ;;
+ *)
+ echo $rev
+ ;;
+ esac
+ done
+done >$series
+
me=`git-var GIT_AUTHOR_IDENT | sed -e 's/>.*/>/'`
case "$outdir" in
@@ -102,13 +149,6 @@ case "$outdir" in
esac
test -d "$outdir" || mkdir -p "$outdir" || exit
-tmp=.tmp-series$$
-trap 'rm -f $tmp-*' 0 1 2 3 15
-
-series=$tmp-series
-commsg=$tmp-commsg
-filelist=$tmp-files
-
titleScript='
/./d
/^$/n
@@ -130,19 +170,6 @@ whosepatchScript='
q
}'
-git-cherry -v "$rev1" "$rev2" |
-while read sign rev comment
-do
- case "$sign" in
- '-')
- echo >&2 "Merged already: $comment"
- ;;
- *)
- echo $rev
- ;;
- esac
-done >$series
-
process_one () {
mailScript='
/./d