Delete asset entry and files.

This commit is contained in:
KOUNOIKE Yuusuke
2017-04-22 10:33:30 +09:00
parent 806a5aecef
commit 3a8b93d44a
4 changed files with 57 additions and 14 deletions

View File

@@ -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 @@ trait ReleaseControllerBase extends ControllerBase {
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 @@ trait ReleaseControllerBase extends ControllerBase {
})
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"))
})

View File

@@ -49,10 +49,14 @@ trait ReleaseService {
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(

View File

@@ -13,21 +13,21 @@ hasWritePermission: Boolean)(implicit context: gitbucket.core.controller.Context
@repository.tags.reverse.map{ tag =>
<tr>
<td>
@tagReleaseMap.get(tag.name).map{rel =>
@tagReleaseMap.get(tag.name).map{release =>
<div class="col-md-1"><a href="@helpers.url(repository)/tree/@tag.name"><i class="octicon octicon-tag"></i>@tag.name</a></div>
<div class="col-md-11" style="border-left: 1px solid #eee">
<h3><a href="@helpers.url(repository)/releases/@rel.releaseId">@rel.name</a></h3>
<h3><a href="@helpers.url(repository)/releases/@release.releaseId">@release.name</a></h3>
<div class="panel panel-default">
<div class="panel-heading">
<span class="muted">
@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)
</span>
</div>
<div class="panel-body release-note markdown-body">
@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 @@ hasWritePermission: Boolean)(implicit context: gitbucket.core.controller.Context
</div>
<h2>Downloads</h2>
<ul style="list-style: none">
@releaseAssetsMap(rel).map{ asset =>
<li><i class="octicon octicon-file"></i><a href="@helpers.url(repository)/releases/@rel.releaseId/assets/@asset.fileName">@asset.label</a></li>
@releaseAssetsMap(release).map{ asset =>
<li>
<i class="octicon octicon-file"></i>
<a href="@helpers.url(repository)/releases/@release.releaseId/assets/@asset.fileName">@asset.label</a>
<span class="label label-default">@helpers.readableSize(Some(asset.size))</span>
</li>
}
</ul>
<ul style="list-style: none;">
<li><a href="@helpers.url(repository)/archive/@{helpers.encodeRefName(rel.tag)}.zip"><i class="octicon octicon-file-zip"></i>ZIP</a></li>
<li><a href="@helpers.url(repository)/archive/@{helpers.encodeRefName(rel.tag)}.tar.gz"><i class="octicon octicon-file-zip"></i>TAR.GZ</a></li>
<li><a href="@helpers.url(repository)/archive/@{helpers.encodeRefName(release.tag)}.zip"><i class="octicon octicon-file-zip"></i>ZIP</a></li>
<li><a href="@helpers.url(repository)/archive/@{helpers.encodeRefName(release.tag)}.tar.gz"><i class="octicon octicon-file-zip"></i>TAR.GZ</a></li>
</ul>
</div>
</div>

View File

@@ -66,6 +66,9 @@ repository: gitbucket.core.service.RepositoryService.RepositoryInfo)(implicit co
<i class="octicon octicon-file"></i>
<a href="@helpers.url(repository)/releases/@release.releaseId/assets/@asset.fileName">@asset.label</a>
<span class="label label-default">@helpers.readableSize(Some(asset.size))</span>
@if(hasWritePermission){
<a href="#" data-asset-file-name="@asset.fileName" class="label label-danger delete-asset">Delete</a>
}
</li>
}
</ul>
@@ -79,6 +82,16 @@ repository: gitbucket.core.service.RepositoryService.RepositoryInfo)(implicit co
</div>
<script>
$(function(){
$('.delete-asset').click(function(){
var name = $(this).data('asset-file-name');
var url = '@helpers.url(repository)/releases/@release.releaseId/assets/delete/' + name;
var li = $(this).closest('li');
$.post(url,
function(data){
li.remove();
});
return false;
});
$('#edit').click(function(){
$('.edit-title').show();
$('.show-title').hide();