(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'test untracked cache'>)}
          spids: [4]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (command.ShFunction
      name: sync_mtime
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<find>} {<.>} {<-type>} {<d>} {<-ls>}]
              redirects: [(redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<'/dev/null'>})]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction name:avoid_racy body:(BraceGroup children:[(C {<sleep>} {<1>})]))
    (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: [
            (command.Sentence
              child: 
                (command.Pipeline
                  children: [(C {<test_have_prereq>} {<UNTRACKED_CACHE>})]
                  negated: T
                )
              terminator: <Id.Op_Semi _>
            )
          ]
          action: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:skip_all)
                  op: assign_op.Equal
                  rhs: {(SQ <'This system does not support untracked cache'>)}
                  spids: [104]
                )
              ]
            )
            (C {<test_done>})
          ]
          spids: [92 101]
        )
      ]
    )
    (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.MultiLine
                  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'>
                  ]
                )
            )
          ]
          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.MultiLine
                  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'>
                  ]
                )
            )
          ]
          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>})
  ]
)