]> source.dussan.org Git - gitblit.git/commitdiff
Add ClientLogger so scripts can log info / warning messages to the pushing client.
authorJohn Crygier <john.crygier@aon.com>
Fri, 30 Mar 2012 18:22:18 +0000 (02:22 +0800)
committerJames Moger <james.moger@gitblit.com>
Sat, 31 Mar 2012 12:32:16 +0000 (20:32 +0800)
groovy/blockpush.groovy
src/com/gitblit/GitServlet.java
src/com/gitblit/utils/ClientLogger.java [new file with mode: 0644]
tests/com/gitblit/tests/GroovyScriptTest.java

index a4cede3e9d53ad3e02f3824223fe7464b83e5a70..79d696c1da6f0079c8fc02ccff4a0f5ea84a66d6 100644 (file)
@@ -21,6 +21,7 @@ import com.gitblit.models.UserModel
 import org.eclipse.jgit.transport.ReceiveCommand\r
 import org.eclipse.jgit.transport.ReceiveCommand.Result\r
 import org.slf4j.Logger\r
+import com.gitblit.utils.ClientLogger\r
 \r
 /**\r
  * Sample Gitblit Pre-Receive Hook: blockpush\r
@@ -50,12 +51,13 @@ import org.slf4j.Logger
  * chain, "return false" at the appropriate failure points.\r
  *\r
  * Bound Variables:\r
- *  gitblit            Gitblit Server                  com.gitblit.GitBlit\r
- *  repository Gitblit Repository              com.gitblit.models.RepositoryModel\r
- *  user               Gitblit User                    com.gitblit.models.UserModel\r
- *  commands   JGit commands                   Collection<org.eclipse.jgit.transport.ReceiveCommand>\r
- *     url                     Base url for Gitblit    String\r
- *  log                        Logger instance                 org.slf4j.Logger\r
+ *  gitblit                    Gitblit Server                  com.gitblit.GitBlit\r
+ *  repository         Gitblit Repository              com.gitblit.models.RepositoryModel\r
+ *  user                       Gitblit User                    com.gitblit.models.UserModel\r
+ *  clientLogger       Logs messages to client com.gitblit.utils.ClientLogger\r
+ *  commands           JGit commands                   Collection<org.eclipse.jgit.transport.ReceiveCommand>\r
+ *     url                             Base url for Gitblit    String\r
+ *  logger                     Logger instance                 org.slf4j.Logger\r
  *  \r
  */\r
 \r
index 73c6eaa49cf1bc75f0b85ecb322da3216f5e018b..94042c70cf0fd53f086bbbe09e050dc982d3e2e7 100644 (file)
@@ -50,6 +50,7 @@ import org.slf4j.LoggerFactory;
 \r
 import com.gitblit.models.RepositoryModel;\r
 import com.gitblit.models.UserModel;\r
+import com.gitblit.utils.ClientLogger;\r
 import com.gitblit.utils.FileUtils;\r
 import com.gitblit.utils.HttpUtils;\r
 import com.gitblit.utils.StringUtils;\r
