最近在学习通过java代码来进行svn的二次开发,通过个人的研究和资料的查询,以及各位大神的指导,收获不少,现在分享一下。。。
svn主要是用于版本控制,开发者大多数都使用过svn工具,TortoiseSVN很多人都使用过,但是如果不是业务需求的话,我想很少有人会去研究它,我也是因为业务需要,所以才研究的。不多说,下面直接上代码:
这里面需要的jar包需要你们自己下载了,当然,如果你创建的是maven项目的话,直接引入相关依赖即可。
public class SVNUtil {
private static Logger logger = Logger.getLogger(SVNUtil.class);
/**
* 通过不同的协议初始化版本库
*/
public static void setupLibrary() {
DAVRepositoryFactory.setup();
SVNRepositoryFactoryImpl.setup();
FERepositoryFactory.setup();
}
/**
* 验证登录svn
* @Param: svnRoot:svn的根路径
*/
public static SVNClientManager authSvn(String svnRoot, String username, String password) {
// 初始化版本库
setupLibrary();
// 创建库连接
SVNRepository repository = null;
try {
repository = SVNRepositoryFactory.create(SVNURL.parseURIEncoded(svnRoot));
} catch (SVNException e) {
logger.error(e.getErrorMessage(),e);
return null;
}
// 身份验证
ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(username, password);
// 创建身份验证管理器
repository.setAuthenticationManager(authManager);
DefaultSVNOptions options = SVNWCUtil.createDefaultOptions(true);
SVNClientManager clientManager = SVNClientManager.newInstance(options, authManager);
return clientManager;
}
/**
* 创建文件夹
*/
public static SVNCommitInfo makeDirectory(SVNClientManager clientManager, SVNURL url, String commitMessage) {
try {
return clientManager.getCommitClient().doMkDir(new SVNURL[]{url}, commitMessage);
} catch (SVNException e) {
logger.error(e.getErrorMessage(), e);
}
return null;
}
/**
* 导入文件夹
* @Param localPath:本地路径
* @Param dstURL:目标地址
*/
public static SVNCommitInfo importDirectory(SVNClientManager clientManager, File localPath, SVNURL dstURL, String commitMessage, boolean isRecursive) {
try {
return clientManager.getCommitClient().doImport(localPath, dstURL, commitMessage, null, true, true, SVNDepth.fromRecurse(isRecursive));
} catch (SVNException e) {
logger.error(e.getErrorMessage(), e);
}
return null;
}
/**
* 添加入口
*/
public static void addEntry(SVNClientManager clientManager, File wcPath) {
try {
clientManager.getWCClient().doAdd(new File[]{wcPath}, true, false, false, SVNDepth.INFINITY, false, false, true);
} catch (SVNException e) {
logger.error(e.getErrorMessage(),e);
}
}
/**
* 显示状态
*/
public static SVNStatus showStatus(SVNClientManager clientManager, File wcPath, boolean remote) {
SVNStatus status = null;
try {
status = clientManager.getStatusClient().doStatus(wcPath, remote);
} catch (SVNException e) {
logger.error(e.getErrorMessage(), e);
}
return status;
}
/**
* 提交
* @Param keepLocks:是否保持锁定
*/
public static SVNCommitInfo commit(SVNClientManager clientManager, File wcPath, boolean keepLocks, String commitMessage) {
try {
return clientManager.getCommitClient().doCommit(new File[]{wcPath}, keepLocks, commitMessage, null, null, false, false, SVNDepth.INFINITY);
} catch (SVNException e) {
logger.error(e.getErrorMessage(), e);
}
return null;
}
/**
* 更新
*/
public static long update(SVNClientManager clientManager, File wcPath, SVNRevision updateToRevision, SVNDepth depth) {
SVNUpdateClient updateClient = clientManager.getUpdateClient();
updateClient.setIgnoreExternals(false);
try {
return updateClient.doUpdate(wcPath, updateToRevision, depth, false, false);
} catch (SVNException e) {
logger.error(e.getErrorMessage(), e);
}
return 0;
}
/**
* 从SVN导出项目到本地
* @Param url:SVN的url
* @Param revision:版本
* @Param destPath:目标路径
*/
public static long checkout(SVNClientManager clientManager, SVNURL url, SVNRevision revision, File destPath, SVNDepth depth) {
SVNUpdateClient updateClient = clientManager.getUpdateClient();
updateClient.setIgnoreExternals(false);
try {
return updateClient.doCheckout(url, destPath, revision, revision, depth, false);
} catch(SVNException e) {
logger.error(e.getErrorMessage(), e);
}
return 0;
}
/**
* 确定path是否是一个工作空间
*/
public static boolean isWorkingCopy(File path) {
if(!path.exists()) {
logger.warn("'" + path + "' not exist!");
return false;
}
try {
if(null == SVNWCUtil.getWorkingCopyRoot(path, false)) {
return false;
}
} catch (SVNException e) {
logger.error(e.getErrorMessage(), e);
}
return true;
}
/**
* 确定一个URL在SVN上是否存在
*/
public static boolean isURLExist(SVNURL url, String username, String password) {
try {
SVNRepository svnRepository = SVNRepositoryFactory.create(url);
ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(username, password);
svnRepository.setAuthenticationManager(authManager);
SVNNodeKind nodeKind = svnRepository.checkPath("", -1); //遍历SVN,获取结点。
return nodeKind == SVNNodeKind.NONE ? false : true;
} catch (SVNException e) {
logger.error(e.getErrorMessage(), e);
}
return false;
}
}
这是我最初始的代码,中间可能会有一点小问题,但是能研究到这种地步的人,那些问题都能轻而易举的解决。
最近又做了一个读取文件,并返回文件内容的功能,也一并附上下载地址,欢迎下载。