# PATCH: Allow format-patch to attach patches

4 messages from 2006-03-06 to 2006-03-07. Participants: Mike McCormack, Junio C Hamano, A Large Angry SCM.
Thread: https://gitlist.dev/t/3584

## Mike McCormack, 2006-03-06 13:12

Subject: PATCH: Allow format-patch to attach patches
Message-ID: <440C352C.9070009@codeweavers.com>
URL: https://gitlist.dev/e/440C352C.9070009%40codeweavers.com

```

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, 2006-03-07 01:01

Subject: Re: PATCH: Allow format-patch to attach patches
Message-ID: <7vpskz5aqh.fsf@assigned-by-dhcp.cox.net>
URL: https://gitlist.dev/e/7vpskz5aqh.fsf%40assigned-by-dhcp.cox.net
In-Reply-To: <440C352C.9070009@codeweavers.com>

```
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, 2006-03-07 03:20

Subject: Re: PATCH: Allow format-patch to attach patches
Message-ID: <440CFC06.9080901@codeweavers.com>
URL: https://gitlist.dev/e/440CFC06.9080901%40codeweavers.com
In-Reply-To: <7vpskz5aqh.fsf@assigned-by-dhcp.cox.net>

```

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, 2006-03-07 03:24

Subject: Re: PATCH: Allow format-patch to attach patches
Message-ID: <440CFCF7.9090407@gmail.com>
URL: https://gitlist.dev/e/440CFCF7.9090407%40gmail.com
In-Reply-To: <7vpskz5aqh.fsf@assigned-by-dhcp.cox.net>

```
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.

```
