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){
-