zoukankan      html  css  js  c++  java
  • 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>
    

      

  • 相关阅读:
    $GLOBALS超级全局变量
    归来
    Mscorlib.dll 里的 System.Internal 类是干嘛的?
    Query Composition using Functional Programming Techniques in C# 3.0
    反射之人千万不能错过的 EmitHelper
    给自己的Blog程序添加对Windows Live Writer的支持
    WebService的应用之winform身份验证
    c# static 的全部用法收集整理
    ASP.NET设置网站图标
    C# 2.0 之 static class (转)
  • 原文地址:https://www.cnblogs.com/len0031/p/9039887.html
Copyright © 2011-2022 走看看