Cloned repositories for internal use are updated after push.

This commit is contained in:
takezoe
2013-04-20 04:57:10 +09:00
parent 934c4af780
commit c531949fd9
4 changed files with 60 additions and 45 deletions

View File

@@ -61,6 +61,9 @@ class CreateRepositoryServlet extends ServletBase {
FileUtils.deleteDirectory(tmpdir) FileUtils.deleteDirectory(tmpdir)
} }
// update all branches
updateAllBranches(LoginUser, form.name)
// redirect to the repository // redirect to the repository
redirect("/%s/%s".format(LoginUser, form.name)) redirect("/%s/%s".format(LoginUser, form.name))
} }

View File

@@ -1,11 +1,12 @@
package app package app
import javax.servlet.ServletConfig import java.io._
import javax.servlet.ServletException import javax.servlet._
import org.eclipse.jgit.http.server.GitServlet import javax.servlet.http._
import javax.servlet.ServletContext
import util.Directory 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. * 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)
}
}
}
} }

View File

@@ -34,7 +34,6 @@ class RepositoryViewerServlet extends ServletBase {
get("/:owner/:repository") { get("/:owner/:repository") {
val owner = params("owner") val owner = params("owner")
val repository = params("repository") val repository = params("repository")
updateAllBranches(owner, repository)
fileList(owner, repository) fileList(owner, repository)
} }
@@ -45,7 +44,6 @@ class RepositoryViewerServlet extends ServletBase {
get("/:owner/:repository/tree/:branch") { get("/:owner/:repository/tree/:branch") {
val owner = params("owner") val owner = params("owner")
val repository = params("repository") val repository = params("repository")
updateAllBranches(owner, repository)
fileList(owner, repository, params("branch")) fileList(owner, repository, params("branch"))
} }
@@ -56,7 +54,6 @@ class RepositoryViewerServlet extends ServletBase {
get("/:owner/:repository/tree/:branch/*") { get("/:owner/:repository/tree/:branch/*") {
val owner = params("owner") val owner = params("owner")
val repository = params("repository") val repository = params("repository")
updateAllBranches(owner, repository)
fileList(owner, repository, params("branch"), multiParams("splat").head) fileList(owner, repository, params("branch"), multiParams("splat").head)
} }
@@ -67,7 +64,6 @@ class RepositoryViewerServlet extends ServletBase {
get("/:owner/:repository/commits/:branch"){ get("/:owner/:repository/commits/:branch"){
val owner = params("owner") val owner = params("owner")
val repository = params("repository") val repository = params("repository")
updateAllBranches(owner, repository)
val branchName = params("branch") val branchName = params("branch")
val page = params.getOrElse("page", "1").toInt val page = params.getOrElse("page", "1").toInt
@@ -97,7 +93,6 @@ class RepositoryViewerServlet extends ServletBase {
get("/:owner/:repository/blob/:branch/*"){ get("/:owner/:repository/blob/:branch/*"){
val owner = params("owner") val owner = params("owner")
val repository = params("repository") val repository = params("repository")
updateAllBranches(owner, repository)
val branchName = params("branch") val branchName = params("branch")
val path = multiParams("splat").head.replaceFirst("^tree/.+?/", "") 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. * Provides HTML of the file list.
* *

View File

@@ -1,6 +1,8 @@
package util package util
import java.io.File import java.io.File
import org.eclipse.jgit.api.Git
import org.eclipse.jgit.lib.Ref
/** /**
* Provides directories used by GitBucket. * Provides directories used by GitBucket.
@@ -43,4 +45,33 @@ object Directory {
def getInitRepositoryDir(owner: String, repository: String): File = def getInitRepositoryDir(owner: String, repository: String): File =
new File("%s/tmp/%s/init-%s".format(GitBucketHome, owner, repository)) 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
}
}
}
} }