diff --git a/scm-webapp/pom.xml b/scm-webapp/pom.xml
index 9a7ab485a8..e4245649f1 100644
--- a/scm-webapp/pom.xml
+++ b/scm-webapp/pom.xml
@@ -644,6 +644,10 @@
scm.home
target/scm-it
+
+ scm.stage
+ ${scm.stage}
+
diff --git a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java
index 2c2efff045..555fb7682c 100644
--- a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java
+++ b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java
@@ -59,6 +59,7 @@ import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
+import sonia.scm.debug.DebugModule;
import sonia.scm.repository.HealthCheckContextListener;
import sonia.scm.schedule.Scheduler;
@@ -198,6 +199,10 @@ public class ScmContextListener extends GuiceServletContextListener
moduleList.add(new ScmSecurityModule(servletContext));
moduleList.addAll(pluginLoader.getModuleSet());
moduleList.addAll(overrides.getModules());
+
+ if (SCMContext.getContext().getStage() == Stage.DEVELOPMENT){
+ moduleList.add(new DebugModule());
+ }
return Guice.createInjector(moduleList);
}
diff --git a/scm-webapp/src/main/java/sonia/scm/debug/DebugHook.java b/scm-webapp/src/main/java/sonia/scm/debug/DebugHook.java
new file mode 100644
index 0000000000..b225090da0
--- /dev/null
+++ b/scm-webapp/src/main/java/sonia/scm/debug/DebugHook.java
@@ -0,0 +1,85 @@
+/**
+ * Copyright (c) 2014, Sebastian Sdorra
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of SCM-Manager; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://bitbucket.org/sdorra/scm-manager
+ *
+ */
+package sonia.scm.debug;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+import com.google.common.eventbus.Subscribe;
+import javax.inject.Inject;
+import sonia.scm.EagerSingleton;
+import sonia.scm.repository.Changeset;
+import sonia.scm.repository.PostReceiveRepositoryHookEvent;
+
+/**
+ * {@link PostReceiveRepositoryHookEvent} which stores receives data and passes it to the {@link DebugService}.
+ *
+ * @author Sebastian Sdorra
+ */
+@EagerSingleton
+public final class DebugHook
+{
+
+ private final DebugService debugService;
+
+ /**
+ * Constructs a new instance.
+ *
+ * @param debugService debug service
+ */
+ @Inject
+ public DebugHook(DebugService debugService)
+ {
+ this.debugService = debugService;
+ }
+
+ /**
+ * Processes the received {@link PostReceiveRepositoryHookEvent} and transforms it to a {@link DebugHookData} and
+ * passes it to the {@link DebugService}.
+ *
+ * @param event received event
+ */
+ @Subscribe
+ public void processEvent(PostReceiveRepositoryHookEvent event){
+ debugService.put(
+ event.getRepository().getId(),
+ new DebugHookData(Collections2.transform(event.getChangesets(), IDEXTRACTOR))
+ );
+ }
+
+ private static final Function IDEXTRACTOR = new Function(){
+
+ @Override
+ public String apply(Changeset input)
+ {
+ return input.getId();
+ }
+ };
+}
diff --git a/scm-webapp/src/main/java/sonia/scm/debug/DebugHookData.java b/scm-webapp/src/main/java/sonia/scm/debug/DebugHookData.java
new file mode 100644
index 0000000000..bb8cfa42e7
--- /dev/null
+++ b/scm-webapp/src/main/java/sonia/scm/debug/DebugHookData.java
@@ -0,0 +1,90 @@
+/**
+ * Copyright (c) 2014, Sebastian Sdorra
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of SCM-Manager; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://bitbucket.org/sdorra/scm-manager
+ *
+ */
+package sonia.scm.debug;
+
+import java.util.Collection;
+import java.util.Date;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * Received data from repository hook event.
+ *
+ * @author Sebastian Sdorra
+ */
+@XmlRootElement(name = "hook")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class DebugHookData
+{
+ private Date date;
+ private Collection changesets;
+
+ /**
+ * Constructs a new instance. This constructor should only be used by JAXB.
+ */
+ public DebugHookData()
+ {
+ }
+
+ /**
+ * Constructs a new instance.
+ *
+ * @param changesets collection of changeset ids
+ */
+ public DebugHookData(Collection changesets)
+ {
+ this.date = new Date();
+ this.changesets = changesets;
+ }
+
+ /**
+ * Returns the receiving date.
+ *
+ * @return receiving date
+ */
+ public Date getDate()
+ {
+ return date;
+ }
+
+ /**
+ * Return collection of changeset ids.
+ *
+ * @return collection of changeset ids
+ */
+ public Collection getChangesets()
+ {
+ return changesets;
+ }
+
+
+}
diff --git a/scm-webapp/src/main/java/sonia/scm/debug/DebugModule.java b/scm-webapp/src/main/java/sonia/scm/debug/DebugModule.java
new file mode 100644
index 0000000000..c0dc231341
--- /dev/null
+++ b/scm-webapp/src/main/java/sonia/scm/debug/DebugModule.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2014, Sebastian Sdorra
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of SCM-Manager; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://bitbucket.org/sdorra/scm-manager
+ *
+ */
+package sonia.scm.debug;
+
+import com.google.inject.AbstractModule;
+
+/**
+ * DebugModule binds all required classes around the {@link DebugService}.
+ *
+ * @author Sebastian Sdorra
+ */
+public final class DebugModule extends AbstractModule
+{
+
+ @Override
+ protected void configure()
+ {
+ bind(DebugService.class);
+ bind(DebugHook.class);
+ bind(DebugResource.class);
+ }
+
+}
diff --git a/scm-webapp/src/main/java/sonia/scm/debug/DebugResource.java b/scm-webapp/src/main/java/sonia/scm/debug/DebugResource.java
new file mode 100644
index 0000000000..f65e0c7708
--- /dev/null
+++ b/scm-webapp/src/main/java/sonia/scm/debug/DebugResource.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2014, Sebastian Sdorra
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of SCM-Manager; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://bitbucket.org/sdorra/scm-manager
+ *
+ */
+package sonia.scm.debug;
+
+import java.util.Collection;
+import javax.inject.Inject;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+/**
+ * Rest api resource for the {@link DebugService}.
+ *
+ * @author Sebastian Sdorra
+ */
+@Path("debug/{repository}/post-receive")
+public final class DebugResource
+{
+ private final DebugService debugService;
+
+ /**
+ * Constructs a new instance.
+ *
+ * @param debugService debug service
+ */
+ @Inject
+ public DebugResource(DebugService debugService)
+ {
+ this.debugService = debugService;
+ }
+
+ /**
+ * Returns all received hook data for the given repository.
+ *
+ * @param repository repository id
+ *
+ * @return all received hook data for the given repository
+ */
+ @GET
+ @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
+ public Collection getAll(@PathParam("repository") String repository){
+ return debugService.getAll(repository);
+ }
+
+ /**
+ * Returns the last received hook data for the given repository.
+ *
+ * @param repository repository id
+ *
+ * @return the last received hook data for the given repository
+ */
+ @GET
+ @Path("last")
+ @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
+ public DebugHookData getLast(@PathParam("repository") String repository){
+ return debugService.getLast(repository);
+ }
+
+}
diff --git a/scm-webapp/src/main/java/sonia/scm/debug/DebugService.java b/scm-webapp/src/main/java/sonia/scm/debug/DebugService.java
new file mode 100644
index 0000000000..807b9c0abc
--- /dev/null
+++ b/scm-webapp/src/main/java/sonia/scm/debug/DebugService.java
@@ -0,0 +1,92 @@
+/**
+ * Copyright (c) 2014, Sebastian Sdorra
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of SCM-Manager; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://bitbucket.org/sdorra/scm-manager
+ *
+ */
+package sonia.scm.debug;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.LinkedListMultimap;
+import com.google.common.collect.Multimap;
+import com.google.inject.Singleton;
+import java.util.Collection;
+import org.apache.shiro.SecurityUtils;
+import sonia.scm.security.Role;
+
+/**
+ * The DebugService stores and returns received data from repository hook events.
+ *
+ * @author Sebastian Sdorra
+ */
+@Singleton
+public final class DebugService
+{
+
+ private final Multimap receivedHooks = LinkedListMultimap.create();
+
+ /**
+ *
+ * @param repository repository id
+ * @param hookData received hook data
+ */
+ public void put(String repository, DebugHookData hookData)
+ {
+ SecurityUtils.getSubject().checkRole(Role.ADMIN);
+ receivedHooks.put(repository, hookData);
+ }
+
+ /**
+ * Returns the last received hook data for the given repository.
+ *
+ * @param repository repository id
+ *
+ * @return the last received hook data for the given repository
+ */
+ public DebugHookData getLast(String repository){
+ SecurityUtils.getSubject().checkRole(Role.ADMIN);
+ DebugHookData hookData = null;
+ Collection receivedHookData = receivedHooks.get(repository);
+ if (receivedHookData != null && ! receivedHookData.isEmpty()){
+ hookData = Iterables.getLast(receivedHookData);
+ }
+ return hookData;
+ }
+
+ /**
+ * Returns all received hook data for the given repository.
+ *
+ * @param repository repository id
+ *
+ * @return all received hook data for the given repository
+ */
+ public Collection getAll(String repository){
+ SecurityUtils.getSubject().checkRole(Role.ADMIN);
+ return receivedHooks.get(repository);
+ }
+
+}
diff --git a/scm-webapp/src/test/java/sonia/scm/it/IntegrationTestUtil.java b/scm-webapp/src/test/java/sonia/scm/it/IntegrationTestUtil.java
index 5d4b1fbe48..9bb2b4c16d 100644
--- a/scm-webapp/src/test/java/sonia/scm/it/IntegrationTestUtil.java
+++ b/scm-webapp/src/test/java/sonia/scm/it/IntegrationTestUtil.java
@@ -76,9 +76,12 @@ public final class IntegrationTestUtil
/** Field description */
public static final String ADMIN_USERNAME = "scmadmin";
-
- /** Field description */
- public static final String BASE_URL = "http://localhost:8081/scm/api/rest/";
+
+ /** scm-manager base url */
+ public static final String BASE_URL = "http://localhost:8081/scm/";
+
+ /** scm-manager base url for the rest api */
+ public static final String REST_BASE_URL = BASE_URL.concat("api/rest/");
/** Field description */
public static final String EXTENSION = ".xml";
@@ -253,7 +256,7 @@ public final class IntegrationTestUtil
*/
public static String createResourceUrl(String url)
{
- return BASE_URL.concat(url).concat(EXTENSION);
+ return REST_BASE_URL.concat(url).concat(EXTENSION);
}
/**
diff --git a/scm-webapp/src/test/java/sonia/scm/it/RepositoryHookITCase.java b/scm-webapp/src/test/java/sonia/scm/it/RepositoryHookITCase.java
new file mode 100644
index 0000000000..60bf5d4aa9
--- /dev/null
+++ b/scm-webapp/src/test/java/sonia/scm/it/RepositoryHookITCase.java
@@ -0,0 +1,208 @@
+/**
+ * Copyright (c) 2014, Sebastian Sdorra
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of SCM-Manager; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://bitbucket.org/sdorra/scm-manager
+ *
+ */
+package sonia.scm.it;
+
+import com.google.common.base.Charsets;
+import com.google.common.collect.Lists;
+import com.google.common.io.Files;
+import com.sun.jersey.api.client.WebResource;
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import org.junit.After;
+import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.*;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+import sonia.scm.debug.DebugHookData;
+import static sonia.scm.it.IntegrationTestUtil.createResource;
+import static sonia.scm.it.RepositoryITUtil.createRepository;
+import static sonia.scm.it.RepositoryITUtil.deleteRepository;
+import sonia.scm.repository.Changeset;
+import sonia.scm.repository.Person;
+import sonia.scm.repository.Repository;
+import sonia.scm.repository.RepositoryTestData;
+import sonia.scm.repository.client.api.RepositoryClient;
+import sonia.scm.repository.client.api.RepositoryClientFactory;
+
+/**
+ * Integration tests for repository hooks.
+ *
+ * @author Sebastian Sdorra
+ */
+@RunWith(Parameterized.class)
+public class RepositoryHookITCase extends AbstractAdminITCaseBase
+{
+
+ private static final RepositoryClientFactory REPOSITORY_CLIENT_FACTORY = new RepositoryClientFactory();
+
+ @Rule
+ public TemporaryFolder tempFolder = new TemporaryFolder();
+
+ private final String repositoryType;
+ private Repository repository;
+ private File workingCopy;
+ private RepositoryClient repositoryClient;
+
+ /**
+ * Constructs a new instance with a repository type.
+ *
+ * @param repositoryType repository type
+ */
+ public RepositoryHookITCase(String repositoryType)
+ {
+ this.repositoryType = repositoryType;
+ }
+
+ /**
+ * Creates a test repository.
+ *
+ * @throws IOException
+ */
+ @Before
+ public void setUpTestRepository() throws IOException
+ {
+ repository = RepositoryTestData.createHeartOfGold(repositoryType);
+ repository = createRepository(client, repository);
+ workingCopy = tempFolder.newFolder();
+ repositoryClient = createRepositoryClient();
+ }
+
+ /**
+ * Removes the tests repository.
+ */
+ @After
+ public void removeTestRepository()
+ {
+ deleteRepository(client, repository.getId());
+ }
+
+ /**
+ * Tests that the debug service has received the commit.
+ *
+ * @throws IOException
+ * @throws InterruptedException
+ */
+ @Test
+ public void testSimpleHook() throws IOException, InterruptedException
+ {
+ // push commit
+ Files.write("a", new File(workingCopy, "a.txt"), Charsets.UTF_8);
+ repositoryClient.getAddCommand().add("a.txt");
+ Changeset changeset = repositoryClient.getCommitCommand().commit(
+ new Person("scmadmin", "scmadmin@scm-manager.org"), "added a"
+ );
+ repositoryClient.getPushCommand().push();
+
+ // wait some time, because the debug hook is asnychron
+ Thread.sleep(125);
+
+ // check debug servlet for pushed commit
+ WebResource wr = createResource(client, "debug/" + repository.getId() + "/post-receive/last");
+ DebugHookData data = wr.get(DebugHookData.class);
+ assertNotNull(data);
+ assertThat(data.getChangesets(), contains(changeset.getId()));
+ }
+
+ /**
+ * Tests that the debug service receives only new commits.
+ *
+ * @throws IOException
+ * @throws InterruptedException
+ */
+ @Test
+ public void testOnlyNewCommit() throws IOException, InterruptedException
+ {
+ // push commit
+ Files.write("a", new File(workingCopy, "a.txt"), Charsets.UTF_8);
+ repositoryClient.getAddCommand().add("a.txt");
+ Changeset a = repositoryClient.getCommitCommand().commit(
+ new Person("scmadmin", "scmadmin@scm-manager.org"), "added a"
+ );
+ repositoryClient.getPushCommand().push();
+
+ // create branch, commit and push again
+ repositoryClient.getBranchCommand().branch("feature/added-b");
+ Files.write("b", new File(workingCopy, "b.txt"), Charsets.UTF_8);
+ repositoryClient.getAddCommand().add("a.txt");
+ Changeset b = repositoryClient.getCommitCommand().commit(
+ new Person("scmadmin", "scmadmin@scm-manager.org"), "added b"
+ );
+ repositoryClient.getPushCommand().push();
+
+ // wait some time, because the debug hook is asnychron
+ Thread.sleep(125);
+
+ // check debug servlet that only one commit is present
+ WebResource wr = createResource(client, "debug/" + repository.getId() + "/post-receive/last");
+ DebugHookData data = wr.get(DebugHookData.class);
+ assertNotNull(data);
+ assertThat(data.getChangesets(), allOf(
+ contains(b.getId()),
+ not(
+ contains(a.getId())
+ )
+ ));
+ }
+
+ private RepositoryClient createRepositoryClient() throws IOException
+ {
+ return REPOSITORY_CLIENT_FACTORY.create(repositoryType,
+ IntegrationTestUtil.BASE_URL + repositoryType + "/" + repository.getName(),
+ IntegrationTestUtil.ADMIN_USERNAME, IntegrationTestUtil.ADMIN_PASSWORD, workingCopy
+ );
+ }
+
+
+ /**
+ * Returns repository types a test parameter.
+ *
+ * @return repository types test parameter
+ */
+ @Parameters
+ public static Collection createParameters()
+ {
+ Collection params = Lists.newArrayList();
+ params.add(new String[] { "git" });
+ // params.add(new String[] { "svn" });
+ // if (IOUtil.search("hg") != null)
+ // {
+ // params.add(new String[] { "hg" });
+ // }
+ return params;
+ }
+
+}