(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)})
  ]
)