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