mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-05 04:56:02 +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)
|
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))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -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.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user