SVNKit学习——基于Repository的操作之print repository tree、file content、repository history(四)

  此篇文章同样是参考SVNKit在wiki的官方文档做的demo,每个类都可以单独运行。具体的细节都写到注释里了~

开发背景:

  SVNKit版本:1.7.14 附上官网下载链接:https://www.svnkit.com/org.tmatesoft.svn_1.7.14.standalone.zip

  jdk版本要求:我试了1.6版本是不行的,1.7版本的jdk没有问题。

  操作:①.在官网下载SVNKit1.7.14后将lib/*.jar全部复制到工程中  ②.导入google的Gson的包,这里我用的是gson-2.2.4.jar

  仓库目录结构:

    

  工程结构图:

    

具体代码:

  一、显示svn仓库的树结构

package com.demo;

import org.tmatesoft.svn.core.SVNDirEntry;
import org.tmatesoft.svn.core.SVNNodeKind;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.core.wc.SVNWCUtil;
import java.io.File;
import java.util.Collection;
import java.util.Iterator;

/**
 * 显示svn仓库的树结构
 */
public class PrintRepositoryTree {
    public static void main(String[] args) throws Exception{
        //1.根据访问协议初始化工厂
        DAVRepositoryFactory.setup();;
        //2.初始化仓库
        String url = "https://wlyfree-PC:8443/svn/svnkitRepository1/trunk";
        SVNRepository svnRepository = SVNRepositoryFactory.create(SVNURL.parseURIEncoded(url));
        //3.创建一个访问的权限
        String username = "wly";
        String password = "wly";
        char[] pwd = password.toCharArray();
        ISVNAuthenticationManager authenticationManager = SVNWCUtil.createDefaultAuthenticationManager(username,pwd);
        svnRepository.setAuthenticationManager(authenticationManager);
        /*输出仓库的根目录和UUID*/
        System.out.println("Repository Root:" + svnRepository.getRepositoryRoot(true));
        System.out.println("Repository UUID:" + svnRepository.getRepositoryUUID(true));
        /**
         * 检验某个URL(可以是文件、目录)是否在仓库历史的修订版本中存在,参数:被检验的URL,修订版本,这里我们想要打印出目录树,所以要求必须是目录
         * SVNNodeKind的枚举值有以下四种:
         *  SVNNodeKind.NONE    这个node已经丢失(可能是已被删除)
         *  SVNNodeKind.FILE    文件
         *  SVNNodeKind.DIR     目录
         *  SVNNodeKind.UNKNOW  未知,无法解析
         * */
        /*
         *  被检验的URL,本例有两种等价的写法。
         *  1.不是以"/"开头的是相对于仓库驱动目录的相对目录,即svnRepository的url,在本例中是:空字符串(url目录是:https://wlyfree-PC:8443/svn/svnkitRepository1/trunk)
         *  2.以"/"开头的是相对于svnRepository root目录的相对目录,即svnRepository的rootUrl,在本例中是:/trunk(root目录是https://wlyfree-pc:8443/svn/svnkitRepository1)
         */

        String checkUrl = "";
        //修订版本号,-1代表一个无效的修订版本号,代表必须是最新的修订版
        long revisionNum = -1;
        SVNNodeKind svnNodeKind = svnRepository.checkPath(checkUrl,revisionNum);
        if(svnNodeKind == SVNNodeKind.NONE){
            System.err.println("This is no entry at " + checkUrl);
            System.exit(1);
        }else if(svnNodeKind == SVNNodeKind.FILE){
            System.err.println("The entry at ‘" + checkUrl + "‘ is a file while a directory was expected.");
            System.exit(1);
        }else{
            System.err.println("SVNNodeKind的值:" + svnNodeKind);
        }
        //打印出目录树结构
        listEntries(svnRepository,checkUrl);
        //打印最新修订版的版本号
        System.err.println("最新修订版版本号:" + svnRepository.getLatestRevision());
    }
    private static void listEntries(SVNRepository svnRepository,String path) throws Exception{
        System.err.println("path:" + path);
        Collection entry =  svnRepository.getDir(path, -1 ,null,(Collection)null);
        Iterator iterator = entry.iterator();
        while(iterator.hasNext()){
            SVNDirEntry svnDirEntry = (SVNDirEntry)iterator.next();
            System.out.println("path:" + "/" + (path.equals("") ? "" : path + "/") + svnDirEntry.getName() + ",(author:" + svnDirEntry.getAuthor() + ",revision:" + svnDirEntry.getRevision() + ",date:" + svnDirEntry.getDate() + ")");
            if(svnDirEntry.getKind() == SVNNodeKind.DIR){
                String tempPath = (path.equals("") ? svnDirEntry.getName() : path + "/" + svnDirEntry.getName()) ;
                listEntries(svnRepository,tempPath);
            }
        }
    }
}

  运行效果:

