threads / discuss / 3584

PATCH: Allow format-patch to attach patches

Subject: PATCH: Allow format-patch to attach patches

## tl;dr

4 messages between Mar 6, 2006 and Mar 7, 2006.

replies: 3people: 3as markdown or json

Mike McCormack· Mar 6, 2006, 13:12 UTC · lore

The --attach patch to git-format-patch to attach patches instead of inlining them. Some mailers linewrap inlined patches (eg. Mozilla).

---
  git-format-patch.sh |   52 
++++++++++++++++++++++++++++++++++++++++++++-------
  1 files changed, 45 insertions(+), 7 deletions(-)
b17ef6b06ebaaf9b6d1f47c6a788cffd77e2b927
diff --git a/git-format-patch.sh b/git-format-patch.sh
index bbd2e55..2ebf7e8 100755
--- a/git-format-patch.sh
+++ b/git-format-patch.sh
@@ -3,7 +3,7 @@
 # Copyright (c) 2005 Junio C Hamano
 #
 
-USAGE='[-n | -k] [-o <dir> | --stdout] [--signoff] [--check] [--diff-options] <his> [<mine>]'
+USAGE='[-n | -k] [-o <dir> | --stdout] [--signoff] [--check] [--diff-options] [--attach] <his> [<mine>]'
 LONG_USAGE='Prepare each commit with its patch since <mine> head forked from
 <his> head, one file per patch formatted to resemble UNIX mailbox
 format, for e-mail submission or use with git-am.
@@ -18,7 +18,9 @@ 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.'
+one patch.
+
+When --attach is specified, patches are attached, not inlined.'
 
 . git-sh-setup
 
@@ -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 ;;
@@ -150,6 +154,11 @@ 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
 */) ;;
@@ -174,7 +183,7 @@ titleScript='
 
 process_one () {
 	perl -w -e '
-my ($keep_subject, $num, $signoff, $headers, $commsg) = @ARGV;
+my ($keep_subject, $num, $signoff, $headers, $mimemagic, $commsg) = @ARGV;
 my ($signoff_pattern, $done_header, $done_subject, $done_separator, $signoff_seen,
     $last_was_signoff);
 
@@ -229,6 +238,16 @@ while (<FH>) {
 	    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;
     }
@@ -254,14 +273,33 @@ if (!$signoff_seen && $signoff ne "") {
 }
 print "\n---\n\n";
 close FH or die "close $commsg pipe";
-' "$keep_subject" "$num" "$signoff" "$headers" $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
 }
 
Junio C Hamano· Mar 7, 2006, 01:01 UTC · re: Mike McCormack · lore

Re: PATCH: Allow format-patch to attach patches

Nicely done.

Especially I like the part that you explicitly set charset to UTF-8 to the primary part.

The only two and half minor issues I might have about this are:
 (1) is the type text/x-patch appropriate?
 (2) is it possible to cheaply come up with a safe mime-magic,
     instead of a hardcoded long string and hope it does not
     clash?

You can just say "Yes it is an established practice, widely accepted and that is what you are responding to so obviously you can grok it ;-)" to (1). About (2), you would probably need to read the "diff-tree -p" output beforehand if we want to be absolutely sure, so punting on the issue like this might be the best practical approach for now, but I am asking it anyway because people may have better ideas.

The remaining half issue is if would it make sense to sometimes optionally use non 8-bit CTE for the patch part. I do _NOT_ want to receive CTE=QP patch myself, nor I want to encourage it (actually I would want to actively discourage it), but I do not mind if people find use of such a patch in a distant corner of the galaxy where I do not have to touch such a patch.

Mike McCormack· Mar 7, 2006, 03:20 UTC · re: Junio C Hamano · lore

Re: PATCH: Allow format-patch to attach patches

Junio C Hamano wrote:
> The only two and half minor issues I might have about this are:
> 
>  (1) is the type text/x-patch appropriate?

I'm no expert on MIME types, unfortunately. Maybe text/x-diff makes more sense? A few different projects require one of those two types for diffs sent as attachments. My main concern is that mailers can recognize that the attachment is text, then displayed with the message so that people can see the patch without opening the attachment.

>  (2) is it possible to cheaply come up with a safe mime-magic,
>      instead of a hardcoded long string and hope it does not
>      clash?
I agree that using a hardcoded long string isn't that great.  Reading 
all of the "diff-tree -p" output seems a bit expensive.  How about using 
   some part of the patch's SHA1 combined with date/time?
> The remaining half issue is if would it make sense to sometimes
> optionally use non 8-bit CTE for the patch part.
Maybe allow something like:
git-format-patch --attach=quoted-printable

where the default would be 8bit. This require adding a perl script for each Content-Transfer-Encoding that we support.

Mike
A Large Angry SCM· Mar 7, 2006, 03:24 UTC · re: Junio C Hamano · lore

Re: PATCH: Allow format-patch to attach patches

Junio C Hamano wrote:
> Nicely done.
...
> The only two and half minor issues I might have about this are:
> 
...
> 
>  (2) is it possible to cheaply come up with a safe mime-magic,
>      instead of a hardcoded long string and hope it does not
>      clash?
Base64 encode a large number (160?) of bits from /dev/urandom.

← back to recent threads