diff --git a/build.sbt b/build.sbt index 3740f69..bea6e6a 100644 --- a/build.sbt +++ b/build.sbt @@ -4,7 +4,7 @@ val Organization = "io.github.gitbucket" val Name = "gitbucket" val GitBucketVersion = "4.31.2" -val ScalatraVersion = "2.6.3" +val ScalatraVersion = "2.7.0-RC1" val JettyVersion = "9.4.14.v20181114" val JgitVersion = "5.2.0.201812061821-r" @@ -17,7 +17,7 @@ organization := Organization name := Name version := GitBucketVersion -scalaVersion := "2.12.8" +scalaVersion := "2.13.0" scalafmtOnCompile := true @@ -38,7 +38,7 @@ "org.scalatra" %% "scalatra" % ScalatraVersion, "org.scalatra" %% "scalatra-json" % ScalatraVersion, "org.scalatra" %% "scalatra-forms" % ScalatraVersion, - "org.json4s" %% "json4s-jackson" % "3.5.2", + "org.json4s" %% "json4s-jackson" % "3.6.7", "commons-io" % "commons-io" % "2.6", "io.github.gitbucket" % "solidbase" % "1.0.3", "io.github.gitbucket" % "markedj" % "1.0.16", @@ -47,7 +47,7 @@ "org.apache.httpcomponents" % "httpclient" % "4.5.6", "org.apache.sshd" % "apache-sshd" % "2.1.0" exclude ("org.slf4j", "slf4j-jdk14") exclude ("org.apache.sshd", "sshd-mina") exclude ("org.apache.sshd", "sshd-netty"), "org.apache.tika" % "tika-core" % "1.19.1", - "com.github.takezoe" %% "blocking-slick-32" % "0.0.11", + "com.github.takezoe" %% "blocking-slick-32" % "0.0.12", "com.novell.ldap" % "jldap" % "2009-10-07", "com.h2database" % "h2" % "1.4.197", "org.mariadb.jdbc" % "mariadb-java-client" % "2.4.2", @@ -59,7 +59,7 @@ "fr.brouillard.oss.security.xhub" % "xhub4j-core" % "1.1.0", "com.github.bkromhout" % "java-diff-utils" % "2.1.1", "org.cache2k" % "cache2k-all" % "1.2.0.Final", - "com.enragedginger" %% "akka-quartz-scheduler" % "1.7.0-akka-2.5.x" exclude ("c3p0", "c3p0") exclude ("com.zaxxer", "HikariCP-java6"), + "com.enragedginger" %% "akka-quartz-scheduler" % "1.8.1-akka-2.5.x" exclude ("com.mchange", "c3p0") exclude ("com.zaxxer", "HikariCP-java6"), "net.coobird" % "thumbnailator" % "0.4.8", "com.github.zafarkhaja" % "java-semver" % "0.9.0", "com.nimbusds" % "oauth2-oidc-sdk" % "5.64.4", @@ -77,7 +77,7 @@ ) // Compiler settings -scalacOptions := Seq("-deprecation", "-language:postfixOps", "-opt:l:method", "-Xfuture") +scalacOptions := Seq("-deprecation", "-language:postfixOps", "-opt:l:method") javacOptions in compile ++= Seq("-target", "8", "-source", "8") javaOptions in Jetty += "-Dlogback.configurationFile=/logback-dev.xml" diff --git a/doc/build.md b/doc/build.md index d508b50..0adbfcd 100644 --- a/doc/build.md +++ b/doc/build.md @@ -29,7 +29,7 @@ $ sbt package ``` -`gitbucket_2.12-x.x.x.war` is generated into `target/scala-2.12`. +`gitbucket_2.13-x.x.x.war` is generated into `target/scala-2.13`. To build an executable war file, run @@ -58,4 +58,4 @@ ```shell $ sbt "testOnly * -- -l ExternalDBTest" -``` \ No newline at end of file +``` diff --git a/src/main/scala/gitbucket/core/controller/AccountController.scala b/src/main/scala/gitbucket/core/controller/AccountController.scala index da07cde..886d9c4 100644 --- a/src/main/scala/gitbucket/core/controller/AccountController.scala +++ b/src/main/scala/gitbucket/core/controller/AccountController.scala @@ -5,7 +5,6 @@ import gitbucket.core.account.html import gitbucket.core.helper import gitbucket.core.model._ -import gitbucket.core.plugin.PluginRegistry import gitbucket.core.service._ import gitbucket.core.service.WebHookService._ import gitbucket.core.ssh.SshUtil @@ -347,7 +346,7 @@ updateImage(userName, form.fileId, form.clearImage) updateAccountExtraMailAddresses(userName, form.extraMailAddresses.filter(_ != "")) - flash += "info" -> "Account information has been updated." + flash.update("info", "Account information has been updated.") redirect(s"/${userName}/_edit") } getOrElse NotFound() @@ -359,7 +358,7 @@ getAccountByUserName(userName, true).map { account => if (isLastAdministrator(account)) { - flash += "error" -> "Account can't be removed because this is last one administrator." + flash.update("error", "Account can't be removed because this is last one administrator.") redirect(s"/${userName}/_edit") } else { // // Remove repositories @@ -439,7 +438,7 @@ val userName = params("userName") getAccountByUserName(userName).map { x => val (tokenId, token) = generateAccessToken(userName, form.note) - flash += "generatedToken" -> (tokenId, token) + flash.update("generatedToken", (tokenId, token)) } redirect(s"/${userName}/_application") }) @@ -475,7 +474,7 @@ post("/:userName/_hooks/new", accountWebHookForm(false))(managersOnly { form => val userName = params("userName") addAccountWebHook(userName, form.url, form.events, form.ctype, form.token) - flash += "info" -> s"Webhook ${form.url} created" + flash.update("info", s"Webhook ${form.url} created") redirect(s"/${userName}/_hooks") }) @@ -485,7 +484,7 @@ get("/:userName/_hooks/delete")(managersOnly { val userName = params("userName") deleteAccountWebHook(userName, params("url")) - flash += "info" -> s"Webhook ${params("url")} deleted" + flash.update("info", s"Webhook ${params("url")} deleted") redirect(s"/${userName}/_hooks") }) @@ -508,7 +507,7 @@ post("/:userName/_hooks/edit", accountWebHookForm(true))(managersOnly { form => val userName = params("userName") updateAccountWebHook(userName, form.url, form.events, form.ctype, form.token) - flash += "info" -> s"webhook ${form.url} updated" + flash.update("info", s"webhook ${form.url} updated") redirect(s"/${userName}/_hooks") }) @@ -543,7 +542,7 @@ case e: java.net.UnknownHostException => Map("error" -> ("Unknown host " + e.getMessage)) case e: java.lang.IllegalArgumentException => Map("error" -> ("invalid url")) case e: org.apache.http.client.ClientProtocolException => Map("error" -> ("invalid url")) - case NonFatal(e) => Map("error" -> (e.getClass + " " + e.getMessage)) + case NonFatal(e) => Map("error" -> (s"${e.getClass} ${e.getMessage}")) } contentType = formats("json") @@ -683,7 +682,7 @@ updateImage(form.groupName, form.fileId, form.clearImage) - flash += "info" -> "Account information has been updated." + flash.update("info", "Account information has been updated.") redirect(s"/${groupName}/_editgroup") } getOrElse NotFound() diff --git a/src/main/scala/gitbucket/core/controller/ControllerBase.scala b/src/main/scala/gitbucket/core/controller/ControllerBase.scala index fa51b5a..a4bc72c 100644 --- a/src/main/scala/gitbucket/core/controller/ControllerBase.scala +++ b/src/main/scala/gitbucket/core/controller/ControllerBase.scala @@ -20,6 +20,7 @@ import is.tagomor.woothee.Classifier import scala.util.Try +import scala.util.Using import net.coobird.thumbnailator.Thumbnails import org.eclipse.jgit.api.Git import org.eclipse.jgit.lib.ObjectId @@ -240,7 +241,7 @@ case false => None } - using(new TreeWalk(git.getRepository)) { treeWalk => + Using.resource(new TreeWalk(git.getRepository)) { treeWalk => treeWalk.addTree(revCommit.getTree) treeWalk.setRecursive(true) _getPathObjectId(path, treeWalk) @@ -268,7 +269,7 @@ response.setContentLength(attrs("size").toInt) val oid = attrs("oid").split(":")(1) - using(new FileInputStream(FileUtil.getLfsFilePath(repository.owner, repository.name, oid))) { in => + Using.resource(new FileInputStream(FileUtil.getLfsFilePath(repository.owner, repository.name, oid))) { in => IOUtils.copy(in, response.getOutputStream) } } else { @@ -365,7 +366,7 @@ params: Map[String, Seq[String]], messages: Messages ): Option[String] = { - val extraMailAddresses = params.filterKeys(k => k.startsWith("extraMailAddresses")) + val extraMailAddresses = params.view.filterKeys(k => k.startsWith("extraMailAddresses")) if (extraMailAddresses.exists { case (k, v) => v.contains(value) @@ -388,7 +389,7 @@ params: Map[String, Seq[String]], messages: Messages ): Option[String] = { - val extraMailAddresses = params.filterKeys(k => k.startsWith("extraMailAddresses")) + val extraMailAddresses = params.view.filterKeys(k => k.startsWith("extraMailAddresses")) if (Some(value) == params.optionValue("mailAddress") || extraMailAddresses.count { case (k, v) => v.contains(value) diff --git a/src/main/scala/gitbucket/core/controller/FileUploadController.scala b/src/main/scala/gitbucket/core/controller/FileUploadController.scala index c751776..3d7a834 100644 --- a/src/main/scala/gitbucket/core/controller/FileUploadController.scala +++ b/src/main/scala/gitbucket/core/controller/FileUploadController.scala @@ -16,6 +16,8 @@ import org.scalatra.servlet.{FileItem, FileUploadSupport, MultipartConfig} import org.apache.commons.io.{FileUtils, IOUtils} +import scala.util.Using + /** * Provides Ajax based file upload functionality. * @@ -80,7 +82,7 @@ { (file, fileId) => val fileName = file.getName LockUtil.lock(s"${owner}/${repository}/wiki") { - using(Git.open(Directory.getWikiRepositoryDir(owner, repository))) { + Using.resource(Git.open(Directory.getWikiRepositoryDir(owner, repository))) { git => val builder = DirCache.newInCore.builder() val inserter = git.getRepository.newObjectInserter() diff --git a/src/main/scala/gitbucket/core/controller/IndexController.scala b/src/main/scala/gitbucket/core/controller/IndexController.scala index 2c3d4c8..dd80b47 100644 --- a/src/main/scala/gitbucket/core/controller/IndexController.scala +++ b/src/main/scala/gitbucket/core/controller/IndexController.scala @@ -83,7 +83,7 @@ get("/signin") { val redirect = params.get("redirect") if (redirect.isDefined && redirect.get.startsWith("/")) { - flash += Keys.Flash.Redirect -> redirect.get + flash.update(Keys.Flash.Redirect, redirect.get) } gitbucket.core.html.signin(flash.get("userName"), flash.get("password"), flash.get("error")) } @@ -96,9 +96,9 @@ case _ => signin(account) } case None => - flash += "userName" -> form.userName - flash += "password" -> form.password - flash += "error" -> "Sorry, your Username and/or Password is incorrect. Please try again." + flash.update("userName", form.userName) + flash.update("password", form.password) + flash.update("error", "Sorry, your Username and/or Password is incorrect. Please try again.") redirect("/signin") } } @@ -132,15 +132,15 @@ val redirectURI = new URI(s"$baseUrl/signin/oidc") session.get(Keys.Session.OidcContext) match { case Some(context: OidcContext) => - authenticate(params, redirectURI, context.state, context.nonce, oidc) map { account => + authenticate(params.toMap, redirectURI, context.state, context.nonce, oidc).map { account => signin(account, context.redirectBackURI) } orElse { - flash += "error" -> "Sorry, authentication failed. Please try again." + flash.update("error", "Sorry, authentication failed. Please try again.") session.invalidate() redirect("/signin") } case _ => - flash += "error" -> "Sorry, something wrong. Please try again." + flash.update("error", "Sorry, something wrong. Please try again.") session.invalidate() redirect("/signin") } @@ -227,7 +227,7 @@ } getOrElse "" }) - // TODO Move to RepositoryViwerController? + // TODO Move to RepositoryViewrController? get("/:owner/:repository/search")(referrersOnly { repository => defining(params.getOrElse("q", "").trim, params.getOrElse("type", "code")) { case (query, target) => diff --git a/src/main/scala/gitbucket/core/controller/IssuesController.scala b/src/main/scala/gitbucket/core/controller/IssuesController.scala index efc0acb..f19e7a9 100644 --- a/src/main/scala/gitbucket/core/controller/IssuesController.scala +++ b/src/main/scala/gitbucket/core/controller/IssuesController.scala @@ -145,7 +145,7 @@ form.assignedUserName, form.milestoneId, form.priorityId, - form.labelNames.toArray.flatMap(_.split(",")), + form.labelNames.toSeq.flatMap(_.split(",")), context.loginAccount.get ) diff --git a/src/main/scala/gitbucket/core/controller/PullRequestsController.scala b/src/main/scala/gitbucket/core/controller/PullRequestsController.scala index 2910ac7..4c0bfd8 100644 --- a/src/main/scala/gitbucket/core/controller/PullRequestsController.scala +++ b/src/main/scala/gitbucket/core/controller/PullRequestsController.scala @@ -1,7 +1,5 @@ package gitbucket.core.controller -import gitbucket.core.model.{CommitComment, CommitComments, IssueComment, WebHook} -import gitbucket.core.plugin.PluginRegistry import gitbucket.core.pulls.html import gitbucket.core.service.CommitStatusService import gitbucket.core.service.MergeService @@ -15,11 +13,9 @@ import gitbucket.core.util._ import org.scalatra.forms._ import org.eclipse.jgit.api.Git -import org.eclipse.jgit.lib.{ObjectId, PersonIdent} -import org.eclipse.jgit.revwalk.RevWalk import org.scalatra.BadRequest -import scala.collection.JavaConverters._ +import scala.util.Using class PullRequestsController extends PullRequestsControllerBase @@ -136,7 +132,7 @@ hasDeveloperRole(pullreq.requestUserName, pullreq.requestRepositoryName, context.loginAccount), repository, getRepository(pullreq.requestUserName, pullreq.requestRepositoryName), - flash.toMap.map(f => f._1 -> f._2.toString) + flash.iterator.map(f => f._1 -> f._2.toString).toMap ) // html.pullreq( @@ -269,11 +265,11 @@ val repository = getRepository(owner, name).get val branchProtection = getProtectedBranchInfo(owner, name, pullreq.requestBranch) if (branchProtection.enabled) { - flash += "error" -> s"branch ${pullreq.requestBranch} is protected." + flash.update("error", s"branch ${pullreq.requestBranch} is protected.") } else { if (repository.repository.defaultBranch != pullreq.requestBranch) { val userName = context.loginAccount.get.userName - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => + Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => git.branchDelete().setForce(true).setBranchNames(pullreq.requestBranch).call() recordDeleteBranchActivity(repository.owner, repository.name, userName, pullreq.requestBranch) } @@ -286,7 +282,7 @@ "delete_branch" ) } else { - flash += "error" -> s"""Can't delete the default branch "${pullreq.requestBranch}".""" + flash.update("error", s"""Can't delete the default branch "${pullreq.requestBranch}".""") } } @@ -307,7 +303,7 @@ } yield { val branchProtection = getProtectedBranchInfo(owner, name, pullreq.requestBranch) if (branchProtection.needStatusCheck(loginAccount.userName)) { - flash += "error" -> s"branch ${pullreq.requestBranch} is protected need status check." + flash.update("error", s"branch ${pullreq.requestBranch} is protected need status check.") } else { LockUtil.lock(s"${owner}/${name}") { val alias = @@ -316,9 +312,11 @@ } else { s"${pullreq.userName}:${pullreq.branch}" } - val existIds = using(Git.open(Directory.getRepositoryDir(owner, name))) { git => - JGitUtil.getAllCommitIds(git) - }.toSet + val existIds = Using + .resource(Git.open(Directory.getRepositoryDir(owner, name))) { git => + JGitUtil.getAllCommitIds(git) + } + .toSet pullRemote( repository, pullreq.requestBranch, @@ -329,11 +327,11 @@ Some(pullreq) ) match { case None => // conflict - flash += "error" -> s"Can't automatic merging branch '${alias}' into ${pullreq.requestBranch}." + flash.update("error", s"Can't automatic merging branch '${alias}' into ${pullreq.requestBranch}.") case Some(oldId) => // update pull request updatePullRequests(owner, name, pullreq.requestBranch, loginAccount, "synchronize") - flash += "info" -> s"Merge branch '${alias}' into ${pullreq.requestBranch}" + flash.update("info", s"Merge branch '${alias}' into ${pullreq.requestBranch}") } } } @@ -372,7 +370,7 @@ case (Some(originUserName), Some(originRepositoryName)) => { getRepository(originUserName, originRepositoryName).map { originRepository => - using( + Using.resources( Git.open(getRepositoryDir(originUserName, originRepositoryName)), Git.open(getRepositoryDir(forkedRepository.owner, forkedRepository.name)) ) { (oldGit, newGit) => @@ -388,7 +386,7 @@ } getOrElse NotFound() } case _ => { - using(Git.open(getRepositoryDir(forkedRepository.owner, forkedRepository.name))) { git => + Using.resource(Git.open(getRepositoryDir(forkedRepository.owner, forkedRepository.name))) { git => JGitUtil.getDefaultBranch(git, forkedRepository).map { case (_, defaultBranch) => redirect( @@ -510,7 +508,7 @@ } }; originRepository <- getRepository(originOwner, originRepositoryName)) yield { - using( + Using.resources( Git.open(getRepositoryDir(originRepository.owner, originRepository.name)), Git.open(getRepositoryDir(forkedRepository.owner, forkedRepository.name)) ) { @@ -585,7 +583,7 @@ context.loginAccount.map(x => Seq(x.mailAddress) ++ getAccountExtraMailAddresses(x.userName)).getOrElse(Nil) val branches = - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { + Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => JGitUtil .getBranches( diff --git a/src/main/scala/gitbucket/core/controller/ReleasesController.scala b/src/main/scala/gitbucket/core/controller/ReleasesController.scala index 32afbda..90c887c 100644 --- a/src/main/scala/gitbucket/core/controller/ReleasesController.scala +++ b/src/main/scala/gitbucket/core/controller/ReleasesController.scala @@ -106,7 +106,7 @@ createRelease(repository.owner, repository.name, form.name, form.content, tagName, loginAccount) // Insert into RELEASE_ASSET - val files = params.collect { + val files = params.toMap.collect { case (name, value) if name.startsWith("file:") => val Array(_, fileId) = name.split(":") (fileId, value) @@ -174,7 +174,7 @@ val assets = getReleaseAssets(repository.owner, repository.name, tagName) deleteReleaseAssets(repository.owner, repository.name, tagName) - val files = params.collect { + val files = params.toMap.collect { case (name, value) if name.startsWith("file:") => val Array(_, fileId) = name.split(":") (fileId, value) diff --git a/src/main/scala/gitbucket/core/controller/RepositorySettingsController.scala b/src/main/scala/gitbucket/core/controller/RepositorySettingsController.scala index 4dc1dc0..b4b509e 100644 --- a/src/main/scala/gitbucket/core/controller/RepositorySettingsController.scala +++ b/src/main/scala/gitbucket/core/controller/RepositorySettingsController.scala @@ -12,12 +12,14 @@ import gitbucket.core.util.SyntaxSugars._ import gitbucket.core.util.Implicits._ import gitbucket.core.util.Directory._ +import gitbucket.core.model.WebHookContentType import org.scalatra.forms._ import org.scalatra.i18n.Messages import org.eclipse.jgit.api.Git import org.eclipse.jgit.lib.Constants import org.eclipse.jgit.lib.ObjectId -import gitbucket.core.model.WebHookContentType + +import scala.util.Using class RepositorySettingsController extends RepositorySettingsControllerBase @@ -147,7 +149,7 @@ // Update database renameRepository(repository.owner, repository.name, repository.owner, form.repositoryName) } - flash += "info" -> "Repository settings has been updated." + flash.update("info", "Repository settings has been updated.") redirect(s"/${repository.owner}/${form.repositoryName}/settings/options") }) @@ -164,10 +166,10 @@ } else { saveRepositoryDefaultBranch(repository.owner, repository.name, form.defaultBranch) // Change repository HEAD - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => + Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => git.getRepository.updateRef(Constants.HEAD, true).link(Constants.R_HEADS + form.defaultBranch) } - flash += "info" -> "Repository default branch has been updated." + flash.update("info", "Repository default branch has been updated.") redirect(s"/${repository.owner}/${repository.name}/settings/branches") } }) @@ -231,7 +233,7 @@ */ post("/:owner/:repository/settings/hooks/new", webHookForm(false))(ownerOnly { (form, repository) => addWebHook(repository.owner, repository.name, form.url, form.events, form.ctype, form.token) - flash += "info" -> s"Webhook ${form.url} created" + flash.update("info", s"Webhook ${form.url} created") redirect(s"/${repository.owner}/${repository.name}/settings/hooks") }) @@ -240,7 +242,7 @@ */ get("/:owner/:repository/settings/hooks/delete")(ownerOnly { repository => deleteWebHook(repository.owner, repository.name, params("url")) - flash += "info" -> s"Webhook ${params("url")} deleted" + flash.update("info", s"Webhook ${params("url")} deleted") redirect(s"/${repository.owner}/${repository.name}/settings/hooks") }) @@ -252,11 +254,11 @@ Array(h.getName, h.getValue) } - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { + Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => - import scala.collection.JavaConverters._ import scala.concurrent.duration._ import scala.concurrent._ + import scala.jdk.CollectionConverters._ import scala.util.control.NonFatal import org.apache.http.util.EntityUtils import scala.concurrent.ExecutionContext.Implicits.global @@ -298,7 +300,7 @@ case e: java.net.UnknownHostException => Map("error" -> ("Unknown host " + e.getMessage)) case e: java.lang.IllegalArgumentException => Map("error" -> ("invalid url")) case e: org.apache.http.client.ClientProtocolException => Map("error" -> ("invalid url")) - case NonFatal(e) => Map("error" -> (e.getClass + " " + e.getMessage)) + case NonFatal(e) => Map("error" -> (s"${e.getClass} ${e.getMessage}")) } contentType = formats("json") @@ -350,7 +352,7 @@ */ post("/:owner/:repository/settings/hooks/edit", webHookForm(true))(ownerOnly { (form, repository) => updateWebHook(repository.owner, repository.name, form.url, form.events, form.ctype, form.token) - flash += "info" -> s"webhook ${form.url} updated" + flash.update("info", s"webhook ${form.url} updated") redirect(s"/${repository.owner}/${repository.name}/settings/hooks") }) @@ -386,11 +388,11 @@ */ post("/:owner/:repository/settings/gc")(ownerOnly { repository => LockUtil.lock(s"${repository.owner}/${repository.name}") { - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => + Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => git.gc().call() } } - flash += "info" -> "Garbage collection has been executed." + flash.update("info", "Garbage collection has been executed.") redirect(s"/${repository.owner}/${repository.name}/settings/danger") }) diff --git a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala index 7ae412e..386bee2 100644 --- a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala +++ b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala @@ -2,6 +2,7 @@ import java.io.File +import scala.util.Using import javax.servlet.http.{HttpServletRequest, HttpServletResponse} import gitbucket.core.plugin.PluginRegistry import gitbucket.core.repo.html @@ -258,11 +259,11 @@ def getSummary(statuses: List[CommitStatus]): (CommitState, String) = { val stateMap = statuses.groupBy(_.state) val state = CommitState.combine(stateMap.keySet) - val summary = stateMap.map { case (keyState, states) => states.size + " " + keyState.name }.mkString(", ") + val summary = stateMap.map { case (keyState, states) => s"${states.size} ${keyState.name}" }.mkString(", ") state -> summary } - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { + Using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => def getTags(sha: String): List[String] = { JGitUtil.getTagsOnCommit(git, sha) @@ -315,7 +316,7 @@ val protectedBranch = getProtectedBranchInfo(repository.owner, repository.name, branch) .needStatusCheck(context.loginAccount.get.userName) - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => + Using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(branch)) html.editor( @@ -351,7 +352,7 @@ repository = repository, branch = form.branch, path = form.path, - files = files, + files = files.toIndexedSeq, message = form.message.getOrElse("Add files via upload"), loginAccount = context.loginAccount.get ) { @@ -384,7 +385,7 @@ val protectedBranch = getProtectedBranchInfo(repository.owner, repository.name, branch) .needStatusCheck(context.loginAccount.get.userName) - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { + Using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(branch)) @@ -411,7 +412,7 @@ get("/:owner/:repository/remove/*")(writableUsersOnly { repository => val (branch, path) = repository.splitPath(multiParams("splat").head) - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { + Using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(branch)) @@ -487,8 +488,6 @@ loginAccount = context.loginAccount.get ) - println(form.path) - redirect( s"/${repository.owner}/${repository.name}/tree/${form.branch}${if (form.path.length == 0) "" else "/" + form.path}" ) @@ -496,7 +495,7 @@ get("/:owner/:repository/raw/*")(referrersOnly { repository => val (id, path) = repository.splitPath(multiParams("splat").head) - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => + Using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id)) getPathObjectId(git, path, revCommit).map { objectId => @@ -511,7 +510,7 @@ val blobRoute = get("/:owner/:repository/blob/*")(referrersOnly { repository => val (id, path) = repository.splitPath(multiParams("splat").head) val raw = params.get("raw").getOrElse("false").toBoolean - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { + Using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id)) getPathObjectId(git, path, revCommit).map { @@ -551,7 +550,7 @@ ajaxGet("/:owner/:repository/get-blame/*")(referrersOnly { repository => val (id, path) = repository.splitPath(multiParams("splat").head) contentType = formats("json") - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { + Using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => val last = git.log.add(git.getRepository.resolve(id)).addPath(path).setMaxCount(1).call.iterator.next.name Serialization.write( @@ -586,7 +585,7 @@ val id = params("id") try { - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { + Using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => defining(JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id))) { revCommit => @@ -615,7 +614,7 @@ get("/:owner/:repository/patch/:id")(referrersOnly { repository => try { - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => + Using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => val diff = JGitUtil.getPatch(git, None, params("id")) contentType = formats("txt") diff @@ -628,7 +627,7 @@ get("/:owner/:repository/patch/*...*")(referrersOnly { repository => try { val Seq(fromId, toId) = multiParams("splat") - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => + Using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => val diff = JGitUtil.getPatch(git, Some(fromId), toId) contentType = formats("txt") diff @@ -748,7 +747,7 @@ */ get("/:owner/:repository/branches")(referrersOnly { repository => val protectedBranches = getProtectedBranchList(repository.owner, repository.name).toSet - val branches = using(Git.open(getRepositoryDir(repository.owner, repository.name))) { + val branches = Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => JGitUtil .getBranches( @@ -788,14 +787,14 @@ * Creates a tag. */ post("/:owner/:repository/tag", tagForm)(writableUsersOnly { (form, repository) => - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => + Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => JGitUtil.createTag(git, form.tagName, form.message, form.commitId) } match { case Right(message) => - flash += "info" -> message + flash.update("info", message) redirect(s"/${repository.owner}/${repository.name}/commit/${form.commitId}") case Left(message) => - flash += "error" -> message + flash.update("error", message) redirect(s"/${repository.owner}/${repository.name}/commit/${form.commitId}") } }) @@ -806,16 +805,16 @@ post("/:owner/:repository/branches")(writableUsersOnly { repository => val newBranchName = params.getOrElse("new", halt(400)) val fromBranchName = params.getOrElse("from", halt(400)) - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => + Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => JGitUtil.createBranch(git, fromBranchName, newBranchName) } match { case Right(message) => - flash += "info" -> message + flash.update("info", message) redirect( s"/${repository.owner}/${repository.name}/tree/${StringUtil.urlEncode(newBranchName).replace("%2F", "/")}" ) case Left(message) => - flash += "error" -> message + flash.update("error", message) redirect(s"/${repository.owner}/${repository.name}/tree/${fromBranchName}") } }) @@ -827,7 +826,7 @@ val branchName = multiParams("splat").head val userName = context.loginAccount.get.userName if (repository.repository.defaultBranch != branchName) { - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => + Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => git.branchDelete().setForce(true).setBranchNames(branchName).call() recordDeleteBranchActivity(repository.owner, repository.name, userName, branchName) } @@ -879,7 +878,7 @@ * Displays the file find of branch. */ get("/:owner/:repository/find/*")(referrersOnly { repository => - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => + Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => val ref = multiParams("splat").head JGitUtil.getTreeId(git, ref).map { treeId => html.find(ref, treeId, repository) @@ -891,7 +890,7 @@ * Get all file list of branch. */ ajaxGet("/:owner/:repository/tree-list/:tree")(referrersOnly { repository => - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => + Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => val treeId = params("tree") contentType = formats("json") Map("paths" -> JGitUtil.getAllFileListByTreeId(git, treeId)) @@ -915,7 +914,7 @@ * @return HTML of the file list */ private def fileList(repository: RepositoryService.RepositoryInfo, revstr: String = "", path: String = ".") = { - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => + Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => if (JGitUtil.isEmpty(git)) { html.guide(repository, hasDeveloperRole(repository.owner, repository.name, context.loginAccount)) } else { @@ -974,16 +973,16 @@ def archive(revision: String, archiveFormat: String, archive: ArchiveOutputStream)( entryCreator: (String, Long, java.util.Date, Int) => ArchiveEntry ): Unit = { - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => + Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => val oid = git.getRepository.resolve(revision) val commit = JGitUtil.getRevCommitFromId(git, oid) val date = commit.getCommitterIdent.getWhen val sha1 = oid.getName() val repositorySuffix = (if (sha1.startsWith(revision)) sha1 else revision).replace('/', '-') - val pathSuffix = if (path.isEmpty) "" else '-' + path.replace('/', '-') + val pathSuffix = if (path.isEmpty) "" else s"-${path.replace('/', '-')}" val baseName = repository.name + "-" + repositorySuffix + pathSuffix - using(new TreeWalk(git.getRepository)) { treeWalk => + Using.resource(new TreeWalk(git.getRepository)) { treeWalk => treeWalk.addTree(commit.getTree) treeWalk.setRecursive(true) if (!path.isEmpty) { @@ -1032,7 +1031,7 @@ ) contentType = "application/octet-stream" response.setBufferSize(1024 * 1024) - using(new ZipArchiveOutputStream(response.getOutputStream)) { zip => + Using.resource(new ZipArchiveOutputStream(response.getOutputStream)) { zip => archive(revision, ".zip", zip) { (path, size, date, mode) => val entry = new ZipArchiveEntry(path) entry.setUnixMode(mode) @@ -1048,12 +1047,12 @@ ) contentType = "application/octet-stream" response.setBufferSize(1024 * 1024) - using(compressor match { + Using.resource(compressor match { case "gz" => new GzipCompressorOutputStream(response.getOutputStream) case "bz2" => new BZip2CompressorOutputStream(response.getOutputStream) case "xz" => new XZCompressorOutputStream(response.getOutputStream) }) { compressorOutputStream => - using(new TarArchiveOutputStream(compressorOutputStream)) { tar => + Using.resource(new TarArchiveOutputStream(compressorOutputStream)) { tar => tar.setBigNumberMode(TarArchiveOutputStream.BIGNUMBER_STAR) tar.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU) tar.setAddPaxHeadersForNonAsciiNames(true) @@ -1081,7 +1080,7 @@ val branch = params("branch") LockUtil.lock(s"${owner}/${repository}") { - using(Git.open(getRepositoryDir(owner, repository))) { git => + Using.resource(Git.open(getRepositoryDir(owner, repository))) { git => val headName = s"refs/heads/${branch}" val headTip = git.getRepository.resolve(headName) if (headTip.getName != value) { diff --git a/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala b/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala index 2b7174d..7d9aefc 100644 --- a/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala +++ b/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala @@ -19,6 +19,7 @@ import org.scalatra.i18n.Messages import scala.collection.mutable.ListBuffer +import scala.util.Using class SystemSettingsController extends SystemSettingsControllerBase @@ -225,30 +226,30 @@ val conn = request2Session(request).conn val meta = conn.getMetaData val tables = ListBuffer[Table]() - using(meta.getTables(null, "%", "%", Array("TABLE", "VIEW"))) { + Using.resource(meta.getTables(null, "%", "%", Array("TABLE", "VIEW"))) { rs => while (rs.next()) { val tableName = rs.getString("TABLE_NAME") val pkColumns = ListBuffer[String]() - using(meta.getPrimaryKeys(null, null, tableName)) { rs => + Using.resource(meta.getPrimaryKeys(null, null, tableName)) { rs => while (rs.next()) { pkColumns += rs.getString("COLUMN_NAME").toUpperCase } } val columns = ListBuffer[Column]() - using(meta.getColumns(null, "%", tableName, "%")) { rs => + Using.resource(meta.getColumns(null, "%", tableName, "%")) { rs => while (rs.next()) { val columnName = rs.getString("COLUMN_NAME").toUpperCase columns += Column(columnName, pkColumns.contains(columnName)) } } - tables += Table(tableName.toUpperCase, columns) + tables += Table(tableName.toUpperCase, columns.toSeq) } } - html.dbviewer(tables) + html.dbviewer(tables.toSeq) }) post("/admin/dbviewer/_query")(adminOnly { @@ -259,10 +260,10 @@ if (trimmedQuery.nonEmpty) { try { val conn = request2Session(request).conn - using(conn.prepareStatement(query)) { + Using.resource(conn.prepareStatement(query)) { stmt => if (trimmedQuery.toUpperCase.startsWith("SELECT")) { - using(stmt.executeQuery()) { + Using.resource(stmt.executeQuery()) { rs => val meta = rs.getMetaData val columns = for (i <- 1 to meta.getColumnCount) yield { @@ -305,7 +306,7 @@ } SshServer.start(sshAddress, baseUrl) } - flash += "info" -> "System settings has been updated." + flash.update("info", "System settings has been updated.") redirect("/admin/system") }) @@ -333,7 +334,7 @@ post("/admin/plugins/_reload")(adminOnly { PluginRegistry.reload(request.getServletContext(), loadSystemSettings(), request2Session(request).conn) - flash += "info" -> "All plugins were reloaded." + flash.update("info", "All plugins were reloaded.") redirect("/admin/plugins") }) @@ -343,7 +344,7 @@ if (PluginRegistry().getPlugins().exists(_.pluginId == pluginId)) { PluginRegistry .uninstall(pluginId, request.getServletContext, loadSystemSettings(), request2Session(request).conn) - flash += "info" -> s"${pluginId} was uninstalled." + flash.update("info", s"${pluginId} was uninstalled.") } redirect("/admin/plugins") @@ -391,7 +392,7 @@ getAccountByUserName(userName, true).map { account => if (account.isAdmin && (form.isRemoved || !form.isAdmin) && isLastAdministrator(account)) { - flash += "error" -> "Account can't be turned off because this is last one administrator." + flash.update("error", "Account can't be turned off because this is last one administrator.") redirect(s"/admin/users/${userName}/_edituser") } else { if (form.isRemoved) { @@ -516,7 +517,7 @@ response.setHeader("Content-Disposition", "attachment; filename=" + file.getName) response.setContentLength(file.length.toInt) - using(new FileInputStream(file)) { in => + Using.resource(new FileInputStream(file)) { in => IOUtils.copy(in, response.outputStream) } diff --git a/src/main/scala/gitbucket/core/controller/WikiController.scala b/src/main/scala/gitbucket/core/controller/WikiController.scala index 319f19f..0441df4 100644 --- a/src/main/scala/gitbucket/core/controller/WikiController.scala +++ b/src/main/scala/gitbucket/core/controller/WikiController.scala @@ -13,6 +13,7 @@ import org.scalatra.forms._ import org.eclipse.jgit.api.Git import org.scalatra.i18n.Messages +import scala.util.Using class WikiController extends WikiControllerBase @@ -90,7 +91,7 @@ get("/:owner/:repository/wiki/:page/_history")(referrersOnly { repository => val pageName = StringUtil.urlDecode(params("page")) - using(Git.open(getWikiRepositoryDir(repository.owner, repository.name))) { git => + Using.resource(Git.open(getWikiRepositoryDir(repository.owner, repository.name))) { git => JGitUtil.getCommitLog(git, "master", path = pageName + ".md") match { case Right((logs, hasNext)) => html.history(Some(pageName), logs, repository, isEditable(repository)) case Left(_) => NotFound() @@ -102,7 +103,7 @@ val pageName = StringUtil.urlDecode(params("page")) val Array(from, to) = params("commitId").split("\\.\\.\\.") - using(Git.open(getWikiRepositoryDir(repository.owner, repository.name))) { git => + Using.resource(Git.open(getWikiRepositoryDir(repository.owner, repository.name))) { git => html.compare( Some(pageName), from, @@ -118,7 +119,7 @@ get("/:owner/:repository/wiki/_compare/:commitId")(referrersOnly { repository => val Array(from, to) = params("commitId").split("\\.\\.\\.") - using(Git.open(getWikiRepositoryDir(repository.owner, repository.name))) { git => + Using.resource(Git.open(getWikiRepositoryDir(repository.owner, repository.name))) { git => html.compare( None, from, @@ -139,7 +140,7 @@ if (revertWikiPage(repository.owner, repository.name, from, to, context.loginAccount.get, Some(pageName))) { redirect(s"/${repository.owner}/${repository.name}/wiki/${StringUtil.urlEncode(pageName)}") } else { - flash += "info" -> "This patch was not able to be reversed." + flash.update("info", "This patch was not able to be reversed.") redirect( s"/${repository.owner}/${repository.name}/wiki/${StringUtil.urlEncode(pageName)}/_compare/${from}...${to}" ) @@ -154,7 +155,7 @@ if (revertWikiPage(repository.owner, repository.name, from, to, context.loginAccount.get, None)) { redirect(s"/${repository.owner}/${repository.name}/wiki") } else { - flash += "info" -> "This patch was not able to be reversed." + flash.update("info", "This patch was not able to be reversed.") redirect(s"/${repository.owner}/${repository.name}/wiki/_compare/${from}...${to}") } } else Unauthorized() @@ -269,7 +270,7 @@ }) get("/:owner/:repository/wiki/_history")(referrersOnly { repository => - using(Git.open(getWikiRepositoryDir(repository.owner, repository.name))) { git => + Using.resource(Git.open(getWikiRepositoryDir(repository.owner, repository.name))) { git => JGitUtil.getCommitLog(git, "master") match { case Right((logs, hasNext)) => html.history(None, logs, repository, isEditable(repository)) case Left(_) => NotFound() @@ -279,7 +280,7 @@ get("/:owner/:repository/wiki/_blob/*")(referrersOnly { repository => val path = multiParams("splat").head - using(Git.open(getWikiRepositoryDir(repository.owner, repository.name))) { git => + Using.resource(Git.open(getWikiRepositoryDir(repository.owner, repository.name))) { git => val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve("master")) getPathObjectId(git, path, revCommit).map { objectId => diff --git a/src/main/scala/gitbucket/core/controller/api/ApiGitReferenceControllerBase.scala b/src/main/scala/gitbucket/core/controller/api/ApiGitReferenceControllerBase.scala index 9069733..1b97741 100644 --- a/src/main/scala/gitbucket/core/controller/api/ApiGitReferenceControllerBase.scala +++ b/src/main/scala/gitbucket/core/controller/api/ApiGitReferenceControllerBase.scala @@ -3,10 +3,11 @@ import gitbucket.core.controller.ControllerBase import gitbucket.core.util.Directory.getRepositoryDir import gitbucket.core.util.ReferrerAuthenticator -import gitbucket.core.util.SyntaxSugars.using import gitbucket.core.util.Implicits._ import org.eclipse.jgit.api.Git -import scala.collection.JavaConverters._ + +import scala.jdk.CollectionConverters._ +import scala.util.Using trait ApiGitReferenceControllerBase extends ControllerBase { self: ReferrerAuthenticator => @@ -17,7 +18,7 @@ */ get("/api/v3/repos/:owner/:repository/git/refs/*")(referrersOnly { repository => val revstr = multiParams("splat").head - using(Git.open(getRepositoryDir(params("owner"), params("repository")))) { git => + Using.resource(Git.open(getRepositoryDir(params("owner"), params("repository")))) { git => val ref = git.getRepository().findRef(revstr) if (ref != null) { diff --git a/src/main/scala/gitbucket/core/controller/api/ApiPullRequestControllerBase.scala b/src/main/scala/gitbucket/core/controller/api/ApiPullRequestControllerBase.scala index 9872d07..63996a1 100644 --- a/src/main/scala/gitbucket/core/controller/api/ApiPullRequestControllerBase.scala +++ b/src/main/scala/gitbucket/core/controller/api/ApiPullRequestControllerBase.scala @@ -13,7 +13,7 @@ import org.eclipse.jgit.api.Git import org.scalatra.NoContent -import scala.collection.JavaConverters._ +import scala.jdk.CollectionConverters._ trait ApiPullRequestControllerBase extends ControllerBase { self: AccountService diff --git a/src/main/scala/gitbucket/core/controller/api/ApiRepositoryBranchControllerBase.scala b/src/main/scala/gitbucket/core/controller/api/ApiRepositoryBranchControllerBase.scala index 04f42f6..6ecd316 100644 --- a/src/main/scala/gitbucket/core/controller/api/ApiRepositoryBranchControllerBase.scala +++ b/src/main/scala/gitbucket/core/controller/api/ApiRepositoryBranchControllerBase.scala @@ -3,11 +3,11 @@ import gitbucket.core.controller.ControllerBase import gitbucket.core.service.{AccountService, ProtectedBranchService, RepositoryService} import gitbucket.core.util._ -import gitbucket.core.util.SyntaxSugars._ import gitbucket.core.util.Directory._ import gitbucket.core.util.Implicits._ import gitbucket.core.util.JGitUtil.getBranches import org.eclipse.jgit.api.Git +import scala.util.Using trait ApiRepositoryBranchControllerBase extends ControllerBase { self: RepositoryService @@ -25,7 +25,7 @@ * https://developer.github.com/v3/repos/branches/#list-branches */ get("/api/v3/repos/:owner/:repository/branches")(referrersOnly { repository => - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => + Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => JsonFormat( JGitUtil .getBranches( @@ -45,7 +45,7 @@ * https://developer.github.com/v3/repos/branches/#get-branch */ get("/api/v3/repos/:owner/:repository/branches/*")(referrersOnly { repository => - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { + Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => (for { branch <- params.get("splat") if repository.branchList.contains(branch) @@ -214,7 +214,7 @@ */ patch("/api/v3/repos/:owner/:repository/branches/*")(ownerOnly { repository => import gitbucket.core.api._ - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { + Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => (for { branch <- params.get("splat") if repository.branchList.contains(branch) diff --git a/src/main/scala/gitbucket/core/controller/api/ApiRepositoryCommitControllerBase.scala b/src/main/scala/gitbucket/core/controller/api/ApiRepositoryCommitControllerBase.scala index 5455f9c..92173b7 100644 --- a/src/main/scala/gitbucket/core/controller/api/ApiRepositoryCommitControllerBase.scala +++ b/src/main/scala/gitbucket/core/controller/api/ApiRepositoryCommitControllerBase.scala @@ -7,9 +7,9 @@ import gitbucket.core.util.Implicits._ import gitbucket.core.util.JGitUtil.CommitInfo import gitbucket.core.util.{JGitUtil, ReferrerAuthenticator, RepositoryName} -import gitbucket.core.util.SyntaxSugars.using import org.eclipse.jgit.api.Git import org.eclipse.jgit.revwalk.RevWalk +import scala.util.Using trait ApiRepositoryCommitControllerBase extends ControllerBase { self: AccountService with CommitsService with ReferrerAuthenticator => @@ -27,11 +27,11 @@ val name = repository.name val sha = params("sha") - using(Git.open(getRepositoryDir(owner, name))) { + Using.resource(Git.open(getRepositoryDir(owner, name))) { git => val repo = git.getRepository val objectId = repo.resolve(sha) - val commitInfo = using(new RevWalk(repo)) { revWalk => + val commitInfo = Using.resource(new RevWalk(repo)) { revWalk => new CommitInfo(revWalk.parseCommit(objectId)) } diff --git a/src/main/scala/gitbucket/core/controller/api/ApiRepositoryControllerBase.scala b/src/main/scala/gitbucket/core/controller/api/ApiRepositoryControllerBase.scala index 5c4b13d..fa6740e 100644 --- a/src/main/scala/gitbucket/core/controller/api/ApiRepositoryControllerBase.scala +++ b/src/main/scala/gitbucket/core/controller/api/ApiRepositoryControllerBase.scala @@ -6,12 +6,12 @@ import gitbucket.core.util.Directory.getRepositoryDir import gitbucket.core.util._ import gitbucket.core.util.Implicits._ -import gitbucket.core.util.SyntaxSugars.using import gitbucket.core.model.Profile.profile.blockingApi._ import org.eclipse.jgit.api.Git import scala.concurrent.Await import scala.concurrent.duration.Duration +import scala.util.Using trait ApiRepositoryControllerBase extends ControllerBase { self: RepositoryService @@ -193,7 +193,7 @@ */ get("/api/v3/repos/:owner/:repository/raw/*")(referrersOnly { repository => val (id, path) = repository.splitPath(multiParams("splat").head) - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => + Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id)) getPathObjectId(git, path, revCommit).map { objectId => diff --git a/src/main/scala/gitbucket/core/plugin/Plugin.scala b/src/main/scala/gitbucket/core/plugin/Plugin.scala index e5ccb59..6d2979d 100644 --- a/src/main/scala/gitbucket/core/plugin/Plugin.scala +++ b/src/main/scala/gitbucket/core/plugin/Plugin.scala @@ -6,10 +6,10 @@ import gitbucket.core.model.{Account, Issue} import gitbucket.core.service.RepositoryService.RepositoryInfo import gitbucket.core.service.SystemSettingsService.SystemSettings -import gitbucket.core.util.SyntaxSugars._ import io.github.gitbucket.solidbase.model.Version import org.apache.sshd.server.command.Command import play.twirl.api.Html +import scala.util.Using /** * Trait for define plugin interface. @@ -434,7 +434,7 @@ * Helper method to get a resource from classpath. */ protected def fromClassPath(path: String): Array[Byte] = - using(getClass.getClassLoader.getResourceAsStream(path)) { in => + Using.resource(getClass.getClassLoader.getResourceAsStream(path)) { in => val bytes = new Array[Byte](in.available) in.read(bytes) bytes diff --git a/src/main/scala/gitbucket/core/plugin/PluginRegistry.scala b/src/main/scala/gitbucket/core/plugin/PluginRegistry.scala index 4dcd05e..b633691 100644 --- a/src/main/scala/gitbucket/core/plugin/PluginRegistry.scala +++ b/src/main/scala/gitbucket/core/plugin/PluginRegistry.scala @@ -17,17 +17,15 @@ import gitbucket.core.service.SystemSettingsService.SystemSettings import gitbucket.core.util.DatabaseConfig import gitbucket.core.util.Directory._ -import gitbucket.core.util.HttpClientUtil._ import io.github.gitbucket.solidbase.Solidbase import io.github.gitbucket.solidbase.manager.JDBCVersionManager import io.github.gitbucket.solidbase.model.Module import org.apache.commons.io.FileUtils -import org.apache.http.client.methods.HttpGet import org.apache.sshd.server.command.Command import org.slf4j.LoggerFactory import play.twirl.api.Html -import scala.collection.JavaConverters._ +import scala.jdk.CollectionConverters._ class PluginRegistry { @@ -415,7 +413,6 @@ class PluginWatchThread(context: ServletContext, dir: String) extends Thread with SystemSettingsService { import gitbucket.core.model.Profile.profile.blockingApi._ - import scala.collection.JavaConverters._ private val logger = LoggerFactory.getLogger(classOf[PluginWatchThread]) @@ -445,7 +442,7 @@ } if (events.nonEmpty) { events.foreach { event => - logger.info(event.kind + ": " + event.context) + logger.info(s"${event.kind}: ${event.context}") } new Thread { override def run(): Unit = { diff --git a/src/main/scala/gitbucket/core/service/GpgKeyService.scala b/src/main/scala/gitbucket/core/service/GpgKeyService.scala index 3e10b93..560af3f 100644 --- a/src/main/scala/gitbucket/core/service/GpgKeyService.scala +++ b/src/main/scala/gitbucket/core/service/GpgKeyService.scala @@ -3,14 +3,14 @@ import java.io.ByteArrayInputStream import gitbucket.core.model.GpgKey - -import collection.JavaConverters._ import gitbucket.core.model.Profile._ import gitbucket.core.model.Profile.profile.blockingApi._ import org.bouncycastle.bcpg.ArmoredInputStream import org.bouncycastle.openpgp.PGPPublicKeyRing import org.bouncycastle.openpgp.bc.BcPGPObjectFactory +import scala.jdk.CollectionConverters._ + trait GpgKeyService { def getGpgPublicKeys(userName: String)(implicit s: Session): List[GpgKey] = GpgKeys.filter(_.userName === userName.bind).sortBy(_.gpgKeyId).list diff --git a/src/main/scala/gitbucket/core/service/IssuesService.scala b/src/main/scala/gitbucket/core/service/IssuesService.scala index 29665bd..9dbc344 100644 --- a/src/main/scala/gitbucket/core/service/IssuesService.scala +++ b/src/main/scala/gitbucket/core/service/IssuesService.scala @@ -752,7 +752,7 @@ implicit s: Session ): Unit = { extractIssueId(message).foreach { issueId => - val content = fromIssue.issueId + ":" + fromIssue.title + val content = s"${fromIssue.issueId}:${fromIssue.title}" if (getIssue(owner, repository, issueId).isDefined) { // Not add if refer comment already exist. if (!getComments(owner, repository, issueId.toInt).exists { x => diff --git a/src/main/scala/gitbucket/core/service/MergeService.scala b/src/main/scala/gitbucket/core/service/MergeService.scala index 6122374..ac897b1 100644 --- a/src/main/scala/gitbucket/core/service/MergeService.scala +++ b/src/main/scala/gitbucket/core/service/MergeService.scala @@ -7,9 +7,6 @@ import gitbucket.core.service.RepositoryService.RepositoryInfo import gitbucket.core.util.Directory._ import gitbucket.core.util.{JGitUtil, LockUtil} -import gitbucket.core.util.SyntaxSugars._ -import gitbucket.core.model.Profile._ -import gitbucket.core.model.Profile.profile._ import gitbucket.core.model.Profile.profile.blockingApi._ import org.eclipse.jgit.merge.{MergeStrategy, Merger, RecursiveMerger} import org.eclipse.jgit.api.Git @@ -18,7 +15,8 @@ import org.eclipse.jgit.lib.{CommitBuilder, ObjectId, PersonIdent, Repository} import org.eclipse.jgit.revwalk.{RevCommit, RevWalk} -import scala.collection.JavaConverters._ +import scala.jdk.CollectionConverters._ +import scala.util.Using trait MergeService { self: AccountService @@ -35,7 +33,7 @@ * Returns true if conflict will be caused. */ def checkConflict(userName: String, repositoryName: String, branch: String, issueId: Int): Option[String] = { - using(Git.open(getRepositoryDir(userName, repositoryName))) { git => + Using.resource(Git.open(getRepositoryDir(userName, repositoryName))) { git => new MergeCacheInfo(git, branch, issueId).checkConflict() } } @@ -52,7 +50,7 @@ branch: String, issueId: Int ): Option[Option[String]] = { - using(Git.open(getRepositoryDir(userName, repositoryName))) { git => + Using.resource(Git.open(getRepositoryDir(userName, repositoryName))) { git => new MergeCacheInfo(git, branch, issueId).checkConflictCache() } } @@ -99,7 +97,7 @@ requestBranch: String, issueId: Int ): Unit = { - using(Git.open(getRepositoryDir(userName, repositoryName))) { git => + Using.resource(Git.open(getRepositoryDir(userName, repositoryName))) { git => git.fetch .setRemote(getRepositoryDir(requestUserName, requestRepositoryName).toURI.toString) .setRefSpecs(new RefSpec(s"refs/heads/${requestBranch}:refs/pull/${issueId}/head")) @@ -118,7 +116,7 @@ remoteRepositoryName: String, remoteBranch: String ): Either[String, (ObjectId, ObjectId, ObjectId)] = { - using(Git.open(getRepositoryDir(localUserName, localRepositoryName))) { git => + Using.resource(Git.open(getRepositoryDir(localUserName, localRepositoryName))) { git => val remoteRefName = s"refs/heads/${remoteBranch}" val tmpRefName = s"refs/remote-temp/${remoteUserName}/${remoteRepositoryName}/${remoteBranch}" val refSpec = new RefSpec(s"${remoteRefName}:${tmpRefName}").setForceUpdate(true) @@ -177,7 +175,7 @@ val remoteRepositoryName = remoteRepository.name tryMergeRemote(localUserName, localRepositoryName, localBranch, remoteUserName, remoteRepositoryName, remoteBranch).map { case (newTreeId, oldBaseId, oldHeadId) => - using(Git.open(getRepositoryDir(localUserName, localRepositoryName))) { git => + Using.resource(Git.open(getRepositoryDir(localUserName, localRepositoryName))) { git => val existIds = JGitUtil.getAllCommitIds(git).toSet val committer = new PersonIdent(loginAccount.fullName, loginAccount.mailAddress) @@ -261,7 +259,7 @@ getPullRequest(repository.owner, repository.name, issueId) .map { case (issue, pullreq) => - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => + Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => // mark issue as merged and close. val commentId = createComment(repository.owner, repository.name, loginAccount.userName, issueId, message, "merge") @@ -280,11 +278,13 @@ pullreq.commitIdTo ) - val revCommits = using(new RevWalk(git.getRepository)) { revWalk => - commits.flatten.map { commit => - revWalk.parseCommit(git.getRepository.resolve(commit.id)) + val revCommits = Using + .resource(new RevWalk(git.getRepository)) { revWalk => + commits.flatten.map { commit => + revWalk.parseCommit(git.getRepository.resolve(commit.id)) + } } - }.reverse + .reverse // merge git repository (strategy match { @@ -404,7 +404,7 @@ mergeCommit.setCommitter(committer) mergeCommit.setMessage(message) // insertObject and got mergeCommit Object Id - using(repository.newObjectInserter) { inserter => + Using.resource(repository.newObjectInserter) { inserter => val mergeCommitId = inserter.insert(mergeCommit) inserter.flush() mergeCommitId @@ -472,7 +472,7 @@ } catch { case e: NoMergeBaseException => true } - val mergeTipCommit = using(new RevWalk(repository))(_.parseCommit(mergeTip)) + val mergeTipCommit = Using.resource(new RevWalk(repository))(_.parseCommit(mergeTip)) val committer = mergeTipCommit.getCommitterIdent def _updateBranch(treeId: ObjectId, message: String, branchName: String): Unit = { @@ -525,10 +525,10 @@ newCommit } - val mergeBaseTipCommit = using(new RevWalk(repository))(_.parseCommit(mergeBaseTip)) + val mergeBaseTipCommit = Using.resource(new RevWalk(repository))(_.parseCommit(mergeBaseTip)) var previousId = mergeBaseTipCommit.getId - using(repository.newObjectInserter) { inserter => + Using.resource(repository.newObjectInserter) { inserter => commits.foreach { commit => val nextCommit = _cloneCommit(commit, previousId, mergeBaseTipCommit.getId) previousId = inserter.insert(nextCommit) @@ -544,8 +544,9 @@ throw new RuntimeException("This pull request can't merge automatically.") } - val mergeBaseTipCommit = using(new RevWalk(repository))(_.parseCommit(mergeBaseTip)) - val mergeBranchHeadCommit = using(new RevWalk(repository))(_.parseCommit(repository.resolve(mergedBranchName))) + val mergeBaseTipCommit = Using.resource(new RevWalk(repository))(_.parseCommit(mergeBaseTip)) + val mergeBranchHeadCommit = + Using.resource(new RevWalk(repository))(_.parseCommit(repository.resolve(mergedBranchName))) // Create squash commit val mergeCommit = new CommitBuilder() @@ -556,7 +557,7 @@ mergeCommit.setMessage(message) // insertObject and got squash commit Object Id - val newCommitId = using(repository.newObjectInserter) { inserter => + val newCommitId = Using.resource(repository.newObjectInserter) { inserter => val newCommitId = inserter.insert(mergeCommit) inserter.flush() newCommitId @@ -579,7 +580,7 @@ private def createMergeCommit(treeId: ObjectId, committer: PersonIdent, message: String) = Util.createMergeCommit(repository, treeId, committer, message, Seq[ObjectId](mergeBaseTip, mergeTip)) - private def parseCommit(id: ObjectId) = using(new RevWalk(repository))(_.parseCommit(id)) + private def parseCommit(id: ObjectId) = Using.resource(new RevWalk(repository))(_.parseCommit(id)) } diff --git a/src/main/scala/gitbucket/core/service/OpenIDConnectService.scala b/src/main/scala/gitbucket/core/service/OpenIDConnectService.scala index 2b60dce..36ace5d 100644 --- a/src/main/scala/gitbucket/core/service/OpenIDConnectService.scala +++ b/src/main/scala/gitbucket/core/service/OpenIDConnectService.scala @@ -17,7 +17,7 @@ import gitbucket.core.model.Profile.profile.blockingApi._ import org.slf4j.LoggerFactory -import scala.collection.JavaConverters.{asScalaSet, mapAsJavaMap} +import scala.jdk.CollectionConverters._ /** * Service class for the OpenID Connect authentication. @@ -101,7 +101,7 @@ redirectURI: URI ): Option[AuthenticationSuccessResponse] = try { - AuthenticationResponseParser.parse(redirectURI, mapAsJavaMap(params)) match { + AuthenticationResponseParser.parse(redirectURI, params.asJava) match { case response: AuthenticationSuccessResponse => if (response.getState == state) { Some(response) @@ -207,5 +207,5 @@ "RSA" -> Family.RSA, "ECDSA" -> Family.EC, "EdDSA" -> Family.ED - ).toMap.map { case (name, family) => (name, asScalaSet(family).toSet) } + ).toMap.map { case (name, family) => (name, family.asScala.toSet) } } diff --git a/src/main/scala/gitbucket/core/service/PullRequestService.scala b/src/main/scala/gitbucket/core/service/PullRequestService.scala index 05d771f..10e9958 100644 --- a/src/main/scala/gitbucket/core/service/PullRequestService.scala +++ b/src/main/scala/gitbucket/core/service/PullRequestService.scala @@ -8,7 +8,6 @@ import gitbucket.core.api.JsonFormat import gitbucket.core.controller.Context import gitbucket.core.plugin.PluginRegistry -import gitbucket.core.util.SyntaxSugars._ import gitbucket.core.util.Directory._ import gitbucket.core.util.Implicits._ import gitbucket.core.util.JGitUtil @@ -19,7 +18,8 @@ import org.eclipse.jgit.api.Git import org.eclipse.jgit.lib.ObjectId -import scala.collection.JavaConverters._ +import scala.jdk.CollectionConverters._ +import scala.util.Using trait PullRequestService { self: IssuesService @@ -387,7 +387,7 @@ requestRepositoryName: String, requestCommitId: String ): (Seq[Seq[CommitInfo]], Seq[DiffInfo]) = - using( + Using.resources( Git.open(getRepositoryDir(userName, repositoryName)), Git.open(getRepositoryDir(requestUserName, requestRepositoryName)) ) { (oldGit, newGit) => @@ -478,7 +478,7 @@ originId: String, forkedId: String ): (Option[ObjectId], Option[ObjectId]) = { - using( + Using.resources( Git.open(getRepositoryDir(originRepository.owner, originRepository.name)), Git.open(getRepositoryDir(forkedRepository.owner, forkedRepository.name)) ) { @@ -544,7 +544,7 @@ lazy val commitStateSummary: (CommitState, String) = { val stateMap = statuses.groupBy(_.state) val state = CommitState.combine(stateMap.keySet) - val summary = stateMap.map { case (keyState, states) => states.size + " " + keyState.name }.mkString(", ") + val summary = stateMap.map { case (keyState, states) => s"${states.size} ${keyState.name}" }.mkString(", ") state -> summary } lazy val statusesAndRequired: List[(CommitStatus, Boolean)] = statuses.map { s => diff --git a/src/main/scala/gitbucket/core/service/RepositoryCommitFileService.scala b/src/main/scala/gitbucket/core/service/RepositoryCommitFileService.scala index a808af0..dd95c82 100644 --- a/src/main/scala/gitbucket/core/service/RepositoryCommitFileService.scala +++ b/src/main/scala/gitbucket/core/service/RepositoryCommitFileService.scala @@ -8,11 +8,11 @@ import gitbucket.core.util.Directory.getRepositoryDir import gitbucket.core.util.JGitUtil.CommitInfo import gitbucket.core.util.{JGitUtil, LockUtil} -import gitbucket.core.util.SyntaxSugars.using import org.eclipse.jgit.api.Git import org.eclipse.jgit.dircache.{DirCache, DirCacheBuilder} import org.eclipse.jgit.lib._ import org.eclipse.jgit.transport.{ReceiveCommand, ReceivePack} +import scala.util.Using trait RepositoryCommitFileService { self: AccountService with ActivityService with IssuesService with PullRequestService with WebHookPullRequestService => @@ -117,7 +117,7 @@ )(implicit s: Session, c: JsonFormat.Context): ObjectId = { LockUtil.lock(s"${repository.owner}/${repository.name}") { - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => + Using.resource(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => val builder = DirCache.newInCore.builder() val inserter = git.getRepository.newObjectInserter() val headName = s"refs/heads/${branch}" diff --git a/src/main/scala/gitbucket/core/service/RepositorySearchService.scala b/src/main/scala/gitbucket/core/service/RepositorySearchService.scala index a06af1d..5458659 100644 --- a/src/main/scala/gitbucket/core/service/RepositorySearchService.scala +++ b/src/main/scala/gitbucket/core/service/RepositorySearchService.scala @@ -4,12 +4,12 @@ import gitbucket.core.util._ import gitbucket.core.util.StringUtil import Directory._ -import SyntaxSugars._ import org.eclipse.jgit.revwalk.RevWalk import org.eclipse.jgit.treewalk.TreeWalk import org.eclipse.jgit.lib.FileMode import org.eclipse.jgit.api.Git import gitbucket.core.model.Profile.profile.blockingApi._ +import scala.util.Using trait RepositorySearchService { self: IssuesService => import RepositorySearchService._ @@ -37,12 +37,12 @@ } def countFiles(owner: String, repository: String, query: String): Int = - using(Git.open(getRepositoryDir(owner, repository))) { git => + Using.resource(Git.open(getRepositoryDir(owner, repository))) { git => if (JGitUtil.isEmpty(git)) 0 else searchRepositoryFiles(git, query).length } def searchFiles(owner: String, repository: String, query: String): List[FileSearchResult] = - using(Git.open(getRepositoryDir(owner, repository))) { git => + Using.resource(Git.open(getRepositoryDir(owner, repository))) { git => if (JGitUtil.isEmpty(git)) { Nil } else { @@ -57,12 +57,12 @@ } def countWikiPages(owner: String, repository: String, query: String): Int = - using(Git.open(Directory.getWikiRepositoryDir(owner, repository))) { git => + Using.resource(Git.open(Directory.getWikiRepositoryDir(owner, repository))) { git => if (JGitUtil.isEmpty(git)) 0 else searchRepositoryFiles(git, query).length } def searchWikiPages(owner: String, repository: String, query: String): List[FileSearchResult] = - using(Git.open(Directory.getWikiRepositoryDir(owner, repository))) { git => + Using.resource(Git.open(Directory.getWikiRepositoryDir(owner, repository))) { git => if (JGitUtil.isEmpty(git)) { Nil } else { diff --git a/src/main/scala/gitbucket/core/service/RepositoryService.scala b/src/main/scala/gitbucket/core/service/RepositoryService.scala index 2f152db..3081952 100644 --- a/src/main/scala/gitbucket/core/service/RepositoryService.scala +++ b/src/main/scala/gitbucket/core/service/RepositoryService.scala @@ -17,6 +17,7 @@ import org.eclipse.jgit.dircache.{DirCache, DirCacheBuilder} import org.eclipse.jgit.lib.{Repository => _, _} import org.eclipse.jgit.transport.{ReceiveCommand, ReceivePack} +import scala.util.Using trait RepositoryService { self: AccountService => @@ -763,7 +764,7 @@ } // Get template file from project root. When didn't find, will lookup default folder. - using(Git.open(Directory.getRepositoryDir(repository.owner, repository.name))) { git => + Using.resource(Git.open(Directory.getRepositoryDir(repository.owner, repository.name))) { git => choiceTemplate(JGitUtil.getFileList(git, repository.repository.defaultBranch, ".")) .orElse { choiceTemplate(JGitUtil.getFileList(git, repository.repository.defaultBranch, ".gitbucket")) diff --git a/src/main/scala/gitbucket/core/service/SystemSettingsService.scala b/src/main/scala/gitbucket/core/service/SystemSettingsService.scala index 93e896c..8f4e50e 100644 --- a/src/main/scala/gitbucket/core/service/SystemSettingsService.scala +++ b/src/main/scala/gitbucket/core/service/SystemSettingsService.scala @@ -8,6 +8,7 @@ import gitbucket.core.util.ConfigUtil._ import gitbucket.core.util.Directory._ import gitbucket.core.util.SyntaxSugars._ +import scala.util.Using trait SystemSettingsService { @@ -70,7 +71,7 @@ props.setProperty(SkinName, settings.skinName.toString) props.setProperty(ShowMailAddress, settings.showMailAddress.toString) - using(new java.io.FileOutputStream(GitBucketConf)) { out => + Using.resource(new java.io.FileOutputStream(GitBucketConf)) { out => props.store(out, null) } } @@ -79,7 +80,7 @@ def loadSystemSettings(): SystemSettings = { defining(new java.util.Properties()) { props => if (GitBucketConf.exists) { - using(new java.io.FileInputStream(GitBucketConf)) { in => + Using.resource(new java.io.FileInputStream(GitBucketConf)) { in => props.load(in) } } diff --git a/src/main/scala/gitbucket/core/service/WebHookService.scala b/src/main/scala/gitbucket/core/service/WebHookService.scala index d3dff04..4da84b0 100644 --- a/src/main/scala/gitbucket/core/service/WebHookService.scala +++ b/src/main/scala/gitbucket/core/service/WebHookService.scala @@ -55,6 +55,7 @@ .map { case (w, t) => w -> t.event } .list .groupBy(_._1) + .view .mapValues(_.map(_._2).toSet) .toList .sortBy(_._1.url) @@ -87,6 +88,7 @@ .map { case (w, t) => w -> t.event } .list .groupBy(_._1) + .view .mapValues(_.map(_._2).toSet) .headOption @@ -136,6 +138,7 @@ .map { case (w, t) => w -> t.event } .list .groupBy(_._1) + .view .mapValues(_.map(_._2).toSet) .toList .sortBy(_._1.url) @@ -164,6 +167,7 @@ .map { case (w, t) => w -> t.event } .list .groupBy(_._1) + .view .mapValues(_.map(_._2).toSet) .headOption @@ -396,7 +400,7 @@ if wht.event === WebHook.PullRequest.asInstanceOf[WebHook.Event].bind && wht.byRepositoryWebHook(wh) } yield { ((is, iu, pr, bu, ru), wh) - }).list.groupBy(_._1).mapValues(_.map(_._2)) + }).list.groupBy(_._1).map { case (k, v) => (k, v.map(_._2)) } def callPullRequestWebHookByRequestBranch( action: String, diff --git a/src/main/scala/gitbucket/core/service/WikiService.scala b/src/main/scala/gitbucket/core/service/WikiService.scala index 9330fa4..bdae1c7 100644 --- a/src/main/scala/gitbucket/core/service/WikiService.scala +++ b/src/main/scala/gitbucket/core/service/WikiService.scala @@ -14,7 +14,9 @@ import java.io.ByteArrayInputStream import org.eclipse.jgit.patch._ import org.eclipse.jgit.api.errors.PatchFormatException -import scala.collection.JavaConverters._ + +import scala.jdk.CollectionConverters._ +import scala.util.Using object WikiService { @@ -73,7 +75,7 @@ * Returns the wiki page. */ def getWikiPage(owner: String, repository: String, pageName: String): Option[WikiPageInfo] = { - using(Git.open(Directory.getWikiRepositoryDir(owner, repository))) { git => + Using.resource(Git.open(Directory.getWikiRepositoryDir(owner, repository))) { git => if (!JGitUtil.isEmpty(git)) { JGitUtil.getFileList(git, "master", ".").find(_.name == pageName + ".md").map { file => WikiPageInfo( @@ -92,7 +94,7 @@ * Returns the list of wiki page names. */ def getWikiPageList(owner: String, repository: String): List[String] = { - using(Git.open(Directory.getWikiRepositoryDir(owner, repository))) { git => + Using.resource(Git.open(Directory.getWikiRepositoryDir(owner, repository))) { git => JGitUtil .getFileList(git, "master", ".") .filter(_.name.endsWith(".md")) @@ -118,7 +120,7 @@ try { LockUtil.lock(s"${owner}/${repository}/wiki") { - using(Git.open(Directory.getWikiRepositoryDir(owner, repository))) { git => + Using.resource(Git.open(Directory.getWikiRepositoryDir(owner, repository))) { git => val reader = git.getRepository.newObjectReader val oldTreeIter = new CanonicalTreeParser oldTreeIter.reset(reader, git.getRepository.resolve(from + "^{tree}")) @@ -133,7 +135,7 @@ } } - val patch = using(new java.io.ByteArrayOutputStream()) { out => + val patch = Using.resource(new java.io.ByteArrayOutputStream()) { out => val formatter = new DiffFormatter(out) formatter.setRepository(git.getRepository) formatter.format(diffs.asJava) @@ -237,7 +239,7 @@ currentId: Option[String] ): Option[String] = { LockUtil.lock(s"${owner}/${repository}/wiki") { - using(Git.open(Directory.getWikiRepositoryDir(owner, repository))) { git => + Using.resource(Git.open(Directory.getWikiRepositoryDir(owner, repository))) { git => val builder = DirCache.newInCore.builder() val inserter = git.getRepository.newObjectInserter() val headId = git.getRepository.resolve(Constants.HEAD + "^{commit}") @@ -309,7 +311,7 @@ message: String ): Unit = { LockUtil.lock(s"${owner}/${repository}/wiki") { - using(Git.open(Directory.getWikiRepositoryDir(owner, repository))) { git => + Using.resource(Git.open(Directory.getWikiRepositoryDir(owner, repository))) { git => val builder = DirCache.newInCore.builder() val inserter = git.getRepository.newObjectInserter() val headId = git.getRepository.resolve(Constants.HEAD + "^{commit}") diff --git a/src/main/scala/gitbucket/core/servlet/ApiAuthenticationFilter.scala b/src/main/scala/gitbucket/core/servlet/ApiAuthenticationFilter.scala index 04cd7fc..82cd80e 100644 --- a/src/main/scala/gitbucket/core/servlet/ApiAuthenticationFilter.scala +++ b/src/main/scala/gitbucket/core/servlet/ApiAuthenticationFilter.scala @@ -8,6 +8,9 @@ import gitbucket.core.service.{AccessTokenService, AccountService, SystemSettingsService} import gitbucket.core.util.{AuthUtil, Keys} import gitbucket.core.model.Profile.profile.blockingApi._ +// Imported names have higher precedence than names, defined in other files. +// If Database is not bound by explicit import, then "Database" refers to the Database introduced by the wildcard import above. +import gitbucket.core.servlet.Database class ApiAuthenticationFilter extends Filter with AccessTokenService with AccountService with SystemSettingsService { diff --git a/src/main/scala/gitbucket/core/servlet/GitAuthenticationFilter.scala b/src/main/scala/gitbucket/core/servlet/GitAuthenticationFilter.scala index 71d8144..e299d4e 100644 --- a/src/main/scala/gitbucket/core/servlet/GitAuthenticationFilter.scala +++ b/src/main/scala/gitbucket/core/servlet/GitAuthenticationFilter.scala @@ -4,12 +4,16 @@ import javax.servlet.http._ import gitbucket.core.model.Account -import gitbucket.core.model.Profile.profile.blockingApi._ import gitbucket.core.plugin.{GitRepositoryFilter, GitRepositoryRouting, PluginRegistry} import gitbucket.core.service.SystemSettingsService.SystemSettings import gitbucket.core.service.{AccessTokenService, AccountService, RepositoryService, SystemSettingsService} import gitbucket.core.util.Implicits._ -import gitbucket.core.util.{AuthUtil, Implicits, Keys} +import gitbucket.core.util.{AuthUtil, Keys} +import gitbucket.core.model.Profile.profile.blockingApi._ +// Imported names have higher precedence than names, defined in other files. +// If Database is not bound by explicit import, then "Database" refers to the Database introduced by the wildcard import above. +import gitbucket.core.servlet.Database + import org.slf4j.LoggerFactory /** diff --git a/src/main/scala/gitbucket/core/servlet/GitLfsTransferServlet.scala b/src/main/scala/gitbucket/core/servlet/GitLfsTransferServlet.scala index 62b61dc..17f1a34 100644 --- a/src/main/scala/gitbucket/core/servlet/GitLfsTransferServlet.scala +++ b/src/main/scala/gitbucket/core/servlet/GitLfsTransferServlet.scala @@ -8,7 +8,8 @@ import org.apache.commons.io.{FileUtils, IOUtils} import org.json4s.jackson.Serialization._ import org.apache.http.HttpStatus -import gitbucket.core.util.SyntaxSugars._ + +import scala.util.Using /** * Provides GitLFS Transfer API @@ -29,7 +30,7 @@ res.setStatus(HttpStatus.SC_OK) res.setContentType("application/octet-stream") res.setHeader("Content-Length", file.length.toString) - using(new FileInputStream(file), res.getOutputStream) { (in, out) => + Using.resources(new FileInputStream(file), res.getOutputStream) { (in, out) => IOUtils.copy(in, out) out.flush() } @@ -45,7 +46,7 @@ } yield { val file = new File(FileUtil.getLfsFilePath(owner, repository, oid)) FileUtils.forceMkdir(file.getParentFile) - using(req.getInputStream, new FileOutputStream(file)) { (in, out) => + Using.resources(req.getInputStream, new FileOutputStream(file)) { (in, out) => IOUtils.copy(in, out) } res.setStatus(HttpStatus.SC_OK) @@ -71,7 +72,7 @@ private def sendError(res: HttpServletResponse, status: Int, message: String): Unit = { res.setStatus(status) - using(res.getWriter()) { out => + Using.resource(res.getWriter()) { out => out.write(write(GitLfs.Error(message))) out.flush() } diff --git a/src/main/scala/gitbucket/core/servlet/GitRepositoryServlet.scala b/src/main/scala/gitbucket/core/servlet/GitRepositoryServlet.scala index 2c9e43f..51e5896 100644 --- a/src/main/scala/gitbucket/core/servlet/GitRepositoryServlet.scala +++ b/src/main/scala/gitbucket/core/servlet/GitRepositoryServlet.scala @@ -4,9 +4,10 @@ import java.util import java.util.Date +import scala.util.Using + import gitbucket.core.api import gitbucket.core.model.WebHook -import gitbucket.core.model.Profile.profile.blockingApi._ import gitbucket.core.plugin.{GitRepositoryRouting, PluginRegistry} import gitbucket.core.service.IssuesService.IssueSearchCondition import gitbucket.core.service.WebHookService._ @@ -14,6 +15,11 @@ import gitbucket.core.util.SyntaxSugars._ import gitbucket.core.util.Implicits._ import gitbucket.core.util._ +import gitbucket.core.model.Profile.profile.blockingApi._ +// Imported names have higher precedence than names, defined in other files. +// If Database is not bound by explicit import, then "Database" refers to the Database introduced by the wildcard import above. +import gitbucket.core.servlet.Database + import org.eclipse.jgit.api.Git import org.eclipse.jgit.http.server.GitServlet import org.eclipse.jgit.lib._ @@ -108,7 +114,7 @@ GitLfs.Action( href = baseUrl + "/git-lfs/" + owner + "/" + repository + "/" + requestObject.oid, header = - Map("Authorization" -> StringUtil.encodeBlowfish(timeout + " " + requestObject.oid)), + Map("Authorization" -> StringUtil.encodeBlowfish(s"$timeout ${requestObject.oid}")), expires_at = new Date(timeout) ) ) @@ -129,7 +135,7 @@ GitLfs.Action( href = baseUrl + "/git-lfs/" + owner + "/" + repository + "/" + requestObject.oid, header = - Map("Authorization" -> StringUtil.encodeBlowfish(timeout + " " + requestObject.oid)), + Map("Authorization" -> StringUtil.encodeBlowfish(s"$timeout ${requestObject.oid}")), expires_at = new Date(timeout) ) ) @@ -140,7 +146,7 @@ } res.setContentType("application/vnd.git-lfs+json") - using(res.getWriter) { out => + Using.resource(res.getWriter) { out => out.print(write(batchResponse)) out.flush() } @@ -216,7 +222,7 @@ } } -import scala.collection.JavaConverters._ +import scala.jdk.CollectionConverters._ class CommitLogHook(owner: String, repository: String, pusher: String, baseUrl: String, sshUrl: Option[String]) extends PostReceiveHook @@ -250,7 +256,7 @@ command.setResult(ReceiveCommand.Result.REJECTED_OTHER_REASON, error) } } - using(Git.open(Directory.getRepositoryDir(owner, repository))) { git => + Using.resource(Git.open(Directory.getRepositoryDir(owner, repository))) { git => existIds = JGitUtil.getAllCommitIds(git) } } catch { @@ -265,7 +271,7 @@ def onPostReceive(receivePack: ReceivePack, commands: java.util.Collection[ReceiveCommand]): Unit = { Database() withTransaction { implicit session => try { - using(Git.open(Directory.getRepositoryDir(owner, repository))) { git => + Using.resource(Git.open(Directory.getRepositoryDir(owner, repository))) { git => JGitUtil.removeCache(git) val pushedIds = scala.collection.mutable.Set[String]() @@ -289,7 +295,7 @@ if (JGitUtil.isEmpty(git) && commits.nonEmpty && branchName != repositoryInfo.repository.defaultBranch) { saveRepositoryDefaultBranch(owner, repository, branchName) // Change repository HEAD - using(Git.open(Directory.getRepositoryDir(owner, repository))) { git => + Using.resource(Git.open(Directory.getRepositoryDir(owner, repository))) { git => git.getRepository.updateRef(Constants.HEAD, true).link(Constants.R_HEADS + branchName) } } @@ -443,7 +449,7 @@ commitIds.foreach { case (oldCommitId, newCommitId) => - val commits = using(Git.open(Directory.getWikiRepositoryDir(owner, repository))) { git => + val commits = Using.resource(Git.open(Directory.getWikiRepositoryDir(owner, repository))) { git => JGitUtil.getCommitLog(git, oldCommitId, newCommitId).flatMap { commit => val diffs = JGitUtil.getDiffs(git, None, commit.id, false, false) diffs.collect { diff --git a/src/main/scala/gitbucket/core/servlet/InitializeListener.scala b/src/main/scala/gitbucket/core/servlet/InitializeListener.scala index 74c043c..b2335f1 100644 --- a/src/main/scala/gitbucket/core/servlet/InitializeListener.scala +++ b/src/main/scala/gitbucket/core/servlet/InitializeListener.scala @@ -9,9 +9,12 @@ import gitbucket.core.service.{ActivityService, SystemSettingsService} import gitbucket.core.util.DatabaseConfig import gitbucket.core.util.Directory._ -import gitbucket.core.util.SyntaxSugars._ import gitbucket.core.util.JDBCUtil._ import gitbucket.core.model.Profile.profile.blockingApi._ +// Imported names have higher precedence than names, defined in other files. +// If Database is not bound by explicit import, then "Database" refers to the Database introduced by the wildcard import above. +import gitbucket.core.servlet.Database + import io.github.gitbucket.solidbase.Solidbase import io.github.gitbucket.solidbase.manager.JDBCVersionManager import javax.servlet.{ServletContextEvent, ServletContextListener} @@ -21,7 +24,8 @@ import akka.actor.{Actor, ActorSystem, Props} import com.typesafe.akka.extension.quartz.QuartzSchedulerExtension -import scala.collection.JavaConverters._ +import scala.jdk.CollectionConverters._ +import scala.util.Using /** * Initialize GitBucket system. @@ -138,7 +142,7 @@ logger.info("Extract bundled plugins...") val cl = Thread.currentThread.getContextClassLoader try { - using(cl.getResourceAsStream("bundle-plugins.txt")) { pluginsFile => + Using.resource(cl.getResourceAsStream("bundle-plugins.txt")) { pluginsFile => if (pluginsFile != null) { val plugins = IOUtils.readLines(pluginsFile, "UTF-8") val gitbucketVersion = GitBucketCoreModule.getVersions.asScala.last.getVersion @@ -153,7 +157,7 @@ logger.info(s"Extract to ${file.getAbsolutePath}") FileUtils.forceMkdirParent(file) - using(in, new FileOutputStream(file)) { + Using.resources(in, new FileOutputStream(file)) { case (in, out) => IOUtils.copy(in, out) } } diff --git a/src/main/scala/gitbucket/core/ssh/GitCommand.scala b/src/main/scala/gitbucket/core/ssh/GitCommand.scala index 8e8cfe5..f6a42cb 100644 --- a/src/main/scala/gitbucket/core/ssh/GitCommand.scala +++ b/src/main/scala/gitbucket/core/ssh/GitCommand.scala @@ -11,13 +11,13 @@ import org.slf4j.LoggerFactory import java.io.{File, InputStream, OutputStream} -import SyntaxSugars._ import org.eclipse.jgit.api.Git import Directory._ import gitbucket.core.ssh.PublicKeyAuthenticator.AuthType import org.eclipse.jgit.transport.{ReceivePack, UploadPack} import org.apache.sshd.server.shell.UnknownCommand import org.eclipse.jgit.errors.RepositoryNotFoundException +import scala.util.Using object GitCommand { val DefaultCommandRegex = """\Agit-(upload|receive)-pack '/([a-zA-Z0-9\-_.]+)/([a-zA-Z0-9\-\+_.]+).git'\Z""".r @@ -152,7 +152,7 @@ } if (execute) { - using(Git.open(getRepositoryDir(owner, repoName))) { git => + Using.resource(Git.open(getRepositoryDir(owner, repoName))) { git => val repository = git.getRepository val upload = new UploadPack(repository) upload.upload(in, out, err) @@ -177,7 +177,7 @@ } if (execute) { - using(Git.open(getRepositoryDir(owner, repoName))) { git => + Using.resource(Git.open(getRepositoryDir(owner, repoName))) { git => val repository = git.getRepository val receive = new ReceivePack(repository) if (!repoName.endsWith(".wiki")) { @@ -202,7 +202,7 @@ if (execute) { val path = routing.urlPattern.r.replaceFirstIn(repoName, routing.localPath) - using(Git.open(new File(Directory.GitBucketHome, path))) { git => + Using.resource(Git.open(new File(Directory.GitBucketHome, path))) { git => val repository = git.getRepository val upload = new UploadPack(repository) upload.upload(in, out, err) @@ -222,7 +222,7 @@ if (execute) { val path = routing.urlPattern.r.replaceFirstIn(repoName, routing.localPath) - using(Git.open(new File(Directory.GitBucketHome, path))) { git => + Using.resource(Git.open(new File(Directory.GitBucketHome, path))) { git => val repository = git.getRepository val receive = new ReceivePack(repository) receive.receive(in, out, err) diff --git a/src/main/scala/gitbucket/core/util/EditorConfigUtil.scala b/src/main/scala/gitbucket/core/util/EditorConfigUtil.scala index e68efaf..f5edc45 100644 --- a/src/main/scala/gitbucket/core/util/EditorConfigUtil.scala +++ b/src/main/scala/gitbucket/core/util/EditorConfigUtil.scala @@ -12,7 +12,8 @@ import org.eclipse.jgit.lib.{ObjectReader, Repository} import org.eclipse.jgit.revwalk.{RevTree, RevWalk} import org.eclipse.jgit.treewalk.TreeWalk -import gitbucket.core.util.SyntaxSugars._ + +import scala.util.Using object EditorConfigUtil { private class JGitResource(repo: Repository, revStr: String, path: Ec4jPath) extends Resource { @@ -27,7 +28,7 @@ } private def getRevTree: RevTree = { - using(repo.newObjectReader()) { reader: ObjectReader => + Using.resource(repo.newObjectReader()) { reader: ObjectReader => val revWalk = new RevWalk(reader) val id = repo.resolve(revStr) val commit = revWalk.parseCommit(id) @@ -36,7 +37,7 @@ } override def exists(): Boolean = { - using(repo.newObjectReader()) { reader: ObjectReader => + Using.resource(repo.newObjectReader()) { reader: ObjectReader => try { val treeWalk = Option(TreeWalk.forPath(reader, removeInitialSlash(path), getRevTree)) treeWalk.isDefined @@ -59,7 +60,7 @@ } override def openReader(): Reader = { - using(repo.newObjectReader) { reader: ObjectReader => + Using.resource(repo.newObjectReader) { reader: ObjectReader => val treeWalk = TreeWalk.forPath(reader, removeInitialSlash(path), getRevTree) new InputStreamReader(reader.open(treeWalk.getObjectId(0)).openStream, StandardCharsets.UTF_8) } diff --git a/src/main/scala/gitbucket/core/util/FileUtil.scala b/src/main/scala/gitbucket/core/util/FileUtil.scala index ab42edd..5da060d 100644 --- a/src/main/scala/gitbucket/core/util/FileUtil.scala +++ b/src/main/scala/gitbucket/core/util/FileUtil.scala @@ -36,7 +36,7 @@ def isText(content: Array[Byte]): Boolean = !content.contains(0) - def generateFileId: String = System.currentTimeMillis + Random.alphanumeric.take(10).mkString + def generateFileId: String = s"${System.currentTimeMillis}${Random.alphanumeric.take(10).mkString}" def getExtension(name: String): String = name.lastIndexOf('.') match { @@ -56,7 +56,7 @@ } def getLfsFilePath(owner: String, repository: String, oid: String): String = - Directory.getLfsDir(owner, repository) + "/" + checkFilename(oid) + s"${Directory.getLfsDir(owner, repository)}/${checkFilename(oid)}" def readableSize(size: Long): String = FileUtils.byteCountToDisplaySize(size) diff --git a/src/main/scala/gitbucket/core/util/GpgUtil.scala b/src/main/scala/gitbucket/core/util/GpgUtil.scala index 5d5edb4..c5f0a73 100644 --- a/src/main/scala/gitbucket/core/util/GpgUtil.scala +++ b/src/main/scala/gitbucket/core/util/GpgUtil.scala @@ -1,7 +1,8 @@ package gitbucket.core.util import java.io.ByteArrayInputStream -import collection.JavaConverters._ +import scala.jdk.CollectionConverters._ + import gitbucket.core.model.Profile._ import gitbucket.core.model.Profile.profile.blockingApi._ import org.bouncycastle.bcpg.ArmoredInputStream diff --git a/src/main/scala/gitbucket/core/util/JDBCUtil.scala b/src/main/scala/gitbucket/core/util/JDBCUtil.scala index 9d34c84..0b2fa65 100644 --- a/src/main/scala/gitbucket/core/util/JDBCUtil.scala +++ b/src/main/scala/gitbucket/core/util/JDBCUtil.scala @@ -3,9 +3,9 @@ import java.io._ import java.sql._ import java.text.SimpleDateFormat -import SyntaxSugars._ import scala.annotation.tailrec import scala.collection.mutable.ListBuffer +import scala.util.Using /** * Provides implicit class which extends java.sql.Connection. @@ -26,7 +26,7 @@ def find[T](sql: String, params: Any*)(f: ResultSet => T): Option[T] = { execute(sql, params: _*) { stmt => - using(stmt.executeQuery()) { rs => + Using.resource(stmt.executeQuery()) { rs => if (rs.next) Some(f(rs)) else None } } @@ -34,7 +34,7 @@ def select[T](sql: String, params: Any*)(f: ResultSet => T): Seq[T] = { execute(sql, params: _*) { stmt => - using(stmt.executeQuery()) { rs => + Using.resource(stmt.executeQuery()) { rs => val list = new ListBuffer[T] while (rs.next) { list += f(rs) @@ -46,14 +46,14 @@ def selectInt(sql: String, params: Any*): Int = { execute(sql, params: _*) { stmt => - using(stmt.executeQuery()) { rs => + Using.resource(stmt.executeQuery()) { rs => if (rs.next) rs.getInt(1) else 0 } } } private def execute[T](sql: String, params: Any*)(f: (PreparedStatement) => T): T = { - using(conn.prepareStatement(sql)) { stmt => + Using.resource(conn.prepareStatement(sql)) { stmt => params.zipWithIndex.foreach { case (p, i) => p match { @@ -68,7 +68,7 @@ def importAsSQL(in: InputStream): Unit = { conn.setAutoCommit(false) try { - using(in) { in => + Using.resource(in) { in => var out = new ByteArrayOutputStream() var length = 0 @@ -111,7 +111,7 @@ val dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss") val file = File.createTempFile("gitbucket-export-", ".sql") - using(new FileOutputStream(file)) { out => + Using.resource(new FileOutputStream(file)) { out => val dbMeta = conn.getMetaData val allTablesInDatabase = allTablesOrderByDependencies(dbMeta) @@ -168,7 +168,7 @@ } def allTableNames(): Seq[String] = { - using(conn.getMetaData.getTables(null, null, "%", Seq("TABLE").toArray)) { rs => + Using.resource(conn.getMetaData.getTables(null, null, "%", Seq("TABLE").toArray)) { rs => val tableNames = new ListBuffer[String] while (rs.next) { val name = rs.getString("TABLE_NAME").toUpperCase @@ -188,7 +188,7 @@ tableName } - using(meta.getExportedKeys(null, null, normalizedTableName)) { rs => + Using.resource(meta.getExportedKeys(null, null, normalizedTableName)) { rs => val children = new ListBuffer[String] while (rs.next) { val childTableName = rs.getString("FKTABLE_NAME").toUpperCase @@ -218,7 +218,7 @@ ordered ++ orphans } - def tsort[A](edges: Traversable[(A, A)]): Iterable[A] = { + def tsort[A](edges: Iterable[(A, A)]): Iterable[A] = { @tailrec def tsort(toPreds: Map[A, Set[A]], done: Iterable[A]): Iterable[A] = { val (noPreds, hasPreds) = toPreds.partition { _._2.isEmpty } @@ -226,7 +226,7 @@ if (hasPreds.isEmpty) done else sys.error(hasPreds.toString) } else { val found = noPreds.map { _._1 } - tsort(hasPreds.mapValues { _ -- found }, done ++ found) + tsort(hasPreds.map { case (k, v) => (k, v -- found) }, done ++ found) } } diff --git a/src/main/scala/gitbucket/core/util/JGitUtil.scala b/src/main/scala/gitbucket/core/util/JGitUtil.scala index e875a2b..8f1df6d 100644 --- a/src/main/scala/gitbucket/core/util/JGitUtil.scala +++ b/src/main/scala/gitbucket/core/util/JGitUtil.scala @@ -9,7 +9,8 @@ import SyntaxSugars._ import scala.annotation.tailrec -import scala.collection.JavaConverters._ +import scala.jdk.CollectionConverters._ +import scala.util.Using import org.eclipse.jgit.lib._ import org.eclipse.jgit.revwalk._ import org.eclipse.jgit.revwalk.filter._ @@ -20,7 +21,6 @@ import org.eclipse.jgit.transport.RefSpec import java.util.Date import java.util.concurrent.TimeUnit -import java.util.function.Consumer import org.cache2k.Cache2kBuilder import org.eclipse.jgit.api.errors._ @@ -29,6 +29,8 @@ import org.eclipse.jgit.util.io.DisabledOutputStream import org.slf4j.LoggerFactory +import scala.util.Using.Releasable + /** * Provides complex JGit operations. */ @@ -36,6 +38,10 @@ private val logger = LoggerFactory.getLogger(JGitUtil.getClass) + implicit val objectDatabaseReleasable = new Releasable[ObjectDatabase] { + override def release(resource: ObjectDatabase): Unit = resource.close() + } + /** * The repository data. * @@ -318,7 +324,7 @@ * Returns the repository information. It contains branch names and tag names. */ def getRepositoryInfo(owner: String, repository: String): RepositoryInfo = { - using(Git.open(getRepositoryDir(owner, repository))) { git => + Using.resource(Git.open(getRepositoryDir(owner, repository))) { git => try { RepositoryInfo( owner, @@ -365,7 +371,7 @@ * @return HTML of the file list */ def getFileList(git: Git, revision: String, path: String = ".", baseUrl: Option[String] = None): List[FileInfo] = { - using(new RevWalk(git.getRepository)) { revWalk => + Using.resource(new RevWalk(git.getRepository)) { revWalk => val objectId = git.getRepository.resolve(revision) if (objectId == null) return Nil val revCommit = revWalk.parseCommit(objectId) @@ -374,12 +380,12 @@ if (path == ".") { val treeWalk = new TreeWalk(git.getRepository) treeWalk.addTree(rev.getTree) - using(treeWalk)(f) + Using.resource(treeWalk)(f) } else { val treeWalk = TreeWalk.forPath(git.getRepository, path, rev.getTree) if (treeWalk != null) { treeWalk.enterSubtree - using(treeWalk)(f) + Using.resource(treeWalk)(f) } } @tailrec @@ -387,7 +393,7 @@ tuple: (ObjectId, FileMode, String, String, Option[String], RevCommit) ): (ObjectId, FileMode, String, String, Option[String], RevCommit) = tuple match { case (oid, FileMode.TREE, name, path, _, commit) => - (using(new TreeWalk(git.getRepository)) { walk => + (Using.resource(new TreeWalk(git.getRepository)) { walk => walk.addTree(oid) // single tree child, or None if (walk.next() && walk.getFileMode(0) == FileMode.TREE) { @@ -521,7 +527,7 @@ * get all file list by revision. only file. */ def getTreeId(git: Git, revision: String): Option[String] = { - using(new RevWalk(git.getRepository)) { revWalk => + Using.resource(new RevWalk(git.getRepository)) { revWalk => val objectId = git.getRepository.resolve(revision) if (objectId == null) return None val revCommit = revWalk.parseCommit(objectId) @@ -533,10 +539,10 @@ * get all file list by tree object id. */ def getAllFileListByTreeId(git: Git, treeId: String): List[String] = { - using(new RevWalk(git.getRepository)) { revWalk => + Using.resource(new RevWalk(git.getRepository)) { revWalk => val objectId = git.getRepository.resolve(treeId + "^{tree}") if (objectId == null) return Nil - using(new TreeWalk(git.getRepository)) { treeWalk => + Using.resource(new TreeWalk(git.getRepository)) { treeWalk => treeWalk.addTree(objectId) treeWalk.setRecursive(true) var ret: List[String] = Nil @@ -587,7 +593,7 @@ case _ => (logs, i.hasNext) } - using(new RevWalk(git.getRepository)) { revWalk => + Using.resource(new RevWalk(git.getRepository)) { revWalk => defining(git.getRepository.resolve(revision)) { objectId => if (objectId == null) { Left(s"${revision} can't be resolved.") @@ -619,7 +625,7 @@ case false => logs } - using(new RevWalk(git.getRepository)) { revWalk => + Using.resource(new RevWalk(git.getRepository)) { revWalk => revWalk.markStart(revWalk.parseCommit(git.getRepository.resolve(begin))) getCommitLog(revWalk.iterator, Nil).reverse } @@ -679,12 +685,12 @@ } private def getDiffEntries(git: Git, from: Option[String], to: String): Seq[DiffEntry] = { - using(new RevWalk(git.getRepository)) { revWalk => + Using.resource(new RevWalk(git.getRepository)) { revWalk => val df = new DiffFormatter(DisabledOutputStream.INSTANCE) df.setRepository(git.getRepository) val toCommit = revWalk.parseCommit(git.getRepository.resolve(to)) - from match { + (from match { case None => { toCommit.getParentCount match { case 0 => @@ -700,12 +706,12 @@ val fromCommit = revWalk.parseCommit(git.getRepository.resolve(from)) df.scan(fromCommit.getTree, toCommit.getTree).asScala } - } + }).toSeq } } def getParentCommitId(git: Git, id: String): Option[String] = { - using(new RevWalk(git.getRepository)) { revWalk => + Using.resource(new RevWalk(git.getRepository)) { revWalk => val commit = revWalk.parseCommit(git.getRepository.resolve(id)) commit.getParentCount match { case 0 => None @@ -787,7 +793,7 @@ private def makePatchFromDiffEntry(git: Git, diff: DiffEntry): String = { val out = new ByteArrayOutputStream() - using(new DiffFormatter(out)) { formatter => + Using.resource(new DiffFormatter(out)) { formatter => formatter.setRepository(git.getRepository) formatter.format(diff) val patch = new String(out.toByteArray) // TODO charset??? @@ -799,7 +805,7 @@ * Returns the list of branch names of the specified commit. */ def getBranchesOfCommit(git: Git, commitId: String): List[String] = - using(new RevWalk(git.getRepository)) { revWalk => + Using.resource(new RevWalk(git.getRepository)) { revWalk => defining(revWalk.parseCommit(git.getRepository.resolve(commitId + "^0"))) { commit => git.getRepository.getRefDatabase .getRefsByPrefix(Constants.R_HEADS) @@ -842,7 +848,7 @@ * Returns the list of tags which contains the specified commit. */ def getTagsOfCommit(git: Git, commitId: String): List[String] = - using(new RevWalk(git.getRepository)) { revWalk => + Using.resource(new RevWalk(git.getRepository)) { revWalk => defining(revWalk.parseCommit(git.getRepository.resolve(commitId + "^0"))) { commit => git.getRepository.getRefDatabase .getRefsByPrefix(Constants.R_TAGS) @@ -863,13 +869,13 @@ } def initRepository(dir: java.io.File): Unit = - using(new RepositoryBuilder().setGitDir(dir).setBare.build) { repository => + Using.resource(new RepositoryBuilder().setGitDir(dir).setBare.build) { repository => repository.create(true) setReceivePack(repository) } def cloneRepository(from: java.io.File, to: java.io.File): Unit = - using(Git.cloneRepository.setURI(from.toURI.toString).setDirectory(to).setBare(true).call) { git => + Using.resource(Git.cloneRepository.setURI(from.toURI.toString).setDirectory(to).setBare(true).call) { git => setReceivePack(git.getRepository) } @@ -899,7 +905,7 @@ def createTag(git: Git, name: String, message: Option[String], commitId: String) = { try { val objectId: ObjectId = git.getRepository.resolve(commitId) - using(new RevWalk(git.getRepository)) { walk => + Using.resource(new RevWalk(git.getRepository)) { walk => val tagCommand = git.tag().setName(name).setObjectId(walk.parseCommit(objectId)) message.foreach { message => tagCommand.setMessage(message) @@ -908,10 +914,10 @@ } Right("Tag added.") } catch { - case e: GitAPIException => Left("Sorry, some Git operation error occurs.") - case e: ConcurrentRefUpdateException => Left("Sorry some error occurs.") + case e: ConcurrentRefUpdateException => Left("Sorry, some error occurs.") case e: InvalidTagNameException => Left("Sorry, that name is invalid.") case e: NoHeadException => Left("Sorry, this repo doesn't have HEAD reference") + case e: GitAPIException => Left("Sorry, some Git operation error occurs.") } } @@ -1004,7 +1010,7 @@ case false => None } - using(new TreeWalk(git.getRepository)) { treeWalk => + Using.resource(new TreeWalk(git.getRepository)) { treeWalk => treeWalk.addTree(revTree) treeWalk.setRecursive(true) getPathObjectId(path, treeWalk) @@ -1049,7 +1055,7 @@ def getContentInfo(git: Git, path: String, objectId: ObjectId): ContentInfo = { // Viewer - using(git.getRepository.getObjectDatabase) { db => + Using.resource(git.getRepository.getObjectDatabase) { db => val loader = db.open(objectId) val isLfs = isLfsPointer(loader) val large = FileUtil.isLarge(loader.getSize) @@ -1087,7 +1093,7 @@ */ def getContentFromId(git: Git, id: ObjectId, fetchLargeFile: Boolean): Option[Array[Byte]] = try { - using(git.getRepository.getObjectDatabase) { db => + Using.resource(git.getRepository.getObjectDatabase) { db => val loader = db.open(id) if (loader.isLarge || (fetchLargeFile == false && FileUtil.isLarge(loader.getSize))) { None @@ -1109,7 +1115,7 @@ */ def getObjectLoaderFromId[A](git: Git, id: ObjectId)(f: ObjectLoader => A): Option[A] = try { - using(git.getRepository.getObjectDatabase) { db => + Using.resource(git.getRepository.getObjectDatabase) { db => Some(f(db.open(id))) } } catch { @@ -1132,8 +1138,8 @@ } def processTree[T](git: Git, id: ObjectId)(f: (String, CanonicalTreeParser) => T): Seq[T] = { - using(new RevWalk(git.getRepository)) { revWalk => - using(new TreeWalk(git.getRepository)) { treeWalk => + Using.resource(new RevWalk(git.getRepository)) { revWalk => + Using.resource(new TreeWalk(git.getRepository)) { treeWalk => val index = treeWalk.addTree(revWalk.parseTree(id)) treeWalk.setRecursive(true) val result = new collection.mutable.ListBuffer[T]() @@ -1177,7 +1183,7 @@ requestRepositoryName: String, requestBranch: String ): (String, String) = - using( + Using.resources( Git.open(Directory.getRepositoryDir(userName, repositoryName)), Git.open(Directory.getRepositoryDir(requestUserName, requestRepositoryName)) ) { (oldGit, newGit) => @@ -1247,7 +1253,7 @@ } finally { walk.dispose() } - } + }.toSeq } def getBlame(git: Git, id: String, path: String): Iterable[BlameInfo] = { @@ -1277,7 +1283,7 @@ } idLine :+= (c.name, i) } - val limeMap = idLine.groupBy(_._1).mapValues(_.map(_._2).toSet) + val limeMap = idLine.groupBy(_._1).view.mapValues(_.map(_._2).toSet) blameMap.values.map { b => b.copy(lines = limeMap(b.id)) } @@ -1294,7 +1300,7 @@ * @return sha1 */ def getShaByRef(owner: String, name: String, revstr: String): Option[String] = { - using(Git.open(getRepositoryDir(owner, name))) { git => + Using.resource(Git.open(getRepositoryDir(owner, name))) { git => Option(git.getRepository.resolve(revstr)).map(ObjectId.toString(_)) } } @@ -1309,14 +1315,14 @@ if (lfsAttrs.nonEmpty) { val oid = lfsAttrs("oid").split(":")(1) - using(new FileInputStream(FileUtil.getLfsFilePath(repository.owner, repository.name, oid))) { in => + Using.resource(new FileInputStream(FileUtil.getLfsFilePath(repository.owner, repository.name, oid))) { in => f(in) } } else { throw new NoSuchElementException("LFS attribute is empty.") } } else { - using(loader.openStream()) { in => + Using.resource(loader.openStream()) { in => f(in) } } @@ -1325,7 +1331,7 @@ def openFile[T](git: Git, repository: RepositoryService.RepositoryInfo, tree: RevTree, path: String)( f: InputStream => T ): T = { - using(TreeWalk.forPath(git.getRepository, path, tree)) { treeWalk => + Using.resource(TreeWalk.forPath(git.getRepository, path, tree)) { treeWalk => openFile(git, repository, treeWalk)(f) } } diff --git a/src/main/scala/gitbucket/core/util/SyntaxSugars.scala b/src/main/scala/gitbucket/core/util/SyntaxSugars.scala index cc3ad41..6188cfa 100644 --- a/src/main/scala/gitbucket/core/util/SyntaxSugars.scala +++ b/src/main/scala/gitbucket/core/util/SyntaxSugars.scala @@ -11,6 +11,7 @@ def defining[A, B](value: A)(f: A => B): B = f(value) + @deprecated("Use scala.util.Using.resource instead", "4.32.0") def using[A <: { def close(): Unit }, B](resource: A)(f: A => B): B = try f(resource) finally { @@ -21,6 +22,7 @@ } } + @deprecated("Use scala.util.Using.resources instead", "4.32.0") def using[A <: { def close(): Unit }, B <: { def close(): Unit }, C](resource1: A, resource2: B)(f: (A, B) => C): C = try f(resource1, resource2) finally { @@ -36,10 +38,12 @@ } } + @deprecated("Use scala.util.Using.resource instead", "4.32.0") def using[T](git: Git)(f: Git => T): T = try f(git) finally git.getRepository.close() + @deprecated("Use scala.util.Using.resources instead", "4.32.0") def using[T](git1: Git, git2: Git)(f: (Git, Git) => T): T = try f(git1, git2) finally { diff --git a/src/main/twirl/gitbucket/core/issues/labels/edit.scala.html b/src/main/twirl/gitbucket/core/issues/labels/edit.scala.html index 62edc4a..2c40a42 100644 --- a/src/main/twirl/gitbucket/core/issues/labels/edit.scala.html +++ b/src/main/twirl/gitbucket/core/issues/labels/edit.scala.html @@ -22,7 +22,7 @@