#!/bin/sh test_description='test untracked cache' . ./test-lib.sh avoid_racy() { sleep 1 } # It's fine if git update-index returns an error code other than one, # it'll be caught in the first test. test_lazy_prereq UNTRACKED_CACHE ' { git update-index --untracked-cache; ret=$?; } && test $ret -ne 1 ' if ! test_have_prereq UNTRACKED_CACHE; then skip_all='This system does not support untracked cache' test_done fi test_expect_success 'setup' ' git init worktree && cd worktree && mkdir done dtwo dthree && touch one two three done/one dtwo/two dthree/three && git add one two done/one && : >.git/info/exclude && git update-index --untracked-cache ' test_expect_success 'untracked cache is empty' ' test-dump-untracked-cache >../actual && cat >../expect <../status.expect <../dump.expect <../trace && GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \ git status --porcelain >../actual && test_cmp ../status.expect ../actual && cat >../trace.expect <../actual && test_cmp ../dump.expect ../actual ' test_expect_success 'status second time (fully populated cache)' ' avoid_racy && : >../trace && GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \ git status --porcelain >../actual && test_cmp ../status.expect ../actual && cat >../trace.expect <../actual && test_cmp ../dump.expect ../actual ' test_expect_success 'modify in root directory, one dir invalidation' ' avoid_racy && : >four && : >../trace && GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \ git status --porcelain >../actual && cat >../status.expect <../trace.expect <../actual && cat >../expect <.gitignore && : >../trace && GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \ git status --porcelain >../actual && cat >../status.expect <../trace.expect <../actual && cat >../expect <>.git/info/exclude && : >../trace && GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \ git status --porcelain >../actual && cat >../status.expect <../trace.expect <../actual && cat >../expect <../actual && cat >../expect <../trace && GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \ git status --porcelain >../actual && cat >../status.expect <../trace.expect <../actual && cat >../expect <../actual && cat >../expect <../trace && GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \ git status --porcelain >../actual && cat >../status.expect <../trace.expect <../actual && cat >../expect <done/.gitignore && echo three >>done/.gitignore && echo two >done/two && git add -f done/two done/.gitignore && git commit -m "first commit" ' test_expect_success 'status after commit' ' : >../trace && GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \ git status --porcelain >../actual && cat >../status.expect <../trace.expect <../actual && cat >../expect <.git/info/sparse-checkout && test_config core.sparsecheckout true && git checkout master && git update-index --force-untracked-cache && git status --porcelain >/dev/null && # prime the cache test_path_is_missing done/.gitignore && test_path_is_file done/one ' test_expect_success 'create files, some of which are gitignored' ' echo three >done/three && # three is gitignored echo four >done/four && # four is gitignored at a higher level echo five >done/five # five is not gitignored ' test_expect_success 'test sparse status with untracked cache' ' : >../trace && avoid_racy && GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \ git status --porcelain >../status.actual && cat >../status.expect <../trace.expect <../actual && cat >../expect <../trace && GIT_TRACE_UNTRACKED_STATS="$TRASH_DIRECTORY/trace" \ git status --porcelain >../status.actual && cat >../status.expect <../trace.expect <