diff options
Diffstat (limited to 'compat/cygwin.c')
-rw-r--r-- | compat/cygwin.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/compat/cygwin.c b/compat/cygwin.c index 423ff20b0e..f1967532ba 100644 --- a/compat/cygwin.c +++ b/compat/cygwin.c @@ -91,22 +91,32 @@ static int cygwin_stat(const char *path, struct stat *buf) * functions should be used. The choice is determined by core.ignorecygwinfstricks. * Reading this option is not always possible immediately as git_dir may be * not be set yet. So until it is set, use cygwin lstat/stat functions. + * However, if the trust_executable_bit is set, we must use the Cygwin posix + * stat/lstat as the Windows stat fuctions do not determine posix filemode. */ static int native_stat = 1; +extern int trust_executable_bit; static int git_cygwin_config(const char *var, const char *value, void *cb) { - if (!strcmp(var, "core.ignorecygwinfstricks")) + if (!strcmp(var, "core.ignorecygwinfstricks")) { native_stat = git_config_bool(var, value); - return 0; + return 0; + } + return git_default_config(var, value, cb); } static int init_stat(void) { if (have_git_dir()) { git_config(git_cygwin_config, NULL); - cygwin_stat_fn = native_stat ? cygwin_stat : stat; - cygwin_lstat_fn = native_stat ? cygwin_lstat : lstat; + if (!trust_executable_bit && native_stat) { + cygwin_stat_fn = cygwin_stat; + cygwin_lstat_fn = cygwin_lstat; + } else { + cygwin_stat_fn = stat; + cygwin_lstat_fn = lstat; + } return 0; } return 1; |