SVNKit学习——使用High-Level API管理Working Copy示例(六)

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

High-Level API类图:

核心思想:

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

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

示例编码:

package com.demo;

import com.google.gson.Gson;
import org.tmatesoft.svn.core.*;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
import org.tmatesoft.svn.core.wc.*;
import java.io.File;

/**
 * 使用Hign-Level API来操作Working Copy,由于所有的操作比较贴近SVN命令行、客户端的操作,所以理解起来相对容易一些。
 * 对于Working Copy的不同操作被分类封装到不同的SVN*Client中,SVNClientManager类包含这些SVN*Client,所以通常使用SVNClientManager类可以很方便的管理这些SVN*Client
 * 所以我们在操作Working Copy时有两种选择:1.可以分别实例化各种SVN*Client类。2.实例化一个SVNClientManager类,实际上在首次请求SVNClient类的时候,它就已经实例化了每个SVN*Client类了。
 * 具体结构详见类图
 */
public class ManageWorkingCopy {
    private static SVNClientManager svnClientManager;
    private static final Gson gson = new Gson();

    public static void main(String[] args) throws Exception{
        //1.根据访问协议初始化工厂
        DAVRepositoryFactory.setup();
        //2.使用默认选项
        ISVNOptions isvnOptions = SVNWCUtil.createDefaultOptions(true);
        //3.初始化权限
        String username = "wly";
        String password = "wly";
        char[] pwd = password.toCharArray();
        ISVNAuthenticationManager isvnAuthenticationManager = SVNWCUtil.createDefaultAuthenticationManager(username,pwd);
        //4.创建SVNClientManager的实例
        svnClientManager = SVNClientManager.newInstance(isvnOptions,isvnAuthenticationManager);
        //=========================================demo start=======================================
        //1.导入-import
//      doImport();
        //2.检出-checkout
//      doCheckout();
        //3.创建目录-mkdir
//      doMkDir();
        //4.提交-commit
//      doCommit();
        //5.更新-update
//        doUpdate();
        //6.切换分支-switch
        //7.添加-add,在commit中有体现,提交前,没有加入版本控制的文件需要加入版本控制
        //8.锁定-lock
//        doLock();
        //9.删除-delete
//        doDelete();
        //10.拷贝-copy
//        doCopy();
        //11.状态-status
//        doStatus();
        //12.信息-info
//        doInfo();
    }

    /*
     * 导入-import
     * @throws SVNException
     */
    private static void doImport() throws SVNException{
        SVNProperties svnProperties = new SVNProperties();
        boolean useGlobalIgnores = true;
        boolean ignoreUnknownNodeTypes = true;
        SVNCommitInfo svnCommitInfo = svnClientManager.getCommitClient().doImport(new File("E:\\svnWorkspace\\commonProject"),SVNURL.parseURIEncoded("https://wlyfree-PC:8443/svn/testRepository/trunk"),"初始化导入",svnProperties,useGlobalIgnores,ignoreUnknownNodeTypes,SVNDepth.INFINITY);
        System.out.println("执行import操作成功,导入结果:" + gson.toJson(svnCommitInfo));
    }

