From 3ff8cbeda635422f4740d325d56288dfdea10179 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Tue, 4 Oct 2005 12:41:35 -0700 Subject: Record which tree the patch applies to. Also note which version of GIT produced the patch. Signed-off-by: Junio C Hamano --- git-format-patch.sh | 3 +++ 1 file changed, 3 insertions(+) (limited to 'git-format-patch.sh') diff --git a/git-format-patch.sh b/git-format-patch.sh index 2844799535..9378219d84 100755 --- a/git-format-patch.sh +++ b/git-format-patch.sh @@ -212,7 +212,10 @@ 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 "@@GIT_VERSION@@" case "$mbox" in t) -- cgit v1.3 From 655c7470e2ea7f25f22703b6654d7570e1567a39 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Thu, 6 Oct 2005 14:25:52 -0700 Subject: git-format-patch: --stdout option. This new flag generates the mbox formatted output to the standard output, instead of saving them into a file per patch and implies --mbox. It also fixes a corner case where the commit does not have *any* message. Signed-off-by: Junio C Hamano --- git-format-patch.sh | 72 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 42 insertions(+), 30 deletions(-) (limited to 'git-format-patch.sh') diff --git a/git-format-patch.sh b/git-format-patch.sh index 9378219d84..09b635e492 100755 --- a/git-format-patch.sh +++ b/git-format-patch.sh @@ -6,7 +6,7 @@ . git-sh-setup || die "Not a git archive." usage () { - echo >&2 "usage: $0"' [-n] [-o dir] [--keep-subject] [--mbox] [--check] [--signoff] [-...] upstream [ our-head ] + echo >&2 "usage: $0"' [-n] [-o dir | --stdout] [--keep-subject] [--mbox] [--check] [--signoff] [-...] 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 @@ -49,6 +49,8 @@ do numbered=t ;; -s|--s|--si|--sig|--sign|--signo|--signof|--signoff) signoff=t ;; + --st|--std|--stdo|--stdou|--stdout) + stdout=t mbox=t date=t author=t ;; -o=*|--o=*|--ou=*|--out=*|--outp=*|--outpu=*|--output=*|--output-=*|\ --output-d=*|--output-di=*|--output-dir=*|--output-dire=*|\ --output-direc=*|--output-direct=*|--output-directo=*|\ @@ -141,25 +143,7 @@ do esac done >$series -total=`wc -l <$series | tr -dc "[0-9]"` -i=1 -while read commit -do - git-cat-file commit "$commit" | git-stripspace >$commsg - title=`sed -ne "$titleScript" <$commsg` - case "$numbered" in - '') num= ;; - *) - case $total in - 1) num= ;; - *) num=' '`printf "%d/%d" $i $total` ;; - esac - esac - - file=`printf '%04d-%stxt' $i "$title"` - i=`expr "$i" + 1` - echo "* $file" - { +process_one () { mailScript=' /./d /^$/n' @@ -178,6 +162,7 @@ do echo 'From nobody Mon Sep 17 00:00:00 2001' ;# UNIX "From" line ;; esac + eval "$(sed -ne "$whosepatchScript" $commsg)" test "$author,$au" = ",$me" || { mailScript="$mailScript"' @@ -196,7 +181,9 @@ Date: '"$ad" n b body' - sed -ne "$mailScript" <$commsg + (cat $commsg ; echo; echo) | + sed -ne "$mailScript" | + git-stripspace test "$signoff" = "t" && { offsigner=`git-var GIT_COMMITTER_IDENT | sed -e 's/>.*/>/'` @@ -222,14 +209,39 @@ Date: '"$ad" echo ;; esac - } >"$outdir$file" - case "$check" in - t) - # This is slightly modified from Andrew Morton's Perfect Patch. - # Lines you introduce should not have trailing whitespace. - # Also check for an indentation that has SP before a TAB. - grep -n '^+\([ ]* .*\|.*[ ]\)$' "$outdir$file" - - : do not exit with non-zero because we saw no problem in the last one. +} + +total=`wc -l <$series | tr -dc "[0-9]"` +i=1 +while read commit +do + git-cat-file commit "$commit" | git-stripspace >$commsg + title=`sed -ne "$titleScript" <$commsg` + case "$numbered" in + '') num= ;; + *) + case $total in + 1) num= ;; + *) num=' '`printf "%d/%d" $i $total` ;; + esac esac + + file=`printf '%04d-%stxt' $i "$title"` + if test '' = "$stdout" + then + echo "* $file" + process_one >"$outdir$file" + if test t = "$check" + then + # This is slightly modified from Andrew Morton's Perfect Patch. + # Lines you introduce should not have trailing whitespace. + # Also check for an indentation that has SP before a TAB. + grep -n '^+\([ ]* .*\|.*[ ]\)$' "$outdir$file" + : + fi + else + echo >&2 "* $file" + process_one + fi + i=`expr "$i" + 1` done <$series -- cgit v1.3 From 603d874587c1b6126c4415d1ca91cfc799fe9043 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Thu, 13 Oct 2005 23:18:46 -0700 Subject: format-patch: take sequence of ranges. This enhances set of revs you can give format-patch. Originally, format-patch took either one rev, or two revs: format-patch rev1 format-patch rev1 rev2 The first format was a short-hand for "format-patch rev1 HEAD" (i.e. rev2==HEAD). What this meant was to find commits that are in branch rev2 that has not been merged to branch rev1. The above notation is still supported, but now it takes sequence of "from1..to1 from2..to2 ...". In short, the second format has become a short-hand for "format-patch rev1..rev2". Commits in to1 but not in from1, to2 but not in from2, ... are formatted as emailable patches. With this, cherry-picking from other branch can be written as: git-format-patch -k --stdout master..branch1 master..branch2 | git-am -k -3 which is generally faster than traditional cherry-pick (which always did 3-way merge) if patches apply cleanly, and still falls back on 3-way merge if some of them do not. Signed-off-by: Junio C Hamano --- git-format-patch.sh | 99 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 63 insertions(+), 36 deletions(-) (limited to 'git-format-patch.sh') diff --git a/git-format-patch.sh b/git-format-patch.sh index 09b635e492..0207ab18a3 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] [-...] upstream [ our-head ] + echo >&2 "usage: $0"' [-n] [-o dir | --stdout] [--keep-subject] [--mbox] + [--check] [--signoff] [-...] + ( 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 -- cgit v1.3