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 @@
@if(release.isEmpty){ -

New release for @tag

+

New release for @tag.name

} else { -

Update release for @tag

+

Update release for @tag.name

} - + @gitbucket.core.helper.html.preview( repository = repository, - content = release.flatMap { case (release, _) => release.content }.getOrElse(""), + content = release.flatMap { case (release, _) => release.content }.getOrElse(tag.message), enableWikiLink = false, enableRefsLink = true, enableLineBreaks = true, @@ -31,7 +31,7 @@ @release.map { case (release, assets) => @assets.map { asset =>
  • - @asset.label + @asset.label (remove)
  • @@ -43,9 +43,9 @@
    @if(release.isEmpty){ - + } else { - + }
    @@ -61,11 +61,11 @@ $("#drop").dropzone({ maxFilesize: @{gitbucket.core.util.FileUtil.MaxFileSize / 1024 / 1024}, - url: '@context.path/upload/release/@repository.owner/@repository.name/@helpers.encodeRefName(tag)', + url: '@context.path/upload/release/@repository.owner/@repository.name/@helpers.encodeRefName(tag.name)', previewTemplate: "
    \n
    Uploading your files...
    \n
    \n
    ", success: function(file, id) { var attach = - '
  • ' + + '
  • ' + '' + escapeHtml(file.name) + '' + '(remove)' + '' diff --git a/src/main/twirl/gitbucket/core/releases/list.scala.html b/src/main/twirl/gitbucket/core/releases/list.scala.html index 239a0f9..2466c2f 100644 --- a/src/main/twirl/gitbucket/core/releases/list.scala.html +++ b/src/main/twirl/gitbucket/core/releases/list.scala.html @@ -39,8 +39,11 @@ Create release } +
    @tag.message

    } + @*

    Downloads

    + *@