本篇内容是基于SVNKit High-Level API实现的针对Working copy的操作,操作内容与SVN图形化界面、命令行类似。

High-Level API类图:

核心思想:

 所有操作由各种SVN*Client来管理,而SVNClientManager类封装了所有的SVN*Client,所以我们通常有两种做法(更倾向于后一种):

  1. 1.可以分别实例化各种SVN*Client类。2.实例化一个SVNClientManager类,实际上在首次请求SVNClient类的时候,它就已经实例化了每个SVN*Client类了。

示例编码:

  1. package com.demo;
  2.  
  3. import com.google.gson.Gson;
  4. import org.tmatesoft.svn.core.*;
  5. import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
  6. import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
  7. import org.tmatesoft.svn.core.wc.*;
  8. import java.io.File;
  9.  
  10. /**
  11. * 使用Hign-Level API来操作Working Copy,由于所有的操作比较贴近SVN命令行、客户端的操作,所以理解起来相对容易一些。
  12. * 对于Working Copy的不同操作被分类封装到不同的SVN*Client中,SVNClientManager类包含这些SVN*Client,所以通常使用SVNClientManager类可以很方便的管理这些SVN*Client
  13. * 所以我们在操作Working Copy时有两种选择:1.可以分别实例化各种SVN*Client类。2.实例化一个SVNClientManager类,实际上在首次请求SVNClient类的时候,它就已经实例化了每个SVN*Client类了。
  14. * 具体结构详见类图
  15. */
  16. public class ManageWorkingCopy {
  17. private static SVNClientManager svnClientManager;
  18. private static final Gson gson = new Gson();
  19.  
  20. public static void main(String[] args) throws Exception{
  21. //1.根据访问协议初始化工厂
  22. DAVRepositoryFactory.setup();
  23. //2.使用默认选项
  24. ISVNOptions isvnOptions = SVNWCUtil.createDefaultOptions(true);
  25. //3.初始化权限
  26. String username = "wly";
  27. String password = "wly";
  28. char[] pwd = password.toCharArray();
  29. ISVNAuthenticationManager isvnAuthenticationManager = SVNWCUtil.createDefaultAuthenticationManager(username,pwd);
  30. //4.创建SVNClientManager的实例
  31. svnClientManager = SVNClientManager.newInstance(isvnOptions,isvnAuthenticationManager);
  32. //=========================================demo start=======================================
  33. //1.导入-import
  34. // doImport();
  35. //2.检出-checkout
  36. // doCheckout();
  37. //3.创建目录-mkdir
  38. // doMkDir();
  39. //4.提交-commit
  40. // doCommit();
  41. //5.更新-update
  42. // doUpdate();
  43. //6.切换分支-switch
  44. //7.添加-add,在commit中有体现,提交前,没有加入版本控制的文件需要加入版本控制
  45. //8.锁定-lock
  46. // doLock();
  47. //9.删除-delete
  48. // doDelete();
  49. //10.拷贝-copy
  50. // doCopy();
  51. //11.状态-status
  52. // doStatus();
  53. //12.信息-info
  54. // doInfo();
  55. }
  56.  
  57. /*
  58. * 导入-import
  59. * @throws SVNException
  60. */
  61. private static void doImport() throws SVNException{
  62. SVNProperties svnProperties = new SVNProperties();
  63. boolean useGlobalIgnores = true;
  64. boolean ignoreUnknownNodeTypes = true;
  65. SVNCommitInfo svnCommitInfo = svnClientManager.getCommitClient().doImport(new File("E:\\svnWorkspace\\commonProject"),SVNURL.parseURIEncoded("https://wlyfree-PC:8443/svn/testRepository/trunk"),"初始化导入",svnProperties,useGlobalIgnores,ignoreUnknownNodeTypes,SVNDepth.INFINITY);
  66. System.out.println("执行import操作成功,导入结果:" + gson.toJson(svnCommitInfo));
  67. }
  68.  
  69. /**
  70. * 检出-checkout
  71. * 参数:
  72. * 仓库地址
  73. * 本地Working Copy地址
  74. * Peg Revision
  75. * Revision
  76. * 检出深度,一般递归检出
  77. * 是否允许没有版本的障碍物,true的话允许,false不允许,false在checkout的时候如果有障碍物就会停止检出,所以一般是true
  78. * 返回值:long 当前版本号
  79. * @throws SVNException
  80. */
  81. private static void doCheckout() throws SVNException{
  82. long nowRevision = svnClientManager.getUpdateClient().doCheckout(SVNURL.parseURIEncoded("https://wlyfree-PC:8443/svn/testRepository/trunk"),new File("E:\\svnWorkspace\\projectWorkingCopy"), SVNRevision.HEAD,SVNRevision.HEAD,SVNDepth.INFINITY,true);
  83. System.out.println("执行checkout操作成功,当前检出的版本号是:" + nowRevision);
  84. }
  85.  
  86. /**
  87. * 创建目录-mkdir
  88. * @throws SVNException
  89. */
  90. private static void doMkDir() throws SVNException{
  91. String commitMessage = "创建一个目录";
  92. SVNCommitInfo svnCommitInfo = svnClientManager.getCommitClient().doMkDir(new SVNURL[]{SVNURL.parseURIEncoded("https://wlyfree-PC:8443/svn/testRepository/trunk/aaa"),SVNURL.parseURIEncoded("https://wlyfree-PC:8443/svn/testRepository/trunk/bbb")},commitMessage);
  93. System.out.println("执行mkdir操作成功,操作结果:" + gson.toJson(svnCommitInfo));
  94. }
  95.  
  96. /**
  97. * 提交-commit
  98. * commit更改一个文件时,如果文件本身存在,则需要提交其父目录
  99. * @throws SVNException
  100. */
  101. private static void doCommit() throws SVNException{
  102. File[] files = new File[]{new File("E:\\svnWorkspace\\projectWorkingCopy"),new File("E:\\svnWorkspace\\projectWorkingCopy\\ccc")};
  103. //没有版本号的先执行add操作
  104. for(File tempFile : files){
  105. SVNStatus status = svnClientManager.getStatusClient().doStatus(tempFile,true);
  106. System.err.println(status);
  107. if(status == null || status.getContentsStatus() == SVNStatusType.STATUS_UNVERSIONED) {
  108. System.out.println("文件" + tempFile.getName() + "无版本号");
  109. svnClientManager.getWCClient().doAdd(tempFile, false, false, false, SVNDepth.INFINITY, false, false);
  110. }
  111. }
  112. //执行commit操作
  113. svnClientManager.getCommitClient().setIgnoreExternals(false);
  114. SVNProperties svnProperties = new SVNProperties();
  115. String[] changeLists = new String[]{};
  116. SVNCommitInfo svnCommitInfo = svnClientManager.getCommitClient().doCommit(files,false,"提交操作",svnProperties,changeLists,false,false,SVNDepth.fromRecurse(true));
  117. System.out.println("执行commit操作成功,操作结果:" + gson.toJson(svnCommitInfo));
  118. }
  119.  
  120. /**
  121. * 更新-update
  122. * @throws SVNException
  123. */
  124. private static void doUpdate() throws SVNException{
  125. long nowRevision = svnClientManager.getUpdateClient().doUpdate(new File("E:\\svnWorkspace\\projectWorkingCopy"),SVNRevision.HEAD, SVNDepth.INFINITY,true,false);
  126. System.out.println("执行update操作成功,当前版本号:" + nowRevision);
  127. }
  128.  
  129. /**
  130. * 锁定-lock
  131. * @throws SVNException
  132. */
  133. private static void doLock() throws SVNException{
  134. // svnClientManager.getWCClient().doLock(new SVNURL[]{SVNURL.parseURIEncoded("https://wlyfree-PC:8443/svn/testRepository/trunk/bbb/aa.txt")},true,"给文件加锁");
  135. svnClientManager.getWCClient().doLock(new File[]{new File("E:\\svnWorkspace\\projectWorkingCopy\\bbb\\aa.txt")},true,"给文件加锁");
  136. System.out.println("给文件加锁成功");
  137. }
  138.  
  139. /**
  140. * 删除-delete
  141. * @throws SVNException
  142. */
  143. private static void doDelete() throws SVNException{
  144. SVNCommitInfo svnCommitInfo = svnClientManager.getCommitClient().doDelete(new SVNURL[]{SVNURL.parseURIEncoded("https://wlyfree-PC:8443/svn/testRepository/trunk/bbb"),SVNURL.parseURIEncoded("https://wlyfree-PC:8443/svn/testRepository/trunk/b.txt")},"执行删除操作,删除一个目录bbb一个文件b.txt");
  145. System.out.println("执行delete操作成功,操作结果:" + gson.toJson(svnCommitInfo));
  146. }
  147.  
  148. /**
  149. * 复制-copy
  150. * @throws SVNException
  151. */
  152. private static void doCopy() throws SVNException{
  153. SVNCopySource svnCopySource1 = new SVNCopySource(SVNRevision.HEAD,SVNRevision.HEAD,SVNURL.parseURIEncoded("https://wlyfree-PC:8443/svn/testRepository/trunk/aaa/aa.txt"));
  154. SVNCopySource svnCopySource2 = new SVNCopySource(SVNRevision.HEAD,SVNRevision.HEAD,SVNURL.parseURIEncoded("https://wlyfree-PC:8443/svn/testRepository/trunk/aaa/bb.txt"));
  155. svnClientManager.getCopyClient().doCopy(new SVNCopySource[]{svnCopySource1,svnCopySource2},new File("E:\\svnWorkspace\\projectWorkingCopy\\bbb"),false,false,true);
  156. System.out.println("执行copy操作成功");
  157. }
  158.  
  159. /**
  160. * 状态-status
  161. * @throws SVNException
  162. */
  163. private static void doStatus() throws SVNException{
  164. SVNStatus svnStatus = svnClientManager.getStatusClient().doStatus(new File("E:\\svnWorkspace\\projectWorkingCopy\\a.txt"),true);
  165. System.out.println("执行status操作成功,操作结果:" + gson.toJson(svnStatus));
  166. }
  167.  
  168. /**
  169. * 信息-info
  170. * @throws SVNException
  171. */
  172. private static void doInfo() throws SVNException{
  173. SVNInfo svnInfo = svnClientManager.getWCClient().doInfo(new File("E:\\svnWorkspace\\projectWorkingCopy\\a.txt"),SVNRevision.HEAD);
  174. System.out.println("执行info操作成功,操作结果:" + gson.toJson(svnInfo));
  175. }
  176. }

