X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=git-format-patch-script;h=3565205426cb3cc83918b3be6783813414dee41c;hb=db4b65821e65138177de9afbce70f141cc831224;hp=a07e30e8daf6a51bc4176fc60c1397b14630d25b;hpb=0acfc9725287d21ab7478020b66f39d7ea511804;p=git.git diff --git a/git-format-patch-script b/git-format-patch-script index a07e30e8..35652054 100755 --- a/git-format-patch-script +++ b/git-format-patch-script @@ -3,8 +3,10 @@ # Copyright (c) 2005 Junio C Hamano # +. git-sh-setup-script || die "Not a git archive." + usage () { - echo >&2 "usage: $0"' [-n] [-o dir] [-...] upstream [ our-head ] + echo >&2 "usage: $0"' [-n] [-o dir] [--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 @@ -16,6 +18,10 @@ the current working directory. 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 } @@ -25,13 +31,26 @@ IFS=' ' LF=' ' -outdir=./ +outdir=./ while case "$#" in 0) break;; esac do case "$1" in + -a|--a|--au|--aut|--auth|--autho|--author) + author=t ;; + -c|--c|--ch|--che|--chec|--check) + check=t ;; + -d|--d|--da|--dat|--date) + date=t ;; + -m|--m|--mb|--mbo|--mbox) + date=t author=t mbox=t ;; + -k|--k|--ke|--kee|--keep|--keep-|--keep-s|--keep-su|--keep-sub|\ + --keep-subj|--keep-subje|--keep-subjec|--keep-subject) + keep_subject=t ;; -n|--n|--nu|--num|--numb|--numbe|--number|--numbere|--numbered) numbered=t ;; + -s|--s|--si|--sig|--sign|--signo|--signof|--signoff) + signoff=t ;; -o=*|--o=*|--ou=*|--out=*|--outp=*|--outpu=*|--output=*|--output-=*|\ --output-d=*|--output-di=*|--output-dir=*|--output-dire=*|\ --output-direc=*|--output-direct=*|--output-directo=*|\ @@ -48,12 +67,28 @@ do shift done +case "$keep_subject$numbered" in +tt) + die '--keep-subject and --numbered are incompatible.' ;; +esac + +revpair= case "$#" in -2) linus="$1" junio="$2" ;; -1) linus="$1" junio=HEAD ;; -*) usage ;; +2) + revpair="$1..$2" ;; +1) + case "$1" in + *..*) + revpair="$1";; + *) + revpair="$1..HEAD";; + esac ;; +*) + usage ;; esac +me=`git-var GIT_AUTHOR_IDENT | sed -e 's/>.*/>/'` + case "$outdir" in */) ;; *) outdir="$outdir/" ;; @@ -64,11 +99,13 @@ tmp=.tmp-series$$ trap 'rm -f $tmp-*' 0 1 2 3 15 series=$tmp-series +commsg=$tmp-commsg +filelist=$tmp-files titleScript=' - 1,/^$/d - : loop - /^$/b loop + /./d + /^$/n + s/^\[PATCH[^]]*\] *// s/[^-a-z.A-Z_0-9]/-/g s/\.\.\.*/\./g s/\.*$// @@ -76,19 +113,28 @@ titleScript=' s/^-// s/-$// s/$/./ + p q ' +whosepatchScript=' +/^author /{ + s/author \(.*>\) \(.*\)$/au='\''\1'\'' ad='\''\2'\''/p + q +}' + _x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40" stripCommitHead='/^'"$_x40"' (from '"$_x40"')$/d' -git-rev-list --merge-order "$junio" "^$linus" >$series -total=`wc -l <$series` +git-rev-list --no-merges --merge-order \ + $(git-rev-parse --revs-only "$revpair") >$series +total=`wc -l <$series | tr -dc "[0-9]"` i=$total while read commit do - title=`git-cat-file commit "$commit" | sed -e "$titleScript"` + git-cat-file commit "$commit" | git-stripspace >$commsg + title=`sed -ne "$titleScript" <$commsg` case "$numbered" in '') num= ;; *) @@ -97,25 +143,78 @@ do *) num=' '`printf "%d/%d" $i $total` ;; esac esac + file=`printf '%04d-%stxt' $i "$title"` i=`expr "$i" - 1` - echo "$file" + echo "* $file" { mailScript=' - 1,/^$/d - : loop - /^$/b loop - s|^|[PATCH'"$num"'] | + /./d + /^$/n' + case "$keep_subject" in + t) ;; + *) + mailScript="$mailScript"' + s|^\[PATCH[^]]*\] *|| + s|^|[PATCH'"$num"'] |' + ;; + esac + mailScript="$mailScript"' + s|^|Subject: |' + case "$mbox" in + t) + 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"' + a\ +From: '"$au" + } + test "$date,$au" = ",$me" || { + mailScript="$mailScript"' + a\ +Date: '"$ad" + } + + mailScript="$mailScript"' : body p n b body' - git-cat-file commit "$commit" | sed -ne "$mailScript" + sed -ne "$mailScript" <$commsg + + test "$signoff" = "t" && { + offsigner=`git-var GIT_COMMITTER_IDENT | sed -e 's/>.*/>/'` + line="Signed-off-by: $offsigner" + grep -q "^$line\$" $commsg || { + echo + echo "$line" + echo + } + } + echo '---' echo git-diff-tree -p $diff_opts "$commit" | git-apply --stat --summary echo git-diff-tree -p $diff_opts "$commit" | sed -e "$stripCommitHead" + + case "$mbox" in + t) + 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. + esac done <$series