diff --git a/src/main/scala/gitbucket/core/controller/ReleasesController.scala b/src/main/scala/gitbucket/core/controller/ReleasesController.scala index c346ed8..9880ae1 100644 --- a/src/main/scala/gitbucket/core/controller/ReleasesController.scala +++ b/src/main/scala/gitbucket/core/controller/ReleasesController.scala @@ -52,79 +52,86 @@ }) get("/:owner/:repository/releases/:tag")(referrersOnly { repository => - val tag = params("tag") - getRelease(repository.owner, repository.name, tag).map { release => - html.release(release, getReleaseAssets(repository.owner, repository.name, tag), hasDeveloperRole(repository.owner, repository.name, context.loginAccount), repository) + val tagName = params("tag") + getRelease(repository.owner, repository.name, tagName).map { release => + html.release(release, getReleaseAssets(repository.owner, repository.name, tagName), + hasDeveloperRole(repository.owner, repository.name, context.loginAccount), repository) }.getOrElse(NotFound()) }) get("/:owner/:repository/releases/:tag/assets/:fileId")(referrersOnly {repository => - val tag = params("tag") + val tagName = params("tag") val fileId = params("fileId") (for { - _ <- repository.tags.find(_.name == tag) - _ <- getRelease(repository.owner, repository.name, tag) - asset <- getReleaseAsset(repository.owner, repository.name, tag, fileId) + _ <- repository.tags.find(_.name == tagName) + _ <- getRelease(repository.owner, repository.name, tagName) + asset <- getReleaseAsset(repository.owner, repository.name, tagName, fileId) } yield { response.setHeader("Content-Disposition", s"attachment; filename=${asset.label}") RawData( FileUtil.getMimeType(asset.label), - new File(getReleaseFilesDir(repository.owner, repository.name), tag + "/" + fileId) + new File(getReleaseFilesDir(repository.owner, repository.name), tagName + "/" + fileId) ) }).getOrElse(NotFound()) }) get("/:owner/:repository/releases/:tag/create")(writableUsersOnly {repository => - html.form(repository, params("tag"), None) + val tagName = params("tag") + repository.tags.find(_.name == tagName).map { tag => + html.form(repository, tag, None) + }.getOrElse(NotFound()) }) post("/:owner/:repository/releases/:tag/create", releaseForm)(writableUsersOnly { (form, repository) => - val tag = params("tag") + val tagName = params("tag") val loginAccount = context.loginAccount.get // Insert into RELEASE - createRelease(repository.owner, repository.name, form.name, form.content, tag, loginAccount) + createRelease(repository.owner, repository.name, form.name, form.content, tagName, loginAccount) // Insert into RELEASE_ASSET request.getParameterNames.asScala.filter(_.startsWith("file:")).foreach { paramName => val Array(_, fileId) = paramName.split(":") val fileName = params(paramName) - val size = new java.io.File(getReleaseFilesDir(repository.owner, repository.name), tag + "/" + fileId).length + val size = new java.io.File(getReleaseFilesDir(repository.owner, repository.name), tagName + "/" + fileId).length - createReleaseAsset(repository.owner, repository.name, tag, fileId, fileName, size, loginAccount) + createReleaseAsset(repository.owner, repository.name, tagName, fileId, fileName, size, loginAccount) } recordReleaseActivity(repository.owner, repository.name, loginAccount.userName, form.name) - redirect(s"/${repository.owner}/${repository.name}/releases/${tag}") + redirect(s"/${repository.owner}/${repository.name}/releases/${tagName}") }) get("/:owner/:repository/releases/:tag/edit")(writableUsersOnly {repository => - val tag = params("tag") + val tagName = params("tag") - getRelease(repository.owner, repository.name, tag).map { release => - html.form(repository, release.tag, Some(release, getReleaseAssets(repository.owner, repository.name, tag))) - }.getOrElse(NotFound()) + (for { + release <- getRelease(repository.owner, repository.name, tagName) + tag <- repository.tags.find(_.name == tagName) + } yield { + html.form(repository, tag, Some(release, getReleaseAssets(repository.owner, repository.name, tagName))) + }).getOrElse(NotFound()) }) post("/:owner/:repository/releases/:tag/edit", releaseForm)(writableUsersOnly { (form, repository) => - val tag = params("tag") + val tagName = params("tag") val loginAccount = context.loginAccount.get - getRelease(repository.owner, repository.name, tag).map { release => + getRelease(repository.owner, repository.name, tagName).map { release => // Update RELEASE - updateRelease(repository.owner, repository.name, tag, form.name, form.content) + updateRelease(repository.owner, repository.name, tagName, form.name, form.content) // Delete and Insert RELEASE_ASSET - val assets = getReleaseAssets(repository.owner, repository.name, tag) - deleteReleaseAssets(repository.owner, repository.name, tag) + val assets = getReleaseAssets(repository.owner, repository.name, tagName) + deleteReleaseAssets(repository.owner, repository.name, tagName) val fileIds = request.getParameterNames.asScala.filter(_.startsWith("file:")).map { paramName => val Array(_, fileId) = paramName.split(":") val fileName = params(paramName) val size = new java.io.File(getReleaseFilesDir(repository.owner, repository.name), release.tag + "/" + fileId).length - createReleaseAsset(repository.owner, repository.name, tag, fileId, fileName, size, loginAccount) + createReleaseAsset(repository.owner, repository.name, tagName, fileId, fileName, size, loginAccount) fileId } @@ -135,16 +142,16 @@ } } - redirect(s"/${release.userName}/${release.repositoryName}/releases/${tag}") + redirect(s"/${release.userName}/${release.repositoryName}/releases/${tagName}") }.getOrElse(NotFound()) }) post("/:owner/:repository/releases/:tag/delete")(writableUsersOnly { repository => - val tag = params("tag") - getRelease(repository.owner, repository.name, tag).foreach { release => + val tagName = params("tag") + getRelease(repository.owner, repository.name, tagName).foreach { release => FileUtils.deleteDirectory(new File(getReleaseFilesDir(repository.owner, repository.name), release.tag)) } - deleteRelease(repository.owner, repository.name, tag) + deleteRelease(repository.owner, repository.name, tagName) redirect(s"/${repository.owner}/${repository.name}/releases") }) diff --git a/src/main/scala/gitbucket/core/util/JGitUtil.scala b/src/main/scala/gitbucket/core/util/JGitUtil.scala index c5fe1cd..3b54730 100644 --- a/src/main/scala/gitbucket/core/util/JGitUtil.scala +++ b/src/main/scala/gitbucket/core/util/JGitUtil.scala @@ -143,8 +143,9 @@ * @param name the tag name * @param time the tagged date * @param id the commit id + * @param message the message of the tagged commit */ - case class TagInfo(name: String, time: Date, id: String) + case class TagInfo(name: String, time: Date, id: String, message: String) /** * The submodule data @@ -233,7 +234,7 @@ git.tagList.call.asScala.flatMap { ref => try { val revCommit = getRevCommitFromId(git, ref.getObjectId) - Some(TagInfo(ref.getName.stripPrefix("refs/tags/"), revCommit.getCommitterIdent.getWhen, revCommit.getName)) + Some(TagInfo(ref.getName.stripPrefix("refs/tags/"), revCommit.getCommitterIdent.getWhen, revCommit.getName, revCommit.getShortMessage)) } catch { case _: IncorrectObjectTypeException => None diff --git a/src/main/twirl/gitbucket/core/releases/form.scala.html b/src/main/twirl/gitbucket/core/releases/form.scala.html index bdcec5a..cdd0aca 100644 --- a/src/main/twirl/gitbucket/core/releases/form.scala.html +++ b/src/main/twirl/gitbucket/core/releases/form.scala.html @@ -1,5 +1,5 @@ @(repository: gitbucket.core.service.RepositoryService.RepositoryInfo, - tag: String, + tag: gitbucket.core.util.JGitUtil.TagInfo, release: Option[(gitbucket.core.model.Release, Seq[gitbucket.core.model.ReleaseAsset])])(implicit context: gitbucket.core.controller.Context) @import gitbucket.core.view.helpers @gitbucket.core.html.main(s"New Release - ${repository.owner}/${repository.name}", Some(repository)){ @@ -8,15 +8,15 @@