diff --git a/src/main/java/JettyLauncher.java b/src/main/java/JettyLauncher.java index 8b91e91..94525fd 100644 --- a/src/main/java/JettyLauncher.java +++ b/src/main/java/JettyLauncher.java @@ -134,17 +134,6 @@ return new File(System.getProperty("user.home"), ".gitbucket"); } - private static void deleteDirectory(File dir){ - for(File file: dir.listFiles()){ - if(file.isFile()){ - file.delete(); - } else if(file.isDirectory()){ - deleteDirectory(file); - } - } - dir.delete(); - } - private static Handler addStatisticsHandler(Handler handler) { // The graceful shutdown is implemented via the statistics handler. // See the following: https://bugs.eclipse.org/bugs/show_bug.cgi?id=420142 diff --git a/src/main/scala/gitbucket/core/service/SystemSettingsService.scala b/src/main/scala/gitbucket/core/service/SystemSettingsService.scala index 1647cba..248d122 100644 --- a/src/main/scala/gitbucket/core/service/SystemSettingsService.scala +++ b/src/main/scala/gitbucket/core/service/SystemSettingsService.scala @@ -1,9 +1,9 @@ package gitbucket.core.service -import gitbucket.core.util.{Directory, SyntaxSugars} import gitbucket.core.util.Implicits._ -import Directory._ -import SyntaxSugars._ +import gitbucket.core.util.ConfigUtil._ +import gitbucket.core.util.Directory._ +import gitbucket.core.util.SyntaxSugars._ import SystemSettingsService._ import javax.servlet.http.HttpServletRequest @@ -220,23 +220,28 @@ private val LdapSsl = "ldap.ssl" private val LdapKeystore = "ldap.keystore" - private def getValue[A: ClassTag](props: java.util.Properties, key: String, default: A): A = - defining(props.getProperty(key)){ value => - if(value == null || value.isEmpty) default - else convertType(value).asInstanceOf[A] - } + private def getValue[A: ClassTag](props: java.util.Properties, key: String, default: A): A = { + getSystemProperty(key).getOrElse(getEnvironmentVariable(key).getOrElse { + defining(props.getProperty(key)){ value => + if(value == null || value.isEmpty){ + default + } else { + convertType(value).asInstanceOf[A] + } + } + }) + } - private def getOptionValue[A: ClassTag](props: java.util.Properties, key: String, default: Option[A]): Option[A] = - defining(props.getProperty(key)){ value => - if(value == null || value.isEmpty) default - else Some(convertType(value)).asInstanceOf[Option[A]] - } - - private def convertType[A: ClassTag](value: String) = - defining(implicitly[ClassTag[A]].runtimeClass){ c => - if(c == classOf[Boolean]) value.toBoolean - else if(c == classOf[Int]) value.toInt - else value - } + private def getOptionValue[A: ClassTag](props: java.util.Properties, key: String, default: Option[A]): Option[A] = { + getSystemProperty(key).orElse(getEnvironmentVariable(key).orElse { + defining(props.getProperty(key)){ value => + if(value == null || value.isEmpty){ + default + } else { + Some(convertType(value)).asInstanceOf[Option[A]] + } + } + }) + } } diff --git a/src/main/scala/gitbucket/core/util/DatabaseConfig.scala b/src/main/scala/gitbucket/core/util/DatabaseConfig.scala index 644c3f2..072b583 100644 --- a/src/main/scala/gitbucket/core/util/DatabaseConfig.scala +++ b/src/main/scala/gitbucket/core/util/DatabaseConfig.scala @@ -4,11 +4,15 @@ import java.io.File import Directory._ -import com.github.takezoe.slick.blocking.{BlockingH2Driver, BlockingMySQLDriver, BlockingJdbcProfile} +import ConfigUtil._ +import com.github.takezoe.slick.blocking.{BlockingH2Driver, BlockingJdbcProfile, BlockingMySQLDriver} +import gitbucket.core.util.SyntaxSugars.defining import liquibase.database.AbstractJdbcDatabase import liquibase.database.core.{H2Database, MySQLDatabase, PostgresDatabase} import org.apache.commons.io.FileUtils +import scala.reflect.ClassTag + object DatabaseConfig { private lazy val config = { @@ -30,14 +34,14 @@ ConfigFactory.parseFile(file) } - private lazy val dbUrl = config.getString("db.url") + private lazy val dbUrl = getValue("db.url", config.getString) //config.getString("db.url") def url(directory: Option[String]): String = dbUrl.replace("${DatabaseHome}", directory.getOrElse(DatabaseHome)) lazy val url : String = url(None) - lazy val user : String = config.getString("db.user") - lazy val password : String = config.getString("db.password") + lazy val user : String = getValue("db.user", config.getString) + lazy val password : String = getValue("db.password", config.getString) lazy val jdbcDriver : String = DatabaseType(url).jdbcDriver lazy val slickDriver : BlockingJdbcProfile = DatabaseType(url).slickDriver lazy val liquiDriver : AbstractJdbcDatabase = DatabaseType(url).liquiDriver @@ -47,8 +51,16 @@ lazy val minimumIdle : Option[Int] = getOptionValue("db.minimumIdle" , config.getInt) lazy val maximumPoolSize : Option[Int] = getOptionValue("db.maximumPoolSize" , config.getInt) + private def getValue[T](path: String, f: String => T): T = { + getSystemProperty(path).getOrElse(getEnvironmentVariable(path).getOrElse{ + f(path) + }) + } + private def getOptionValue[T](path: String, f: String => T): Option[T] = { - if(config.hasPath(path)) Some(f(path)) else None + getSystemProperty(path).orElse(getEnvironmentVariable(path).orElse { + if(config.hasPath(path)) Some(f(path)) else None + }) } } @@ -99,3 +111,33 @@ } } } + +object ConfigUtil { + + def getEnvironmentVariable[A](key: String): Option[A] = { + val value = System.getenv("GITBUCKET_" + key.toUpperCase.replace('.', '_')) + if(value != null && value.nonEmpty){ + Some(convertType(value)).asInstanceOf[Option[A]] + } else { + None + } + } + + def getSystemProperty[A](key: String): Option[A] = { + val value = System.getProperty("gitbucket." + key) + if(value != null && value.nonEmpty){ + Some(convertType(value)).asInstanceOf[Option[A]] + } else { + None + } + } + + def convertType[A: ClassTag](value: String) = + defining(implicitly[ClassTag[A]].runtimeClass){ c => + if(c == classOf[Boolean]) value.toBoolean + else if(c == classOf[Long]) value.toLong + else if(c == classOf[Int]) value.toInt + else value + } + +}