Repository Root:https://wlyfree-pc:8443/svn/svnkitRepository1
Repository UUID:62e76a57-4b9a-d34b-92c0-4551f8669da5
SVNNodeKind的值:dir
path:
path:test
path:/init1.txt,(author:wly,revision:8,date:Tue Nov 29 15:36:47 CST 2016)
path:/init2.txt,(author:wly,revision:8,date:Tue Nov 29 15:36:47 CST 2016)
path:/test,(author:wly,revision:10,date:Tue Dec 06 13:50:53 CST 2016)
path:/test/init11.txt,(author:wly,revision:10,date:Tue Dec 06 13:50:53 CST 2016)
path:/test/init22.txt,(author:wly,revision:9,date:Tue Dec 06 12:13:42 CST 2016)
path:/test/test2,(author:wly,revision:9,date:Tue Dec 06 12:13:42 CST 2016)
path:test/test2
path:/test/test2/init111.txt,(author:wly,revision:9,date:Tue Dec 06 12:13:42 CST 2016)
path:/test/test2/init222.txt,(author:wly,revision:9,date:Tue Dec 06 12:13:42 CST 2016)
最新修订版版本号:10

Process finished with exit code 0

  二、打印文件内容

  获取文件的类型,如果文件是二进制文件,则只输出文件属性;如果文件是一个文本文件,输出文件属性和文件内容

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.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.core.wc.SVNWCUtil;
import java.io.ByteArrayOutputStream;
import java.util.Iterator;
import java.util.Map;

/**
 *  获取文件的类型,如果文件是二进制文件,则只输出文件属性;如果文件是一个文本文件,输出文件属性和文件内容
 */
public class PrintFileContent {
    public static void main(String[] args) throws Exception {
        //===========================前面几步和打印树是一样的START===================================
        //1.根据访问协议初始化工厂
        DAVRepositoryFactory.setup();;
        //2.初始化仓库
        String url = "https://wlyfree-PC:8443/svn/svnkitRepository1/trunk";
        SVNRepository svnRepository = SVNRepositoryFactory.create(SVNURL.parseURIEncoded(url));
        //3.创建一个访问的权限
        String username = "wly";
        String password = "wly";
        char[] pwd = password.toCharArray();
        ISVNAuthenticationManager authenticationManager = SVNWCUtil.createDefaultAuthenticationManager(username,pwd);
        svnRepository.setAuthenticationManager(authenticationManager);
        //===========================前面几步和打印树是一样的END===================================
        //这里我们要读取的是其中的一个文件
        String filePath = "test/init11.txt";
        //修订版本号,-1代表一个无效的修订版本号,代表必须是最新的修订版
        long revisionNum = -1;
        SVNNodeKind svnNodeKind = svnRepository.checkPath(filePath,revisionNum);
        if(svnNodeKind == SVNNodeKind.NONE){
            System.err.println("This is no entry at " + filePath);
            System.exit(1);
        }else if(svnNodeKind == SVNNodeKind.DIR){
            System.err.println("The entry at ‘" + filePath + "‘ is a directory while a file was expected.");
            System.exit(1);
        }else{
            System.err.println("SVNNodeKind的值:" + svnNodeKind);
        }
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        SVNProperties svnProperties = new SVNProperties();
        //若svnProperties对象非空,使用vnProperties属性接收文件的属性
        svnRepository.getFile(filePath,-1,svnProperties ,byteArrayOutputStream);
        /*
         * 输出文件属性
         */
        System.err.println("文件属性:");
        Map<String,SVNPropertyValue> svnPropertiesMap = svnProperties.asMap();
        Iterator<String> it = svnPropertiesMap.keySet().iterator();
        while(it.hasNext()){
            String key = it.next();
            System.err.println(key + " : " + svnPropertiesMap.get(key));
        }
        //序列化看下svnProperrties中的数据
        Gson gson = new Gson();
        System.err.println(gson.toJson(svnProperties));
        /*
         *  文件是否是文本类型的文件,文本类型文件输出文件内容
         */
        System.err.println("文件内容:");
        String mimeType = svnProperties.getStringValue(SVNProperty.MIME_TYPE);
        System.err.println("mimeType is :" + mimeType);
        boolean isTextType = SVNProperty.isTextMimeType(mimeType);
        if(isTextType){
            System.err.println("The file is a text file,this is contents:");
            byteArrayOutputStream.writeTo(System.err);
        }else{
            System.err.println("The file is not a text file,we can‘t read content of it.");
        }
    }
}

  运行效果:

