From 27ae9095639bb228a1b7ff86a3ebe4264abf05be Mon Sep 17 00:00:00 2001
From: mschaefers <mschaefers@scoop-gmbh.de>
Date: Thu, 29 Nov 2012 12:33:09 -0500
Subject: [PATCH] feature: when using LdapUserService one can configure Gitblit to fetch all users from ldap that can possibly login. This allows to see newly generated LDAP users instantly in Gitblit. By now an LDAP user had to log in once to appear in GitBlit.

---
 src/com/gitblit/FileSettings.java |   24 +++++++++++++++++++++---
 1 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/src/com/gitblit/FileSettings.java b/src/com/gitblit/FileSettings.java
index 6110058..be1f44f 100644
--- a/src/com/gitblit/FileSettings.java
+++ b/src/com/gitblit/FileSettings.java
@@ -20,7 +20,6 @@
 import java.io.FileNotFoundException;
 import java.util.Map;
 import java.util.Properties;
-import java.util.regex.Pattern;
 
 import com.gitblit.utils.FileUtils;
 
@@ -38,6 +37,8 @@
 	private final Properties properties = new Properties();
 
 	private volatile long lastModified;
+	
+	private volatile boolean forceReload;
 
 	public FileSettings(String file) {
 		super(FileSettings.class);
@@ -50,7 +51,7 @@
 	 */
 	@Override
 	protected synchronized Properties read() {
-		if (propertiesFile.exists() && (propertiesFile.lastModified() > lastModified)) {
+		if (propertiesFile.exists() && (forceReload || (propertiesFile.lastModified() > lastModified))) {
 			FileInputStream is = null;
 			try {
 				Properties props = new Properties();
@@ -61,6 +62,7 @@
 				properties.clear();
 				properties.putAll(props);
 				lastModified = propertiesFile.lastModified();
+				forceReload = false;
 			} catch (FileNotFoundException f) {
 				// IGNORE - won't happen because file.exists() check above
 			} catch (Throwable t) {
@@ -85,10 +87,19 @@
 		String content = FileUtils.readContent(propertiesFile, "\n");
 		for (Map.Entry<String, String> setting:settings.entrySet()) {
 			String regex = "(?m)^(" + regExEscape(setting.getKey()) + "\\s*+=\\s*+)"
-				    + "(?:[^\r\n\\\\]++|\\\\(?:\r?\n|\r|.))*+$";			
+				    + "(?:[^\r\n\\\\]++|\\\\(?:\r?\n|\r|.))*+$";
+			String oldContent = content;
 			content = content.replaceAll(regex, setting.getKey() + " = " + setting.getValue());
+			if (content.equals(oldContent)) {
+				// did not replace value because it does not exist in the file
+				// append new setting to content (issue-85)
+				content += "\n" + setting.getKey() + " = " + setting.getValue();
+			}
 		}
 		FileUtils.writeContent(propertiesFile, content);
+		// manually set the forceReload flag because not all JVMs support real
+		// millisecond resolution of lastModified. (issue-55)		
+		forceReload = true;
 		return true;
 	}
 	
@@ -103,6 +114,13 @@
 		return lastModified;
 	}
 
+	/**
+	 * @return the state of the force reload flag
+	 */
+	protected boolean forceReload() {
+		return forceReload;
+	}
+
 	@Override
 	public String toString() {
 		return propertiesFile.getAbsolutePath();

--
Gitblit v1.9.1