首页 > 其他分享 >SVNKit操作SVN

SVNKit操作SVN

时间:2022-12-22 15:35:27浏览次数:55  
标签:SVN svn String core org tmatesoft import 操作 SVNKit

系统集成SVN(SVNKit操作SVN)

网址:https://svnkit.com/documentation.html

文档:https://svnkit.com/javadoc/index.html

依赖以及介绍

​ JavaHLL API:本机Subversion包括可通过JavaHL接口-SVNClientInterface使用的JNI绑定。SVNKit使用SVNClientImpl类实现它,这样您就可以在运行时在JavaHL和SVNKit之间切换。

1、maven依赖:

<!-- https://mvnrepository.com/artifact/org.tmatesoft.svnkit/svnkit -->
<!-- 目前最新版本1.10.8,可使用1.10.X版本-->
<dependency>
    <groupId>org.tmatesoft.svnkit</groupId>
    <artifactId>svnkit</artifactId>
    <version>1.10.8</version>
</dependency>

2、API介绍

 High-Level API:主要使用SVNClientManager类来创建一些了的SVN*Client实现一系列对Working Copy的操作,比如创建一个SVNUpdateClient,可以执行checkout、update、switch、export等。

 Low-Level API:主要使用SVNRepository类与Repository仓库进行交互,支持的协议都是基于SVNRepositoryFactory抽象类的具体实现,协议和实现类的关系:(通过不同的类创建不同的上传协议)

protocol    SVNRepositoryFactory realization
svn://      SVNRepositoryFactoryImpl
http://     DAVRepositoryFactory
file:///    FSRepositoryFactory

开始使用SVNKit

使用High-Level API的操作步骤:

1、根据不同协议,初始化不同的仓库工厂。(工厂实现基于SVNRepositoryFactory抽象类)**

备注:一般性使用static void 方法进行初始化

//svn://,  svn+xxx:// (svn+ssh:// in particular)
SVNRepositoryFactoryImpl.setup();
//http://  and https://
DAVRepositoryFactory.setup();
//file:///
FSRepositoryFactory.setup();

2、创建一个驱动。(基于工厂),svnkit中repository所有的URL都基于SVNURL类生成,编码不是UTF-8的话,可以调用SVNURL的parseURIEncoded()方法。url可以是项目根目录、目录或文件。

SVNURL url = SVNURL.parseURIDecoded( "svn://host/path_to_repository_root/inner_path" );
SVNRepository repository = SVNRepositoryFactory.create( url, null );

这里的URL有两种表现形式:

①.不是以"/"开头,相对于驱动的绑定位置,即Repository的目录
②.以"/"开头,代表repository的根,相对于Repository的Root对应的目录

3、创建一个权限验证对象

SVN大多数操作都是具有权限访问控制的,大多数情况不支持匿名访问。

SVNKit使用ISVNAuthenticationManager接口来实现权限的控制。

SVNRepository repository=SVNRepositoryFactory.create(url);
ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(username, password);
repository.setAuthenticationManager(authManager);
DefaultSVNOptions options = SVNWCUtil.createDefaultOptions(true);
return SVNClientManager.newInstance(options, authManager);

代码实例

package com.xxx.patchgen.svn;
 
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
 
import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNNodeKind;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
import org.tmatesoft.svn.core.internal.wc.DefaultSVNOptions;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.core.wc.ISVNDiffStatusHandler;
import org.tmatesoft.svn.core.wc.ISVNOptions;
import org.tmatesoft.svn.core.wc.SVNClientManager;
import org.tmatesoft.svn.core.wc.SVNDiffClient;
import org.tmatesoft.svn.core.wc.SVNDiffStatus;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc.SVNStatusType;
import org.tmatesoft.svn.core.wc.SVNUpdateClient;
import org.tmatesoft.svn.core.wc.SVNWCClient;
import org.tmatesoft.svn.core.wc.SVNWCUtil;
 
public class SVNOperator {
	private String userName;
	private String passwd;
	private SVNClientManager ourClientManager;
	
	private SVNWCClient wcClient;
	private SVNDiffClient diffClient;
	private SVNUpdateClient updateClient;
	private List<SVNDiffStatus> changedFilePathsList = new ArrayList<SVNDiffStatus>();
	