SVNNodeKind的值:file
文件属性:
svn:entry:uuid : 62e76a57-4b9a-d34b-92c0-4551f8669da5
svn:entry:revision : 10
svn:entry:committed-date : 2016-12-06T05:50:53.160008Z
svn:wc:ra_dav:version-url : /svn/svnkitRepository1/!svn/ver/10/trunk/test/init11.txt
svn:entry:checksum : 8217e71c38f5c42e3fd4e8ac8dc75c4f
svn:entry:committed-rev : 10
svn:entry:last-author : wly
{"myProperties":{"svn:entry:uuid":{"myValue":"62e76a57-4b9a-d34b-92c0-4551f8669da5"},"svn:entry:revision":{"myValue":"10"},"svn:entry:committed-date":{"myValue":"2016-12-06T05:50:53.160008Z"},"svn:wc:ra_dav:version-url":{"myValue":"/svn/svnkitRepository1/!svn/ver/10/trunk/test/init11.txt"},"svn:entry:checksum":{"myValue":"8217e71c38f5c42e3fd4e8ac8dc75c4f"},"svn:entry:committed-rev":{"myValue":"10"},"svn:entry:last-author":{"myValue":"wly"}}}
文件内容:
mimeType is :null
The file is a text file,this is contents:
init
aa
bb
cc
dd
11
22
33
44

Process finished with exit code 0

  三、打印历史记录

package com.demo;

import com.google.gson.Gson;
import org.tmatesoft.svn.core.SVNLogEntry;
import org.tmatesoft.svn.core.SVNLogEntryPath;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.core.wc.SVNWCUtil;
import java.util.Collection;
import java.util.Iterator;
import java.util.Set;

/**
 * 打印历史记录
 */
