Read external gitblit.properties from $GERRIT_SITE/etc Allows GitBlit plugin to read an external configuration file to override the one internally stored in the jar. Simplifies the management of Gerrit+GitBlit setup by using an external file without having to extract, modify and then repackage the GitBlit plguin. gitblit.properties documentation can be found at the GitBlit project URL http://gitblit.com/properties.html and should be stored under $GERRIT_SITE/etc. Without external gitblit.properties configuration the existing one stored in the GitBlit plugin will be used as default. Change-Id: I974c491487eeb6ef8d4b10c3201a575d5b3598d0
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/GerritWicketFilter.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/GerritWicketFilter.java index d2d557f..a9d0601 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/GerritWicketFilter.java +++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/GerritWicketFilter.java
@@ -14,11 +14,9 @@ package com.googlesource.gerrit.plugins.gitblit; import java.io.IOException; -import java.io.InputStream; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; -import java.util.Properties; import java.util.Vector; import javax.servlet.FilterChain; @@ -30,17 +28,12 @@ import javax.servlet.ServletResponse; import org.apache.wicket.protocol.http.WicketFilter; -import org.eclipse.jgit.lib.Config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.gitblit.Constants; import com.gitblit.GitBlit; -import com.gitblit.IStoredSettings; -import com.google.gerrit.common.data.GerritConfig; import com.google.gerrit.httpd.WebSession; -import com.google.gerrit.server.config.GerritServerConfig; -import com.google.gerrit.server.git.LocalDiskRepositoryManager; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; @@ -48,33 +41,27 @@ import com.googlesource.gerrit.plugins.gitblit.app.GerritToGitBlitWebApp; import com.googlesource.gerrit.plugins.gitblit.app.GitBlitSettings; import com.googlesource.gerrit.plugins.gitblit.auth.GerritAuthFilter; -import com.googlesource.gerrit.plugins.gitblit.auth.GerritToGitBlitUserService; @Singleton public class GerritWicketFilter extends WicketFilter { - private static final String GITBLIT_GERRIT_PROPERTIES = "/gitblit.properties"; private static final Logger log = LoggerFactory .getLogger(GerritWicketFilter.class); - private final LocalDiskRepositoryManager repoManager; private final Provider<WebSession> webSession; @SuppressWarnings("unused") // We need Guice to create the GerritGitBlit instance private final GerritGitBlit gitBlit; private final GerritAuthFilter gerritAuthFilter; - private final GitBlitUrlsConfig config; + private final GitBlitSettings settings; @Inject - public GerritWicketFilter(final LocalDiskRepositoryManager repoManager, + public GerritWicketFilter( final Provider<WebSession> webSession, final GerritGitBlit gitBlit, - final GerritAuthFilter gerritAuthFilter, final @GerritServerConfig Config config, - final GerritConfig gerritConfig) { - - this.repoManager = repoManager; + final GerritAuthFilter gerritAuthFilter, final GitBlitSettings settings) { this.webSession = webSession; this.gitBlit = gitBlit; this.gerritAuthFilter = gerritAuthFilter; - this.config = new GitBlitUrlsConfig(config); + this.settings = settings; } @Override @@ -82,29 +69,7 @@ showGitBlitBanner(); try { - InputStream resin = - getClass().getResourceAsStream(GITBLIT_GERRIT_PROPERTIES); - Properties properties = null; - try { - properties = new Properties(); - properties.load(resin); - properties.put("git.repositoriesFolder", repoManager.getBasePath() - .getAbsolutePath()); - properties.put("realm.userService", - GerritToGitBlitUserService.class.getName()); - if (properties.get("web.otherUrls") != null) { - properties.put("web.otherUrls", - (config.getGitHttpUrl() + " " + config.getGitSshUrl()).trim() - + " " + properties.get("web.otherUrls")); - } else { - properties.put("web.otherUrls", - (config.getGitHttpUrl() + " " + config.getGitSshUrl()).trim()); - } - } finally { - resin.close(); - } - IStoredSettings settings = new GitBlitSettings(properties); - GitBlit.self().configureContext(settings, repoManager.getBasePath(), + GitBlit.self().configureContext(settings, settings.getBasePath(), false); GitBlit.self().contextInitialized( new ServletContextEvent(filterConfig.getServletContext()));
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GitBlitSettings.java b/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GitBlitSettings.java index f11e715..2f93f52 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GitBlitSettings.java +++ b/src/main/java/com/googlesource/gerrit/plugins/gitblit/app/GitBlitSettings.java
@@ -13,17 +13,48 @@ // limitations under the License. package com.googlesource.gerrit.plugins.gitblit.app; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.Map; import java.util.Properties; +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.gitblit.IStoredSettings; +import com.google.gerrit.server.config.GerritServerConfig; +import com.google.gerrit.server.config.SitePaths; +import com.google.gerrit.server.git.LocalDiskRepositoryManager; +import com.google.inject.Inject; +import com.googlesource.gerrit.plugins.gitblit.GitBlitUrlsConfig; +import com.googlesource.gerrit.plugins.gitblit.auth.GerritToGitBlitUserService; public class GitBlitSettings extends IStoredSettings { - private Properties properties; + private static final String GITBLIT_GERRIT_PROPERTIES = "/gitblit.properties"; - public GitBlitSettings(Properties properties) { + private final LocalDiskRepositoryManager repoManager; + private final GitBlitUrlsConfig config; + private final File etcDir; + + private Properties properties; + private File gitblitPropertiesFile; + + @Inject + public GitBlitSettings(final LocalDiskRepositoryManager repoManager, + final @GerritServerConfig Config config, final SitePaths sitePaths) + throws IOException { super(GitBlitSettings.class); - this.properties = properties; + this.properties = new Properties(); + this.repoManager = repoManager; + this.config = new GitBlitUrlsConfig(config); + this.etcDir = sitePaths.etc_dir; + load(); } @Override @@ -36,4 +67,65 @@ properties.putAll(updatedSettings); return true; } + + private void load() throws IOException { + InputStream resin = openPropertiesFile(); + try { + properties = new Properties(); + properties.load(resin); + properties.put("git.repositoriesFolder", repoManager.getBasePath() + .getAbsolutePath()); + properties.put("realm.userService", + GerritToGitBlitUserService.class.getName()); + if (properties.get("web.otherUrls") != null) { + properties.put("web.otherUrls", + (config.getGitHttpUrl() + " " + config.getGitSshUrl()).trim() + " " + + properties.get("web.otherUrls")); + } else { + properties.put("web.otherUrls", + (config.getGitHttpUrl() + " " + config.getGitSshUrl()).trim()); + } + } finally { + resin.close(); + } + } + + private InputStream openPropertiesFile() { + InputStream gitblitPropertiesIn; + gitblitPropertiesFile = new File(etcDir, GITBLIT_GERRIT_PROPERTIES); + if (gitblitPropertiesFile.exists()) { + try { + gitblitPropertiesIn = new FileInputStream(gitblitPropertiesFile); + } catch (FileNotFoundException e) { + // this would never happen as we checked for file existence before + throw new IllegalStateException(e); + } + } else { + gitblitPropertiesIn = + getClass().getResourceAsStream(GITBLIT_GERRIT_PROPERTIES); + } + return gitblitPropertiesIn; + } + + public File getBasePath() { + return repoManager.getBasePath(); + } + + @Override + public String toString() { + StringBuilder stringSettings = new StringBuilder(); + if (!gitblitPropertiesFile.exists()) { + stringSettings.append(GITBLIT_GERRIT_PROPERTIES + + " from gitblit plugin jar"); + } else { + stringSettings.append(gitblitPropertiesFile.getAbsolutePath() + + " (lastModified: " + + new SimpleDateFormat().format(new Date(gitblitPropertiesFile + .lastModified())) + ")"); + } + + stringSettings.append(" with values "); + stringSettings.append(properties.toString()); + return stringSettings.toString(); + } }