Implement release pagination (#2444)

This commit is contained in:
Pedro Rijo
2020-04-26 12:10:41 +01:00
committed by GitHub
parent f893d045c7
commit ded4ab702d
8 changed files with 82 additions and 39 deletions

View File

@@ -2,7 +2,7 @@ package gitbucket.core.controller
import java.io.File
import gitbucket.core.service.{AccountService, ActivityService, ReleaseService, RepositoryService}
import gitbucket.core.service.{AccountService, ActivityService, PaginationHelper, ReleaseService, RepositoryService}
import gitbucket.core.util._
import gitbucket.core.util.Directory._
import gitbucket.core.util.Implicits._
@@ -10,6 +10,7 @@ import org.scalatra.forms._
import gitbucket.core.releases.html
import org.apache.commons.io.FileUtils
import org.eclipse.jgit.api.Git
import scala.util.Using
class ReleaseController
@@ -42,17 +43,14 @@ trait ReleaseControllerBase extends ControllerBase {
)(ReleaseForm.apply)
get("/:owner/:repository/releases")(referrersOnly { repository =>
val releases = getReleases(repository.owner, repository.name)
val assets = getReleaseAssetsMap(repository.owner, repository.name)
val page = PaginationHelper.page(params.get("page"))
html.list(
repository,
repository.tags.reverse.map { tag =>
(tag, releases.find(_.tag == tag.name).map { release =>
(release, assets(release))
})
},
hasDeveloperRole(repository.owner, repository.name, context.loginAccount)
fetchReleases(repository, page),
hasDeveloperRole(repository.owner, repository.name, context.loginAccount),
page,
repository.tags.size
)
})
@@ -215,4 +213,21 @@ trait ReleaseControllerBase extends ControllerBase {
redirect(s"/${repository.owner}/${repository.name}/releases")
})
private def fetchReleases(repository: RepositoryService.RepositoryInfo, page: Int) = {
import gitbucket.core.service.ReleaseService._
val (offset, limit) = ((page - 1) * ReleaseLimit, ReleaseLimit)
val tagsToDisplay = repository.tags.reverse.slice(offset, offset + limit)
val releases = getReleases(repository.owner, repository.name, tagsToDisplay)
val assets = getReleaseAssetsMap(repository.owner, repository.name, releases)
val tagsWithReleases = tagsToDisplay.map { tag =>
(tag, releases.find(_.tag == tag.name).map { release =>
(release, assets(release))
})
}
tagsWithReleases
}
}

View File

