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){ -
-
-
-

New release for @tag

- - - @gitbucket.core.helper.html.preview( - repository = repository, - content = "", - enableWikiLink = false, - enableRefsLink = true, - enableLineBreaks = true, - enableTaskList = true, - hasWritePermission = true, - completionContext = "releases", - style = "height: 200px; max-height: 500px;", - elastic = true, - placeholder = "Describe this release" - ) - - -
- -
-
-
-
-} -} 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){ +
+
+
+ @if(release.isEmpty){ +

New release for @tag

+ } else { +

Update release for @tag

+ } + + + @gitbucket.core.helper.html.preview( + repository = repository, + content = release.flatMap { case (release, _) => release.content }.getOrElse(""), + enableWikiLink = false, + enableRefsLink = true, + enableLineBreaks = true, + enableTaskList = true, + hasWritePermission = true, + completionContext = "releases", + style = "height: 200px; max-height: 500px;", + elastic = true, + placeholder = "Describe this release" + ) +
    + @release.map { case (release, assets) => + @assets.map { asset => +
  • + @asset.label + (remove) + +
  • + } + } +
+
+
Attach release files by dragging & dropping, or selecting them.
+
+
+ @if(release.isEmpty){ + + } else { + + } +
+
+
+
+ } +} + 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.map{ release => - - -
@releases.length releases
- -
-

@release.name

-
-
- - @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.map { case (tag, release) => + + + } - - + +
@releases.length releases
+
+ @tag.name
+ @tag.id.substring(0, 7)
+ @gitbucket.core.helper.html.datetimeago(tag.time) +
+
+
+ @release.map { case (release, assets) => +

@release.name

+

+ @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){ -
- -
-
-
- @if(hasWritePermission){ - Edit title - Delete - } -
- -

- - @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 +
+
+ Edit + +
+
} - - } - - +

+

+ @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 { +
} }