diff --git a/src/main/scala/gitbucket/core/controller/ReleasesController.scala b/src/main/scala/gitbucket/core/controller/ReleasesController.scala index 6690e31..c1784cb 100644 --- a/src/main/scala/gitbucket/core/controller/ReleasesController.scala +++ b/src/main/scala/gitbucket/core/controller/ReleasesController.scala @@ -1,13 +1,16 @@ package gitbucket.core.controller -import gitbucket.core.service.{RepositoryService, AccountService, ReleaseService, ActivityService} -import gitbucket.core.util.{ReferrerAuthenticator, ReadableUsersAuthenticator, WritableUsersAuthenticator, FileUtil, Notifier} +import java.io.File + +import gitbucket.core.service.{AccountService, ActivityService, ReleaseService, RepositoryService} +import gitbucket.core.util.{FileUtil, Notifier, ReadableUsersAuthenticator, ReferrerAuthenticator, WritableUsersAuthenticator} import gitbucket.core.util.Directory._ import gitbucket.core.util.Implicits._ import gitbucket.core.util.SyntaxSugars._ import gitbucket.core.view.Markdown import io.github.gitbucket.scalatra.forms._ import gitbucket.core.releases.html +import org.apache.commons.io.FileUtils class ReleaseController extends ReleaseControllerBase with RepositoryService @@ -68,11 +71,25 @@ 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 java.io.File(getReleaseFilesDir(repository.owner, repository.name) + s"/${release.releaseId}", fileId))) + Some(RawData(FileUtil.getMimeType(asset.label), new File(getReleaseFilesDir(repository.owner, repository.name) + s"/${release.releaseId}", 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) => @@ -89,6 +106,11 @@ }) 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")) }) diff --git a/src/main/scala/gitbucket/core/service/ReleaseService.scala b/src/main/scala/gitbucket/core/service/ReleaseService.scala index f70c1c0..8d556ec 100644 --- a/src/main/scala/gitbucket/core/service/ReleaseService.scala +++ b/src/main/scala/gitbucket/core/service/ReleaseService.scala @@ -49,10 +49,14 @@ 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 = { Releases insert Release( diff --git a/src/main/twirl/gitbucket/core/releases/list.scala.html b/src/main/twirl/gitbucket/core/releases/list.scala.html index 11e5b5b..7f2ed31 100644 --- a/src/main/twirl/gitbucket/core/releases/list.scala.html +++ b/src/main/twirl/gitbucket/core/releases/list.scala.html @@ -13,21 +13,21 @@ @repository.tags.reverse.map{ tag => - @tagReleaseMap.get(tag.name).map{rel => + @tagReleaseMap.get(tag.name).map{release =>
@tag.name
-

@rel.name

+

@release.name

- @helpers.avatar(rel.author, 20) - @helpers.user(rel.author, styleClass="username strong") - released this @gitbucket.core.helper.html.datetimeago(rel.registeredDate) + @helpers.avatar(release.author, 20) + @helpers.user(release.author, styleClass="username strong") + released this @gitbucket.core.helper.html.datetimeago(release.registeredDate)
@helpers.markdown( - markdown = rel.content getOrElse "No description provided.", + markdown = release.content getOrElse "No description provided.", repository = repository, enableWikiLink = false, enableRefsLink = true, @@ -38,13 +38,17 @@

Downloads

diff --git a/src/main/twirl/gitbucket/core/releases/release.scala.html b/src/main/twirl/gitbucket/core/releases/release.scala.html index e3504f5..505a666 100644 --- a/src/main/twirl/gitbucket/core/releases/release.scala.html +++ b/src/main/twirl/gitbucket/core/releases/release.scala.html @@ -66,6 +66,9 @@ @asset.label @helpers.readableSize(Some(asset.size)) + @if(hasWritePermission){ + Delete + } } @@ -79,6 +82,16 @@