James Moger
2012-04-11 a411c8d64a9f9a2fb0001c6fc6fa76fc81eded1b
Example post-receive hook script for creating a local clone on push
1 files added
1 files modified
104 ■■■■■ changed files
build.xml 2 ●●●●● patch | view | raw | blame | history
groovy/localclone.groovy 102 ●●●●● patch | view | raw | blame | history
build.xml
@@ -204,6 +204,7 @@
                <include name="sendmail.groovy" />
                <include name="jenkins.groovy" />
                <include name="protect-refs.groovy" />
                <include name="localclone.groovy" />
            </fileset>
        </copy>
    
@@ -372,6 +373,7 @@
                <include name="sendmail.groovy" />
                <include name="jenkins.groovy" />
                <include name="protect-refs.groovy" />
                <include name="localclone.groovy" />
            </fileset>
        </copy>
groovy/localclone.groovy
New file
@@ -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<org.eclipse.jgit.transport.ReceiveCommand>
 *    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}")