(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: 'Support for verbose submodule differences in git diff\n'
                  span_id: 18
                ) (Token id:Id.Lit_Chars val:'\n' span_id:19) 
                (Token
                  id: Id.Lit_Chars
                  val: 
'This test tries to verify the sanity of the --submodule option of git diff.\n'
                  span_id: 20
                )
              )
            }
          spids: [16]
        )
      ]
    )
    (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: [32]
        )
      ]
    )
    (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:45)
                command_list: 
                  (command.CommandList
                    children: [
                      (C {(printf)} 
                        {(DQ (hinzugef) (Id.Lit_Other '\\') (303) (Id.Lit_Other '\\') (274gt))}
                      )
                    ]
                  )
              )
            }
          spids: [44]
        )
      ]
    )
    (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:96)
                                          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:173)
                              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)}
                    )
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (C {(test_create_repo)} {(sm1)})
        (command.Simple
          words: [{(add_file)} {(.)} {(foo)}]
          redirects: [
            (redir.Redir
              op: (Token id:Id.Redir_Great val:'>' span_id:240)
              fd: -1
              arg_word: {(/dev/null)}
            )
          ]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:head1)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:245)
                command_list: 
                  (command.CommandList
                    children: [(C {(add_file)} {(sm1)} {(foo1)} {(foo2)})]
                  )
              )
            }
          spids: [244]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:fullhead1)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:256)
                command_list: 
                  (command.CommandList
                    children: [
                      (command.Sentence
                        child: (C {(cd)} {(sm1)})
                        terminator: (Token id:Id.Op_Semi val:';' span_id:260)
                      )
                      (C {(git)} {(rev-parse)} {(--verify)} {(HEAD)})
                    ]
                  )
              )
            }
          spids: [255]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'added submodule' span_id:275))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:279) 
          (Token id:Id.Lit_Chars val:'\tgit add sm1 &&\n' span_id:280) (Token id:Id.Lit_Chars val:'\tgit diff-index -p --submodule=log HEAD >actual &&\n' span_id:281) 
          (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:282) (Token id:Id.Lit_Chars val:'\tSubmodule sm1 0000000...$head1 (new submodule)\n' span_id:283) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:284) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:285)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'added submodule, set diff.submodule' span_id:292))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:296) 
          (Token id:Id.Lit_Chars val:'\tgit config diff.submodule log &&\n' span_id:297) (Token id:Id.Lit_Chars val:'\tgit add sm1 &&\n' span_id:298) 
          (Token id:Id.Lit_Chars val:'\tgit diff --cached >actual &&\n' span_id:299) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:300) 
          (Token
            id: Id.Lit_Chars
            val: '\tSubmodule sm1 0000000...$head1 (new submodule)\n'
            span_id: 301
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:302) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --unset diff.submodule &&\n'
            span_id: 303
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:304)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'--submodule=short overrides diff.submodule' span_id:311))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:315) 
          (Token id:Id.Lit_Chars val:'\ttest_config diff.submodule log &&\n' span_id:316) (Token id:Id.Lit_Chars val:'\tgit add sm1 &&\n' span_id:317) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --submodule=short --cached >actual &&\n'
            span_id: 318
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:319) 
          (Token id:Id.Lit_Chars val:'\tdiff --git a/sm1 b/sm1\n' span_id:320) (Token id:Id.Lit_Chars val:'\tnew file mode 160000\n' span_id:321) 
          (Token id:Id.Lit_Chars val:'\tindex 0000000..$head1\n' span_id:322) (Token id:Id.Lit_Chars val:'\t--- /dev/null\n' span_id:323) 
          (Token id:Id.Lit_Chars val:'\t+++ b/sm1\n' span_id:324) (Token id:Id.Lit_Chars val:'\t@@ -0,0 +1 @@\n' span_id:325) 
          (Token id:Id.Lit_Chars val:'\t+Subproject commit $fullhead1\n' span_id:326) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:327) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:328)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff.submodule does not affect plumbing' span_id:335))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:339) 
          (Token id:Id.Lit_Chars val:'\ttest_config diff.submodule log &&\n' span_id:340) (Token id:Id.Lit_Chars val:'\tgit diff-index -p HEAD >actual &&\n' span_id:341) 
          (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:342) (Token id:Id.Lit_Chars val:'\tdiff --git a/sm1 b/sm1\n' span_id:343) 
          (Token id:Id.Lit_Chars val:'\tnew file mode 160000\n' span_id:344) (Token id:Id.Lit_Chars val:'\tindex 0000000..$head1\n' span_id:345) 
          (Token id:Id.Lit_Chars val:'\t--- /dev/null\n' span_id:346) (Token id:Id.Lit_Chars val:'\t+++ b/sm1\n' span_id:347) 
          (Token id:Id.Lit_Chars val:'\t@@ -0,0 +1 @@\n' span_id:348) (Token id:Id.Lit_Chars val:'\t+Subproject commit $fullhead1\n' span_id:349) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:350) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:351)
        )
      }
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (C {(commit_file)} {(sm1)})
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:head2)
              op: assign_op.Equal
              rhs: 
                {
                  (command_sub
                    left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:362)
                    command_list: (command.CommandList children:[(C {(add_file)} {(sm1)} {(foo3)})])
                  )
                }
              spids: [361]
            )
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'modified submodule(forward)' span_id:374))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:378) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-index -p --submodule=log HEAD >actual &&\n'
            span_id: 379
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:380) 
          (Token id:Id.Lit_Chars val:'\tSubmodule sm1 $head1..$head2:\n' span_id:381) (Token id:Id.Lit_Chars val:'\t  > Add foo3 ($added foo3)\n' span_id:382) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:383) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:384)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'modified submodule(forward)' span_id:391))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:395) 
          (Token id:Id.Lit_Chars val:'\tgit diff --submodule=log >actual &&\n' span_id:396) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:397) 
          (Token id:Id.Lit_Chars val:'\tSubmodule sm1 $head1..$head2:\n' span_id:398) (Token id:Id.Lit_Chars val:'\t  > Add foo3 ($added foo3)\n' span_id:399) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:400) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:401)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'modified submodule(forward) --submodule' span_id:408))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:412) 
          (Token id:Id.Lit_Chars val:'\tgit diff --submodule >actual &&\n' span_id:413) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:414) 
          (Token id:Id.Lit_Chars val:'\tSubmodule sm1 $head1..$head2:\n' span_id:415) (Token id:Id.Lit_Chars val:'\t  > Add foo3 ($added foo3)\n' span_id:416) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:417) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:418)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:fullhead2)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:423)
                command_list: 
                  (command.CommandList
                    children: [
                      (command.Sentence
                        child: (C {(cd)} {(sm1)})
                        terminator: (Token id:Id.Op_Semi val:';' span_id:427)
                      )
                      (C {(git)} {(rev-parse)} {(--verify)} {(HEAD)})
                    ]
                  )
              )
            }
          spids: [422]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'modified submodule(forward) --submodule=short' span_id:441))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:445) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --submodule=short >actual &&\n'
            span_id: 446
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:447) 
          (Token id:Id.Lit_Chars val:'\tdiff --git a/sm1 b/sm1\n' span_id:448) (Token id:Id.Lit_Chars val:'\tindex $head1..$head2 160000\n' span_id:449) 
          (Token id:Id.Lit_Chars val:'\t--- a/sm1\n' span_id:450) (Token id:Id.Lit_Chars val:'\t+++ b/sm1\n' span_id:451) 
          (Token id:Id.Lit_Chars val:'\t@@ -1 +1 @@\n' span_id:452) (Token id:Id.Lit_Chars val:'\t-Subproject commit $fullhead1\n' span_id:453) 
          (Token id:Id.Lit_Chars val:'\t+Subproject commit $fullhead2\n' span_id:454) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:455) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:456)
        )
      }
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (C {(commit_file)} {(sm1)})
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:head3)
              op: assign_op.Equal
              rhs: 
                {
                  (command_sub
                    left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:467)
                    command_list: 
                      (command.CommandList
                        children: [
                          (command.AndOr
                            ops: [Id.Op_DAmp Id.Op_DAmp]
                            children: [
                              (C {(cd)} {(sm1)})
                              (command.Simple
                                words: [{(git)} {(reset)} {(--hard)} {(HEAD) (Id.Lit_TildeLike '~2')}]
                                redirects: [
                                  (redir.Redir
                                    op: (Token id:Id.Redir_Great val:'>' span_id:486)
                                    fd: -1
                                    arg_word: {(/dev/null)}
                                  )
                                ]
                              )
                              (C {(git)} {(rev-parse)} {(--short)} {(--verify)} {(HEAD)})
                            ]
                          )
                        ]
                      )
                  )
                }
              spids: [466]
            )
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'modified submodule(backward)' span_id:508))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:512) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-index -p --submodule=log HEAD >actual &&\n'
            span_id: 513
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:514) 
          (Token
            id: Id.Lit_Chars
            val: '\tSubmodule sm1 $head2..$head3 (rewind):\n'
            span_id: 515
          ) (Token id:Id.Lit_Chars val:'\t  < Add foo3 ($added foo3)\n' span_id:516) 
          (Token id:Id.Lit_Chars val:'\t  < Add foo2 ($added foo2)\n' span_id:517) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:518) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:519)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:head4)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:524)
                command_list: 
                  (command.CommandList
                    children: [(C {(add_file)} {(sm1)} {(foo4)} {(foo5)})]
                  )
              )
            }
          spids: [523]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'modified submodule(backward and forward)' span_id:537))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:541) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-index -p --submodule=log HEAD >actual &&\n'
            span_id: 542
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:543) 
          (Token id:Id.Lit_Chars val:'\tSubmodule sm1 $head2...$head4:\n' span_id:544) (Token id:Id.Lit_Chars val:'\t  > Add foo5 ($added foo5)\n' span_id:545) 
          (Token id:Id.Lit_Chars val:'\t  > Add foo4 ($added foo4)\n' span_id:546) (Token id:Id.Lit_Chars val:'\t  < Add foo3 ($added foo3)\n' span_id:547) 
          (Token id:Id.Lit_Chars val:'\t  < Add foo2 ($added foo2)\n' span_id:548) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:549) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:550)
        )
      }
    )
    (command.AndOr
      ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
      children: [
        (C {(commit_file)} {(sm1)})
        (C {(mv)} {(sm1)} {(sm1-bak)})
        (command.Simple
          words: [{(echo)} {(sm1)}]
          redirects: [
            (redir.Redir
              op: (Token id:Id.Redir_Great val:'>' span_id:572)
              fd: -1
              arg_word: {(sm1)}
            )
          ]
        )
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:head5)
              op: assign_op.Equal
              rhs: 
                {
                  (command_sub
                    left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:578)
                    command_list: 
                      (command.CommandList
                        children: [
                          (command.Pipeline
                            children: [(C {(git)} {(hash-object)} {(sm1)}) (C {(cut)} {(-c1-7)})]
                            negated: F
                          )
                        ]
                      )
                  )
                }
              spids: [577]
            )
          ]
        )
        (C {(git)} {(add)} {(sm1)})
        (C {(rm)} {(-f)} {(sm1)})
        (C {(mv)} {(sm1-bak)} {(sm1)})
      ]
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'typechanged submodule(submodule->blob), --cached'
            span_id: 620
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:624) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --submodule=log --cached >actual &&\n'
            span_id: 625
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:626) 
          (Token
            id: Id.Lit_Chars
            val: '\tSubmodule sm1 $head4...0000000 (submodule deleted)\n'
            span_id: 627
          ) (Token id:Id.Lit_Chars val:'\tdiff --git a/sm1 b/sm1\n' span_id:628) 
          (Token id:Id.Lit_Chars val:'\tnew file mode 100644\n' span_id:629) (Token id:Id.Lit_Chars val:'\tindex 0000000..$head5\n' span_id:630) 
          (Token id:Id.Lit_Chars val:'\t--- /dev/null\n' span_id:631) (Token id:Id.Lit_Chars val:'\t+++ b/sm1\n' span_id:632) 
          (Token id:Id.Lit_Chars val:'\t@@ -0,0 +1 @@\n' span_id:633) (Token id:Id.Lit_Chars val:'\t+sm1\n' span_id:634) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:635) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:636)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'typechanged submodule(submodule->blob)' span_id:643))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:647) 
          (Token id:Id.Lit_Chars val:'\tgit diff --submodule=log >actual &&\n' span_id:648) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:649) 
          (Token id:Id.Lit_Chars val:'\tdiff --git a/sm1 b/sm1\n' span_id:650) (Token id:Id.Lit_Chars val:'\tdeleted file mode 100644\n' span_id:651) 
          (Token id:Id.Lit_Chars val:'\tindex $head5..0000000\n' span_id:652) (Token id:Id.Lit_Chars val:'\t--- a/sm1\n' span_id:653) 
          (Token id:Id.Lit_Chars val:'\t+++ /dev/null\n' span_id:654) (Token id:Id.Lit_Chars val:'\t@@ -1 +0,0 @@\n' span_id:655) 
          (Token id:Id.Lit_Chars val:'\t-sm1\n' span_id:656) (Token id:Id.Lit_Chars val:'\tSubmodule sm1 0000000...$head4 (new submodule)\n' span_id:657) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:658) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:659)
        )
      }
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [(C {(rm)} {(-rf)} {(sm1)}) (C {(git)} {(checkout-index)} {(sm1)})]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'typechanged submodule(submodule->blob)' span_id:680))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:684) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-index -p --submodule=log HEAD >actual &&\n'
            span_id: 685
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:686) 
          (Token
            id: Id.Lit_Chars
            val: '\tSubmodule sm1 $head4...0000000 (submodule deleted)\n'
            span_id: 687
          ) (Token id:Id.Lit_Chars val:'\tdiff --git a/sm1 b/sm1\n' span_id:688) 
          (Token id:Id.Lit_Chars val:'\tnew file mode 100644\n' span_id:689) (Token id:Id.Lit_Chars val:'\tindex 0000000..$head5\n' span_id:690) 
          (Token id:Id.Lit_Chars val:'\t--- /dev/null\n' span_id:691) (Token id:Id.Lit_Chars val:'\t+++ b/sm1\n' span_id:692) 
          (Token id:Id.Lit_Chars val:'\t@@ -0,0 +1 @@\n' span_id:693) (Token id:Id.Lit_Chars val:'\t+sm1\n' span_id:694) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:695) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:696)
        )
      }
    )
    (command.AndOr
      ops: [Id.Op_DAmp Id.Op_DAmp]
      children: [
        (C {(rm)} {(-f)} {(sm1)})
        (C {(test_create_repo)} {(sm1)})
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:head6)
              op: assign_op.Equal
              rhs: 
                {
                  (command_sub
                    left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:715)
                    command_list: 
                      (command.CommandList
                        children: [(C {(add_file)} {(sm1)} {(foo6)} {(foo7)})]
                      )
                  )
                }
              spids: [714]
            )
          ]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:fullhead6)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:726)
                command_list: 
                  (command.CommandList
                    children: [
                      (command.Sentence
                        child: (C {(cd)} {(sm1)})
                        terminator: (Token id:Id.Op_Semi val:';' span_id:730)
                      )
                      (C {(git)} {(rev-parse)} {(--verify)} {(HEAD)})
                    ]
                  )
              )
            }
          spids: [725]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'nonexistent commit' span_id:744))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:748) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-index -p --submodule=log HEAD >actual &&\n'
            span_id: 749
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:750) 
          (Token
            id: Id.Lit_Chars
            val: '\tSubmodule sm1 $head4...$head6 (commits not present)\n'
            span_id: 751
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:752) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:753)
        )
      }
    )
    (C {(commit_file)})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'typechanged submodule(blob->submodule)' span_id:762))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:766) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-index -p --submodule=log HEAD >actual &&\n'
            span_id: 767
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:768) 
          (Token id:Id.Lit_Chars val:'\tdiff --git a/sm1 b/sm1\n' span_id:769) (Token id:Id.Lit_Chars val:'\tdeleted file mode 100644\n' span_id:770) 
          (Token id:Id.Lit_Chars val:'\tindex $head5..0000000\n' span_id:771) (Token id:Id.Lit_Chars val:'\t--- a/sm1\n' span_id:772) 
          (Token id:Id.Lit_Chars val:'\t+++ /dev/null\n' span_id:773) (Token id:Id.Lit_Chars val:'\t@@ -1 +0,0 @@\n' span_id:774) 
          (Token id:Id.Lit_Chars val:'\t-sm1\n' span_id:775) (Token id:Id.Lit_Chars val:'\tSubmodule sm1 0000000...$head6 (new submodule)\n' span_id:776) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:777) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:778)
        )
      }
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (C {(commit_file)} {(sm1)})
        (C {(test_expect_success)} 
          {(SQ (Token id:Id.Lit_Chars val:'submodule is up to date' span_id:791))} 
          {
            (SQ (Token id:Id.Lit_Chars val:'\n' span_id:795) 
              (Token
                id: Id.Lit_Chars
                val: '\tgit diff-index -p --submodule=log HEAD >actual &&\n'
                span_id: 796
              ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:797) 
              (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:798) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:799)
            )
          }
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'submodule contains untracked content' span_id:806))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:810) 
          (Token id:Id.Lit_Chars val:'\techo new > sm1/new-file &&\n' span_id:811) (Token id:Id.Lit_Chars val:'\tgit diff-index -p --submodule=log HEAD >actual &&\n' span_id:812) 
          (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:813) (Token id:Id.Lit_Chars val:'\tSubmodule sm1 contains untracked content\n' span_id:814) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:815) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:816)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodule contains untracked content (untracked ignored)'
            span_id: 823
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:827) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tgit diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual &&\n'
            span_id: 828
          ) (Token id:Id.Lit_Chars val:'\t! test -s actual\n' span_id:829)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodule contains untracked content (dirty ignored)'
            span_id: 836
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:840) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual &&\n'
            span_id: 841
          ) (Token id:Id.Lit_Chars val:'\t! test -s actual\n' span_id:842)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodule contains untracked content (all ignored)'
            span_id: 849
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:853) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-index -p --ignore-submodules=all --submodule=log HEAD >actual &&\n'
            span_id: 854
          ) (Token id:Id.Lit_Chars val:'\t! test -s actual\n' span_id:855)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodule contains untracked and modifed content'
            span_id: 862
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:866) 
          (Token id:Id.Lit_Chars val:'\techo new > sm1/foo6 &&\n' span_id:867) (Token id:Id.Lit_Chars val:'\tgit diff-index -p --submodule=log HEAD >actual &&\n' span_id:868) 
          (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:869) (Token id:Id.Lit_Chars val:'\tSubmodule sm1 contains untracked content\n' span_id:870) 
          (Token
            id: Id.Lit_Chars
            val: '\tSubmodule sm1 contains modified content\n'
            span_id: 871
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:872) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:873)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodule contains untracked and modifed content (untracked ignored)'
            span_id: 880
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:884) 
          (Token id:Id.Lit_Chars val:'\techo new > sm1/foo6 &&\n' span_id:885) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tgit diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual &&\n'
            span_id: 886
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:887) 
          (Token
            id: Id.Lit_Chars
            val: '\tSubmodule sm1 contains modified content\n'
            span_id: 888
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:889) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:890)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodule contains untracked and modifed content (dirty ignored)'
            span_id: 897
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:901) 
          (Token id:Id.Lit_Chars val:'\techo new > sm1/foo6 &&\n' span_id:902) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual &&\n'
            span_id: 903
          ) (Token id:Id.Lit_Chars val:'\t! test -s actual\n' span_id:904)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodule contains untracked and modifed content (all ignored)'
            span_id: 911
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:915) 
          (Token id:Id.Lit_Chars val:'\techo new > sm1/foo6 &&\n' span_id:916) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-index -p --ignore-submodules --submodule=log HEAD >actual &&\n'
            span_id: 917
          ) (Token id:Id.Lit_Chars val:'\t! test -s actual\n' span_id:918)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'submodule contains modifed content' span_id:925))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:929) 
          (Token id:Id.Lit_Chars val:'\trm -f sm1/new-file &&\n' span_id:930) (Token id:Id.Lit_Chars val:'\tgit diff-index -p --submodule=log HEAD >actual &&\n' span_id:931) 
          (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:932) (Token id:Id.Lit_Chars val:'\tSubmodule sm1 contains modified content\n' span_id:933) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:934) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:935)
        )
      }
    )
    (command.AndOr
      ops: [Id.Op_DAmp Id.Op_DAmp]
      children: [
        (command.Subshell
          command_list: 
            (command.CommandList
              children: [
                (command.Sentence
                  child: (C {(cd)} {(sm1)})
                  terminator: (Token id:Id.Op_Semi val:';' span_id:943)
                )
                (command.Simple
                  words: [{(git)} {(commit)} {(-mchange)} {(foo6)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:953)
                      fd: -1
                      arg_word: {(/dev/null)}
                    )
                  ]
                )
              ]
            )
        )
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:head8)
              op: assign_op.Equal
              rhs: 
                {
                  (command_sub
                    left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:960)
                    command_list: 
                      (command.CommandList
                        children: [
                          (command.Sentence
                            child: (C {(cd)} {(sm1)})
                            terminator: (Token id:Id.Op_Semi val:';' span_id:964)
                          )
                          (C {(git)} {(rev-parse)} {(--short)} {(--verify)} {(HEAD)})
                        ]
                      )
                  )
                }
              spids: [959]
            )
          ]
        )
        (C {(test_expect_success)} 
          {(SQ (Token id:Id.Lit_Chars val:'submodule is modified' span_id:982))} 
          {
            (SQ (Token id:Id.Lit_Chars val:'\n' span_id:986) 
              (Token
                id: Id.Lit_Chars
                val: '\tgit diff-index -p --submodule=log HEAD >actual &&\n'
                span_id: 987
              ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:988) 
              (Token
                id: Id.Lit_Chars
                val: '\tSubmodule sm1 $head6..$head8:\n'
                span_id: 989
              ) (Token id:Id.Lit_Chars val:'\t  > change\n' span_id:990) 
              (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:991) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:992)
            )
          }
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'modified submodule contains untracked content' span_id:999))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1003) 
          (Token id:Id.Lit_Chars val:'\techo new > sm1/new-file &&\n' span_id:1004) (Token id:Id.Lit_Chars val:'\tgit diff-index -p --submodule=log HEAD >actual &&\n' span_id:1005) 
          (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:1006) (Token id:Id.Lit_Chars val:'\tSubmodule sm1 contains untracked content\n' span_id:1007) 
          (Token id:Id.Lit_Chars val:'\tSubmodule sm1 $head6..$head8:\n' span_id:1008) (Token id:Id.Lit_Chars val:'\t  > change\n' span_id:1009) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1010) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:1011)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'modified submodule contains untracked content (untracked ignored)'
            span_id: 1018
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1022) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tgit diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual &&\n'
            span_id: 1023
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:1024) 
          (Token id:Id.Lit_Chars val:'\tSubmodule sm1 $head6..$head8:\n' span_id:1025) (Token id:Id.Lit_Chars val:'\t  > change\n' span_id:1026) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1027) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:1028)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'modified submodule contains untracked content (dirty ignored)'
            span_id: 1035
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1039) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual &&\n'
            span_id: 1040
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:1041) 
          (Token id:Id.Lit_Chars val:'\tSubmodule sm1 $head6..$head8:\n' span_id:1042) (Token id:Id.Lit_Chars val:'\t  > change\n' span_id:1043) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1044) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:1045)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'modified submodule contains untracked content (all ignored)'
            span_id: 1052
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1056) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-index -p --ignore-submodules=all --submodule=log HEAD >actual &&\n'
            span_id: 1057
          ) (Token id:Id.Lit_Chars val:'\t! test -s actual\n' span_id:1058)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'modified submodule contains untracked and modifed content'
            span_id: 1065
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1069) 
          (Token id:Id.Lit_Chars val:'\techo modification >> sm1/foo6 &&\n' span_id:1070) (Token id:Id.Lit_Chars val:'\tgit diff-index -p --submodule=log HEAD >actual &&\n' span_id:1071) 
          (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:1072) (Token id:Id.Lit_Chars val:'\tSubmodule sm1 contains untracked content\n' span_id:1073) 
          (Token
            id: Id.Lit_Chars
            val: '\tSubmodule sm1 contains modified content\n'
            span_id: 1074
          ) (Token id:Id.Lit_Chars val:'\tSubmodule sm1 $head6..$head8:\n' span_id:1075) 
          (Token id:Id.Lit_Chars val:'\t  > change\n' span_id:1076) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1077) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:1078)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'modified submodule contains untracked and modifed content (untracked ignored)'
            span_id: 1085
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1089) 
          (Token id:Id.Lit_Chars val:'\techo modification >> sm1/foo6 &&\n' span_id:1090) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tgit diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual &&\n'
            span_id: 1091
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:1092) 
          (Token
            id: Id.Lit_Chars
            val: '\tSubmodule sm1 contains modified content\n'
            span_id: 1093
          ) (Token id:Id.Lit_Chars val:'\tSubmodule sm1 $head6..$head8:\n' span_id:1094) 
          (Token id:Id.Lit_Chars val:'\t  > change\n' span_id:1095) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1096) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:1097)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'modified submodule contains untracked and modifed content (dirty ignored)'
            span_id: 1104
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1108) 
          (Token id:Id.Lit_Chars val:'\techo modification >> sm1/foo6 &&\n' span_id:1109) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual &&\n'
            span_id: 1110
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:1111) 
          (Token id:Id.Lit_Chars val:'\tSubmodule sm1 $head6..$head8:\n' span_id:1112) (Token id:Id.Lit_Chars val:'\t  > change\n' span_id:1113) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1114) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:1115)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'modified submodule contains untracked and modifed content (all ignored)'
            span_id: 1122
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1126) 
          (Token id:Id.Lit_Chars val:'\techo modification >> sm1/foo6 &&\n' span_id:1127) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-index -p --ignore-submodules --submodule=log HEAD >actual &&\n'
            span_id: 1128
          ) (Token id:Id.Lit_Chars val:'\t! test -s actual\n' span_id:1129)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'modified submodule contains modifed content' span_id:1136))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1140) 
          (Token id:Id.Lit_Chars val:'\trm -f sm1/new-file &&\n' span_id:1141) (Token id:Id.Lit_Chars val:'\tgit diff-index -p --submodule=log HEAD >actual &&\n' span_id:1142) 
          (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:1143) (Token id:Id.Lit_Chars val:'\tSubmodule sm1 contains modified content\n' span_id:1144) 
          (Token id:Id.Lit_Chars val:'\tSubmodule sm1 $head6..$head8:\n' span_id:1145) (Token id:Id.Lit_Chars val:'\t  > change\n' span_id:1146) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1147) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:1148)
        )
      }
    )
    (C {(rm)} {(-rf)} {(sm1)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'deleted submodule' span_id:1161))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1165) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-index -p --submodule=log HEAD >actual &&\n'
            span_id: 1166
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:1167) 
          (Token
            id: Id.Lit_Chars
            val: '\tSubmodule sm1 $head6...0000000 (submodule deleted)\n'
            span_id: 1168
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1169) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:1170)
        )
      }
    )
    (command.AndOr
      ops: [Id.Op_DAmp Id.Op_DAmp]
      children: [
        (C {(test_create_repo)} {(sm2)})
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:head7)
              op: assign_op.Equal
              rhs: 
                {
                  (command_sub
                    left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:1181)
                    command_list: 
                      (command.CommandList
                        children: [(C {(add_file)} {(sm2)} {(foo8)} {(foo9)})]
                      )
                  )
                }
              spids: [1180]
            )
          ]
        )
        (C {(git)} {(add)} {(sm2)})
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'multiple submodules' span_id:1203))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1207) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-index -p --submodule=log HEAD >actual &&\n'
            span_id: 1208
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:1209) 
          (Token
            id: Id.Lit_Chars
            val: '\tSubmodule sm1 $head6...0000000 (submodule deleted)\n'
            span_id: 1210
          ) (Token id:Id.Lit_Chars val:'\tSubmodule sm2 0000000...$head7 (new submodule)\n' span_id:1211) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1212) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:1213)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'path filter' span_id:1220))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1224) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-index -p --submodule=log HEAD sm2 >actual &&\n'
            span_id: 1225
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:1226) 
          (Token
            id: Id.Lit_Chars
            val: '\tSubmodule sm2 0000000...$head7 (new submodule)\n'
            span_id: 1227
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1228) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:1229)
        )
      }
    )
    (C {(commit_file)} {(sm2)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'given commit' span_id:1240))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1244) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-index -p --submodule=log HEAD^ >actual &&\n'
            span_id: 1245
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:1246) 
          (Token
            id: Id.Lit_Chars
            val: '\tSubmodule sm1 $head6...0000000 (submodule deleted)\n'
            span_id: 1247
          ) (Token id:Id.Lit_Chars val:'\tSubmodule sm2 0000000...$head7 (new submodule)\n' span_id:1248) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1249) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:1250)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'given commit --submodule' span_id:1257))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1261) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-index -p --submodule HEAD^ >actual &&\n'
            span_id: 1262
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:1263) 
          (Token
            id: Id.Lit_Chars
            val: '\tSubmodule sm1 $head6...0000000 (submodule deleted)\n'
            span_id: 1264
          ) (Token id:Id.Lit_Chars val:'\tSubmodule sm2 0000000...$head7 (new submodule)\n' span_id:1265) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1266) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:1267)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:fullhead7)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:1272)
                command_list: 
                  (command.CommandList
                    children: [
                      (command.Sentence
                        child: (C {(cd)} {(sm2)})
                        terminator: (Token id:Id.Op_Semi val:';' span_id:1276)
                      )
                      (C {(git)} {(rev-parse)} {(--verify)} {(HEAD)})
                    ]
                  )
              )
            }
          spids: [1271]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'given commit --submodule=short' span_id:1291))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1295) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-index -p --submodule=short HEAD^ >actual &&\n'
            span_id: 1296
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:1297) 
          (Token id:Id.Lit_Chars val:'\tdiff --git a/sm1 b/sm1\n' span_id:1298) (Token id:Id.Lit_Chars val:'\tdeleted file mode 160000\n' span_id:1299) 
          (Token id:Id.Lit_Chars val:'\tindex $head6..0000000\n' span_id:1300) (Token id:Id.Lit_Chars val:'\t--- a/sm1\n' span_id:1301) 
          (Token id:Id.Lit_Chars val:'\t+++ /dev/null\n' span_id:1302) (Token id:Id.Lit_Chars val:'\t@@ -1 +0,0 @@\n' span_id:1303) 
          (Token id:Id.Lit_Chars val:'\t-Subproject commit $fullhead6\n' span_id:1304) (Token id:Id.Lit_Chars val:'\tdiff --git a/sm2 b/sm2\n' span_id:1305) 
          (Token id:Id.Lit_Chars val:'\tnew file mode 160000\n' span_id:1306) (Token id:Id.Lit_Chars val:'\tindex 0000000..$head7\n' span_id:1307) 
          (Token id:Id.Lit_Chars val:'\t--- /dev/null\n' span_id:1308) (Token id:Id.Lit_Chars val:'\t+++ b/sm2\n' span_id:1309) 
          (Token id:Id.Lit_Chars val:'\t@@ -0,0 +1 @@\n' span_id:1310) (Token id:Id.Lit_Chars val:'\t+Subproject commit $fullhead7\n' span_id:1311) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1312) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:1313)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup .git file for sm2' span_id:1320))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1324) 
          (Token id:Id.Lit_Chars val:'\t(cd sm2 &&\n' span_id:1325) (Token id:Id.Lit_Chars val:'\t REAL="$(pwd)/../.real" &&\n' span_id:1326) 
          (Token id:Id.Lit_Chars val:'\t mv .git "$REAL"\n' span_id:1327) (Token id:Id.Lit_Chars val:'\t echo "gitdir: $REAL" >.git)\n' span_id:1328)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff --submodule with .git file' span_id:1335))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1339) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --submodule HEAD^ >actual &&\n'
            span_id: 1340
          ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-EOF &&\n' span_id:1341) 
          (Token
            id: Id.Lit_Chars
            val: '\tSubmodule sm1 $head6...0000000 (submodule deleted)\n'
            span_id: 1342
          ) (Token id:Id.Lit_Chars val:'\tSubmodule sm2 0000000...$head7 (new submodule)\n' span_id:1343) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1344) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:1345)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'diff --submodule with objects referenced by alternates'
            span_id: 1352
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1356) 
          (Token id:Id.Lit_Chars val:'\tmkdir sub_alt &&\n' span_id:1357) (Token id:Id.Lit_Chars val:'\t(cd sub_alt &&\n' span_id:1358) 
          (Token id:Id.Lit_Chars val:'\t\tgit init &&\n' span_id:1359) (Token id:Id.Lit_Chars val:'\t\techo a >a &&\n' span_id:1360) 
          (Token id:Id.Lit_Chars val:'\t\tgit add a &&\n' span_id:1361) (Token id:Id.Lit_Chars val:'\t\tgit commit -m a\n' span_id:1362) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1363) (Token id:Id.Lit_Chars val:'\tmkdir super &&\n' span_id:1364) 
          (Token id:Id.Lit_Chars val:'\t(cd super &&\n' span_id:1365) (Token id:Id.Lit_Chars val:'\t\tgit clone -s ../sub_alt sub &&\n' span_id:1366) 
          (Token id:Id.Lit_Chars val:'\t\tgit init &&\n' span_id:1367) (Token id:Id.Lit_Chars val:'\t\tgit add sub &&\n' span_id:1368) 
          (Token id:Id.Lit_Chars val:'\t\tgit commit -m "sub a"\n' span_id:1369) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1370) 
          (Token id:Id.Lit_Chars val:'\t(cd sub_alt &&\n' span_id:1371) (Token id:Id.Lit_Chars val:'\t\tsha1_before=$(git rev-parse --short HEAD)\n' span_id:1372) 
          (Token id:Id.Lit_Chars val:'\t\techo b >b &&\n' span_id:1373) (Token id:Id.Lit_Chars val:'\t\tgit add b &&\n' span_id:1374) 
          (Token id:Id.Lit_Chars val:'\t\tgit commit -m b &&\n' span_id:1375) (Token id:Id.Lit_Chars val:'\t\tsha1_after=$(git rev-parse --short HEAD) &&\n' span_id:1376) 
          (Token id:Id.Lit_Chars val:'\t\t{\n' span_id:1377) (Token id:Id.Lit_Chars val:'\t\t\techo "Submodule sub $sha1_before..$sha1_after:" &&\n' span_id:1378) 
          (Token id:Id.Lit_Chars val:'\t\t\techo "  > b"\n' span_id:1379) (Token id:Id.Lit_Chars val:'\t\t} >../expected\n' span_id:1380) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1381) (Token id:Id.Lit_Chars val:'\t(cd super &&\n' span_id:1382) 
          (Token id:Id.Lit_Chars val:'\t\t(cd sub &&\n' span_id:1383) (Token id:Id.Lit_Chars val:'\t\t\tgit fetch &&\n' span_id:1384) 
          (Token id:Id.Lit_Chars val:'\t\t\tgit checkout origin/master\n' span_id:1385) (Token id:Id.Lit_Chars val:'\t\t) &&\n' span_id:1386) 
          (Token id:Id.Lit_Chars val:'\t\tgit diff --submodule > ../actual\n' span_id:1387) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1388) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:1389)
        )
      }
    )
    (C {(test_done)})
  ]
)