SVNKit学习——使用High-Level API管理Working Copy示例(六)的更多相关文章

  1. SVNKit学习——使用低级别的API(ISVNEditor接口)直接操作Repository的目录和文件(五)

      本文是参考官方文档的实现,官方wiki:https://wiki.svnkit.com/Committing_To_A_Repository 本文核心使用的是ISVNEditor这个接口直接对Re ...

  2. FREE 开源 API 管理工具等

    最近学习API 管理工具,发现几个不错的东西,记录如下: 1.IBM 收购NODE 厂家  STRONGLOOP 有一产品LOOPBACK,开源,好! 2.apigee  api管理平台 也不错. 3 ...

  3. Api管理工具(spring-rest-docs)

    对于app开发来说,必须需要有相应的api文档,一般最基础的就是用markdown工具来撰写api文档.当对于开发人员来说,是总会想着寻找更方便撰写,测试,对接前端开发的文档生成的工具. 其实这方面的 ...

  4. ecCodes 学习 利用ecCodes Python API对GRIB文件进行读写

    参考 https://www.ecmwf.int/assets/elearning/eccodes/eccodes2/story_html5.htmlhttps://confluence.ecmwf. ...

  5. 基于SpringCloud的Microservices架构实战案例-在线API管理

    simplemall项目前几篇回顾: 1基于SpringCloud的Microservices架构实战案例-序篇 2基于SpringCloud的Microservices架构实战案例-架构拆解 3基于 ...

  6. API管理之YApi实现前后端高度分离

    全手打原创,转载请标明出处:https://www.cnblogs.com/dreamsqin/p/11972789.html,多谢,=.=~ 背景描述   前后端分离已成为互联网项目开发的业界标准使 ...

  7. Jetpack架构组件学习(3)——Activity Results API使用

    原文地址:Jetpack架构组件学习(3)--Activity Results API使用 - Stars-One的杂货小窝 技术与时俱进,页面跳转传值一直使用的是startActivityForRe ...

  8. API管理之利剑 -- Eolink

    随着信息化飞速增长的还有各信息系统中的应用接口( API ),API 作为信息系统内部及不同信息系统之间进行数据传输的渠道,其数量随着软件系统的不断庞大而呈指数型增长,如何管理这些 API 已经在业界 ...

  9. 论元数据和API管理工具

    公司里面的很多部门都在广泛的采用元数据管理,也采用了公司内部开发的元数据管理工具,有些部门的实施效果一直非常好,而有些部门的效果则差强人意.这个问题,其实和软件系统开发完成进入维护阶段后成本居高不下的 ...

