From 67d4f89b0cddb3de05c20e08c20f1bea714c2a9e Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Mon, 18 Jun 2012 16:09:44 -0400
Subject: [PATCH] Added setting to control Groovy Grape folder (issue 91)

---
 docs/01_setup.mkd               |   21 +++++++++++++++++++++
 docs/04_releases.mkd            |    2 ++
 distrib/gitblit.properties      |    7 +++++++
 src/com/gitblit/GitServlet.java |    7 ++++++-
 4 files changed, 36 insertions(+), 1 deletions(-)

diff --git a/distrib/gitblit.properties b/distrib/gitblit.properties
index 91b1c2b..f3e2ac1 100644
--- a/distrib/gitblit.properties
+++ b/distrib/gitblit.properties
@@ -151,6 +151,13 @@
 # SINCE 0.8.0
 groovy.scriptsFolder = groovy
 
+# Specify the directory Grape uses for downloading libraries.
+# http://groovy.codehaus.org/Grape
+#
+# RESTART REQUIRED
+# SINCE 1.0.0
+groovy.grapeFolder = groovy/grape
+
 # Scripts to execute on Pre-Receive.
 #
 # These scripts execute after an incoming push has been parsed and validated
diff --git a/docs/01_setup.mkd b/docs/01_setup.mkd
index c8cd09d..07f4b00 100644
--- a/docs/01_setup.mkd
+++ b/docs/01_setup.mkd
@@ -398,6 +398,27 @@
 
 Hook contributions and improvements are welcome.
 
+### Grapes
+
+*SINCE 1.0.0*
+
+[Grape](http://groovy.codehaus.org/Grape) lets you quickly add maven repository dependencies to your Groovy hook script.  
+
+<blockquote>Grape (The Groovy Adaptable Packaging Engine or Groovy Advanced Packaging Engine) is the infrastructure enabling the grab() calls in Groovy, a set of classes leveraging [Ivy](http://ant.apache.org/ivy) to allow for a repository driven module system for Groovy. This allows a developer to write a script with an essentially arbitrary library requirement, and ship just the script. Grape will, at runtime, download as needed and link the named libraries and all dependencies forming a transitive closure when the script is run from existing repositories such as Ibiblio, Codehaus, and java.net.</blockquote>
+
+%BEGINCODE%
+// create and use a primitive array
+import org.apache.commons.collections.primitives.ArrayIntList
+
+@Grab(group='commons-primitives', module='commons-primitives', version='1.0')
+def createEmptyInts() { new ArrayIntList() }
+
+def ints = createEmptyInts()
+ints.add(0, 42)
+assert ints.size() == 1
+assert ints.get(0) == 42
+%ENDCODE%
+
 ### Custom Fields
 
 *SINCE 1.0.0*
diff --git a/docs/04_releases.mkd b/docs/04_releases.mkd
index a47c086..a281ffe 100644
--- a/docs/04_releases.mkd
+++ b/docs/04_releases.mkd
@@ -35,6 +35,8 @@
     **New:** *git.packedGitMmap = false*  
 - Added default access restriction.  Applies to new repositories and repositories that have not been configured with Gitblit. (issue 88)  
     **New:** *git.defaultAccessRestriction = NONE*  
+- Added setting to control Groovy Grape root folder.  [Grape](http://groovy.codehaus.org/Grape) allows you to add Maven dependencies to your pre-/post-receive hook script classpath.  
+    **New:** *groovy.grapeFolder = groovy/grape*  
 - Added LDAP User Service with many new *realm.ldap* keys (Github/jcrygier)
 - Added support for custom repository properties for Groovy hooks (Github/jcrygier)
 - Added script to facilitate proxy environment setup on Linux (Github/mragab)
diff --git a/src/com/gitblit/GitServlet.java b/src/com/gitblit/GitServlet.java
index 94042c7..68097cb 100644
--- a/src/com/gitblit/GitServlet.java
+++ b/src/com/gitblit/GitServlet.java
@@ -79,7 +79,12 @@
 	public void init(ServletConfig config) throws ServletException {
 		groovyDir = GitBlit.getGroovyScriptsFolder();
 		try {
-			gse = new GroovyScriptEngine(groovyDir.getAbsolutePath());
+			// set Grape root
+			File grapeRoot = new File(GitBlit.getString(Keys.groovy.grapeFolder, "groovy/grape")).getAbsoluteFile();
+			grapeRoot.mkdirs();
+			System.setProperty("grape.root", grapeRoot.getAbsolutePath());
+			
+			gse = new GroovyScriptEngine(groovyDir.getAbsolutePath());			
 		} catch (IOException e) {
 			throw new ServletException("Failed to instantiate Groovy Script Engine!", e);
 		}

--
Gitblit v1.9.1