(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:'git status for submodule' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: test_create_repo_with_commit
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {(test_create_repo)} {(DQ ($ Id.VSub_Number '$1'))})
                (command.Subshell
                  command_list: 
                    (command.CommandList
                      children: [
                        (command.AndOr
                          ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
                          children: [
                            (C {(cd)} {(DQ ($ Id.VSub_Number '$1'))})
                            (command.Simple
                              words: [{(Id.Lit_Other ':')}]
                              redirects: [
                                (redir.Redir
                                  op: (Token id:Id.Redir_Great val:'>' span_id:46)
                                  fd: -1
                                  arg_word: {(bar)}
                                )
                              ]
                            )
                            (C {(git)} {(add)} {(bar)})
                            (C {(git)} {(commit)} {(-m)} {(DQ (' Add bar'))})
                            (command.Simple
                              words: [{(Id.Lit_Other ':')}]
                              redirects: [
                                (redir.Redir
                                  op: (Token id:Id.Redir_Great val:'>' span_id:76)
                                  fd: -1
                                  arg_word: {(foo)}
                                )
                              ]
                            )
                            (C {(git)} {(add)} {(foo)})
                            (C {(git)} {(commit)} {(-m)} {(DQ (' Add foo'))})
                          ]
                        )
                      ]
                    )
                )
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:setup span_id:110))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:114) 
          (Token id:Id.Lit_Chars val:'\ttest_create_repo_with_commit sub &&\n' span_id:115) (Token id:Id.Lit_Chars val:'\techo output > .gitignore &&\n' span_id:116) 
          (Token id:Id.Lit_Chars val:'\tgit add sub .gitignore &&\n' span_id:117) (Token id:Id.Lit_Chars val:'\tgit commit -m "Add submodule sub"\n' span_id:118)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'status clean' span_id:125))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:129) 
          (Token id:Id.Lit_Chars val:'\tgit status >output &&\n' span_id:130) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep "nothing to commit" output\n' span_id:131)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commit --dry-run -a clean' span_id:138))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:142) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git commit --dry-run -a >output &&\n'
            span_id: 143
          ) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep "nothing to commit" output\n' span_id:144)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'status with modified file in submodule' span_id:151))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:155) 
          (Token id:Id.Lit_Chars val:'\t(cd sub && git reset --hard) &&\n' span_id:156) (Token id:Id.Lit_Chars val:'\techo "changed" >sub/foo &&\n' span_id:157) 
          (Token id:Id.Lit_Chars val:'\tgit status >output &&\n' span_id:158) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep "modified:   sub (modified content)" output\n'
            span_id: 159
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'status with modified file in submodule (porcelain)'
            span_id: 166
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:170) 
          (Token id:Id.Lit_Chars val:'\t(cd sub && git reset --hard) &&\n' span_id:171) (Token id:Id.Lit_Chars val:'\techo "changed" >sub/foo &&\n' span_id:172) 
          (Token id:Id.Lit_Chars val:'\tgit status --porcelain >output &&\n' span_id:173) (Token id:Id.Lit_Chars val:'\tdiff output - <<-\\EOF\n' span_id:174) 
          (Token id:Id.Lit_Chars val:'\t M sub\n' span_id:175) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:176)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'status with added file in submodule' span_id:183))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:187) 
          (Token
            id: Id.Lit_Chars
            val: '\t(cd sub && git reset --hard && echo >foo && git add foo) &&\n'
            span_id: 188
          ) (Token id:Id.Lit_Chars val:'\tgit status >output &&\n' span_id:189) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep "modified:   sub (modified content)" output\n'
            span_id: 190
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'status with added file in submodule (porcelain)' span_id:197))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:201) 
          (Token
            id: Id.Lit_Chars
            val: '\t(cd sub && git reset --hard && echo >foo && git add foo) &&\n'
            span_id: 202
          ) (Token id:Id.Lit_Chars val:'\tgit status --porcelain >output &&\n' span_id:203) 
          (Token id:Id.Lit_Chars val:'\tdiff output - <<-\\EOF\n' span_id:204) (Token id:Id.Lit_Chars val:'\t M sub\n' span_id:205) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:206)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'status with untracked file in submodule' span_id:213))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:217) 
          (Token id:Id.Lit_Chars val:'\t(cd sub && git reset --hard) &&\n' span_id:218) (Token id:Id.Lit_Chars val:'\techo "content" >sub/new-file &&\n' span_id:219) 
          (Token id:Id.Lit_Chars val:'\tgit status >output &&\n' span_id:220) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep "modified:   sub (untracked content)" output\n'
            span_id: 221
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'status -uno with untracked file in submodule' span_id:228))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:232) 
          (Token id:Id.Lit_Chars val:'\tgit status -uno >output &&\n' span_id:233) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep "^nothing to commit" output\n' span_id:234)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'status with untracked file in submodule (porcelain)'
            span_id: 241
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:245) 
          (Token id:Id.Lit_Chars val:'\tgit status --porcelain >output &&\n' span_id:246) (Token id:Id.Lit_Chars val:'\tdiff output - <<-\\EOF\n' span_id:247) 
          (Token id:Id.Lit_Chars val:'\t M sub\n' span_id:248) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:249)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'status with added and untracked file in submodule'
            span_id: 256
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:260) 
          (Token
            id: Id.Lit_Chars
            val: '\t(cd sub && git reset --hard && echo >foo && git add foo) &&\n'
            span_id: 261
          ) (Token id:Id.Lit_Chars val:'\techo "content" >sub/new-file &&\n' span_id:262) 
          (Token id:Id.Lit_Chars val:'\tgit status >output &&\n' span_id:263) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep "modified:   sub (modified content, untracked content)" output\n'
            span_id: 264
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'status with added and untracked file in submodule (porcelain)'
            span_id: 271
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:275) 
          (Token
            id: Id.Lit_Chars
            val: '\t(cd sub && git reset --hard && echo >foo && git add foo) &&\n'
            span_id: 276
          ) (Token id:Id.Lit_Chars val:'\techo "content" >sub/new-file &&\n' span_id:277) 
          (Token id:Id.Lit_Chars val:'\tgit status --porcelain >output &&\n' span_id:278) (Token id:Id.Lit_Chars val:'\tdiff output - <<-\\EOF\n' span_id:279) 
          (Token id:Id.Lit_Chars val:'\t M sub\n' span_id:280) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:281)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'status with modified file in modified submodule' span_id:288))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:292) 
          (Token id:Id.Lit_Chars val:'\t(cd sub && git reset --hard) &&\n' span_id:293) (Token id:Id.Lit_Chars val:'\trm sub/new-file &&\n' span_id:294) 
          (Token
            id: Id.Lit_Chars
            val: '\t(cd sub && echo "next change" >foo && git commit -m "next change" foo) &&\n'
            span_id: 295
          ) (Token id:Id.Lit_Chars val:'\techo "changed" >sub/foo &&\n' span_id:296) 
          (Token id:Id.Lit_Chars val:'\tgit status >output &&\n' span_id:297) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep "modified:   sub (new commits, modified content)" output\n'
            span_id: 298
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'status with modified file in modified submodule (porcelain)'
            span_id: 305
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:309) 
          (Token id:Id.Lit_Chars val:'\t(cd sub && git reset --hard) &&\n' span_id:310) (Token id:Id.Lit_Chars val:'\techo "changed" >sub/foo &&\n' span_id:311) 
          (Token id:Id.Lit_Chars val:'\tgit status --porcelain >output &&\n' span_id:312) (Token id:Id.Lit_Chars val:'\tdiff output - <<-\\EOF\n' span_id:313) 
          (Token id:Id.Lit_Chars val:'\t M sub\n' span_id:314) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:315)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'status with added file in modified submodule' span_id:322))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:326) 
          (Token
            id: Id.Lit_Chars
            val: '\t(cd sub && git reset --hard && echo >foo && git add foo) &&\n'
            span_id: 327
          ) (Token id:Id.Lit_Chars val:'\tgit status >output &&\n' span_id:328) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep "modified:   sub (new commits, modified content)" output\n'
            span_id: 329
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'status with added file in modified submodule (porcelain)'
            span_id: 336
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:340) 
          (Token
            id: Id.Lit_Chars
            val: '\t(cd sub && git reset --hard && echo >foo && git add foo) &&\n'
            span_id: 341
          ) (Token id:Id.Lit_Chars val:'\tgit status --porcelain >output &&\n' span_id:342) 
          (Token id:Id.Lit_Chars val:'\tdiff output - <<-\\EOF\n' span_id:343) (Token id:Id.Lit_Chars val:'\t M sub\n' span_id:344) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:345)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'status with untracked file in modified submodule'
            span_id: 352
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:356) 
          (Token id:Id.Lit_Chars val:'\t(cd sub && git reset --hard) &&\n' span_id:357) (Token id:Id.Lit_Chars val:'\techo "content" >sub/new-file &&\n' span_id:358) 
          (Token id:Id.Lit_Chars val:'\tgit status >output &&\n' span_id:359) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep "modified:   sub (new commits, untracked content)" output\n'
            span_id: 360
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'status with untracked file in modified submodule (porcelain)'
            span_id: 367
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:371) 
          (Token id:Id.Lit_Chars val:'\tgit status --porcelain >output &&\n' span_id:372) (Token id:Id.Lit_Chars val:'\tdiff output - <<-\\EOF\n' span_id:373) 
          (Token id:Id.Lit_Chars val:'\t M sub\n' span_id:374) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:375)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'status with added and untracked file in modified submodule'
            span_id: 382
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:386) 
          (Token
            id: Id.Lit_Chars
            val: '\t(cd sub && git reset --hard && echo >foo && git add foo) &&\n'
            span_id: 387
          ) (Token id:Id.Lit_Chars val:'\techo "content" >sub/new-file &&\n' span_id:388) 
          (Token id:Id.Lit_Chars val:'\tgit status >output &&\n' span_id:389) 
          (Token
            id: Id.Lit_Chars
            val: 
'\ttest_i18ngrep "modified:   sub (new commits, modified content, untracked content)" output\n'
            span_id: 390
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'status with added and untracked file in modified submodule (porcelain)'
            span_id: 397
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:401) 
          (Token
            id: Id.Lit_Chars
            val: '\t(cd sub && git reset --hard && echo >foo && git add foo) &&\n'
            span_id: 402
          ) (Token id:Id.Lit_Chars val:'\techo "content" >sub/new-file &&\n' span_id:403) 
          (Token id:Id.Lit_Chars val:'\tgit status --porcelain >output &&\n' span_id:404) (Token id:Id.Lit_Chars val:'\tdiff output - <<-\\EOF\n' span_id:405) 
          (Token id:Id.Lit_Chars val:'\t M sub\n' span_id:406) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:407)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup .git file for sub' span_id:414))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:418) 
          (Token id:Id.Lit_Chars val:'\t(cd sub &&\n' span_id:419) (Token id:Id.Lit_Chars val:'\t rm -f new-file\n' span_id:420) 
          (Token id:Id.Lit_Chars val:'\t REAL="$(pwd)/../.real" &&\n' span_id:421) (Token id:Id.Lit_Chars val:'\t mv .git "$REAL"\n' span_id:422) 
          (Token id:Id.Lit_Chars val:'\t echo "gitdir: $REAL" >.git) &&\n' span_id:423) (Token id:Id.Lit_Chars val:'\t echo .real >>.gitignore &&\n' span_id:424) 
          (Token
            id: Id.Lit_Chars
            val: '\t git commit -m "added .real to .gitignore" .gitignore\n'
            span_id: 425
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'status with added file in modified submodule with .git file'
            span_id: 432
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:436) 
          (Token
            id: Id.Lit_Chars
            val: '\t(cd sub && git reset --hard && echo >foo && git add foo) &&\n'
            span_id: 437
          ) (Token id:Id.Lit_Chars val:'\tgit status >output &&\n' span_id:438) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep "modified:   sub (new commits, modified content)" output\n'
            span_id: 439
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rm submodule contents' span_id:446))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:450) 
          (Token id:Id.Lit_Chars val:'\trm -rf sub/* sub/.git\n' span_id:451)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'status clean (empty submodule dir)' span_id:458))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:462) 
          (Token id:Id.Lit_Chars val:'\tgit status >output &&\n' span_id:463) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep "nothing to commit" output\n' span_id:464)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'status -a clean (empty submodule dir)' span_id:471))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:475) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git commit --dry-run -a >output &&\n'
            span_id: 476
          ) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep "nothing to commit" output\n' span_id:477)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:483)
          fd: -1
          arg_word: {(status_expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:486)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:487)) 
              (OF)
            }
          here_end_span_id: 492
          stdin_parts: [('AA .gitmodules\n') ('A  sub1\n')]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'status with merge conflict in .gitmodules' span_id:497))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:501) 
          (Token id:Id.Lit_Chars val:'\tgit clone . super &&\n' span_id:502) (Token id:Id.Lit_Chars val:'\ttest_create_repo_with_commit sub1 &&\n' span_id:503) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:504) (Token id:Id.Lit_Chars val:'\ttest_create_repo_with_commit sub2 &&\n' span_id:505) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:506) (Token id:Id.Lit_Chars val:'\t\tcd super &&\n' span_id:507) 
          (Token id:Id.Lit_Chars val:'\t\tprev=$(git rev-parse HEAD) &&\n' span_id:508) (Token id:Id.Lit_Chars val:'\t\tgit checkout -b add_sub1 &&\n' span_id:509) 
          (Token id:Id.Lit_Chars val:'\t\tgit submodule add ../sub1 &&\n' span_id:510) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "add sub1" &&\n' span_id:511) 
          (Token id:Id.Lit_Chars val:'\t\tgit checkout -b add_sub2 $prev &&\n' span_id:512) (Token id:Id.Lit_Chars val:'\t\tgit submodule add ../sub2 &&\n' span_id:513) 
          (Token id:Id.Lit_Chars val:'\t\tgit commit -m "add sub2" &&\n' span_id:514) (Token id:Id.Lit_Chars val:'\t\tgit checkout -b merge_conflict_gitmodules &&\n' span_id:515) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git merge add_sub1 &&\n'
            span_id: 516
          ) (Token id:Id.Lit_Chars val:'\t\tgit status -s >../status_actual 2>&1\n' span_id:517) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:518) (Token id:Id.Lit_Chars val:'\ttest_cmp status_actual status_expect\n' span_id:519)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:sha1_merge_sub1)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:524)
                command_list: 
                  (command.CommandList
                    children: [
                      (command.AndOr
                        ops: [Id.Op_DAmp]
                        children: [(C {(cd)} {(sub1)}) (C {(git)} {(rev-parse)} {(HEAD)})]
                      )
                    ]
                  )
              )
            }
          spids: [523]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:sha1_merge_sub2)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:539)
                command_list: 
                  (command.CommandList
                    children: [
                      (command.AndOr
                        ops: [Id.Op_DAmp]
                        children: [(C {(cd)} {(sub2)}) (C {(git)} {(rev-parse)} {(HEAD)})]
                      )
                    ]
                  )
              )
            }
          spids: [538]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:short_sha1_merge_sub1)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:554)
                command_list: 
                  (command.CommandList
                    children: [
                      (command.AndOr
                        ops: [Id.Op_DAmp]
                        children: [(C {(cd)} {(sub1)}) (C {(git)} {(rev-parse)} {(--short)} {(HEAD)})]
                      )
                    ]
                  )
              )
            }
          spids: [553]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:short_sha1_merge_sub2)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:571)
                command_list: 
                  (command.CommandList
                    children: [
                      (command.AndOr
                        ops: [Id.Op_DAmp]
                        children: [(C {(cd)} {(sub2)}) (C {(git)} {(rev-parse)} {(--short)} {(HEAD)})]
                      )
                    ]
                  )
              )
            }
          spids: [570]
        )
      ]
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:589)
          fd: -1
          arg_word: {(diff_expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:592)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:593)) 
              (OF)
            }
          here_end_span_id: 610
          stdin_parts: [
            ('diff --cc .gitmodules\n')
            ('index badaa4c,44f999a..0000000\n')
            ('--- a/.gitmodules\n')
            ('+++ b/.gitmodules\n')
            ('@@@ -1,3 -1,3 +1,9 @@@\n')
            ('++<<<<<<< HEAD\n')
            (' +[submodule "sub2"]\n')
            (' +\tpath = sub2\n')
            (' +\turl = ../sub2\n')
            ('++=======\n')
            ('+ [submodule "sub1"]\n')
            ('+ \tpath = sub1\n')
            ('+ \turl = ../sub1\n')
            ('++>>>>>>> add_sub1\n')
          ]
        )
      ]
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:614)
          fd: -1
          arg_word: {(diff_submodule_expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:617)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:618)) 
              (OF)
            }
          here_end_span_id: 635
          stdin_parts: [
            ('diff --cc .gitmodules\n')
            ('index badaa4c,44f999a..0000000\n')
            ('--- a/.gitmodules\n')
            ('+++ b/.gitmodules\n')
            ('@@@ -1,3 -1,3 +1,9 @@@\n')
            ('++<<<<<<< HEAD\n')
            (' +[submodule "sub2"]\n')
            (' +\tpath = sub2\n')
            (' +\turl = ../sub2\n')
            ('++=======\n')
            ('+ [submodule "sub1"]\n')
            ('+ \tpath = sub1\n')
            ('+ \turl = ../sub1\n')
            ('++>>>>>>> add_sub1\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff with merge conflict in .gitmodules' span_id:640))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:644) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:645) (Token id:Id.Lit_Chars val:'\t\tcd super &&\n' span_id:646) 
          (Token id:Id.Lit_Chars val:'\t\tgit diff >../diff_actual 2>&1\n' span_id:647) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:648) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp diff_actual diff_expect\n' span_id:649)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'diff --submodule with merge conflict in .gitmodules'
            span_id: 656
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:660) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:661) (Token id:Id.Lit_Chars val:'\t\tcd super &&\n' span_id:662) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit diff --submodule >../diff_submodule_actual 2>&1\n'
            span_id: 663
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:664) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_cmp diff_submodule_actual diff_submodule_expect\n'
            span_id: 665
          )
        )
      }
    )
    (C {(test_done)})
  ]
)