mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-09 23:15:49 +01:00
(refs #1898) Display commit message of tags in the release page
This commit is contained in:
@@ -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")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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) + '"/>'
|
||||||
|
|||||||
@@ -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 =>
|
||||||
|
|||||||
Reference in New Issue
Block a user