From 30f9d25d77ccb5cd978d4cf8fa389ec819e90e95 Mon Sep 17 00:00:00 2001 From: Philip L. McMahon <philip.l.mcmahon@gmail.com> Date: Fri, 27 Jan 2012 02:02:19 -0500 Subject: [PATCH] Correct update of HEAD symbolic reference when target is a tag. --- src/com/gitblit/FileSettings.java | 45 ++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/com/gitblit/FileSettings.java b/src/com/gitblit/FileSettings.java index e213e80..8ac99f6 100644 --- a/src/com/gitblit/FileSettings.java +++ b/src/com/gitblit/FileSettings.java @@ -18,10 +18,16 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.util.Map; import java.util.Properties; +import com.gitblit.utils.FileUtils; + /** - * Reads GitBlit settings file. + * Dynamically loads and reloads a properties file by keeping track of the last + * modification date. + * + * @author James Moger * */ public class FileSettings extends IStoredSettings { @@ -30,26 +36,30 @@ private final Properties properties = new Properties(); - private volatile long lastread; + private volatile long lastModified; public FileSettings(String file) { super(FileSettings.class); this.propertiesFile = new File(file); } + /** + * Returns a properties object which contains the most recent contents of + * the properties file. + */ @Override protected synchronized Properties read() { - if (propertiesFile.exists() && (propertiesFile.lastModified() > lastread)) { + if (propertiesFile.exists() && (propertiesFile.lastModified() > lastModified)) { FileInputStream is = null; try { Properties props = new Properties(); is = new FileInputStream(propertiesFile); props.load(is); - + // load properties after we have successfully read file properties.clear(); properties.putAll(props); - lastread = propertiesFile.lastModified(); + lastModified = propertiesFile.lastModified(); } catch (FileNotFoundException f) { // IGNORE - won't happen because file.exists() check above } catch (Throwable t) { @@ -67,6 +77,31 @@ return properties; } + /** + * Updates the specified settings in the settings file. + */ + public synchronized boolean saveSettings(Map<String, String> settings) { + 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|.))*+$"; + content = content.replaceAll(regex, setting.getKey() + " = " + setting.getValue()); + } + FileUtils.writeContent(propertiesFile, content); + return true; + } + + private String regExEscape(String input) { + return input.replace(".", "\\."); + } + + /** + * @return the last modification date of the properties file + */ + protected long lastModified() { + return lastModified; + } + @Override public String toString() { return propertiesFile.getAbsolutePath(); -- Gitblit v1.9.1