(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:16777215 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:T) 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: [16777215 101] ) ] spids: [16777215 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 ops: [Op_DAmp Op_DAmp] children: [ (SimpleCommand words: [{(cat)}] redirects: [ (Redir op_id: Redir_Great fd: 16777215 arg_word: {(../status.expect)} spids: [166] ) (HereDoc op_id: Redir_DLess fd: 16777215 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: T spids: [169] ) ] ) (SimpleCommand words: [{(cat)}] redirects: [ (Redir op_id:Redir_Great fd:16777215 arg_word:{(../dump.expect)} spids:[184]) (HereDoc op_id: Redir_DLess fd: 16777215 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: T spids: [187] ) ] ) (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'> ) } ) ] ) (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)}) ] )