mirror of
https://github.com/gitbucket/gitbucket.git
synced 2026-01-06 23:52:18 +01:00
Merge pull request #2252 from kounoike/pr-fix-544
Stop using JGit's RepositoryCache
This commit is contained in:
@@ -106,6 +106,7 @@ class GitAuthenticationFilter extends Filter with RepositoryService with Account
|
||||
if (isUpdating) {
|
||||
if (hasDeveloperRole(repository.owner, repository.name, Some(account))) {
|
||||
request.setAttribute(Keys.Request.UserName, account.userName)
|
||||
request.setAttribute(Keys.Request.RepositoryLockKey, s"${repository.owner}/${repository.name}")
|
||||
true
|
||||
} else false
|
||||
} else if (repository.repository.isPrivate) {
|
||||
|
||||
@@ -22,8 +22,8 @@ import org.eclipse.jgit.transport.resolver._
|
||||
import org.slf4j.LoggerFactory
|
||||
import javax.servlet.ServletConfig
|
||||
import javax.servlet.http.{HttpServletRequest, HttpServletResponse}
|
||||
|
||||
import org.eclipse.jgit.diff.DiffEntry.ChangeType
|
||||
import org.eclipse.jgit.internal.storage.file.FileRepository
|
||||
import org.json4s.jackson.Serialization._
|
||||
|
||||
/**
|
||||
@@ -41,7 +41,7 @@ class GitRepositoryServlet extends GitServlet with SystemSettingsService {
|
||||
setReceivePackFactory(new GitBucketReceivePackFactory())
|
||||
|
||||
val root: File = new File(Directory.RepositoryHome)
|
||||
setRepositoryResolver(new GitBucketRepositoryResolver(new FileResolver[HttpServletRequest](root, true)))
|
||||
setRepositoryResolver(new GitBucketRepositoryResolver)
|
||||
|
||||
super.init(config)
|
||||
}
|
||||
@@ -55,11 +55,24 @@ class GitRepositoryServlet extends GitServlet with SystemSettingsService {
|
||||
res.sendRedirect(baseUrl(req) + "/" + paths.dropRight(1).last + "/" + paths.last)
|
||||
|
||||
} else if (req.getMethod.toUpperCase == "POST" && req.getRequestURI.endsWith("/info/lfs/objects/batch")) {
|
||||
serviceGitLfsBatchAPI(req, res)
|
||||
|
||||
withLockRepository(req) {
|
||||
serviceGitLfsBatchAPI(req, res)
|
||||
}
|
||||
} else {
|
||||
// response for git client
|
||||
super.service(req, res)
|
||||
withLockRepository(req) {
|
||||
super.service(req, res)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private def withLockRepository[T](req: HttpServletRequest)(f: => T): T = {
|
||||
if (req.hasAttribute(Keys.Request.RepositoryLockKey)) {
|
||||
LockUtil.lock(req.getAttribute(Keys.Request.RepositoryLockKey).asInstanceOf[String]) {
|
||||
f
|
||||
}
|
||||
} else {
|
||||
f
|
||||
}
|
||||
}
|
||||
|
||||
@@ -138,10 +151,7 @@ class GitRepositoryServlet extends GitServlet with SystemSettingsService {
|
||||
}
|
||||
}
|
||||
|
||||
class GitBucketRepositoryResolver(parent: FileResolver[HttpServletRequest])
|
||||
extends RepositoryResolver[HttpServletRequest] {
|
||||
|
||||
private val resolver = new FileResolver[HttpServletRequest](new File(Directory.GitBucketHome), true)
|
||||
class GitBucketRepositoryResolver extends RepositoryResolver[HttpServletRequest] {
|
||||
|
||||
override def open(req: HttpServletRequest, name: String): Repository = {
|
||||
// Rewrite repository path if routing is marched
|
||||
@@ -150,10 +160,10 @@ class GitBucketRepositoryResolver(parent: FileResolver[HttpServletRequest])
|
||||
.map {
|
||||
case GitRepositoryRouting(urlPattern, localPath, _) =>
|
||||
val path = urlPattern.r.replaceFirstIn(name, localPath)
|
||||
resolver.open(req, path)
|
||||
new FileRepository(new File(Directory.GitBucketHome, path))
|
||||
}
|
||||
.getOrElse {
|
||||
parent.open(req, name)
|
||||
new FileRepository(new File(Directory.RepositoryHome, name))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -86,6 +86,11 @@ object Keys {
|
||||
*/
|
||||
val UserName = "USER_NAME"
|
||||
|
||||
/**
|
||||
* Request key for the Lock key which is used during Git repository write access.
|
||||
*/
|
||||
val RepositoryLockKey = "REPOSITORY_LOCK_KEY"
|
||||
|
||||
/**
|
||||
* Generate request key for the request cache.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user