(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'test_description='> name:test_description) op: assign_op.Equal rhs: {(SQ <'test untracked cache'>)} spids: [4] ) ] redirects: [] ) (C {<.>} {<'./test-lib.sh'>}) (command.ShFunction name: sync_mtime body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [ (command.Simple words: [{<find>} {<.>} {<-type>} {<d>} {<-ls>}] redirects: [(redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<'/dev/null'>})] more_env: [] do_fork: T ) ] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (command.ShFunction name: avoid_racy body: (BraceGroup left: <Id.Lit_LBrace '{'> children: [(C {<sleep>} {<1>})] redirects: [] right: <Id.Lit_RBrace '}'> ) ) (C {<test_lazy_prereq>} {<UNTRACKED_CACHE>} { (SQ <'\n'> <'\t{ git update-index --test-untracked-cache; ret=$?; } &&\n'> <'\ttest $ret -ne 1\n'> ) } ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (command.Pipeline children: [(C {<test_have_prereq>} {<UNTRACKED_CACHE>})] negated: T stderr_indices: [] ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'skip_all='> name:skip_all) op: assign_op.Equal rhs: {(SQ <'This system does not support untracked cache'>)} spids: [104] ) ] redirects: [] ) (C {<test_done>}) ] spids: [92 101] ) ] else_action: [] redirects: [] ) (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'> ) } ) (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp] children: [ (command.Simple words: [{<cat>}] redirects: [ (redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {<'../status.expect'>} ) (redir op: <Id.Redir_DLess '<<'> loc: (redir_loc.Fd fd:0) arg: (redir_param.HereDoc here_begin: {<EOF>} here_end_span_id: 181 stdin_parts: [ <'A done/one\n'> <'A one\n'> <'A two\n'> <'?? dthree/\n'> <'?? dtwo/\n'> <'?? three\n'> ] ) ) ] more_env: [] do_fork: T ) (command.Simple words: [{<cat>}] redirects: [ (redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {<'../dump.expect'>} ) (redir op: <Id.Redir_DLess '<<'> loc: (redir_loc.Fd fd:0) arg: (redir_param.HereDoc here_begin: {<EOF>} here_end_span_id: 209 stdin_parts: [ <'info/exclude '> ($ Id.VSub_DollarName 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'> ] ) ) ] more_env: [] do_fork: T ) (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>}) ] )