diff --git a/src/main/scala/app/CreateRepositoryServlet.scala b/src/main/scala/app/CreateRepositoryServlet.scala index 7477fe4..acdfe29 100644 --- a/src/main/scala/app/CreateRepositoryServlet.scala +++ b/src/main/scala/app/CreateRepositoryServlet.scala @@ -61,6 +61,9 @@ FileUtils.deleteDirectory(tmpdir) } + // update all branches + updateAllBranches(LoginUser, form.name) + // redirect to the repository redirect("/%s/%s".format(LoginUser, form.name)) } diff --git a/src/main/scala/app/GitRepositoryServlet.scala b/src/main/scala/app/GitRepositoryServlet.scala index 0d704db..91c71b0 100644 --- a/src/main/scala/app/GitRepositoryServlet.scala +++ b/src/main/scala/app/GitRepositoryServlet.scala @@ -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 @@ }); } -} \ No newline at end of file + /** + * 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) + } + } + } + +} diff --git a/src/main/scala/app/RepositoryViewerServlet.scala b/src/main/scala/app/RepositoryViewerServlet.scala index 319f96c..4f25f8c 100644 --- a/src/main/scala/app/RepositoryViewerServlet.scala +++ b/src/main/scala/app/RepositoryViewerServlet.scala @@ -34,7 +34,6 @@ get("/:owner/:repository") { val owner = params("owner") val repository = params("repository") - updateAllBranches(owner, repository) fileList(owner, repository) } @@ -45,7 +44,6 @@ 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 @@ 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 @@ 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 @@ 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/.+?/", "") @@ -134,40 +129,6 @@ } /** - * 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. * * @param owner the repository owner diff --git a/src/main/scala/util/Directory.scala b/src/main/scala/util/Directory.scala index 79a2475..7cbe3fe 100644 --- a/src/main/scala/util/Directory.scala +++ b/src/main/scala/util/Directory.scala @@ -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 @@ 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 + } + } + } + + } \ No newline at end of file