mirror of
				https://github.com/scm-manager/scm-manager.git
				synced 2025-10-31 10:35:56 +01:00 
			
		
		
		
	implement pre receive hook for svn repositories
This commit is contained in:
		| @@ -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; | ||||
| @@ -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<Changeset> 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<Changeset> fetchChangesets() | ||||
|   { | ||||
|     List<Changeset> csets = new ArrayList<Changeset>(); | ||||
|  | ||||
|     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<Changeset> changesets; | ||||
|  | ||||
|   /** Field description */ | ||||
|   private File repositoryDirectory; | ||||
|  | ||||
|   /** Field description */ | ||||
|   private String transaction; | ||||
| } | ||||
| @@ -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 --------------------------------------------------------------- | ||||
|   | ||||
		Reference in New Issue
	
	Block a user