java操作svn工具类SvnUtil
直接上代码,工作中使用的版本,记录下。
public class SvnUtil { private static Logger logger = Logger.getLogger(SvnUtil.class); /** * 通过不同的协议初始化版本库 */ public static void setupLibrary() { DAVRepositoryFactory.setup(); SVNRepositoryFactoryImpl.setup(); FSRepositoryFactory.setup(); } /** * 验证登录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; } /** * Make directory in svn repository * @param clientManager * @param url * eg: http://svn.ambow.com/wlpt/bsp/trunk * @param commitMessage * @return * @throws SVNException */ 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; } /** * Imports an unversioned directory into a repository location denoted by a * destination URL * @param clientManager * @param localPath * a local unversioned directory or singal file that will be imported into a * repository; * @param dstURL * a repository location where the local unversioned directory/file will be * imported into * @param commitMessage * @param isRecursive 递归 * @return */ 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; } /** * Puts directories and files under version control * @param clientManager * SVNClientManager * @param wcPath * work copy path */ 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); } } /** * Collects status information on a single Working Copy item * @param clientManager * @param wcPath * local item's path * @param remote * true to check up the status of the item in the repository, * that will tell if the local item is out-of-date (like '-u' option in the SVN client's * 'svn status' command), otherwise false * @return * @throws SVNException */ 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; } /** * Commit work copy's change to svn * @param clientManager * @param wcPath * working copy paths which changes are to be committed * @param keepLocks * whether to unlock or not files in the repository * @param commitMessage * commit log message * @return * @throws SVNException */ 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; } /** * Updates a working copy (brings changes from the repository into the working copy). * @param clientManager * @param wcPath * working copy path * @param updateToRevision * revision to update to * @param depth * update的深度:目录、子目录、文件 * @return * @throws SVNException */ public static long update(SVNClientManager clientManager, File wcPath, SVNRevision updateToRevision, SVNDepth depth) { SVNUpdateClient updateClient = clientManager.getUpdateClient(); /* * sets externals not to be ignored during the update */ updateClient.setIgnoreExternals(false); /* * returns the number of the revision wcPath was updated to */ try { return updateClient.doUpdate(wcPath, updateToRevision,depth, false, false); } catch (SVNException e) { logger.error(e.getErrorMessage(), e); } return 0; } /** * recursively checks out a working copy from url into wcDir * @param clientManager * @param url * a repository location from where a Working Copy will be checked out * @param revision * the desired revision of the Working Copy to be checked out * @param destPath * the local path where the Working Copy will be placed * @param depth * checkout的深度,目录、子目录、文件 * @return * @throws SVNException */ public static long checkout(SVNClientManager clientManager, SVNURL url, SVNRevision revision, File destPath, SVNDepth depth) { SVNUpdateClient updateClient = clientManager.getUpdateClient(); /* * sets externals not to be ignored during the checkout */ updateClient.setIgnoreExternals(false); /* * returns the number of the revision at which the working copy is */ try { return updateClient.doCheckout(url, destPath, revision, revision,depth, false); } catch (SVNException e) { logger.error(e.getErrorMessage(), e); } return 0; } /** * 确定path是否是一个工作空间 * @param path * @return */ 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上是否存在 * @param url * @return */ 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); return nodeKind == SVNNodeKind.NONE ? false : true; } catch (SVNException e) { e.printStackTrace(); } return false; } public static SVNRepository getRepository(String url, String username, String password) { DAVRepositoryFactory.setup(); SVNRepositoryFactoryImpl.setup(); SVNRepository repository = null; SVNNodeKind nodeKind = null; try { repository = SVNRepositoryFactory.create(SVNURL.parseURIEncoded(url)); ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(username, password); repository.setAuthenticationManager(authManager); nodeKind = repository.checkPath("", -1); } catch (Exception e) { throw new RuntimeException(e); } if (nodeKind == SVNNodeKind.NONE) { throw new RuntimeException("There is no entry at '" + url + "'."); } else if (nodeKind == SVNNodeKind.FILE) { throw new RuntimeException("The entry at '" + url + "' is a file while a directory was expected."); } return repository; } }
使用示例:
public String Checkout(Model model) throws Exception { //初始化支持svn://协议的库。 必须先执行此操作。 SVNRepositoryFactoryImpl.setup(); //相关变量赋值 SVNURL repositoryURL = null; try { repositoryURL = SVNURL.parseURIEncoded(svnurl); } catch (Exception e) { // } String name = "test";//用户名 String password = "123456";//密码 ISVNOptions options = SVNWCUtil.createDefaultOptions(true); //实例化客户端管理类 ourClientManager = SVNClientManager.newInstance( (DefaultSVNOptions) options, name, password); //要把版本库的内容check out到的目录 File wcDir = new File(localurl); long workingVersion = -1; try { workingVersion = SvnUtil.checkout(ourClientManager, repositoryURL, SVNRevision.HEAD, wcDir, SVNDepth.INFINITY); } catch (Exception e) { e.printStackTrace(); } model.addAttribute("msg", "把版本:" + workingVersion + " check out 到目录:" + wcDir + "中。"); System.out.println("把版本:" + workingVersion + " check out 到目录:" + wcDir + "中。"); return "msg"; }
Maven:
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.7</version> </dependency> <dependency> <groupId>org.tmatesoft.svnkit</groupId> <artifactId>svnkit</artifactId> <version>1.8.2</version> </dependency>