public class PrintRepositoryHistory {
    public static void main(String[] args) throws Exception{
        //===========================前面几步和打印树是一样的START===================================
        //1.根据访问协议初始化工厂
        DAVRepositoryFactory.setup();;
        //2.初始化仓库
        String url = "https://wlyfree-PC:8443/svn/svnkitRepository1/trunk";
        SVNRepository svnRepository = SVNRepositoryFactory.create(SVNURL.parseURIEncoded(url));
        //3.创建一个访问的权限
        String username = "wly";
        String password = "wly";
        char[] pwd = password.toCharArray();
        ISVNAuthenticationManager authenticationManager = SVNWCUtil.createDefaultAuthenticationManager(username,pwd);
        svnRepository.setAuthenticationManager(authenticationManager);
        //===========================前面几步和打印树是一样的END===================================
        long startVersion = 10;
        long endVersion = 8;
        /*
         *  参数:
         *  1.接收日志
         *  2.接收history对象,每个修订版的信息都代表一个SVNLogEntry对象。如果我们不需要传入一个已经存在的history对象,就传入null值
         *  3.开始修订版本号,0、-1代表最新版本
         *  4.结束修订版本号,0、-1代表最新版本
         *  5.如果需要打印改变路径的信息,则设置为true。会使用每个SVNLogEntry对象记录改变路径的信息getchangedpaths()会返回一个Map<String改变路径,SVNLogEntryPath> 对象
         *  6.strictNode设置为true,复制history的时候不会跳过每个path的修订版日志
         */
        Collection logEntries = svnRepository.log(new String[]{""}, null,8,8,true,true);
        Gson gson = new Gson();
        if(logEntries != null){
            Iterator it = logEntries.iterator();
            while (it.hasNext()){
                SVNLogEntry svnLogEntry = (SVNLogEntry)it.next();
                System.err.println("序列化数据:" + gson.toJson(svnLogEntry));
                if(svnLogEntry.getChangedPaths().size() > 0){
                    System.err.println("Change path:");
                    Set changePathSet = svnLogEntry.getChangedPaths().keySet();
                    if(changePathSet != null && changePathSet.size() > 0){
                        for(Iterator changePaths = changePathSet.iterator();changePaths.hasNext();){
                            SVNLogEntryPath svnLogEntryPath = svnLogEntry.getChangedPaths().get(changePaths.next());
                            System.err.println(gson.toJson(svnLogEntryPath));
                        }
                    }
                }
            }
        }
    }
}

  运行效果:

序列化数据:{"myRevision":8,"myChangedPaths":{"/trunk/init1.txt":{"myPath":"/trunk/init1.txt","myType":"A","myCopyRevision":-1,"myNodeKind":{"myID":1}},"/trunk/init2.txt":{"myPath":"/trunk/init2.txt","myType":"A","myCopyRevision":-1,"myNodeKind":{"myID":1}}},"myRevisionProperties":{"myProperties":{"svn:log":{"myValue":"初始化导入目录-myRepository1"},"svn:author":{"myValue":"wly"},"svn:date":{"myValue":"2016-11-29T07:36:47.737654Z"}}},"myHasChildren":false,"myIsSubtractiveMerge":false,"myIsNonInheritable":false}
Change path:
{"myPath":"/trunk/init1.txt","myType":"A","myCopyRevision":-1,"myNodeKind":{"myID":1}}
{"myPath":"/trunk/init2.txt","myType":"A","myCopyRevision":-1,"myNodeKind":{"myID":1}}

Process finished with exit code 0

原文地址:https://www.cnblogs.com/firstdream/p/8439323.html

时间: 2024-12-21 08:51:00

SVNKit学习——基于Repository的操作之print repository tree、file content、repository history(四)的相关文章

SVNKit学习——Setting Up A Subversion Repository 创建仓库(三)

所谓Setting Up A Subversion Repository,就是在Subversion所在的服务器上创建一个仓库,说白了就是在磁盘上建一个特殊的目录,这里我以windows举例. 1.使用Subversion命令行操作: svnadmin create E:\svntest2 2.使用svnkit操作:包含High-level-API.Low-level-API两种方式. ①.Low-level-API String path = "E:\\svntest2"; SVNU

AACOS:基于编译器和操作系统内核的算法设计与实现

AACOS:基于编译器和操作系统内核的算法设计与实现 [计算机科学技术] 谢晓啸 湖北省沙市中学 [关键词]: 编译原理,操作系统内核实现,算法与数据结构,算法优化 0.索引 1.引论 1.1研究内容 1.2研究目的 1.3研究提要 正文 2.1研究方法 2.2编译器部分 2.2.1从计算器程序中得到的编译器制作启示 2.2.2在编译器中其它具体代码的实现 2.2.3编译器中栈的高级应用 2.2.3编译器中树的高级应用 2.2.4编译器与有限状态机 2.3操作系统内核部分 2.3.1操作系统与底

SVNKit学习——wiki+简介(一)

