(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:'git add -u\n' span_id:6) 
                (Token id:Id.Lit_Chars val:'\n' span_id:7) (Token id:Id.Lit_Chars val:'This test creates a working tree state with three files:\n' span_id:8) 
                (Token id:Id.Lit_Chars val:'\n' span_id:9) (Token id:Id.Lit_Chars val:'  top (previously committed, modified)\n' span_id:10) 
                (Token
                  id: Id.Lit_Chars
                  val: '  dir/sub (previously committed, modified)\n'
                  span_id: 11
                ) (Token id:Id.Lit_Chars val:'  dir/other (untracked)\n' span_id:12) 
                (Token id:Id.Lit_Chars val:'\n' span_id:13) (Token id:Id.Lit_Chars val:'and issues a git add -u with path limiting on "dir" to add\n' span_id:14) 
                (Token
                  id: Id.Lit_Chars
                  val: 'only the updates to dir/sub.\n'
                  span_id: 15
                ) (Token id:Id.Lit_Chars val:'\n' span_id:16) 
                (Token
                  id: Id.Lit_Chars
                  val: 'Also tested are "git add -u" without limiting, and "git add -u"\n'
                  span_id: 17
                ) (Token id:Id.Lit_Chars val:'without contents changes, and other conditions' span_id:18)
              )
            }
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:32) 
          (Token id:Id.Lit_Chars val:'\techo initial >check &&\n' span_id:33) (Token id:Id.Lit_Chars val:'\techo initial >top &&\n' span_id:34) 
          (Token id:Id.Lit_Chars val:'\techo initial >foo &&\n' span_id:35) (Token id:Id.Lit_Chars val:'\tmkdir dir1 dir2 &&\n' span_id:36) 
          (Token id:Id.Lit_Chars val:'\techo initial >dir1/sub1 &&\n' span_id:37) (Token id:Id.Lit_Chars val:'\techo initial >dir1/sub2 &&\n' span_id:38) 
          (Token id:Id.Lit_Chars val:'\techo initial >dir2/sub3 &&\n' span_id:39) (Token id:Id.Lit_Chars val:'\tgit add check dir1 dir2 top foo &&\n' span_id:40) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:41) (Token id:Id.Lit_Chars val:'\tgit commit -m initial &&\n' span_id:42) 
          (Token id:Id.Lit_Chars val:'\n' span_id:43) (Token id:Id.Lit_Chars val:'\techo changed >check &&\n' span_id:44) 
          (Token id:Id.Lit_Chars val:'\techo changed >top &&\n' span_id:45) (Token id:Id.Lit_Chars val:'\techo changed >dir2/sub3 &&\n' span_id:46) 
          (Token id:Id.Lit_Chars val:'\trm -f dir1/sub1 &&\n' span_id:47) (Token id:Id.Lit_Chars val:'\techo other >dir2/other\n' span_id:48)
        )
      }
    )
    (C {(test_expect_success)} {(update)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:57) 
          (Token id:Id.Lit_Chars val:'\tgit add -u dir1 dir2\n' span_id:58)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'update noticed a removal' span_id:65))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:69) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest "$(git ls-files dir1/sub1)" = ""\n'
            span_id: 70
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'update touched correct path' span_id:77))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:81) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest "$(git diff-files --name-status dir2/sub3)" = ""\n'
            span_id: 82
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'update did not touch other tracked files' span_id:89))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:93) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest "$(git diff-files --name-status check)" = "M\tcheck" &&\n'
            span_id: 94
          ) (Token id:Id.Lit_Chars val:'\ttest "$(git diff-files --name-status top)" = "M\ttop"\n' span_id:95)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'update did not touch untracked files' span_id:102))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:106) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest "$(git ls-files dir2/other)" = ""\n'
            span_id: 107
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cache tree has not been corrupted' span_id:114))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:118) (Token id:Id.Lit_Chars val:'\n' span_id:119) 
          (Token id:Id.Lit_Chars val:'\tgit ls-files -s |\n' span_id:120) (Token id:Id.Lit_Chars val:'\tsed -e "s/ 0\t/\t/" >expect &&\n' span_id:121) 
          (Token id:Id.Lit_Chars val:'\tgit ls-tree -r $(git write-tree) |\n' span_id:122) (Token id:Id.Lit_Chars val:'\tsed -e "s/ blob / /" >current &&\n' span_id:123) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect current\n' span_id:124) (Token id:Id.Lit_Chars val:'\n' span_id:125)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'update from a subdirectory' span_id:132))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:136) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:137) (Token id:Id.Lit_Chars val:'\t\tcd dir1 &&\n' span_id:138) 
          (Token id:Id.Lit_Chars val:'\t\techo more >sub2 &&\n' span_id:139) (Token id:Id.Lit_Chars val:'\t\tgit add -u sub2\n' span_id:140) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:141)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'change gets noticed' span_id:148))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:152) (Token id:Id.Lit_Chars val:'\n' span_id:153) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest "$(git diff-files --name-status dir1)" = ""\n'
            span_id: 154
          ) (Token id:Id.Lit_Chars val:'\n' span_id:155)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'non-qualified update in subdir updates from the root'
            span_id: 162
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:166) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:167) (Token id:Id.Lit_Chars val:'\t\tcd dir1 &&\n' span_id:168) 
          (Token id:Id.Lit_Chars val:'\t\techo even more >>sub2 &&\n' span_id:169) (Token id:Id.Lit_Chars val:'\t\tgit --literal-pathspecs add -u &&\n' span_id:170) 
          (Token id:Id.Lit_Chars val:'\t\techo even more >>sub2 &&\n' span_id:171) (Token id:Id.Lit_Chars val:'\t\tgit add -u\n' span_id:172) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:173) (Token id:Id.Lit_Chars val:'\t: >expect &&\n' span_id:174) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-files --name-only >actual &&\n'
            span_id: 175
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:176)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'replace a file with a symlink' span_id:183))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:187) (Token id:Id.Lit_Chars val:'\n' span_id:188) 
          (Token id:Id.Lit_Chars val:'\trm foo &&\n' span_id:189) (Token id:Id.Lit_Chars val:'\ttest_ln_s_add top foo\n' span_id:190) 
          (Token id:Id.Lit_Chars val:'\n' span_id:191)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'add everything changed' span_id:198))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:202) (Token id:Id.Lit_Chars val:'\n' span_id:203) 
          (Token id:Id.Lit_Chars val:'\tgit add -u &&\n' span_id:204) (Token id:Id.Lit_Chars val:'\ttest -z "$(git diff-files)"\n' span_id:205) 
          (Token id:Id.Lit_Chars val:'\n' span_id:206)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'touch and then add -u' span_id:213))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:217) (Token id:Id.Lit_Chars val:'\n' span_id:218) 
          (Token id:Id.Lit_Chars val:'\ttouch check &&\n' span_id:219) (Token id:Id.Lit_Chars val:'\tgit add -u &&\n' span_id:220) 
          (Token id:Id.Lit_Chars val:'\ttest -z "$(git diff-files)"\n' span_id:221) (Token id:Id.Lit_Chars val:'\n' span_id:222)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'touch and then add explicitly' span_id:229))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:233) (Token id:Id.Lit_Chars val:'\n' span_id:234) 
          (Token id:Id.Lit_Chars val:'\ttouch check &&\n' span_id:235) (Token id:Id.Lit_Chars val:'\tgit add check &&\n' span_id:236) 
          (Token id:Id.Lit_Chars val:'\ttest -z "$(git diff-files)"\n' span_id:237) (Token id:Id.Lit_Chars val:'\n' span_id:238)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'add -n -u should not add but just report' span_id:245))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:249) (Token id:Id.Lit_Chars val:'\n' span_id:250) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:251) (Token id:Id.Lit_Chars val:'\t\techo "add ' span_id:252)
        ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:254)) 
        (SQ (Token id:Id.Lit_Chars val:check span_id:256)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:258)) 
        (SQ (Token id:Id.Lit_Chars val:'" &&\n' span_id:260) 
          (Token id:Id.Lit_Chars val:'\t\techo "remove ' span_id:261)
        ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:263)) 
        (SQ (Token id:Id.Lit_Chars val:top span_id:265)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:267)) 
        (SQ (Token id:Id.Lit_Chars val:'"\n' span_id:269) 
          (Token id:Id.Lit_Chars val:'\t) >expect &&\n' span_id:270) (Token id:Id.Lit_Chars val:'\tbefore=$(git ls-files -s check top) &&\n' span_id:271) 
          (Token id:Id.Lit_Chars val:'\techo changed >>check &&\n' span_id:272) (Token id:Id.Lit_Chars val:'\trm -f top &&\n' span_id:273) 
          (Token id:Id.Lit_Chars val:'\tgit add -n -u >actual &&\n' span_id:274) (Token id:Id.Lit_Chars val:'\tafter=$(git ls-files -s check top) &&\n' span_id:275) 
          (Token id:Id.Lit_Chars val:'\n' span_id:276) (Token id:Id.Lit_Chars val:'\ttest "$before" = "$after" &&\n' span_id:277) 
          (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect actual\n' span_id:278) (Token id:Id.Lit_Chars val:'\n' span_id:279)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'add -u resolves unmerged paths' span_id:286))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:290) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:291) (Token id:Id.Lit_Chars val:'\tone=$(echo 1 | git hash-object -w --stdin) &&\n' span_id:292) 
          (Token
            id: Id.Lit_Chars
            val: '\ttwo=$(echo 2 | git hash-object -w --stdin) &&\n'
            span_id: 293
          ) (Token id:Id.Lit_Chars val:'\tthree=$(echo 3 | git hash-object -w --stdin) &&\n' span_id:294) 
          (Token id:Id.Lit_Chars val:'\t{\n' span_id:295) (Token id:Id.Lit_Chars val:'\t\tfor path in path1 path2\n' span_id:296) 
          (Token id:Id.Lit_Chars val:'\t\tdo\n' span_id:297) (Token id:Id.Lit_Chars val:'\t\t\techo "100644 $one 1\t$path"\n' span_id:298) 
          (Token id:Id.Lit_Chars val:'\t\t\techo "100644 $two 2\t$path"\n' span_id:299) (Token id:Id.Lit_Chars val:'\t\t\techo "100644 $three 3\t$path"\n' span_id:300) 
          (Token id:Id.Lit_Chars val:'\t\tdone\n' span_id:301) (Token id:Id.Lit_Chars val:'\t\techo "100644 $one 1\tpath3"\n' span_id:302) 
          (Token id:Id.Lit_Chars val:'\t\techo "100644 $one 1\tpath4"\n' span_id:303) (Token id:Id.Lit_Chars val:'\t\techo "100644 $one 3\tpath5"\n' span_id:304) 
          (Token id:Id.Lit_Chars val:'\t\techo "100644 $one 3\tpath6"\n' span_id:305) (Token id:Id.Lit_Chars val:'\t} |\n' span_id:306) 
          (Token id:Id.Lit_Chars val:'\tgit update-index --index-info &&\n' span_id:307) (Token id:Id.Lit_Chars val:'\techo 3 >path1 &&\n' span_id:308) 
          (Token id:Id.Lit_Chars val:'\techo 2 >path3 &&\n' span_id:309) (Token id:Id.Lit_Chars val:'\techo 2 >path5 &&\n' span_id:310) 
          (Token id:Id.Lit_Chars val:'\n' span_id:311) 
          (Token
            id: Id.Lit_Chars
            val: '\t# Fail to explicitly resolve removed paths with "git add"\n'
            span_id: 312
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git add --no-all path4 &&\n' span_id:313) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git add --no-all path6 &&\n'
            span_id: 314
          ) (Token id:Id.Lit_Chars val:'\n' span_id:315) 
          (Token
            id: Id.Lit_Chars
            val: '\t# "add -u" should notice removals no matter what stages\n'
            span_id: 316
          ) (Token id:Id.Lit_Chars val:'\t# the index entries are in.\n' span_id:317) 
          (Token id:Id.Lit_Chars val:'\tgit add -u &&\n' span_id:318) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-files -s path1 path2 path3 path4 path5 path6 >actual &&\n'
            span_id: 319
          ) (Token id:Id.Lit_Chars val:'\t{\n' span_id:320) 
          (Token id:Id.Lit_Chars val:'\t\techo "100644 $three 0\tpath1"\n' span_id:321) (Token id:Id.Lit_Chars val:'\t\techo "100644 $two 0\tpath3"\n' span_id:322) 
          (Token id:Id.Lit_Chars val:'\t\techo "100644 $two 0\tpath5"\n' span_id:323) (Token id:Id.Lit_Chars val:'\t} >expect &&\n' span_id:324) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:325)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'"add -u non-existent" should fail' span_id:332))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:336) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git add -u non-existent &&\n'
            span_id: 337
          ) (Token id:Id.Lit_Chars val:'\t! (git ls-files | grep "non-existent")\n' span_id:338)
        )
      }
    )
    (C {(test_done)})
  ]
)