diff options
author | James Moger <james.moger@gitblit.com> | 2011-12-19 17:58:43 -0500 |
---|---|---|
committer | James Moger <james.moger@gitblit.com> | 2011-12-19 17:58:43 -0500 |
commit | 6cc1d4cf3605719af3f9a37ee09cb02519be3571 (patch) | |
tree | 297ba0d726a080985e8122301d12ee1fe244039d /src/com | |
parent | a50c4afdde37845b94b3545029ed9aac5796fdf7 (diff) | |
download | gitblit-6cc1d4cf3605719af3f9a37ee09cb02519be3571.tar.gz gitblit-6cc1d4cf3605719af3f9a37ee09cb02519be3571.zip |
Server-side hook script selection. Documentation.
Diffstat (limited to 'src/com')
-rw-r--r-- | src/com/gitblit/GitBlit.java | 55 | ||||
-rw-r--r-- | src/com/gitblit/GitServlet.java | 26 | ||||
-rw-r--r-- | src/com/gitblit/wicket/GitBlitWebApp.properties | 5 | ||||
-rw-r--r-- | src/com/gitblit/wicket/pages/EditRepositoryPage.html | 10 | ||||
-rw-r--r-- | src/com/gitblit/wicket/pages/EditRepositoryPage.java | 41 |
5 files changed, 125 insertions, 12 deletions
diff --git a/src/com/gitblit/GitBlit.java b/src/com/gitblit/GitBlit.java index 8afa6df3..f0122791 100644 --- a/src/com/gitblit/GitBlit.java +++ b/src/com/gitblit/GitBlit.java @@ -27,9 +27,11 @@ import java.util.ArrayList; import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@@ -296,6 +298,16 @@ public class GitBlit implements ServletContextListener { }
/**
+ * Returns the path of the Groovy folder. This method checks to see if
+ * Gitblit is running on a cloud service and may return an adjusted path.
+ *
+ * @return the Groovy scripts folder path
+ */
+ public static File getGroovyScriptsFolder() {
+ return getFileOrFolder(Keys.groovy.scriptsFolder, "groovy");
+ }
+
+ /**
* Updates the list of server settings.
*
* @param settings
@@ -1426,6 +1438,48 @@ public class GitBlit implements ServletContextListener { }
/**
+ * Returns the list of all available Groovy push hook scripts that are not
+ * already specified globally for all repositories. Script files must have
+ * .groovy extension
+ *
+ * @return list of available hook scripts
+ */
+ public List<String> getAvailableScripts() {
+ File groovyFolder = getGroovyScriptsFolder();
+ File[] files = groovyFolder.listFiles(new FileFilter() {
+ @Override
+ public boolean accept(File pathname) {
+ return pathname.isFile() && pathname.getName().endsWith(".groovy");
+ }
+ });
+
+ Set<String> globals = new HashSet<String>();
+ String[] keys = { Keys.groovy.preReceiveScripts, Keys.groovy.postReceiveScripts };
+ for (String key : keys) {
+ for (String script : getStrings(key)) {
+ if (script.endsWith(".groovy")) {
+ globals.add(script.substring(0, script.lastIndexOf('.')));
+ } else {
+ globals.add(script);
+ }
+ }
+ }
+
+ // create list of available scripts by excluding scripts that are
+ // globally specified
+ List<String> scripts = new ArrayList<String>();
+ if (files != null) {
+ for (File file : files) {
+ String script = file.getName().substring(0, file.getName().lastIndexOf('.'));
+ if (!globals.contains(script)) {
+ scripts.add(script);
+ }
+ }
+ }
+ return scripts;
+ }
+
+ /**
* Notify the administrators by email.
*
* @param subject
@@ -1488,6 +1542,7 @@ public class GitBlit implements ServletContextListener { setting.currentValue = settings.getString(key, "");
}
}
+ settingsModel.pushScripts = getAvailableScripts();
return settingsModel;
}
diff --git a/src/com/gitblit/GitServlet.java b/src/com/gitblit/GitServlet.java index b2ee1c79..23fb32a6 100644 --- a/src/com/gitblit/GitServlet.java +++ b/src/com/gitblit/GitServlet.java @@ -26,7 +26,8 @@ import java.io.InputStreamReader; import java.io.OutputStreamWriter;
import java.text.MessageFormat;
import java.util.Collection;
-import java.util.List;
+import java.util.LinkedHashSet;
+import java.util.Set;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
@@ -68,6 +69,8 @@ public class GitServlet extends org.eclipse.jgit.http.server.GitServlet { private GroovyScriptEngine gse;
+ private File groovyDir;
+
/**
* Configure the servlet from Gitblit's configuration.
*/
@@ -83,9 +86,9 @@ public class GitServlet extends org.eclipse.jgit.http.server.GitServlet { @Override
public void init(ServletConfig config) throws ServletException {
- String groovyRoot = GitBlit.getString(Keys.groovy.scriptsFolder, "groovy");
+ groovyDir = GitBlit.getGroovyScriptsFolder();
try {
- gse = new GroovyScriptEngine(groovyRoot);
+ gse = new GroovyScriptEngine(groovyDir.getAbsolutePath());
} catch (IOException e) {
throw new ServletException("Failed to instantiate Groovy Script Engine!", e);
}
@@ -127,7 +130,8 @@ public class GitServlet extends org.eclipse.jgit.http.server.GitServlet { */
@Override
public void onPreReceive(ReceivePack rp, Collection<ReceiveCommand> commands) {
- List<String> scripts = GitBlit.getStrings(Keys.groovy.preReceiveScripts);
+ Set<String> scripts = new LinkedHashSet<String>();
+ scripts.addAll(GitBlit.getStrings(Keys.groovy.preReceiveScripts));
RepositoryModel repository = getRepositoryModel(rp);
scripts.addAll(repository.preReceiveScripts);
UserModel user = getUserModel(rp);
@@ -154,7 +158,8 @@ public class GitServlet extends org.eclipse.jgit.http.server.GitServlet { logger.info("skipping post-receive hooks, no refs created, updated, or removed");
return;
}
- List<String> scripts = GitBlit.getStrings(Keys.groovy.postReceiveScripts);
+ Set<String> scripts = new LinkedHashSet<String>();
+ scripts.addAll(GitBlit.getStrings(Keys.groovy.postReceiveScripts));
RepositoryModel repository = getRepositoryModel(rp);
scripts.addAll(repository.postReceiveScripts);
UserModel user = getUserModel(rp);
@@ -204,7 +209,7 @@ public class GitServlet extends org.eclipse.jgit.http.server.GitServlet { * @param scripts
*/
protected void runGroovy(RepositoryModel repository, UserModel user,
- Collection<ReceiveCommand> commands, List<String> scripts) {
+ Collection<ReceiveCommand> commands, Set<String> scripts) {
if (scripts == null || scripts.size() == 0) {
// no Groovy scripts to execute
return;
@@ -221,6 +226,15 @@ public class GitServlet extends org.eclipse.jgit.http.server.GitServlet { if (StringUtils.isEmpty(script)) {
continue;
}
+ // allow script to be specified without .groovy extension
+ // this is easier to read in the settings
+ File file = new File(groovyDir, script);
+ if (!file.exists() && !script.toLowerCase().endsWith(".groovy")) {
+ file = new File(groovyDir, script + ".groovy");
+ if (file.exists()) {
+ script = file.getName();
+ }
+ }
try {
Object result = gse.run(script, binding);
if (result instanceof Boolean) {
diff --git a/src/com/gitblit/wicket/GitBlitWebApp.properties b/src/com/gitblit/wicket/GitBlitWebApp.properties index 181aed9c..4eeb887c 100644 --- a/src/com/gitblit/wicket/GitBlitWebApp.properties +++ b/src/com/gitblit/wicket/GitBlitWebApp.properties @@ -197,4 +197,7 @@ gb.permittedTeams = permitted teams gb.emptyRepository = empty repository
gb.repositoryUrl = repository url
gb.mailRecipients = mail recipients
-gb.mailRecipientsDescription = space-delimited, used by sendemail Groovy hook
\ No newline at end of file +gb.mailRecipientsDescription = space-delimited, used by sendemail Groovy hook
+gb.preReceiveScripts = pre-receive scripts
+gb.postReceiveScripts = post-receive scripts
+gb.groovyHookScripts = hook scripts
\ No newline at end of file diff --git a/src/com/gitblit/wicket/pages/EditRepositoryPage.html b/src/com/gitblit/wicket/pages/EditRepositoryPage.html index 43e42acf..3e221225 100644 --- a/src/com/gitblit/wicket/pages/EditRepositoryPage.html +++ b/src/com/gitblit/wicket/pages/EditRepositoryPage.html @@ -9,7 +9,8 @@ <!-- Repository Table -->
<form style="padding-top:5px;" wicket:id="editForm">
<table class="plain">
- <tbody>
+ <tbody class="settings">
+ <tr><td colspan="2"><h3><wicket:message key="gb.general"></wicket:message></h3></td></tr>
<tr><th><wicket:message key="gb.name"></wicket:message></th><td class="edit"><input class="span6" type="text" wicket:id="name" id="name" size="40" tabindex="1" /> <i><wicket:message key="gb.nameDescription"></wicket:message></i></td></tr>
<tr><th><wicket:message key="gb.description"></wicket:message></th><td class="edit"><input class="span6" type="text" wicket:id="description" size="40" tabindex="2" /></td></tr>
<tr><th><wicket:message key="gb.origin"></wicket:message></th><td class="edit"><input class="span7" type="text" wicket:id="origin" size="80" tabindex="3" /></td></tr>
@@ -22,13 +23,16 @@ <tr><th><wicket:message key="gb.skipSummaryMetrics"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="skipSummaryMetrics" tabindex="10" /> <i><wicket:message key="gb.skipSummaryMetricsDescription"></wicket:message></i></td></tr>
<tr><th><wicket:message key="gb.isFrozen"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="isFrozen" tabindex="11" /> <i><wicket:message key="gb.isFrozenDescription"></wicket:message></i></td></tr>
<tr><th><wicket:message key="gb.mailRecipients"></wicket:message></th><td class="edit"><input class="span9" type="text" wicket:id="mailRecipients" size="40" tabindex="12" /> <i><wicket:message key="gb.mailRecipientsDescription"></wicket:message></i></td></tr>
- <tr><td colspan="2"><hr></hr></td></tr>
+ <tr><td colspan="2"><h3><wicket:message key="gb.accessRestriction"></wicket:message></h3></td></tr>
<tr><th><wicket:message key="gb.accessRestriction"></wicket:message></th><td class="edit"><select class="span6" wicket:id="accessRestriction" tabindex="13" /></td></tr>
<tr><th style="vertical-align: top;"><wicket:message key="gb.permittedUsers"></wicket:message></th><td style="padding:2px;"><span wicket:id="users"></span></td></tr>
<tr><th style="vertical-align: top;"><wicket:message key="gb.permittedTeams"></wicket:message></th><td style="padding:2px;"><span wicket:id="teams"></span></td></tr>
- <tr><td colspan="2"><hr></hr></td></tr>
+ <tr><td colspan="2"><h3><wicket:message key="gb.federation"></wicket:message></h3></td></tr>
<tr><th><wicket:message key="gb.federationStrategy"></wicket:message></th><td class="edit"><select class="span6" wicket:id="federationStrategy" tabindex="14" /></td></tr>
<tr><th style="vertical-align: top;"><wicket:message key="gb.federationSets"></wicket:message></th><td style="padding:2px;"><span wicket:id="federationSets"></span></td></tr>
+ <tr><td colspan="2"><h3><wicket:message key="gb.hookScripts"></wicket:message></h3></td></tr>
+ <tr><th style="vertical-align: top;"><wicket:message key="gb.preReceiveScripts"></wicket:message></th><td style="padding:2px;"><span wicket:id="preReceiveScripts"></span></td></tr>
+ <tr><th style="vertical-align: top;"><wicket:message key="gb.postReceiveScripts"></wicket:message></th><td style="padding:2px;"><span wicket:id="postReceiveScripts"></span></td></tr>
<tr><th></th><td class="editButton"><input class="btn" type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="15" /> <input class="btn primary" type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" tabindex="16" /> </td></tr>
</tbody>
</table>
diff --git a/src/com/gitblit/wicket/pages/EditRepositoryPage.java b/src/com/gitblit/wicket/pages/EditRepositoryPage.java index 56e44f88..492addc3 100644 --- a/src/com/gitblit/wicket/pages/EditRepositoryPage.java +++ b/src/com/gitblit/wicket/pages/EditRepositoryPage.java @@ -80,6 +80,9 @@ public class EditRepositoryPage extends RootSubPage { List<String> federationSets = new ArrayList<String>();
List<String> repositoryUsers = new ArrayList<String>();
List<String> repositoryTeams = new ArrayList<String>();
+ List<String> preReceiveScripts = new ArrayList<String>();
+ List<String> postReceiveScripts = new ArrayList<String>();
+
if (isCreate) {
super.setupPage(getString("gb.newRepository"), "");
} else {
@@ -101,13 +104,29 @@ public class EditRepositoryPage extends RootSubPage { // teams palette
final Palette<String> teamsPalette = new Palette<String>("teams", new ListModel<String>(
repositoryTeams), new CollectionModel<String>(GitBlit.self().getAllTeamnames()),
- new ChoiceRenderer<String>("", ""), 10, false);
+ new ChoiceRenderer<String>("", ""), 5, false);
// federation sets palette
List<String> sets = GitBlit.getStrings(Keys.federation.sets);
final Palette<String> federationSetsPalette = new Palette<String>("federationSets",
new ListModel<String>(federationSets), new CollectionModel<String>(sets),
- new ChoiceRenderer<String>("", ""), 10, false);
+ new ChoiceRenderer<String>("", ""), 5, false);
+
+ // pre-receive palette
+ if (repositoryModel.preReceiveScripts != null) {
+ preReceiveScripts.addAll(repositoryModel.preReceiveScripts);
+ }
+ final Palette<String> preReceivePalette = new Palette<String>("preReceiveScripts",
+ new ListModel<String>(preReceiveScripts), new CollectionModel<String>(GitBlit
+ .self().getAvailableScripts()), new ChoiceRenderer<String>("", ""), 12, true);
+
+ // post-receive palette
+ if (repositoryModel.postReceiveScripts != null) {
+ postReceiveScripts.addAll(repositoryModel.postReceiveScripts);
+ }
+ final Palette<String> postReceivePalette = new Palette<String>("postReceiveScripts",
+ new ListModel<String>(postReceiveScripts), new CollectionModel<String>(GitBlit
+ .self().getAvailableScripts()), new ChoiceRenderer<String>("", ""), 12, true);
CompoundPropertyModel<RepositoryModel> model = new CompoundPropertyModel<RepositoryModel>(
repositoryModel);
@@ -179,6 +198,22 @@ public class EditRepositoryPage extends RootSubPage { repositoryModel.mailRecipients = list;
}
+ // pre-receive scripts
+ List<String> preReceiveScripts = new ArrayList<String>();
+ Iterator<String> pres = preReceivePalette.getSelectedChoices();
+ while (pres.hasNext()) {
+ preReceiveScripts.add(pres.next());
+ }
+ repositoryModel.preReceiveScripts = preReceiveScripts;
+
+ // post-receive scripts
+ List<String> postReceiveScripts = new ArrayList<String>();
+ Iterator<String> post = postReceivePalette.getSelectedChoices();
+ while (post.hasNext()) {
+ postReceiveScripts.add(post.next());
+ }
+ repositoryModel.postReceiveScripts = postReceiveScripts;
+
// save the repository
GitBlit.self().updateRepositoryModel(oldName, repositoryModel, isCreate);
@@ -246,6 +281,8 @@ public class EditRepositoryPage extends RootSubPage { form.add(usersPalette);
form.add(teamsPalette);
form.add(federationSetsPalette);
+ form.add(preReceivePalette);
+ form.add(postReceivePalette);
form.add(new Button("save"));
Button cancel = new Button("cancel") {
|