(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:'Basic porcelain support for submodules\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 basic sanity of the init, update and status\n'
                  span_id: 17
                ) (Token id:Id.Lit_Chars val:'subcommands of git submodule.\n' span_id:18)
              )
            }
          spids: [13]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'submodule deinit works on empty repository' span_id:30))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:34) 
          (Token id:Id.Lit_Chars val:'\tgit submodule deinit --all\n' span_id:35)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup - initial commit' span_id:42))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:46) 
          (Token id:Id.Lit_Chars val:'\t>t &&\n' span_id:47) (Token id:Id.Lit_Chars val:'\tgit add t &&\n' span_id:48) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "initial commit" &&\n' span_id:49) (Token id:Id.Lit_Chars val:'\tgit branch initial\n' span_id:50)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodule init aborts on missing .gitmodules file'
            span_id: 57
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:61) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "git update-index --remove sub" &&\n'
            span_id: 62
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit update-index --add --cacheinfo 160000,$(git rev-parse HEAD),sub &&\n'
            span_id: 63
          ) (Token id:Id.Lit_Chars val:'\t# missing the .gitmodules file here\n' span_id:64) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git submodule init 2>actual &&\n'
            span_id: 65
          ) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep "No url found for submodule path" actual\n' span_id:66)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodule update aborts on missing .gitmodules file'
            span_id: 73
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:77) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "git update-index --remove sub" &&\n'
            span_id: 78
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit update-index --add --cacheinfo 160000,$(git rev-parse HEAD),sub &&\n'
            span_id: 79
          ) (Token id:Id.Lit_Chars val:'\t# missing the .gitmodules file here\n' span_id:80) 
          (Token id:Id.Lit_Chars val:'\tgit submodule update sub 2>actual &&\n' span_id:81) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep "Submodule path .sub. not initialized" actual\n'
            span_id: 82
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'configuration parsing' span_id:89))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:93) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "rm -f .gitmodules" &&\n'
            span_id: 94
          ) (Token id:Id.Lit_Chars val:'\tcat >.gitmodules <<-\\EOF &&\n' span_id:95) 
          (Token id:Id.Lit_Chars val:'\t[submodule "s"]\n' span_id:96) (Token id:Id.Lit_Chars val:'\t\tpath\n' span_id:97) 
          (Token id:Id.Lit_Chars val:'\t\tignore\n' span_id:98) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:99) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git status\n' span_id:100)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup - repository in init subdirectory' span_id:107))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:111) 
          (Token id:Id.Lit_Chars val:'\tmkdir init &&\n' span_id:112) (Token id:Id.Lit_Chars val:'\t(\n' span_id:113) 
          (Token id:Id.Lit_Chars val:'\t\tcd init &&\n' span_id:114) (Token id:Id.Lit_Chars val:'\t\tgit init &&\n' span_id:115) 
          (Token id:Id.Lit_Chars val:'\t\techo a >a &&\n' span_id:116) (Token id:Id.Lit_Chars val:'\t\tgit add a &&\n' span_id:117) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit commit -m "submodule commit 1" &&\n'
            span_id: 118
          ) (Token id:Id.Lit_Chars val:'\t\tgit tag -a -m "rev-1" rev-1\n' span_id:119) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:120)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup - commit with gitlink' span_id:127))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:131) 
          (Token id:Id.Lit_Chars val:'\techo a >a &&\n' span_id:132) (Token id:Id.Lit_Chars val:'\techo z >z &&\n' span_id:133) 
          (Token id:Id.Lit_Chars val:'\tgit add a init z &&\n' span_id:134) (Token id:Id.Lit_Chars val:'\tgit commit -m "super commit 1"\n' span_id:135)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup - hide init subdirectory' span_id:142))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:146) 
          (Token id:Id.Lit_Chars val:'\tmv init .subrepo\n' span_id:147)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup - repository to add submodules to' span_id:154))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:158) 
          (Token id:Id.Lit_Chars val:'\tgit init addtest &&\n' span_id:159) (Token id:Id.Lit_Chars val:'\tgit init addtest-ignore\n' span_id:160)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:submodurl)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:177)
                command_list: (command.CommandList children:[(C {(pwd)} {(-P)})])
              )
            }
          spids: [176]
        )
      ]
    )
    (command.ShFunction
      name: listbranches
      body: 
        (command.BraceGroup
          children: [
            (C {(git)} {(for-each-ref)} 
              {(--format) (Id.Lit_Equals '=') (SQ (Token id:Id.Lit_Chars val:'%(refname)' span_id:198))} {(SQ (Token id:Id.Lit_Chars val:'refs/heads/*' span_id:202))}
            )
          ]
        )
    )
    (command.ShFunction
      name: inspect
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:dir)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_Number '$1')}
                      spids: [215]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:dotdot)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (DQ 
                            (braced_var_sub
                              token: (Token id:Id.VSub_Number val:2 span_id:224)
                              suffix_op: (suffix_op.Unary op_id:Id.VTest_ColonHyphen arg_word:{(..)})
                            )
                          )
                        }
                      spids: [221]
                    )
                  ]
                )
                (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_DollarName '$dir'))})
                            (command.Simple
                              words: [{(listbranches)}]
                              redirects: [
                                (redir.Redir
                                  op: (Token id:Id.Redir_Great val:'>' span_id:248)
                                  fd: -1
                                  arg_word: {(DQ ($ Id.VSub_DollarName '$dotdot') (/heads))}
                                )
                              ]
                            )
                            (command.BraceGroup
                              children: [
                                (command.Sentence
                                  child: 
                                    (command.AndOr
                                      ops: [Id.Op_DPipe]
                                      children: [
                                        (C {(git)} {(symbolic-ref)} {(HEAD)})
                                        (C {(Id.Lit_Other ':')})
                                      ]
                                    )
                                  terminator: (Token id:Id.Op_Semi val:';' span_id:268)
                                )
                              ]
                              redirects: [
                                (redir.Redir
                                  op: (Token id:Id.Redir_Great val:'>' span_id:272)
                                  fd: -1
                                  arg_word: {(DQ ($ Id.VSub_DollarName '$dotdot') (/head))}
                                )
                              ]
                            )
                            (command.Simple
                              words: [{(git)} {(rev-parse)} {(HEAD)}]
                              redirects: [
                                (redir.Redir
                                  op: (Token id:Id.Redir_Great val:'>' span_id:287)
                                  fd: -1
                                  arg_word: {(DQ ($ Id.VSub_DollarName '$dotdot') (/head-sha1))}
                                )
                              ]
                            )
                            (C {(git)} {(update-index)} {(--refresh)})
                            (C {(git)} {(diff-files)} {(--exit-code)})
                            (command.Simple
                              words: [{(git)} {(clean)} {(-n)} {(-d)} {(-x)}]
                              redirects: [
                                (redir.Redir
                                  op: (Token id:Id.Redir_Great val:'>' span_id:324)
                                  fd: -1
                                  arg_word: {(DQ ($ Id.VSub_DollarName '$dotdot') (/untracked))}
                                )
                              ]
                            )
                          ]
                        )
                      ]
                    )
                )
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'submodule add' span_id:339))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:343) 
          (Token id:Id.Lit_Chars val:'\techo "refs/heads/master" >expect &&\n' span_id:344) (Token id:Id.Lit_Chars val:'\t>empty &&\n' span_id:345) (Token id:Id.Lit_Chars val:'\n' span_id:346) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:347) (Token id:Id.Lit_Chars val:'\t\tcd addtest &&\n' span_id:348) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule add -q "$submodurl" submod >actual &&\n'
            span_id: 349
          ) (Token id:Id.Lit_Chars val:'\t\ttest_must_be_empty actual &&\n' span_id:350) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo "gitdir: ../.git/modules/submod" >expect &&\n'
            span_id: 351
          ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp expect submod/.git &&\n' span_id:352) 
          (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:353) (Token id:Id.Lit_Chars val:'\t\t\tcd submod &&\n' span_id:354) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t\tgit config core.worktree >actual &&\n'
            span_id: 355
          ) (Token id:Id.Lit_Chars val:'\t\t\techo "../../../submod" >expect &&\n' span_id:356) 
          (Token id:Id.Lit_Chars val:'\t\t\ttest_cmp expect actual &&\n' span_id:357) (Token id:Id.Lit_Chars val:'\t\t\trm -f actual expect\n' span_id:358) 
          (Token id:Id.Lit_Chars val:'\t\t) &&\n' span_id:359) (Token id:Id.Lit_Chars val:'\t\tgit submodule init\n' span_id:360) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:361) (Token id:Id.Lit_Chars val:'\n' span_id:362) 
          (Token id:Id.Lit_Chars val:'\trm -f heads head untracked &&\n' span_id:363) (Token id:Id.Lit_Chars val:'\tinspect addtest/submod ../.. &&\n' span_id:364) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect heads &&\n' span_id:365) (Token id:Id.Lit_Chars val:'\ttest_cmp expect head &&\n' span_id:366) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp empty untracked\n' span_id:367)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'submodule add to .gitignored path fails' span_id:374))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:378) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:379) (Token id:Id.Lit_Chars val:'\t\tcd addtest-ignore &&\n' span_id:380) 
          (Token id:Id.Lit_Chars val:'\t\tcat <<-\\EOF >expect &&\n' span_id:381) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tThe following path is ignored by one of your .gitignore files:\n'
            span_id: 382
          ) (Token id:Id.Lit_Chars val:'\t\tsubmod\n' span_id:383) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tUse -f if you really want to add it.\n'
            span_id: 384
          ) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:385) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t# Does not use test_commit due to the ignore\n'
            span_id: 386
          ) (Token id:Id.Lit_Chars val:'\t\techo "*" > .gitignore &&\n' span_id:387) 
          (Token id:Id.Lit_Chars val:'\t\tgit add --force .gitignore &&\n' span_id:388) (Token id:Id.Lit_Chars val:'\t\tgit commit -m"Ignore everything" &&\n' span_id:389) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t! git submodule add "$submodurl" submod >actual 2>&1 &&\n'
            span_id: 390
          ) (Token id:Id.Lit_Chars val:'\t\ttest_i18ncmp expect actual\n' span_id:391) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:392)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'submodule add to .gitignored path with --force' span_id:399))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:403) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:404) (Token id:Id.Lit_Chars val:'\t\tcd addtest-ignore &&\n' span_id:405) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule add --force "$submodurl" submod\n'
            span_id: 406
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:407)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'submodule add --branch' span_id:414))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:418) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "refs/heads/initial" >expect-head &&\n'
            span_id: 419
          ) (Token id:Id.Lit_Chars val:'\tcat <<-\\EOF >expect-heads &&\n' span_id:420) 
          (Token id:Id.Lit_Chars val:'\trefs/heads/initial\n' span_id:421) (Token id:Id.Lit_Chars val:'\trefs/heads/master\n' span_id:422) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:423) (Token id:Id.Lit_Chars val:'\t>empty &&\n' span_id:424) (Token id:Id.Lit_Chars val:'\n' span_id:425) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:426) (Token id:Id.Lit_Chars val:'\t\tcd addtest &&\n' span_id:427) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule add -b initial "$submodurl" submod-branch &&\n'
            span_id: 428
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'\t\ttest "initial" = "$(git config -f .gitmodules submodule.submod-branch.branch)" &&\n'
            span_id: 429
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule init\n' span_id:430) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:431) (Token id:Id.Lit_Chars val:'\n' span_id:432) 
          (Token id:Id.Lit_Chars val:'\trm -f heads head untracked &&\n' span_id:433) (Token id:Id.Lit_Chars val:'\tinspect addtest/submod-branch ../.. &&\n' span_id:434) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect-heads heads &&\n' span_id:435) (Token id:Id.Lit_Chars val:'\ttest_cmp expect-head head &&\n' span_id:436) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp empty untracked\n' span_id:437)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'submodule add with ./ in path' span_id:444))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:448) 
          (Token id:Id.Lit_Chars val:'\techo "refs/heads/master" >expect &&\n' span_id:449) (Token id:Id.Lit_Chars val:'\t>empty &&\n' span_id:450) (Token id:Id.Lit_Chars val:'\n' span_id:451) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:452) (Token id:Id.Lit_Chars val:'\t\tcd addtest &&\n' span_id:453) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule add "$submodurl" ././dotsubmod/./frotz/./ &&\n'
            span_id: 454
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule init\n' span_id:455) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:456) (Token id:Id.Lit_Chars val:'\n' span_id:457) 
          (Token id:Id.Lit_Chars val:'\trm -f heads head untracked &&\n' span_id:458) (Token id:Id.Lit_Chars val:'\tinspect addtest/dotsubmod/frotz ../../.. &&\n' span_id:459) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect heads &&\n' span_id:460) (Token id:Id.Lit_Chars val:'\ttest_cmp expect head &&\n' span_id:461) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp empty untracked\n' span_id:462)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'submodule add with /././ in path' span_id:469))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:473) 
          (Token id:Id.Lit_Chars val:'\techo "refs/heads/master" >expect &&\n' span_id:474) (Token id:Id.Lit_Chars val:'\t>empty &&\n' span_id:475) (Token id:Id.Lit_Chars val:'\n' span_id:476) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:477) (Token id:Id.Lit_Chars val:'\t\tcd addtest &&\n' span_id:478) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule add "$submodurl" dotslashdotsubmod/././frotz/./ &&\n'
            span_id: 479
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule init\n' span_id:480) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:481) (Token id:Id.Lit_Chars val:'\n' span_id:482) 
          (Token id:Id.Lit_Chars val:'\trm -f heads head untracked &&\n' span_id:483) (Token id:Id.Lit_Chars val:'\tinspect addtest/dotslashdotsubmod/frotz ../../.. &&\n' span_id:484) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect heads &&\n' span_id:485) (Token id:Id.Lit_Chars val:'\ttest_cmp expect head &&\n' span_id:486) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp empty untracked\n' span_id:487)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'submodule add with // in path' span_id:494))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:498) 
          (Token id:Id.Lit_Chars val:'\techo "refs/heads/master" >expect &&\n' span_id:499) (Token id:Id.Lit_Chars val:'\t>empty &&\n' span_id:500) (Token id:Id.Lit_Chars val:'\n' span_id:501) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:502) (Token id:Id.Lit_Chars val:'\t\tcd addtest &&\n' span_id:503) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule add "$submodurl" slashslashsubmod///frotz// &&\n'
            span_id: 504
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule init\n' span_id:505) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:506) (Token id:Id.Lit_Chars val:'\n' span_id:507) 
          (Token id:Id.Lit_Chars val:'\trm -f heads head untracked &&\n' span_id:508) (Token id:Id.Lit_Chars val:'\tinspect addtest/slashslashsubmod/frotz ../../.. &&\n' span_id:509) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect heads &&\n' span_id:510) (Token id:Id.Lit_Chars val:'\ttest_cmp expect head &&\n' span_id:511) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp empty untracked\n' span_id:512)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'submodule add with /.. in path' span_id:519))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:523) 
          (Token id:Id.Lit_Chars val:'\techo "refs/heads/master" >expect &&\n' span_id:524) (Token id:Id.Lit_Chars val:'\t>empty &&\n' span_id:525) (Token id:Id.Lit_Chars val:'\n' span_id:526) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:527) (Token id:Id.Lit_Chars val:'\t\tcd addtest &&\n' span_id:528) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule add "$submodurl" dotdotsubmod/../realsubmod/frotz/.. &&\n'
            span_id: 529
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule init\n' span_id:530) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:531) (Token id:Id.Lit_Chars val:'\n' span_id:532) 
          (Token id:Id.Lit_Chars val:'\trm -f heads head untracked &&\n' span_id:533) (Token id:Id.Lit_Chars val:'\tinspect addtest/realsubmod ../.. &&\n' span_id:534) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect heads &&\n' span_id:535) (Token id:Id.Lit_Chars val:'\ttest_cmp expect head &&\n' span_id:536) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp empty untracked\n' span_id:537)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'submodule add with ./, /.. and // in path' span_id:544))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:548) 
          (Token id:Id.Lit_Chars val:'\techo "refs/heads/master" >expect &&\n' span_id:549) (Token id:Id.Lit_Chars val:'\t>empty &&\n' span_id:550) (Token id:Id.Lit_Chars val:'\n' span_id:551) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:552) (Token id:Id.Lit_Chars val:'\t\tcd addtest &&\n' span_id:553) 
          (Token
            id: Id.Lit_Chars
            val: 
'\t\tgit submodule add "$submodurl" dot/dotslashsubmod/./../..////realsubmod2/a/b/c/d/../../../../frotz//.. &&\n'
            span_id: 554
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule init\n' span_id:555) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:556) (Token id:Id.Lit_Chars val:'\n' span_id:557) 
          (Token id:Id.Lit_Chars val:'\trm -f heads head untracked &&\n' span_id:558) (Token id:Id.Lit_Chars val:'\tinspect addtest/realsubmod2 ../.. &&\n' span_id:559) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect heads &&\n' span_id:560) (Token id:Id.Lit_Chars val:'\ttest_cmp expect head &&\n' span_id:561) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp empty untracked\n' span_id:562)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'submodule add in subdirectory' span_id:569))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:573) 
          (Token id:Id.Lit_Chars val:'\techo "refs/heads/master" >expect &&\n' span_id:574) (Token id:Id.Lit_Chars val:'\t>empty &&\n' span_id:575) (Token id:Id.Lit_Chars val:'\n' span_id:576) 
          (Token id:Id.Lit_Chars val:'\tmkdir addtest/sub &&\n' span_id:577) (Token id:Id.Lit_Chars val:'\t(\n' span_id:578) 
          (Token id:Id.Lit_Chars val:'\t\tcd addtest/sub &&\n' span_id:579) (Token id:Id.Lit_Chars val:'\t\tgit submodule add "$submodurl" ../realsubmod3 &&\n' span_id:580) 
          (Token id:Id.Lit_Chars val:'\t\tgit submodule init\n' span_id:581) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:582) (Token id:Id.Lit_Chars val:'\n' span_id:583) 
          (Token id:Id.Lit_Chars val:'\trm -f heads head untracked &&\n' span_id:584) (Token id:Id.Lit_Chars val:'\tinspect addtest/realsubmod3 ../.. &&\n' span_id:585) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect heads &&\n' span_id:586) (Token id:Id.Lit_Chars val:'\ttest_cmp expect head &&\n' span_id:587) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp empty untracked\n' span_id:588)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodule add in subdirectory with relative path should fail'
            span_id: 595
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:599) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:600) (Token id:Id.Lit_Chars val:'\t\tcd addtest/sub &&\n' span_id:601) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git submodule add ../../ submod3 2>../../output.err\n'
            span_id: 602
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:603) 
          (Token id:Id.Lit_Chars val:'\ttest_i18ngrep toplevel output.err\n' span_id:604)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup - add an example entry to .gitmodules' span_id:611))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:615) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tgit config --file=.gitmodules submodule.example.url git://example.com/init.git\n'
            span_id: 616
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'status should fail for unmapped paths' span_id:623))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:627) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git submodule status\n' span_id:628)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup - map path in .gitmodules' span_id:635))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:639) 
          (Token id:Id.Lit_Chars val:'\tcat <<\\EOF >expect &&\n' span_id:640) (Token id:Id.Lit_Chars val:'[submodule "example"]\n' span_id:641) 
          (Token id:Id.Lit_Chars val:'\turl = git://example.com/init.git\n' span_id:642) (Token id:Id.Lit_Chars val:'\tpath = init\n' span_id:643) 
          (Token id:Id.Lit_Chars val:'EOF\n' span_id:644) (Token id:Id.Lit_Chars val:'\n' span_id:645) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --file=.gitmodules submodule.example.path init &&\n'
            span_id: 646
          ) (Token id:Id.Lit_Chars val:'\n' span_id:647) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect .gitmodules\n' span_id:648)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'status should only print one line' span_id:655))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:659) 
          (Token id:Id.Lit_Chars val:'\tgit submodule status >lines &&\n' span_id:660) (Token id:Id.Lit_Chars val:'\ttest_line_count = 1 lines\n' span_id:661)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup - fetch commit name from submodule' span_id:668))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:672) 
          (Token
            id: Id.Lit_Chars
            val: '\trev1=$(cd .subrepo && git rev-parse HEAD) &&\n'
            span_id: 673
          ) (Token id:Id.Lit_Chars val:'\tprintf "rev1: %s\\n" "$rev1" &&\n' span_id:674) 
          (Token id:Id.Lit_Chars val:'\ttest -n "$rev1"\n' span_id:675)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'status should initially be "missing"' span_id:682))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:686) 
          (Token id:Id.Lit_Chars val:'\tgit submodule status >lines &&\n' span_id:687) (Token id:Id.Lit_Chars val:'\tgrep "^-$rev1" lines\n' span_id:688)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'init should register submodule url in .git/config'
            span_id: 695
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:699) 
          (Token
            id: Id.Lit_Chars
            val: '\techo git://example.com/init.git >expect &&\n'
            span_id: 700
          ) (Token id:Id.Lit_Chars val:'\n' span_id:701) 
          (Token id:Id.Lit_Chars val:'\tgit submodule init &&\n' span_id:702) (Token id:Id.Lit_Chars val:'\tgit config submodule.example.url >url &&\n' span_id:703) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config submodule.example.url ./.subrepo &&\n'
            span_id: 704
          ) (Token id:Id.Lit_Chars val:'\n' span_id:705) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect url\n' span_id:706)
        )
      }
    )
    (command.ShFunction
      name: test_failure_with_unknown_submodule
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.Simple
                  words: [
                    {(test_must_fail)}
                    {(git)}
                    {(submodule)}
                    {($ Id.VSub_Number '$1')}
                    {(no-such-submodule)}
                  ]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'2>' span_id:728)
                      fd: 2
                      arg_word: {(output.err)}
                    )
                  ]
                )
                (C {(grep)} {(DQ ('^error: .*no-such-submodule'))} {(output.err)})
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'init should fail with unknown submodule' span_id:748))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:752) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_failure_with_unknown_submodule init\n'
            span_id: 753
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'update should fail with unknown submodule' span_id:760))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:764) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_failure_with_unknown_submodule update\n'
            span_id: 765
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'status should fail with unknown submodule' span_id:772))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:776) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_failure_with_unknown_submodule status\n'
            span_id: 777
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'sync should fail with unknown submodule' span_id:784))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:788) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_failure_with_unknown_submodule sync\n'
            span_id: 789
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'update should fail when path is used by a file' span_id:796))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:800) 
          (Token id:Id.Lit_Chars val:'\techo hello >expect &&\n' span_id:801) (Token id:Id.Lit_Chars val:'\n' span_id:802) 
          (Token id:Id.Lit_Chars val:'\techo "hello" >init &&\n' span_id:803) (Token id:Id.Lit_Chars val:'\ttest_must_fail git submodule update &&\n' span_id:804) 
          (Token id:Id.Lit_Chars val:'\n' span_id:805) (Token id:Id.Lit_Chars val:'\ttest_cmp expect init\n' span_id:806)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'update should fail when path is used by a nonempty directory'
            span_id: 813
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:817) 
          (Token id:Id.Lit_Chars val:'\techo hello >expect &&\n' span_id:818) (Token id:Id.Lit_Chars val:'\n' span_id:819) 
          (Token id:Id.Lit_Chars val:'\trm -fr init &&\n' span_id:820) (Token id:Id.Lit_Chars val:'\tmkdir init &&\n' span_id:821) 
          (Token id:Id.Lit_Chars val:'\techo "hello" >init/a &&\n' span_id:822) (Token id:Id.Lit_Chars val:'\n' span_id:823) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git submodule update &&\n'
            span_id: 824
          ) (Token id:Id.Lit_Chars val:'\n' span_id:825) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect init/a\n' span_id:826)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'update should work when path is an empty dir' span_id:833))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:837) 
          (Token id:Id.Lit_Chars val:'\trm -fr init &&\n' span_id:838) (Token id:Id.Lit_Chars val:'\trm -f head-sha1 &&\n' span_id:839) 
          (Token id:Id.Lit_Chars val:'\techo "$rev1" >expect &&\n' span_id:840) (Token id:Id.Lit_Chars val:'\n' span_id:841) 
          (Token id:Id.Lit_Chars val:'\tmkdir init &&\n' span_id:842) (Token id:Id.Lit_Chars val:'\tgit submodule update -q >update.out &&\n' span_id:843) 
          (Token id:Id.Lit_Chars val:'\ttest_must_be_empty update.out &&\n' span_id:844) (Token id:Id.Lit_Chars val:'\n' span_id:845) 
          (Token id:Id.Lit_Chars val:'\tinspect init &&\n' span_id:846) (Token id:Id.Lit_Chars val:'\ttest_cmp expect head-sha1\n' span_id:847)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'status should be "up-to-date" after update' span_id:854))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:858) 
          (Token id:Id.Lit_Chars val:'\tgit submodule status >list &&\n' span_id:859) (Token id:Id.Lit_Chars val:'\tgrep "^ $rev1" list\n' span_id:860)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'status "up-to-date" from subdirectory' span_id:867))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:871) 
          (Token id:Id.Lit_Chars val:'\tmkdir -p sub &&\n' span_id:872) (Token id:Id.Lit_Chars val:'\t(\n' span_id:873) 
          (Token id:Id.Lit_Chars val:'\t\tcd sub &&\n' span_id:874) (Token id:Id.Lit_Chars val:'\t\tgit submodule status >../list\n' span_id:875) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:876) (Token id:Id.Lit_Chars val:'\tgrep "^ $rev1" list &&\n' span_id:877) 
          (Token id:Id.Lit_Chars val:'\tgrep "\\\\.\\\\./init" list\n' span_id:878)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'status "up-to-date" from subdirectory with path' span_id:885))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:889) 
          (Token id:Id.Lit_Chars val:'\tmkdir -p sub &&\n' span_id:890) (Token id:Id.Lit_Chars val:'\t(\n' span_id:891) 
          (Token id:Id.Lit_Chars val:'\t\tcd sub &&\n' span_id:892) (Token id:Id.Lit_Chars val:'\t\tgit submodule status ../init >../list\n' span_id:893) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:894) (Token id:Id.Lit_Chars val:'\tgrep "^ $rev1" list &&\n' span_id:895) 
          (Token id:Id.Lit_Chars val:'\tgrep "\\\\.\\\\./init" list\n' span_id:896)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'status should be "modified" after submodule commit'
            span_id: 903
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:907) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:908) (Token id:Id.Lit_Chars val:'\t\tcd init &&\n' span_id:909) 
          (Token id:Id.Lit_Chars val:'\t\techo b >b &&\n' span_id:910) (Token id:Id.Lit_Chars val:'\t\tgit add b &&\n' span_id:911) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit commit -m "submodule commit 2"\n'
            span_id: 912
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:913) (Token id:Id.Lit_Chars val:'\n' span_id:914) 
          (Token
            id: Id.Lit_Chars
            val: '\trev2=$(cd init && git rev-parse HEAD) &&\n'
            span_id: 915
          ) (Token id:Id.Lit_Chars val:'\ttest -n "$rev2" &&\n' span_id:916) 
          (Token id:Id.Lit_Chars val:'\tgit submodule status >list &&\n' span_id:917) (Token id:Id.Lit_Chars val:'\n' span_id:918) 
          (Token id:Id.Lit_Chars val:'\tgrep "^+$rev2" list\n' span_id:919)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'the --cached sha1 should be rev1' span_id:926))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:930) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit submodule --cached status >list &&\n'
            span_id: 931
          ) (Token id:Id.Lit_Chars val:'\tgrep "^+$rev1" list\n' span_id:932)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git diff should report the SHA1 of the new submodule commit'
            span_id: 939
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:943) 
          (Token id:Id.Lit_Chars val:'\tgit diff >diff &&\n' span_id:944) (Token id:Id.Lit_Chars val:'\tgrep "^+Subproject commit $rev2" diff\n' span_id:945)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'update should checkout rev1' span_id:952))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:956) 
          (Token id:Id.Lit_Chars val:'\trm -f head-sha1 &&\n' span_id:957) (Token id:Id.Lit_Chars val:'\techo "$rev1" >expect &&\n' span_id:958) 
          (Token id:Id.Lit_Chars val:'\n' span_id:959) (Token id:Id.Lit_Chars val:'\tgit submodule update init &&\n' span_id:960) 
          (Token id:Id.Lit_Chars val:'\tinspect init &&\n' span_id:961) (Token id:Id.Lit_Chars val:'\n' span_id:962) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect head-sha1\n' span_id:963)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'status should be "up-to-date" after update' span_id:970))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:974) 
          (Token id:Id.Lit_Chars val:'\tgit submodule status >list &&\n' span_id:975) (Token id:Id.Lit_Chars val:'\tgrep "^ $rev1" list\n' span_id:976)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'checkout superproject with subproject already present'
            span_id: 983
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:987) 
          (Token id:Id.Lit_Chars val:'\tgit checkout initial &&\n' span_id:988) (Token id:Id.Lit_Chars val:'\tgit checkout master\n' span_id:989)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'apply submodule diff' span_id:996))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1000) 
          (Token id:Id.Lit_Chars val:'\t>empty &&\n' span_id:1001) (Token id:Id.Lit_Chars val:'\n' span_id:1002) 
          (Token id:Id.Lit_Chars val:'\tgit branch second &&\n' span_id:1003) (Token id:Id.Lit_Chars val:'\t(\n' span_id:1004) 
          (Token id:Id.Lit_Chars val:'\t\tcd init &&\n' span_id:1005) (Token id:Id.Lit_Chars val:'\t\techo s >s &&\n' span_id:1006) 
          (Token id:Id.Lit_Chars val:'\t\tgit add s &&\n' span_id:1007) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "change subproject"\n' span_id:1008) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1009) (Token id:Id.Lit_Chars val:'\tgit update-index --add init &&\n' span_id:1010) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "change init" &&\n' span_id:1011) (Token id:Id.Lit_Chars val:'\tgit format-patch -1 --stdout >P.diff &&\n' span_id:1012) 
          (Token id:Id.Lit_Chars val:'\tgit checkout second &&\n' span_id:1013) (Token id:Id.Lit_Chars val:'\tgit apply --index P.diff &&\n' span_id:1014) 
          (Token id:Id.Lit_Chars val:'\n' span_id:1015) (Token id:Id.Lit_Chars val:'\tgit diff --cached master >staged &&\n' span_id:1016) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp empty staged\n' span_id:1017)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'update --init' span_id:1024))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1028) 
          (Token id:Id.Lit_Chars val:'\tmv init init2 &&\n' span_id:1029) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config -f .gitmodules submodule.example.url "$(pwd)/init2" &&\n'
            span_id: 1030
          ) (Token id:Id.Lit_Chars val:'\tgit config --remove-section submodule.example &&\n' span_id:1031) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git config submodule.example.url &&\n'
            span_id: 1032
          ) (Token id:Id.Lit_Chars val:'\n' span_id:1033) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit submodule update init 2> update.out &&\n'
            span_id: 1034
          ) (Token id:Id.Lit_Chars val:'\tcat update.out &&\n' span_id:1035) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep "not initialized" update.out &&\n'
            span_id: 1036
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rev-parse --resolve-git-dir init/.git &&\n'
            span_id: 1037
          ) (Token id:Id.Lit_Chars val:'\n' span_id:1038) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit submodule update --init init &&\n'
            span_id: 1039
          ) (Token id:Id.Lit_Chars val:'\tgit rev-parse --resolve-git-dir init/.git\n' span_id:1040)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'update --init from subdirectory' span_id:1047))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1051) 
          (Token id:Id.Lit_Chars val:'\tmv init init2 &&\n' span_id:1052) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config -f .gitmodules submodule.example.url "$(pwd)/init2" &&\n'
            span_id: 1053
          ) (Token id:Id.Lit_Chars val:'\tgit config --remove-section submodule.example &&\n' span_id:1054) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git config submodule.example.url &&\n'
            span_id: 1055
          ) (Token id:Id.Lit_Chars val:'\n' span_id:1056) 
          (Token id:Id.Lit_Chars val:'\tmkdir -p sub &&\n' span_id:1057) (Token id:Id.Lit_Chars val:'\t(\n' span_id:1058) 
          (Token id:Id.Lit_Chars val:'\t\tcd sub &&\n' span_id:1059) (Token id:Id.Lit_Chars val:'\t\tgit submodule update ../init 2>update.out &&\n' span_id:1060) 
          (Token id:Id.Lit_Chars val:'\t\tcat update.out &&\n' span_id:1061) (Token id:Id.Lit_Chars val:'\t\ttest_i18ngrep "not initialized" update.out &&\n' span_id:1062) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git rev-parse --resolve-git-dir ../init/.git &&\n'
            span_id: 1063
          ) (Token id:Id.Lit_Chars val:'\n' span_id:1064) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule update --init ../init\n'
            span_id: 1065
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1066) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-parse --resolve-git-dir init/.git\n'
            span_id: 1067
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'do not add files from a submodule' span_id:1074))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1078) 
          (Token id:Id.Lit_Chars val:'\n' span_id:1079) (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:1080) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git add init/a\n' span_id:1081) (Token id:Id.Lit_Chars val:'\n' span_id:1082)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'gracefully add/reset submodule with a trailing slash'
            span_id: 1089
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1093) 
          (Token id:Id.Lit_Chars val:'\n' span_id:1094) (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:1095) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -m "commit subproject" init &&\n'
            span_id: 1096
          ) (Token id:Id.Lit_Chars val:'\t(cd init &&\n' span_id:1097) 
          (Token id:Id.Lit_Chars val:'\t echo b > a) &&\n' span_id:1098) (Token id:Id.Lit_Chars val:'\tgit add init/ &&\n' span_id:1099) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --exit-code --cached init &&\n'
            span_id: 1100
          ) (Token id:Id.Lit_Chars val:'\tcommit=$(cd init &&\n' span_id:1101) 
          (Token
            id: Id.Lit_Chars
            val: '\t git commit -m update a >/dev/null &&\n'
            span_id: 1102
          ) (Token id:Id.Lit_Chars val:'\t git rev-parse HEAD) &&\n' span_id:1103) 
          (Token id:Id.Lit_Chars val:'\tgit add init/ &&\n' span_id:1104) (Token id:Id.Lit_Chars val:'\ttest_must_fail git diff --exit-code --cached init &&\n' span_id:1105) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest $commit = $(git ls-files --stage |\n'
            span_id: 1106
          ) (Token id:Id.Lit_Chars val:'\t\tsed -n "s/^160000 \\([^ ]*\\).*/\\1/p") &&\n' span_id:1107) 
          (Token id:Id.Lit_Chars val:'\tgit reset init/ &&\n' span_id:1108) (Token id:Id.Lit_Chars val:'\tgit diff --exit-code --cached init\n' span_id:1109) 
          (Token id:Id.Lit_Chars val:'\n' span_id:1110)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'ls-files gracefully handles trailing slash' span_id:1117))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1121) 
          (Token id:Id.Lit_Chars val:'\n' span_id:1122) (Token id:Id.Lit_Chars val:'\ttest "init" = "$(git ls-files init/)"\n' span_id:1123) 
          (Token id:Id.Lit_Chars val:'\n' span_id:1124)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'moving to a commit without submodule does not leave empty dir'
            span_id: 1131
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1135) 
          (Token id:Id.Lit_Chars val:'\trm -rf init &&\n' span_id:1136) (Token id:Id.Lit_Chars val:'\tmkdir init &&\n' span_id:1137) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:1138) (Token id:Id.Lit_Chars val:'\tgit checkout initial &&\n' span_id:1139) 
          (Token id:Id.Lit_Chars val:'\ttest ! -d init &&\n' span_id:1140) (Token id:Id.Lit_Chars val:'\tgit checkout second\n' span_id:1141)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'submodule <invalid-subcommand> fails' span_id:1148))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1152) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git submodule no-such-subcommand\n'
            span_id: 1153
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'add submodules without specifying an explicit path'
            span_id: 1160
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1164) 
          (Token id:Id.Lit_Chars val:'\tmkdir repo &&\n' span_id:1165) (Token id:Id.Lit_Chars val:'\t(\n' span_id:1166) 
          (Token id:Id.Lit_Chars val:'\t\tcd repo &&\n' span_id:1167) (Token id:Id.Lit_Chars val:'\t\tgit init &&\n' span_id:1168) 
          (Token id:Id.Lit_Chars val:'\t\techo r >r &&\n' span_id:1169) (Token id:Id.Lit_Chars val:'\t\tgit add r &&\n' span_id:1170) 
          (Token id:Id.Lit_Chars val:'\t\tgit commit -m "repo commit 1"\n' span_id:1171) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1172) 
          (Token id:Id.Lit_Chars val:'\tgit clone --bare repo/ bare.git &&\n' span_id:1173) (Token id:Id.Lit_Chars val:'\t(\n' span_id:1174) 
          (Token id:Id.Lit_Chars val:'\t\tcd addtest &&\n' span_id:1175) (Token id:Id.Lit_Chars val:'\t\tgit submodule add "$submodurl/repo" &&\n' span_id:1176) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config -f .gitmodules submodule.repo.path repo &&\n'
            span_id: 1177
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule add "$submodurl/bare.git" &&\n' span_id:1178) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config -f .gitmodules submodule.bare.path bare\n'
            span_id: 1179
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1180)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'add should fail when path is used by a file' span_id:1187))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1191) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1192) (Token id:Id.Lit_Chars val:'\t\tcd addtest &&\n' span_id:1193) 
          (Token id:Id.Lit_Chars val:'\t\ttouch file &&\n' span_id:1194) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail\tgit submodule add "$submodurl/repo" file\n'
            span_id: 1195
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1196)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'add should fail when path is used by an existing directory'
            span_id: 1203
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1207) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1208) (Token id:Id.Lit_Chars val:'\t\tcd addtest &&\n' span_id:1209) 
          (Token id:Id.Lit_Chars val:'\t\tmkdir empty-dir &&\n' span_id:1210) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git submodule add "$submodurl/repo" empty-dir\n'
            span_id: 1211
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1212)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'use superproject as upstream when path is relative and no url is set there'
            span_id: 1219
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1223) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1224) (Token id:Id.Lit_Chars val:'\t\tcd addtest &&\n' span_id:1225) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule add ../repo relative &&\n'
            span_id: 1226
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest "$(git config -f .gitmodules submodule.relative.url)" = ../repo &&\n'
            span_id: 1227
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule sync relative &&\n' span_id:1228) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest "$(git config submodule.relative.url)" = "$submodurl/repo"\n'
            span_id: 1229
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1230)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'set up for relative path tests' span_id:1237))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1241) 
          (Token id:Id.Lit_Chars val:'\tmkdir reltest &&\n' span_id:1242) (Token id:Id.Lit_Chars val:'\t(\n' span_id:1243) 
          (Token id:Id.Lit_Chars val:'\t\tcd reltest &&\n' span_id:1244) (Token id:Id.Lit_Chars val:'\t\tgit init &&\n' span_id:1245) 
          (Token id:Id.Lit_Chars val:'\t\tmkdir sub &&\n' span_id:1246) (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:1247) 
          (Token id:Id.Lit_Chars val:'\t\t\tcd sub &&\n' span_id:1248) (Token id:Id.Lit_Chars val:'\t\t\tgit init &&\n' span_id:1249) 
          (Token id:Id.Lit_Chars val:'\t\t\ttest_commit foo\n' span_id:1250) (Token id:Id.Lit_Chars val:'\t\t) &&\n' span_id:1251) 
          (Token id:Id.Lit_Chars val:'\t\tgit add sub &&\n' span_id:1252) (Token id:Id.Lit_Chars val:'\t\tgit config -f .gitmodules submodule.sub.path sub &&\n' span_id:1253) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config -f .gitmodules submodule.sub.url ../subrepo &&\n'
            span_id: 1254
          ) (Token id:Id.Lit_Chars val:'\t\tcp .git/config pristine-.git-config &&\n' span_id:1255) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tcp .gitmodules pristine-.gitmodules\n'
            span_id: 1256
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1257)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '../subrepo works with URL - ssh://hostname/repo'
            span_id: 1264
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1268) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1269) (Token id:Id.Lit_Chars val:'\t\tcd reltest &&\n' span_id:1270) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tcp pristine-.git-config .git/config &&\n'
            span_id: 1271
          ) (Token id:Id.Lit_Chars val:'\t\tcp pristine-.gitmodules .gitmodules &&\n' span_id:1272) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config remote.origin.url ssh://hostname/repo &&\n'
            span_id: 1273
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule init &&\n' span_id:1274) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest "$(git config submodule.sub.url)" = ssh://hostname/subrepo\n'
            span_id: 1275
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1276)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '../subrepo works with port-qualified URL - ssh://hostname:22/repo'
            span_id: 1283
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1287) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1288) (Token id:Id.Lit_Chars val:'\t\tcd reltest &&\n' span_id:1289) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tcp pristine-.git-config .git/config &&\n'
            span_id: 1290
          ) (Token id:Id.Lit_Chars val:'\t\tcp pristine-.gitmodules .gitmodules &&\n' span_id:1291) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config remote.origin.url ssh://hostname:22/repo &&\n'
            span_id: 1292
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule init &&\n' span_id:1293) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest "$(git config submodule.sub.url)" = ssh://hostname:22/subrepo\n'
            span_id: 1294
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1295)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '../subrepo path works with local path - //somewhere else/repo'
            span_id: 1317
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1321) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1322) (Token id:Id.Lit_Chars val:'\t\tcd reltest &&\n' span_id:1323) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tcp pristine-.git-config .git/config &&\n'
            span_id: 1324
          ) (Token id:Id.Lit_Chars val:'\t\tcp pristine-.gitmodules .gitmodules &&\n' span_id:1325) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config remote.origin.url "//somewhere else/repo" &&\n'
            span_id: 1326
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule init &&\n' span_id:1327) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest "$(git config submodule.sub.url)" = "//somewhere else/subrepo"\n'
            span_id: 1328
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1329)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '../subrepo works with file URL - file:///tmp/repo'
            span_id: 1336
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1340) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1341) (Token id:Id.Lit_Chars val:'\t\tcd reltest &&\n' span_id:1342) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tcp pristine-.git-config .git/config &&\n'
            span_id: 1343
          ) (Token id:Id.Lit_Chars val:'\t\tcp pristine-.gitmodules .gitmodules &&\n' span_id:1344) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config remote.origin.url file:///tmp/repo &&\n'
            span_id: 1345
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule init &&\n' span_id:1346) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest "$(git config submodule.sub.url)" = file:///tmp/subrepo\n'
            span_id: 1347
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1348)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '../subrepo works with helper URL- helper:://hostname/repo'
            span_id: 1355
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1359) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1360) (Token id:Id.Lit_Chars val:'\t\tcd reltest &&\n' span_id:1361) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tcp pristine-.git-config .git/config &&\n'
            span_id: 1362
          ) (Token id:Id.Lit_Chars val:'\t\tcp pristine-.gitmodules .gitmodules &&\n' span_id:1363) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config remote.origin.url helper:://hostname/repo &&\n'
            span_id: 1364
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule init &&\n' span_id:1365) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest "$(git config submodule.sub.url)" = helper:://hostname/subrepo\n'
            span_id: 1366
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1367)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '../subrepo works with scp-style URL - user@host:repo'
            span_id: 1374
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1378) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1379) (Token id:Id.Lit_Chars val:'\t\tcd reltest &&\n' span_id:1380) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tcp pristine-.git-config .git/config &&\n'
            span_id: 1381
          ) (Token id:Id.Lit_Chars val:'\t\tgit config remote.origin.url user@host:repo &&\n' span_id:1382) 
          (Token id:Id.Lit_Chars val:'\t\tgit submodule init &&\n' span_id:1383) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest "$(git config submodule.sub.url)" = user@host:subrepo\n'
            span_id: 1384
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1385)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '../subrepo works with scp-style URL - user@host:path/to/repo'
            span_id: 1392
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1396) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1397) (Token id:Id.Lit_Chars val:'\t\tcd reltest &&\n' span_id:1398) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tcp pristine-.git-config .git/config &&\n'
            span_id: 1399
          ) (Token id:Id.Lit_Chars val:'\t\tcp pristine-.gitmodules .gitmodules &&\n' span_id:1400) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config remote.origin.url user@host:path/to/repo &&\n'
            span_id: 1401
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule init &&\n' span_id:1402) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest "$(git config submodule.sub.url)" = user@host:path/to/subrepo\n'
            span_id: 1403
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1404)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '../subrepo works with relative local path - foo'
            span_id: 1411
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1415) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1416) (Token id:Id.Lit_Chars val:'\t\tcd reltest &&\n' span_id:1417) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tcp pristine-.git-config .git/config &&\n'
            span_id: 1418
          ) (Token id:Id.Lit_Chars val:'\t\tcp pristine-.gitmodules .gitmodules &&\n' span_id:1419) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config remote.origin.url foo &&\n'
            span_id: 1420
          ) (Token id:Id.Lit_Chars val:'\t\t# actual: fails with an error\n' span_id:1421) 
          (Token id:Id.Lit_Chars val:'\t\tgit submodule init &&\n' span_id:1422) (Token id:Id.Lit_Chars val:'\t\ttest "$(git config submodule.sub.url)" = subrepo\n' span_id:1423) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:1424)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '../subrepo works with relative local path - foo/bar'
            span_id: 1431
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1435) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1436) (Token id:Id.Lit_Chars val:'\t\tcd reltest &&\n' span_id:1437) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tcp pristine-.git-config .git/config &&\n'
            span_id: 1438
          ) (Token id:Id.Lit_Chars val:'\t\tcp pristine-.gitmodules .gitmodules &&\n' span_id:1439) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config remote.origin.url foo/bar &&\n'
            span_id: 1440
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule init &&\n' span_id:1441) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest "$(git config submodule.sub.url)" = foo/subrepo\n'
            span_id: 1442
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1443)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '../subrepo works with relative local path - ./foo'
            span_id: 1450
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1454) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1455) (Token id:Id.Lit_Chars val:'\t\tcd reltest &&\n' span_id:1456) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tcp pristine-.git-config .git/config &&\n'
            span_id: 1457
          ) (Token id:Id.Lit_Chars val:'\t\tcp pristine-.gitmodules .gitmodules &&\n' span_id:1458) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config remote.origin.url ./foo &&\n'
            span_id: 1459
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule init &&\n' span_id:1460) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest "$(git config submodule.sub.url)" = subrepo\n'
            span_id: 1461
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1462)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '../subrepo works with relative local path - ./foo/bar'
            span_id: 1469
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1473) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1474) (Token id:Id.Lit_Chars val:'\t\tcd reltest &&\n' span_id:1475) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tcp pristine-.git-config .git/config &&\n'
            span_id: 1476
          ) (Token id:Id.Lit_Chars val:'\t\tcp pristine-.gitmodules .gitmodules &&\n' span_id:1477) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config remote.origin.url ./foo/bar &&\n'
            span_id: 1478
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule init &&\n' span_id:1479) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest "$(git config submodule.sub.url)" = foo/subrepo\n'
            span_id: 1480
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1481)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '../subrepo works with relative local path - ../foo'
            span_id: 1488
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1492) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1493) (Token id:Id.Lit_Chars val:'\t\tcd reltest &&\n' span_id:1494) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tcp pristine-.git-config .git/config &&\n'
            span_id: 1495
          ) (Token id:Id.Lit_Chars val:'\t\tcp pristine-.gitmodules .gitmodules &&\n' span_id:1496) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config remote.origin.url ../foo &&\n'
            span_id: 1497
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule init &&\n' span_id:1498) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest "$(git config submodule.sub.url)" = ../subrepo\n'
            span_id: 1499
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1500)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '../subrepo works with relative local path - ../foo/bar'
            span_id: 1507
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1511) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1512) (Token id:Id.Lit_Chars val:'\t\tcd reltest &&\n' span_id:1513) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tcp pristine-.git-config .git/config &&\n'
            span_id: 1514
          ) (Token id:Id.Lit_Chars val:'\t\tcp pristine-.gitmodules .gitmodules &&\n' span_id:1515) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config remote.origin.url ../foo/bar &&\n'
            span_id: 1516
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule init &&\n' span_id:1517) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest "$(git config submodule.sub.url)" = ../foo/subrepo\n'
            span_id: 1518
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1519)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '../bar/a/b/c works with relative local path - ../foo/bar.git'
            span_id: 1526
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1530) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1531) (Token id:Id.Lit_Chars val:'\t\tcd reltest &&\n' span_id:1532) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tcp pristine-.git-config .git/config &&\n'
            span_id: 1533
          ) (Token id:Id.Lit_Chars val:'\t\tcp pristine-.gitmodules .gitmodules &&\n' span_id:1534) 
          (Token id:Id.Lit_Chars val:'\t\tmkdir -p a/b/c &&\n' span_id:1535) (Token id:Id.Lit_Chars val:'\t\t(cd a/b/c; git init) &&\n' span_id:1536) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config remote.origin.url ../foo/bar.git &&\n'
            span_id: 1537
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule add ../bar/a/b/c ./a/b/c &&\n' span_id:1538) 
          (Token id:Id.Lit_Chars val:'\t\tgit submodule init &&\n' span_id:1539) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest "$(git config submodule.a/b/c.url)" = ../foo/bar/a/b/c\n'
            span_id: 1540
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1541)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'moving the superproject does not break submodules'
            span_id: 1548
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1552) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1553) (Token id:Id.Lit_Chars val:'\t\tcd addtest &&\n' span_id:1554) 
          (Token id:Id.Lit_Chars val:'\t\tgit submodule status >expect\n' span_id:1555) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1556) 
          (Token id:Id.Lit_Chars val:'\tmv addtest addtest2 &&\n' span_id:1557) (Token id:Id.Lit_Chars val:'\t(\n' span_id:1558) 
          (Token id:Id.Lit_Chars val:'\t\tcd addtest2 &&\n' span_id:1559) (Token id:Id.Lit_Chars val:'\t\tgit submodule status >actual &&\n' span_id:1560) 
          (Token id:Id.Lit_Chars val:'\t\ttest_cmp expect actual\n' span_id:1561) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1562)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodule add --name allows to replace a submodule with another at the same path'
            span_id: 1569
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1573) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1574) (Token id:Id.Lit_Chars val:'\t\tcd addtest2 &&\n' span_id:1575) 
          (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:1576) (Token id:Id.Lit_Chars val:'\t\t\tcd repo &&\n' span_id:1577) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t\techo "$submodurl/repo" >expect &&\n'
            span_id: 1578
          ) (Token id:Id.Lit_Chars val:'\t\t\tgit config remote.origin.url >actual &&\n' span_id:1579) 
          (Token id:Id.Lit_Chars val:'\t\t\ttest_cmp expect actual &&\n' span_id:1580) (Token id:Id.Lit_Chars val:'\t\t\techo "gitdir: ../.git/modules/repo" >expect &&\n' span_id:1581) 
          (Token id:Id.Lit_Chars val:'\t\t\ttest_cmp expect .git\n' span_id:1582) (Token id:Id.Lit_Chars val:'\t\t) &&\n' span_id:1583) 
          (Token id:Id.Lit_Chars val:'\t\trm -rf repo &&\n' span_id:1584) (Token id:Id.Lit_Chars val:'\t\tgit rm repo &&\n' span_id:1585) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule add -q --name repo_new "$submodurl/bare.git" repo >actual &&\n'
            span_id: 1586
          ) (Token id:Id.Lit_Chars val:'\t\ttest_must_be_empty actual &&\n' span_id:1587) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo "gitdir: ../.git/modules/submod" >expect &&\n'
            span_id: 1588
          ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp expect submod/.git &&\n' span_id:1589) 
          (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:1590) (Token id:Id.Lit_Chars val:'\t\t\tcd repo &&\n' span_id:1591) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t\techo "$submodurl/bare.git" >expect &&\n'
            span_id: 1592
          ) (Token id:Id.Lit_Chars val:'\t\t\tgit config remote.origin.url >actual &&\n' span_id:1593) 
          (Token id:Id.Lit_Chars val:'\t\t\ttest_cmp expect actual &&\n' span_id:1594) (Token id:Id.Lit_Chars val:'\t\t\techo "gitdir: ../.git/modules/repo_new" >expect &&\n' span_id:1595) 
          (Token id:Id.Lit_Chars val:'\t\t\ttest_cmp expect .git\n' span_id:1596) (Token id:Id.Lit_Chars val:'\t\t) &&\n' span_id:1597) 
          (Token id:Id.Lit_Chars val:'\t\techo "repo" >expect &&\n' span_id:1598) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git config -f .gitmodules submodule.repo.path &&\n'
            span_id: 1599
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config -f .gitmodules submodule.repo_new.path >actual &&\n'
            span_id: 1600
          ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp expect actual&&\n' span_id:1601) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo "$submodurl/repo" >expect &&\n'
            span_id: 1602
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git config -f .gitmodules submodule.repo.url &&\n'
            span_id: 1603
          ) (Token id:Id.Lit_Chars val:'\t\techo "$submodurl/bare.git" >expect &&\n' span_id:1604) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config -f .gitmodules submodule.repo_new.url >actual &&\n'
            span_id: 1605
          ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp expect actual &&\n' span_id:1606) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo "$submodurl/repo" >expect &&\n'
            span_id: 1607
          ) (Token id:Id.Lit_Chars val:'\t\tgit config submodule.repo.url >actual &&\n' span_id:1608) 
          (Token id:Id.Lit_Chars val:'\t\ttest_cmp expect actual &&\n' span_id:1609) (Token id:Id.Lit_Chars val:'\t\techo "$submodurl/bare.git" >expect &&\n' span_id:1610) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config submodule.repo_new.url >actual &&\n'
            span_id: 1611
          ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp expect actual\n' span_id:1612) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:1613)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'recursive relative submodules stay relative' span_id:1620))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1624) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "rm -rf super clone2 subsub sub3" &&\n'
            span_id: 1625
          ) (Token id:Id.Lit_Chars val:'\tmkdir subsub &&\n' span_id:1626) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1627) (Token id:Id.Lit_Chars val:'\t\tcd subsub &&\n' span_id:1628) 
          (Token id:Id.Lit_Chars val:'\t\tgit init &&\n' span_id:1629) (Token id:Id.Lit_Chars val:'\t\t>t &&\n' span_id:1630) 
          (Token id:Id.Lit_Chars val:'\t\tgit add t &&\n' span_id:1631) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "initial commit"\n' span_id:1632) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1633) (Token id:Id.Lit_Chars val:'\tmkdir sub3 &&\n' span_id:1634) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1635) (Token id:Id.Lit_Chars val:'\t\tcd sub3 &&\n' span_id:1636) 
          (Token id:Id.Lit_Chars val:'\t\tgit init &&\n' span_id:1637) (Token id:Id.Lit_Chars val:'\t\t>t &&\n' span_id:1638) 
          (Token id:Id.Lit_Chars val:'\t\tgit add t &&\n' span_id:1639) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "initial commit" &&\n' span_id:1640) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule add ../subsub dirdir/subsub &&\n'
            span_id: 1641
          ) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "add submodule subsub"\n' span_id:1642) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1643) (Token id:Id.Lit_Chars val:'\tmkdir super &&\n' span_id:1644) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1645) (Token id:Id.Lit_Chars val:'\t\tcd super &&\n' span_id:1646) 
          (Token id:Id.Lit_Chars val:'\t\tgit init &&\n' span_id:1647) (Token id:Id.Lit_Chars val:'\t\t>t &&\n' span_id:1648) 
          (Token id:Id.Lit_Chars val:'\t\tgit add t &&\n' span_id:1649) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "initial commit" &&\n' span_id:1650) 
          (Token id:Id.Lit_Chars val:'\t\tgit submodule add ../sub3 &&\n' span_id:1651) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "add submodule sub"\n' span_id:1652) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1653) (Token id:Id.Lit_Chars val:'\tgit clone super clone2 &&\n' span_id:1654) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1655) (Token id:Id.Lit_Chars val:'\t\tcd clone2 &&\n' span_id:1656) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule update --init --recursive &&\n'
            span_id: 1657
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo "gitdir: ../.git/modules/sub3" >./sub3/.git_expect &&\n'
            span_id: 1658
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'\t\techo "gitdir: ../../../.git/modules/sub3/modules/dirdir/subsub" >./sub3/dirdir/subsub/.git_expect\n'
            span_id: 1659
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1660) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_cmp clone2/sub3/.git_expect clone2/sub3/.git &&\n'
            span_id: 1661
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_cmp clone2/sub3/dirdir/subsub/.git_expect clone2/sub3/dirdir/subsub/.git\n'
            span_id: 1662
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodule add with an existing name fails unless forced'
            span_id: 1669
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1673) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1674) (Token id:Id.Lit_Chars val:'\t\tcd addtest2 &&\n' span_id:1675) 
          (Token id:Id.Lit_Chars val:'\t\trm -rf repo &&\n' span_id:1676) (Token id:Id.Lit_Chars val:'\t\tgit rm repo &&\n' span_id:1677) 
          (Token
            id: Id.Lit_Chars
            val: 
'\t\ttest_must_fail git submodule add -q --name repo_new "$submodurl/repo.git" repo &&\n'
            span_id: 1678
          ) (Token id:Id.Lit_Chars val:'\t\ttest ! -d repo &&\n' span_id:1679) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git config -f .gitmodules submodule.repo_new.path &&\n'
            span_id: 1680
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git config -f .gitmodules submodule.repo_new.url &&\n'
            span_id: 1681
          ) (Token id:Id.Lit_Chars val:'\t\techo "$submodurl/bare.git" >expect &&\n' span_id:1682) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config submodule.repo_new.url >actual &&\n'
            span_id: 1683
          ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp expect actual &&\n' span_id:1684) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule add -f -q --name repo_new "$submodurl/repo.git" repo &&\n'
            span_id: 1685
          ) (Token id:Id.Lit_Chars val:'\t\ttest -d repo &&\n' span_id:1686) 
          (Token id:Id.Lit_Chars val:'\t\techo "repo" >expect &&\n' span_id:1687) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config -f .gitmodules submodule.repo_new.path >actual &&\n'
            span_id: 1688
          ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp expect actual&&\n' span_id:1689) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo "$submodurl/repo.git" >expect &&\n'
            span_id: 1690
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config -f .gitmodules submodule.repo_new.url >actual &&\n'
            span_id: 1691
          ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp expect actual &&\n' span_id:1692) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo "$submodurl/repo.git" >expect &&\n'
            span_id: 1693
          ) (Token id:Id.Lit_Chars val:'\t\tgit config submodule.repo_new.url >actual &&\n' span_id:1694) 
          (Token id:Id.Lit_Chars val:'\t\ttest_cmp expect actual\n' span_id:1695) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1696)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'set up a second submodule' span_id:1703))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1707) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit submodule add ./init2 example2 &&\n'
            span_id: 1708
          ) (Token id:Id.Lit_Chars val:'\tgit commit -m "submodule example2 added"\n' span_id:1709)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodule deinit works on repository without submodules'
            span_id: 1716
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1720) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "rm -rf newdirectory" &&\n'
            span_id: 1721
          ) (Token id:Id.Lit_Chars val:'\tmkdir newdirectory &&\n' span_id:1722) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1723) (Token id:Id.Lit_Chars val:'\t\tcd newdirectory &&\n' span_id:1724) 
          (Token id:Id.Lit_Chars val:'\t\tgit init &&\n' span_id:1725) (Token id:Id.Lit_Chars val:'\t\t>file &&\n' span_id:1726) 
          (Token id:Id.Lit_Chars val:'\t\tgit add file &&\n' span_id:1727) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "repo should not be empty" &&\n' span_id:1728) 
          (Token id:Id.Lit_Chars val:'\t\tgit submodule deinit . &&\n' span_id:1729) (Token id:Id.Lit_Chars val:'\t\tgit submodule deinit --all\n' span_id:1730) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:1731)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodule deinit should remove the whole submodule section from .git/config'
            span_id: 1738
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1742) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config submodule.example.foo bar &&\n'
            span_id: 1743
          ) (Token id:Id.Lit_Chars val:'\tgit config submodule.example2.frotz nitfol &&\n' span_id:1744) 
          (Token id:Id.Lit_Chars val:'\tgit submodule deinit init &&\n' span_id:1745) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest -z "$(git config --get-regexp "submodule\\.example\\.")" &&\n'
            span_id: 1746
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest -n "$(git config --get-regexp "submodule\\.example2\\.")" &&\n'
            span_id: 1747
          ) (Token id:Id.Lit_Chars val:'\ttest -f example2/.git &&\n' span_id:1748) 
          (Token id:Id.Lit_Chars val:'\trmdir init\n' span_id:1749)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'submodule deinit from subdirectory' span_id:1756))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1760) 
          (Token id:Id.Lit_Chars val:'\tgit submodule update --init &&\n' span_id:1761) (Token id:Id.Lit_Chars val:'\tgit config submodule.example.foo bar &&\n' span_id:1762) 
          (Token id:Id.Lit_Chars val:'\tmkdir -p sub &&\n' span_id:1763) (Token id:Id.Lit_Chars val:'\t(\n' span_id:1764) 
          (Token id:Id.Lit_Chars val:'\t\tcd sub &&\n' span_id:1765) (Token id:Id.Lit_Chars val:'\t\tgit submodule deinit ../init >../output\n' span_id:1766) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1767) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep "\\\\.\\\\./init" output &&\n' span_id:1768) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest -z "$(git config --get-regexp "submodule\\.example\\.")" &&\n'
            span_id: 1769
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest -n "$(git config --get-regexp "submodule\\.example2\\.")" &&\n'
            span_id: 1770
          ) (Token id:Id.Lit_Chars val:'\ttest -f example2/.git &&\n' span_id:1771) 
          (Token id:Id.Lit_Chars val:'\trmdir init\n' span_id:1772)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodule deinit . deinits all initialized submodules'
            span_id: 1779
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1783) 
          (Token id:Id.Lit_Chars val:'\tgit submodule update --init &&\n' span_id:1784) (Token id:Id.Lit_Chars val:'\tgit config submodule.example.foo bar &&\n' span_id:1785) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config submodule.example2.frotz nitfol &&\n'
            span_id: 1786
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git submodule deinit &&\n' span_id:1787) 
          (Token id:Id.Lit_Chars val:'\tgit submodule deinit . >actual &&\n' span_id:1788) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest -z "$(git config --get-regexp "submodule\\.example\\.")" &&\n'
            span_id: 1789
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest -z "$(git config --get-regexp "submodule\\.example2\\.")" &&\n'
            span_id: 1790
          ) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep "Cleared directory .init" actual &&\n' span_id:1791) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep "Cleared directory .example2" actual &&\n'
            span_id: 1792
          ) (Token id:Id.Lit_Chars val:'\trmdir init example2\n' span_id:1793)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodule deinit --all deinits all initialized submodules'
            span_id: 1800
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1804) 
          (Token id:Id.Lit_Chars val:'\tgit submodule update --init &&\n' span_id:1805) (Token id:Id.Lit_Chars val:'\tgit config submodule.example.foo bar &&\n' span_id:1806) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config submodule.example2.frotz nitfol &&\n'
            span_id: 1807
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git submodule deinit &&\n' span_id:1808) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit submodule deinit --all >actual &&\n'
            span_id: 1809
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest -z "$(git config --get-regexp "submodule\\.example\\.")" &&\n'
            span_id: 1810
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest -z "$(git config --get-regexp "submodule\\.example2\\.")" &&\n'
            span_id: 1811
          ) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep "Cleared directory .init" actual &&\n' span_id:1812) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep "Cleared directory .example2" actual &&\n'
            span_id: 1813
          ) (Token id:Id.Lit_Chars val:'\trmdir init example2\n' span_id:1814)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodule deinit deinits a submodule when its work tree is missing or empty'
            span_id: 1821
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1825) 
          (Token id:Id.Lit_Chars val:'\tgit submodule update --init &&\n' span_id:1826) (Token id:Id.Lit_Chars val:'\trm -rf init example2/* example2/.git &&\n' span_id:1827) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit submodule deinit init example2 >actual &&\n'
            span_id: 1828
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest -z "$(git config --get-regexp "submodule\\.example\\.")" &&\n'
            span_id: 1829
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest -z "$(git config --get-regexp "submodule\\.example2\\.")" &&\n'
            span_id: 1830
          ) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep ! "Cleared directory .init" actual &&\n' span_id:1831) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep "Cleared directory .example2" actual &&\n'
            span_id: 1832
          ) (Token id:Id.Lit_Chars val:'\trmdir init\n' span_id:1833)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodule deinit fails when the submodule contains modifications unless forced'
            span_id: 1840
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1844) 
          (Token id:Id.Lit_Chars val:'\tgit submodule update --init &&\n' span_id:1845) (Token id:Id.Lit_Chars val:'\techo X >>init/s &&\n' span_id:1846) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git submodule deinit init &&\n'
            span_id: 1847
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest -n "$(git config --get-regexp "submodule\\.example\\.")" &&\n'
            span_id: 1848
          ) (Token id:Id.Lit_Chars val:'\ttest -f example2/.git &&\n' span_id:1849) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit submodule deinit -f init >actual &&\n'
            span_id: 1850
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest -z "$(git config --get-regexp "submodule\\.example\\.")" &&\n'
            span_id: 1851
          ) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep "Cleared directory .init" actual &&\n' span_id:1852) 
          (Token id:Id.Lit_Chars val:'\trmdir init\n' span_id:1853)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodule deinit fails when the submodule contains untracked files unless forced'
            span_id: 1860
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1864) 
          (Token id:Id.Lit_Chars val:'\tgit submodule update --init &&\n' span_id:1865) (Token id:Id.Lit_Chars val:'\techo X >>init/untracked &&\n' span_id:1866) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git submodule deinit init &&\n'
            span_id: 1867
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest -n "$(git config --get-regexp "submodule\\.example\\.")" &&\n'
            span_id: 1868
          ) (Token id:Id.Lit_Chars val:'\ttest -f example2/.git &&\n' span_id:1869) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit submodule deinit -f init >actual &&\n'
            span_id: 1870
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest -z "$(git config --get-regexp "submodule\\.example\\.")" &&\n'
            span_id: 1871
          ) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep "Cleared directory .init" actual &&\n' span_id:1872) 
          (Token id:Id.Lit_Chars val:'\trmdir init\n' span_id:1873)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodule deinit fails when the submodule HEAD does not match unless forced'
            span_id: 1880
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1884) 
          (Token id:Id.Lit_Chars val:'\tgit submodule update --init &&\n' span_id:1885) (Token id:Id.Lit_Chars val:'\t(\n' span_id:1886) 
          (Token id:Id.Lit_Chars val:'\t\tcd init &&\n' span_id:1887) (Token id:Id.Lit_Chars val:'\t\tgit checkout HEAD^\n' span_id:1888) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1889) (Token id:Id.Lit_Chars val:'\ttest_must_fail git submodule deinit init &&\n' span_id:1890) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest -n "$(git config --get-regexp "submodule\\.example\\.")" &&\n'
            span_id: 1891
          ) (Token id:Id.Lit_Chars val:'\ttest -f example2/.git &&\n' span_id:1892) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit submodule deinit -f init >actual &&\n'
            span_id: 1893
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest -z "$(git config --get-regexp "submodule\\.example\\.")" &&\n'
            span_id: 1894
          ) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep "Cleared directory .init" actual &&\n' span_id:1895) 
          (Token id:Id.Lit_Chars val:'\trmdir init\n' span_id:1896)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodule deinit is silent when used on an uninitialized submodule'
            span_id: 1903
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1907) 
          (Token id:Id.Lit_Chars val:'\tgit submodule update --init &&\n' span_id:1908) (Token id:Id.Lit_Chars val:'\tgit submodule deinit init >actual &&\n' span_id:1909) 
          (Token
            id: Id.Lit_Chars
            val: 
'\ttest_i18ngrep "Submodule .example. (.*) unregistered for path .init" actual &&\n'
            span_id: 1910
          ) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep "Cleared directory .init" actual &&\n' span_id:1911) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit submodule deinit init >actual &&\n'
            span_id: 1912
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'\ttest_i18ngrep ! "Submodule .example. (.*) unregistered for path .init" actual &&\n'
            span_id: 1913
          ) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep "Cleared directory .init" actual &&\n' span_id:1914) 
          (Token id:Id.Lit_Chars val:'\tgit submodule deinit . >actual &&\n' span_id:1915) 
          (Token
            id: Id.Lit_Chars
            val: 
'\ttest_i18ngrep ! "Submodule .example. (.*) unregistered for path .init" actual &&\n'
            span_id: 1916
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'\ttest_i18ngrep "Submodule .example2. (.*) unregistered for path .example2" actual &&\n'
            span_id: 1917
          ) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep "Cleared directory .init" actual &&\n' span_id:1918) 
          (Token id:Id.Lit_Chars val:'\tgit submodule deinit . >actual &&\n' span_id:1919) 
          (Token
            id: Id.Lit_Chars
            val: 
'\ttest_i18ngrep ! "Submodule .example. (.*) unregistered for path .init" actual &&\n'
            span_id: 1920
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'\ttest_i18ngrep ! "Submodule .example2. (.*) unregistered for path .example2" actual &&\n'
            span_id: 1921
          ) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep "Cleared directory .init" actual &&\n' span_id:1922) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit submodule deinit --all >actual &&\n'
            span_id: 1923
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'\ttest_i18ngrep ! "Submodule .example. (.*) unregistered for path .init" actual &&\n'
            span_id: 1924
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'\ttest_i18ngrep ! "Submodule .example2. (.*) unregistered for path .example2" actual &&\n'
            span_id: 1925
          ) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep "Cleared directory .init" actual &&\n' span_id:1926) 
          (Token id:Id.Lit_Chars val:'\trmdir init example2\n' span_id:1927)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodule deinit fails when submodule has a .git directory even when forced'
            span_id: 1934
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1938) 
          (Token id:Id.Lit_Chars val:'\tgit submodule update --init &&\n' span_id:1939) (Token id:Id.Lit_Chars val:'\t(\n' span_id:1940) 
          (Token id:Id.Lit_Chars val:'\t\tcd init &&\n' span_id:1941) (Token id:Id.Lit_Chars val:'\t\trm .git &&\n' span_id:1942) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tcp -R ../.git/modules/example .git &&\n'
            span_id: 1943
          ) (Token id:Id.Lit_Chars val:'\t\tGIT_WORK_TREE=. git config --unset core.worktree\n' span_id:1944) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1945) (Token id:Id.Lit_Chars val:'\ttest_must_fail git submodule deinit init &&\n' span_id:1946) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git submodule deinit -f init &&\n'
            span_id: 1947
          ) (Token id:Id.Lit_Chars val:'\ttest -d init/.git &&\n' span_id:1948) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest -n "$(git config --get-regexp "submodule\\.example\\.")"\n'
            span_id: 1949
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'submodule with UTF-8 name' span_id:1956))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1960) 
          (Token
            id: Id.Lit_Chars
            val: '\tsvname=$(printf "\\303\\245 \\303\\244\\303\\266") &&\n'
            span_id: 1961
          ) (Token id:Id.Lit_Chars val:'\tmkdir "$svname" &&\n' span_id:1962) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1963) (Token id:Id.Lit_Chars val:'\t\tcd "$svname" &&\n' span_id:1964) 
          (Token id:Id.Lit_Chars val:'\t\tgit init &&\n' span_id:1965) (Token id:Id.Lit_Chars val:'\t\t>sub &&\n' span_id:1966) 
          (Token id:Id.Lit_Chars val:'\t\tgit add sub &&\n' span_id:1967) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "init sub"\n' span_id:1968) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1969) (Token id:Id.Lit_Chars val:'\tgit submodule add ./"$svname" &&\n' span_id:1970) 
          (Token id:Id.Lit_Chars val:'\tgit submodule >&2 &&\n' span_id:1971) (Token id:Id.Lit_Chars val:'\ttest -n "$(git submodule | grep "$svname")"\n' span_id:1972)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'submodule add clone shallow submodule' span_id:1979))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1983) 
          (Token id:Id.Lit_Chars val:'\tmkdir super &&\n' span_id:1984) (Token id:Id.Lit_Chars val:'\tpwd=$(pwd) &&\n' span_id:1985) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1986) (Token id:Id.Lit_Chars val:'\t\tcd super &&\n' span_id:1987) 
          (Token id:Id.Lit_Chars val:'\t\tgit init &&\n' span_id:1988) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit submodule add --depth=1 file://"$pwd"/example2 submodule &&\n'
            span_id: 1989
          ) (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:1990) 
          (Token id:Id.Lit_Chars val:'\t\t\tcd submodule &&\n' span_id:1991) (Token id:Id.Lit_Chars val:'\t\t\ttest 1 = $(git log --oneline | wc -l)\n' span_id:1992) 
          (Token id:Id.Lit_Chars val:'\t\t)\n' span_id:1993) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1994)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'submodule helper list is not confused by common prefixes'
            span_id: 2001
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:2005) 
          (Token id:Id.Lit_Chars val:'\tmkdir -p dir1/b &&\n' span_id:2006) (Token id:Id.Lit_Chars val:'\t(\n' span_id:2007) 
          (Token id:Id.Lit_Chars val:'\t\tcd dir1/b &&\n' span_id:2008) (Token id:Id.Lit_Chars val:'\t\tgit init &&\n' span_id:2009) 
          (Token id:Id.Lit_Chars val:'\t\techo hi >testfile2 &&\n' span_id:2010) (Token id:Id.Lit_Chars val:'\t\tgit add . &&\n' span_id:2011) 
          (Token id:Id.Lit_Chars val:'\t\tgit commit -m "test1"\n' span_id:2012) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:2013) 
          (Token id:Id.Lit_Chars val:'\tmkdir -p dir2/b &&\n' span_id:2014) (Token id:Id.Lit_Chars val:'\t(\n' span_id:2015) 
          (Token id:Id.Lit_Chars val:'\t\tcd dir2/b &&\n' span_id:2016) (Token id:Id.Lit_Chars val:'\t\tgit init &&\n' span_id:2017) 
          (Token id:Id.Lit_Chars val:'\t\techo hello >testfile1 &&\n' span_id:2018) (Token id:Id.Lit_Chars val:'\t\tgit add .  &&\n' span_id:2019) 
          (Token id:Id.Lit_Chars val:'\t\tgit commit -m "test2"\n' span_id:2020) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:2021) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit submodule add /dir1/b dir1/b &&\n'
            span_id: 2022
          ) (Token id:Id.Lit_Chars val:'\tgit submodule add /dir2/b dir2/b &&\n' span_id:2023) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -m "first submodule commit" &&\n'
            span_id: 2024
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit submodule--helper list dir1/b |cut -c51- >actual &&\n'
            span_id: 2025
          ) (Token id:Id.Lit_Chars val:'\techo "dir1/b" >expect &&\n' span_id:2026) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:2027)
        )
      }
    )
    (C {(test_done)})
  ]
)