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