diff options
-rw-r--r-- | dir.c | 22 | ||||
-rwxr-xr-x | t/t7063-status-untracked-cache.sh | 4 |
2 files changed, 16 insertions, 10 deletions
@@ -733,7 +733,16 @@ static void invalidate_directory(struct untracked_cache *uc, struct untracked_cache_dir *dir) { int i; - uc->dir_invalidated++; + + /* + * Invalidation increment here is just roughly correct. If + * untracked_nr or any of dirs[].recurse is non-zero, we + * should increment dir_invalidated too. But that's more + * expensive to do. + */ + if (dir->valid) + uc->dir_invalidated++; + dir->valid = 0; dir->untracked_nr = 0; for (i = 0; i < dir->dirs_nr; i++) @@ -1740,23 +1749,18 @@ static int valid_cached_dir(struct dir_struct *dir, refresh_fsmonitor(istate); if (!(dir->untracked->use_fsmonitor && untracked->valid)) { if (lstat(path->len ? path->buf : ".", &st)) { - invalidate_directory(dir->untracked, untracked); memset(&untracked->stat_data, 0, sizeof(untracked->stat_data)); return 0; } if (!untracked->valid || match_stat_data_racy(istate, &untracked->stat_data, &st)) { - if (untracked->valid) - invalidate_directory(dir->untracked, untracked); fill_stat_data(&untracked->stat_data, &st); return 0; } } - if (untracked->check_only != !!check_only) { - invalidate_directory(dir->untracked, untracked); + if (untracked->check_only != !!check_only) return 0; - } /* * prep_exclude will be called eventually on this directory, @@ -1788,8 +1792,10 @@ static int open_cached_dir(struct cached_dir *cdir, if (valid_cached_dir(dir, untracked, istate, path, check_only)) return 0; cdir->fdir = opendir(path->len ? path->buf : "."); - if (dir->untracked) + if (dir->untracked) { + invalidate_directory(dir->untracked, untracked); dir->untracked->dir_opened++; + } if (!cdir->fdir) return -1; return 0; diff --git a/t/t7063-status-untracked-cache.sh b/t/t7063-status-untracked-cache.sh index dba7f50bbb..46b947824f 100755 --- a/t/t7063-status-untracked-cache.sh +++ b/t/t7063-status-untracked-cache.sh @@ -707,7 +707,7 @@ test_expect_success SYMLINKS 'setup worktree for symlink test' ' git commit -m"second commit" ' -test_expect_failure SYMLINKS '"status" after symlink replacement should be clean with UC=true' ' +test_expect_success SYMLINKS '"status" after symlink replacement should be clean with UC=true' ' git checkout HEAD~ && status_is_clean && status_is_clean && @@ -742,7 +742,7 @@ test_expect_success 'setup worktree for non-symlink test' ' git commit -m"second commit" ' -test_expect_failure '"status" after file replacement should be clean with UC=true' ' +test_expect_success '"status" after file replacement should be clean with UC=true' ' git checkout HEAD~ && status_is_clean && status_is_clean && |