X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=git-format-patch.sh;h=2ebf7e8596eaf9253cf302a01d9f9fb8c08041cf;hb=53909056da869eb79c2a20699794b63c8c87e7fd;hp=7e67c4e403f48be282e934586faa93a36e5f1ad8;hpb=949964c4af740015c53cb7630fea8795e0f710a0;p=git.git diff --git a/git-format-patch.sh b/git-format-patch.sh index 7e67c4e4..2ebf7e85 100755 --- a/git-format-patch.sh +++ b/git-format-patch.sh @@ -3,23 +3,25 @@ # Copyright (c) 2005 Junio C Hamano # -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. +USAGE='[-n | -k] [-o | --stdout] [--signoff] [--check] [--diff-options] [--attach] []' +LONG_USAGE='Prepare each commit with its patch since head forked from + head, one file per patch formatted to resemble UNIX mailbox +format, for e-mail submission or use with git-am. -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. +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 -n is specified, instead of "[PATCH] Subject", the first line is formatted -as "[PATCH N/M] Subject", unless you have only one patch. +When -o is specified, output files are created in ; otherwise +they are created in the current working directory. This option +is ignored if --stdout is specified. + +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 --attach is specified, patches are attached, not inlined.' -When --mbox is specified, the output is formatted to resemble -UNIX mailbox format, and can be concatenated together for processing -with applymbox.' . git-sh-setup # Force diff to run in C locale. @@ -40,6 +42,8 @@ do -d|--d|--da|--dat|--date|\ -m|--m|--mb|--mbo|--mbox) # now noop ;; + --at|--att|--atta|--attac|--attach) + attach=t ;; -k|--k|--ke|--kee|--keep|--keep-|--keep-s|--keep-su|--keep-sub|\ --keep-subj|--keep-subje|--keep-subjec|--keep-subject) keep_subject=t ;; @@ -48,7 +52,7 @@ do -s|--s|--si|--sig|--sign|--signo|--signof|--signoff) signoff=t ;; --st|--std|--stdo|--stdou|--stdout) - stdout=t mbox=t date=t author=t ;; + stdout=t ;; -o=*|--o=*|--ou=*|--out=*|--outp=*|--outpu=*|--output=*|--output-=*|\ --output-d=*|--output-di=*|--output-dir=*|--output-dire=*|\ --output-direc=*|--output-direct=*|--output-directo=*|\ @@ -149,6 +153,12 @@ do done >$series me=`git-var GIT_AUTHOR_IDENT | sed -e 's/>.*/>/'` +headers=`git-repo-config --get format.headers` +case "$attach" in +"") ;; +*) + mimemagic="050802040500080604070107" +esac case "$outdir" in */) ;; @@ -173,12 +183,12 @@ titleScript=' process_one () { perl -w -e ' -my ($keep_subject, $num, $signoff, $commsg) = @ARGV; -my ($signoff_pattern, $done_header, $done_subject, $signoff_seen, +my ($keep_subject, $num, $signoff, $headers, $mimemagic, $commsg) = @ARGV; +my ($signoff_pattern, $done_header, $done_subject, $done_separator, $signoff_seen, $last_was_signoff); if ($signoff) { - $signoff = `git-var GIT_COMMITTER_IDENT`; + $signoff = "Signed-off-by: " . `git-var GIT_COMMITTER_IDENT`; $signoff =~ s/>.*/>/; $signoff_pattern = quotemeta($signoff); } @@ -189,7 +199,7 @@ my @month_names = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); sub show_date { my ($time, $tz) = @_; my $minutes = abs($tz); - $minutes = ($minutes / 100) * 60 + ($minutes % 100); + $minutes = int($minutes / 100) * 60 + ($minutes % 100); if ($tz < 0) { $minutes = -$minutes; } @@ -224,10 +234,28 @@ while () { s/^\[PATCH[^]]*\]\s*//; s/^/[PATCH$num] /; } + if ($headers) { + print "$headers\n"; + } print "Subject: $_"; + if ($mimemagic) { + print "MIME-Version: 1.0\n"; + print "Content-Type: multipart/mixed;\n"; + print " boundary=\"------------$mimemagic\"\n"; + print "\n"; + print "This is a multi-part message in MIME format.\n"; + print "--------------$mimemagic\n"; + print "Content-Type: text/plain; charset=UTF-8; format=fixed\n"; + print "Content-Transfer-Encoding: 8bit\n"; + } $done_subject = 1; next; } + unless ($done_separator) { + print "\n"; + $done_separator = 1; + next if (/^$/); + } $last_was_signoff = 0; if (/Signed-off-by:/i) { @@ -245,14 +273,33 @@ if (!$signoff_seen && $signoff ne "") { } print "\n---\n\n"; close FH or die "close $commsg pipe"; -' "$keep_subject" "$num" "$signoff" $commsg +' "$keep_subject" "$num" "$signoff" "$headers" "$mimemagic" $commsg git-diff-tree -p $diff_opts "$commit" | git-apply --stat --summary echo + case "$mimemagic" in + '');; + *) + echo "--------------$mimemagic" + echo "Content-Type: text/x-patch;" + echo " name=\"$commit.diff\"" + echo "Content-Transfer-Encoding: 8bit" + echo "Content-Disposition: inline;" + echo " filename=\"$commit.diff\"" + echo + esac git-diff-tree -p $diff_opts "$commit" - echo "-- " - echo "@@GIT_VERSION@@" - + case "$mimemagic" in + '') + echo "-- " + echo "@@GIT_VERSION@@" + ;; + *) + echo + echo "--------------$mimemagic--" + echo + ;; + esac echo }