Skip to content

Commit c869753

Browse files
spearceJunio C Hamano
authored andcommitted
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>
1 parent 400e74d commit c869753

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

Makefile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ all:
7272
# Define NO_FAST_WORKING_DIRECTORY if accessing objects in pack files is
7373
# generally faster on your platform than accessing the working directory.
7474
#
75+
# Define NO_TRUSTABLE_FILEMODE if your filesystem may claim to support
76+
# the executable mode bit, but doesn't really do so.
77+
#
7578
# Define NO_IPV6 if you lack IPv6 support and getaddrinfo().
7679
#
7780
# Define NO_SOCKADDR_STORAGE if your platform does not have struct
@@ -361,6 +364,7 @@ ifeq ($(uname_O),Cygwin)
361364
NEEDS_LIBICONV = YesPlease
362365
NO_C99_FORMAT = YesPlease
363366
NO_FAST_WORKING_DIRECTORY = UnfortunatelyYes
367+
NO_TRUSTABLE_FILEMODE = UnfortunatelyYes
364368
# There are conflicting reports about this.
365369
# On some boxes NO_MMAP is needed, and not so elsewhere.
366370
# Try commenting this out if you suspect MMAP is more efficient
@@ -521,6 +525,9 @@ endif
521525
ifdef NO_FAST_WORKING_DIRECTORY
522526
BASIC_CFLAGS += -DNO_FAST_WORKING_DIRECTORY
523527
endif
528+
ifdef NO_TRUSTABLE_FILEMODE
529+
BASIC_CFLAGS += -DNO_TRUSTABLE_FILEMODE
530+
endif
524531
ifdef NO_IPV6
525532
BASIC_CFLAGS += -DNO_IPV6
526533
endif

builtin-init-db.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@
1010
#define DEFAULT_GIT_TEMPLATE_DIR "/usr/share/git-core/templates/"
1111
#endif
1212

13+
#ifdef NO_TRUSTABLE_FILEMODE
14+
#define TEST_FILEMODE 0
15+
#else
16+
#define TEST_FILEMODE 1
17+
#endif
18+
1319
static void safe_create_dir(const char *dir, int share)
1420
{
1521
if (mkdir(dir, 0777) < 0) {
@@ -175,6 +181,7 @@ static int create_default_files(const char *git_dir, const char *template_path)
175181
struct stat st1;
176182
char repo_version_string[10];
177183
int reinit;
184+
int filemode;
178185

179186
if (len > sizeof(path)-50)
180187
die("insane git directory %s", git_dir);
@@ -236,14 +243,14 @@ static int create_default_files(const char *git_dir, const char *template_path)
236243
strcpy(path + len, "config");
237244

238245
/* Check filemode trustability */
239-
if (!lstat(path, &st1)) {
246+
filemode = TEST_FILEMODE;
247+
if (TEST_FILEMODE && !lstat(path, &st1)) {
240248
struct stat st2;
241-
int filemode = (!chmod(path, st1.st_mode ^ S_IXUSR) &&
249+
filemode = (!chmod(path, st1.st_mode ^ S_IXUSR) &&
242250
!lstat(path, &st2) &&
243251
st1.st_mode != st2.st_mode);
244-
git_config_set("core.filemode",
245-
filemode ? "true" : "false");
246252
}
253+
git_config_set("core.filemode", filemode ? "true" : "false");
247254

248255
/* Enable logAllRefUpdates if a working tree is attached */
249256
if (!is_bare_git_dir(git_dir))

0 commit comments

Comments
 (0)