mirror of
				https://github.com/scm-manager/scm-manager.git
				synced 2025-10-31 10:35:56 +01:00 
			
		
		
		
	added diff support for subversion
This commit is contained in:
		| @@ -0,0 +1,142 @@ | ||||
| /** | ||||
|  * 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.SVNDepth; | ||||
| import org.tmatesoft.svn.core.SVNURL; | ||||
| import org.tmatesoft.svn.core.wc.SVNClientManager; | ||||
| import org.tmatesoft.svn.core.wc.SVNDiffClient; | ||||
| import org.tmatesoft.svn.core.wc.SVNRevision; | ||||
|  | ||||
| import sonia.scm.util.AssertUtil; | ||||
| import sonia.scm.util.Util; | ||||
|  | ||||
| //~--- JDK imports ------------------------------------------------------------ | ||||
|  | ||||
| import java.io.File; | ||||
| import java.io.IOException; | ||||
| import java.io.OutputStream; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @author Sebastian Sdorra | ||||
|  */ | ||||
| public class SvnDiffViewer implements DiffViewer | ||||
| { | ||||
|  | ||||
|   /** the logger for SvnDiffViewer */ | ||||
|   private static final Logger logger = | ||||
|     LoggerFactory.getLogger(SvnDiffViewer.class); | ||||
|  | ||||
|   //~--- constructors --------------------------------------------------------- | ||||
|  | ||||
|   /** | ||||
|    * Constructs ... | ||||
|    * | ||||
|    * | ||||
|    * @param directory | ||||
|    */ | ||||
|   public SvnDiffViewer(File directory) | ||||
|   { | ||||
|     this.directory = directory; | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Constructs ... | ||||
|    * | ||||
|    * | ||||
|    * @param handler | ||||
|    * @param repository | ||||
|    */ | ||||
|   public SvnDiffViewer(SvnRepositoryHandler handler, Repository repository) | ||||
|   { | ||||
|     this(handler.getDirectory(repository)); | ||||
|   } | ||||
|  | ||||
|   //~--- get methods ---------------------------------------------------------- | ||||
|  | ||||
|   /** | ||||
|    * Method description | ||||
|    * | ||||
|    * | ||||
|    * @param revision | ||||
|    * @param path | ||||
|    * @param output | ||||
|    * | ||||
|    * @throws IOException | ||||
|    * @throws RepositoryException | ||||
|    */ | ||||
|   @Override | ||||
|   public void getDiff(String revision, String path, OutputStream output) | ||||
|           throws IOException, RepositoryException | ||||
|   { | ||||
|     AssertUtil.assertIsNotEmpty(revision); | ||||
|     AssertUtil.assertIsNotNull(output); | ||||
|  | ||||
|     try | ||||
|     { | ||||
|  | ||||
|       // TODO add diff for single path | ||||
|       SVNURL svnurl = SVNURL.fromFile(directory); | ||||
|  | ||||
|       if (Util.isNotEmpty(path)) | ||||
|       { | ||||
|         svnurl = svnurl.appendPath(path, true); | ||||
|       } | ||||
|  | ||||
|       SVNClientManager clientManager = SVNClientManager.newInstance(); | ||||
|       SVNDiffClient diffClient = clientManager.getDiffClient(); | ||||
|       long currentRev = Long.parseLong(revision); | ||||
|  | ||||
|       diffClient.doDiff(svnurl, SVNRevision.HEAD, | ||||
|                         SVNRevision.create(currentRev), | ||||
|                         SVNRevision.create(currentRev - 1), SVNDepth.INFINITY, | ||||
|                         false, output); | ||||
|     } | ||||
|     catch (Exception ex) | ||||
|     { | ||||
|       logger.error("could not create blame view", ex); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   //~--- fields --------------------------------------------------------------- | ||||
|  | ||||
|   /** Field description */ | ||||
|   private File directory; | ||||
| } | ||||
| @@ -113,6 +113,37 @@ public class SvnRepositoryHandler | ||||
|  | ||||
|   //~--- get methods ---------------------------------------------------------- | ||||
|  | ||||
|   /** | ||||
|    * Method description | ||||
|    * | ||||
|    * | ||||
|    * @param repository | ||||
|    * | ||||
|    * @return | ||||
|    */ | ||||
|   @Override | ||||
|   public BlameViewer getBlameViewer(Repository repository) | ||||
|   { | ||||
|     SvnBlameViewer blameViewer = null; | ||||
|  | ||||
|     AssertUtil.assertIsNotNull(repository); | ||||
|  | ||||
|     String type = repository.getType(); | ||||
|  | ||||
|     AssertUtil.assertIsNotEmpty(type); | ||||
|  | ||||
|     if (TYPE_NAME.equals(type)) | ||||
|     { | ||||
|       blameViewer = new SvnBlameViewer(this, repository); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       throw new IllegalArgumentException("svn repository is required"); | ||||
|     } | ||||
|  | ||||
|     return blameViewer; | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Method description | ||||
|    * | ||||
| @@ -138,35 +169,44 @@ public class SvnRepositoryHandler | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       throw new IllegalArgumentException("mercurial repository is required"); | ||||
|       throw new IllegalArgumentException("svn repository is required"); | ||||
|     } | ||||
|  | ||||
|     return changesetViewer; | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Method description | ||||
|    * | ||||
|    * | ||||
|    * @param repository | ||||
|    * | ||||
|    * @return | ||||
|    */ | ||||
|   @Override | ||||
|   public BlameViewer getBlameViewer(Repository repository) { | ||||
|   	SvnBlameViewer blameViewer = null; | ||||
|   public DiffViewer getDiffViewer(Repository repository) | ||||
|   { | ||||
|     SvnDiffViewer diffViewer = null; | ||||
|  | ||||
|   	AssertUtil.assertIsNotNull(repository); | ||||
|     AssertUtil.assertIsNotNull(repository); | ||||
|  | ||||
|   	String type = repository.getType(); | ||||
|     String type = repository.getType(); | ||||
|  | ||||
|   	AssertUtil.assertIsNotEmpty(type); | ||||
|     AssertUtil.assertIsNotEmpty(type); | ||||
|  | ||||
|   	if (TYPE_NAME.equals(type)) | ||||
|   	{ | ||||
|   		blameViewer = new SvnBlameViewer(this, repository); | ||||
|   	} | ||||
|   	else | ||||
|   	{ | ||||
|   		throw new IllegalArgumentException("svn repository is required"); | ||||
|   	} | ||||
|     if (TYPE_NAME.equals(type)) | ||||
|     { | ||||
|       diffViewer = new SvnDiffViewer(this, repository); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       throw new IllegalArgumentException("svn repository is required"); | ||||
|     } | ||||
|  | ||||
|   	return blameViewer; | ||||
|     return diffViewer; | ||||
|   } | ||||
|  | ||||
| 	/** | ||||
|   /** | ||||
|    * Method description | ||||
|    * | ||||
|    * | ||||
|   | ||||
		Reference in New Issue
	
	Block a user