git-am foreign patch support: StGIT support
authorGiuseppe Bilotta <giuseppe.bilotta@gmail.com>
Wed, 27 May 2009 09:25:18 +0000 (11:25 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 29 May 2009 06:07:43 +0000 (23:07 -0700)
Support StGIT patches by implementing a simple perl-based converter
mimicking StGIT's own parse_patch. Also support StGIT patch series by
'exploding' the index into a list of files and re-running the mail
splitting with patch_format set to stgit.

Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-am.sh

index 552b888..0ff1f57 100755 (executable)
--- a/git-am.sh
+++ b/git-am.sh
@@ -191,6 +191,63 @@ split_patches () {
                        exit 1
                }
                ;;
+       stgit-series)
+               if test $# -ne 1
+               then
+                       echo "Only one StGIT patch series can be applied at once"
+                       exit 1
+               fi
+               series_dir=`dirname "$1"`
+               series_file="$1"
+               shift
+               {
+                       set x
+                       while read filename
+                       do
+                               set "$@" "$series_dir/$filename"
+                       done
+                       # remove the safety x
+                       shift
+                       # remove the arg coming from the first-line comment
+                       shift
+               } < "$series_file"
+               # set the patch format appropriately
+               patch_format=stgit
+               # now handle the actual StGIT patches
+               split_patches "$@"
+               ;;
+       stgit)
+               this=0
+               for stgit in "$@"
+               do
+                       this=`expr "$this" + 1`
+                       msgnum=`printf "%0${prec}d" $this`
+                       # Perl version of StGIT parse_patch. The first nonemptyline
+                       # not starting with Author, From or Date is the
+                       # subject, and the body starts with the next nonempty
+                       # line not starting with Author, From or Date
+                       perl -ne 'BEGIN { $subject = 0 }
+                               if ($subject > 1) { print ; }
+                               elsif (/^\s+$/) { next ; }
+                               elsif (/^Author:/) { print s/Author/From/ ; }
+                               elsif (/^(From|Date)/) { print ; }
+                               elsif ($subject) {
+                                       $subject = 2 ;
+                                       print "\n" ;
+                                       print ;
+                               } else {
+                                       print "Subject: ", $_ ;
+                                       $subject = 1;
+                               }
+                       ' < "$stgit" > "$dotest/$msgnum" || {
+                               echo "Failed to import $patch_format patch $stgit"
+                               exit 1
+                       }
+               done
+               echo "$this" > "$dotest/last"
+               this=
+               msgnum=
+               ;;
        *)
                echo "Patch format $patch_format is not supported."
                exit 1