(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:'test protocol whitelisting with submodules' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(.)} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY')) (/lib-proto-disable.sh)})
    (C {(setup_ext_wrapper)})
    (C {(setup_ssh_wrapper)})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup repository with submodules' span_id:29))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:33) 
          (Token id:Id.Lit_Chars val:'\tmkdir remote &&\n' span_id:34) (Token id:Id.Lit_Chars val:'\tgit init remote/repo.git &&\n' span_id:35) 
          (Token
            id: Id.Lit_Chars
            val: '\t(cd remote/repo.git && test_commit one) &&\n'
            span_id: 36
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t# submodule-add should probably trust what we feed it on the cmdline,\n'
            span_id: 37
          ) (Token id:Id.Lit_Chars val:'\t# but its implementation is overly conservative.\n' span_id:38) 
          (Token
            id: Id.Lit_Chars
            val: '\tGIT_ALLOW_PROTOCOL=ssh git submodule add remote:repo.git ssh-module &&\n'
            span_id: 39
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tGIT_ALLOW_PROTOCOL=ext git submodule add "ext::fake-remote %S repo.git" ext-module &&\n'
            span_id: 40
          ) (Token id:Id.Lit_Chars val:'\tgit commit -m "add submodules"\n' span_id:41)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'clone with recurse-submodules fails' span_id:48))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:52) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git clone --recurse-submodules . dst\n'
            span_id: 53
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup individual updates' span_id:60))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:64) 
          (Token id:Id.Lit_Chars val:'\trm -rf dst &&\n' span_id:65) (Token id:Id.Lit_Chars val:'\tgit clone . dst &&\n' span_id:66) 
          (Token id:Id.Lit_Chars val:'\tgit -C dst submodule init\n' span_id:67)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'update of ssh allowed' span_id:74))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:78) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit -C dst submodule update ssh-module\n'
            span_id: 79
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'update of ext not allowed' span_id:86))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:90) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git -C dst submodule update ext-module\n'
            span_id: 91
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'user can override whitelist' span_id:98))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:102) 
          (Token
            id: Id.Lit_Chars
            val: '\tGIT_ALLOW_PROTOCOL=ext git -C dst submodule update ext-module\n'
            span_id: 103
          )
        )
      }
    )
    (C {(test_done)})
  ]
)