@@ -203,7 +203,7 @@ trait IssuesService {
}
/**
* Returns the search result against issues.
* Returns the search result against issues.
*
* @param condition the search condition
* @param pullRequest if true then returns only pull requests, false then returns only issues.
@@ -910,13 +910,9 @@ object IssuesService {
param(request, "groups").map(_.split(",").toSet).getOrElse(Set.empty)
)
def page(request: HttpServletRequest) =
try {
val i = param(request, "page").getOrElse("1").toInt
if (i <= 0) 1 else i
} catch {
case e: NumberFormatException => 1
}
def page(request: HttpServletRequest) = {
PaginationHelper.page(param(request, "page"))
}
}
case class CommitStatusInfo(

View File

@@ -0,0 +1,15 @@
package gitbucket.core.service
import scala.util.Try
object PaginationHelper {
def page(page: Option[String]) = {
page
.flatMap(pageStr => Try(pageStr.toInt).toOption)
.map(Math.max(1, _)) // remove negative pages
.getOrElse(1)
}
}

View File

@@ -1,10 +1,11 @@
package gitbucket.core.service
import gitbucket.core.controller.Context
import gitbucket.core.model.{Account, ReleaseTag, ReleaseAsset}
import gitbucket.core.model.{Account, ReleaseAsset, ReleaseTag}
import gitbucket.core.model.Profile.profile.blockingApi._
import gitbucket.core.model.Profile._
import gitbucket.core.model.Profile.dateColumnType
import gitbucket.core.util.JGitUtil
trait ReleaseService {
self: AccountService with RepositoryService =>
@@ -35,10 +36,9 @@ trait ReleaseService {
ReleaseAssets.filter(x => x.byTag(owner, repository, tag)).list
}
def getReleaseAssetsMap(owner: String, repository: String)(
def getReleaseAssetsMap(owner: String, repository: String, releases: Seq[ReleaseTag])(
implicit s: Session
): Map[ReleaseTag, Seq[ReleaseAsset]] = {
val releases = getReleases(owner, repository)
releases.map(rel => (rel -> getReleaseAssets(owner, repository, rel.tag))).toMap
}
@@ -76,20 +76,18 @@ trait ReleaseService {
ReleaseTags.filter(x => x.byRepository(owner, repository)).sortBy(x => x.updatedDate).list
}
def getRelease(owner: String, repository: String, tag: String)(implicit s: Session): Option[ReleaseTag] = {
//Releases filter (_.byPrimaryKey(owner, repository, releaseId)) firstOption
ReleaseTags filter (_.byTag(owner, repository, tag)) firstOption
def getReleases(owner: String, repository: String, tags: Seq[JGitUtil.TagInfo])(
implicit s: Session
): Seq[ReleaseTag] = {
ReleaseTags
.filter(x => x.byRepository(owner, repository))
.filter(x => x.tag inSetBind tags.map(_.name))
.sortBy(x => x.updatedDate)
.list
}
def getRelease(owner: String, repository: String, tag: String)(implicit s: Session): Option[ReleaseTag] = {
ReleaseTags.filter(_.byTag(owner, repository, tag)).firstOption
}
// def getReleaseByTag(owner: String, repository: String, tag: String)(implicit s: Session): Option[Release] = {
// Releases filter (_.byTag(owner, repository, tag)) firstOption
// }
//
// def getRelease(owner: String, repository: String, releaseId: String)(implicit s: Session): Option[Release] = {
// if (isInteger(releaseId))
// getRelease(owner, repository, releaseId.toInt)
// else None
// }
def updateRelease(owner: String, repository: String, tag: String, title: String, content: Option[String])(
implicit s: Session
@@ -107,3 +105,9 @@ trait ReleaseService {
ReleaseTags filter (_.byPrimaryKey(owner, repository, tag)) delete
}
}
object ReleaseService {
val ReleaseLimit = 10
}

View File

@@ -494,4 +494,8 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache
case class CommentDiffLine(newLine: Option[String], oldLine: Option[String], `type`: String, text: String)
def appendQueryString(baseUrl: String, queryString: String): String = {
s"$baseUrl${if (baseUrl.contains("?")) "&" else "?"}$queryString"
}
}

View File

@@ -1,4 +1,5 @@
@(page: Int, count: Int, limit: Int, width: Int, baseURL: String)
@import gitbucket.core.view.helpers
@(page: Int, count: Int, limit: Int, width: Int, baseURL: String = "")
@defining(gitbucket.core.view.Pagination(page, count, limit, width)){ p =>
@if(p.count > p.limit){
<div>
@@ -6,7 +7,7 @@
@if(page == 1){
<li class="disabled"><span>&#9664;</span></li>
} else {
<li><a href="@baseURL&page=@(page - 1)">&#9664;</a></li>
<li><a href="@helpers.appendQueryString(baseURL, s"page=${page - 1 }")">&#9664;</a></li>
}
@for(i <- 1 to p.max){
@if(i == p.max && p.omitRight){
@@ -16,7 +17,7 @@
<li class="active"><span>@i</span></li>
} else {
@if(p.visibleFor(i)){
<li><a href="@baseURL&page=@i">@i</a></li>
<li><a href="@helpers.appendQueryString(baseURL, s"page=$i")">@i</a></li>
}
}
@if(i == 1 && p.omitLeft){
@@ -26,7 +27,7 @@
@if(page == p.max){
<li class="disabled"><span>&#9654;</span></li>
} else {
<li><a href="@baseURL&page=@(page + 1)">&#9654;</a></li>
<li><a href="@helpers.appendQueryString(baseURL, s"page=${page + 1}")">&#9654;</a></li>
}
</ul>
</div>

View File

@@ -11,7 +11,9 @@
repository: gitbucket.core.service.RepositoryService.RepositoryInfo,
isEditable: Boolean,
isManageable: Boolean)(implicit context: gitbucket.core.controller.Context)
@import gitbucket.core.view.helpers
@gitbucket.core.html.main((if(target == "issues") "Issues" else "Pull requests") + s" - ${repository.owner}/${repository.name}", Some(repository)){
@gitbucket.core.html.menu(target, repository){
<ul class="nav nav-pills pull-left" style="line-height: 14px; margin-bottom: 10px;">

View File

@@ -1,6 +1,8 @@
@(repository: gitbucket.core.service.RepositoryService.RepositoryInfo,
releases: Seq[(gitbucket.core.util.JGitUtil.TagInfo, Option[(gitbucket.core.model.ReleaseTag, Seq[gitbucket.core.model.ReleaseAsset])])],
hasWritePermission: Boolean)(implicit context: gitbucket.core.controller.Context)
releases: Seq[(gitbucket.core.util.JGitUtil.TagInfo, Option[(gitbucket.core.model.ReleaseTag, Seq[gitbucket.core.model.ReleaseAsset])])],
hasWritePermission: Boolean,
page: Int, totalReleases: Int)(implicit context: gitbucket.core.controller.Context)
@import gitbucket.core.view.helpers
@gitbucket.core.html.main("Releases" + s" - ${repository.owner}/${repository.name}", Some(repository)){
@gitbucket.core.html.menu("releases", repository){
@@ -61,5 +63,9 @@
}
</tbody>
</table>
<div class="pull-right">
@gitbucket.core.helper.html.paginator(page, totalReleases, gitbucket.core.service.ReleaseService.ReleaseLimit, 10)
</div>
}
}