diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/api/HgHookBranchProvider.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/api/HgHookBranchProvider.java index 05f05202e7..0d134a9c8f 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/api/HgHookBranchProvider.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/api/HgHookBranchProvider.java @@ -37,7 +37,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; import sonia.scm.repository.Changeset; -import sonia.scm.repository.spi.HgHookChangesetProvider; +import sonia.scm.repository.spi.HookChangesetProvider; import sonia.scm.repository.spi.HookChangesetRequest; import sonia.scm.repository.spi.javahg.AbstractChangesetCommand; import sonia.scm.util.Util; @@ -46,38 +46,37 @@ import sonia.scm.util.Util; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** - * + * Mercurial hook branch provider implementation. + * * @author Sebastian Sdorra */ public class HgHookBranchProvider implements HookBranchProvider { + + private static final Logger logger = LoggerFactory.getLogger(HgHookBranchProvider.class); - /** Field description */ private static final HookChangesetRequest REQUEST = new HookChangesetRequest(); //~--- constructors --------------------------------------------------------- /** - * Constructs ... + * Constructs a new instance. * * - * @param changesetProvider + * @param changesetProvider changeset provider */ - public HgHookBranchProvider(HgHookChangesetProvider changesetProvider) + public HgHookBranchProvider(HookChangesetProvider changesetProvider) { this.changesetProvider = changesetProvider; } //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @return - */ @Override public List getCreatedOrModified() { @@ -89,12 +88,6 @@ public class HgHookBranchProvider implements HookBranchProvider return createdOrModified; } - /** - * Method description - * - * - * @return - */ @Override public List getDeletedOrClosed() { @@ -108,15 +101,6 @@ public class HgHookBranchProvider implements HookBranchProvider //~--- methods -------------------------------------------------------------- - /** - * Method description - * - * - * @param builder - * @param c - * - * @return - */ private List appendBranches(Builder builder, Changeset c) { List branches = c.getBranches(); @@ -133,26 +117,18 @@ public class HgHookBranchProvider implements HookBranchProvider return branches; } - /** - * Method description - * - * - * @return - */ private Iterable changesets() { return changesetProvider.handleRequest(REQUEST).getChangesets(); } - /** - * Method description - * - */ private void collect() { Builder createdOrModifiedBuilder = ImmutableList.builder(); Builder deletedOrClosedBuilder = ImmutableList.builder(); + logger.trace("collecting branches from hook changesets"); + for (Changeset c : changesets()) { if (c.getProperty(AbstractChangesetCommand.PROPERTY_CLOSE) != null) @@ -171,12 +147,9 @@ public class HgHookBranchProvider implements HookBranchProvider //~--- fields --------------------------------------------------------------- - /** Field description */ - private final HgHookChangesetProvider changesetProvider; + private final HookChangesetProvider changesetProvider; - /** Field description */ private List createdOrModified; - /** Field description */ private List deletedOrClosed; } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/api/HgHookTagProvider.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/api/HgHookTagProvider.java new file mode 100644 index 0000000000..be89ebb415 --- /dev/null +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/api/HgHookTagProvider.java @@ -0,0 +1,107 @@ +/** + * * + * Copyright (c) 2015, 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. + * + * https://bitbucket.org/sdorra/scm-manager + * + */ +package sonia.scm.repository.api; + +import com.google.common.collect.ImmutableList; +import java.util.Collections; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import sonia.scm.repository.Changeset; +import sonia.scm.repository.Tag; +import sonia.scm.repository.spi.HookChangesetProvider; +import sonia.scm.repository.spi.HookChangesetRequest; +import sonia.scm.repository.spi.HookChangesetResponse; + +/** + * Mercurial tag provider implementation. + * + * @author Sebastian Sdorra + * @since 1.50 + */ +public class HgHookTagProvider implements HookTagProvider { + + private static final Logger logger = LoggerFactory.getLogger(HgHookTagProvider.class); + + private static final HookChangesetRequest REQUEST = new HookChangesetRequest(); + + private final HookChangesetProvider changesetProvider; + + private List createdTags; + private final List deletedTags = Collections.emptyList(); + + /** + * Constructs a new instance. + * + * @param changesetProvider changeset provider + */ + public HgHookTagProvider(HookChangesetProvider changesetProvider) { + this.changesetProvider = changesetProvider; + } + + @Override + public List getCreatedTags() { + if (createdTags == null) { + collect(); + } + return createdTags; + } + + @Override + public List getDeletedTags() { + logger.warn("detecting deleted tags with mercurial is currently not supported"); + return deletedTags; + } + + private void collect() { + ImmutableList.Builder createdTagsBuilder = ImmutableList.builder(); + + logger.trace("collecting tags from hook changesets"); + HookChangesetResponse response = changesetProvider.handleRequest(REQUEST); + for ( Changeset c : response.getChangesets() ){ + appendTags(createdTagsBuilder, c); + } + + createdTags = createdTagsBuilder.build(); + } + + private void appendTags(ImmutableList.Builder tags, Changeset c){ + List tagNames = c.getTags(); + if (tagNames != null){ + for ( String tagName : tagNames ){ + logger.trace("found tag {} at changeset {}", tagName, c.getId()); + tags.add(new Tag(tagName, c.getId())); + } + } + } + +} diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/api/HgHookTagTest.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/api/HgHookTagTest.java new file mode 100644 index 0000000000..363705d774 --- /dev/null +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/api/HgHookTagTest.java @@ -0,0 +1,57 @@ +/*** + * Copyright (c) 2015, 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. + * + * https://bitbucket.org/sdorra/scm-manager + * + */ + +package sonia.scm.repository.api; + +import com.google.common.eventbus.Subscribe; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import sonia.scm.EagerSingleton; +import sonia.scm.plugin.ext.Extension; +import sonia.scm.repository.PostReceiveRepositoryHookEvent; + +/** + * + * @author Sebastian Sdorra + */ +@Extension +@EagerSingleton +public class HgHookTagTest { + + private static final Logger logger = LoggerFactory.getLogger(HgHookTagTest.class); + + @Subscribe + public void handle(PostReceiveRepositoryHookEvent event){ + HookTagProvider tagProvider = event.getContext().getTagProvider(); + logger.error("!!!! received mercurial tags {}", tagProvider.getCreatedTags()); + } + +} diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgHookContextProvider.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgHookContextProvider.java index 4087d08751..dede59796c 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgHookContextProvider.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgHookContextProvider.java @@ -46,30 +46,31 @@ import sonia.scm.repository.api.HookMessageProvider; import java.util.EnumSet; import java.util.Set; +import sonia.scm.repository.api.HgHookTagProvider; +import sonia.scm.repository.api.HookTagProvider; /** - * + * Mercurial implementation of {@link HookContextProvider}. + * * @author Sebastian Sdorra */ public class HgHookContextProvider extends HookContextProvider { - /** Field description */ private static final Set SUPPORTED_FEATURES = EnumSet.of(HookFeature.CHANGESET_PROVIDER, HookFeature.MESSAGE_PROVIDER, - HookFeature.BRANCH_PROVIDER); + HookFeature.BRANCH_PROVIDER, HookFeature.TAG_PROVIDER); //~--- constructors --------------------------------------------------------- /** - * Constructs ... + * Constructs a new instance. * - * - * @param handler - * @param repositoryName - * @param hookManager - * @param startRev - * @param type + * @param handler mercurial repository handler + * @param repositoryName name of changed repository + * @param hookManager mercurial hook manager + * @param startRev start revision + * @param type type of hook */ public HgHookContextProvider(HgRepositoryHandler handler, String repositoryName, HgHookManager hookManager, String startRev, @@ -81,12 +82,6 @@ public class HgHookContextProvider extends HookContextProvider //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @return - */ @Override public HookBranchProvider getBranchProvider() { @@ -98,24 +93,23 @@ public class HgHookContextProvider extends HookContextProvider return hookBranchProvider; } - /** - * Method description - * - * - * @return - */ + @Override + public HookTagProvider getTagProvider() + { + if (hookTagProvider == null) + { + hookTagProvider = new HgHookTagProvider(hookChangesetProvider); + } + + return hookTagProvider; + } + @Override public HookChangesetProvider getChangesetProvider() { return hookChangesetProvider; } - - /** - * Method description - * - * - * @return - */ + public HgHookMessageProvider getHgMessageProvider() { if (hgMessageProvider == null) @@ -126,12 +120,6 @@ public class HgHookContextProvider extends HookContextProvider return hgMessageProvider; } - /** - * Method description - * - * - * @return - */ @Override public Set getSupportedFeatures() { @@ -140,12 +128,6 @@ public class HgHookContextProvider extends HookContextProvider //~--- methods -------------------------------------------------------------- - /** - * Method description - * - * - * @return - */ @Override protected HookMessageProvider createMessageProvider() { @@ -154,12 +136,11 @@ public class HgHookContextProvider extends HookContextProvider //~--- fields --------------------------------------------------------------- - /** Field description */ private final HgHookChangesetProvider hookChangesetProvider; - /** Field description */ private HgHookMessageProvider hgMessageProvider; - /** Field description */ private HgHookBranchProvider hookBranchProvider; + + private HgHookTagProvider hookTagProvider; } diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/api/HgHookTagProviderTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/api/HgHookTagProviderTest.java new file mode 100644 index 0000000000..6d78d0eb3c --- /dev/null +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/api/HgHookTagProviderTest.java @@ -0,0 +1,104 @@ +/*** + * Copyright (c) 2015, 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. + * + * https://bitbucket.org/sdorra/scm-manager + * + */ + +package sonia.scm.repository.api; + +import com.google.common.collect.Lists; +import java.util.List; +import org.junit.Test; +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; +import static org.hamcrest.Matchers.*; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.runners.MockitoJUnitRunner; +import sonia.scm.repository.Changeset; +import sonia.scm.repository.Tag; +import sonia.scm.repository.spi.HookChangesetProvider; +import sonia.scm.repository.spi.HookChangesetRequest; +import sonia.scm.repository.spi.HookChangesetResponse; + +/** + * Unit tests for {@link HgHookTagProvider}. + * + * @author Sebastian Sdorra + */ +@RunWith(MockitoJUnitRunner.class) +public class HgHookTagProviderTest { + + @Mock + private HookChangesetProvider changesetProvider; + + @InjectMocks + private HgHookTagProvider tagProvider; + + /** + * Tests {@link HgHookTagProvider#getDeletedTags()}. + */ + @Test + public void testGetDeletedTags() { + prepareChangesets(new Changeset("1", Long.MIN_VALUE, null)); + assertThat(tagProvider.getDeletedTags(), empty()); + } + + /** + * Tests {@link HgHookTagProvider#getCreatedTags()}. + */ + @Test + public void testGetCreatedTags(){ + Changeset c1 = new Changeset("1", Long.MIN_VALUE, null); + c1.getTags().add("1.0.0"); + Changeset c2 = new Changeset("2", Long.MIN_VALUE, null); + c2.getTags().add("2.0.0"); + Changeset c3 = new Changeset("3", Long.MIN_VALUE, null); + prepareChangesets(c1, c2, c3); + + List tags = tagProvider.getCreatedTags(); + assertNotNull(tags); + assertEquals(2, tags.size()); + + Tag t1 = tags.get(0); + assertEquals("1", t1.getRevision()); + assertEquals("1.0.0", t1.getName()); + + Tag t2 = tags.get(1); + assertEquals("2", t2.getRevision()); + assertEquals("2.0.0", t2.getName()); + } + + private void prepareChangesets(Changeset... changesets){ + List list = Lists.newArrayList(changesets); + HookChangesetResponse response = new HookChangesetResponse(list); + when(changesetProvider.handleRequest(Mockito.any(HookChangesetRequest.class))).thenReturn(response); + } +} \ No newline at end of file