(CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <"test untracked cache">)} spids: [4] ) ] spids: [4] ) (C {(.)} {(./test-lib.sh)}) (FuncDef name: sync_mtime body: (BraceGroup children: [ (SimpleCommand words: [{(find)} {(.)} {(-type)} {(d)} {(-ls)}] redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(/dev/null)} spids:[61])] ) ] spids: [48] ) spids: [43 47] ) (FuncDef name: avoid_racy body: (BraceGroup children:[(C {(sleep)} {(1)})] spids:[71]) spids: [67 70] ) (C {(test_lazy_prereq)} {(UNTRACKED_CACHE)} { (SQ <"\n"> <"\t{ git update-index --test-untracked-cache; ret=$?; } &&\n"> <"\ttest $ret -ne 1\n"> ) } ) (If arms: [ (if_arm cond: [ (Sentence child: (Pipeline children:[(C {(test_have_prereq)} {(UNTRACKED_CACHE)})] negated:True) terminator: <Op_Semi ";"> ) ] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:skip_all) op: Equal rhs: {(SQ <"This system does not support untracked cache">)} spids: [104] ) ] spids: [104] ) (C {(test_done)}) ] spids: [-1 101] ) ] spids: [-1 112] ) (C {(test_expect_success)} {(SQ <"core.untrackedCache is unset">)} {(SQ <"\n"> <"\ttest_must_fail git config --get core.untrackedCache\n">)} ) (C {(test_expect_success)} {(SQ <setup>)} { (SQ <"\n"> <"\tgit init worktree &&\n"> <"\tcd worktree &&\n"> <"\tmkdir done dtwo dthree &&\n"> <"\ttouch one two three done/one dtwo/two dthree/three &&\n"> <"\tgit add one two done/one &&\n"> <"\t: >.git/info/exclude &&\n"> <"\tgit update-index --untracked-cache\n"> ) } ) (C {(test_expect_success)} {(SQ <"untracked cache is empty">)} { (SQ <"\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\tcat >../expect-empty <<EOF &&\n"> <"info/exclude 0000000000000000000000000000000000000000\n"> <"core.excludesfile 0000000000000000000000000000000000000000\n"> <"exclude_per_dir .gitignore\n"> <"flags 00000006\n"> <"EOF\n"> <"\ttest_cmp ../expect-empty ../actual\n"> ) } ) (AndOr children: [ (SimpleCommand words: [{(cat)}] redirects: [ (Redir op_id:Redir_Great fd:-1 arg_word:{(../status.expect)} spids:[166]) (HereDoc op_id: Redir_DLess fd: -1 body: { (DQ ("A done/one\n") ("A one\n") ("A two\n") ("?? dthree/\n") ("?? dtwo/\n") ("?? three\n") ) } do_expansion: True here_end: EOF was_filled: True spids: [169] ) ] ) (AndOr children: [ (SimpleCommand words: [{(cat)}] redirects: [ (Redir op_id: Redir_Great fd: -1 arg_word: {(../dump.expect)} spids: [183] ) (HereDoc op_id: Redir_DLess fd: -1 body: { (DQ ("info/exclude ") ($ VSub_Name "$EMPTY_BLOB") ("\n") ("core.excludesfile 0000000000000000000000000000000000000000\n") ("exclude_per_dir .gitignore\n") ("flags 00000006\n") ("/ 0000000000000000000000000000000000000000 recurse valid\n") ("dthree/\n") ("dtwo/\n") ("three\n") ("/done/ 0000000000000000000000000000000000000000 recurse valid\n") ("/dthree/ 0000000000000000000000000000000000000000 recurse check_only valid\n") ("three\n") ( "/dtwo/ 0000000000000000000000000000000000000000 recurse check_only valid\n" ) ("two\n") ) } do_expansion: True here_end: EOF was_filled: True spids: [186] ) ] ) (C {(test_expect_success)} {(SQ <"status first time (empty cache)">)} { (SQ <"\n"> <"\tavoid_racy &&\n"> <"\t: >../trace &&\n"> <"\tGIT_TRACE_UNTRACKED_STATS=\"$TRASH_DIRECTORY/trace\" \\\n"> <"\tgit status --porcelain >../actual &&\n"> <"\ttest_cmp ../status.expect ../actual &&\n"> <"\tcat >../trace.expect <<EOF &&\n"> <"node creation: 3\n"> <"gitignore invalidation: 1\n"> <"directory invalidation: 0\n"> <"opendir: 4\n"> <"EOF\n"> <"\ttest_cmp ../trace.expect ../trace\n"> ) } ) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) (C {(test_expect_success)} {(SQ <"untracked cache after first status">)} { (SQ <"\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\ttest_cmp ../dump.expect ../actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"status second time (fully populated cache)">)} { (SQ <"\n"> <"\tavoid_racy &&\n"> <"\t: >../trace &&\n"> <"\tGIT_TRACE_UNTRACKED_STATS=\"$TRASH_DIRECTORY/trace\" \\\n"> <"\tgit status --porcelain >../actual &&\n"> <"\ttest_cmp ../status.expect ../actual &&\n"> <"\tcat >../trace.expect <<EOF &&\n"> <"node creation: 0\n"> <"gitignore invalidation: 0\n"> <"directory invalidation: 0\n"> <"opendir: 0\n"> <"EOF\n"> <"\ttest_cmp ../trace.expect ../trace\n"> ) } ) (C {(test_expect_success)} {(SQ <"untracked cache after second status">)} { (SQ <"\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\ttest_cmp ../dump.expect ../actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"modify in root directory, one dir invalidation">)} { (SQ <"\n"> <"\tavoid_racy &&\n"> <"\t: >four &&\n"> <"\t: >../trace &&\n"> <"\tGIT_TRACE_UNTRACKED_STATS=\"$TRASH_DIRECTORY/trace\" \\\n"> <"\tgit status --porcelain >../actual &&\n"> <"\tcat >../status.expect <<EOF &&\n"> <"A done/one\n"> <"A one\n"> <"A two\n"> <"?? dthree/\n"> <"?? dtwo/\n"> <"?? four\n"> <"?? three\n"> <"EOF\n"> <"\ttest_cmp ../status.expect ../actual &&\n"> <"\tcat >../trace.expect <<EOF &&\n"> <"node creation: 0\n"> <"gitignore invalidation: 0\n"> <"directory invalidation: 1\n"> <"opendir: 1\n"> <"EOF\n"> <"\ttest_cmp ../trace.expect ../trace\n"> <"\n"> ) } ) (C {(test_expect_success)} {(SQ <"verify untracked cache dump">)} { (SQ <"\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\tcat >../expect <<EOF &&\n"> <"info/exclude $EMPTY_BLOB\n"> <"core.excludesfile 0000000000000000000000000000000000000000\n"> <"exclude_per_dir .gitignore\n"> <"flags 00000006\n"> <"/ 0000000000000000000000000000000000000000 recurse valid\n"> <"dthree/\n"> <"dtwo/\n"> <"four\n"> <"three\n"> <"/done/ 0000000000000000000000000000000000000000 recurse valid\n"> <"/dthree/ 0000000000000000000000000000000000000000 recurse check_only valid\n"> <"three\n"> <"/dtwo/ 0000000000000000000000000000000000000000 recurse check_only valid\n"> <"two\n"> <"EOF\n"> <"\ttest_cmp ../expect ../actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"new .gitignore invalidates recursively">)} { (SQ <"\n"> <"\tavoid_racy &&\n"> <"\techo four >.gitignore &&\n"> <"\t: >../trace &&\n"> <"\tGIT_TRACE_UNTRACKED_STATS=\"$TRASH_DIRECTORY/trace\" \\\n"> <"\tgit status --porcelain >../actual &&\n"> <"\tcat >../status.expect <<EOF &&\n"> <"A done/one\n"> <"A one\n"> <"A two\n"> <"?? .gitignore\n"> <"?? dthree/\n"> <"?? dtwo/\n"> <"?? three\n"> <"EOF\n"> <"\ttest_cmp ../status.expect ../actual &&\n"> <"\tcat >../trace.expect <<EOF &&\n"> <"node creation: 0\n"> <"gitignore invalidation: 1\n"> <"directory invalidation: 1\n"> <"opendir: 4\n"> <"EOF\n"> <"\ttest_cmp ../trace.expect ../trace\n"> <"\n"> ) } ) (C {(test_expect_success)} {(SQ <"verify untracked cache dump">)} { (SQ <"\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\tcat >../expect <<EOF &&\n"> <"info/exclude $EMPTY_BLOB\n"> <"core.excludesfile 0000000000000000000000000000000000000000\n"> <"exclude_per_dir .gitignore\n"> <"flags 00000006\n"> <"/ e6fcc8f2ee31bae321d66afd183fcb7237afae6e recurse valid\n"> <".gitignore\n"> <"dthree/\n"> <"dtwo/\n"> <"three\n"> <"/done/ 0000000000000000000000000000000000000000 recurse valid\n"> <"/dthree/ 0000000000000000000000000000000000000000 recurse check_only valid\n"> <"three\n"> <"/dtwo/ 0000000000000000000000000000000000000000 recurse check_only valid\n"> <"two\n"> <"EOF\n"> <"\ttest_cmp ../expect ../actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"new info/exclude invalidates everything">)} { (SQ <"\n"> <"\tavoid_racy &&\n"> <"\techo three >>.git/info/exclude &&\n"> <"\t: >../trace &&\n"> <"\tGIT_TRACE_UNTRACKED_STATS=\"$TRASH_DIRECTORY/trace\" \\\n"> <"\tgit status --porcelain >../actual &&\n"> <"\tcat >../status.expect <<EOF &&\n"> <"A done/one\n"> <"A one\n"> <"A two\n"> <"?? .gitignore\n"> <"?? dtwo/\n"> <"EOF\n"> <"\ttest_cmp ../status.expect ../actual &&\n"> <"\tcat >../trace.expect <<EOF &&\n"> <"node creation: 0\n"> <"gitignore invalidation: 1\n"> <"directory invalidation: 0\n"> <"opendir: 4\n"> <"EOF\n"> <"\ttest_cmp ../trace.expect ../trace\n"> ) } ) (C {(test_expect_success)} {(SQ <"verify untracked cache dump">)} { (SQ <"\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\tcat >../expect <<EOF &&\n"> <"info/exclude 13263c0978fb9fad16b2d580fb800b6d811c3ff0\n"> <"core.excludesfile 0000000000000000000000000000000000000000\n"> <"exclude_per_dir .gitignore\n"> <"flags 00000006\n"> <"/ e6fcc8f2ee31bae321d66afd183fcb7237afae6e recurse valid\n"> <".gitignore\n"> <"dtwo/\n"> <"/done/ 0000000000000000000000000000000000000000 recurse valid\n"> <"/dthree/ 0000000000000000000000000000000000000000 recurse check_only valid\n"> <"/dtwo/ 0000000000000000000000000000000000000000 recurse check_only valid\n"> <"two\n"> <"EOF\n"> <"\ttest_cmp ../expect ../actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"move two from tracked to untracked">)} { (SQ <"\n"> <"\tgit rm --cached two &&\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\tcat >../expect <<EOF &&\n"> <"info/exclude 13263c0978fb9fad16b2d580fb800b6d811c3ff0\n"> <"core.excludesfile 0000000000000000000000000000000000000000\n"> <"exclude_per_dir .gitignore\n"> <"flags 00000006\n"> <"/ e6fcc8f2ee31bae321d66afd183fcb7237afae6e recurse\n"> <"/done/ 0000000000000000000000000000000000000000 recurse valid\n"> <"/dthree/ 0000000000000000000000000000000000000000 recurse check_only valid\n"> <"/dtwo/ 0000000000000000000000000000000000000000 recurse check_only valid\n"> <"two\n"> <"EOF\n"> <"\ttest_cmp ../expect ../actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"status after the move">)} { (SQ <"\n"> <"\t: >../trace &&\n"> <"\tGIT_TRACE_UNTRACKED_STATS=\"$TRASH_DIRECTORY/trace\" \\\n"> <"\tgit status --porcelain >../actual &&\n"> <"\tcat >../status.expect <<EOF &&\n"> <"A done/one\n"> <"A one\n"> <"?? .gitignore\n"> <"?? dtwo/\n"> <"?? two\n"> <"EOF\n"> <"\ttest_cmp ../status.expect ../actual &&\n"> <"\tcat >../trace.expect <<EOF &&\n"> <"node creation: 0\n"> <"gitignore invalidation: 0\n"> <"directory invalidation: 0\n"> <"opendir: 1\n"> <"EOF\n"> <"\ttest_cmp ../trace.expect ../trace\n"> ) } ) (C {(test_expect_success)} {(SQ <"verify untracked cache dump">)} { (SQ <"\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\tcat >../expect <<EOF &&\n"> <"info/exclude 13263c0978fb9fad16b2d580fb800b6d811c3ff0\n"> <"core.excludesfile 0000000000000000000000000000000000000000\n"> <"exclude_per_dir .gitignore\n"> <"flags 00000006\n"> <"/ e6fcc8f2ee31bae321d66afd183fcb7237afae6e recurse valid\n"> <".gitignore\n"> <"dtwo/\n"> <"two\n"> <"/done/ 0000000000000000000000000000000000000000 recurse valid\n"> <"/dthree/ 0000000000000000000000000000000000000000 recurse check_only valid\n"> <"/dtwo/ 0000000000000000000000000000000000000000 recurse check_only valid\n"> <"two\n"> <"EOF\n"> <"\ttest_cmp ../expect ../actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"move two from untracked to tracked">)} { (SQ <"\n"> <"\tgit add two &&\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\tcat >../expect <<EOF &&\n"> <"info/exclude 13263c0978fb9fad16b2d580fb800b6d811c3ff0\n"> <"core.excludesfile 0000000000000000000000000000000000000000\n"> <"exclude_per_dir .gitignore\n"> <"flags 00000006\n"> <"/ e6fcc8f2ee31bae321d66afd183fcb7237afae6e recurse\n"> <"/done/ 0000000000000000000000000000000000000000 recurse valid\n"> <"/dthree/ 0000000000000000000000000000000000000000 recurse check_only valid\n"> <"/dtwo/ 0000000000000000000000000000000000000000 recurse check_only valid\n"> <"two\n"> <"EOF\n"> <"\ttest_cmp ../expect ../actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"status after the move">)} { (SQ <"\n"> <"\t: >../trace &&\n"> <"\tGIT_TRACE_UNTRACKED_STATS=\"$TRASH_DIRECTORY/trace\" \\\n"> <"\tgit status --porcelain >../actual &&\n"> <"\tcat >../status.expect <<EOF &&\n"> <"A done/one\n"> <"A one\n"> <"A two\n"> <"?? .gitignore\n"> <"?? dtwo/\n"> <"EOF\n"> <"\ttest_cmp ../status.expect ../actual &&\n"> <"\tcat >../trace.expect <<EOF &&\n"> <"node creation: 0\n"> <"gitignore invalidation: 0\n"> <"directory invalidation: 0\n"> <"opendir: 1\n"> <"EOF\n"> <"\ttest_cmp ../trace.expect ../trace\n"> ) } ) (C {(test_expect_success)} {(SQ <"verify untracked cache dump">)} { (SQ <"\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\tcat >../expect <<EOF &&\n"> <"info/exclude 13263c0978fb9fad16b2d580fb800b6d811c3ff0\n"> <"core.excludesfile 0000000000000000000000000000000000000000\n"> <"exclude_per_dir .gitignore\n"> <"flags 00000006\n"> <"/ e6fcc8f2ee31bae321d66afd183fcb7237afae6e recurse valid\n"> <".gitignore\n"> <"dtwo/\n"> <"/done/ 0000000000000000000000000000000000000000 recurse valid\n"> <"/dthree/ 0000000000000000000000000000000000000000 recurse check_only valid\n"> <"/dtwo/ 0000000000000000000000000000000000000000 recurse check_only valid\n"> <"two\n"> <"EOF\n"> <"\ttest_cmp ../expect ../actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"set up for sparse checkout testing">)} { (SQ <"\n"> <"\techo two >done/.gitignore &&\n"> <"\techo three >>done/.gitignore &&\n"> <"\techo two >done/two &&\n"> <"\tgit add -f done/two done/.gitignore &&\n"> <"\tgit commit -m \"first commit\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"status after commit">)} { (SQ <"\n"> <"\t: >../trace &&\n"> <"\tGIT_TRACE_UNTRACKED_STATS=\"$TRASH_DIRECTORY/trace\" \\\n"> <"\tgit status --porcelain >../actual &&\n"> <"\tcat >../status.expect <<EOF &&\n"> <"?? .gitignore\n"> <"?? dtwo/\n"> <"EOF\n"> <"\ttest_cmp ../status.expect ../actual &&\n"> <"\tcat >../trace.expect <<EOF &&\n"> <"node creation: 0\n"> <"gitignore invalidation: 0\n"> <"directory invalidation: 0\n"> <"opendir: 2\n"> <"EOF\n"> <"\ttest_cmp ../trace.expect ../trace\n"> ) } ) (C {(test_expect_success)} {(SQ <"untracked cache correct after commit">)} { (SQ <"\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\tcat >../expect <<EOF &&\n"> <"info/exclude 13263c0978fb9fad16b2d580fb800b6d811c3ff0\n"> <"core.excludesfile 0000000000000000000000000000000000000000\n"> <"exclude_per_dir .gitignore\n"> <"flags 00000006\n"> <"/ e6fcc8f2ee31bae321d66afd183fcb7237afae6e recurse valid\n"> <".gitignore\n"> <"dtwo/\n"> <"/done/ 0000000000000000000000000000000000000000 recurse valid\n"> <"/dthree/ 0000000000000000000000000000000000000000 recurse check_only valid\n"> <"/dtwo/ 0000000000000000000000000000000000000000 recurse check_only valid\n"> <"two\n"> <"EOF\n"> <"\ttest_cmp ../expect ../actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"set up sparse checkout">)} { (SQ <"\n"> <"\techo \"done/[a-z]*\" >.git/info/sparse-checkout &&\n"> <"\ttest_config core.sparsecheckout true &&\n"> <"\tgit checkout master &&\n"> <"\tgit update-index --force-untracked-cache &&\n"> <"\tgit status --porcelain >/dev/null && # prime the cache\n"> <"\ttest_path_is_missing done/.gitignore &&\n"> <"\ttest_path_is_file done/one\n"> ) } ) (C {(test_expect_success)} {(SQ <"create/modify files, some of which are gitignored">)} { (SQ <"\n"> <"\techo two bis >done/two &&\n"> <"\techo three >done/three && # three is gitignored\n"> <"\techo four >done/four && # four is gitignored at a higher level\n"> <"\techo five >done/five && # five is not gitignored\n"> <"\techo test >base && #we need to ensure that the root dir is touched\n"> <"\trm base &&\n"> <"\tsync_mtime\n"> ) } ) (C {(test_expect_success)} {(SQ <"test sparse status with untracked cache">)} { (SQ <"\n"> <"\t: >../trace &&\n"> <"\tavoid_racy &&\n"> <"\tGIT_TRACE_UNTRACKED_STATS=\"$TRASH_DIRECTORY/trace\" \\\n"> <"\tgit status --porcelain >../status.actual &&\n"> <"\tcat >../status.expect <<EOF &&\n"> <" M done/two\n"> <"?? .gitignore\n"> <"?? done/five\n"> <"?? dtwo/\n"> <"EOF\n"> <"\ttest_cmp ../status.expect ../status.actual &&\n"> <"\tcat >../trace.expect <<EOF &&\n"> <"node creation: 0\n"> <"gitignore invalidation: 1\n"> <"directory invalidation: 2\n"> <"opendir: 2\n"> <"EOF\n"> <"\ttest_cmp ../trace.expect ../trace\n"> ) } ) (C {(test_expect_success)} {(SQ <"untracked cache correct after status">)} { (SQ <"\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\tcat >../expect <<EOF &&\n"> <"info/exclude 13263c0978fb9fad16b2d580fb800b6d811c3ff0\n"> <"core.excludesfile 0000000000000000000000000000000000000000\n"> <"exclude_per_dir .gitignore\n"> <"flags 00000006\n"> <"/ e6fcc8f2ee31bae321d66afd183fcb7237afae6e recurse valid\n"> <".gitignore\n"> <"dtwo/\n"> <"/done/ 1946f0437f90c5005533cbe1736a6451ca301714 recurse valid\n"> <"five\n"> <"/dthree/ 0000000000000000000000000000000000000000 recurse check_only valid\n"> <"/dtwo/ 0000000000000000000000000000000000000000 recurse check_only valid\n"> <"two\n"> <"EOF\n"> <"\ttest_cmp ../expect ../actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"test sparse status again with untracked cache">)} { (SQ <"\n"> <"\tavoid_racy &&\n"> <"\t: >../trace &&\n"> <"\tGIT_TRACE_UNTRACKED_STATS=\"$TRASH_DIRECTORY/trace\" \\\n"> <"\tgit status --porcelain >../status.actual &&\n"> <"\tcat >../status.expect <<EOF &&\n"> <" M done/two\n"> <"?? .gitignore\n"> <"?? done/five\n"> <"?? dtwo/\n"> <"EOF\n"> <"\ttest_cmp ../status.expect ../status.actual &&\n"> <"\tcat >../trace.expect <<EOF &&\n"> <"node creation: 0\n"> <"gitignore invalidation: 0\n"> <"directory invalidation: 0\n"> <"opendir: 0\n"> <"EOF\n"> <"\ttest_cmp ../trace.expect ../trace\n"> ) } ) (C {(test_expect_success)} {(SQ <"set up for test of subdir and sparse checkouts">)} { (SQ <"\n"> <"\tmkdir done/sub &&\n"> <"\tmkdir done/sub/sub &&\n"> <"\techo \"sub\" > done/sub/sub/file\n"> ) } ) (C {(test_expect_success)} {(SQ <"test sparse status with untracked cache and subdir">)} { (SQ <"\n"> <"\tavoid_racy &&\n"> <"\t: >../trace &&\n"> <"\tGIT_TRACE_UNTRACKED_STATS=\"$TRASH_DIRECTORY/trace\" \\\n"> <"\tgit status --porcelain >../status.actual &&\n"> <"\tcat >../status.expect <<EOF &&\n"> <" M done/two\n"> <"?? .gitignore\n"> <"?? done/five\n"> <"?? done/sub/\n"> <"?? dtwo/\n"> <"EOF\n"> <"\ttest_cmp ../status.expect ../status.actual &&\n"> <"\tcat >../trace.expect <<EOF &&\n"> <"node creation: 2\n"> <"gitignore invalidation: 0\n"> <"directory invalidation: 1\n"> <"opendir: 3\n"> <"EOF\n"> <"\ttest_cmp ../trace.expect ../trace\n"> ) } ) (C {(test_expect_success)} {(SQ <"verify untracked cache dump (sparse/subdirs)">)} { (SQ <"\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\tcat >../expect-from-test-dump <<EOF &&\n"> <"info/exclude 13263c0978fb9fad16b2d580fb800b6d811c3ff0\n"> <"core.excludesfile 0000000000000000000000000000000000000000\n"> <"exclude_per_dir .gitignore\n"> <"flags 00000006\n"> <"/ e6fcc8f2ee31bae321d66afd183fcb7237afae6e recurse valid\n"> <".gitignore\n"> <"dtwo/\n"> <"/done/ 1946f0437f90c5005533cbe1736a6451ca301714 recurse valid\n"> <"five\n"> <"sub/\n"> <"/done/sub/ 0000000000000000000000000000000000000000 recurse check_only valid\n"> <"sub/\n"> <"/done/sub/sub/ 0000000000000000000000000000000000000000 recurse check_only valid\n"> <"file\n"> <"/dthree/ 0000000000000000000000000000000000000000 recurse check_only valid\n"> <"/dtwo/ 0000000000000000000000000000000000000000 recurse check_only valid\n"> <"two\n"> <"EOF\n"> <"\ttest_cmp ../expect-from-test-dump ../actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"test sparse status again with untracked cache and subdir">)} { (SQ <"\n"> <"\tavoid_racy &&\n"> <"\t: >../trace &&\n"> <"\tGIT_TRACE_UNTRACKED_STATS=\"$TRASH_DIRECTORY/trace\" \\\n"> <"\tgit status --porcelain >../status.actual &&\n"> <"\ttest_cmp ../status.expect ../status.actual &&\n"> <"\tcat >../trace.expect <<EOF &&\n"> <"node creation: 0\n"> <"gitignore invalidation: 0\n"> <"directory invalidation: 0\n"> <"opendir: 0\n"> <"EOF\n"> <"\ttest_cmp ../trace.expect ../trace\n"> ) } ) (C {(test_expect_success)} {(SQ <"move entry in subdir from untracked to cached">)} { (SQ <"\n"> <"\tgit add dtwo/two &&\n"> <"\tgit status --porcelain >../status.actual &&\n"> <"\tcat >../status.expect <<EOF &&\n"> <" M done/two\n"> <"A dtwo/two\n"> <"?? .gitignore\n"> <"?? done/five\n"> <"?? done/sub/\n"> <"EOF\n"> <"\ttest_cmp ../status.expect ../status.actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"move entry in subdir from cached to untracked">)} { (SQ <"\n"> <"\tgit rm --cached dtwo/two &&\n"> <"\tgit status --porcelain >../status.actual &&\n"> <"\tcat >../status.expect <<EOF &&\n"> <" M done/two\n"> <"?? .gitignore\n"> <"?? done/five\n"> <"?? done/sub/\n"> <"?? dtwo/\n"> <"EOF\n"> <"\ttest_cmp ../status.expect ../status.actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"--no-untracked-cache removes the cache">)} { (SQ <"\n"> <"\tgit update-index --no-untracked-cache &&\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\techo \"no untracked cache\" >../expect-no-uc &&\n"> <"\ttest_cmp ../expect-no-uc ../actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"git status does not change anything">)} { (SQ <"\n"> <"\tgit status &&\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\ttest_cmp ../expect-no-uc ../actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"setting core.untrackedCache to true and using git status creates the cache">)} { (SQ <"\n"> <"\tgit config core.untrackedCache true &&\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\ttest_cmp ../expect-no-uc ../actual &&\n"> <"\tgit status &&\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\ttest_cmp ../expect-from-test-dump ../actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"using --no-untracked-cache does not fail when core.untrackedCache is true">)} { (SQ <"\n"> <"\tgit update-index --no-untracked-cache &&\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\ttest_cmp ../expect-no-uc ../actual &&\n"> <"\tgit update-index --untracked-cache &&\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\ttest_cmp ../expect-empty ../actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"setting core.untrackedCache to false and using git status removes the cache">)} { (SQ <"\n"> <"\tgit config core.untrackedCache false &&\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\ttest_cmp ../expect-empty ../actual &&\n"> <"\tgit status &&\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\ttest_cmp ../expect-no-uc ../actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"using --untracked-cache does not fail when core.untrackedCache is false">)} { (SQ <"\n"> <"\tgit update-index --untracked-cache &&\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\ttest_cmp ../expect-empty ../actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"setting core.untrackedCache to keep">)} { (SQ <"\n"> <"\tgit config core.untrackedCache keep &&\n"> <"\tgit update-index --untracked-cache &&\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\ttest_cmp ../expect-empty ../actual &&\n"> <"\tgit status &&\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\ttest_cmp ../expect-from-test-dump ../actual &&\n"> <"\tgit update-index --no-untracked-cache &&\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\ttest_cmp ../expect-no-uc ../actual &&\n"> <"\tgit update-index --force-untracked-cache &&\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\ttest_cmp ../expect-empty ../actual &&\n"> <"\tgit status &&\n"> <"\ttest-dump-untracked-cache >../actual &&\n"> <"\ttest_cmp ../expect-from-test-dump ../actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"test ident field is working">)} { (SQ <"\n"> <"\tmkdir ../other_worktree &&\n"> <"\tcp -R done dthree dtwo four three ../other_worktree &&\n"> <"\tGIT_WORK_TREE=../other_worktree git status 2>../err &&\n"> < "\techo \"warning: Untracked cache is disabled on this system or location.\" >../expect &&\n" > <"\ttest_i18ncmp ../expect ../err\n"> ) } ) (C {(test_done)}) ] )