diff --git a/src/main/scala/gitbucket/core/controller/ReleasesController.scala b/src/main/scala/gitbucket/core/controller/ReleasesController.scala index 89de469..b0ab907 100644 --- a/src/main/scala/gitbucket/core/controller/ReleasesController.scala +++ b/src/main/scala/gitbucket/core/controller/ReleasesController.scala @@ -2,7 +2,7 @@ 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 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 @@ )(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 @@ 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 + } } diff --git a/src/main/scala/gitbucket/core/service/IssuesService.scala b/src/main/scala/gitbucket/core/service/IssuesService.scala index 2a128f9..dd17c00 100644 --- a/src/main/scala/gitbucket/core/service/IssuesService.scala +++ b/src/main/scala/gitbucket/core/service/IssuesService.scala @@ -203,7 +203,7 @@ } /** - * 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 @@ 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( diff --git a/src/main/scala/gitbucket/core/service/PaginationHelper.scala b/src/main/scala/gitbucket/core/service/PaginationHelper.scala new file mode 100644 index 0000000..7f09eda --- /dev/null +++ b/src/main/scala/gitbucket/core/service/PaginationHelper.scala @@ -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) + } + +} diff --git a/src/main/scala/gitbucket/core/service/ReleaseService.scala b/src/main/scala/gitbucket/core/service/ReleaseService.scala index 47c7010..b496f21 100644 --- a/src/main/scala/gitbucket/core/service/ReleaseService.scala +++ b/src/main/scala/gitbucket/core/service/ReleaseService.scala @@ -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 @@ 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 @@ 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 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 getRelease(owner: String, repository: String, tag: String)(implicit s: Session): Option[ReleaseTag] = { + ReleaseTags.filter(_.byTag(owner, repository, tag)).firstOption + } def updateRelease(owner: String, repository: String, tag: String, title: String, content: Option[String])( implicit s: Session @@ -107,3 +105,9 @@ ReleaseTags filter (_.byPrimaryKey(owner, repository, tag)) delete } } + +object ReleaseService { + + val ReleaseLimit = 10 + +} diff --git a/src/main/scala/gitbucket/core/view/helpers.scala b/src/main/scala/gitbucket/core/view/helpers.scala index 4cb6f29..e9b1413 100644 --- a/src/main/scala/gitbucket/core/view/helpers.scala +++ b/src/main/scala/gitbucket/core/view/helpers.scala @@ -494,4 +494,8 @@ 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" + } + } diff --git a/src/main/twirl/gitbucket/core/helper/paginator.scala.html b/src/main/twirl/gitbucket/core/helper/paginator.scala.html index 37c7488..8629dc8 100644 --- a/src/main/twirl/gitbucket/core/helper/paginator.scala.html +++ b/src/main/twirl/gitbucket/core/helper/paginator.scala.html @@ -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){
diff --git a/src/main/twirl/gitbucket/core/issues/list.scala.html b/src/main/twirl/gitbucket/core/issues/list.scala.html index 755be28..4421b2e 100644 --- a/src/main/twirl/gitbucket/core/issues/list.scala.html +++ b/src/main/twirl/gitbucket/core/issues/list.scala.html @@ -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){