(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: 
            {
              (SQ <'git submodule sync\n'> <'\n'> 
                <'These tests exercise the "git submodule sync" subcommand.\n'>
              )
            }
          spids: [13]
        )
      ]
      spids: [13]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ <'\n'> <'\techo file >file &&\n'> <'\tgit add file &&\n'> <'\ttest_tick &&\n'> 
          <'\tgit commit -m upstream &&\n'> <'\tgit clone . super &&\n'> <'\tgit clone super submodule &&\n'> <'\t(\n'> <'\t\tcd submodule &&\n'> 
          <'\t\tgit submodule add ../submodule sub-submodule &&\n'> <'\t\ttest_tick &&\n'> <'\t\tgit commit -m "sub-submodule"\n'> <'\t) &&\n'> <'\t(\n'> 
          <'\t\tcd super &&\n'> <'\t\tgit submodule add ../submodule submodule &&\n'> <'\t\ttest_tick &&\n'> 
          <'\t\tgit commit -m "submodule"\n'> <'\t) &&\n'> <'\tgit clone super super-clone &&\n'> <'\t(\n'> <'\t\tcd super-clone &&\n'> 
          <'\t\tgit submodule update --init --recursive\n'> <'\t) &&\n'> <'\tgit clone super empty-clone &&\n'> <'\t(\n'> <'\t\tcd empty-clone &&\n'> 
          <'\t\tgit submodule init\n'> <'\t) &&\n'> <'\tgit clone super top-only-clone &&\n'> <'\tgit clone super relative-clone &&\n'> 
          <'\t(\n'> <'\t\tcd relative-clone &&\n'> <'\t\tgit submodule update --init --recursive\n'> <'\t) &&\n'> 
          <'\tgit clone super recursive-clone &&\n'> <'\t(\n'> <'\t\tcd recursive-clone &&\n'> <'\t\tgit submodule update --init --recursive\n'> <'\t)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'change submodule'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd submodule &&\n'> <'\t\techo second line >>file &&\n'> 
          <'\t\ttest_tick &&\n'> <'\t\tgit commit -a -m "change submodule"\n'> <'\t)\n'>
        )
      }
    )
    (FuncDef
      name: reset_submodule_urls
      body: 
        (BraceGroup
          children: [
            (AndOr
              children: [
                (Subshell
                  child: 
                    (AndOr
                      children: [
                        (Assignment
                          keyword: Assign_None
                          pairs: [
                            (assign_pair
                              lhs: (LhsName name:root)
                              op: Equal
                              rhs: 
                                {
                                  (CommandSubPart
                                    command_list: (CommandList children:[(C {(pwd)})])
                                    left_token: <Left_CommandSub '$('>
                                    spids: [103 105]
                                  )
                                }
                              spids: [102]
                            )
                          ]
                          spids: [102]
                        )
                        (AndOr
                          children: [
                            (C {(cd)} {(super-clone/submodule)})
                            (C {(git)} {(config)} {(remote.origin.url)} 
                              {(DQ ($ VSub_Name '$root') (/submodule))}
                            )
                          ]
                          op_id: Op_DAmp
                        )
                      ]
                      op_id: Op_DAmp
                    )
                  spids: [99 129]
                )
                (Subshell
                  child: 
                    (AndOr
                      children: [
                        (Assignment
                          keyword: Assign_None
                          pairs: [
                            (assign_pair
                              lhs: (LhsName name:root)
                              op: Equal
                              rhs: 
                                {
                                  (CommandSubPart
                                    command_list: (CommandList children:[(C {(pwd)})])
                                    left_token: <Left_CommandSub '$('>
                                    spids: [138 140]
                                  )
                                }
                              spids: [137]
                            )
                          ]
                          spids: [137]
                        )
                        (AndOr
                          children: [
                            (C {(cd)} {(super-clone/submodule/sub-submodule)})
                            (C {(git)} {(config)} {(remote.origin.url)} 
                              {(DQ ($ VSub_Name '$root') (/submodule))}
                            )
                          ]
                          op_id: Op_DAmp
                        )
                      ]
                      op_id: Op_DAmp
                    )
                  spids: [134 164]
                )
              ]
              op_id: Op_DAmp
            )
          ]
          spids: [96]
        )
      spids: [91 95]
    )
    (C {(test_expect_success)} {(SQ <'change submodule url'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd super &&\n'> <'\t\tcd submodule &&\n'> 
          <'\t\tgit checkout master &&\n'> <'\t\tgit pull\n'> <'\t) &&\n'> <'\tmv submodule moved-submodule &&\n'> <'\t(\n'> 
          <'\t\tcd moved-submodule &&\n'> <'\t\tgit config -f .gitmodules submodule.sub-submodule.url ../moved-submodule &&\n'> 
          <'\t\ttest_tick &&\n'> <'\t\tgit commit -a -m moved-sub-submodule\n'> <'\t) &&\n'> <'\t(\n'> <'\t\tcd super &&\n'> 
          <'\t\tgit config -f .gitmodules submodule.submodule.url ../moved-submodule &&\n'> <'\t\ttest_tick &&\n'> <'\t\tgit commit -a -m moved-submodule\n'> <'\t)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'"git submodule sync" should update submodule URLs'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd super-clone &&\n'> <'\t\tgit pull --no-recurse-submodules &&\n'> 
          <'\t\tgit submodule sync\n'> <'\t) &&\n'> <'\ttest -d "$(\n'> <'\t\tcd super-clone/submodule &&\n'> 
          <'\t\tgit config remote.origin.url\n'> <'\t)" &&\n'> <'\ttest ! -d "$(\n'> <'\t\tcd super-clone/submodule/sub-submodule &&\n'> 
          <'\t\tgit config remote.origin.url\n'> <'\t)" &&\n'> <'\t(\n'> <'\t\tcd super-clone/submodule &&\n'> <'\t\tgit checkout master &&\n'> 
          <'\t\tgit pull\n'> <'\t) &&\n'> <'\t(\n'> <'\t\tcd super-clone &&\n'> 
          <'\t\ttest -d "$(git config submodule.submodule.url)"\n'> <'\t)\n'>
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ <'"git submodule sync --recursive" should update all submodule URLs'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd super-clone &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule &&\n'> 
          <'\t\t\tgit pull --no-recurse-submodules\n'> <'\t\t) &&\n'> <'\t\tgit submodule sync --recursive\n'> <'\t) &&\n'> <'\ttest -d "$(\n'> 
          <'\t\tcd super-clone/submodule &&\n'> <'\t\tgit config remote.origin.url\n'> <'\t)" &&\n'> <'\ttest -d "$(\n'> 
          <'\t\tcd super-clone/submodule/sub-submodule &&\n'> <'\t\tgit config remote.origin.url\n'> <'\t)" &&\n'> <'\t(\n'> 
          <'\t\tcd super-clone/submodule/sub-submodule &&\n'> <'\t\tgit checkout master &&\n'> <'\t\tgit pull\n'> <'\t)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'reset submodule URLs'>)} 
      {(SQ <'\n'> <'\treset_submodule_urls super-clone\n'>)}
    )
    (C {(test_expect_success)} 
      {(SQ <'"git submodule sync" should update submodule URLs - subdirectory'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd super-clone &&\n'> <'\t\tgit pull --no-recurse-submodules &&\n'> 
          <'\t\tmkdir -p sub &&\n'> <'\t\tcd sub &&\n'> <'\t\tgit submodule sync >../../output\n'> <'\t) &&\n'> 
          <'\ttest_i18ngrep "\\\\.\\\\./submodule" output &&\n'> <'\ttest -d "$(\n'> <'\t\tcd super-clone/submodule &&\n'> <'\t\tgit config remote.origin.url\n'> 
          <'\t)" &&\n'> <'\ttest ! -d "$(\n'> <'\t\tcd super-clone/submodule/sub-submodule &&\n'> 
          <'\t\tgit config remote.origin.url\n'> <'\t)" &&\n'> <'\t(\n'> <'\t\tcd super-clone/submodule &&\n'> <'\t\tgit checkout master &&\n'> 
          <'\t\tgit pull\n'> <'\t) &&\n'> <'\t(\n'> <'\t\tcd super-clone &&\n'> 
          <'\t\ttest -d "$(git config submodule.submodule.url)"\n'> <'\t)\n'>
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ <'"git submodule sync --recursive" should update all submodule URLs - subdirectory'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd super-clone &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule &&\n'> 
          <'\t\t\tgit pull --no-recurse-submodules\n'> <'\t\t) &&\n'> <'\t\tmkdir -p sub &&\n'> <'\t\tcd sub &&\n'> 
          <'\t\tgit submodule sync --recursive >../../output\n'> <'\t) &&\n'> <'\ttest_i18ngrep "\\\\.\\\\./submodule/sub-submodule" output &&\n'> <'\ttest -d "$(\n'> 
          <'\t\tcd super-clone/submodule &&\n'> <'\t\tgit config remote.origin.url\n'> <'\t)" &&\n'> <'\ttest -d "$(\n'> 
          <'\t\tcd super-clone/submodule/sub-submodule &&\n'> <'\t\tgit config remote.origin.url\n'> <'\t)" &&\n'> <'\t(\n'> 
          <'\t\tcd super-clone/submodule/sub-submodule &&\n'> <'\t\tgit checkout master &&\n'> <'\t\tgit pull\n'> <'\t)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'"git submodule sync" should update known submodule URLs'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd empty-clone &&\n'> <'\t\tgit pull &&\n'> 
          <'\t\tgit submodule sync &&\n'> <'\t\ttest -d "$(git config submodule.submodule.url)"\n'> <'\t)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'"git submodule sync" should not vivify uninteresting submodule'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd top-only-clone &&\n'> <'\t\tgit pull &&\n'> 
          <'\t\tgit submodule sync &&\n'> <'\t\ttest -z "$(git config submodule.submodule.url)" &&\n'> <'\t\tgit submodule sync submodule &&\n'> 
          <'\t\ttest -z "$(git config submodule.submodule.url)"\n'> <'\t)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'"git submodule sync" handles origin URL of the form foo'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd relative-clone &&\n'> <'\t\tgit remote set-url origin foo &&\n'> 
          <'\t\tgit submodule sync &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule &&\n'> <'\t\t\t#actual fails with: "cannot strip off url foo\n'> 
          <'\t\t\ttest "$(git config remote.origin.url)" = "../submodule"\n'> <'\t\t)\n'> <'\t)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'"git submodule sync" handles origin URL of the form foo/bar'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd relative-clone &&\n'> 
          <'\t\tgit remote set-url origin foo/bar &&\n'> <'\t\tgit submodule sync &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule &&\n'> 
          <'\t\t\t#actual foo/submodule\n'> <'\t\t\ttest "$(git config remote.origin.url)" = "../foo/submodule"\n'> <'\t\t) &&\n'> <'\t\t(\n'> 
          <'\t\t\tcd submodule/sub-submodule &&\n'> <'\t\t\ttest "$(git config remote.origin.url)" != "../../foo/submodule"\n'> <'\t\t)\n'> <'\t)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'"git submodule sync --recursive" propagates changes in origin'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd recursive-clone &&\n'> 
          <'\t\tgit remote set-url origin foo/bar &&\n'> <'\t\tgit submodule sync --recursive &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule &&\n'> 
          <'\t\t\t#actual foo/submodule\n'> <'\t\t\ttest "$(git config remote.origin.url)" = "../foo/submodule"\n'> <'\t\t) &&\n'> <'\t\t(\n'> 
          <'\t\t\tcd submodule/sub-submodule &&\n'> <'\t\t\ttest "$(git config remote.origin.url)" = "../../foo/submodule"\n'> <'\t\t)\n'> <'\t)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'"git submodule sync" handles origin URL of the form ./foo'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd relative-clone &&\n'> <'\t\tgit remote set-url origin ./foo &&\n'> 
          <'\t\tgit submodule sync &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule &&\n'> <'\t\t\t#actual ./submodule\n'> 
          <'\t\t\ttest "$(git config remote.origin.url)" = "../submodule"\n'> <'\t\t)\n'> <'\t)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'"git submodule sync" handles origin URL of the form ./foo/bar'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd relative-clone &&\n'> 
          <'\t\tgit remote set-url origin ./foo/bar &&\n'> <'\t\tgit submodule sync &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule &&\n'> 
          <'\t\t\t#actual ./foo/submodule\n'> <'\t\t\ttest "$(git config remote.origin.url)" = "../foo/submodule"\n'> <'\t\t)\n'> <'\t)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'"git submodule sync" handles origin URL of the form ../foo'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd relative-clone &&\n'> 
          <'\t\tgit remote set-url origin ../foo &&\n'> <'\t\tgit submodule sync &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule &&\n'> <'\t\t\t#actual ../submodule\n'> 
          <'\t\t\ttest "$(git config remote.origin.url)" = "../../submodule"\n'> <'\t\t)\n'> <'\t)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'"git submodule sync" handles origin URL of the form ../foo/bar'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd relative-clone &&\n'> 
          <'\t\tgit remote set-url origin ../foo/bar &&\n'> <'\t\tgit submodule sync &&\n'> <'\t\t(\n'> <'\t\t\tcd submodule &&\n'> 
          <'\t\t\t#actual ../foo/submodule\n'> <'\t\t\ttest "$(git config remote.origin.url)" = "../../foo/submodule"\n'> <'\t\t)\n'> <'\t)\n'>
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          <
'"git submodule sync" handles origin URL of the form ../foo/bar with deeply nested submodule'
          >
        )
      } 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd relative-clone &&\n'> 
          <'\t\tgit remote set-url origin ../foo/bar &&\n'> <'\t\tmkdir -p a/b/c &&\n'> <'\t\t(\n'> <'\t\t\tcd a/b/c &&\n'> <'\t\t\tgit init &&\n'> 
          <'\t\t\t>.gitignore &&\n'> <'\t\t\tgit add .gitignore &&\n'> <'\t\t\ttest_tick &&\n'> <'\t\t\tgit commit -m "initial commit"\n'> 
          <'\t\t) &&\n'> <'\t\tgit submodule add ../bar/a/b/c ./a/b/c &&\n'> <'\t\tgit submodule sync &&\n'> <'\t\t(\n'> 
          <'\t\t\tcd a/b/c &&\n'> <'\t\t\t#actual ../foo/bar/a/b/c\n'> 
          <'\t\t\ttest "$(git config remote.origin.url)" = "../../../../foo/bar/a/b/c"\n'> <'\t\t)\n'> <'\t)\n'>
        )
      }
    )
    (C {(test_done)})
  ]
)