mirror of
				https://github.com/scm-manager/scm-manager.git
				synced 2025-10-31 10:35:56 +01:00 
			
		
		
		
	added hook support for subversion
This commit is contained in:
		| @@ -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<String, SVNLogEntryPath> changeMap = entry.getChangedPaths(); | ||||
|  | ||||
|     if (Util.isNotEmpty(changeMap)) | ||||
|     { | ||||
|       Modifications modifications = changeset.getModifications(); | ||||
|  | ||||
|       for (SVNLogEntryPath e : changeMap.values()) | ||||
|       { | ||||
|         appendModification(modifications, e); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     return changeset; | ||||
|   } | ||||
|  | ||||
|   //~--- fields --------------------------------------------------------------- | ||||
|  | ||||
|   /** Field description */ | ||||
|   | ||||
| @@ -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 ---------------------------------------------------------- | ||||
|   | ||||
| @@ -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; | ||||
| } | ||||
| @@ -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<Changeset> 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<Changeset> fetchChangesets() | ||||
|   { | ||||
|     List<Changeset> result = new ArrayList<Changeset>(); | ||||
|     SVNRepository repository = null; | ||||
|  | ||||
|     try | ||||
|     { | ||||
|       repository = | ||||
|         SVNRepositoryFactory.create(SVNURL.fromFile(repositoryDirectory)); | ||||
|  | ||||
|       Collection<SVNLogEntry> 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<Changeset> changesets; | ||||
|  | ||||
|   /** Field description */ | ||||
|   private File repositoryDirectory; | ||||
|  | ||||
|   /** Field description */ | ||||
|   private long revision; | ||||
| } | ||||
| @@ -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<String, SVNLogEntryPath> 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; | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -85,7 +85,7 @@ public class SvnRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase | ||||
|           File directory) | ||||
|   { | ||||
|     SvnRepositoryHandler handler = new SvnRepositoryHandler(factory, | ||||
|                                      new DefaultFileSystem()); | ||||
|                                      new DefaultFileSystem(), null); | ||||
|  | ||||
|     handler.init(contextProvider); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user