(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: 
            {
              (SQ <'git add -u\n'> <'\n'> 
                <'This test creates a working tree state with three files:\n'> <'\n'> <'  top (previously committed, modified)\n'> <'  dir/sub (previously committed, modified)\n'> 
                <'  dir/other (untracked)\n'> <'\n'> <'and issues a git add -u with path limiting on "dir" to add\n'> 
                <'only the updates to dir/sub.\n'> <'\n'> <'Also tested are "git add -u" without limiting, and "git add -u"\n'> 
                <'without contents changes, and other conditions'>
              )
            }
          spids: [4]
        )
      ]
      spids: [4]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ <'\n'> <'\techo initial >check &&\n'> <'\techo initial >top &&\n'> 
          <'\techo initial >foo &&\n'> <'\tmkdir dir1 dir2 &&\n'> <'\techo initial >dir1/sub1 &&\n'> <'\techo initial >dir1/sub2 &&\n'> 
          <'\techo initial >dir2/sub3 &&\n'> <'\tgit add check dir1 dir2 top foo &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -m initial &&\n'> <'\n'> 
          <'\techo changed >check &&\n'> <'\techo changed >top &&\n'> <'\techo changed >dir2/sub3 &&\n'> <'\trm -f dir1/sub1 &&\n'> 
          <'\techo other >dir2/other\n'>
        )
      }
    )
    (C {(test_expect_success)} {(update)} {(SQ <'\n'> <'\tgit add -u dir1 dir2\n'>)})
    (C {(test_expect_success)} {(SQ <'update noticed a removal'>)} 
      {(SQ <'\n'> <'\ttest "$(git ls-files dir1/sub1)" = ""\n'>)}
    )
    (C {(test_expect_success)} {(SQ <'update touched correct path'>)} 
      {(SQ <'\n'> <'\ttest "$(git diff-files --name-status dir2/sub3)" = ""\n'>)}
    )
    (C {(test_expect_success)} {(SQ <'update did not touch other tracked files'>)} 
      {
        (SQ <'\n'> <'\ttest "$(git diff-files --name-status check)" = "M\tcheck" &&\n'> 
          <'\ttest "$(git diff-files --name-status top)" = "M\ttop"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'update did not touch untracked files'>)} 
      {(SQ <'\n'> <'\ttest "$(git ls-files dir2/other)" = ""\n'>)}
    )
    (C {(test_expect_success)} {(SQ <'cache tree has not been corrupted'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit ls-files -s |\n'> <'\tsed -e "s/ 0\t/\t/" >expect &&\n'> 
          <'\tgit ls-tree -r $(git write-tree) |\n'> <'\tsed -e "s/ blob / /" >current &&\n'> <'\ttest_cmp expect current\n'> <'\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'update from a subdirectory'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd dir1 &&\n'> <'\t\techo more >sub2 &&\n'> <'\t\tgit add -u sub2\n'> 
          <'\t)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'change gets noticed'>)} 
      {(SQ <'\n'> <'\n'> <'\ttest "$(git diff-files --name-status dir1)" = ""\n'> <'\n'>)}
    )
    (C {(test_expect_success)} {(SQ <'non-qualified update in subdir updates from the root'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd dir1 &&\n'> <'\t\techo even more >>sub2 &&\n'> 
          <'\t\tgit --literal-pathspecs add -u &&\n'> <'\t\techo even more >>sub2 &&\n'> <'\t\tgit add -u\n'> <'\t) &&\n'> <'\t: >expect &&\n'> 
          <'\tgit diff-files --name-only >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'replace a file with a symlink'>)} 
      {(SQ <'\n'> <'\n'> <'\trm foo &&\n'> <'\ttest_ln_s_add top foo\n'> <'\n'>)}
    )
    (C {(test_expect_success)} {(SQ <'add everything changed'>)} 
      {(SQ <'\n'> <'\n'> <'\tgit add -u &&\n'> <'\ttest -z "$(git diff-files)"\n'> <'\n'>)}
    )
    (C {(test_expect_success)} {(SQ <'touch and then add -u'>)} 
      {
        (SQ <'\n'> <'\n'> <'\ttouch check &&\n'> <'\tgit add -u &&\n'> 
          <'\ttest -z "$(git diff-files)"\n'> <'\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'touch and then add explicitly'>)} 
      {
        (SQ <'\n'> <'\n'> <'\ttouch check &&\n'> <'\tgit add check &&\n'> 
          <'\ttest -z "$(git diff-files)"\n'> <'\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'add -n -u should not add but just report'>)} 
      {(SQ <'\n'> <'\n'> <'\t(\n'> <'\t\techo "add '>) 
        (EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (SQ <check>) (EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (SQ <'" &&\n'> <'\t\techo "remove '>) 
        (EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (SQ <top>) (EscapedLiteralPart token:<Lit_EscapedChar "\\'">) 
        (SQ <'"\n'> <'\t) >expect &&\n'> <'\tbefore=$(git ls-files -s check top) &&\n'> 
          <'\techo changed >>check &&\n'> <'\trm -f top &&\n'> <'\tgit add -n -u >actual &&\n'> <'\tafter=$(git ls-files -s check top) &&\n'> 
          <'\n'> <'\ttest "$before" = "$after" &&\n'> <'\ttest_i18ncmp expect actual\n'> <'\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'add -u resolves unmerged paths'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\tone=$(echo 1 | git hash-object -w --stdin) &&\n'> 
          <'\ttwo=$(echo 2 | git hash-object -w --stdin) &&\n'> <'\tthree=$(echo 3 | git hash-object -w --stdin) &&\n'> <'\t{\n'> <'\t\tfor path in path1 path2\n'> 
          <'\t\tdo\n'> <'\t\t\techo "100644 $one 1\t$path"\n'> <'\t\t\techo "100644 $two 2\t$path"\n'> 
          <'\t\t\techo "100644 $three 3\t$path"\n'> <'\t\tdone\n'> <'\t\techo "100644 $one 1\tpath3"\n'> <'\t\techo "100644 $one 1\tpath4"\n'> 
          <'\t\techo "100644 $one 3\tpath5"\n'> <'\t\techo "100644 $one 3\tpath6"\n'> <'\t} |\n'> <'\tgit update-index --index-info &&\n'> 
          <'\techo 3 >path1 &&\n'> <'\techo 2 >path3 &&\n'> <'\techo 2 >path5 &&\n'> <'\n'> 
          <'\t# Fail to explicitly resolve removed paths with "git add"\n'> <'\ttest_must_fail git add --no-all path4 &&\n'> <'\ttest_must_fail git add --no-all path6 &&\n'> 
          <'\n'> <'\t# "add -u" should notice removals no matter what stages\n'> <'\t# the index entries are in.\n'> 
          <'\tgit add -u &&\n'> <'\tgit ls-files -s path1 path2 path3 path4 path5 path6 >actual &&\n'> <'\t{\n'> 
          <'\t\techo "100644 $three 0\tpath1"\n'> <'\t\techo "100644 $two 0\tpath3"\n'> <'\t\techo "100644 $two 0\tpath5"\n'> <'\t} >expect &&\n'> 
          <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'"add -u non-existent" should fail'>)} 
      {
        (SQ <'\n'> <'\ttest_must_fail git add -u non-existent &&\n'> 
          <'\t! (git ls-files | grep "non-existent")\n'>
        )
      }
    )
    (C {(test_done)})
  ]
)