	public SVNOperator(String userName, String passwd) {
		//setup
		DAVRepositoryFactory.setup();
		SVNRepositoryFactoryImpl.setup();
		FSRepositoryFactory.setup();
		//create clientManager
		ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
		ourClientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, userName, passwd);
		this.userName = userName;
		this.passwd = passwd;
		//generate client
		wcClient = ourClientManager.getWCClient();
		diffClient = ourClientManager.getDiffClient();
		updateClient = ourClientManager.getUpdateClient();
	}
 
	/**
	 * 获取指定版本的文件并转换为字符串
	 */
	public String getRevisionFileContent(String url,SVNRevision revision) throws Exception {
		SVNURL repositoryUrl = SVNURL.parseURIEncoded(url);
		OutputStream contentStream = new ByteArrayOutputStream();
		wcClient.doGetFileContents(repositoryUrl, SVNRevision.HEAD, revision, false, contentStream);
		return contentStream.toString();
	}
	/**
	 * 获取指定版本的文件
	 */
	public File getRevisionFile(String url,String version) throws Exception {
		SVNRevision revision = SVNRevision.create(Long.parseLong(version));
		File file = File.createTempFile("patch-", ".tmp");
		SVNURL repositoryUrl = SVNURL.parseURIEncoded(url);
		OutputStream contentStream = new FileOutputStream(file);
		wcClient.doGetFileContents(repositoryUrl, SVNRevision.HEAD, revision, false, contentStream);
		return file;
	}
 
	/**
	 * 获取版本间差异文件
	 */
	public void getDiffFiles(String url,String startVersion,String endVersion) throws Exception{
		changedFilePathsList.clear();
		SVNURL repositoryUrl = SVNURL.parseURIEncoded(url);
//		authentication(repositoryUrl);
		SVNRevision start = SVNRevision.create(Long.parseLong(startVersion));
		SVNRevision end = SVNRevision.create(Long.parseLong(endVersion));
		diffClient.doDiffStatus(repositoryUrl,start,repositoryUrl,end,SVNDepth.INFINITY,false,new ISVNDiffStatusHandler() {
			public void handleDiffStatus(SVNDiffStatus status) throws SVNException {
				if(status.getKind() == SVNNodeKind.FILE
						&& (status.getModificationType() == SVNStatusType.STATUS_ADDED
								|| status.getModificationType() == SVNStatusType.STATUS_MODIFIED)){
					changedFilePathsList.add(status);
					System.out.println(status.getPath());
				}
			}
		});
	}
	
	/**
	 * 导出指定版本间差异文件
	 */
	public void doExport(String endVersion,String exportDir) throws Exception{
		SVNRevision end = SVNRevision.create(Long.parseLong(endVersion));
		for(SVNDiffStatus status: changedFilePathsList){
			File destination = new File(exportDir + "/" +status.getPath());
			updateClient.doExport(status.getURL(), destination, end, end, null, true, SVNDepth.getInfinityOrEmptyDepth(true));
		}
	}
	
	
	/**
	 * 导出最新版本文件
	 */
	public void doExportHead(String url,String exportDir) throws Exception{
		SVNURL repositoryUrl = SVNURL.parseURIEncoded(url);
		updateClient.doExport(repositoryUrl, new File(exportDir), SVNRevision.HEAD, SVNRevision.HEAD, null, true, SVNDepth.getInfinityOrEmptyDepth(true));
	}
	
	/**
	 * 认证
	 */
	public void authentication(SVNURL url) throws Exception{
		ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(userName, passwd);
		SVNRepository repository = SVNRepositoryFactory.create(url);
		repository.setAuthenticationManager(authManager);
	}
	
}

备注:具体代码实例操作可查看官网。

High Level API:https://wiki.svnkit.com/Managing_A_Working_Copy

Low Level API:https://wiki.svnkit.com/Managing_Repository_With_SVNKit

标签:SVN,svn,String,core,org,tmatesoft,import,操作,SVNKit
From: https://www.cnblogs.com/chase-h/p/16998819.html

相关文章