这篇文章是参考SVNKit官网在wiki的文档,做了个人的理解~ 首先抛出一个疑问,Subversion是做什么的,SVNKit又是用来干什么的? 相信一般工作过的同学都用过或了解过svn,不了解的同学可以到官网看下,这里不作为本文重点. 需要理解的概念: 仓库(Repository):是一个特殊的结构,记录文件版本管理的状态. 工作副本(Working Copy):本地从仓库检出的文件. 修订版(Revision):用于记录仓库数据的变更状态,初始化版本为0,每执行一次操作版本号+1,每执行一

Symfony2学习笔记之数据库操作

数据库和Doctrine让我们来面对这个对于任何应用程序来说最为普遍最具挑战性的任务,从数据库中读取和持久化数据信息.幸运的是,Symfony和Doctrine进行了集成,Doctrine类库全部目标就是给你一个强大的工具,让你的工作更加容易. Doctrine是完全解耦与Symfony的,所以并不一定要使用它. 一个简单例子:一个产品,我们首先来配置数据库,创建一个Product对象,持久化它到数据库并把它读回来. 首先我们需要创建一个bundle: $php app/console gene

SVNKit学习——wiki+简介(二)

这篇文章是参考SVNKit官网在wiki的文档,做了个人的理解~ 首先抛出一个疑问,Subversion是做什么的,SVNKit又是用来干什么的? 相信一般工作过的同学都用过或了解过svn,不了解的同学可以到官网看下,这里不作为本文重点. 需要理解的概念: 仓库(Repository):是一个特殊的结构,记录文件版本管理的状态. 工作副本(Working Copy):本地从仓库检出的文件. 修订版(Revision):用于记录仓库数据的变更状态,初始化版本为0,每执行一次操作版本号+1,每执行一

快速排序的学习(基于Go)

快速排序中的算法思想 1. 分治思想 分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题.递归地解这些子问题,然后将这些子问题的解组合为原问题的解. 我们可以利用分治思想将杂乱无序的数组Arr[p,,r]分为以下几个步骤 1.分解: 在数组Arr[p,,r]中找出主元x,并且依据这个x对原始的数组进行分解成两个数组Arr[p,,,q - 1]和Arr[q + 1,,r]是的任何一个属于Arr[p,,,q - 1]的元素都要小于Arr[q] 任何一个属于Arr[q + 1,

关于黑客,你了解多少?----黑客入门学习(常用术语+DOS操作)

关于黑客,你了解多少?----黑客入门学习(常用术语+DOS操作) ·1.1·前言 黑客一次是由英语"Hacker"英译出来的,是指专门研究.发现计算机和网络漏洞的计算机爱好者,他们伴随着计算机和网络的发展而产生成长.黑客对计算机有着狂热的兴趣和执着的追求,他们不断的研究计算机和网络知识,发现计算机和网络中存在的漏洞,喜欢挑战高难度的网络系统并从中找到漏洞,然后向管理员提出解决和修补漏洞的方法. 黑客的出现推动了计算机和网络的发展与完善.他们所做的不是恶意破坏,他们是一群纵横于网络的大

学习笔记_SVN常用操作

Subversion安装 subversion软件下载安装 http://subversion.tigris.org 我们使用版本Setup-Subversion-1.6.5.msi 双击安装Setup-Subversion-1.6.5.msi 命令模式: Subversion 组件  服务器组件 (管理员使用)  服务器端命令  svnadmin:用来调整和修正svn档案库的工具  svnserve:一个独立的服务器程序, 可以作为服务器行程执行, 或是被 SSH 启动; 另一个让你的档

关于lambda表达式的一些学习——基于谓词筛选值序列

今天看了一些关于lambda表达式的知识,然后对于Func<T,TResult>泛型委托不太熟悉,便查了查相关资料,又引出来了基于谓词筛选值序列这个对我来说的新鲜知识点,于是去查MSDN,以下是看到的一些相关介绍: 此方法通过使用延迟执行实现. 即时返回值为一个对象,该对象存储执行操作所需的所有信息. 只有通过直接调用对象的 GetEnumerator 方法或使用 Visual C# 中的 foreach(或 Visual Basic 中的 For Each)来枚举该对象时,才执行此方法表示的