diff --git a/compat/win32/fscache.c b/compat/win32/fscache.c index 39f7008e3f34cb..3836540a364ec2 100644 --- a/compat/win32/fscache.c +++ b/compat/win32/fscache.c @@ -9,6 +9,11 @@ static struct hashmap map; static CRITICAL_SECTION mutex; static struct trace_key trace_fscache = TRACE_KEY_INIT(FSCACHE); +int fscache_is_enabled(void) +{ + return enabled; +} + /* * An entry in the file system cache. Used for both entire directory listings * and file entries. diff --git a/compat/win32/fscache.h b/compat/win32/fscache.h index ed518b422d705e..9a21fd5709c5bc 100644 --- a/compat/win32/fscache.h +++ b/compat/win32/fscache.h @@ -4,6 +4,9 @@ int fscache_enable(int enable); #define enable_fscache(x) fscache_enable(x) +int fscache_is_enabled(void); +#define is_fscache_enabled() (fscache_is_enabled()) + DIR *fscache_opendir(const char *dir); int fscache_lstat(const char *file_name, struct stat *buf); diff --git a/dir.c b/dir.c index a922cce666b326..55339959f0c4da 100644 --- a/dir.c +++ b/dir.c @@ -758,12 +758,27 @@ static int add_excludes(const char *fname, const char *base, int baselen, size_t size = 0; char *buf, *entry; - fd = open(fname, O_RDONLY); - if (fd < 0 || fstat(fd, &st) < 0) { - if (fd < 0) - warn_on_fopen_errors(fname); - else - close(fd); + if (is_fscache_enabled()) { + if (lstat(fname, &st) < 0) { + fd = -1; + } else { + fd = open(fname, O_RDONLY); + if (fd < 0) + warn_on_fopen_errors(fname); + } + } else { + fd = open(fname, O_RDONLY); + if (fd < 0 || fstat(fd, &st) < 0) { + if (fd < 0) + warn_on_fopen_errors(fname); + else { + close(fd); + fd = -1; + } + } + } + + if (fd < 0) { if (!istate || (buf = read_skip_worktree_file_from_index(istate, fname, &size, sha1_stat)) == NULL) return -1; diff --git a/git-compat-util.h b/git-compat-util.h index 9a1a65df6c2a24..8807d2dcc51aa3 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -1255,6 +1255,10 @@ static inline int is_missing_file_error(int errno_) #define enable_fscache(x) /* noop */ #endif +#ifndef is_fscache_enabled +#define is_fscache_enabled() (0) +#endif + extern int cmd_main(int, const char **); /*