(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: 
            {
              (SQ 
                (Token
                  id: Id.Lit_Chars
                  val: 'blame output in various formats on a simple case'
                  span_id: 6
                )
              )
            }
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:setup span_id:17))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:21) 
          (Token id:Id.Lit_Chars val:'\techo a >file &&\n' span_id:22) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:23) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:24) (Token id:Id.Lit_Chars val:'\tgit commit -m one &&\n' span_id:25) 
          (Token id:Id.Lit_Chars val:'\techo b >>file &&\n' span_id:26) (Token id:Id.Lit_Chars val:'\techo c >>file &&\n' span_id:27) 
          (Token id:Id.Lit_Chars val:'\techo d >>file &&\n' span_id:28) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:29) 
          (Token id:Id.Lit_Chars val:'\tgit commit -a -m two\n' span_id:30)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir op:(Token id:Id.Redir_Great val:'>' span_id:36) fd:-1 arg_word:{(expect)})
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:39)
          fd: -1
          here_begin: {(SQ (Token id:Id.Lit_Chars val:EOF span_id:41))}
          here_end_span_id: 48
          stdin_parts: [
            ('^baf5e0b (A U Thor 2005-04-07 15:13:13 -0700 1) a\n')
            ('8825379d (A U Thor 2005-04-07 15:14:13 -0700 2) b\n')
            ('8825379d (A U Thor 2005-04-07 15:14:13 -0700 3) c\n')
            ('8825379d (A U Thor 2005-04-07 15:14:13 -0700 4) d\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'normal blame output' span_id:52))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:56) 
          (Token id:Id.Lit_Chars val:'\tgit blame file >actual &&\n' span_id:57) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:58)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ID1)
          op: assign_op.Equal
          rhs: {(baf5e0b3869e0b2b2beb395a3720c7b51eac94fc)}
          spids: [62]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:COMMIT1)
          op: assign_op.Equal
          rhs: 
            {
              (SQ (Token id:Id.Lit_Chars val:'author A U Thor\n' span_id:67) 
                (Token
                  id: Id.Lit_Chars
                  val: 'author-mail <author@example.com>\n'
                  span_id: 68
                ) (Token id:Id.Lit_Chars val:'author-time 1112911993\n' span_id:69) 
                (Token id:Id.Lit_Chars val:'author-tz -0700\n' span_id:70) (Token id:Id.Lit_Chars val:'committer C O Mitter\n' span_id:71) 
                (Token
                  id: Id.Lit_Chars
                  val: 'committer-mail <committer@example.com>\n'
                  span_id: 72
                ) (Token id:Id.Lit_Chars val:'committer-time 1112911993\n' span_id:73) 
                (Token id:Id.Lit_Chars val:'committer-tz -0700\n' span_id:74) (Token id:Id.Lit_Chars val:'summary one\n' span_id:75) 
                (Token id:Id.Lit_Chars val:'boundary\n' span_id:76) (Token id:Id.Lit_Chars val:'filename file' span_id:77)
              )
            }
          spids: [65]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ID2)
          op: assign_op.Equal
          rhs: {(8825379dfb8a1267b58e8e5bcf69eec838f685ec)}
          spids: [80]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:COMMIT2)
          op: assign_op.Equal
          rhs: 
            {
              (SQ (Token id:Id.Lit_Chars val:'author A U Thor\n' span_id:85) 
                (Token
                  id: Id.Lit_Chars
                  val: 'author-mail <author@example.com>\n'
                  span_id: 86
                ) (Token id:Id.Lit_Chars val:'author-time 1112912053\n' span_id:87) 
                (Token id:Id.Lit_Chars val:'author-tz -0700\n' span_id:88) (Token id:Id.Lit_Chars val:'committer C O Mitter\n' span_id:89) 
                (Token
                  id: Id.Lit_Chars
                  val: 'committer-mail <committer@example.com>\n'
                  span_id: 90
                ) (Token id:Id.Lit_Chars val:'committer-time 1112912053\n' span_id:91) 
                (Token id:Id.Lit_Chars val:'committer-tz -0700\n' span_id:92) (Token id:Id.Lit_Chars val:'summary two\n' span_id:93) 
                (Token
                  id: Id.Lit_Chars
                  val: 'previous baf5e0b3869e0b2b2beb395a3720c7b51eac94fc file\n'
                  span_id: 94
                ) (Token id:Id.Lit_Chars val:'filename file' span_id:95)
              )
            }
          spids: [83]
        )
      ]
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:101)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:104)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 124
          stdin_parts: [
            ($ Id.VSub_DollarName '$ID1')
            (' 1 1 1\n')
            ($ Id.VSub_DollarName '$COMMIT1')
            ('\n')
            ('\ta\n')
            ($ Id.VSub_DollarName '$ID2')
            (' 2 2 3\n')
            ($ Id.VSub_DollarName '$COMMIT2')
            ('\n')
            ('\tb\n')
            ($ Id.VSub_DollarName '$ID2')
            (' 3 3\n')
            ('\tc\n')
            ($ Id.VSub_DollarName '$ID2')
            (' 4 4\n')
            ('\td\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'blame --porcelain output' span_id:128))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:132) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit blame --porcelain file >actual &&\n'
            span_id: 133
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:134)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:140)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:143)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 167
          stdin_parts: [
            ($ Id.VSub_DollarName '$ID1')
            (' 1 1 1\n')
            ($ Id.VSub_DollarName '$COMMIT1')
            ('\n')
            ('\ta\n')
            ($ Id.VSub_DollarName '$ID2')
            (' 2 2 3\n')
            ($ Id.VSub_DollarName '$COMMIT2')
            ('\n')
            ('\tb\n')
            ($ Id.VSub_DollarName '$ID2')
            (' 3 3\n')
            ($ Id.VSub_DollarName '$COMMIT2')
            ('\n')
            ('\tc\n')
            ($ Id.VSub_DollarName '$ID2')
            (' 4 4\n')
            ($ Id.VSub_DollarName '$COMMIT2')
            ('\n')
            ('\td\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'blame --line-porcelain output' span_id:171))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:175) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit blame --line-porcelain file >actual &&\n'
            span_id: 176
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:177)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '--porcelain detects first non-blank line as subject'
            span_id: 184
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:188) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:189) (Token id:Id.Lit_Chars val:'\t\tGIT_INDEX_FILE=.git/tmp-index &&\n' span_id:190) 
          (Token id:Id.Lit_Chars val:'\t\texport GIT_INDEX_FILE &&\n' span_id:191) (Token id:Id.Lit_Chars val:'\t\techo "This is it" >single-file &&\n' span_id:192) 
          (Token id:Id.Lit_Chars val:'\t\tgit add single-file &&\n' span_id:193) (Token id:Id.Lit_Chars val:'\t\ttree=$(git write-tree) &&\n' span_id:194) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tcommit=$(printf "%s\\n%s\\n%s\\n\\n\\n  \\noneline\\n\\nbody\\n" \\\n'
            span_id: 195
          ) (Token id:Id.Lit_Chars val:'\t\t\t"tree $tree" \\\n' span_id:196) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t\t"author A <a@b.c> 123456789 +0000" \\\n'
            span_id: 197
          ) (Token id:Id.Lit_Chars val:'\t\t\t"committer C <c@d.e> 123456789 +0000" |\n' span_id:198) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit hash-object -w -t commit --stdin) &&\n'
            span_id: 199
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit blame --porcelain $commit -- single-file >output &&\n'
            span_id: 200
          ) (Token id:Id.Lit_Chars val:'\t\tgrep "^summary oneline$" output\n' span_id:201) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:202)
        )
      }
    )
    (C {(test_done)})
  ]
)