    /**
     * 检出-checkout
     * 参数:
     *  仓库地址
     *  本地Working Copy地址
     *  Peg Revision
     *  Revision
     *  检出深度,一般递归检出
     *  是否允许没有版本的障碍物,true的话允许,false不允许,false在checkout的时候如果有障碍物就会停止检出,所以一般是true
     * 返回值:long 当前版本号
     * @throws SVNException
     */
    private static void doCheckout() throws SVNException{
        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);
        System.out.println("执行checkout操作成功,当前检出的版本号是:" + nowRevision);
    }

    /**
     * 创建目录-mkdir
     * @throws SVNException
     */
    private static void doMkDir() throws SVNException{
        String commitMessage = "创建一个目录";
        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);
        System.out.println("执行mkdir操作成功,操作结果:" + gson.toJson(svnCommitInfo));
    }

    /**
     * 提交-commit
     * commit更改一个文件时,如果文件本身存在,则需要提交其父目录
     * @throws SVNException
     */
    private static void doCommit() throws SVNException{
        File[] files = new File[]{new File("E:\\svnWorkspace\\projectWorkingCopy"),new File("E:\\svnWorkspace\\projectWorkingCopy\\ccc")};
        //没有版本号的先执行add操作
        for(File tempFile : files){
            SVNStatus status = svnClientManager.getStatusClient().doStatus(tempFile,true);
            System.err.println(status);
            if(status == null || status.getContentsStatus() == SVNStatusType.STATUS_UNVERSIONED) {
                System.out.println("文件" + tempFile.getName() + "无版本号");
                svnClientManager.getWCClient().doAdd(tempFile, false, false, false, SVNDepth.INFINITY, false, false);
            }
        }
        //执行commit操作
        svnClientManager.getCommitClient().setIgnoreExternals(false);
        SVNProperties svnProperties = new SVNProperties();
        String[] changeLists = new String[]{};
        SVNCommitInfo svnCommitInfo = svnClientManager.getCommitClient().doCommit(files,false,"提交操作",svnProperties,changeLists,false,false,SVNDepth.fromRecurse(true));
        System.out.println("执行commit操作成功,操作结果:" + gson.toJson(svnCommitInfo));
    }

    /**
     * 更新-update
     * @throws SVNException
     */
    private static void doUpdate() throws SVNException{
        long nowRevision = svnClientManager.getUpdateClient().doUpdate(new File("E:\\svnWorkspace\\projectWorkingCopy"),SVNRevision.HEAD, SVNDepth.INFINITY,true,false);
        System.out.println("执行update操作成功,当前版本号:" + nowRevision);
    }

    /**
     * 锁定-lock
     * @throws SVNException
     */
    private static void doLock() throws SVNException{
//        svnClientManager.getWCClient().doLock(new SVNURL[]{SVNURL.parseURIEncoded("https://wlyfree-PC:8443/svn/testRepository/trunk/bbb/aa.txt")},true,"给文件加锁");
        svnClientManager.getWCClient().doLock(new File[]{new File("E:\\svnWorkspace\\projectWorkingCopy\\bbb\\aa.txt")},true,"给文件加锁");
        System.out.println("给文件加锁成功");
    }

    /**
     * 删除-delete
     * @throws SVNException
     */
    private static void doDelete() throws SVNException{
        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");
        System.out.println("执行delete操作成功,操作结果:" + gson.toJson(svnCommitInfo));
    }

    /**
     * 复制-copy
     * @throws SVNException
     */
    private static void doCopy() throws SVNException{
        SVNCopySource svnCopySource1 = new SVNCopySource(SVNRevision.HEAD,SVNRevision.HEAD,SVNURL.parseURIEncoded("https://wlyfree-PC:8443/svn/testRepository/trunk/aaa/aa.txt"));
        SVNCopySource svnCopySource2 = new SVNCopySource(SVNRevision.HEAD,SVNRevision.HEAD,SVNURL.parseURIEncoded("https://wlyfree-PC:8443/svn/testRepository/trunk/aaa/bb.txt"));
        svnClientManager.getCopyClient().doCopy(new SVNCopySource[]{svnCopySource1,svnCopySource2},new File("E:\\svnWorkspace\\projectWorkingCopy\\bbb"),false,false,true);
        System.out.println("执行copy操作成功");
    }

    /**
     * 状态-status
     * @throws SVNException
     */
    private static void doStatus() throws SVNException{
        SVNStatus svnStatus = svnClientManager.getStatusClient().doStatus(new File("E:\\svnWorkspace\\projectWorkingCopy\\a.txt"),true);
        System.out.println("执行status操作成功,操作结果:" + gson.toJson(svnStatus));
    }

    /**
     * 信息-info
     * @throws SVNException
     */
    private static void doInfo() throws SVNException{
        SVNInfo svnInfo = svnClientManager.getWCClient().doInfo(new File("E:\\svnWorkspace\\projectWorkingCopy\\a.txt"),SVNRevision.HEAD);
        System.out.println("执行info操作成功,操作结果:" + gson.toJson(svnInfo));
    }
}
时间: 2024-10-13 00:06:04

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

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

本文是参考官方文档的实现,官方wiki:https://wiki.svnkit.com/Committing_To_A_Repository 本文核心使用的是ISVNEditor这个接口直接对Repository进行各种AM操作~ 以下两张示例图分别代表我们操作前.操作后仓库的结构: 具体实现: package com.demo; import com.google.gson.Gson; import org.tmatesoft.svn.core.*; import org.tmatesoft.

Linux程序设计学习笔记----网络通信编程API及其示例应用

