Merge branch 'pw/rebase-i-regression-fix'
[gitweb.git] / t / t7063-status-untracked-cache.sh
index 37a24c131240c46d0694e0a148ec7c15b89e17fe..0667bd9dd3e8bc650bc4e47ac9fcde5d63ef0d11 100755 (executable)
@@ -4,14 +4,26 @@ test_description='test untracked cache'
 
 . ./test-lib.sh
 
+# On some filesystems (e.g. FreeBSD's ext2 and ufs) directory mtime
+# is updated lazily after contents in the directory changes, which
+# forces the untracked cache code to take the slow path.  A test
+# that wants to make sure that the fast path works correctly should
+# call this helper to make mtime of the containing directory in sync
+# with the reality before checking the fast path behaviour.
+#
+# See <20160803174522.5571-1-pclouds@gmail.com> if you want to know
+# more.
+
+sync_mtime () {
+       find . -type d -ls >/dev/null
+}
+
 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=$?; } &&
+       { git update-index --test-untracked-cache; ret=$?; } &&
        test $ret -ne 1
 '
 
@@ -20,6 +32,10 @@ if ! test_have_prereq UNTRACKED_CACHE; then
        test_done
 fi
 
+test_expect_success 'core.untrackedCache is unset' '
+       test_must_fail git config --get core.untrackedCache
+'
+
 test_expect_success 'setup' '
        git init worktree &&
        cd worktree &&
@@ -32,13 +48,13 @@ test_expect_success 'setup' '
 
 test_expect_success 'untracked cache is empty' '
        test-dump-untracked-cache >../actual &&
-       cat >../expect <<EOF &&
+       cat >../expect-empty <<EOF &&
 info/exclude 0000000000000000000000000000000000000000
 core.excludesfile 0000000000000000000000000000000000000000
 exclude_per_dir .gitignore
 flags 00000006
 EOF
-       test_cmp ../expect ../actual
+       test_cmp ../expect-empty ../actual
 '
 
 cat >../status.expect <<EOF &&
@@ -51,7 +67,7 @@ A  two
 EOF
 
 cat >../dump.expect <<EOF &&
-info/exclude e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
+info/exclude $EMPTY_BLOB
 core.excludesfile 0000000000000000000000000000000000000000
 exclude_per_dir .gitignore
 flags 00000006
@@ -135,7 +151,7 @@ EOF
 test_expect_success 'verify untracked cache dump' '
        test-dump-untracked-cache >../actual &&
        cat >../expect <<EOF &&
-info/exclude e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
+info/exclude $EMPTY_BLOB
 core.excludesfile 0000000000000000000000000000000000000000
 exclude_per_dir .gitignore
 flags 00000006
@@ -182,7 +198,7 @@ EOF
 test_expect_success 'verify untracked cache dump' '
        test-dump-untracked-cache >../actual &&
        cat >../expect <<EOF &&
-info/exclude e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
+info/exclude $EMPTY_BLOB
 core.excludesfile 0000000000000000000000000000000000000000
 exclude_per_dir .gitignore
 flags 00000006
@@ -412,7 +428,10 @@ test_expect_success 'create/modify files, some of which are gitignored' '
        echo two bis >done/two &&
        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
+       echo five >done/five && # five is not gitignored
+       echo test >base && #we need to ensure that the root dir is touched
+       rm base &&
+       sync_mtime
 '
 
 test_expect_success 'test sparse status with untracked cache' '
@@ -506,7 +525,7 @@ EOF
 
 test_expect_success 'verify untracked cache dump (sparse/subdirs)' '
        test-dump-untracked-cache >../actual &&
-       cat >../expect <<EOF &&
+       cat >../expect-from-test-dump <<EOF &&
 info/exclude 13263c0978fb9fad16b2d580fb800b6d811c3ff0
 core.excludesfile 0000000000000000000000000000000000000000
 exclude_per_dir .gitignore
@@ -525,7 +544,7 @@ file
 /dtwo/ 0000000000000000000000000000000000000000 recurse check_only valid
 two
 EOF
-       test_cmp ../expect ../actual
+       test_cmp ../expect-from-test-dump ../actual
 '
 
 test_expect_success 'test sparse status again with untracked cache and subdir' '
@@ -569,4 +588,77 @@ EOF
        test_cmp ../status.expect ../status.actual
 '
 
+test_expect_success '--no-untracked-cache removes the cache' '
+       git update-index --no-untracked-cache &&
+       test-dump-untracked-cache >../actual &&
+       echo "no untracked cache" >../expect-no-uc &&
+       test_cmp ../expect-no-uc ../actual
+'
+
+test_expect_success 'git status does not change anything' '
+       git status &&
+       test-dump-untracked-cache >../actual &&
+       test_cmp ../expect-no-uc ../actual
+'
+
+test_expect_success 'setting core.untrackedCache to true and using git status creates the cache' '
+       git config core.untrackedCache true &&
+       test-dump-untracked-cache >../actual &&
+       test_cmp ../expect-no-uc ../actual &&
+       git status &&
+       test-dump-untracked-cache >../actual &&
+       test_cmp ../expect-from-test-dump ../actual
+'
+
+test_expect_success 'using --no-untracked-cache does not fail when core.untrackedCache is true' '
+       git update-index --no-untracked-cache &&
+       test-dump-untracked-cache >../actual &&
+       test_cmp ../expect-no-uc ../actual &&
+       git update-index --untracked-cache &&
+       test-dump-untracked-cache >../actual &&
+       test_cmp ../expect-empty ../actual
+'
+
+test_expect_success 'setting core.untrackedCache to false and using git status removes the cache' '
+       git config core.untrackedCache false &&
+       test-dump-untracked-cache >../actual &&
+       test_cmp ../expect-empty ../actual &&
+       git status &&
+       test-dump-untracked-cache >../actual &&
+       test_cmp ../expect-no-uc ../actual
+'
+
+test_expect_success 'using --untracked-cache does not fail when core.untrackedCache is false' '
+       git update-index --untracked-cache &&
+       test-dump-untracked-cache >../actual &&
+       test_cmp ../expect-empty ../actual
+'
+
+test_expect_success 'setting core.untrackedCache to keep' '
+       git config core.untrackedCache keep &&
+       git update-index --untracked-cache &&
+       test-dump-untracked-cache >../actual &&
+       test_cmp ../expect-empty ../actual &&
+       git status &&
+       test-dump-untracked-cache >../actual &&
+       test_cmp ../expect-from-test-dump ../actual &&
+       git update-index --no-untracked-cache &&
+       test-dump-untracked-cache >../actual &&
+       test_cmp ../expect-no-uc ../actual &&
+       git update-index --force-untracked-cache &&
+       test-dump-untracked-cache >../actual &&
+       test_cmp ../expect-empty ../actual &&
+       git status &&
+       test-dump-untracked-cache >../actual &&
+       test_cmp ../expect-from-test-dump ../actual
+'
+
+test_expect_success 'test ident field is working' '
+       mkdir ../other_worktree &&
+       cp -R done dthree dtwo four three ../other_worktree &&
+       GIT_WORK_TREE=../other_worktree git status 2>../err &&
+       echo "warning: Untracked cache is disabled on this system or location." >../expect &&
+       test_i18ncmp ../expect ../err
+'
+
 test_done