mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-04 20:45:58 +01:00
Cloned repositories for internal use are updated after push.
This commit is contained in:
@@ -61,6 +61,9 @@ class CreateRepositoryServlet extends ServletBase {
|
||||
FileUtils.deleteDirectory(tmpdir)
|
||||
}
|
||||
|
||||
// update all branches
|
||||
updateAllBranches(LoginUser, form.name)
|
||||
|
||||
// redirect to the repository
|
||||
redirect("/%s/%s".format(LoginUser, form.name))
|
||||
}
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
package app
|
||||
|
||||
import javax.servlet.ServletConfig
|
||||
import javax.servlet.ServletException
|
||||
import org.eclipse.jgit.http.server.GitServlet
|
||||
import javax.servlet.ServletContext
|
||||
import java.io._
|
||||
import javax.servlet._
|
||||
import javax.servlet.http._
|
||||
import util.Directory
|
||||
import java.io.File
|
||||
import org.eclipse.jgit.api.Git
|
||||
import org.eclipse.jgit.lib.Ref
|
||||
import org.eclipse.jgit.http.server.GitServlet
|
||||
|
||||
/**
|
||||
* Provides Git repository via HTTP.
|
||||
@@ -31,4 +32,23 @@ class GitRepositoryServlet extends GitServlet {
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
/**
|
||||
* Override GitServlet#service() to pull pushed changes to cloned repositories for branch exploring.
|
||||
*/
|
||||
override def service(request: HttpServletRequest, response: HttpServletResponse): Unit = {
|
||||
super.service(request, response)
|
||||
|
||||
// TODO debug log
|
||||
println(request.getMethod + ": " + request.getRequestURI)
|
||||
|
||||
// update branches
|
||||
if(request.getMethod == "POST" && request.getRequestURI.endsWith("/git-receive-pack")){
|
||||
request.getRequestURI
|
||||
.replaceFirst("^" + request.getServletContext.getContextPath + "/git/", "")
|
||||
.replaceFirst("\\.git/git-receive-pack$", "").split("/") match {
|
||||
case Array(owner, repository) => Directory.updateAllBranches(owner, repository)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -34,7 +34,6 @@ class RepositoryViewerServlet extends ServletBase {
|
||||
get("/:owner/:repository") {
|
||||
val owner = params("owner")
|
||||
val repository = params("repository")
|
||||
updateAllBranches(owner, repository)
|
||||
|
||||
fileList(owner, repository)
|
||||
}
|
||||
@@ -45,7 +44,6 @@ class RepositoryViewerServlet extends ServletBase {
|
||||
get("/:owner/:repository/tree/:branch") {
|
||||
val owner = params("owner")
|
||||
val repository = params("repository")
|
||||
updateAllBranches(owner, repository)
|
||||
|
||||
fileList(owner, repository, params("branch"))
|
||||
}
|
||||
@@ -56,7 +54,6 @@ class RepositoryViewerServlet extends ServletBase {
|
||||
get("/:owner/:repository/tree/:branch/*") {
|
||||
val owner = params("owner")
|
||||
val repository = params("repository")
|
||||
updateAllBranches(owner, repository)
|
||||
|
||||
fileList(owner, repository, params("branch"), multiParams("splat").head)
|
||||
}
|
||||
@@ -67,7 +64,6 @@ class RepositoryViewerServlet extends ServletBase {
|
||||
get("/:owner/:repository/commits/:branch"){
|
||||
val owner = params("owner")
|
||||
val repository = params("repository")
|
||||
updateAllBranches(owner, repository)
|
||||
|
||||
val branchName = params("branch")
|
||||
val page = params.getOrElse("page", "1").toInt
|
||||
@@ -97,7 +93,6 @@ class RepositoryViewerServlet extends ServletBase {
|
||||
get("/:owner/:repository/blob/:branch/*"){
|
||||
val owner = params("owner")
|
||||
val repository = params("repository")
|
||||
updateAllBranches(owner, repository)
|
||||
|
||||
val branchName = params("branch")
|
||||
val path = multiParams("splat").head.replaceFirst("^tree/.+?/", "")
|
||||
@@ -133,40 +128,6 @@ class RepositoryViewerServlet extends ServletBase {
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Setup all branches for the repository viewer.
|
||||
* This method copies the repository and checkout branches.
|
||||
*
|
||||
* TODO Should it be a repository update hook?
|
||||
*
|
||||
* @param owner the repository owner
|
||||
* @param repository the repository name
|
||||
*/
|
||||
def updateAllBranches(owner: String, repository: String): Unit = {
|
||||
val dir = getRepositoryDir(owner, repository)
|
||||
val git = Git.open(dir)
|
||||
|
||||
val branchList = git.branchList.call.toArray.map { ref =>
|
||||
ref.asInstanceOf[Ref].getName
|
||||
}.toList
|
||||
|
||||
branchList.foreach { branch =>
|
||||
val branchName = branch.replaceFirst("^refs/heads/", "")
|
||||
val branchdir = getBranchDir(owner, repository, branchName)
|
||||
if(!branchdir.exists){
|
||||
branchdir.mkdirs()
|
||||
Git.cloneRepository
|
||||
.setURI(dir.toURL.toString)
|
||||
.setBranch(branch)
|
||||
.setDirectory(branchdir)
|
||||
.call
|
||||
Git.open(branchdir).checkout.setName(branchName).call
|
||||
} else {
|
||||
Git.open(branchdir).pull.call
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides HTML of the file list.
|
||||
*
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package util
|
||||
|
||||
import java.io.File
|
||||
import org.eclipse.jgit.api.Git
|
||||
import org.eclipse.jgit.lib.Ref
|
||||
|
||||
/**
|
||||
* Provides directories used by GitBucket.
|
||||
@@ -43,4 +45,33 @@ object Directory {
|
||||
def getInitRepositoryDir(owner: String, repository: String): File =
|
||||
new File("%s/tmp/%s/init-%s".format(GitBucketHome, owner, repository))
|
||||
|
||||
def updateAllBranches(owner: String, repository: String): Unit = {
|
||||
// TODO debug log
|
||||
println("[pull]" + owner + "/" + repository)
|
||||
|
||||
val dir = Directory.getRepositoryDir(owner, repository)
|
||||
val git = Git.open(dir)
|
||||
|
||||
val branchList = git.branchList.call.toArray.map { ref =>
|
||||
ref.asInstanceOf[Ref].getName
|
||||
}.toList
|
||||
|
||||
branchList.foreach { branch =>
|
||||
val branchName = branch.replaceFirst("^refs/heads/", "")
|
||||
val branchdir = Directory.getBranchDir(owner, repository, branchName)
|
||||
if(!branchdir.exists){
|
||||
branchdir.mkdirs()
|
||||
Git.cloneRepository
|
||||
.setURI(dir.toURL.toString)
|
||||
.setBranch(branch)
|
||||
.setDirectory(branchdir)
|
||||
.call
|
||||
Git.open(branchdir).checkout.setName(branchName).call
|
||||
} else {
|
||||
Git.open(branchdir).pull.call
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user