aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java
diff options
context:
space:
mode:
authorMatthias Sohn <matthias.sohn@sap.com>2019-08-15 01:25:28 +0200
committerMatthias Sohn <matthias.sohn@sap.com>2019-08-18 11:47:26 +0200
commitf383206ace187ec92672b806e18a54e8d398a27d (patch)
tree28403a0987ef5b4dd5af51e4d29944ff07826d61 /org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java
parent7f92a70fb3a5b7e91e5d370098fa65f6c8f35efa (diff)
downloadjgit-f383206ace187ec92672b806e18a54e8d398a27d.tar.gz
jgit-f383206ace187ec92672b806e18a54e8d398a27d.zip
Cache user global and system-wide git configurations
So far the git configuration and the system wide git configuration were always reloaded when jgit accessed these global configuration files to access global configuration options which are not in the context of a single git repository. Cache these configurations in SystemReader and only reload them if their file metadata observed using FileSnapshot indicates a modification. Change-Id: I092fe11a5d95f1c5799273cacfc7a415d0b7786c Signed-off-by: Matthias Sohn <matthias.sohn@sap.com> Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
Diffstat (limited to 'org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java')
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java64
1 files changed, 22 insertions, 42 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java
index 1c42f78577..eda8afb10f 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS_POSIX.java
@@ -42,6 +42,9 @@
*/
package org.eclipse.jgit.util;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_CORE_SECTION;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_SUPPORTSATOMICFILECREATION;
+
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
@@ -67,10 +70,9 @@ import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.errors.CommandFailedException;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.internal.JGitText;
-import org.eclipse.jgit.lib.ConfigConstants;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.storage.file.FileBasedConfig;
+import org.eclipse.jgit.lib.StoredConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -87,7 +89,7 @@ public class FS_POSIX extends FS {
private volatile boolean supportsUnixNLink = true;
- private volatile AtomicFileCreation supportsAtomicCreateNewFile = AtomicFileCreation.UNDEFINED;
+ private volatile AtomicFileCreation supportsAtomicFileCreation = AtomicFileCreation.UNDEFINED;
private enum AtomicFileCreation {
SUPPORTED, NOT_SUPPORTED, UNDEFINED
@@ -112,42 +114,6 @@ public class FS_POSIX extends FS {
}
}
- private void determineAtomicFileCreationSupport() {
- // @TODO: enhance SystemReader to support this without copying code
- AtomicFileCreation ret = getAtomicFileCreationSupportOption(
- SystemReader.getInstance().openUserConfig(null, this));
- if (ret == AtomicFileCreation.UNDEFINED
- && StringUtils.isEmptyOrNull(SystemReader.getInstance()
- .getenv(Constants.GIT_CONFIG_NOSYSTEM_KEY))) {
- ret = getAtomicFileCreationSupportOption(
- SystemReader.getInstance().openSystemConfig(null, this));
- }
-
- if (ret == AtomicFileCreation.UNDEFINED) {
- ret = AtomicFileCreation.SUPPORTED;
- }
- supportsAtomicCreateNewFile = ret;
- }
-
- private AtomicFileCreation getAtomicFileCreationSupportOption(
- FileBasedConfig config) {
- try {
- config.load();
- String value = config.getString(ConfigConstants.CONFIG_CORE_SECTION,
- null,
- ConfigConstants.CONFIG_KEY_SUPPORTSATOMICFILECREATION);
- if (value == null) {
- return AtomicFileCreation.UNDEFINED;
- }
- return StringUtils.toBoolean(value)
- ? AtomicFileCreation.SUPPORTED
- : AtomicFileCreation.NOT_SUPPORTED;
- } catch (IOException | ConfigInvalidException e) {
- LOG.error(e.getMessage(), e);
- return AtomicFileCreation.UNDEFINED;
- }
- }
-
/** {@inheritDoc} */
@Override
public FS newInstance() {
@@ -362,10 +328,24 @@ public class FS_POSIX extends FS {
/** {@inheritDoc} */
@Override
public boolean supportsAtomicCreateNewFile() {
- if (supportsAtomicCreateNewFile == AtomicFileCreation.UNDEFINED) {
- determineAtomicFileCreationSupport();
+ if (supportsAtomicFileCreation == AtomicFileCreation.UNDEFINED) {
+ try {
+ StoredConfig config = SystemReader.getInstance().getUserConfig();
+ String value = config.getString(CONFIG_CORE_SECTION, null,
+ CONFIG_KEY_SUPPORTSATOMICFILECREATION);
+ if (value != null) {
+ supportsAtomicFileCreation = StringUtils.toBoolean(value)
+ ? AtomicFileCreation.SUPPORTED
+ : AtomicFileCreation.NOT_SUPPORTED;
+ } else {
+ supportsAtomicFileCreation = AtomicFileCreation.SUPPORTED;
+ }
+ } catch (IOException | ConfigInvalidException e) {
+ LOG.warn(JGitText.get().assumeAtomicCreateNewFile, e);
+ supportsAtomicFileCreation = AtomicFileCreation.SUPPORTED;
+ }
}
- return supportsAtomicCreateNewFile == AtomicFileCreation.SUPPORTED;
+ return supportsAtomicFileCreation == AtomicFileCreation.SUPPORTED;
}
@Override