aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2008-10-19 16:07:02 -0700
committerJunio C Hamano <gitster@pobox.com>2008-10-19 16:07:02 -0700
commit449acfababda44368227904c3fd1378f23541a6f (patch)
treedb2f2bc69eb8e3530e434de2cd2bad9aac3b6d6a
parent94d2b854eb002b5c8c432818ca70ad318e84dd7a (diff)
parent7faee6b8de836904227ee98dc3d2c4c75b0ef3a1 (diff)
downloadgit-449acfababda44368227904c3fd1378f23541a6f.tar.gz
git-449acfababda44368227904c3fd1378f23541a6f.tar.xz
Merge branch 'ml/cygwin-filemode'
* ml/cygwin-filemode: compat/cygwin.c - Use cygwin's stat if core.filemode == true
-rw-r--r--Documentation/config.txt4
-rw-r--r--compat/cygwin.c18
2 files changed, 17 insertions, 5 deletions
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 5ba3ffa10..29369d051 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -124,7 +124,9 @@ core.ignoreCygwinFSTricks::
one hierarchy using Cygwin mount. If true, Git uses native Win32 API
whenever it is possible and falls back to Cygwin functions only to
handle symbol links. The native mode is more than twice faster than
- normal Cygwin l/stat() functions. True by default.
+ normal Cygwin l/stat() functions. True by default, unless core.filemode
+ is true, in which case ignoreCygwinFSTricks is ignored as Cygwin's
+ POSIX emulation is required to support core.filemode.
core.trustctime::
If false, the ctime differences between the index and the
diff --git a/compat/cygwin.c b/compat/cygwin.c
index 423ff20b0..f1967532b 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;