diff --git a/src/main/resources/update/gitbucket-core_4.21.xml b/src/main/resources/update/gitbucket-core_4.21.xml
index df5e463..842389c 100644
--- a/src/main/resources/update/gitbucket-core_4.21.xml
+++ b/src/main/resources/update/gitbucket-core_4.21.xml
@@ -8,8 +8,6 @@
-
-
diff --git a/src/main/scala/gitbucket/core/controller/FileUploadController.scala b/src/main/scala/gitbucket/core/controller/FileUploadController.scala
index e9ffc88..ca00ee2 100644
--- a/src/main/scala/gitbucket/core/controller/FileUploadController.scala
+++ b/src/main/scala/gitbucket/core/controller/FileUploadController.scala
@@ -2,7 +2,6 @@
import gitbucket.core.model.Account
import gitbucket.core.service.{AccountService, RepositoryService, ReleaseService}
-import gitbucket.core.service.RepositoryService.RepositoryInfo
import gitbucket.core.servlet.Database
import gitbucket.core.util._
import gitbucket.core.util.SyntaxSugars._
@@ -89,21 +88,16 @@
} getOrElse BadRequest()
}
- post("/release/:owner/:repository/:id"){
- session.get(Keys.Session.LoginAccount).collect { case loginAccount: Account =>
+ post("/release/:owner/:repository/:tag"){
+ session.get(Keys.Session.LoginAccount).collect { case _: Account =>
val owner = params("owner")
val repository = params("repository")
- val releaseId = params("id").toInt
- val release = getRelease(owner, repository, releaseId)
+ val tag = params("tag")
execute({ (file, fileId) =>
- val fileName = file.getName
- release.map { rel =>
- createReleaseAsset(owner, repository, releaseId, fileId, fileName, file.size, loginAccount)
- FileUtils.writeByteArrayToFile(new java.io.File(
- getReleaseFilesDir(owner, repository) + s"/${releaseId}",
- fileId), file.get)
- fileName
- }
+ FileUtils.writeByteArrayToFile(
+ new java.io.File(getReleaseFilesDir(owner, repository), tag + "/" + fileId),
+ file.get
+ )
}, _ => true)
}.getOrElse(BadRequest())
}
diff --git a/src/main/scala/gitbucket/core/controller/ReleasesController.scala b/src/main/scala/gitbucket/core/controller/ReleasesController.scala
index 0b5c8d1..c1cdebf 100644
--- a/src/main/scala/gitbucket/core/controller/ReleasesController.scala
+++ b/src/main/scala/gitbucket/core/controller/ReleasesController.scala
@@ -6,11 +6,10 @@
import gitbucket.core.util.{FileUtil, ReadableUsersAuthenticator, ReferrerAuthenticator, WritableUsersAuthenticator}
import gitbucket.core.util.Directory._
import gitbucket.core.util.Implicits._
-import gitbucket.core.util.SyntaxSugars._
-import gitbucket.core.view.Markdown
import org.scalatra.forms._
import gitbucket.core.releases.html
import org.apache.commons.io.FileUtils
+import scala.collection.JavaConverters._
class ReleaseController extends ReleaseControllerBase
with RepositoryService
@@ -30,31 +29,25 @@
with WritableUsersAuthenticator
with ActivityService =>
- case class ReleaseCreateForm(
+ case class ReleaseForm(
name: String,
- content: Option[String],
- isPrerelease: Boolean
+ content: Option[String]
)
- val releaseCreateForm = mapping(
- "name" -> trim(text(required)),
- "content" -> trim(optional(text())),
- "isprerelease" -> boolean()
- )(ReleaseCreateForm.apply)
-
- val releaseTitleEditForm = mapping(
- "title" -> trim(label("Title", text(required)))
- )(x => x)
-
- val releaseEditForm = mapping(
+ val releaseForm = mapping(
+ "name" -> trim(text(required)),
"content" -> trim(optional(text()))
- )(x => x)
+ )(ReleaseForm.apply)
get("/:owner/:repository/releases")(referrersOnly {repository =>
+ val releases = getReleases(repository.owner, repository.name)
+ val assets = getReleaseAssetsMap(repository.owner, repository.name)
+
html.list(
repository,
- getReleases(repository.owner, repository.name),
- getReleaseAssetsMap(repository.owner, repository.name),
+ repository.tags.reverse.map { tag =>
+ (tag, releases.find(_.tag == tag.name).map { release => (release, assets(release)) })
+ },
hasDeveloperRole(repository.owner, repository.name, context.loginAccount))
})
@@ -68,93 +61,80 @@
get("/:owner/:repository/releases/:id/assets/:fileId")(referrersOnly {repository =>
val releaseId = params("id")
val fileId = params("fileId")
- getRelease(repository.owner, repository.name, releaseId).flatMap{ release =>
- getReleaseAsset(repository.owner, repository.name, releaseId, fileId).flatMap{ asset =>
- response.setHeader("Content-Disposition", s"attachment; filename=${asset.label}")
- Some(RawData(FileUtil.getMimeType(asset.label), new File(getReleaseFilesDir(repository.owner, repository.name) + s"/${release.releaseId}", fileId)))
- }
- }.getOrElse(NotFound())
+ (for {
+ release <- getRelease(repository.owner, repository.name, releaseId)
+ asset <- getReleaseAsset(repository.owner, repository.name, releaseId, fileId)
+ } yield {
+ response.setHeader("Content-Disposition", s"attachment; filename=${asset.label}")
+ Some(RawData(
+ FileUtil.getMimeType(asset.label),
+ new File(getReleaseFilesDir(repository.owner, repository.name), release.tag + "/" + fileId)
+ ))
+ }).getOrElse(NotFound())
})
- ajaxPost("/:owner/:repository/releases/:id/assets/delete/:fileId")(writableUsersOnly { repository =>
- val releaseId = params("id")
- val fileId = params("fileId")
- for(
- release <- getRelease(repository.owner, repository.name, releaseId.toInt);
- asset <- getReleaseAsset(repository.owner, repository.name, releaseId, fileId)
- ){
- FileUtils.forceDelete(new File(getReleaseFilesDir(repository.owner, repository.name) + s"/${release.releaseId}", fileId))
- }
- deleteReleaseAsset(repository.owner, repository.name, params("id").toInt, params("fileId"))
- org.json4s.jackson.Serialization.write(Map("message" -> "ok"))
- })
-
-
get("/:owner/:repository/releases/:tag/create")(writableUsersOnly {repository =>
- val tag = params("tag")
- defining(repository.owner, repository.name){ case (owner, name) =>
- html.create(repository, tag)
- }
+ html.form(repository, params("tag"), None)
})
- post("/:owner/:repository/releases/:tag/create", releaseCreateForm)(writableUsersOnly { (form, repository) =>
+ post("/:owner/:repository/releases/:tag/create", releaseForm)(writableUsersOnly { (form, repository) =>
val tag = params("tag")
- val release = createRelease(repository, form.name, form.content, tag, false, form.isPrerelease, context.loginAccount.get)
- recordReleaseActivity(repository.owner, repository.name, context.loginAccount.get.userName, release.releaseId, release.name)
+ val loginAccount = context.loginAccount.get
+
+ // Insert into RELEASE
+ val release = createRelease(repository.owner, repository.name, form.name, form.content, tag, 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
+
+ createReleaseAsset(repository.owner, repository.name, release.releaseId, fileId, fileName, size, loginAccount)
+ }
+
+ recordReleaseActivity(repository.owner, repository.name, loginAccount.userName, release.releaseId, release.name)
redirect(s"/${release.userName}/${release.repositoryName}/releases/${release.releaseId}")
})
- ajaxPost("/:owner/:repository/releases/delete/:id")(writableUsersOnly { repository =>
- for(
- release <- getRelease(repository.owner, repository.name, params("id"))
- ){
- FileUtils.deleteDirectory(new File(getReleaseFilesDir(repository.owner, repository.name) + s"/${release.releaseId}"))
- }
- deleteRelease(repository.owner, repository.name, params("id"))
- org.json4s.jackson.Serialization.write(Map("message" -> "ok"))
+ get("/:owner/:repository/releases/:id/edit")(writableUsersOnly {repository =>
+ val releaseId = params("id").toInt
+ getRelease(repository.owner, repository.name, releaseId).map { release =>
+ html.form(repository, release.tag, Some(release, getReleaseAssets(repository.owner, repository.name, releaseId)))
+ }.getOrElse(NotFound())
})
- ajaxPost("/:owner/:repository/releases/edit_title/:id", releaseTitleEditForm)(writableUsersOnly { (title, repository) =>
- defining(repository.owner, repository.name) { case (owner, name) =>
- getRelease(owner, name, params("id")).map { release =>
- updateRelease(owner, name, release.releaseId, title, release.content)
- redirect(s"/${owner}/${name}/releases/_data/${release.releaseId}")
- } getOrElse NotFound()
- }
- })
+ post("/:owner/:repository/releases/:id/edit", releaseForm)(writableUsersOnly { (form, repository) =>
+ val releaseId = params("id").toInt
+ val loginAccount = context.loginAccount.get
- ajaxPost("/:owner/:repository/releases/edit/:id", releaseEditForm)(writableUsersOnly { (content, repository) =>
- defining(repository.owner, repository.name){ case (owner, name) =>
- getRelease(owner, name, params("id")).map { release =>
- updateRelease(owner, name, release.releaseId, release.name, content)
- redirect(s"/${owner}/${name}/releases/_data/${release.releaseId}")
- } getOrElse NotFound()
- }
- })
+ getRelease(repository.owner, repository.name, releaseId).map { release =>
+ // Update RELEASE
+ updateRelease(repository.owner, repository.name, releaseId, form.name, form.content)
- ajaxGet("/:owner/:repository/releases/_data/:id")(writableUsersOnly { repository =>
- getRelease(repository.owner, repository.name, params("id")) map { x =>
- params.get("dataType") collect {
- case t if t == "html" => html.editrelease(x.content, x.releaseId, repository)
- } getOrElse {
- contentType = formats("json")
- org.json4s.jackson.Serialization.write(
- Map(
- "title" -> x.name,
- "content" -> Markdown.toHtml(
- markdown = x.content getOrElse "No description given.",
- repository = repository,
- enableWikiLink = false,
- enableRefsLink = true,
- enableAnchor = true,
- enableLineBreaks = true,
- enableTaskList = true,
- hasWritePermission = true
- )
- )
- )
+ // Delete and Insert RELEASE_ASSET
+ deleteReleaseAssets(repository.owner, repository.name, releaseId)
+
+ 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), release.tag + "/" + fileId).length
+
+ createReleaseAsset(repository.owner, repository.name, release.releaseId, fileId, fileName, size, loginAccount)
}
- } getOrElse NotFound()
+
+ redirect(s"/${release.userName}/${release.repositoryName}/releases/${release.releaseId}")
+ }.getOrElse(NotFound())
})
+
+ post("/:owner/:repository/releases/:id/delete")(writableUsersOnly { repository =>
+ val releaseId = params("id")
+ getRelease(repository.owner, repository.name, releaseId).foreach { release =>
+ FileUtils.deleteDirectory(new File(getReleaseFilesDir(repository.owner, repository.name), release.tag))
+ }
+ deleteRelease(repository.owner, repository.name, releaseId)
+ redirect(s"/${repository.owner}/${repository.name}/releases")
+ })
+
}
diff --git a/src/main/scala/gitbucket/core/model/Release.scala b/src/main/scala/gitbucket/core/model/Release.scala
index 5d1b4e8..27fdbc0 100644
--- a/src/main/scala/gitbucket/core/model/Release.scala
+++ b/src/main/scala/gitbucket/core/model/Release.scala
@@ -14,12 +14,10 @@
val tag = column[String]("TAG")
val author = column[String]("AUTHOR")
val content = column[Option[String]]("CONTENT")
- val isDraft = column[Boolean]("IS_DRAFT")
- val isPrerelease = column[Boolean]("IS_PRERELEASE")
val registeredDate = column[java.util.Date]("REGISTERED_DATE")
val updatedDate = column[java.util.Date]("UPDATED_DATE")
- def * = (userName, repositoryName, releaseId, name, tag, author, content, isDraft, isPrerelease, registeredDate, updatedDate) <> (Release.tupled, Release.unapply)
+ def * = (userName, repositoryName, releaseId, name, tag, author, content, registeredDate, updatedDate) <> (Release.tupled, Release.unapply)
def byPrimaryKey(owner: String, repository: String, releaseId: Int) = byRelease(owner, repository, releaseId)
@@ -46,8 +44,6 @@
tag: String,
author: String,
content: Option[String],
- isDraft: Boolean,
- isPrerelease: Boolean,
registeredDate: java.util.Date,
updatedDate: java.util.Date
)
diff --git a/src/main/scala/gitbucket/core/service/ReleaseService.scala b/src/main/scala/gitbucket/core/service/ReleaseService.scala
index 2203d3d..8aaa797 100644
--- a/src/main/scala/gitbucket/core/service/ReleaseService.scala
+++ b/src/main/scala/gitbucket/core/service/ReleaseService.scala
@@ -3,42 +3,39 @@
import gitbucket.core.controller.Context
import gitbucket.core.model.{Account, Release, ReleaseAsset}
import gitbucket.core.util.StringUtil._
-import gitbucket.core.util.Implicits._
import gitbucket.core.model.Profile.profile.blockingApi._
import gitbucket.core.model.Profile._
-import gitbucket.core.model.Profile.profile._
import gitbucket.core.model.Profile.dateColumnType
-import gitbucket.core.service.RepositoryService.RepositoryInfo
trait ReleaseService {
self: AccountService with RepositoryService =>
def createReleaseAsset(owner: String, repository: String, releaseId: Int, fileName: String, label: String, size: Long, loginAccount: Account)(implicit s: Session): Unit = {
ReleaseAssets insert ReleaseAsset(
- userName = owner,
+ userName = owner,
repositoryName = repository,
- releaseId = releaseId,
- fileName = fileName,
- label = label,
- size = size,
- uploader = loginAccount.userName,
+ releaseId = releaseId,
+ fileName = fileName,
+ label = label,
+ size = size,
+ uploader = loginAccount.userName,
registeredDate = currentDate,
- updatedDate = currentDate
+ updatedDate = currentDate
)
}
- def getReleaseAssets(owner: String, repository: String, releaseId: Int)(implicit s: Session): List[ReleaseAsset] = {
+ def getReleaseAssets(owner: String, repository: String, releaseId: Int)(implicit s: Session): Seq[ReleaseAsset] = {
ReleaseAssets.filter(x => x.byRelease(owner, repository, releaseId)).list
}
- def getReleaseAssets(owner: String, repository: String, releaseId: String)(implicit s: Session): List[ReleaseAsset] = {
+ def getReleaseAssets(owner: String, repository: String, releaseId: String)(implicit s: Session): Seq[ReleaseAsset] = {
if (isInteger(releaseId))
getReleaseAssets(owner, repository, releaseId.toInt)
else
- List.empty
+ Seq.empty
}
- def getReleaseAssetsMap(owner: String, repository: String)(implicit s: Session): Map[Release, List[ReleaseAsset]] = {
+ def getReleaseAssetsMap(owner: String, repository: String)(implicit s: Session): Map[Release, Seq[ReleaseAsset]] = {
val releases = getReleases(owner, repository)
releases.map(rel => (rel -> getReleaseAssets(owner, repository, rel.releaseId))).toMap
}
@@ -49,32 +46,26 @@
else None
}
- def deleteReleaseAssets(owner: String, repository: String, releaseId: Int)(implicit s:Session): Unit = {
+ def deleteReleaseAssets(owner: String, repository: String, releaseId: Int)(implicit s: Session): Unit = {
ReleaseAssets.filter(x => x.byRelease(owner, repository, releaseId)) delete
}
- def deleteReleaseAsset(owner: String, repository: String, releaseId: Int, fileId: String)(implicit s: Session): Unit = {
- ReleaseAssets.filter(x => x.byPrimaryKey(owner, repository, releaseId, fileId)) delete
- }
-
- def createRelease(repository: RepositoryInfo, name: String, content:Option[String], tag: String,
- isDraft: Boolean, isPrerelease: Boolean, loginAccount: Account)(implicit context: Context, s: Session): Release = {
+ def createRelease(owner: String, repository: String, name: String, content: Option[String], tag: String,
+ loginAccount: Account)(implicit context: Context, s: Session): Release = {
Releases insert Release(
- userName = repository.owner,
- repositoryName = repository.name,
- name = name,
- tag = tag,
- author = loginAccount.userName,
- content = content,
- isDraft = isDraft,
- isPrerelease = isPrerelease,
+ userName = owner,
+ repositoryName = repository,
+ name = name,
+ tag = tag,
+ author = loginAccount.userName,
+ content = content,
registeredDate = currentDate,
- updatedDate = currentDate
+ updatedDate = currentDate
)
- getReleaseByTag(repository.owner, repository.name, tag).get
+ getReleaseByTag(owner, repository, tag).get
}
- def getReleases(owner: String, repository: String)(implicit s: Session): List[Release] = {
+ def getReleases(owner: String, repository: String)(implicit s: Session): Seq[Release] = {
Releases.filter(x => x.byRepository(owner, repository)).list
}
diff --git a/src/main/twirl/gitbucket/core/releases/create.scala.html b/src/main/twirl/gitbucket/core/releases/create.scala.html
deleted file mode 100644
index b23658f..0000000
--- a/src/main/twirl/gitbucket/core/releases/create.scala.html
+++ /dev/null
@@ -1,33 +0,0 @@
-@(repository: gitbucket.core.service.RepositoryService.RepositoryInfo, tag: String)(implicit context: gitbucket.core.controller.Context)
-@import gitbucket.core.view.helpers
-@gitbucket.core.html.main(s"New Release - ${repository.owner}/${repository.name}", Some(repository)){
-@gitbucket.core.html.menu("releases", repository){
-
-}
-}
diff --git a/src/main/twirl/gitbucket/core/releases/editrelease.scala.html b/src/main/twirl/gitbucket/core/releases/editrelease.scala.html
deleted file mode 100644
index 6c46ecc..0000000
--- a/src/main/twirl/gitbucket/core/releases/editrelease.scala.html
+++ /dev/null
@@ -1,38 +0,0 @@
-@(content: Option[String], releaseId: Int,
-repository: gitbucket.core.service.RepositoryService.RepositoryInfo)(implicit context: gitbucket.core.controller.Context)
-@gitbucket.core.helper.html.attached(repository, "releases"){
-
-}
-
-
-
-
-
diff --git a/src/main/twirl/gitbucket/core/releases/form.scala.html b/src/main/twirl/gitbucket/core/releases/form.scala.html
new file mode 100644
index 0000000..7dacfab
--- /dev/null
+++ b/src/main/twirl/gitbucket/core/releases/form.scala.html
@@ -0,0 +1,87 @@
+@(repository: gitbucket.core.service.RepositoryService.RepositoryInfo,
+ tag: String,
+ release: Option[(gitbucket.core.model.Release, Seq[gitbucket.core.model.ReleaseAsset])])(implicit context: gitbucket.core.controller.Context)
+@import gitbucket.core.view.helpers
+
+@action = {
+ @release.map { case (release, _) =>
+ @helpers.url(repository)/releases/@release.releaseId/edit
+ }.getOrElse {
+ @helpers.url(repository)/releases/@helpers.encodeRefName(tag)/create
+ }
+}
+
+@gitbucket.core.html.main(s"New Release - ${repository.owner}/${repository.name}", Some(repository)){
+ @gitbucket.core.html.menu("releases", repository){
+
+ }
+}
+
diff --git a/src/main/twirl/gitbucket/core/releases/list.scala.html b/src/main/twirl/gitbucket/core/releases/list.scala.html
index 95f42bf..ed8f4a2 100644
--- a/src/main/twirl/gitbucket/core/releases/list.scala.html
+++ b/src/main/twirl/gitbucket/core/releases/list.scala.html
@@ -1,60 +1,64 @@
@(repository: gitbucket.core.service.RepositoryService.RepositoryInfo,
-releases: List[gitbucket.core.model.Release],
-releaseAssetsMap: Map[gitbucket.core.model.Release, List[gitbucket.core.model.ReleaseAsset]],
-hasWritePermission: Boolean)(implicit context: gitbucket.core.controller.Context)
+ releases: Seq[(gitbucket.core.util.JGitUtil.TagInfo, Option[(gitbucket.core.model.Release, Seq[gitbucket.core.model.ReleaseAsset])])],
+ hasWritePermission: Boolean)(implicit context: gitbucket.core.controller.Context)
@import gitbucket.core.view.helpers
@gitbucket.core.html.main("Releases" + s" - ${repository.owner}/${repository.name}", Some(repository)){
-@gitbucket.core.html.menu("releases", repository){
-
-
- @releases.length releases
-
-
- @releases.map{ release =>
-
-
-
-
-
-
-
-
- @helpers.avatar(release.author, 20)
- @helpers.user(release.author, styleClass="username strong")
- released this @gitbucket.core.helper.html.datetimeago(release.registeredDate)
-
-
-
- @helpers.markdown(
- markdown = release.content getOrElse "No description provided.",
- repository = repository,
- enableWikiLink = false,
- enableRefsLink = true,
- enableLineBreaks = true,
- enableTaskList = true,
- hasWritePermission = hasWritePermission
- )
-
-
Downloads
-
- @releaseAssetsMap(release).map{ asset =>
-
-
- @asset.label
- @helpers.readableSize(Some(asset.size))
-
- }
-
-
-
-
+ @gitbucket.core.html.menu("releases", repository){
+
+
+ @releases.length releases
+
+
+ @releases.map { case (tag, release) =>
+
+
+
+
@tag.name
+
@tag.id.substring(0, 7)
+
@gitbucket.core.helper.html.datetimeago(tag.time)
+
+
+
+ @release.map { case (release, assets) =>
+
+
+ @helpers.avatar(release.author, 20) @helpers.user(release.author, styleClass="username") released this @gitbucket.core.helper.html.datetimeago(release.registeredDate)
+
+ @helpers.markdown(
+ markdown = release.content getOrElse "No description provided.",
+ repository = repository,
+ enableWikiLink = false,
+ enableRefsLink = true,
+ enableLineBreaks = true,
+ enableTaskList = true,
+ hasWritePermission = hasWritePermission
+ )
+ }.getOrElse {
+ @if(hasWritePermission){
+
+ }
+ }
+
Downloads
+
+
+
+
+
}
-
-
+
+
}
-
-
}
diff --git a/src/main/twirl/gitbucket/core/releases/release.scala.html b/src/main/twirl/gitbucket/core/releases/release.scala.html
index a3db252..369ee50 100644
--- a/src/main/twirl/gitbucket/core/releases/release.scala.html
+++ b/src/main/twirl/gitbucket/core/releases/release.scala.html
@@ -1,161 +1,65 @@
@(release: gitbucket.core.model.Release,
-assets: List[gitbucket.core.model.ReleaseAsset],
-hasWritePermission: Boolean,
-repository: gitbucket.core.service.RepositoryService.RepositoryInfo)(implicit context: gitbucket.core.controller.Context)
+ assets: Seq[gitbucket.core.model.ReleaseAsset],
+ hasWritePermission: Boolean,
+ repository: gitbucket.core.service.RepositoryService.RepositoryInfo)(implicit context: gitbucket.core.controller.Context)
@import gitbucket.core.view.helpers
@gitbucket.core.html.main(s"${release.name} - Release ${release.releaseId} - ${repository.owner}/${repository.name}", Some(repository)){
-@gitbucket.core.html.menu("releases", repository){
-
-
-
-
-
-
-
-
- @release.name
-
-
-
-
-
-
-
-
-
-
- @helpers.avatar(release.author, 20)
- @helpers.user(release.author, styleClass="username strong") released this @gitbucket.core.helper.html.datetimeago(release.registeredDate)
-
-
- @if(hasWritePermission){
-
+ @gitbucket.core.html.menu("releases", repository){
+
+
+ @defining(repository.tags.find(_.name == release.tag)){ tag =>
+ @tag.map { tag =>
+
@tag.name
+
@tag.id.substring(0, 7)
+
@gitbucket.core.helper.html.datetimeago(tag.time)
}
-
-
-
- @helpers.markdown(
- markdown = release.content getOrElse "No description provided.",
- repository = repository,
- enableWikiLink = false,
- enableRefsLink = true,
- enableLineBreaks = true,
- enableTaskList = true,
- hasWritePermission = hasWritePermission
- )
-
-
-
Downloads
- @if(hasWritePermission){
-
-
Attach release files by dragging & dropping, or selecting them.
-
}
-
- @assets.map{ asset =>
-
-
- @asset.label
- @helpers.readableSize(Some(asset.size))
+
+
+
+
+ @release.name
@if(hasWritePermission){
- Delete
+
}
-
- }
-
-
+
+
+ @helpers.avatar(release.author, 20) @helpers.user(release.author, styleClass="username") released this @gitbucket.core.helper.html.datetimeago(release.registeredDate)
+
+ @helpers.markdown(
+ markdown = release.content getOrElse "No description provided.",
+ repository = repository,
+ enableWikiLink = false,
+ enableRefsLink = true,
+ enableLineBreaks = true,
+ enableTaskList = true,
+ hasWritePermission = hasWritePermission
+ )
+
Downloads
+
+
-
-
+ }
+}
-}
-}
diff --git a/src/main/twirl/gitbucket/core/repo/tags.scala.html b/src/main/twirl/gitbucket/core/repo/tags.scala.html
index 16e4d34..7dd88f8 100644
--- a/src/main/twirl/gitbucket/core/repo/tags.scala.html
+++ b/src/main/twirl/gitbucket/core/repo/tags.scala.html
@@ -27,11 +27,11 @@
Release
}.getOrElse{
@if(hasWritePermission){
-
- }else{
-
+
+ } else {
+
}
}