diff --git a/scm-plugins/scm-svn-plugin/pom.xml b/scm-plugins/scm-svn-plugin/pom.xml index 428a9d68e5..24ea06b70c 100644 --- a/scm-plugins/scm-svn-plugin/pom.xml +++ b/scm-plugins/scm-svn-plugin/pom.xml @@ -26,7 +26,7 @@ - org.tmatesoft.svnkit + sonia.svnkit svnkit-dav ${svnkit-dav.version} @@ -53,7 +53,7 @@ - 1.3.5.4 + 1.3.5.5-SNAPSHOT diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnChangesetViewer.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnChangesetViewer.java index b68c2260b6..279a4595f4 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnChangesetViewer.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnChangesetViewer.java @@ -119,7 +119,7 @@ public class SvnChangesetViewer implements ChangesetViewer for (SVNLogEntry entry : entries) { - changesetList.add(createChangeset(entry)); + changesetList.add(SvnUtil.createChangeset(entry)); } changesets = new ChangesetPagingResult((int) total, changesetList); @@ -136,67 +136,6 @@ public class SvnChangesetViewer implements ChangesetViewer return changesets; } - //~--- methods -------------------------------------------------------------- - - /** - * TODO: type replaced - * - * - * @param modifications - * @param entry - */ - private void appendModification(Modifications modifications, - SVNLogEntryPath entry) - { - switch (entry.getType()) - { - case SVNLogEntryPath.TYPE_ADDED : - modifications.getAdded().add(entry.getPath()); - - break; - - case SVNLogEntryPath.TYPE_DELETED : - modifications.getRemoved().add(entry.getPath()); - - break; - - case SVNLogEntryPath.TYPE_MODIFIED : - modifications.getModified().add(entry.getPath()); - - break; - } - } - - /** - * Method description - * - * - * @param entry - * - * @return - */ - @SuppressWarnings("unchecked") - private Changeset createChangeset(SVNLogEntry entry) - { - Changeset changeset = new Changeset(String.valueOf(entry.getRevision()), - entry.getDate().getTime(), - Person.toPerson(entry.getAuthor()), - entry.getMessage()); - Map changeMap = entry.getChangedPaths(); - - if (Util.isNotEmpty(changeMap)) - { - Modifications modifications = changeset.getModifications(); - - for (SVNLogEntryPath e : changeMap.values()) - { - appendModification(modifications, e); - } - } - - return changeset; - } - //~--- fields --------------------------------------------------------------- /** Field description */ diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java index 2cccb9347b..ac1fb74268 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java @@ -42,6 +42,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.internal.io.fs.FSHooks; import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory; import org.tmatesoft.svn.core.io.SVNRepositoryFactory; @@ -87,14 +88,27 @@ public class SvnRepositoryHandler * * @param storeFactory * @param fileSystem + * @param repositoryManager */ @Inject - public SvnRepositoryHandler(StoreFactory storeFactory, FileSystem fileSystem) + public SvnRepositoryHandler(StoreFactory storeFactory, FileSystem fileSystem, + RepositoryManager repositoryManager) { super(storeFactory, fileSystem); // setup FSRepositoryFactory for SvnRepositoryBrowser FSRepositoryFactory.setup(); + + // register hook + if (repositoryManager != null) + { + FSHooks.registerHook(new SvnRepositoryHook(repositoryManager)); + } + else if (logger.isWarnEnabled()) + { + logger.warn( + "unable to register hook, beacause of missing repositorymanager"); + } } //~--- get methods ---------------------------------------------------------- diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHook.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHook.java new file mode 100644 index 0000000000..b29424c7b7 --- /dev/null +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHook.java @@ -0,0 +1,123 @@ +/** + * Copyright (c) 2010, 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.repository; + +//~--- non-JDK imports -------------------------------------------------------- + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.tmatesoft.svn.core.internal.io.fs.FSHook; +import org.tmatesoft.svn.core.internal.io.fs.FSHookEvent; +import org.tmatesoft.svn.core.internal.io.fs.FSHooks; + +import sonia.scm.util.Util; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.File; + +/** + * + * @author Sebastian Sdorra + */ +public class SvnRepositoryHook implements FSHook +{ + + /** the logger for SvnRepositoryHook */ + private static final Logger logger = + LoggerFactory.getLogger(SvnRepositoryHook.class); + + //~--- constructors --------------------------------------------------------- + + /** + * Constructs ... + * + * + * @param repositoryManager + */ + public SvnRepositoryHook(RepositoryManager repositoryManager) + { + this.repositoryManager = repositoryManager; + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param event + */ + @Override + public void onHook(FSHookEvent event) + { + File directory = event.getReposRootDir(); + + if (FSHooks.SVN_REPOS_HOOK_POST_COMMIT.equals(event.getType())) + { + String[] args = event.getArgs(); + + if (Util.isNotEmpty(args)) + { + try + { + long revision = Long.parseLong(args[0]); + + repositoryManager.fireHookEvent(SvnRepositoryHandler.TYPE_NAME, + directory.getName(), + new SvnRepositoryHookEvent(directory, + revision)); + } + catch (NumberFormatException ex) + { + logger.error("could not parse revision of post commit hook"); + } + catch (RepositoryNotFoundException ex) + { + logger.error("could not find repository {}", directory.getName()); + } + } + else if (logger.isWarnEnabled()) + { + logger.warn("no arguments found on post commit hook"); + } + } + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private RepositoryManager repositoryManager; +} diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHookEvent.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHookEvent.java new file mode 100644 index 0000000000..1dd5869ba9 --- /dev/null +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHookEvent.java @@ -0,0 +1,167 @@ +/** + * Copyright (c) 2010, 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.repository; + +//~--- non-JDK imports -------------------------------------------------------- + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.SVNLogEntry; +import org.tmatesoft.svn.core.SVNURL; +import org.tmatesoft.svn.core.io.SVNRepository; +import org.tmatesoft.svn.core.io.SVNRepositoryFactory; + +import sonia.scm.util.Util; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.File; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * + * @author Sebastian Sdorra + */ +public class SvnRepositoryHookEvent extends AbstractRepositoryHookEvent +{ + + /** the logger for SvnRepositoryHookEvent */ + private static final Logger logger = + LoggerFactory.getLogger(SvnRepositoryHookEvent.class); + + //~--- constructors --------------------------------------------------------- + + /** + * Constructs ... + * + * + * @param repositoryDirectory + * @param revision + */ + public SvnRepositoryHookEvent(File repositoryDirectory, long revision) + { + this.repositoryDirectory = repositoryDirectory; + this.revision = revision; + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @return + */ + @Override + public Collection getChangesets() + { + if (changesets == null) + { + changesets = fetchChangesets(); + } + + return changesets; + } + + /** + * Method description + * + * + * @return + */ + @Override + public RepositoryHookType getType() + { + return RepositoryHookType.POST_RECEIVE; + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @return + */ + private List fetchChangesets() + { + List result = new ArrayList(); + SVNRepository repository = null; + + try + { + repository = + SVNRepositoryFactory.create(SVNURL.fromFile(repositoryDirectory)); + + Collection enties = repository.log(new String[] { "" }, + null, revision, revision, true, true); + + if (Util.isNotEmpty(enties)) + { + SVNLogEntry entry = enties.iterator().next(); + + if (entry != null) + { + result.add(SvnUtil.createChangeset(entry)); + } + } + } + catch (SVNException ex) + { + logger.error("could not open repository", ex); + } + finally + { + repository.closeSession(); + } + + return result; + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private List changesets; + + /** Field description */ + private File repositoryDirectory; + + /** Field description */ + private long revision; +} diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnUtil.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnUtil.java new file mode 100644 index 0000000000..622c97b304 --- /dev/null +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnUtil.java @@ -0,0 +1,112 @@ +/** + * Copyright (c) 2010, 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.repository; + +//~--- non-JDK imports -------------------------------------------------------- + +import org.tmatesoft.svn.core.SVNLogEntry; +import org.tmatesoft.svn.core.SVNLogEntryPath; + +import sonia.scm.util.Util; + +//~--- JDK imports ------------------------------------------------------------ + +import java.util.Map; + +/** + * + * @author Sebastian Sdorra + */ +public class SvnUtil +{ + + /** + * Method description + * + * + * @param entry + * + * @return + */ + @SuppressWarnings("unchecked") + public static Changeset createChangeset(SVNLogEntry entry) + { + Changeset changeset = new Changeset(String.valueOf(entry.getRevision()), + entry.getDate().getTime(), + Person.toPerson(entry.getAuthor()), + entry.getMessage()); + Map changeMap = entry.getChangedPaths(); + + if (Util.isNotEmpty(changeMap)) + { + Modifications modifications = changeset.getModifications(); + + for (SVNLogEntryPath e : changeMap.values()) + { + appendModification(modifications, e); + } + } + + return changeset; + } + + /** + * TODO: type replaced + * + * + * @param modifications + * @param entry + */ + private static void appendModification(Modifications modifications, + SVNLogEntryPath entry) + { + switch (entry.getType()) + { + case SVNLogEntryPath.TYPE_ADDED : + modifications.getAdded().add(entry.getPath()); + + break; + + case SVNLogEntryPath.TYPE_DELETED : + modifications.getRemoved().add(entry.getPath()); + + break; + + case SVNLogEntryPath.TYPE_MODIFIED : + modifications.getModified().add(entry.getPath()); + + break; + } + } +} diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/SvnRepositoryHandlerTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/SvnRepositoryHandlerTest.java index ab26da171f..5a46cdfd28 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/SvnRepositoryHandlerTest.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/SvnRepositoryHandlerTest.java @@ -85,7 +85,7 @@ public class SvnRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase File directory) { SvnRepositoryHandler handler = new SvnRepositoryHandler(factory, - new DefaultFileSystem()); + new DefaultFileSystem(), null); handler.init(contextProvider);