diff options
author | Shawn O. Pearce <spearce@spearce.org> | 2006-12-30 23:53:55 -0500 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-12-30 22:21:31 -0800 |
commit | c869753ebbb00e188da5ab308d42cc738335f0ab (patch) | |
tree | bcabcb2df9c95db2a9f8c6c85a52dd80b73983ee /builtin-init-db.c | |
parent | 400e74df98e0808ccf233025fe700a316f65854c (diff) | |
download | git-c869753ebbb00e188da5ab308d42cc738335f0ab.tar.gz |
Force core.filemode to false on Cygwin.
Many users have noticed that core.filemode doesn't appear to be
automatically set right on Cygwin when using a repository stored
on NTFS. The issue is that Cygwin and NTFS correctly supports
the executable mode bit, and Git properly detected that, but most
native Windows applications tend to create files such that Cygwin
sees the executable bit set when it probably shouldn't be.
This is especially bad if the user's favorite editor deletes the
file then recreates it whenever they save (vs. just overwriting)
as now a file that was created with mode 0644 by checkout-index
appears to have mode 0755.
So we introduce NO_TRUSTABLE_FILEMODE, settable at compile time.
Setting this option forces core.filemode to false, even if the
detection code would have returned true. This option should be
enabled by default on Cygwin.
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'builtin-init-db.c')
-rw-r--r-- | builtin-init-db.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/builtin-init-db.c b/builtin-init-db.c index 01f366ad0b..97fd82ff06 100644 --- a/builtin-init-db.c +++ b/builtin-init-db.c @@ -10,6 +10,12 @@ #define DEFAULT_GIT_TEMPLATE_DIR "/usr/share/git-core/templates/" #endif +#ifdef NO_TRUSTABLE_FILEMODE +#define TEST_FILEMODE 0 +#else +#define TEST_FILEMODE 1 +#endif + static void safe_create_dir(const char *dir, int share) { if (mkdir(dir, 0777) < 0) { @@ -175,6 +181,7 @@ static int create_default_files(const char *git_dir, const char *template_path) struct stat st1; char repo_version_string[10]; int reinit; + int filemode; if (len > sizeof(path)-50) die("insane git directory %s", git_dir); @@ -236,14 +243,14 @@ static int create_default_files(const char *git_dir, const char *template_path) strcpy(path + len, "config"); /* Check filemode trustability */ - if (!lstat(path, &st1)) { + filemode = TEST_FILEMODE; + if (TEST_FILEMODE && !lstat(path, &st1)) { struct stat st2; - int filemode = (!chmod(path, st1.st_mode ^ S_IXUSR) && + filemode = (!chmod(path, st1.st_mode ^ S_IXUSR) && !lstat(path, &st2) && st1.st_mode != st2.st_mode); - git_config_set("core.filemode", - filemode ? "true" : "false"); } + git_config_set("core.filemode", filemode ? "true" : "false"); /* Enable logAllRefUpdates if a working tree is attached */ if (!is_bare_git_dir(git_dir)) |