(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)})
  ]
)