(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <"git mailinfo and git mailsplit test">)}
          spids: [13]
        )
      ]
      spids: [13]
    )
    (C {(.)} {(./test-lib.sh)})
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:DATA)
          op: Equal
          rhs: {(DQ ($ VSub_Name "$TEST_DIRECTORY") (/t5100))}
          spids: [24]
        )
      ]
      spids: [24]
    )
    (C {(test_expect_success)} {(SQ <"split sample box">)} 
      {
        (SQ <"git mailsplit -o. \"$DATA/sample.mbox\" >last &&\n"> <"\tlast=$(cat last) &&\n"> 
          <"\techo total is $last &&\n"> <"\ttest $(cat last) = 18">
        )
      }
    )
    (FuncDef
      name: check_mailinfo
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:mail)
                  op: Equal
                  rhs: {($ VSub_Number "$1")}
                  spids: [55]
                )
                (assign_pair
                  lhs: (LhsName name:opt)
                  op: Equal
                  rhs: {($ VSub_Number "$2")}
                  spids: [58]
                )
              ]
              spids: [55]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:mo)
                  op: Equal
                  rhs: {(DQ ($ VSub_Name "$mail") ($ VSub_Name "$opt"))}
                  spids: [62]
                )
              ]
              spids: [62]
            )
            (AndOr
              children: [
                (SimpleCommand
                  words: [
                    {(git)}
                    {(mailinfo)}
                    {(-u)}
                    {($ VSub_Name "$opt")}
                    {(DQ (msg) ($ VSub_Name "$mo"))}
                    {(DQ (patch) ($ VSub_Name "$mo"))}
                  ]
                  redirects: [
                    (Redir
                      op_id: Redir_Less
                      fd: -1
                      arg_word: {(DQ ($ VSub_Name "$mail"))}
                      spids: [87]
                    )
                    (Redir
                      op_id: Redir_Great
                      fd: -1
                      arg_word: {(DQ (info) ($ VSub_Name "$mo"))}
                      spids: [92]
                    )
                  ]
                )
                (AndOr
                  children: [
                    (C {(test_cmp)} {(DQ ($ VSub_Name "$DATA") (/msg) ($ VSub_Name "$mo"))} 
                      {(DQ (msg) ($ VSub_Name "$mo"))}
                    )
                    (AndOr
                      children: [
                        (C {(test_cmp)} {(DQ ($ VSub_Name "$DATA") (/patch) ($ VSub_Name "$mo"))} 
                          {(DQ (patch) ($ VSub_Name "$mo"))}
                        )
                        (C {(test_cmp)} {(DQ ($ VSub_Name "$DATA") (/info) ($ VSub_Name "$mo"))} 
                          {(DQ (info) ($ VSub_Name "$mo"))}
                        )
                      ]
                      op_id: Op_DAmp
                    )
                  ]
                  op_id: Op_DAmp
                )
              ]
              op_id: Op_DAmp
            )
          ]
          spids: [52]
        )
      spids: [47 51]
    )
    (ForEach
      iter_name: mail
      iter_words: [{(00) (Lit_Other "*")}]
      do_arg_iter: False
      body: 
        (DoGroup
          children: [
            (C {(test_expect_success)} {(DQ ("mailinfo ") ($ VSub_Name "$mail"))} 
              {
                (SQ <"\n"> <"\t\tcheck_mailinfo \"$mail\" \"\" &&\n"> 
                  <"\t\tif test -f \"$DATA/msg$mail--scissors\"\n"> <"\t\tthen\n"> <"\t\t\tcheck_mailinfo \"$mail\" --scissors\n"> <"\t\tfi &&\n"> 
                  <"\t\tif test -f \"$DATA/msg$mail--no-inbody-headers\"\n"> <"\t\tthen\n"> <"\t\t\tcheck_mailinfo \"$mail\" --no-inbody-headers\n"> <"\t\tfi &&\n"> 
                  <"\t\tif test -f \"$DATA/msg$mail--message-id\"\n"> <"\t\tthen\n"> <"\t\t\tcheck_mailinfo \"$mail\" --message-id\n"> <"\t\tfi\n"> <"\t">
                )
              }
            )
          ]
          spids: [159 187]
        )
      spids: [155 -1]
    )
    (C {(test_expect_success)} {(SQ <"split box with rfc2047 samples">)} 
      {
        (SQ <"mkdir rfc2047 &&\n"> <"\tgit mailsplit -orfc2047 \"$DATA/rfc2047-samples.mbox\" \\\n"> 
          <"\t  >rfc2047/last &&\n"> <"\tlast=$(cat rfc2047/last) &&\n"> <"\techo total is $last &&\n"> <"\ttest $(cat rfc2047/last) = 11">
        )
      }
    )
    (ForEach
      iter_name: mail
      iter_words: [{(rfc2047/00) (Lit_Other "*")}]
      do_arg_iter: False
      body: 
        (DoGroup
          children: [
            (C {(test_expect_success)} {(DQ ("mailinfo ") ($ VSub_Name "$mail"))} 
              {
                (SQ <"\n"> 
                  <
"\t\tgit mailinfo -u \"$mail-msg\" \"$mail-patch\" <\"$mail\" >\"$mail-info\" &&\n"
                  > <"\t\techo msg &&\n"> <"\t\ttest_cmp \"$DATA/empty\" \"$mail-msg\" &&\n"> <"\t\techo patch &&\n"> 
                  <"\t\ttest_cmp \"$DATA/empty\" \"$mail-patch\" &&\n"> <"\t\techo info &&\n"> <"\t\ttest_cmp \"$DATA/rfc2047-info-$(basename $mail)\" \"$mail-info\"\n"> 
                  <"\t">
                )
              }
            )
          ]
          spids: [218 240]
        )
      spids: [214 -1]
    )
    (C {(test_expect_success)} {(SQ <"respect NULs">)} 
      {
        (SQ <"\n"> <"\n"> <"\tgit mailsplit -d3 -o. \"$DATA/nul-plain\" &&\n"> 
          <"\ttest_cmp \"$DATA/nul-plain\" 001 &&\n"> <"\t(cat 001 | git mailinfo msg patch) &&\n"> <"\ttest_line_count = 4 patch\n"> <"\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"Preserve NULs out of MIME encoded message">)} 
      {
        (SQ <"\n"> <"\n"> <"\tgit mailsplit -d5 -o. \"$DATA/nul-b64.in\" &&\n"> 
          <"\ttest_cmp \"$DATA/nul-b64.in\" 00001 &&\n"> <"\tgit mailinfo msg patch <00001 &&\n"> <"\ttest_cmp \"$DATA/nul-b64.expect\" patch\n"> <"\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"mailinfo on from header without name works">)} 
      {
        (SQ <"\n"> <"\n"> <"\tmkdir info-from &&\n"> 
          <"\tgit mailsplit -oinfo-from \"$DATA/info-from.in\" &&\n"> <"\ttest_cmp \"$DATA/info-from.in\" info-from/0001 &&\n"> 
          <"\tgit mailinfo info-from/msg info-from/patch \\\n"> <"\t  <info-from/0001 >info-from/out &&\n"> <"\ttest_cmp \"$DATA/info-from.expect\" info-from/out\n"> 
          <"\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"mailinfo finds headers after embedded From line">)} 
      {
        (SQ <"\n"> <"\tmkdir embed-from &&\n"> 
          <"\tgit mailsplit -oembed-from \"$DATA/embed-from.in\" &&\n"> <"\ttest_cmp \"$DATA/embed-from.in\" embed-from/0001 &&\n"> 
          <"\tgit mailinfo embed-from/msg embed-from/patch \\\n"> <"\t  <embed-from/0001 >embed-from/out &&\n"> 
          <"\ttest_cmp \"$DATA/embed-from.expect\" embed-from/out\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"mailinfo on message with quoted >From">)} 
      {
        (SQ <"\n"> <"\tmkdir quoted-from &&\n"> 
          <"\tgit mailsplit -oquoted-from \"$DATA/quoted-from.in\" &&\n"> <"\ttest_cmp \"$DATA/quoted-from.in\" quoted-from/0001 &&\n"> 
          <"\tgit mailinfo quoted-from/msg quoted-from/patch \\\n"> <"\t  <quoted-from/0001 >quoted-from/out &&\n"> 
          <"\ttest_cmp \"$DATA/quoted-from.expect\" quoted-from/msg\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"mailinfo unescapes with --mboxrd">)} 
      {
        (SQ <"\n"> <"\tmkdir mboxrd &&\n"> <"\tgit mailsplit -omboxrd --mboxrd \\\n"> 
          <"\t\t\"$DATA/sample.mboxrd\" >last &&\n"> <"\ttest x\"$(cat last)\" = x2 &&\n"> <"\tfor i in 0001 0002\n"> <"\tdo\n"> 
          <"\t\tgit mailinfo mboxrd/msg mboxrd/patch \\\n"> <"\t\t  <mboxrd/$i >mboxrd/out &&\n"> <"\t\ttest_cmp \"$DATA/${i}mboxrd\" mboxrd/msg\n"> 
          <"\tdone &&\n"> <"\tsp=\" \" &&\n"> <"\techo \"From \" >expect &&\n"> <"\techo \"From \" >>expect &&\n"> 
          <"\techo >> expect &&\n"> <"\tcat >sp <<-INPUT_END &&\n"> <"\tFrom mboxrd Mon Sep 17 00:00:00 2001\n"> 
          <"\tFrom: trailing spacer <sp@example.com>\n"> <"\tSubject: [PATCH] a commit with trailing space\n"> <"\n"> <"\tFrom$sp\n"> <"\t>From$sp\n"> <"\n"> 
          <"\tINPUT_END\n"> <"\n"> <"\tgit mailsplit -f2 -omboxrd --mboxrd <sp >last &&\n"> <"\ttest x\"$(cat last)\" = x1 &&\n"> 
          <"\tgit mailinfo mboxrd/msg mboxrd/patch <mboxrd/0003 &&\n"> <"\ttest_cmp expect mboxrd/msg\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"mailinfo handles rfc2822 quoted-string">)} 
      {
        (SQ <"\n"> <"\tmkdir quoted-string &&\n"> 
          <"\tgit mailinfo /dev/null /dev/null <\"$DATA/quoted-string.in\" \\\n"> <"\t\t>quoted-string/info &&\n"> <"\ttest_cmp \"$DATA/quoted-string.expect\" quoted-string/info\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"mailinfo handles rfc2822 comment">)} 
      {
        (SQ <"\n"> <"\tmkdir comment &&\n"> 
          <"\tgit mailinfo /dev/null /dev/null <\"$DATA/comment.in\" \\\n"> <"\t\t>comment/info &&\n"> <"\ttest_cmp \"$DATA/comment.expect\" comment/info\n">
        )
      }
    )
    (C {(test_done)})
  ]
)