zoukankan      html  css  js  c++  java
  • java操作svn【svnkit】实操

    SVNKit中怎样使用不同的仓库访问协议? 

           当你下载了最新版的SVNKit二进制文件并且准备使用它时,一个问题出现了,要创建一个库需要做哪些初始化的步骤?直接与Subversion仓库交互已经在低级层API中实现,主要的仓库访问驱动的接口就是SVNRepository抽象类。这个驱动实现了一些协议,一个协议一个实现。每个驱动由一个抽象工厂类-SVNRepositoryFactory 创建,抽象工厂类也有每一种协议的实现。下面的表格将一种协议和工厂类的实现类一一对应:

    svn://(svns://)

    SVNRepositoryFactoryImpl

    http://(https://)

    DAVRepositoryFactory

    file:///

    FSRepositoryFactory

    SVNKit初始化的操作

           在使用SVNKit库前,你必须为某一特定的协议创建一个合适的SVNRepositryFactory对象。例如,如果你想使用 svn:// 协议来和仓库交互,你必须注册一下SVNRepositoryFactoryImpl工厂:

    [java] view plain copy
     
    1. try {  
    2.     SVNRepositoryFactoryImpl.setup();  
    3.     ...  
    4. catch (SVNException e) {  
    5.     //handle exception  
    6. }  

            这一步之后,由于SVNKit包含了注册的工厂对象,SVNRepositoryFactory知道了怎样给svn:// 协议创建SVNRepository驱动。接下来你就可以为它创建一个驱动了:

    [java] view plain copy
     
    1. try {  
    2.     ...  
    3.     SVNURL url = SVNURL.parseURIDecoded( "svn://host/path_to_repository_root/inner_path" );  
    4.     SVNRepository repository = SVNRepositoryFactory.create( url, null );  
    5.     ...  
    6.     } catch ( SVNException e ) {  
    7.     //handle exception  
    8. }  

            SVNKit中,所有的仓库urlSVNURL类来表示,如果一个路径字符串不是UTF-8编码的,可以使用SVNURLparseURIDecoded()方法来创建一个新的url(如果需要编码,它会重新编码)。然后你可以通过这个url来在SVNRepositoryFactory中创建一个新的SVNRepository驱动。这样,你可以绑定驱动到任何一个你想访问的仓库地址。

    使用高级层API

           当你使用SVNKit管理工作拷贝时,由于高级层API使用低级层API来与仓库交互,你也需要创建合适的工厂类,如果你遗漏了这一初始化步骤,可能会抛出一个SVNKit不能给提供的url创建SVNRepository对象的异常。

        当然就想我们使用其他svn客户端或者是svn插件一样。我们对Repository进行操作的时候是需要身份验证的,使用SVNKit也是一样。我们需要提供身份信息:

    [java] view plain copy
     
    1. <span style="white-space:pre">    </span>/* 
    2.          * 对版本库设置认证信息。 
    3.          */  
    4.         ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(name, password);  
    5.         repository.setAuthenticationManager(authManager);  

    实现DisplayFile:

    [java] view plain copy
     
    1. <span style="font-size:18px;">import java.io.ByteArrayOutputStream;  
    2. import java.io.IOException;  
    3. import java.util.ArrayList;  
    4. import java.util.Iterator;  
    5. import java.util.List;  
    6.   
    7. import org.tmatesoft.svn.core.SVNException;  
    8. import org.tmatesoft.svn.core.SVNLogEntry;  
    9. import org.tmatesoft.svn.core.SVNNodeKind;  
    10. import org.tmatesoft.svn.core.SVNProperties;  
    11. import org.tmatesoft.svn.core.SVNProperty;  
    12. import org.tmatesoft.svn.core.SVNURL;  
    13. import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;  
    14. import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;  
    15. import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory;  
    16. import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;  
    17. import org.tmatesoft.svn.core.io.SVNRepository;  
    18. import org.tmatesoft.svn.core.io.SVNRepositoryFactory;  
    19. import org.tmatesoft.svn.core.wc.SVNWCUtil;  
    20.   
    21. public class DisplayFile {  
    22.   
    23.     /** 
    24.      * @param args 
    25.      */  
    26.     public static void main(String[] args) {  
    27.         //初始化库。 必须先执行此操作。具体操作封装在setupLibrary方法中。  
    28.         setupLibrary();  
    29.          
    30.         /* 
    31.          * 相关变量赋值 
    32.          */  
    33.         String url = "https://hy/svn/svnkittest/branches";  
    34.         String name = "hanyi";  
    35.         String password = "hanyi";  
    36.         String filePath = "doImport.txt";  
    37.         //定义svn版本库的URL。  
    38.         SVNURL repositoryURL = null;  
    39.         //定义版本库。  
    40.         SVNRepository repository = null;  
    41.         try {  
    42.             //获取SVN的URL。  
    43.             repositoryURL=SVNURL.parseURIEncoded(url);  
    44.             //根据URL实例化SVN版本库。  
    45.             repository = SVNRepositoryFactory.create(repositoryURL);  
    46.         } catch (SVNException svne) {  
    47.             /* 
    48.              * 打印版本库实例创建失败的异常。 
    49.              */  
    50.             System.err  
    51.                     .println("创建版本库实例时失败,版本库的URL是 '"  
    52.                             + url + "': " + svne.getMessage());  
    53.             System.exit(1);  
    54.         }  
    55.   
    56.         /* 
    57.          * 对版本库设置认证信息。 
    58.          */  
    59.         ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(name, password);  
    60.         repository.setAuthenticationManager(authManager);  
    61.   
    62.         //此变量用来存放要查看的文件的属性名/属性值列表。  
    63.         SVNProperties fileProperties = new SVNProperties();  
    64.         //此输出流用来存放要查看的文件的内容。  
    65.         ByteArrayOutputStream baos = new ByteArrayOutputStream();  
    66.   
    67.         try {  
    68.             //获得版本库中文件的类型状态(是否存在、是目录还是文件),参数-1表示是版本库中的最新版本。  
    69.             SVNNodeKind nodeKind = repository.checkPath(filePath, -1);  
    70.               
    71.             if (nodeKind == SVNNodeKind.NONE) {  
    72.                 System.err.println("要查看的文件在 '" + url + "'中不存在.");  
    73.                 System.exit(1);  
    74.             } else if (nodeKind == SVNNodeKind.DIR) {  
    75.                 System.err.println("要查看对应版本的条目在 '" + url  
    76.                         + "'中是一个目录.");  
    77.                 System.exit(1);  
    78.             }  
    79.             //获取要查看文件的内容和属性,结果保存在baos和fileProperties变量中。  
    80.             repository.getFile(filePath, -1, fileProperties, baos);  
    81.               
    82.         } catch (SVNException svne) {  
    83.             System.err.println("在获取文件内容和属性时发生错误: " + svne.getMessage());  
    84.             System.exit(1);  
    85.         }  
    86.   
    87.         //获取文件的mime-type  
    88.         String mimeType = fileProperties.getStringValue(SVNProperty.MIME_TYPE);  
    89.         //判断此文件是否是文本文件          
    90.         boolean isTextType = SVNProperty.isTextMimeType(mimeType);  
    91.         /* 
    92.          * 显示文件的所有属性 
    93.          */  
    94.         Iterator iterator = fileProperties.nameSet().iterator();  
    95.         while (iterator.hasNext()) {  
    96.             String propertyName = (String) iterator.next();  
    97.             String propertyValue = fileProperties.getStringValue(propertyName);  
    98.             System.out.println("文件的属性: " + propertyName + "="  
    99.                     + propertyValue);  
    100.         }  
    101.         /* 
    102.          * 如果文件是文本类型,则把文件的内容显示到控制台。 
    103.          */  
    104.         if (isTextType) {  
    105.             System.out.println("File contents:");  
    106.             System.out.println();  
    107.             try {  
    108.                 baos.writeTo(System.out);  
    109.             } catch (IOException ioe) {  
    110.                 ioe.printStackTrace();  
    111.             }  
    112.         } else {  
    113.             System.out  
    114.                     .println("因为文件不是文本文件,无法显示!");  
    115.         }  
    116.         System.out.println("");  
    117.         /* 
    118.          * 获得版本库的最新版本号。 
    119.          */  
    120.         long latestRevision = -1;  
    121.         try {  
    122.             latestRevision = repository.getLatestRevision();  
    123.               
    124.             List<SVNLogEntry> entries = new ArrayList<SVNLogEntry>();  
    125.             try  
    126.             {  
    127.                 repository.log(new String[]{""},//为过滤的文件路径前缀,为空表示不进行过滤  
    128.                         entries,  
    129.                         -1,//-1代表最新的版本号,初始版本号为0  
    130.                         -1,  
    131.                         true,  
    132.                         true);  
    133.             }  
    134.             catch (SVNException e)  
    135.             {  
    136.                 e.printStackTrace();  
    137.             }  
    138.             System.out.println("当前log信息数量:"+entries.size());  
    139.             String message=entries.get(0).getMessage().toString();  
    140.             System.out.println("提交的message信息:"+message);  
    141.               
    142.             
    143.         } catch (SVNException svne) {  
    144.             System.err.println("获取最新版本号时出错: " + svne.getMessage());  
    145.             System.exit(1);  
    146.         }  
    147.         System.out.println("");  
    148.         System.out.println("---------------------------------------------");  
    149.         System.out.println("版本库的最新版本号: " + latestRevision);  
    150.         System.exit(0);  
    151.   
    152.     }  
    153.     /* 
    154.      * 初始化库 
    155.      */  
    156.     private static void setupLibrary() {  
    157.         /* 
    158.          * For using over http:// and https:// 
    159.          */  
    160.         DAVRepositoryFactory.setup();  
    161.         /* 
    162.          * For using over svn:// and svn+xxx:// 
    163.          */  
    164.         SVNRepositoryFactoryImpl.setup();  
    165.           
    166.         /* 
    167.          * For using over file:/// 
    168.          */  
    169.         FSRepositoryFactory.setup();  
    170.     }  
    171. }</span><span style="font-weight: bold; font-size: 16pt;">  
    172. </span>  

    打印的结果:

    文件的属性: svn:entry:uuid=bf3500c6-b8a2-f84e-86b3-86d6154c1411
    文件的属性: svn:entry:revision=2
    文件的属性: svn:entry:committed-date=2015-04-29T15:53:24.910060Z
    文件的属性: svn:wc:ra_dav:version-url=/svn/svnkittest/!svn/ver/2/branches/doImport.txt
    文件的属性: svn:entry:checksum=1a3f6dc35be7edaba541a5a5053a2e03
    文件的属性: svn:entry:committed-rev=2
    文件的属性: svn:entry:last-author=hanyi
    File contents:

    hello the first svnkit demo
    当前log信息数量:1
    提交的message信息:韩义:svnkit demo test
    ---------------------------------------------
    版本库的最新版本号: 2

     


    实现DisplayRepositoryTree:

    [java] view plain copy
     
    1. import java.util.Collection;  
    2. import java.util.Iterator;  
    3.   
    4. import org.tmatesoft.svn.core.SVNDirEntry;  
    5. import org.tmatesoft.svn.core.SVNException;  
    6. import org.tmatesoft.svn.core.SVNNodeKind;  
    7. import org.tmatesoft.svn.core.SVNURL;  
    8. import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;  
    9. import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;  
    10. import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;  
    11. import org.tmatesoft.svn.core.io.SVNRepository;  
    12. import org.tmatesoft.svn.core.io.SVNRepositoryFactory;  
    13. import org.tmatesoft.svn.core.wc.SVNWCUtil;  
    14.   
    15. public class DisplayRepositoryTree {  
    16.   
    17.     /** 
    18.      * @param args 
    19.      */  
    20.     public static void main(String[] args) {  
    21.         /* 
    22.          * For using over http:// and https:// 
    23.          */  
    24.         DAVRepositoryFactory.setup();  
    25.           
    26.         /* 
    27.          * 相关变量赋值 
    28.          */  
    29.         String url = "https://hy/svn/svnkittest";  
    30.         String name = "hanyi";  
    31.         String password = "hanyi";  
    32.         //定义svn版本库的URL。  
    33.         SVNURL repositoryURL = null;  
    34.         //定义版本库。  
    35.         SVNRepository repository = null;  
    36.         /* 
    37.          * 实例化版本库类 
    38.          * */  
    39.         try {  
    40.             //获取SVN的URL。  
    41.             repositoryURL=SVNURL.parseURIEncoded(url);  
    42.             //根据URL实例化SVN版本库。  
    43.             repository = SVNRepositoryFactory.create(repositoryURL);  
    44.         } catch (SVNException svne) {  
    45.             /* 
    46.              * 打印版本库实例创建失败的异常。 
    47.              */  
    48.             System.err  
    49.                     .println("创建版本库实例时失败,版本库的URL是 '"  
    50.                             + url + "': " + svne.getMessage());  
    51.             System.exit(1);  
    52.         }  
    53.   
    54.         /* 
    55.          * 对版本库设置认证信息。 
    56.          */  
    57.         ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(name, password);  
    58.         repository.setAuthenticationManager(authManager);  
    59.   
    60.         /* 
    61.          * 上面的代码基本上是固定的操作。 
    62.          * 下面的部分根据任务不同,执行不同的操作。 
    63.          * */  
    64.         try {  
    65.             //打印版本库的根  
    66.             System.out.println("Repository Root: " + repository.getRepositoryRoot(true));  
    67.             //打印出版本库的UUID  
    68.             System.out.println("Repository UUID: " + repository.getRepositoryUUID(true));  
    69.             System.out.println("");  
    70.             //打印版本库的目录树结构  
    71.             listEntries(repository, "");  
    72.         } catch (SVNException svne) {  
    73.             System.err.println("打印版本树时发生错误: "  
    74.                     + svne.getMessage());  
    75.             System.exit(1);  
    76.         }  
    77.         /* 
    78.          * 获得版本库的最新版本树 
    79.          */  
    80.         long latestRevision = -1;  
    81.         try {  
    82.             latestRevision = repository.getLatestRevision();  
    83.         } catch (SVNException svne) {  
    84.             System.err  
    85.                     .println("获取最新版本号时出错: "  
    86.                             + svne.getMessage());  
    87.             System.exit(1);  
    88.         }  
    89.         System.out.println("");  
    90.         System.out.println("---------------------------------------------");  
    91.         System.out.println("版本库的最新版本是: " + latestRevision);  
    92.         System.exit(0);  
    93.   
    94.     }  
    95.     /* 
    96.      * 此函数递归的获取版本库中某一目录下的所有条目。 
    97.      */  
    98.     public static void listEntries(SVNRepository repository, String path)  
    99.             throws SVNException {  
    100.         //获取版本库的path目录下的所有条目。参数-1表示是最新版本。  
    101.         Collection entries = repository.getDir(path, -1, null,  
    102.                 (Collection) null);  
    103.         Iterator iterator = entries.iterator();  
    104.         while (iterator.hasNext()) {  
    105.             SVNDirEntry entry = (SVNDirEntry) iterator.next();  
    106.             System.out.println("/" + (path.equals("") ? "" : path + "/")  
    107.                     + entry.getName() + " (author: '" + entry.getAuthor()  
    108.                     + "'; revision: " + entry.getRevision() + "; date: " + entry.getDate() + ")");  
    109.             /* 
    110.              * 检查此条目是否为目录,如果为目录递归执行 
    111.              */  
    112.             if (entry.getKind() == SVNNodeKind.DIR) {  
    113.                 listEntries(repository, (path.equals("")) ? entry.getName()  
    114.                         : path + "/" + entry.getName());  
    115.             }  
    116.         }  
    117.     }  
    118.   
    119. }  

    打印的结果:

    Repository Root: https://hy/svn/svnkittest
    Repository UUID: bf3500c6-b8a2-f84e-86b3-86d6154c1411
    /branches (author: 'hanyi'; revision: 2; date: Wed Apr 29 23:53:24 CST 2015)
    /branches/doImport.txt (author: 'hanyi'; revision: 2; date: Wed Apr 29 23:53:24 CST 2015)
    /tags (author: 'VisualSVN Server'; revision: 1; date: Wed Apr 29 14:14:01 CST 2015)
    /trunk (author: 'VisualSVN Server'; revision: 1; date: Wed Apr 29 14:14:01 CST 2015)
    ---------------------------------------------
    版本库的最新版本是: 2

        其他的操作包括CheckOut,DoCommit,DoDiff,DoImport,DoUpdate我就不一一的写出了。上传一个包含所有操作的小例子,方便大家在以后的工作中学习使用:SVNKitTest(猛戳这里)

    总结:

        在学习SVNKit的过程中让我想起了我使用过的一些成型的产品,包括fisheyeJenkins他们的底层与svn的集成或许就是通过SVNKit来实现的。或者是类似的产品实现的。对于我们更好的理解这些工具的使用提供了很大的帮助。

     

  • 相关阅读:
    拦截器
    git和bootstrap
    java面试题目
    Struts2笔记
    sql语句的面试题
    公司面试总结
    面试题12 包含 min 函数的栈 【栈】
    面试题11 字符串的排列[算法]
    [面试] 进程和线程的区别(面试题)
    [baidu] 面向对象的三个基本要素和五项基本设计原则
  • 原文地址:https://www.cnblogs.com/firstdream/p/8439287.html
Copyright © 2011-2022 走看看