From 3fe527624dcecd96c16901d6621a2e37e7ef814a Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Wed, 15 Sep 2010 07:59:38 -0700 Subject: [PATCH] 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 --- .../jgit/storage/file/FileRepository.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) 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 66e7ebc01..36d160ce6 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 void create(boolean bare) throws IOException { 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);