(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: 
            {
              (DQ ('Test whether cache-tree is properly updated\n') ('\n') 
                ('Tests whether various commands properly update and/or rewrite the\n') ('cache-tree extension.\n')
              )
            }
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: cmp_cache_tree
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.Pipeline
                  children: [
                    (C {(test-dump-cache-tree)})
                    (command.Simple
                      words: [{(sed)} {(-e)} {(SQ (Token id:Id.Lit_Chars val:'/#(ref)/d' span_id:35))}]
                      redirects: [
                        (redir.Redir
                          op: (Token id:Id.Redir_Great val:'>' span_id:38)
                          fd: -1
                          arg_word: {(actual)}
                        )
                      ]
                    )
                  ]
                  negated: F
                )
                (command.Simple
                  words: [{(sed)} {(DQ (s/) ($ Id.VSub_DollarName '$_x40') (/SHA/))}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Less val:'<' span_id:52)
                      fd: -1
                      arg_word: {(actual)}
                    )
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:55)
                      fd: -1
                      arg_word: {(filtered)}
                    )
                  ]
                )
                (C {(test_cmp)} {(DQ ($ Id.VSub_Number '$1'))} {(filtered)})
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: generate_expected_cache_tree_rec
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:dir)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (DQ ($ Id.VSub_Number '$1') 
                            (braced_var_sub
                              token: (Token id:Id.VSub_Number val:1 span_id:93)
                              suffix_op: 
                                (suffix_op.Unary
                                  op_id: Id.VTest_ColonPlus
                                  arg_word: {(Id.Lit_Slash /)}
                                )
                            )
                          )
                        }
                      spids: [89]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:parent)
                      op: assign_op.Equal
                      rhs: {(DQ ($ Id.VSub_Number '$2'))}
                      spids: [102]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:subtrees)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:119)
                            command_list: 
                              (command.CommandList
                                children: [
                                  (command.Pipeline
                                    children: [
                                      (C {(git)} {(ls-files)})
                                      (C {(grep)} {(/)})
                                      (C {(cut)} {(-d)} {(/)} {(-f)} {(1)})
                                      (C {(uniq)})
                                    ]
                                    negated: F
                                  )
                                ]
                              )
                          )
                        }
                      spids: [118]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:subtree_count)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:145)
                            command_list: 
                              (command.CommandList
                                children: [
                                  (command.Pipeline
                                    children: [
                                      (C {(echo)} {(DQ ($ Id.VSub_DollarName '$subtrees'))})
                                      (C {(awk)} {(-v)} {(Id.Lit_VarLike 'c=') (0)} 
                                        {
                                          (SQ 
                                            (Token
                                              id: Id.Lit_Chars
                                              val: '$1 != "" {++c} END {print c}'
                                              span_id: 160
                                            )
                                          )
                                        }
                                      )
                                    ]
                                    negated: F
                                  )
                                ]
                              )
                          )
                        }
                      spids: [144]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:entries)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:168)
                            command_list: 
                              (command.CommandList
                                children: [
                                  (command.Pipeline
                                    children: [(C {(git)} {(ls-files)}) (C {(wc)} {(-l)})]
                                    negated: F
                                  )
                                ]
                              )
                          )
                        }
                      spids: [167]
                    )
                  ]
                )
                (C {(printf)} 
                  {
                    (DQ ('SHA ') ($ Id.VSub_DollarName '$dir') (' (%d entries, %d subtrees)') 
                      (Id.Lit_Other '\\') (n)
                    )
                  } {(DQ ($ Id.VSub_DollarName '$entries'))} {(DQ ($ Id.VSub_DollarName '$subtree_count'))}
                )
                (command.ForEach
                  iter_name: subtree
                  iter_words: [{($ Id.VSub_DollarName '$subtrees')}]
                  do_arg_iter: F
                  body: 
                    (command.DoGroup
                      children: [
                        (C {(cd)} {(DQ ($ Id.VSub_DollarName '$subtree'))})
                        (command.AndOr
                          ops: [Id.Op_DPipe]
                          children: [
                            (C {(generate_expected_cache_tree_rec)} 
                              {(DQ ($ Id.VSub_DollarName '$dir') ($ Id.VSub_DollarName '$subtree'))} {(DQ ($ Id.VSub_DollarName '$dir'))}
                            )
                            (command.ControlFlow
                              token: (Token id:Id.ControlFlow_Return val:return span_id:234)
                              arg_word: {(1)}
                            )
                          ]
                        )
                        (C {(cd)} {(..)})
                      ]
                    )
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:dir)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_DollarName '$parent')}
                      spids: [249]
                    )
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: generate_expected_cache_tree
      body: 
        (command.BraceGroup
          children: [
            (command.Subshell
              command_list: (command.CommandList children:[(C {(generate_expected_cache_tree_rec)})])
            )
          ]
        )
    )
    (command.ShFunction
      name: test_cache_tree
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.Simple
                  words: [{(generate_expected_cache_tree)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:284)
                      fd: -1
                      arg_word: {(expect)}
                    )
                  ]
                )
                (C {(cmp_cache_tree)} {(expect)})
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: test_invalid_cache_tree
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.Simple
                  words: [
                    {(printf)}
                    {(DQ ('invalid                                  %s ()') (Id.Lit_Other '\\') (n))}
                    {(DQ )}
                    {(DQ ($ Id.VSub_At '$@'))}
                  ]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:320)
                      fd: -1
                      arg_word: {(expect)}
                    )
                  ]
                )
                (command.Pipeline
                  children: [
                    (C {(test-dump-cache-tree)})
                    (command.Simple
                      words: [
                        {(sed)}
                        {(-n)}
                        {(-e)}
                        {(DQ ('s/[0-9]* subtrees//'))}
                        {(-e)}
                        {(SQ (Token id:Id.Lit_Chars val:'/#(ref)/d' span_id:344))}
                        {(-e)}
                        {(SQ (Token id:Id.Lit_Chars val:'/^invalid /p' span_id:350))}
                      ]
                      redirects: [
                        (redir.Redir
                          op: (Token id:Id.Redir_Great val:'>' span_id:353)
                          fd: -1
                          arg_word: {(actual)}
                        )
                      ]
                    )
                  ]
                  negated: F
                )
                (C {(test_cmp)} {(expect)} {(actual)})
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: test_no_cache_tree
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.Simple
                  words: [{(Id.Lit_Other ':')}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:378)
                      fd: -1
                      arg_word: {(expect)}
                    )
                  ]
                )
                (C {(cmp_cache_tree)} {(expect)})
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'initial commit has cache-tree' span_id:394))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:398) 
          (Token id:Id.Lit_Chars val:'\ttest_commit foo &&\n' span_id:399) (Token id:Id.Lit_Chars val:'\ttest_cache_tree\n' span_id:400)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'read-tree HEAD establishes cache-tree' span_id:407))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:411) 
          (Token id:Id.Lit_Chars val:'\tgit read-tree HEAD &&\n' span_id:412) (Token id:Id.Lit_Chars val:'\ttest_cache_tree\n' span_id:413)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git-add invalidates cache-tree' span_id:420))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:424) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "git reset --hard; git read-tree HEAD" &&\n'
            span_id: 425
          ) (Token id:Id.Lit_Chars val:'\techo "I changed this file" >foo &&\n' span_id:426) 
          (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:427) (Token id:Id.Lit_Chars val:'\ttest_invalid_cache_tree\n' span_id:428)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git-add in subdir invalidates cache-tree' span_id:435))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:439) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "git reset --hard; git read-tree HEAD" &&\n'
            span_id: 440
          ) (Token id:Id.Lit_Chars val:'\tmkdir dirx &&\n' span_id:441) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "I changed this file" >dirx/foo &&\n'
            span_id: 442
          ) (Token id:Id.Lit_Chars val:'\tgit add dirx/foo &&\n' span_id:443) 
          (Token id:Id.Lit_Chars val:'\ttest_invalid_cache_tree\n' span_id:444)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:450)
          fd: -1
          arg_word: {(before)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:453)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:454)) 
              (OF)
            }
          here_end_span_id: 460
          stdin_parts: [
            ('SHA  (3 entries, 2 subtrees)\n')
            ('SHA dir1/ (1 entries, 0 subtrees)\n')
            ('SHA dir2/ (1 entries, 0 subtrees)\n')
          ]
        )
      ]
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:464)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:467)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:468)) 
              (OF)
            }
          here_end_span_id: 474
          stdin_parts: [
            ('invalid                                   (2 subtrees)\n')
            ('invalid                                  dir1/ (0 subtrees)\n')
            ('SHA dir2/ (1 entries, 0 subtrees)\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git-add in subdir does not invalidate sibling cache-tree'
            span_id: 479
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:483) 
          (Token id:Id.Lit_Chars val:'\tgit tag no-children &&\n' span_id:484) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "git reset --hard no-children; git read-tree HEAD" &&\n'
            span_id: 485
          ) (Token id:Id.Lit_Chars val:'\tmkdir dir1 dir2 &&\n' span_id:486) 
          (Token id:Id.Lit_Chars val:'\ttest_commit dir1/a &&\n' span_id:487) (Token id:Id.Lit_Chars val:'\ttest_commit dir2/b &&\n' span_id:488) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "I changed this file" >dir1/a &&\n'
            span_id: 489
          ) (Token id:Id.Lit_Chars val:'\tcmp_cache_tree before &&\n' span_id:490) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "I changed this file" >dir1/a &&\n'
            span_id: 491
          ) (Token id:Id.Lit_Chars val:'\tgit add dir1/a &&\n' span_id:492) 
          (Token id:Id.Lit_Chars val:'\tcmp_cache_tree expect\n' span_id:493)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'update-index invalidates cache-tree' span_id:500))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:504) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "git reset --hard; git read-tree HEAD" &&\n'
            span_id: 505
          ) (Token id:Id.Lit_Chars val:'\techo "I changed this file" >foo &&\n' span_id:506) 
          (Token id:Id.Lit_Chars val:'\tgit update-index --add foo &&\n' span_id:507) (Token id:Id.Lit_Chars val:'\ttest_invalid_cache_tree\n' span_id:508)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'write-tree establishes cache-tree' span_id:515))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:519) 
          (Token id:Id.Lit_Chars val:'\ttest-scrap-cache-tree &&\n' span_id:520) (Token id:Id.Lit_Chars val:'\tgit write-tree &&\n' span_id:521) 
          (Token id:Id.Lit_Chars val:'\ttest_cache_tree\n' span_id:522)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'test-scrap-cache-tree works' span_id:529))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:533) 
          (Token id:Id.Lit_Chars val:'\tgit read-tree HEAD &&\n' span_id:534) (Token id:Id.Lit_Chars val:'\ttest-scrap-cache-tree &&\n' span_id:535) 
          (Token id:Id.Lit_Chars val:'\ttest_no_cache_tree\n' span_id:536)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'second commit has cache-tree' span_id:543))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:547) 
          (Token id:Id.Lit_Chars val:'\ttest_commit bar &&\n' span_id:548) (Token id:Id.Lit_Chars val:'\ttest_cache_tree\n' span_id:549)
        )
      }
    )
    (C {(test_expect_success)} {(PERL)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'commit --interactive gives cache-tree on partial commit'
            span_id: 558
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:562) 
          (Token id:Id.Lit_Chars val:'\tcat <<-\\EOT >foo.c &&\n' span_id:563) (Token id:Id.Lit_Chars val:'\tint foo()\n' span_id:564) 
          (Token id:Id.Lit_Chars val:'\t{\n' span_id:565) (Token id:Id.Lit_Chars val:'\t\treturn 42;\n' span_id:566) 
          (Token id:Id.Lit_Chars val:'\t}\n' span_id:567) (Token id:Id.Lit_Chars val:'\tint bar()\n' span_id:568) 
          (Token id:Id.Lit_Chars val:'\t{\n' span_id:569) (Token id:Id.Lit_Chars val:'\t\treturn 42;\n' span_id:570) 
          (Token id:Id.Lit_Chars val:'\t}\n' span_id:571) (Token id:Id.Lit_Chars val:'\tEOT\n' span_id:572) 
          (Token id:Id.Lit_Chars val:'\tgit add foo.c &&\n' span_id:573) (Token id:Id.Lit_Chars val:'\ttest_invalid_cache_tree &&\n' span_id:574) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "add a file" &&\n' span_id:575) (Token id:Id.Lit_Chars val:'\ttest_cache_tree &&\n' span_id:576) 
          (Token id:Id.Lit_Chars val:'\tcat <<-\\EOT >foo.c &&\n' span_id:577) (Token id:Id.Lit_Chars val:'\tint foo()\n' span_id:578) 
          (Token id:Id.Lit_Chars val:'\t{\n' span_id:579) (Token id:Id.Lit_Chars val:'\t\treturn 43;\n' span_id:580) 
          (Token id:Id.Lit_Chars val:'\t}\n' span_id:581) (Token id:Id.Lit_Chars val:'\tint bar()\n' span_id:582) 
          (Token id:Id.Lit_Chars val:'\t{\n' span_id:583) (Token id:Id.Lit_Chars val:'\t\treturn 44;\n' span_id:584) 
          (Token id:Id.Lit_Chars val:'\t}\n' span_id:585) (Token id:Id.Lit_Chars val:'\tEOT\n' span_id:586) 
          (Token
            id: Id.Lit_Chars
            val: '\t(echo p; echo 1; echo; echo s; echo n; echo y; echo q) |\n'
            span_id: 587
          ) (Token id:Id.Lit_Chars val:'\tgit commit --interactive -m foo &&\n' span_id:588) 
          (Token id:Id.Lit_Chars val:'\ttest_cache_tree\n' span_id:589)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commit in child dir has cache-tree' span_id:596))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:600) 
          (Token id:Id.Lit_Chars val:'\tmkdir dir &&\n' span_id:601) (Token id:Id.Lit_Chars val:'\t>dir/child.t &&\n' span_id:602) 
          (Token id:Id.Lit_Chars val:'\tgit add dir/child.t &&\n' span_id:603) (Token id:Id.Lit_Chars val:'\tgit commit -m dir/child.t &&\n' span_id:604) 
          (Token id:Id.Lit_Chars val:'\ttest_cache_tree\n' span_id:605)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'reset --hard gives cache-tree' span_id:612))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:616) 
          (Token id:Id.Lit_Chars val:'\ttest-scrap-cache-tree &&\n' span_id:617) (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:618) 
          (Token id:Id.Lit_Chars val:'\ttest_cache_tree\n' span_id:619)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'reset --hard without index gives cache-tree' span_id:626))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:630) 
          (Token id:Id.Lit_Chars val:'\trm -f .git/index &&\n' span_id:631) (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:632) 
          (Token id:Id.Lit_Chars val:'\ttest_cache_tree\n' span_id:633)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'checkout gives cache-tree' span_id:640))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:644) 
          (Token id:Id.Lit_Chars val:'\tgit tag current &&\n' span_id:645) (Token id:Id.Lit_Chars val:'\tgit checkout HEAD^ &&\n' span_id:646) 
          (Token id:Id.Lit_Chars val:'\ttest_cache_tree\n' span_id:647)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'checkout -b gives cache-tree' span_id:654))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:658) 
          (Token id:Id.Lit_Chars val:'\tgit checkout current &&\n' span_id:659) (Token id:Id.Lit_Chars val:'\tgit checkout -b prev HEAD^ &&\n' span_id:660) 
          (Token id:Id.Lit_Chars val:'\ttest_cache_tree\n' span_id:661)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'checkout -B gives cache-tree' span_id:668))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:672) 
          (Token id:Id.Lit_Chars val:'\tgit checkout current &&\n' span_id:673) (Token id:Id.Lit_Chars val:'\tgit checkout -B prev HEAD^ &&\n' span_id:674) 
          (Token id:Id.Lit_Chars val:'\ttest_cache_tree\n' span_id:675)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'merge --ff-only maintains cache-tree' span_id:682))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:686) 
          (Token id:Id.Lit_Chars val:'\tgit checkout current &&\n' span_id:687) (Token id:Id.Lit_Chars val:'\tgit checkout -b changes &&\n' span_id:688) 
          (Token id:Id.Lit_Chars val:'\ttest_commit llamas &&\n' span_id:689) (Token id:Id.Lit_Chars val:'\ttest_commit pachyderm &&\n' span_id:690) 
          (Token id:Id.Lit_Chars val:'\ttest_cache_tree &&\n' span_id:691) (Token id:Id.Lit_Chars val:'\tgit checkout current &&\n' span_id:692) 
          (Token id:Id.Lit_Chars val:'\ttest_cache_tree &&\n' span_id:693) (Token id:Id.Lit_Chars val:'\tgit merge --ff-only changes &&\n' span_id:694) 
          (Token id:Id.Lit_Chars val:'\ttest_cache_tree\n' span_id:695)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'merge maintains cache-tree' span_id:702))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:706) 
          (Token id:Id.Lit_Chars val:'\tgit checkout current &&\n' span_id:707) (Token id:Id.Lit_Chars val:'\tgit checkout -b changes2 &&\n' span_id:708) 
          (Token id:Id.Lit_Chars val:'\ttest_commit alpacas &&\n' span_id:709) (Token id:Id.Lit_Chars val:'\ttest_cache_tree &&\n' span_id:710) 
          (Token id:Id.Lit_Chars val:'\tgit checkout current &&\n' span_id:711) (Token id:Id.Lit_Chars val:'\ttest_commit struthio &&\n' span_id:712) 
          (Token id:Id.Lit_Chars val:'\ttest_cache_tree &&\n' span_id:713) (Token id:Id.Lit_Chars val:'\tgit merge changes2 &&\n' span_id:714) 
          (Token id:Id.Lit_Chars val:'\ttest_cache_tree\n' span_id:715)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'partial commit gives cache-tree' span_id:722))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:726) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit checkout -b partial no-children &&\n'
            span_id: 727
          ) (Token id:Id.Lit_Chars val:'\ttest_commit one &&\n' span_id:728) 
          (Token id:Id.Lit_Chars val:'\ttest_commit two &&\n' span_id:729) (Token id:Id.Lit_Chars val:'\techo "some change" >one.t &&\n' span_id:730) 
          (Token id:Id.Lit_Chars val:'\tgit add one.t &&\n' span_id:731) (Token id:Id.Lit_Chars val:'\techo "some other change" >two.t &&\n' span_id:732) 
          (Token id:Id.Lit_Chars val:'\tgit commit two.t -m partial &&\n' span_id:733) (Token id:Id.Lit_Chars val:'\ttest_cache_tree\n' span_id:734)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'no phantom error when switching trees' span_id:741))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:745) 
          (Token id:Id.Lit_Chars val:'\tmkdir newdir &&\n' span_id:746) (Token id:Id.Lit_Chars val:'\t>newdir/one &&\n' span_id:747) 
          (Token id:Id.Lit_Chars val:'\tgit add newdir/one &&\n' span_id:748) (Token id:Id.Lit_Chars val:'\tgit checkout 2>errors &&\n' span_id:749) 
          (Token id:Id.Lit_Chars val:'\t! test -s errors\n' span_id:750)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'switching trees does not invalidate shared index'
            span_id: 757
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:761) 
          (Token id:Id.Lit_Chars val:'\tgit update-index --split-index &&\n' span_id:762) (Token id:Id.Lit_Chars val:'\t>split &&\n' span_id:763) 
          (Token id:Id.Lit_Chars val:'\tgit add split &&\n' span_id:764) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest-dump-split-index .git/index | grep -v ^own >before &&\n'
            span_id: 765
          ) (Token id:Id.Lit_Chars val:'\tgit commit -m "as-is" &&\n' span_id:766) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest-dump-split-index .git/index | grep -v ^own >after &&\n'
            span_id: 767
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp before after\n' span_id:768)
        )
      }
    )
    (C {(test_done)})
  ]
)