From: James Moger Date: Wed, 11 Apr 2012 12:29:14 +0000 (-0400) Subject: Example post-receive hook script for creating a local clone on push X-Git-Tag: v0.9.3~1 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=a411c8d64a9f9a2fb0001c6fc6fa76fc81eded1b;p=gitblit.git Example post-receive hook script for creating a local clone on push --- diff --git a/build.xml b/build.xml index b57a0336..0dd19c5e 100644 --- a/build.xml +++ b/build.xml @@ -204,6 +204,7 @@ + @@ -372,6 +373,7 @@ + diff --git a/groovy/localclone.groovy b/groovy/localclone.groovy new file mode 100644 index 00000000..e1d44938 --- /dev/null +++ b/groovy/localclone.groovy @@ -0,0 +1,102 @@ +/* + * Copyright 2012 gitblit.com. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import com.gitblit.GitBlit +import com.gitblit.Keys +import com.gitblit.models.RepositoryModel +import com.gitblit.models.TeamModel +import com.gitblit.models.UserModel +import com.gitblit.utils.JGitUtils +import com.gitblit.utils.StringUtils +import java.text.SimpleDateFormat +import org.eclipse.jgit.api.CloneCommand +import org.eclipse.jgit.api.Git +import org.eclipse.jgit.lib.Repository +import org.eclipse.jgit.lib.Config +import org.eclipse.jgit.revwalk.RevCommit +import org.eclipse.jgit.transport.ReceiveCommand +import org.eclipse.jgit.transport.ReceiveCommand.Result +import org.eclipse.jgit.util.FileUtils +import org.slf4j.Logger + +/** + * Sample Gitblit Post-Receive Hook: localclone + * + * The Post-Receive hook is executed AFTER the pushed commits have been applied + * to the Git repository. This is the appropriate point to trigger an + * integration build or to send a notification. + * + * This script is only executed when pushing to *Gitblit*, not to other Git + * tooling you may be using. + * + * If this script is specified in *groovy.postReceiveScripts* of gitblit.properties + * or web.xml then it will be executed by any repository when it receives a + * push. If you choose to share your script then you may have to consider + * tailoring control-flow based on repository access restrictions. + * + * Scripts may also be specified per-repository in the repository settings page. + * Shared scripts will be excluded from this list of available scripts. + * + * This script is dynamically reloaded and it is executed within it's own + * exception handler so it will not crash another script nor crash Gitblit. + * + * If you want this hook script to fail and abort all subsequent scripts in the + * chain, "return false" at the appropriate failure points. + * + * Bound Variables: + * gitblit Gitblit Server com.gitblit.GitBlit + * repository Gitblit Repository com.gitblit.models.RepositoryModel + * user Gitblit User com.gitblit.models.UserModel + * commands JGit commands Collection + * url Base url for Gitblit String + * logger Logs messages to Gitblit org.slf4j.Logger + * clientLogger Logs messages to Git client com.gitblit.utils.ClientLogger + * + */ + +// Indicate we have started the script +logger.info("localclone hook triggered by ${user.username} for ${repository.name}") + +def rootFolder = 'c:/test' +def bare = false +def cloneAllBranches = true +def cloneBranch = 'refs/heads/master' +def includeSubmodules = true + +def repoName = repository.name +def destinationFolder = new File(rootFolder, StringUtils.stripDotGit(repoName)) +def srcUrl = 'file://' + new File(GitBlit.getRepositoriesFolder(), repoName).absolutePath + +// delete any previous clone +if (destinationFolder.exists()) { + FileUtils.delete(destinationFolder, FileUtils.RECURSIVE) +} + +// clone the repository +logger.info("cloning ${srcUrl} to ${destinationFolder}") +CloneCommand cmd = Git.cloneRepository(); +cmd.setBare(bare) +if (cloneAllBranches) + cmd.setCloneAllBranches(true) +else + cmd.setBranch(cloneBranch) +cmd.setCloneSubmodules(includeSubmodules) +cmd.setURI(srcUrl) +cmd.setDirectory(destinationFolder) +Git git = cmd.call(); +git.repository.close() + +// report clone operation success back to pushing Git client +clientLogger.info("${repoName} cloned to ${destinationFolder}") \ No newline at end of file