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/SvnPostReceiveHookEvent.java similarity index 94% rename from scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHookEvent.java rename to scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnPostReceiveHookEvent.java index 1dd5869ba9..4d03432c0b 100644 --- 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/SvnPostReceiveHookEvent.java @@ -58,12 +58,12 @@ import java.util.List; * * @author Sebastian Sdorra */ -public class SvnRepositoryHookEvent extends AbstractRepositoryHookEvent +public class SvnPostReceiveHookEvent extends AbstractRepositoryHookEvent { - /** the logger for SvnRepositoryHookEvent */ + /** the logger for SvnPostReceiveHookEvent */ private static final Logger logger = - LoggerFactory.getLogger(SvnRepositoryHookEvent.class); + LoggerFactory.getLogger(SvnPostReceiveHookEvent.class); //~--- constructors --------------------------------------------------------- @@ -74,7 +74,7 @@ public class SvnRepositoryHookEvent extends AbstractRepositoryHookEvent * @param repositoryDirectory * @param revision */ - public SvnRepositoryHookEvent(File repositoryDirectory, long revision) + public SvnPostReceiveHookEvent(File repositoryDirectory, long revision) { this.repositoryDirectory = repositoryDirectory; this.revision = revision; diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnPreReceiveHookEvent.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnPreReceiveHookEvent.java new file mode 100644 index 0000000000..f57fbe7df1 --- /dev/null +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnPreReceiveHookEvent.java @@ -0,0 +1,157 @@ +/** + * 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.SVNLogEntry; +import org.tmatesoft.svn.core.wc.ISVNOptions; +import org.tmatesoft.svn.core.wc.SVNClientManager; +import org.tmatesoft.svn.core.wc.SVNWCUtil; +import org.tmatesoft.svn.core.wc.admin.SVNLookClient; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.File; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * + * @author Sebastian Sdorra + */ +public class SvnPreReceiveHookEvent extends AbstractRepositoryHookEvent +{ + + /** the logger for SvnPreReceiveHookEvent */ + private static final Logger logger = + LoggerFactory.getLogger(SvnPreReceiveHookEvent.class); + + //~--- constructors --------------------------------------------------------- + + /** + * Constructs ... + * + * + * @param repositoryDirectory + * @param transaction + */ + public SvnPreReceiveHookEvent(File repositoryDirectory, String transaction) + { + this.repositoryDirectory = repositoryDirectory; + this.transaction = transaction; + } + + //~--- 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.PRE_RECEIVE; + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @return + */ + private Collection fetchChangesets() + { + List csets = new ArrayList(); + + try + { + ISVNOptions options = SVNWCUtil.createDefaultOptions(true); + SVNClientManager cm = SVNClientManager.newInstance(options); + SVNLookClient clientManager = cm.getLookClient(); + SVNLogEntry entry = clientManager.doGetInfo(repositoryDirectory, + transaction); + + if (entry != null) + { + csets.add(SvnUtil.createChangeset(entry)); + } + } + catch (Exception ex) + { + logger.error( + "could not fetch changesets for transaction ".concat(transaction), + ex); + } + + return csets; + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private Collection changesets; + + /** Field description */ + private File repositoryDirectory; + + /** Field description */ + private String transaction; +} 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 index b29424c7b7..84f9982c34 100644 --- 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 @@ -95,18 +95,11 @@ public class SvnRepositoryHook implements FSHook { long revision = Long.parseLong(args[0]); - repositoryManager.fireHookEvent(SvnRepositoryHandler.TYPE_NAME, - directory.getName(), - new SvnRepositoryHookEvent(directory, - revision)); + fireHook(directory, new SvnPostReceiveHookEvent(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()); + logger.error("could not parse revision of post commit hook", ex); } } else if (logger.isWarnEnabled()) @@ -114,6 +107,48 @@ public class SvnRepositoryHook implements FSHook logger.warn("no arguments found on post commit hook"); } } + else if (FSHooks.SVN_REPOS_HOOK_PRE_COMMIT.equals(event.getType())) + { + String[] args = event.getArgs(); + + if (Util.isNotEmpty(args)) + { + String tx = args[0]; + + if (Util.isNotEmpty(tx)) + { + fireHook(directory, new SvnPreReceiveHookEvent(directory, tx)); + } + else if (logger.isWarnEnabled()) + { + logger.warn("transaction of pre commit hook is empty"); + } + } + else if (logger.isWarnEnabled()) + { + logger.warn("no arguments found on pre commit hook"); + } + } + } + + /** + * Method description + * + * + * @param directory + * @param hookEvent + */ + private void fireHook(File directory, RepositoryHookEvent hookEvent) + { + try + { + repositoryManager.fireHookEvent(SvnRepositoryHandler.TYPE_NAME, + directory.getName(), hookEvent); + } + catch (RepositoryNotFoundException ex) + { + logger.error("could not find repository {}", directory.getName()); + } } //~--- fields ---------------------------------------------------------------