Merge branch 'ks/maint-mailinfo-folded'
authorJunio C Hamano <gitster@pobox.com>
Sun, 1 Feb 2009 02:09:17 +0000 (18:09 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sun, 1 Feb 2009 02:09:17 +0000 (18:09 -0800)
* ks/maint-mailinfo-folded:
mailinfo: tests for RFC2047 examples
mailinfo: add explicit test for mails like '<a.u.thor@example.com> (A U Thor)'
mailinfo: 'From:' header should be unfold as well
mailinfo: correctly handle multiline 'Subject:' header

1  2 
builtin-mailinfo.c
t/t5100-mailinfo.sh
diff --combined builtin-mailinfo.c
index f7c8c08b320c99d8bf96443ae57aa33c1de7e8c0,dacc8ac2d0e63e46dd1aa8fee6ba949bdd319e43..d4dc23a36398e33dd3cf6a75dc8fbc58c06b09c4
@@@ -430,13 -430,6 +430,6 @@@ static struct strbuf *decode_b_segment(
                        c -= 'a' - 26;
                else if ('0' <= c && c <= '9')
                        c -= '0' - 52;
-               else if (c == '=') {
-                       /* padding is almost like (c == 0), except we do
-                        * not output NUL resulting only from it;
-                        * for now we just trust the data.
-                        */
-                       c = 0;
-               }
                else
                        continue; /* garbage */
                switch (pos++) {
@@@ -494,7 -487,7 +487,7 @@@ static void convert_to_utf8(struct strb
                return;
        out = reencode_string(line->buf, metainfo_charset, charset);
        if (!out)
 -              die("cannot convert from %s to %s\n",
 +              die("cannot convert from %s to %s",
                    charset, metainfo_charset);
        strbuf_attach(line, out, strlen(out), strlen(out));
  }
@@@ -514,7 -507,25 +507,25 @@@ static int decode_header_bq(struct strb
                rfc2047 = 1;
  
                if (in != ep) {
-                       strbuf_add(&outbuf, in, ep - in);
+                       /*
+                        * We are about to process an encoded-word
+                        * that begins at ep, but there is something
+                        * before the encoded word.
+                        */
+                       char *scan;
+                       for (scan = in; scan < ep; scan++)
+                               if (!isspace(*scan))
+                                       break;
+                       if (scan != ep || in == it->buf) {
+                               /*
+                                * We should not lose that "something",
+                                * unless we have just processed an
+                                * encoded-word, and there is only LWS
+                                * before the one we are about to process.
+                                */
+                               strbuf_add(&outbuf, in, ep - in);
+                       }
                        in = ep;
                }
                /* E.g.
@@@ -860,6 -871,7 +871,7 @@@ static void handle_info(void
                        }
                        output_header_lines(fout, "Subject", hdr);
                } else if (!memcmp(header[i], "From", 4)) {
+                       cleanup_space(hdr);
                        handle_from(hdr);
                        fprintf(fout, "Author: %s\n", name.buf);
                        fprintf(fout, "Email: %s\n", email.buf);
diff --combined t/t5100-mailinfo.sh
index fe14589427643b9bb7759c597935da724adf1a64,b851b3a1758ee2efd62aee86c988024b10cb3e7b..e70ea94a1368dc045469808d30c717aa2b8bb158
@@@ -8,28 -8,49 +8,50 @@@ test_description='git mailinfo and git 
  . ./test-lib.sh
  
  test_expect_success 'split sample box' \
 -      'git mailsplit -o. ../t5100/sample.mbox >last &&
 +      'git mailsplit -o. "$TEST_DIRECTORY"/t5100/sample.mbox >last &&
        last=`cat last` &&
        echo total is $last &&
-       test `cat last` = 11'
+       test `cat last` = 13'
  
  for mail in `echo 00*`
  do
 -      test_expect_success "mailinfo $mail" \
 -              "git mailinfo -u msg$mail patch$mail <$mail >info$mail &&
 +      test_expect_success "mailinfo $mail" '
 +              git mailinfo -u msg$mail patch$mail <$mail >info$mail &&
                echo msg &&
 -              diff ../t5100/msg$mail msg$mail &&
 +              test_cmp "$TEST_DIRECTORY"/t5100/msg$mail msg$mail &&
                echo patch &&
 -              diff ../t5100/patch$mail patch$mail &&
 +              test_cmp "$TEST_DIRECTORY"/t5100/patch$mail patch$mail &&
                echo info &&
 -              diff ../t5100/info$mail info$mail"
 +              test_cmp "$TEST_DIRECTORY"/t5100/info$mail info$mail
 +      '
  done
  
+ test_expect_success 'split box with rfc2047 samples' \
+       'mkdir rfc2047 &&
+       git mailsplit -orfc2047 "$TEST_DIRECTORY"/t5100/rfc2047-samples.mbox \
+         >rfc2047/last &&
+       last=`cat rfc2047/last` &&
+       echo total is $last &&
+       test `cat rfc2047/last` = 11'
+ for mail in `echo rfc2047/00*`
+ do
+       test_expect_success "mailinfo $mail" '
+               git mailinfo -u $mail-msg $mail-patch <$mail >$mail-info &&
+               echo msg &&
+               test_cmp "$TEST_DIRECTORY"/t5100/empty $mail-msg &&
+               echo patch &&
+               test_cmp "$TEST_DIRECTORY"/t5100/empty $mail-patch &&
+               echo info &&
+               test_cmp "$TEST_DIRECTORY"/t5100/rfc2047-info-$(basename $mail) $mail-info
+       '
+ done
  test_expect_success 'respect NULs' '
  
 -      git mailsplit -d3 -o. ../t5100/nul-plain &&
 -      cmp ../t5100/nul-plain 001 &&
 +      git mailsplit -d3 -o. "$TEST_DIRECTORY"/t5100/nul-plain &&
 +      test_cmp "$TEST_DIRECTORY"/t5100/nul-plain 001 &&
        (cat 001 | git mailinfo msg patch) &&
        test 4 = $(wc -l < patch)
  
  
  test_expect_success 'Preserve NULs out of MIME encoded message' '
  
 -      git mailsplit -d5 -o. ../t5100/nul-b64.in &&
 -      cmp ../t5100/nul-b64.in 00001 &&
 +      git mailsplit -d5 -o. "$TEST_DIRECTORY"/t5100/nul-b64.in &&
 +      test_cmp "$TEST_DIRECTORY"/t5100/nul-b64.in 00001 &&
        git mailinfo msg patch <00001 &&
 -      cmp ../t5100/nul-b64.expect patch
 +      test_cmp "$TEST_DIRECTORY"/t5100/nul-b64.expect patch
  
  '