@@ -166,7 +167,7 @@ public class GitServlet extends org.eclipse.jgit.http.server.GitServlet {
                        scripts.addAll(GitBlit.self().getPreReceiveScriptsInherited(repository));\r
                        scripts.addAll(repository.preReceiveScripts);\r
                        UserModel user = getUserModel(rp);\r
-                       runGroovy(repository, user, commands, scripts);\r
+                       runGroovy(repository, user, commands, rp, scripts);\r
                        for (ReceiveCommand cmd : commands) {\r
                                if (!Result.NOT_ATTEMPTED.equals(cmd.getResult())) {\r
                                        logger.warn(MessageFormat.format("{0} {1} because \"{2}\"", cmd.getNewId()\r
@@ -194,7 +195,7 @@ public class GitServlet extends org.eclipse.jgit.http.server.GitServlet {
                        scripts.addAll(GitBlit.self().getPostReceiveScriptsInherited(repository));\r
                        scripts.addAll(repository.postReceiveScripts);\r
                        UserModel user = getUserModel(rp);\r
-                       runGroovy(repository, user, commands, scripts);\r
+                       runGroovy(repository, user, commands, rp, scripts);\r
 \r
                        // Experimental\r
                        // runNativeScript(rp, "hooks/post-receive", commands);\r
@@ -238,7 +239,7 @@ public class GitServlet extends org.eclipse.jgit.http.server.GitServlet {
                 * @param scripts\r
                 */\r
                protected void runGroovy(RepositoryModel repository, UserModel user,\r
-                               Collection<ReceiveCommand> commands, Set<String> scripts) {\r
+                               Collection<ReceiveCommand> commands, ReceivePack rp, Set<String> scripts) {\r
                        if (scripts == null || scripts.size() == 0) {\r
                                // no Groovy scripts to execute\r
                                return;\r
@@ -251,6 +252,7 @@ public class GitServlet extends org.eclipse.jgit.http.server.GitServlet {
                        binding.setVariable("commands", commands);\r
                        binding.setVariable("url", gitblitUrl);\r
                        binding.setVariable("logger", logger);\r
+                       binding.setVariable("clientLogger", new ClientLogger(rp));\r
                        for (String script : scripts) {\r
                                if (StringUtils.isEmpty(script)) {\r
                                        continue;\r
diff --git a/src/com/gitblit/utils/ClientLogger.java b/src/com/gitblit/utils/ClientLogger.java
new file mode 100644 (file)
index 0000000..2e16fd1
--- /dev/null
@@ -0,0 +1,32 @@
+package com.gitblit.utils;
+
+import org.eclipse.jgit.transport.ReceivePack;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Class to log messages to the pushing client.  Intended to be used by
+ * the Groovy Hooks.
+ * 
+ * @author jcrygier
+ *
+ */
+public class ClientLogger {
+       
+       static final Logger logger = LoggerFactory.getLogger(ClientLogger.class);       
+       private ReceivePack rp;
+       
+       public ClientLogger(ReceivePack rp) {
+               this.rp = rp;
+       }
+       
+       /**
+        * Sends a message to the git client.  Useful for sending INFO / WARNING messages.
+        * 
+        * @param message
+        */
+       public void sendMessage(String message) {
+               rp.sendMessage(message);
+       }
+       
+}
index 5051100a21a2749a8a3a692b6b600bfe489a9d9b..8538d645e4772a5dca372aae61120830d335b8a7 100644 (file)
@@ -20,7 +20,9 @@ import static org.junit.Assert.assertTrue;
 import groovy.lang.Binding;\r
 import groovy.util.GroovyScriptEngine;\r
 \r
+import java.io.BufferedWriter;\r
 import java.io.File;\r
+import java.io.FileWriter;\r
 import java.text.MessageFormat;\r
 import java.util.ArrayList;\r
 import java.util.Arrays;\r
@@ -69,6 +71,7 @@ public class GroovyScriptTest {
        public void testSendMail() throws Exception {\r
                MockGitblit gitblit = new MockGitblit();\r
                MockLogger logger = new MockLogger();\r
+               MockClientLogger clientLogger = new MockClientLogger();\r
                List<ReceiveCommand> commands = new ArrayList<ReceiveCommand>();\r
                commands.add(new ReceiveCommand(ObjectId\r
                                .fromString("c18877690322dfc6ae3e37bb7f7085a24e94e887"), ObjectId\r
@@ -80,7 +83,7 @@ public class GroovyScriptTest {
                RepositoryModel repository = GitBlit.self().getRepositoryModel("helloworld.git");\r
                repository.mailingLists.add("list@helloworld.git");\r
 \r
-               test("sendmail.groovy", gitblit, logger, commands, repository);\r
+               test("sendmail.groovy", gitblit, logger, clientLogger, commands, repository);\r
                assertEquals(1, logger.messages.size());\r
                assertEquals(1, gitblit.messages.size());\r
                MockMail m = gitblit.messages.get(0);\r
@@ -92,26 +95,28 @@ public class GroovyScriptTest {
        public void testProtectRefsCreateBranch() throws Exception {\r
                MockGitblit gitblit = new MockGitblit();\r
                MockLogger logger = new MockLogger();\r
+               MockClientLogger clientLogger = new MockClientLogger();\r
                List<ReceiveCommand> commands = new ArrayList<ReceiveCommand>();\r
                commands.add(new ReceiveCommand(ObjectId.zeroId(), ObjectId\r
                                .fromString("3fa7c46d11b11d61f1cbadc6888be5d0eae21969"), "refs/heads/master"));\r
                \r
                RepositoryModel repository = new RepositoryModel("ex@mple.git", "", "admin", new Date());               \r
 \r
-               test("protect-refs.groovy", gitblit, logger, commands, repository);\r
+               test("protect-refs.groovy", gitblit, logger, clientLogger, commands, repository);\r
        }\r
        \r
        @Test\r
        public void testProtectRefsCreateTag() throws Exception {\r
                MockGitblit gitblit = new MockGitblit();\r
                MockLogger logger = new MockLogger();\r
+               MockClientLogger clientLogger = new MockClientLogger();\r
                List<ReceiveCommand> commands = new ArrayList<ReceiveCommand>();\r
                commands.add(new ReceiveCommand(ObjectId.zeroId(), ObjectId\r
                                .fromString("3fa7c46d11b11d61f1cbadc6888be5d0eae21969"), "refs/tags/v1.0"));\r
                \r
                RepositoryModel repository = new RepositoryModel("ex@mple.git", "", "admin", new Date());               \r
 \r
-               test("protect-refs.groovy", gitblit, logger, commands, repository);\r
+               test("protect-refs.groovy", gitblit, logger, clientLogger, commands, repository);\r
                assertEquals(0, logger.messages.size());\r
        }\r
        \r
@@ -119,6 +124,7 @@ public class GroovyScriptTest {
        public void testProtectRefsFastForward() throws Exception {\r
                MockGitblit gitblit = new MockGitblit();\r
                MockLogger logger = new MockLogger();\r
+               MockClientLogger clientLogger = new MockClientLogger();\r
                List<ReceiveCommand> commands = new ArrayList<ReceiveCommand>();\r
                commands.add(new ReceiveCommand(ObjectId\r
                                .fromString("c18877690322dfc6ae3e37bb7f7085a24e94e887"), ObjectId\r
@@ -126,7 +132,7 @@ public class GroovyScriptTest {
                \r
                RepositoryModel repository = new RepositoryModel("ex@mple.git", "", "admin", new Date());               \r
 \r
-               test("protect-refs.groovy", gitblit, logger, commands, repository);\r
+               test("protect-refs.groovy", gitblit, logger, clientLogger, commands, repository);\r
                assertEquals(0, logger.messages.size());\r
        }\r
        \r
@@ -134,6 +140,7 @@ public class GroovyScriptTest {
        public void testProtectRefsDeleteMasterBranch() throws Exception {\r
                MockGitblit gitblit = new MockGitblit();\r
                MockLogger logger = new MockLogger();\r
+               MockClientLogger clientLogger = new MockClientLogger();\r
                List<ReceiveCommand> commands = new ArrayList<ReceiveCommand>();\r
                ReceiveCommand command = new ReceiveCommand(ObjectId\r
                                .fromString("3fa7c46d11b11d61f1cbadc6888be5d0eae21969"), ObjectId.zeroId(),\r
@@ -142,7 +149,7 @@ public class GroovyScriptTest {
                \r
                RepositoryModel repository = new RepositoryModel("ex@mple.git", "", "admin", new Date());               \r
 \r
-               test("protect-refs.groovy", gitblit, logger, commands, repository);\r
+               test("protect-refs.groovy", gitblit, logger, clientLogger, commands, repository);\r
                assertEquals(ReceiveCommand.Result.REJECTED_NODELETE, command.getResult());\r
                assertEquals(0, logger.messages.size());\r
        }\r
@@ -151,6 +158,7 @@ public class GroovyScriptTest {
        public void testProtectRefsDeleteOtherBranch() throws Exception {\r
                MockGitblit gitblit = new MockGitblit();\r
                MockLogger logger = new MockLogger();\r
+               MockClientLogger clientLogger = new MockClientLogger();\r
                List<ReceiveCommand> commands = new ArrayList<ReceiveCommand>();\r
                commands.add(new ReceiveCommand(ObjectId\r
                                .fromString("3fa7c46d11b11d61f1cbadc6888be5d0eae21969"), ObjectId.zeroId(),\r
@@ -158,7 +166,7 @@ public class GroovyScriptTest {
                \r
                RepositoryModel repository = new RepositoryModel("ex@mple.git", "", "admin", new Date());               \r
 \r
-               test("protect-refs.groovy", gitblit, logger, commands, repository);\r
+               test("protect-refs.groovy", gitblit, logger, clientLogger, commands, repository);\r
                assertEquals(0, logger.messages.size());\r
        }\r
        \r
@@ -166,6 +174,7 @@ public class GroovyScriptTest {
        public void testProtectRefsDeleteTag() throws Exception {\r
                MockGitblit gitblit = new MockGitblit();\r
                MockLogger logger = new MockLogger();\r
+               MockClientLogger clientLogger = new MockClientLogger();\r
                List<ReceiveCommand> commands = new ArrayList<ReceiveCommand>();\r
                ReceiveCommand command = new ReceiveCommand(ObjectId\r
                                .fromString("3fa7c46d11b11d61f1cbadc6888be5d0eae21969"), ObjectId.zeroId(),\r
@@ -174,7 +183,7 @@ public class GroovyScriptTest {
                \r
                RepositoryModel repository = new RepositoryModel("ex@mple.git", "", "admin", new Date());               \r
 \r
-               test("protect-refs.groovy", gitblit, logger, commands, repository);\r
+               test("protect-refs.groovy", gitblit, logger, clientLogger, commands, repository);\r
                assertEquals(ReceiveCommand.Result.REJECTED_NODELETE, command.getResult());\r
                assertEquals(0, logger.messages.size());\r
        }\r
@@ -183,6 +192,7 @@ public class GroovyScriptTest {
        public void testBlockPush() throws Exception {\r
                MockGitblit gitblit = new MockGitblit();\r
                MockLogger logger = new MockLogger();\r
+               MockClientLogger clientLogger = new MockClientLogger();\r
                List<ReceiveCommand> commands = new ArrayList<ReceiveCommand>();\r
                commands.add(new ReceiveCommand(ObjectId\r
                                .fromString("c18877690322dfc6ae3e37bb7f7085a24e94e887"), ObjectId\r
@@ -191,14 +201,41 @@ public class GroovyScriptTest {
                RepositoryModel repository = new RepositoryModel("ex@mple.git", "", "admin", new Date());               \r
 \r
                try {\r
-                       test("blockpush.groovy", gitblit, logger, commands, repository);\r
+                       test("blockpush.groovy", gitblit, logger, clientLogger, commands, repository);\r
                        assertTrue("blockpush should have failed!", false);\r
                } catch (GitBlitException e) {\r
                        assertTrue(e.getMessage().contains("failed"));\r
                }\r
        }\r
+       \r
+       @Test\r
+       public void testClientLogging() throws Exception {\r
+               MockGitblit gitblit = new MockGitblit();\r
+               MockLogger logger = new MockLogger();\r
+               MockClientLogger clientLogger = new MockClientLogger();\r
+               List<ReceiveCommand> commands = new ArrayList<ReceiveCommand>();\r
+               commands.add(new ReceiveCommand(ObjectId\r
+                               .fromString("c18877690322dfc6ae3e37bb7f7085a24e94e887"), ObjectId\r
+                               .fromString("3fa7c46d11b11d61f1cbadc6888be5d0eae21969"), "refs/heads/master"));\r
+               \r
+               RepositoryModel repository = new RepositoryModel("ex@mple.git", "", "admin", new Date());\r
+               \r
+               File groovyDir = GitBlit.getGroovyScriptsFolder();\r
+               File tempScript = File.createTempFile("testClientLogging", "groovy", groovyDir);\r
+               tempScript.deleteOnExit();\r
+               \r
+               BufferedWriter writer = new BufferedWriter(new FileWriter(tempScript));\r
+               \r
+               writer.write("import com.gitblit.utils.ClientLogger\n");\r
+               writer.write("clientLogger.sendMessage('this is a test message')\n");\r
+               writer.flush();\r
+               writer.close();\r
 \r
-       private void test(String script, MockGitblit gitblit, MockLogger logger,\r
+               test(tempScript.getName(), gitblit, logger, clientLogger, commands, repository);\r
+               assertTrue("Message Missing", clientLogger.messages.contains("this is a test message"));\r
+       }\r
+\r
+       private void test(String script, MockGitblit gitblit, MockLogger logger, MockClientLogger clientLogger,\r
                        List<ReceiveCommand> commands, RepositoryModel repository) throws Exception {\r
 \r
                UserModel user = new UserModel("mock");\r
@@ -215,6 +252,7 @@ public class GroovyScriptTest {
                binding.setVariable("commands", commands);\r
                binding.setVariable("url", gitblitUrl);\r
                binding.setVariable("logger", logger);\r
+               binding.setVariable("clientLogger", clientLogger);\r
 \r
                Object result = gse.run(script, binding);\r
                if (result instanceof Boolean) {\r
@@ -266,6 +304,14 @@ public class GroovyScriptTest {
                        messages.add(message);\r
                }\r
        }\r
+       \r
+       class MockClientLogger {\r
+               List<String> messages = new ArrayList<String>();\r
+\r
+               public void sendMessage(String message) {\r
+                       messages.add(message);\r
+               }\r
+       }\r
 \r
        class MockMail {\r
                final Collection<String> toAddresses;\r
@@ -284,4 +330,4 @@ public class GroovyScriptTest {
                                        + message;\r
                }\r
        }\r
-}
\ No newline at end of file
+}\r