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