Delete RELEASE_ID column from RELEASE and RELEASE_ASSET
1 parent 2180e31 commit 1fe379111cfa1b64e2337e8511f73e5d8f2b3068
@Naoki Takezoe Naoki Takezoe authored on 13 Jan 2018
Showing 9 changed files
View
15
src/main/resources/update/gitbucket-core_4.21.xml
<changeSet>
<createTable tableName="RELEASE">
<column name="USER_NAME" type="varchar(100)" nullable="false"/>
<column name="REPOSITORY_NAME" type="varchar(100)" nullable="false"/>
<column name="RELEASE_ID" type="int" nullable="false" autoIncrement="true" unique="true"/>
<column name="TAG" type="varchar(100)" nullable="false"/>
<column name="NAME" type="varchar(100)" nullable="false"/>
<column name="TAG" type="varchar(100)" nullable="false"/>
<column name="AUTHOR" type="varchar(100)" nullable="false"/>
<column name="CONTENT" type="text" nullable="true"/>
<column name="REGISTERED_DATE" type="datetime" nullable="false"/>
<column name="UPDATED_DATE" type="datetime" nullable="false"/>
</createTable>
 
<addPrimaryKey constraintName="IDX_RELEASE_PK" tableName="RELEASE" columnNames="USER_NAME, REPOSITORY_NAME, RELEASE_ID"/>
<addUniqueConstraint constraintName="IDX_RELEASE_UNIQ" tableName="RELEASE" columnNames="USER_NAME, REPOSITORY_NAME, TAG"/>
<addPrimaryKey constraintName="IDX_RELEASE_PK" tableName="RELEASE" columnNames="USER_NAME, REPOSITORY_NAME, TAG"/>
<addForeignKeyConstraint constraintName="IDX_RELEASE_FK0" baseTableName="RELEASE" baseColumnNames="USER_NAME, REPOSITORY_NAME" referencedTableName="REPOSITORY" referencedColumnNames="USER_NAME, REPOSITORY_NAME"/>
 
<createTable tableName="RELEASE_ASSET">
<column name="USER_NAME" type="varchar(100)" nullable="false"/>
<column name="REPOSITORY_NAME" type="varchar(100)" nullable="false"/>
<column name="RELEASE_ID" type="int" nullable="false"/>
<column name="TAG" type="varchar(100)" nullable="false"/>
<column name="RELEASE_ASSET_ID" type="int" nullable="false" autoIncrement="true" unique="true"/>
<column name="FILE_NAME" type="varchar(260)" nullable="false"/>
<column name="LABEL" type="varchar(100)" nullable="true"/>
<column name="SIZE" type="bigint" nullable="false"/>
<column name="UPLOADER" type="varchar(100)" nullable="false"/>
<column name="REGISTERED_DATE" type="datetime" nullable="false"/>
<column name="UPDATED_DATE" type="datetime" nullable="false"/>
</createTable>
<addPrimaryKey constraintName="IDX_RELEASE_ASSET_PK" tableName="RELEASE_ASSET" columnNames="USER_NAME, REPOSITORY_NAME, RELEASE_ID, FILE_NAME"
/>
<addForeignKeyConstraint constraintName="IDX_RELEASE_ASSET_FK1" baseTableName="RELEASE_ASSET" baseColumnNames="USER_NAME, REPOSITORY_NAME, RELEASE_ID" referencedTableName="RELEASE" referencedColumnNames="USER_NAME, REPOSITORY_NAME, RELEASE_ID"/>
<addPrimaryKey constraintName="IDX_RELEASE_ASSET_PK" tableName="RELEASE_ASSET" columnNames="USER_NAME, REPOSITORY_NAME, TAG, FILE_NAME"/>
<addForeignKeyConstraint constraintName="IDX_RELEASE_ASSET_FK1" baseTableName="RELEASE_ASSET" baseColumnNames="USER_NAME, REPOSITORY_NAME, TAG" referencedTableName="RELEASE" referencedColumnNames="USER_NAME, REPOSITORY_NAME, TAG"/>
</changeSet>
View
60
src/main/scala/gitbucket/core/controller/ReleasesController.scala
},
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())
})
 
val tag = params("tag")
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 =>
val Array(_, fileId) = paramName.split(":")
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")
})
 
}
View
src/main/scala/gitbucket/core/model/Release.scala
View
src/main/scala/gitbucket/core/model/ReleasesAsset.scala
View
src/main/scala/gitbucket/core/service/ActivityService.scala
View
src/main/scala/gitbucket/core/service/ReleaseService.scala
View
src/main/twirl/gitbucket/core/releases/form.scala.html
View
src/main/twirl/gitbucket/core/releases/list.scala.html
View
src/main/twirl/gitbucket/core/releases/release.scala.html