diff --git a/src/main/resources/update/gitbucket-core_4.21.xml b/src/main/resources/update/gitbucket-core_4.21.xml index 842389c..8cca0d1 100644 --- a/src/main/resources/update/gitbucket-core_4.21.xml +++ b/src/main/resources/update/gitbucket-core_4.21.xml @@ -3,23 +3,21 @@ - - + - - + - + @@ -28,7 +26,6 @@ - - + + diff --git a/src/main/scala/gitbucket/core/controller/ReleasesController.scala b/src/main/scala/gitbucket/core/controller/ReleasesController.scala index c1cdebf..6c26429 100644 --- a/src/main/scala/gitbucket/core/controller/ReleasesController.scala +++ b/src/main/scala/gitbucket/core/controller/ReleasesController.scala @@ -51,24 +51,25 @@ hasDeveloperRole(repository.owner, repository.name, context.loginAccount)) }) - get("/:owner/:repository/releases/:id")(referrersOnly {repository => - val id = params("id") - getRelease(repository.owner, repository.name, id).map{ release => - html.release(release, getReleaseAssets(repository.owner, repository.name, id), hasDeveloperRole(repository.owner, repository.name, context.loginAccount), repository) + get("/:owner/:repository/releases/:tag")(referrersOnly { repository => + val tag = params("tag") + getRelease(repository.owner, repository.name, tag).map { release => + html.release(release, getReleaseAssets(repository.owner, repository.name, tag), hasDeveloperRole(repository.owner, repository.name, context.loginAccount), repository) }.getOrElse(NotFound()) }) - get("/:owner/:repository/releases/:id/assets/:fileId")(referrersOnly {repository => - val releaseId = params("id") + get("/:owner/:repository/releases/:tag/assets/:fileId")(referrersOnly {repository => + val tag = params("tag") val fileId = params("fileId") (for { - release <- getRelease(repository.owner, repository.name, releaseId) - asset <- getReleaseAsset(repository.owner, repository.name, releaseId, fileId) + _ <- repository.tags.find(_.name == tag) + _ <- getRelease(repository.owner, repository.name, tag) + asset <- getReleaseAsset(repository.owner, repository.name, tag, fileId) } yield { response.setHeader("Content-Disposition", s"attachment; filename=${asset.label}") Some(RawData( FileUtil.getMimeType(asset.label), - new File(getReleaseFilesDir(repository.owner, repository.name), release.tag + "/" + fileId) + new File(getReleaseFilesDir(repository.owner, repository.name), tag + "/" + fileId) )) }).getOrElse(NotFound()) }) @@ -82,7 +83,7 @@ val loginAccount = context.loginAccount.get // Insert into RELEASE - val release = createRelease(repository.owner, repository.name, form.name, form.content, tag, loginAccount) + createRelease(repository.owner, repository.name, form.name, form.content, tag, loginAccount) // Insert into RELEASE_ASSET request.getParameterNames.asScala.filter(_.startsWith("file:")).foreach { paramName => @@ -90,50 +91,51 @@ val fileName = params(paramName) val size = new java.io.File(getReleaseFilesDir(repository.owner, repository.name), tag + "/" + fileId).length - createReleaseAsset(repository.owner, repository.name, release.releaseId, fileId, fileName, size, loginAccount) + createReleaseAsset(repository.owner, repository.name, tag, fileId, fileName, size, loginAccount) } - recordReleaseActivity(repository.owner, repository.name, loginAccount.userName, release.releaseId, release.name) + recordReleaseActivity(repository.owner, repository.name, loginAccount.userName, form.name) - redirect(s"/${release.userName}/${release.repositoryName}/releases/${release.releaseId}") + redirect(s"/${repository.owner}/${repository.name}/releases/${tag}") }) - get("/:owner/:repository/releases/:id/edit")(writableUsersOnly {repository => - val releaseId = params("id").toInt - getRelease(repository.owner, repository.name, releaseId).map { release => - html.form(repository, release.tag, Some(release, getReleaseAssets(repository.owner, repository.name, releaseId))) + get("/:owner/:repository/releases/:tag/edit")(writableUsersOnly {repository => + val tag = params("tag") + + getRelease(repository.owner, repository.name, tag).map { release => + html.form(repository, release.tag, Some(release, getReleaseAssets(repository.owner, repository.name, tag))) }.getOrElse(NotFound()) }) - post("/:owner/:repository/releases/:id/edit", releaseForm)(writableUsersOnly { (form, repository) => - val releaseId = params("id").toInt + post("/:owner/:repository/releases/:tag/edit", releaseForm)(writableUsersOnly { (form, repository) => + val tag = params("tag") val loginAccount = context.loginAccount.get - getRelease(repository.owner, repository.name, releaseId).map { release => + getRelease(repository.owner, repository.name, tag).map { release => // Update RELEASE - updateRelease(repository.owner, repository.name, releaseId, form.name, form.content) + updateRelease(repository.owner, repository.name, tag, form.name, form.content) // Delete and Insert RELEASE_ASSET - deleteReleaseAssets(repository.owner, repository.name, releaseId) + deleteReleaseAssets(repository.owner, repository.name, tag) request.getParameterNames.asScala.filter(_.startsWith("file:")).foreach { paramName => val Array(_, fileId) = paramName.split(":") val fileName = params(paramName) val size = new java.io.File(getReleaseFilesDir(repository.owner, repository.name), release.tag + "/" + fileId).length - createReleaseAsset(repository.owner, repository.name, release.releaseId, fileId, fileName, size, loginAccount) + createReleaseAsset(repository.owner, repository.name, tag, fileId, fileName, size, loginAccount) } - redirect(s"/${release.userName}/${release.repositoryName}/releases/${release.releaseId}") + redirect(s"/${release.userName}/${release.repositoryName}/releases/${tag}") }.getOrElse(NotFound()) }) - post("/:owner/:repository/releases/:id/delete")(writableUsersOnly { repository => - val releaseId = params("id") - getRelease(repository.owner, repository.name, releaseId).foreach { release => + post("/:owner/:repository/releases/:tag/delete")(writableUsersOnly { repository => + val tag = params("tag") + getRelease(repository.owner, repository.name, tag).foreach { release => FileUtils.deleteDirectory(new File(getReleaseFilesDir(repository.owner, repository.name), release.tag)) } - deleteRelease(repository.owner, repository.name, releaseId) + deleteRelease(repository.owner, repository.name, tag) redirect(s"/${repository.owner}/${repository.name}/releases") }) diff --git a/src/main/scala/gitbucket/core/model/Release.scala b/src/main/scala/gitbucket/core/model/Release.scala index 27fdbc0..ffd19c8 100644 --- a/src/main/scala/gitbucket/core/model/Release.scala +++ b/src/main/scala/gitbucket/core/model/Release.scala @@ -9,7 +9,6 @@ lazy val Releases = TableQuery[Releases] class Releases(tag_ : Tag) extends Table[Release](tag_, "RELEASE") with BasicTemplate { - val releaseId = column[Int]("RELEASE_ID", O AutoInc) val name = column[String]("NAME") val tag = column[String]("TAG") val author = column[String]("AUTHOR") @@ -17,29 +16,15 @@ val registeredDate = column[java.util.Date]("REGISTERED_DATE") val updatedDate = column[java.util.Date]("UPDATED_DATE") - def * = (userName, repositoryName, releaseId, name, tag, author, content, registeredDate, updatedDate) <> (Release.tupled, Release.unapply) - - def byPrimaryKey(owner: String, repository: String, releaseId: Int) = byRelease(owner, repository, releaseId) - - def byTag(owner: String, repository: String, tag: String) = - byRepository(owner, repository) && (this.tag === tag.bind) - - def byTag(userName: Rep[String], repositoryName: Rep[String], tag: Rep[String]) = - byRepository(userName, repositoryName) && (this.tag === tag) - - def byRelease(owner: String, repository: String, releaseId: Int) = - byRepository(owner, repository) && (this.releaseId === releaseId.bind) - - def byRelease(userName: Rep[String], repositoryName: Rep[String], releaseId: Rep[Int]) = - byRepository(userName, repositoryName) && (this.releaseId === releaseId) + def * = (userName, repositoryName, name, tag, author, content, registeredDate, updatedDate) <> (Release.tupled, Release.unapply) + def byPrimaryKey(owner: String, repository: String, tag: String) = byTag(owner, repository, tag) + def byTag(owner: String, repository: String, tag: String) = byRepository(owner, repository) && (this.tag === tag.bind) } - } case class Release( userName: String, repositoryName: String, - releaseId: Int = 0, name: String, tag: String, author: String, diff --git a/src/main/scala/gitbucket/core/model/ReleasesAsset.scala b/src/main/scala/gitbucket/core/model/ReleasesAsset.scala index 156ef75..7bd6697 100644 --- a/src/main/scala/gitbucket/core/model/ReleasesAsset.scala +++ b/src/main/scala/gitbucket/core/model/ReleasesAsset.scala @@ -10,8 +10,8 @@ lazy val ReleaseAssets = TableQuery[ReleaseAssets] - class ReleaseAssets(tag : Tag) extends Table[ReleaseAsset](tag, "RELEASE_ASSET") with BasicTemplate { - val releaseId = column[Int]("RELEASE_ID") + class ReleaseAssets(tag_ : Tag) extends Table[ReleaseAsset](tag_, "RELEASE_ASSET") with BasicTemplate { + val tag = column[String]("TAG") val releaseAssetId = column[Int]("RELEASE_ASSET_ID", O AutoInc) val fileName = column[String]("FILE_NAME") val label = column[String]("LABEL") @@ -20,23 +20,16 @@ val registeredDate = column[Date]("REGISTERED_DATE") val updatedDate = column[Date]("UPDATED_DATE") - def * = (userName, repositoryName, releaseId, releaseAssetId, fileName, label, size, uploader, registeredDate, updatedDate) <> (ReleaseAsset.tupled, ReleaseAsset.unapply) - - def byPrimaryKey(owner: String, repository: String, releaseId: Int, fileName: String) = byRelease(owner, repository, releaseId) && (this.fileName === fileName.bind) - - def byRelease(owner: String, repository: String, releaseId: Int) = - byRepository(owner, repository) && (this.releaseId === releaseId.bind) - - def byRelease(userName: Rep[String], repositoryName: Rep[String], releaseId: Rep[Int]) = - byRepository(userName, repositoryName) && (this.releaseId === releaseId) + def * = (userName, repositoryName, tag, releaseAssetId, fileName, label, size, uploader, registeredDate, updatedDate) <> (ReleaseAsset.tupled, ReleaseAsset.unapply) + def byPrimaryKey(owner: String, repository: String, tag: String, fileName: String) = byTag(owner, repository, tag) && (this.fileName === fileName.bind) + def byTag(owner: String, repository: String, tag: String) = byRepository(owner, repository) && (this.tag === tag.bind) } - } case class ReleaseAsset( userName: String, repositoryName: String, - releaseId: Int, + tag: String, releaseAssetId: Int = 0, fileName: String, label: String, diff --git a/src/main/scala/gitbucket/core/service/ActivityService.scala b/src/main/scala/gitbucket/core/service/ActivityService.scala index 2909761..54d9d5a 100644 --- a/src/main/scala/gitbucket/core/service/ActivityService.scala +++ b/src/main/scala/gitbucket/core/service/ActivityService.scala @@ -190,7 +190,7 @@ Some(message), currentDate) - def recordReleaseActivity(userName: String, repositoryName: String, activityUserName: String, releaseId: Int, name: String)(implicit s: Session): Unit = + def recordReleaseActivity(userName: String, repositoryName: String, activityUserName: String, name: String)(implicit s: Session): Unit = Activities insert Activity(userName, repositoryName, activityUserName, "release", s"[user:${activityUserName}] released ${name} at [repo:${userName}/${repositoryName}]", diff --git a/src/main/scala/gitbucket/core/service/ReleaseService.scala b/src/main/scala/gitbucket/core/service/ReleaseService.scala index 8aaa797..b1e8253 100644 --- a/src/main/scala/gitbucket/core/service/ReleaseService.scala +++ b/src/main/scala/gitbucket/core/service/ReleaseService.scala @@ -2,7 +2,6 @@ import gitbucket.core.controller.Context import gitbucket.core.model.{Account, Release, ReleaseAsset} -import gitbucket.core.util.StringUtil._ import gitbucket.core.model.Profile.profile.blockingApi._ import gitbucket.core.model.Profile._ import gitbucket.core.model.Profile.dateColumnType @@ -10,11 +9,11 @@ trait ReleaseService { self: AccountService with RepositoryService => - def createReleaseAsset(owner: String, repository: String, releaseId: Int, fileName: String, label: String, size: Long, loginAccount: Account)(implicit s: Session): Unit = { + def createReleaseAsset(owner: String, repository: String, tag: String, fileName: String, label: String, size: Long, loginAccount: Account)(implicit s: Session): Unit = { ReleaseAssets insert ReleaseAsset( userName = owner, repositoryName = repository, - releaseId = releaseId, + tag = tag, fileName = fileName, label = label, size = size, @@ -24,34 +23,25 @@ ) } - def getReleaseAssets(owner: String, repository: String, releaseId: Int)(implicit s: Session): Seq[ReleaseAsset] = { - ReleaseAssets.filter(x => x.byRelease(owner, repository, releaseId)).list - } - - def getReleaseAssets(owner: String, repository: String, releaseId: String)(implicit s: Session): Seq[ReleaseAsset] = { - if (isInteger(releaseId)) - getReleaseAssets(owner, repository, releaseId.toInt) - else - Seq.empty + def getReleaseAssets(owner: String, repository: String, tag: String)(implicit s: Session): Seq[ReleaseAsset] = { + ReleaseAssets.filter(x => x.byTag(owner, repository, tag)).list } def getReleaseAssetsMap(owner: String, repository: String)(implicit s: Session): Map[Release, Seq[ReleaseAsset]] = { val releases = getReleases(owner, repository) - releases.map(rel => (rel -> getReleaseAssets(owner, repository, rel.releaseId))).toMap + releases.map(rel => (rel -> getReleaseAssets(owner, repository, rel.tag))).toMap } - def getReleaseAsset(owner: String, repository: String, releaseId: String, fileId: String)(implicit s: Session): Option[ReleaseAsset] = { - if (isInteger(releaseId)) - ReleaseAssets.filter(x => x.byPrimaryKey(owner, repository, releaseId.toInt, fileId)) firstOption - else None + def getReleaseAsset(owner: String, repository: String, tag: String, fileId: String)(implicit s: Session): Option[ReleaseAsset] = { + ReleaseAssets.filter(x => x.byPrimaryKey(owner, repository, tag, fileId)) firstOption } - def deleteReleaseAssets(owner: String, repository: String, releaseId: Int)(implicit s: Session): Unit = { - ReleaseAssets.filter(x => x.byRelease(owner, repository, releaseId)) delete + def deleteReleaseAssets(owner: String, repository: String, tag: String)(implicit s: Session): Unit = { + ReleaseAssets.filter(x => x.byTag(owner, repository, tag)) delete } def createRelease(owner: String, repository: String, name: String, content: Option[String], tag: String, - loginAccount: Account)(implicit context: Context, s: Session): Release = { + loginAccount: Account)(implicit context: Context, s: Session): Int = { Releases insert Release( userName = owner, repositoryName = repository, @@ -62,39 +52,36 @@ registeredDate = currentDate, updatedDate = currentDate ) - getReleaseByTag(owner, repository, tag).get } def getReleases(owner: String, repository: String)(implicit s: Session): Seq[Release] = { Releases.filter(x => x.byRepository(owner, repository)).list } - def getRelease(owner: String, repository: String, releaseId: Int)(implicit s: Session): Option[Release] = { - Releases filter (_.byPrimaryKey(owner, repository, releaseId)) firstOption - } - - def getReleaseByTag(owner: String, repository: String, tag: String)(implicit s: Session): Option[Release] = { + def getRelease(owner: String, repository: String, tag: String)(implicit s: Session): Option[Release] = { + //Releases filter (_.byPrimaryKey(owner, repository, releaseId)) firstOption 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 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, releaseId: Int, title: String, content: Option[String])(implicit s: Session): Int = { + def updateRelease(owner: String, repository: String, tag: String, title: String, content: Option[String])(implicit s: Session): Int = { Releases - .filter (_.byPrimaryKey(owner, repository, releaseId)) + .filter (_.byPrimaryKey(owner, repository, tag)) .map { t => (t.name, t.content, t.updatedDate) } .update (title, content, currentDate) } - def deleteRelease(owner: String, repository: String, releaseId: String)(implicit s: Session): Unit = { - if (isInteger(releaseId)){ - val relId = releaseId.toInt - deleteReleaseAssets(owner, repository, relId) - Releases filter (_.byPrimaryKey(owner, repository, relId)) delete - } + def deleteRelease(owner: String, repository: String, tag: String)(implicit s: Session): Unit = { + deleteReleaseAssets(owner, repository, tag) + Releases filter (_.byPrimaryKey(owner, repository, tag)) delete } } diff --git a/src/main/twirl/gitbucket/core/releases/form.scala.html b/src/main/twirl/gitbucket/core/releases/form.scala.html index 1e09891..b3424cd 100644 --- a/src/main/twirl/gitbucket/core/releases/form.scala.html +++ b/src/main/twirl/gitbucket/core/releases/form.scala.html @@ -2,18 +2,9 @@ tag: String, release: Option[(gitbucket.core.model.Release, Seq[gitbucket.core.model.ReleaseAsset])])(implicit context: gitbucket.core.controller.Context) @import gitbucket.core.view.helpers - -@action = { - @release.map { case (release, _) => - @helpers.url(repository)/releases/@release.releaseId/edit - }.getOrElse { - @helpers.url(repository)/releases/@helpers.encodeRefName(tag)/create - } -} - @gitbucket.core.html.main(s"New Release - ${repository.owner}/${repository.name}", Some(repository)){ @gitbucket.core.html.menu("releases", repository){ -
+
@if(release.isEmpty){ diff --git a/src/main/twirl/gitbucket/core/releases/list.scala.html b/src/main/twirl/gitbucket/core/releases/list.scala.html index ed8f4a2..239a0f9 100644 --- a/src/main/twirl/gitbucket/core/releases/list.scala.html +++ b/src/main/twirl/gitbucket/core/releases/list.scala.html @@ -20,7 +20,7 @@
@release.map { case (release, assets) => -

@release.name

+

@release.name

@helpers.avatar(release.author, 20) @helpers.user(release.author, styleClass="username") released this @gitbucket.core.helper.html.datetimeago(release.registeredDate)

@@ -45,7 +45,7 @@ @release.map { case (release, assets) => @assets.map { asset =>
  • - @asset.label + @asset.label @helpers.readableSize(Some(asset.size))
  • } diff --git a/src/main/twirl/gitbucket/core/releases/release.scala.html b/src/main/twirl/gitbucket/core/releases/release.scala.html index 369ee50..09ebca9 100644 --- a/src/main/twirl/gitbucket/core/releases/release.scala.html +++ b/src/main/twirl/gitbucket/core/releases/release.scala.html @@ -3,7 +3,7 @@ hasWritePermission: Boolean, repository: gitbucket.core.service.RepositoryService.RepositoryInfo)(implicit context: gitbucket.core.controller.Context) @import gitbucket.core.view.helpers -@gitbucket.core.html.main(s"${release.name} - Release ${release.releaseId} - ${repository.owner}/${repository.name}", Some(repository)){ +@gitbucket.core.html.main(s"Release ${release.name} - ${repository.owner}/${repository.name}", Some(repository)){ @gitbucket.core.html.menu("releases", repository){
    @@ -21,8 +21,8 @@ @release.name @if(hasWritePermission){
    - - Edit + + Edit
    @@ -44,7 +44,7 @@