mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-06 13:35:50 +01:00
(refs #412)Fix repository lock
This commit is contained in:
@@ -291,7 +291,7 @@ trait AccountControllerBase extends AccountManagementControllerBase {
|
|||||||
* Create new repository.
|
* Create new repository.
|
||||||
*/
|
*/
|
||||||
post("/new", newRepositoryForm)(usersOnly { form =>
|
post("/new", newRepositoryForm)(usersOnly { form =>
|
||||||
LockUtil.lock(s"${form.owner}/${form.name}/create"){
|
LockUtil.lock(s"${form.owner}/${form.name}"){
|
||||||
if(getRepository(form.owner, form.name, context.baseUrl).isEmpty){
|
if(getRepository(form.owner, form.name, context.baseUrl).isEmpty){
|
||||||
val ownerAccount = getAccountByUserName(form.owner).get
|
val ownerAccount = getAccountByUserName(form.owner).get
|
||||||
val loginAccount = context.loginAccount.get
|
val loginAccount = context.loginAccount.get
|
||||||
@@ -354,7 +354,7 @@ trait AccountControllerBase extends AccountManagementControllerBase {
|
|||||||
val loginAccount = context.loginAccount.get
|
val loginAccount = context.loginAccount.get
|
||||||
val loginUserName = loginAccount.userName
|
val loginUserName = loginAccount.userName
|
||||||
|
|
||||||
LockUtil.lock(s"${loginUserName}/${repository.name}/create"){
|
LockUtil.lock(s"${loginUserName}/${repository.name}"){
|
||||||
if(repository.owner == loginUserName || getRepository(loginAccount.userName, repository.name, baseUrl).isDefined){
|
if(repository.owner == loginUserName || getRepository(loginAccount.userName, repository.name, baseUrl).isDefined){
|
||||||
// redirect to the repository if repository already exists
|
// redirect to the repository if repository already exists
|
||||||
redirect(s"/${loginUserName}/${repository.name}")
|
redirect(s"/${loginUserName}/${repository.name}")
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ import org.eclipse.jgit.lib.{ObjectId, CommitBuilder, PersonIdent}
|
|||||||
import service.IssuesService._
|
import service.IssuesService._
|
||||||
import service.PullRequestService._
|
import service.PullRequestService._
|
||||||
import util.JGitUtil.DiffInfo
|
import util.JGitUtil.DiffInfo
|
||||||
import service.RepositoryService.RepositoryTreeNode
|
|
||||||
import util.JGitUtil.CommitInfo
|
import util.JGitUtil.CommitInfo
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
import org.eclipse.jgit.merge.MergeStrategy
|
import org.eclipse.jgit.merge.MergeStrategy
|
||||||
@@ -124,7 +123,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
params("id").toIntOpt.flatMap { issueId =>
|
params("id").toIntOpt.flatMap { issueId =>
|
||||||
val owner = repository.owner
|
val owner = repository.owner
|
||||||
val name = repository.name
|
val name = repository.name
|
||||||
LockUtil.lock(s"${owner}/${name}/merge"){
|
LockUtil.lock(s"${owner}/${name}"){
|
||||||
getPullRequest(owner, name, issueId).map { case (issue, pullreq) =>
|
getPullRequest(owner, name, issueId).map { case (issue, pullreq) =>
|
||||||
using(Git.open(getRepositoryDir(owner, name))) { git =>
|
using(Git.open(getRepositoryDir(owner, name))) { git =>
|
||||||
// mark issue as merged and close.
|
// mark issue as merged and close.
|
||||||
@@ -367,7 +366,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
*/
|
*/
|
||||||
private def checkConflict(userName: String, repositoryName: String, branch: String,
|
private def checkConflict(userName: String, repositoryName: String, branch: String,
|
||||||
requestUserName: String, requestRepositoryName: String, requestBranch: String): Boolean = {
|
requestUserName: String, requestRepositoryName: String, requestBranch: String): Boolean = {
|
||||||
LockUtil.lock(s"${userName}/${repositoryName}/merge-check"){
|
LockUtil.lock(s"${userName}/${repositoryName}"){
|
||||||
using(Git.open(getRepositoryDir(requestUserName, requestRepositoryName))) { git =>
|
using(Git.open(getRepositoryDir(requestUserName, requestRepositoryName))) { git =>
|
||||||
val remoteRefName = s"refs/heads/${branch}"
|
val remoteRefName = s"refs/heads/${branch}"
|
||||||
val tmpRefName = s"refs/merge-check/${userName}/${branch}"
|
val tmpRefName = s"refs/merge-check/${userName}/${branch}"
|
||||||
@@ -403,7 +402,7 @@ trait PullRequestsControllerBase extends ControllerBase {
|
|||||||
private def checkConflictInPullRequest(userName: String, repositoryName: String, branch: String,
|
private def checkConflictInPullRequest(userName: String, repositoryName: String, branch: String,
|
||||||
requestUserName: String, requestRepositoryName: String, requestBranch: String,
|
requestUserName: String, requestRepositoryName: String, requestBranch: String,
|
||||||
issueId: Int): Boolean = {
|
issueId: Int): Boolean = {
|
||||||
LockUtil.lock(s"${userName}/${repositoryName}/merge") {
|
LockUtil.lock(s"${userName}/${repositoryName}") {
|
||||||
using(Git.open(getRepositoryDir(userName, repositoryName))) { git =>
|
using(Git.open(getRepositoryDir(userName, repositoryName))) { git =>
|
||||||
// merge
|
// merge
|
||||||
val merger = MergeStrategy.RECURSIVE.newMerger(git.getRepository, true)
|
val merger = MergeStrategy.RECURSIVE.newMerger(git.getRepository, true)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package app
|
|||||||
|
|
||||||
import service._
|
import service._
|
||||||
import util.Directory._
|
import util.Directory._
|
||||||
import util.{UsersAuthenticator, OwnerAuthenticator}
|
import util.{LockUtil, UsersAuthenticator, OwnerAuthenticator}
|
||||||
import jp.sf.amateras.scalatra.forms._
|
import jp.sf.amateras.scalatra.forms._
|
||||||
import org.apache.commons.io.FileUtils
|
import org.apache.commons.io.FileUtils
|
||||||
import org.scalatra.i18n.Messages
|
import org.scalatra.i18n.Messages
|
||||||
@@ -185,6 +185,7 @@ trait RepositorySettingsControllerBase extends ControllerBase {
|
|||||||
post("/:owner/:repository/settings/transfer", transferForm)(ownerOnly { (form, repository) =>
|
post("/:owner/:repository/settings/transfer", transferForm)(ownerOnly { (form, repository) =>
|
||||||
// Change repository owner
|
// Change repository owner
|
||||||
if(repository.owner != form.newOwner){
|
if(repository.owner != form.newOwner){
|
||||||
|
LockUtil.lock(s"${repository.owner}/${repository.name}"){
|
||||||
// Update database
|
// Update database
|
||||||
renameRepository(repository.owner, repository.name, form.newOwner, repository.name)
|
renameRepository(repository.owner, repository.name, form.newOwner, repository.name)
|
||||||
// Move git repository
|
// Move git repository
|
||||||
@@ -196,6 +197,7 @@ trait RepositorySettingsControllerBase extends ControllerBase {
|
|||||||
FileUtils.moveDirectory(dir, getWikiRepositoryDir(form.newOwner, repository.name))
|
FileUtils.moveDirectory(dir, getWikiRepositoryDir(form.newOwner, repository.name))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
redirect(s"/${form.newOwner}/${repository.name}")
|
redirect(s"/${form.newOwner}/${repository.name}")
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -203,12 +205,13 @@ trait RepositorySettingsControllerBase extends ControllerBase {
|
|||||||
* Delete the repository.
|
* Delete the repository.
|
||||||
*/
|
*/
|
||||||
post("/:owner/:repository/settings/delete")(ownerOnly { repository =>
|
post("/:owner/:repository/settings/delete")(ownerOnly { repository =>
|
||||||
|
LockUtil.lock(s"${repository.owner}/${repository.name}"){
|
||||||
deleteRepository(repository.owner, repository.name)
|
deleteRepository(repository.owner, repository.name)
|
||||||
|
|
||||||
FileUtils.deleteDirectory(getRepositoryDir(repository.owner, repository.name))
|
FileUtils.deleteDirectory(getRepositoryDir(repository.owner, repository.name))
|
||||||
FileUtils.deleteDirectory(getWikiRepositoryDir(repository.owner, repository.name))
|
FileUtils.deleteDirectory(getWikiRepositoryDir(repository.owner, repository.name))
|
||||||
FileUtils.deleteDirectory(getTemporaryDir(repository.owner, repository.name))
|
FileUtils.deleteDirectory(getTemporaryDir(repository.owner, repository.name))
|
||||||
|
}
|
||||||
redirect(s"/${repository.owner}")
|
redirect(s"/${repository.owner}")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user