(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: 'Combination of submodules and multiple workdirs'
                  span_id: 6
                )
              )
            }
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:base_path)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:16)
                command_list: (command.CommandList children:[(C {(pwd)} {(-P)})])
              )
            }
          spids: [15]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup: make origin' span_id:26))} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'mkdir -p origin/sub && ( cd origin/sub && git init &&\n'
            span_id: 32
          ) (Token id:Id.Lit_Chars val:'\techo file1 >file1 &&\n' span_id:33) 
          (Token id:Id.Lit_Chars val:'\tgit add file1 &&\n' span_id:34) (Token id:Id.Lit_Chars val:'\tgit commit -m file1 ) &&\n' span_id:35) 
          (Token
            id: Id.Lit_Chars
            val: '    mkdir -p origin/main && ( cd origin/main && git init &&\n'
            span_id: 36
          ) (Token id:Id.Lit_Chars val:'\tgit submodule add ../sub &&\n' span_id:37) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "add sub" ) &&\n' span_id:38) (Token id:Id.Lit_Chars val:'    ( cd origin/sub &&\n' span_id:39) 
          (Token id:Id.Lit_Chars val:'\techo file1updated >file1 &&\n' span_id:40) (Token id:Id.Lit_Chars val:'\tgit add file1 &&\n' span_id:41) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "file1 updated" ) &&\n' span_id:42) (Token id:Id.Lit_Chars val:'    ( cd origin/main/sub && git pull ) &&\n' span_id:43) 
          (Token id:Id.Lit_Chars val:'    ( cd origin/main &&\n' span_id:44) (Token id:Id.Lit_Chars val:'\tgit add sub &&\n' span_id:45) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "sub updated" )' span_id:46)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup: clone' span_id:53))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'mkdir clone && ( cd clone &&\n' span_id:59) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit clone --recursive "$base_path/origin/main")'
            span_id: 60
          )
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:rev1_hash_main)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:65)
                command_list: 
                  (command.CommandList
                    children: [
                      (C {(git)} {(--git-dir) (Id.Lit_Equals '=') (origin/main/.git)} {(show)} 
                        {(--pretty) (Id.Lit_Equals '=') (format) (Id.Lit_Other ':') (Id.Lit_Other '%') 
                          (h)
                        } {(-q)} {(DQ ('HEAD~1'))}
                      )
                    ]
                  )
              )
            }
          spids: [64]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:rev1_hash_sub)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:89)
                command_list: 
                  (command.CommandList
                    children: [
                      (C {(git)} {(--git-dir) (Id.Lit_Equals '=') (origin/sub/.git)} {(show)} 
                        {(--pretty) (Id.Lit_Equals '=') (format) (Id.Lit_Other ':') (Id.Lit_Other '%') 
                          (h)
                        } {(-q)} {(DQ ('HEAD~1'))}
                      )
                    ]
                  )
              )
            }
          spids: [88]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'checkout main' span_id:116))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'mkdir default_checkout &&\n' span_id:122) 
          (Token id:Id.Lit_Chars val:'    (cd clone/main &&\n' span_id:123) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit worktree add "$base_path/default_checkout/main" "$rev1_hash_main")'
            span_id: 124
          )
        )
      }
    )
    (C {(test_expect_failure)} 
      {(SQ (Token id:Id.Lit_Chars val:'can see submodule diffs just after checkout' span_id:131))} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 
'(cd default_checkout/main && git diff --submodule master"^!" | grep "file1 updated")'
            span_id: 137
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'checkout main and initialize independed clones' span_id:144))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'mkdir fully_cloned_submodule &&\n' span_id:150) 
          (Token id:Id.Lit_Chars val:'    (cd clone/main &&\n' span_id:151) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tgit worktree add "$base_path/fully_cloned_submodule/main" "$rev1_hash_main") &&\n'
            span_id: 152
          ) 
          (Token
            id: Id.Lit_Chars
            val: '    (cd fully_cloned_submodule/main && git submodule update)'
            span_id: 153
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'can see submodule diffs after independed cloning'
            span_id: 160
          )
        )
      } 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 
'(cd fully_cloned_submodule/main && git diff --submodule master"^!" | grep "file1 updated")'
            span_id: 166
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'checkout sub manually' span_id:173))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'mkdir linked_submodule &&\n' span_id:179) 
          (Token id:Id.Lit_Chars val:'    (cd clone/main &&\n' span_id:180) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit worktree add "$base_path/linked_submodule/main" "$rev1_hash_main") &&\n'
            span_id: 181
          ) (Token id:Id.Lit_Chars val:'    (cd clone/main/sub &&\n' span_id:182) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit worktree add "$base_path/linked_submodule/main/sub" "$rev1_hash_sub")'
            span_id: 183
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'can see submodule diffs after manual checkout of linked submodule'
            span_id: 190
          )
        )
      } 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 
'(cd linked_submodule/main && git diff --submodule master"^!" | grep "file1 updated")'
            span_id: 196
          )
        )
      }
    )
    (C {(test_done)})
  ]
)