From 3fe527624dcecd96c16901d6621a2e37e7ef814a Mon Sep 17 00:00:00 2001
From: "Shawn O. Pearce" <spearce@spearce.org>
Date: Wed, 15 Sep 2010 07:59:38 -0700
Subject: Probe filesystem and set core.filemode correctly

When creating a new FileRepository, probe the capability of the
local filesystem and set core.filemode based on how it reacts.

We can't just rely on FS.supportsExecute() because a POSIX system
(which usually does support execute) might be storing the repository
on a partition that doesn't have execute support (e.g. plain FAT-32).

Creating a temporary file, setting both states, checking we get
the desired results will let us set the variable correctly on
all systems.

Change-Id: I551488ea8d352d2179c7b244f474d2e3d02567a2
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 .../org/eclipse/jgit/storage/file/FileRepository.java  | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

(limited to 'org.eclipse.jgit')

diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileRepository.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileRepository.java
index 66e7ebc015..36d160ce64 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileRepository.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileRepository.java
@@ -231,10 +231,26 @@ public class FileRepository extends Repository {
 		head.disableRefLog();
 		head.link(Constants.R_HEADS + Constants.MASTER);
 
+		final boolean fileMode;
+		if (getFS().supportsExecute()) {
+			File tmp = File.createTempFile("try", "execute", getDirectory());
+
+			getFS().setExecute(tmp, true);
+			final boolean on = getFS().canExecute(tmp);
+
+			getFS().setExecute(tmp, false);
+			final boolean off = getFS().canExecute(tmp);
+			tmp.delete();
+
+			fileMode = on && !off;
+		} else {
+			fileMode = false;
+		}
+
 		cfg.setInt(ConfigConstants.CONFIG_CORE_SECTION, null,
 				ConfigConstants.CONFIG_KEY_REPO_FORMAT_VERSION, 0);
 		cfg.setBoolean(ConfigConstants.CONFIG_CORE_SECTION, null,
-				ConfigConstants.CONFIG_KEY_FILEMODE, true);
+				ConfigConstants.CONFIG_KEY_FILEMODE, fileMode);
 		if (bare)
 			cfg.setBoolean(ConfigConstants.CONFIG_CORE_SECTION, null,
 					ConfigConstants.CONFIG_KEY_BARE, true);
-- 
cgit v1.2.3