(refs #1898) Display commit message of tags in the release page

This commit is contained in:
Naoki Takezoe
2018-03-09 21:25:36 +09:00
parent 8a13721c90
commit ae26e8ec6a
4 changed files with 51 additions and 40 deletions

View File

@@ -52,79 +52,86 @@ trait ReleaseControllerBase extends ControllerBase {
}) })
get("/:owner/:repository/releases/:tag")(referrersOnly { repository => get("/:owner/:repository/releases/:tag")(referrersOnly { repository =>
val tag = params("tag") val tagName = params("tag")
getRelease(repository.owner, repository.name, tag).map { release => getRelease(repository.owner, repository.name, tagName).map { release =>
html.release(release, getReleaseAssets(repository.owner, repository.name, tag), hasDeveloperRole(repository.owner, repository.name, context.loginAccount), repository) html.release(release, getReleaseAssets(repository.owner, repository.name, tagName),
hasDeveloperRole(repository.owner, repository.name, context.loginAccount), repository)
}.getOrElse(NotFound()) }.getOrElse(NotFound())
}) })
get("/:owner/:repository/releases/:tag/assets/:fileId")(referrersOnly {repository => get("/:owner/:repository/releases/:tag/assets/:fileId")(referrersOnly {repository =>
val tag = params("tag") val tagName = params("tag")
val fileId = params("fileId") val fileId = params("fileId")
(for { (for {
_ <- repository.tags.find(_.name == tag) _ <- repository.tags.find(_.name == tagName)
_ <- getRelease(repository.owner, repository.name, tag) _ <- getRelease(repository.owner, repository.name, tagName)
asset <- getReleaseAsset(repository.owner, repository.name, tag, fileId) asset <- getReleaseAsset(repository.owner, repository.name, tagName, fileId)
} yield { } yield {
response.setHeader("Content-Disposition", s"attachment; filename=${asset.label}") response.setHeader("Content-Disposition", s"attachment; filename=${asset.label}")
RawData( RawData(
FileUtil.getMimeType(asset.label), FileUtil.getMimeType(asset.label),
new File(getReleaseFilesDir(repository.owner, repository.name), tag + "/" + fileId) new File(getReleaseFilesDir(repository.owner, repository.name), tagName + "/" + fileId)
) )
}).getOrElse(NotFound()) }).getOrElse(NotFound())
}) })
get("/:owner/:repository/releases/:tag/create")(writableUsersOnly {repository => 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) => post("/:owner/:repository/releases/:tag/create", releaseForm)(writableUsersOnly { (form, repository) =>
val tag = params("tag") val tagName = params("tag")
val loginAccount = context.loginAccount.get val loginAccount = context.loginAccount.get
// Insert into RELEASE // 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 // Insert into RELEASE_ASSET
request.getParameterNames.asScala.filter(_.startsWith("file:")).foreach { paramName => request.getParameterNames.asScala.filter(_.startsWith("file:")).foreach { paramName =>
val Array(_, fileId) = paramName.split(":") val Array(_, fileId) = paramName.split(":")
val fileName = params(paramName) 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) 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 => get("/:owner/:repository/releases/:tag/edit")(writableUsersOnly {repository =>
val tag = params("tag") val tagName = params("tag")
getRelease(repository.owner, repository.name, tag).map { release => (for {
html.form(repository, release.tag, Some(release, getReleaseAssets(repository.owner, repository.name, tag))) release <- getRelease(repository.owner, repository.name, tagName)
}.getOrElse(NotFound()) 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) => post("/:owner/:repository/releases/:tag/edit", releaseForm)(writableUsersOnly { (form, repository) =>
val tag = params("tag") val tagName = params("tag")
val loginAccount = context.loginAccount.get val loginAccount = context.loginAccount.get
getRelease(repository.owner, repository.name, tag).map { release => getRelease(repository.owner, repository.name, tagName).map { release =>
// Update 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 // Delete and Insert RELEASE_ASSET
val assets = getReleaseAssets(repository.owner, repository.name, tag) val assets = getReleaseAssets(repository.owner, repository.name, tagName)
deleteReleaseAssets(repository.owner, repository.name, tag) deleteReleaseAssets(repository.owner, repository.name, tagName)
val fileIds = request.getParameterNames.asScala.filter(_.startsWith("file:")).map { paramName => val fileIds = request.getParameterNames.asScala.filter(_.startsWith("file:")).map { paramName =>
val Array(_, fileId) = paramName.split(":") val Array(_, fileId) = paramName.split(":")
val fileName = params(paramName) val fileName = params(paramName)
val size = new java.io.File(getReleaseFilesDir(repository.owner, repository.name), release.tag + "/" + fileId).length 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 fileId
} }
@@ -135,16 +142,16 @@ trait ReleaseControllerBase extends ControllerBase {
} }
} }
redirect(s"/${release.userName}/${release.repositoryName}/releases/${tag}") redirect(s"/${release.userName}/${release.repositoryName}/releases/${tagName}")
}.getOrElse(NotFound()) }.getOrElse(NotFound())
}) })
post("/:owner/:repository/releases/:tag/delete")(writableUsersOnly { repository => post("/:owner/:repository/releases/:tag/delete")(writableUsersOnly { repository =>
val tag = params("tag") val tagName = params("tag")
getRelease(repository.owner, repository.name, tag).foreach { release => getRelease(repository.owner, repository.name, tagName).foreach { release =>
FileUtils.deleteDirectory(new File(getReleaseFilesDir(repository.owner, repository.name), release.tag)) 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") redirect(s"/${repository.owner}/${repository.name}/releases")
}) })

View File

@@ -143,8 +143,9 @@ object JGitUtil {
* @param name the tag name * @param name the tag name
* @param time the tagged date * @param time the tagged date
* @param id the commit id * @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 * The submodule data
@@ -233,7 +234,7 @@ object JGitUtil {
git.tagList.call.asScala.flatMap { ref => git.tagList.call.asScala.flatMap { ref =>
try { try {
val revCommit = getRevCommitFromId(git, ref.getObjectId) 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 { } catch {
case _: IncorrectObjectTypeException => case _: IncorrectObjectTypeException =>
None None

View File

@@ -1,5 +1,5 @@
@(repository: gitbucket.core.service.RepositoryService.RepositoryInfo, @(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) release: Option[(gitbucket.core.model.Release, Seq[gitbucket.core.model.ReleaseAsset])])(implicit context: gitbucket.core.controller.Context)
@import gitbucket.core.view.helpers @import gitbucket.core.view.helpers
@gitbucket.core.html.main(s"New Release - ${repository.owner}/${repository.name}", Some(repository)){ @gitbucket.core.html.main(s"New Release - ${repository.owner}/${repository.name}", Some(repository)){
@@ -8,15 +8,15 @@
<div class="row-fluid"> <div class="row-fluid">
<div class="co`l-md-12"> <div class="co`l-md-12">
@if(release.isEmpty){ @if(release.isEmpty){
<h3>New release for @tag</h3> <h3>New release for @tag.name</h3>
} else { } else {
<h3>Update release for @tag</h3> <h3>Update release for @tag.name</h3>
} }
<span id="error-name" class="error"></span> <span id="error-name" class="error"></span>
<input type="text" id="release-name" name="name" class="form-control" value="@release.map { case (release, _) => @release.name }.getOrElse(tag)" placeholder="Title" style="margin-bottom: 6px;" autofocus/> <input type="text" id="release-name" name="name" class="form-control" value="@release.map { case (release, _) => @release.name }.getOrElse(tag.name)" placeholder="Title" style="margin-bottom: 6px;" autofocus/>
@gitbucket.core.helper.html.preview( @gitbucket.core.helper.html.preview(
repository = repository, repository = repository,
content = release.flatMap { case (release, _) => release.content }.getOrElse(""), content = release.flatMap { case (release, _) => release.content }.getOrElse(tag.message),
enableWikiLink = false, enableWikiLink = false,
enableRefsLink = true, enableRefsLink = true,
enableLineBreaks = true, enableLineBreaks = true,
@@ -31,7 +31,7 @@
@release.map { case (release, assets) => @release.map { case (release, assets) =>
@assets.map { asset => @assets.map { asset =>
<li> <li>
<a href="@context.baseUrl/@repository.owner/@repository.name/_release/@helpers.encodeRefName(tag)/@asset.fileName"><i class="octicon octicon-file"></i>@asset.label</a> <a href="@context.baseUrl/@repository.owner/@repository.name/_release/@helpers.encodeRefName(tag.name)/@asset.fileName"><i class="octicon octicon-file"></i>@asset.label</a>
<a href="#" class="remove pull-right" style="padding-top: 0px;">(remove)</a> <a href="#" class="remove pull-right" style="padding-top: 0px;">(remove)</a>
<input type="hidden" name="file:@asset.fileName" value="@asset.label"/> <input type="hidden" name="file:@asset.fileName" value="@asset.label"/>
</li> </li>
@@ -43,9 +43,9 @@
</div> </div>
<div class="align-right" style="margin-top: 12px;"> <div class="align-right" style="margin-top: 12px;">
@if(release.isEmpty){ @if(release.isEmpty){
<input type="submit" class="btn btn-success" value="Submit new release" formaction="@helpers.url(repository)/releases/@helpers.encodeRefName(tag)/create"/> <input type="submit" class="btn btn-success" value="Submit new release" formaction="@helpers.url(repository)/releases/@helpers.encodeRefName(tag.name)/create"/>
} else { } else {
<input type="submit" class="btn btn-success" value="Update release" formaction="@helpers.url(repository)/releases/@helpers.encodeRefName(tag)/edit"/> <input type="submit" class="btn btn-success" value="Update release" formaction="@helpers.url(repository)/releases/@helpers.encodeRefName(tag.name)/edit"/>
} }
</div> </div>
</div> </div>
@@ -61,11 +61,11 @@ $(function(){
$("#drop").dropzone({ $("#drop").dropzone({
maxFilesize: @{gitbucket.core.util.FileUtil.MaxFileSize / 1024 / 1024}, 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: "<div class=\"dz-preview\">\n <div class=\"dz-progress\"><span class=\"dz-upload\" data-dz-uploadprogress>Uploading your files...</span></div>\n <div class=\"dz-error-message\"><span data-dz-errormessage></span></div>\n</div>", previewTemplate: "<div class=\"dz-preview\">\n <div class=\"dz-progress\"><span class=\"dz-upload\" data-dz-uploadprogress>Uploading your files...</span></div>\n <div class=\"dz-error-message\"><span data-dz-errormessage></span></div>\n</div>",
success: function(file, id) { success: function(file, id) {
var attach = var attach =
'<li><a href="@context.baseUrl/@repository.owner/@repository.name/_release/@helpers.encodeRefName(tag)/' + id + '">' + '<li><a href="@context.baseUrl/@repository.owner/@repository.name/_release/@helpers.encodeRefName(tag.name)/' + id + '">' +
'<i class="octicon octicon-file"></i>' + escapeHtml(file.name) + '</a>' + '<i class="octicon octicon-file"></i>' + escapeHtml(file.name) + '</a>' +
'<a href="#" class="remove pull-right" style="padding-top: 0px;">(remove)</a>' + '<a href="#" class="remove pull-right" style="padding-top: 0px;">(remove)</a>' +
'<input type="hidden" name="file:' + id + '" value="' + escapeHtml(file.name) + '"/>' '<input type="hidden" name="file:' + id + '" value="' + escapeHtml(file.name) + '"/>'

View File

@@ -39,8 +39,11 @@
<a class="btn btn-success" href="@helpers.url(repository)/releases/@{helpers.encodeRefName(tag.name)}/create" id="edit">Create release</a> <a class="btn btn-success" href="@helpers.url(repository)/releases/@{helpers.encodeRefName(tag.name)}/create" id="edit">Create release</a>
</div> </div>
} }
<div>@tag.message<br><br></div>
} }
@*
<h4>Downloads</h4> <h4>Downloads</h4>
*@
<ul style="list-style: none; padding-left: 8px;"> <ul style="list-style: none; padding-left: 8px;">
@release.map { case (release, assets) => @release.map { case (release, assets) =>
@assets.map { asset => @assets.map { asset =>