mirror of
https://github.com/gitbucket/gitbucket.git
synced 2026-01-08 08:32:20 +01:00
Handle slash contained tag name correctly in releases (#2805)
This commit is contained in:
@@ -131,7 +131,7 @@ class FileUploadController
|
||||
} getOrElse BadRequest()
|
||||
}
|
||||
|
||||
post("/release/:owner/:repository/:tag") {
|
||||
post("/release/:owner/:repository/*") {
|
||||
setMultipartConfigForLargeFile()
|
||||
session
|
||||
.get(Keys.Session.LoginAccount)
|
||||
@@ -139,7 +139,7 @@ class FileUploadController
|
||||
case _: Account =>
|
||||
val owner = params("owner")
|
||||
val repository = params("repository")
|
||||
val tag = params("tag")
|
||||
val tag = multiParams("splat").head
|
||||
execute(
|
||||
{ (file, fileId) =>
|
||||
FileUtils.writeByteArrayToFile(
|
||||
|
||||
@@ -63,8 +63,8 @@ trait ReleaseControllerBase extends ControllerBase {
|
||||
)
|
||||
})
|
||||
|
||||
get("/:owner/:repository/releases/:tag")(referrersOnly { repository =>
|
||||
val tagName = params("tag")
|
||||
get("/:owner/:repository/releases/*")(referrersOnly { repository =>
|
||||
val tagName = multiParams("splat").head
|
||||
getRelease(repository.owner, repository.name, tagName)
|
||||
.map { release =>
|
||||
html.release(
|
||||
@@ -77,8 +77,8 @@ trait ReleaseControllerBase extends ControllerBase {
|
||||
.getOrElse(NotFound())
|
||||
})
|
||||
|
||||
get("/:owner/:repository/releases/:tag/assets/:fileId")(referrersOnly { repository =>
|
||||
val tagName = params("tag")
|
||||
get("/:owner/:repository/releases/*/assets/:fileId")(referrersOnly { repository =>
|
||||
val tagName = multiParams("splat").head
|
||||
val fileId = params("fileId")
|
||||
(for {
|
||||
_ <- repository.tags.find(_.name == tagName)
|
||||
@@ -93,8 +93,8 @@ trait ReleaseControllerBase extends ControllerBase {
|
||||
}).getOrElse(NotFound())
|
||||
})
|
||||
|
||||
get("/:owner/:repository/releases/:tag/create")(writableUsersOnly { repository =>
|
||||
val tagName = params("tag")
|
||||
get("/:owner/:repository/releases/*/create")(writableUsersOnly { repository =>
|
||||
val tagName = multiParams("splat").head
|
||||
val previousTags = repository.tags.takeWhile(_.name != tagName).reverse
|
||||
|
||||
repository.tags
|
||||
@@ -105,10 +105,11 @@ trait ReleaseControllerBase extends ControllerBase {
|
||||
.getOrElse(NotFound())
|
||||
})
|
||||
|
||||
post("/:owner/:repository/releases/:tag/create", releaseForm)(writableUsersOnly { (form, repository) =>
|
||||
post("/:owner/:repository/releases/*/create", releaseForm)(writableUsersOnly { (form, repository) =>
|
||||
context.withLoginAccount {
|
||||
loginAccount =>
|
||||
val tagName = params("tag")
|
||||
val tagName = multiParams("splat").head
|
||||
|
||||
// Insert into RELEASE
|
||||
createRelease(repository.owner, repository.name, form.name, form.content, tagName, loginAccount)
|
||||
|
||||
@@ -151,8 +152,8 @@ trait ReleaseControllerBase extends ControllerBase {
|
||||
commitLog
|
||||
})
|
||||
|
||||
get("/:owner/:repository/releases/:tag/edit")(writableUsersOnly { repository =>
|
||||
val tagName = params("tag")
|
||||
get("/:owner/:repository/releases/*/edit")(writableUsersOnly { repository =>
|
||||
val tagName = multiParams("splat").head
|
||||
val previousTags = repository.tags.takeWhile(_.name != tagName).reverse
|
||||
|
||||
(for {
|
||||
@@ -169,10 +170,10 @@ trait ReleaseControllerBase extends ControllerBase {
|
||||
}).getOrElse(NotFound())
|
||||
})
|
||||
|
||||
post("/:owner/:repository/releases/:tag/edit", releaseForm)(writableUsersOnly { (form, repository) =>
|
||||
post("/:owner/:repository/releases/*/edit", releaseForm)(writableUsersOnly { (form, repository) =>
|
||||
context.withLoginAccount {
|
||||
loginAccount =>
|
||||
val tagName = params("tag")
|
||||
val tagName = multiParams("splat").head
|
||||
|
||||
getRelease(repository.owner, repository.name, tagName)
|
||||
.map {
|
||||
@@ -215,8 +216,8 @@ trait ReleaseControllerBase extends ControllerBase {
|
||||
}
|
||||
})
|
||||
|
||||
post("/:owner/:repository/releases/:tag/delete")(writableUsersOnly { repository =>
|
||||
val tagName = params("tag")
|
||||
post("/:owner/:repository/releases/*/delete")(writableUsersOnly { repository =>
|
||||
val tagName = multiParams("splat").head
|
||||
getRelease(repository.owner, repository.name, tagName).foreach { release =>
|
||||
FileUtils.deleteDirectory(
|
||||
new File(getReleaseFilesDir(repository.owner, repository.name), FileUtil.checkFilename(release.tag))
|
||||
@@ -227,7 +228,6 @@ trait ReleaseControllerBase extends ControllerBase {
|
||||
})
|
||||
|
||||
private def fetchReleases(repository: RepositoryService.RepositoryInfo, page: Int) = {
|
||||
|
||||
import gitbucket.core.service.ReleaseService._
|
||||
|
||||
val (offset, limit) = ((page - 1) * ReleaseLimit, ReleaseLimit)
|
||||
|
||||
@@ -816,11 +816,13 @@ object RepositoryService {
|
||||
def sshUrl(implicit context: Context): Option[String] = RepositoryService.sshUrl(owner, name)
|
||||
|
||||
def splitPath(path: String): (String, String) = {
|
||||
val id = branchList.collectFirst {
|
||||
case branch if (path == branch || path.startsWith(branch + "/")) => branch
|
||||
} orElse tags.collectFirst {
|
||||
case tag if (path == tag.name || path.startsWith(tag.name + "/")) => tag.name
|
||||
} getOrElse path.split("/")(0)
|
||||
val names = (branchList ++ tags.map(_.name)).sortBy(_.length).reverse
|
||||
|
||||
val id = names.collectFirst {
|
||||
case name if (path == name || path.startsWith(name + "/")) => name
|
||||
} getOrElse {
|
||||
path.split("/")(0)
|
||||
}
|
||||
|
||||
(id, path.substring(id.length).stripPrefix("/"))
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
@release.map { case (release, assets) =>
|
||||
@assets.map { asset =>
|
||||
<li>
|
||||
<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="@context.baseUrl/@repository.owner/@repository.name/_release/@helpers.urlEncode(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>
|
||||
<input type="hidden" name="file:@asset.fileName" value="@asset.label"/>
|
||||
</li>
|
||||
@@ -56,9 +56,9 @@
|
||||
</div>
|
||||
<div class="align-right" style="margin-top: 12px;">
|
||||
@if(release.isEmpty){
|
||||
<input type="submit" class="btn btn-success" value="Submit new release" formaction="@helpers.url(repository)/releases/@helpers.encodeRefName(tag.name)/create"/>
|
||||
<input type="submit" class="btn btn-success" value="Submit new release" formaction="@helpers.url(repository)/releases/@helpers.urlEncode(tag.name)/create"/>
|
||||
} else {
|
||||
<input type="submit" class="btn btn-success" value="Update release" formaction="@helpers.url(repository)/releases/@helpers.encodeRefName(tag.name)/edit"/>
|
||||
<input type="submit" class="btn btn-success" value="Update release" formaction="@helpers.url(repository)/releases/@helpers.urlEncode(tag.name)/edit"/>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -15,14 +15,14 @@
|
||||
<tr>
|
||||
<td>
|
||||
<div class="col-md-2 text-right">
|
||||
<a href="@helpers.url(repository)/tree/@helpers.encodeRefName(tag.name)" class="strong"><i class="octicon octicon-tag"></i>@tag.name</a><br>
|
||||
<a href="@helpers.url(repository)/tree/@helpers.urlEncode(tag.name)" class="strong"><i class="octicon octicon-tag"></i>@tag.name</a><br>
|
||||
<a href="@helpers.url(repository)/commit/@tag.id" class="monospace muted"><i class="octicon octicon-git-commit"></i>@tag.id.substring(0, 7)</a><br>
|
||||
<span class="muted">@gitbucket.core.helper.html.datetimeago(tag.time)</span>
|
||||
</div>
|
||||
<div class="col-md-10" style="border-left: 1px solid #eee">
|
||||
<div class="release-note markdown-body">
|
||||
@release.map { case (release, assets) =>
|
||||
<h3><a href="@helpers.url(repository)/releases/@release.tag">@release.name</a></h3>
|
||||
<h3><a href="@helpers.url(repository)/releases/@helpers.urlEncode(release.tag)">@release.name</a></h3>
|
||||
<p class="muted">
|
||||
@helpers.avatarLink(release.author, 20) @helpers.user(release.author, styleClass="username") released this @gitbucket.core.helper.html.datetimeago(release.registeredDate)
|
||||
</p>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<div class="col-md-2 text-right">
|
||||
@defining(repository.tags.find(_.name == release.tag)){ tag =>
|
||||
@tag.map { tag =>
|
||||
<a href="@helpers.url(repository)/tree/@helpers.encodeRefName(tag.name)" class="strong"><i class="octicon octicon-tag"></i>@tag.name</a><br>
|
||||
<a href="@helpers.url(repository)/tree/@helpers.urlEncode(tag.name)" class="strong"><i class="octicon octicon-tag"></i>@tag.name</a><br>
|
||||
<a href="@helpers.url(repository)/commit/@tag.id" class="monospace muted"><i class="octicon octicon-git-commit"></i>@tag.id.substring(0, 7)</a><br>
|
||||
<span class="muted">@gitbucket.core.helper.html.datetimeago(tag.time)</span>
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user