(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: 'Test for submodule diff on non-checked out submodule\n'
                  span_id: 15
                ) (Token id:Id.Lit_Chars val:'\n' span_id:16) 
                (Token
                  id: Id.Lit_Chars
                  val: 
'This test tries to verify that add_submodule_odb works when the submodule was\n'
                  span_id: 17
                ) 
                (Token
                  id: Id.Lit_Chars
                  val: 'initialized previously but the checkout has since been removed.\n'
                  span_id: 18
                )
              )
            }
          spids: [13]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_encoding)
          op: assign_op.Equal
          rhs: {(DQ (ISO8859-1))}
          spids: [30]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:added)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:43)
                command_list: 
                  (command.CommandList
                    children: [
                      (C {(printf)} 
                        {(DQ (hinzugef) (Id.Lit_Other '\\') (303) (Id.Lit_Other '\\') (274gt))}
                      )
                    ]
                  )
              )
            }
          spids: [42]
        )
      ]
    )
    (command.ShFunction
      name: add_file
      body: 
        (command.BraceGroup
          children: [
            (command.Subshell
              command_list: 
                (command.CommandList
                  children: [
                    (command.AndOr
                      ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
                      children: [
                        (C {(cd)} {(DQ ($ Id.VSub_Number '$1'))})
                        (C {(shift)})
                        (command.ForEach
                          iter_name: name
                          do_arg_iter: T
                          body: 
                            (command.DoGroup
                              children: [
                                (command.AndOr
                                  ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
                                  children: [
                                    (command.Simple
                                      words: [{(echo)} {(DQ ($ Id.VSub_DollarName '$name'))}]
                                      redirects: [
                                        (redir.Redir
                                          op: (Token id:Id.Redir_Great val:'>' span_id:95)
                                          fd: -1
                                          arg_word: {(DQ ($ Id.VSub_DollarName '$name'))}
                                        )
                                      ]
                                    )
                                    (C {(git)} {(add)} {(DQ ($ Id.VSub_DollarName '$name'))})
                                    (C {(test_tick)})
                                    (command.Pipeline
                                      children: [
                                        (C {(echo)} 
                                          {
                                            (DQ ('Add ') ($ Id.VSub_DollarName '$name') (' (') 
                                              ($ Id.VSub_DollarName '$added') (' ') ($ Id.VSub_DollarName '$name') (')')
                                            )
                                          }
                                        )
                                        (C {(iconv)} {(-f)} {(utf-8)} {(-t)} 
                                          {($ Id.VSub_DollarName '$test_encoding')}
                                        )
                                        (C {(git)} {(-c)} 
                                          {
                                            (DQ ('i18n.commitEncoding=') 
                                              ($ Id.VSub_DollarName '$test_encoding')
                                            )
                                          } {(commit)} {(-F)} {(-)}
                                        )
                                      ]
                                      negated: F
                                    )
                                  ]
                                )
                              ]
                            )
                          redirects: [
                            (redir.Redir
                              op: (Token id:Id.Redir_Great val:'>' span_id:172)
                              fd: -1
                              arg_word: {(/dev/null)}
                            )
                          ]
                        )
                        (C {(git)} {(rev-parse)} {(--short)} {(--verify)} {(HEAD)})
                      ]
                    )
                  ]
                )
            )
          ]
        )
    )
    (command.ShFunction
      name: commit_file
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {(test_tick)})
                (command.Simple
                  words: [
                    {(git)}
                    {(commit)}
                    {(DQ ($ Id.VSub_At '$@'))}
                    {(-m)}
                    {(DQ ('Commit ') ($ Id.VSub_Star '$*'))}
                  ]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:222)
                      fd: -1
                      arg_word: {(/dev/null)}
                    )
                  ]
                )
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup - submodules' span_id:231))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:235) 
          (Token id:Id.Lit_Chars val:'\ttest_create_repo sm2 &&\n' span_id:236) (Token id:Id.Lit_Chars val:'\tadd_file . foo &&\n' span_id:237) 
          (Token id:Id.Lit_Chars val:'\tadd_file sm2 foo1 foo2 &&\n' span_id:238) (Token id:Id.Lit_Chars val:'\tsmhead1=$(git -C sm2 rev-parse --short --verify HEAD)\n' span_id:239)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup - git submodule add' span_id:246))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:250) 
          (Token id:Id.Lit_Chars val:'\tgit submodule add ./sm2 sm1 &&\n' span_id:251) (Token id:Id.Lit_Chars val:'\tcommit_file sm1 .gitmodules &&\n' span_id:252) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-tree -p --no-commit-id --submodule=log HEAD -- sm1 >actual &&\n'
            span_id: 253
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:254) 
          (Token
            id: Id.Lit_Chars
            val: '\tSubmodule sm1 0000000...$smhead1 (new submodule)\n'
            span_id: 255
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:256) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:257)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'submodule directory removed' span_id:264))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:268) 
          (Token id:Id.Lit_Chars val:'\trm -rf sm1 &&\n' span_id:269) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-tree -p --no-commit-id --submodule=log HEAD -- sm1 >actual &&\n'
            span_id: 270
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:271) 
          (Token
            id: Id.Lit_Chars
            val: '\tSubmodule sm1 0000000...$smhead1 (new submodule)\n'
            span_id: 272
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:273) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:274)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup - submodule multiple commits' span_id:281))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:285) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit submodule update --checkout sm1 &&\n'
            span_id: 286
          ) (Token id:Id.Lit_Chars val:'\tsmhead2=$(add_file sm1 foo3 foo4) &&\n' span_id:287) 
          (Token id:Id.Lit_Chars val:'\tcommit_file sm1 &&\n' span_id:288) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-tree -p --no-commit-id --submodule=log HEAD >actual &&\n'
            span_id: 289
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:290) 
          (Token id:Id.Lit_Chars val:'\tSubmodule sm1 $smhead1..$smhead2:\n' span_id:291) (Token id:Id.Lit_Chars val:'\t  > Add foo4 ($added foo4)\n' span_id:292) 
          (Token id:Id.Lit_Chars val:'\t  > Add foo3 ($added foo3)\n' span_id:293) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:294) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:295)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'submodule removed multiple commits' span_id:302))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:306) 
          (Token id:Id.Lit_Chars val:'\trm -rf sm1 &&\n' span_id:307) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-tree -p --no-commit-id --submodule=log HEAD >actual &&\n'
            span_id: 308
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:309) 
          (Token id:Id.Lit_Chars val:'\tSubmodule sm1 $smhead1..$smhead2:\n' span_id:310) (Token id:Id.Lit_Chars val:'\t  > Add foo4 ($added foo4)\n' span_id:311) 
          (Token id:Id.Lit_Chars val:'\t  > Add foo3 ($added foo3)\n' span_id:312) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:313) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:314)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'submodule not initialized in new clone' span_id:321))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:325) 
          (Token id:Id.Lit_Chars val:'\tgit clone . sm3 &&\n' span_id:326) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit -C sm3 diff-tree -p --no-commit-id --submodule=log HEAD >actual &&\n'
            span_id: 327
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:328) 
          (Token
            id: Id.Lit_Chars
            val: '\tSubmodule sm1 $smhead1...$smhead2 (not initialized)\n'
            span_id: 329
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:330) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:331)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup submodule moved' span_id:338))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:342) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit submodule update --checkout sm1 &&\n'
            span_id: 343
          ) (Token id:Id.Lit_Chars val:'\tgit mv sm1 sm4 &&\n' span_id:344) 
          (Token id:Id.Lit_Chars val:'\tcommit_file sm4 &&\n' span_id:345) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-tree -p --no-commit-id --submodule=log HEAD >actual &&\n'
            span_id: 346
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:347) 
          (Token
            id: Id.Lit_Chars
            val: '\tSubmodule sm4 0000000...$smhead2 (new submodule)\n'
            span_id: 348
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:349) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:350)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'submodule moved then removed' span_id:357))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:361) 
          (Token
            id: Id.Lit_Chars
            val: '\tsmhead3=$(add_file sm4 foo6 foo7) &&\n'
            span_id: 362
          ) (Token id:Id.Lit_Chars val:'\tcommit_file sm4 &&\n' span_id:363) 
          (Token id:Id.Lit_Chars val:'\trm -rf sm4 &&\n' span_id:364) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-tree -p --no-commit-id --submodule=log HEAD >actual &&\n'
            span_id: 365
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:366) 
          (Token id:Id.Lit_Chars val:'\tSubmodule sm4 $smhead2..$smhead3:\n' span_id:367) (Token id:Id.Lit_Chars val:'\t  > Add foo7 ($added foo7)\n' span_id:368) 
          (Token id:Id.Lit_Chars val:'\t  > Add foo6 ($added foo6)\n' span_id:369) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:370) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:371)
        )
      }
    )
    (C {(test_done)})
  ]
)