随机推荐

  1. Mac下安装配置Python2和Python3并相互切换使用 转

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u014259820/article/details/81023224 安装Python2 Mac系统 ...

  2. Idea 软件使用快捷键归纳

    <1>CTRL+P   方法参数提示 <2>ctrl+/ 单行注释 <3>Ctrl+Alt+M  IDEA 重复代码快速重构(抽取重复代码快捷键) <4> ...

  3. BZOJ - 3489 KD树 范围计数 空间思维转换

    题意:给定数列\(a[1...n]\),\(Q\)次查询\([L,R]\)中只出现一次的最大值 这道题的做法比较劲.. 对每个元素构造三维空间的点\((i,pre[i],next[i])\),查询\( ...

  4. Python——爬取瓜子二手车

    # coding:utf8 # author:Jery # datetime:2019/5/1 5:16 # software:PyCharm # function:爬取瓜子二手车 import re ...

  5. Git本地缓存问题 修改密码后git无法拉取

    问题描述:使用正确的用户名和密码可以登录到Git代码仓库,但是在本地无法使用Git bash命令行的方式拉取代码. 问题原因:第一次使用Git bash方式拉取代码时,会根据当前的用户和密码生成一串. ...

  6. esper(4-3)-Non-Overlapping Context

    语法 create context context_name start start_condition end end_condition 如: // 9点到17点此context才可用(以引擎的时 ...

  7. 转 LIST INCARNATION OF DATABASE

    incarnation在英文中是“化身”的意思. 那么在oracle中,它又是什么意思呢?有什么作用呢? 我们看一些基本概念 Current Incarnation(当前化身):数据库当前正在使用的化 ...

  8. oracle 基础知识(七)----动态性能视图

    一,动态性能视图介绍 动态性能视图属于数据字典,系统管理员用户 SYS 可以访问它们.在数据库打开和使用时不断进行更新,而且它们的内容主要与性能有关.虽然这些视图很像普通的数据库表,但它们不允许用户直 ...

  9. CentOS6 克 隆

    原始机子关机 自己设置名字 保存地址 开机 配置hosts   后面的为你要设置的名字不配置可能xshell链接上不了网 更改名字: 配置网卡 删除物理地址 mac 和  uuid 删除网卡 重启

  10. 解决IE9 IE8的跨域 请求问题

    /// <summary> /// 根据url获取对应的HTML /// </summary> /// <param name="url">&l ...