转载请注明出处, http://blog.csdn.net/suool/article/details/38702855. BSD Socket 网络通信编程 BSD TCP 通信编程流程 图为面向连接的Socket通信的双方执行函数流程.使用TCP协议的通信双方实现数据通信的基本流程如下 建立连接的步骤 1.首先服务器端需要以下工作: (1)调用socket()函数,建立Socket对象,指定通信协议. (2)调用bind()函数,将创建的Socket对象与当前主机的某一个IP地址和TCP端口

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

对于app开发来说,必须需要有相应的api文档,一般最基础的就是用markdown工具来撰写api文档.当对于开发人员来说,是总会想着寻找更方便撰写,测试,对接前端开发的文档生成的工具. 其实这方面的工具很多:手动撰写的也很多,很多都带有mock测试功能.方便前端对接时使用. 国内的也不少: RAP:动态生成模拟数据,实时测试等功能. eoLinker:基于云端的api管理工具,同时提供在线协作,测试等的功能. SBDoc:SBDoc是一个商业化开源产品,完全免费.无论你是前端工程师,还是后端工

CDIF灵长科技 API 管理解决方案技术白皮书

灵长科技 API 管理解决方案的核心技术是具备中美知识产权保护的,名为通用设备互联框架(CDIF:common device interconnect framework)的软件框架,目前有部分开源实现存放在:https://github.com/out4b/cdif(注:开源部分遵守相关开源代码许可协议).CDIF 是世界上第一种基于 REST 和 JSON 的 SOA软件框架,提供了与基于XML 的 WSDL 语言和 SOAP 协议同等抽象能力.但简洁得多的基于JSON 的实现,也非常适合用

论元数据和API管理工具

公司里面的很多部门都在广泛的采用元数据管理,也采用了公司内部开发的元数据管理工具,有些部门的实施效果一直非常好,而有些部门的效果则差强人意.这个问题,其实和软件系统开发完成进入维护阶段后成本居高不下的性质是一样的. 究其本质,是因为国内很多的公司对流程的重视程度多浮于表面,较少的深入去掌握实质部分.在具体讨论元数据和API管理的问题之前,先来说说笔者在很多部门见到过的几类现状,一.大部分业绩比较差的公司/部门的考核通常是这样的,公司有新的项目开发,负责项目管理的项目经理问部门经理要了一批开发人员

菜鸟学习Cocos2d-x 3.x——内存管理

菜鸟学习Cocos2d-x 3.x——内存管理 2014-12-10 分类:Cocos2d-x / 游戏开发 阅读(394) 评论(6) 亘古不变的东西 到现在,内存已经非常便宜,但是也不是可以无限大的让你去使用,特别是在移动端,那么点内存,那么多 APP要抢着用,搞不好,你占的内存太多了,系统直接干掉你的APP,所以说了,我们又要老生常谈了——内存管理.总结COM开发的时候,分析过COM的 内存管理模式:总结Lua的时候,也分析了Lua的内存回收机制:前几天,还专门写了C++中的智能指针在内存

MySQl Study学习之--MySQl二进制日志管理

MySQl Study学习之--MySQl二进制日志管理 MySQL二进制日志(Binary Log):   a.它包含的内容及作用如下:    包含了所有更新了数据或者已经潜在更新了数据(比如没有匹配任何行的一个DELETE)    包含关于每个更新数据库(DML)的语句的执行时间信息    不包含没有修改任何数据的语句,如果需要启用该选项,需要开启通用日志功能    主要目的是尽可能的将数据库恢复到数据库故障点,因为二进制日志包含备份后进行的所有更新    用于在主复制服务器上记录所有将发送

Linux学习8---(用户和用户组管理)

1.用户和用户组     用户和用户组概念        用户:使用操作系统的人(Linux支持多个用户在同一时间登陆同一个操作系统)        用户组:具有相同权限的一组用户(Linux系统中可以存在多个用户组)     相关的配置文件        /etc/group:储存当前系统中所有用户组信息            Group:        x        :    123        :    abx,def,xyz            组名称:    组密码占位符:  

linux学习之路之磁盘管理和文件系统三

ext3文件系统和ext2文件系统的区别? 在某些时候,某个用户在linux系统上写入数据,这时系统正好断电或者系统核心出现错误,写入的数据仅有inode table和datablock而已,可能会导致之前写过的数据没有保存在磁盘上.而当系统重启后,系统可能会对没有保存的数据进行数据恢复.但是,由于系统并不知道是哪个文件不完整,因此会遍历整个文件系统中inode,来查看block是否完整.不过,当某个文件的数据太大时,数据的恢复时间可能会比较长,而这对于服务器来说是不利的.所以在这种情况下,也就