`
transdoc
  • 浏览: 3000 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

SVNKit High Level API

    博客分类:
  • SVN
阅读更多
SVN是当前最常用的版本控制工具。关于subversion、visualSVN server、TortoiseSVN Client、SVNKit的介绍网上有很多,可以到搜索引擎一搜一大把。
subversion官网
visualSVN server官网
tortoiseSVN Client官网
SVNKit官网

最近在寻思着做个版本控制的模块用到transdoc中,到深圳图书馆借了本版本控制之道学习ing。
里面介绍的是svn安装和使用,没有具体说怎么在它基础上做开发。于是找到svnkit官网看API/Wiki,苦于英文太差,又到网上找了些资料,封装了下HighLevelAPI常用的一些方法,特定了transdoc的适用场景,简化了参数。
package cn.transdoc.svn;

import java.io.File;
import java.io.OutputStream;

import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
import org.tmatesoft.svn.core.internal.wc.DefaultSVNOptions;
import org.tmatesoft.svn.core.wc.SVNClientManager;
import org.tmatesoft.svn.core.wc.SVNCommitClient;
import org.tmatesoft.svn.core.wc.SVNCopyClient;
import org.tmatesoft.svn.core.wc.SVNCopySource;
import org.tmatesoft.svn.core.wc.SVNDiffClient;
import org.tmatesoft.svn.core.wc.SVNMoveClient;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc.SVNUpdateClient;
import org.tmatesoft.svn.core.wc.SVNWCClient;
import org.tmatesoft.svn.core.wc.SVNWCUtil;

/**
 * svn客户端,包含一些常见的svn操作
 * 
 * @author Administrator
 * 
 */
public class SvnClient {

    private SVNClientManager svnClientManager;

    static {
        DAVRepositoryFactory.setup();
        FSRepositoryFactory.setup();
        SVNRepositoryFactoryImpl.setup();
    }

    /**
     * 使用用户名与密码创建一个Svn客户端
     * 
     * @param username
     * @param password
     */
    public SvnClient(String username, String password) {
        DefaultSVNOptions options = SVNWCUtil.createDefaultOptions(false);
        svnClientManager = SVNClientManager.newInstance(options, username, password);
    }

    /**
     * 将指定版本库文件夹路径的最新版本检出到本地
     * 
     * @param repoPath
     *            仓库路径 url,必须是文件夹
     * @param workingCopy
     *            本地工作副本,必须是文件夹
     * @param includeChildren
     *            是否检出文件夹下的文件和子文件夹
     * @throws SVNException
     *             当repoPath或workingCopy不是文件夹时,或者repoPath不存在时,抛出该异常
     */
    public void checkout(String repoPath, File workingCopy, boolean includeChildren) throws SVNException {
        SVNUpdateClient client = svnClientManager.getUpdateClient();
        SVNURL repositoryURL = SVNURL.parseURIEncoded(repoPath);
        SVNDepth depth = includeChildren ? SVNDepth.INFINITY : SVNDepth.EMPTY;
        client.doCheckout(repositoryURL, workingCopy, SVNRevision.HEAD, SVNRevision.HEAD, depth, true);
    }

    /**
     * 更新版本化环境中的工作副本到最新版本
     * 
     * @param workingCopy
     *            本地工作副本,可以是文件或文件夹
     * @param includeChildren
     *            当workingCopy是文件夹时,是否检出文件夹下的文件和子文件夹
     * @throws SVNException
     */
    public void update(File workingCopy, boolean includeChildren) throws SVNException {
        SVNUpdateClient client = svnClientManager.getUpdateClient();
        SVNDepth depth = includeChildren ? SVNDepth.INFINITY : SVNDepth.EMPTY;
        client.doUpdate(workingCopy, SVNRevision.HEAD, depth, true, true);
    }

    /**
     * 添加工作副本到版本化环境中
     * 
     * @param workingCopy
     *            本地工作副本,可以是文件或文件夹
     * @param includeChildren
     *            是否添加文件夹下的文件和子文件夹
     * @throws SVNException
     */
    public void add(File workingCopy, boolean includeChildren) throws SVNException {
        SVNWCClient client = svnClientManager.getWCClient();
        SVNDepth depth = includeChildren ? SVNDepth.INFINITY : SVNDepth.EMPTY;
        client.doAdd(workingCopy, true, false, true, depth, false, true);
    }

    /**
     * 提交已添加到版本化环境中的工作副本到版本库
     * 
     * @param includeChildren
     *            是否添加文件夹下的文件和子文件夹
     * @param commitMessage
     *            提交附加消息
     * @param workingCopy
     *            本地工作副本,可以是文件或文件夹
     * @throws SVNException
     */
    public void commit(String commitMessage, boolean includeChildren, File... workingCopy) throws SVNException {
        SVNCommitClient client = svnClientManager.getCommitClient();
        SVNDepth depth = includeChildren ? SVNDepth.INFINITY : SVNDepth.EMPTY;
        client.doCommit(workingCopy, false, commitMessage, null, null, false, true, depth);
    }

    /**
     * 将文件或文件夹导入版本库而不创建版本化环境
     * 
     * @param repoPath
     * @param file
     * @param commitMessage
     * @param includeChildren
     * @throws SVNException
     */
    public void importTo(String repoPath, File file, String commitMessage, boolean includeChildren) throws SVNException {
        SVNCommitClient client = svnClientManager.getCommitClient();
        SVNDepth depth = includeChildren ? SVNDepth.INFINITY : SVNDepth.EMPTY;
        SVNURL url = SVNURL.parseURIEncoded(repoPath);
        client.doImport(file, url, commitMessage, null, true, false, depth);
    }

    /**
     * 将工作副本中的条目移出版本化环境
     * 
     * @param workingCopy
     *            需要移出的条目
     * @param deleteMessage
     *            移出附加消息
     * @param deleteFiles
     *            是否从文件系统中删除条目对应的文件
     * @throws SVNException
     */
    public void delete(File workingCopy, String deleteMessage, boolean deleteFiles) throws SVNException {
        SVNWCClient client = svnClientManager.getWCClient();
        client.doDelete(workingCopy, true, deleteFiles, false);
    }

    /**
     * 锁定工作副本和存储库中的文件条目
     * 
     * @param workingCopy
     *            需要锁定的文件条目的工作副本
     * @param lockMessage
     *            锁定附加消息
     * @throws SVNException
     */
    public void lock(String lockMessage, File... workingCopy) throws SVNException {
        SVNWCClient client = svnClientManager.getWCClient();
        client.doLock(workingCopy, false, lockMessage);
    }

    /**
     * 解除工作副本和存储库中已锁定的文件条目的锁定状态
     * 
     * @param workingCopy
     *            需要解除锁定的文件条目的工作副本
     * @throws SVNException
     */
    public void unlock(File... workingCopy) throws SVNException {
        SVNWCClient client = svnClientManager.getWCClient();
        client.doUnlock(workingCopy, false);
    }

    /**
     * 取消所有本地编辑
     * 
     * @param workingCopy
     * @throws SVNException
     */
    public void revert(File... workingCopy) throws SVNException {
        SVNWCClient client = svnClientManager.getWCClient();
        client.doRevert(workingCopy, SVNDepth.INFINITY, null);
    }

    /**
     * 移动/重命名
     * 
     * @param src
     * @param dst
     * @throws SVNException
     */
    public void move(File src, File dst) throws SVNException {
        SVNMoveClient client = svnClientManager.getMoveClient();
        client.doMove(src, dst);
    }

    /**
     * 取消移动/重命名
     * 
     * @param src
     * @param dst
     * @throws SVNException
     */
    public void undoMove(File src, File dst) throws SVNException {
        SVNMoveClient client = svnClientManager.getMoveClient();
        client.undoMove(src, dst);
        revert(src, dst);
    }

    /**
     * 复制src到dst
     * 
     * @param src
     * @param dst
     * @throws SVNException
     */
    public void copy(File dst, File... src) throws SVNException {
        SVNCopyClient client = svnClientManager.getCopyClient();
        SVNCopySource[] sources = new SVNCopySource[src.length];
        int i = 0;
        for (File file : src) {
            sources[i++] = new SVNCopySource(SVNRevision.HEAD, SVNRevision.HEAD, file);
        }
        client.doCopy(sources, dst, false, true, false);
    }

    /**
     * 比较当前工作版本和版本库最新版本的不同,输出到out
     * 
     * @param src
     * @param out
     * @throws SVNException
     */
    public void diff(File src, OutputStream out) throws SVNException {
        SVNDiffClient client = svnClientManager.getDiffClient();
        client.doDiff(src, SVNRevision.WORKING, src, SVNRevision.HEAD, SVNDepth.INFINITY, false, out, null);
    }

}



测试:
package cn.transdoc.svn;

import java.io.File;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class SvnClientTest {

    public static String REPO_ROOT = "https://humphrey/svn/root/test";
    private SvnClient svnClient;

    @Before
    public void setUp() throws Exception {
        String name = "admin";
        String password = "admin";
        svnClient = new SvnClient(name, password);
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void checkOut() throws Exception {
        svnClient.checkout(REPO_ROOT, new File("F:\\transdoc"), false);
    }

    @Test
    public void update() throws Exception {
        svnClient.update(new File("F:\\transdoc"), true);
    }

    @Test
    public void updateFile() throws Exception {
        svnClient.update(new File("F:\\transdoc\\c.txt"), true);
    }

    @Test
    public void add() throws Exception {
        svnClient.add(new File("F:\\transdoc\\3"), true);
    }

    @Test
    public void commit() throws Exception {
        svnClient.commit("测试提交", true, new File("F:\\transdoc\\b.txt"));
    }

    @Test
    public void delete() throws Exception {
        svnClient.delete(new File("F:\\transdoc\\e.txt"), "deleteMessage", false);
    }

    @Test
    public void lock() throws Exception {
        svnClient.lock("lockMessage", new File("F:\\transdoc\\a.txt"), new File("F:\\transdoc\\b.txt"));
    }

    @Test
    public void unlock() throws Exception {
        svnClient.unlock(new File[] { new File("F:\\transdoc\\a.txt"), new File("F:\\transdoc\\b.txt"),
                new File("F:\\transdoc\\e.txt") });
    }

    @Test
    public void importTo() throws Exception {
        svnClient.importTo(REPO_ROOT + "/e.txt", new File("F:\\transdoc\\e.txt"), "importTo", true);
    }

    @Test
    public void move() throws Exception {
        File src = new File("F:\\transdoc\\s.txt");
        File dst = new File("F:\\transdoc\\a.txt");
        svnClient.move(src, dst);
        // svnClient.revert(src,dst);
        svnClient.undoMove(dst, src);
        // svnClient.commit("move", true, src, dst);
    }

    @Test
    public void undoMove() throws Exception {
        File src = new File("F:\\transdoc\\s.txt");
        File dst = new File("F:\\transdoc\\a.txt");
        svnClient.undoMove(src, dst);
        // svnClient.commit("undoMove", true, src,dst);
    }

    @Test
    public void revert() throws Exception {
        svnClient.revert(new File("F:\\transdoc\\s.txt"));
        svnClient.revert(new File("F:\\transdoc\\a.txt"));
    }

    @Test
    public void copy() throws Exception {
        svnClient.copy(new File("F:\\transdoc\\1"), new File("F:\\transdoc\\b.txt"));
    }

    @Test
    public void diff() throws Exception {
        svnClient.diff(new File("F:\\transdoc\\b.txt"), System.out);
    }

}

分享到:
评论

相关推荐

    svnkit low level api 使用实例

    目前真正自己写的svnkit底层接口使用代码,svnkit很稳定,但接口使用说明不清晰,所以会导致了使用过程中会有很多的坑,实例中有完整的解决方法

    svnkit帮助文档API

    这个“svnkit帮助文档API”是一个离线版的资源,提供了详细的信息来帮助开发者理解和使用SVNKit库。下面将详细介绍SVNKit的主要组件、功能以及如何利用其API进行开发。 1. SVNKit核心组件: - SVNClientManager:...

    svnkit 1.3.5

    官方文档提到,svnkit提供了三种类型的api:high level api、low level api和java hl api。本文简单介绍一下svnkit的high level api和low level api。 high level api提供了与命令行工具svn相同的功能,使用它可以...

    svnkit帮助文档API+SVNKit实例+jar包

    SVNKit提供了丰富的API,使得开发者能够执行常见的SVN操作,如检出、提交、更新、合并等。这个压缩包包含了SVNKit的帮助文档、API参考以及示例代码,是学习和使用SVNKit的重要资源。 首先,帮助文档是理解SVNKit...

    SVNKit学习——使用High-Level API管理Working Copy示例(六) - 鱼我所欲也 - 博客园1

    【SVNKit学习——使用High-Level API管理Working Copy示例(六)】 本文将深入探讨如何使用SVNKit的High-Level API来管理Subversion(SVN)的工作副本(Working Copy)。SVNKit是一个纯Java库,它允许开发人员在Java...

    纯java操作svn--svnkit API

    ### 纯Java操作SVN——SVNKit API详解 #### 概述 在软件开发过程中,版本控制系统如Subversion(SVN)是必不可少的工具之一。为了更好地集成SVN功能到Java应用中,SVNKit提供了一套全面且强大的API。本文将详细...

    SVNKit实例 + jar包 + SVNKit API

    SVNKit提供了丰富的API,使得开发者能够执行诸如版本控制、提交、更新、比较、合并等SVN操作。在这个实例中,我们拥有一个完整的项目,包含了SVNKit的使用示例,可以直接导入并运行,这对于学习和理解如何在Java应用...

    svnkit英文api

    这个压缩包文件包含的是SVNKit的英文API文档,对于那些无法访问互联网或者需要离线查阅资料的学生和开发者来说非常有用。 在解压缩文件后,你可以找到一个名为`index.xml`的文件,这通常是API文档的索引文件,它...

    svnkit-1.8.0.zip

    SVNKit (JavaSVN) 是一个纯 Java 的 SVN 客户端库,使用 SVNKit 无需安装任何 SVN 的客户端,支持各种操作系统。 这不是一个开源的类库,但你可以免费使用。 通过SVNKit,你可以在SVN上开发出自己的应用

    svnkit svn开发所需要的jar包及源码

    描述中的"svnkit svn api jar 源码 1.7.11"表示这是SVNKit的特定版本——1.7.11,其中包含了SVNKit API的jar文件以及对应的源代码。API jar是开发者在项目中引入的库,包含了所有必要的类和方法,可以执行诸如检查...

    SVNKit开发的Demo

    通过这个Demo,我们可以深入理解SVNKit的工作原理和API用法。 1. **SVNKit介绍** SVNKit是一个全功能、高性能的Subversion客户端库,提供了一系列接口,使得开发者能够在Java应用中实现与SVN服务器的通信。它支持...

    SVNKittest(SVNKit各种操作demo)

    其他SVNKit的操作包括CheckOut,DoCommit,DoDiff,DoImport,DoUpdate,查看上次备注信息(message/log),DisplayFile(查看svn文件属性)DisplayRepositoryTree(查看某路径下的所有文件)

    SVNkit的Jar包 和实例代码

    SVNkit是一个强大的Java库,它为Subversion(SVN)版本控制系统提供了全面的API支持。这个库使得在Java应用程序中实现对SVN操作变得简单,例如创建、更新、提交和回滚版本库。SVNkit不仅包含了核心的库文件,还提供...

    svnkit 手册

    SVNKit 手册 SVNKit 是一个基于 Java 语言的 Subversion 客户端库,提供了一个灵活的方式来访问 Subversion 版本控制系统。下面是 SVNKit 手册的详细介绍: SVN 快速入门 SVNKit 手册的第一部分是 SVN 快速入门...

    svnkit-1.7.11

    5. **API接口**:SVNKit提供了一系列丰富的API,包括但不限于`SVNClientManager`(管理SVN客户端操作)、`SVNRepository`(与SVN服务器通信)、`SVNWCClient`(处理工作拷贝操作)和`SVNRevision`(表示版本信息)。...

    SVNKit获取SVN信息

    SVNKit是一个强大的Java库,它为Subversion(SVN)版本控制系统提供了全面的API支持。这个库使得开发者能够在Java应用程序中实现与SVN服务器的交互,包括版本控制操作、仓库浏览、信息获取等功能。本篇文章将深入...

    SVNKit1.7.9

    4. **API增强**:SVNKit提供了一个丰富的Java API,允许开发者方便地访问Subversion的功能。1.7.9版本可能包含了新的API接口或者对现有接口的改进,以适应新的Subversion特性和需求。 5. **兼容性**:除了与...

    SVNKit开发手册

    SVNKit提供了高级API和低级API。高级API封装了许多操作细节,使得开发者可以更简单地使用Subversion的功能。低级API则提供了更细粒度的控制,允许开发者进行更复杂的操作。 - **SVNClientManager**:管理不同客户端...

    svnkit1.8.15

    SVNKit是一个强大的Java库,专门用于与Subversion(SVN)版本控制系统进行交互。它提供了全面的功能,允许开发者在Java应用程序中实现对SVN的访问,包括但不限于查看、比较、提交、更新和回滚代码仓库操作。在给定的...

Global site tag (gtag.js) - Google Analytics