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

SVNKit 示例 简介

    博客分类:
  • java
阅读更多

由于之前研究过SVNKit相关的使用,有不少同仁咨询我相关的问题,特此示例以供参考。

 

package org.xiangxji.svn;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.junit.Test;
import org.tmatesoft.svn.core.SVNDirEntry;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNNodeKind;
import org.tmatesoft.svn.core.SVNProperties;
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.internal.io.fs.FSRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.wc.SVNWCUtil;
/**
 * SVNManager SVN 管理器
 * @author <a href="xiangxji@gmail.com">xiangxji</a>
 * @since 2010-03-27
 */
public class SVNManager{
	
	private String url = "svn://localhost/";
	private String username = "harry";
	private String password = "harryssecret";
	private SVNRepository repository;

    /**
     * 初始化操作
     * @throws Exception
     */
    public void initialize() throws Exception {
		FSRepositoryFactory.setup();
		DAVRepositoryFactory.setup();
		SVNRepositoryFactoryImpl.setup();
		repository = SVNRepositoryFactoryImpl.create(SVNURL
				.parseURIEncoded(this.url));
		ISVNAuthenticationManager authManager = SVNWCUtil
				.createDefaultAuthenticationManager(this.username,
						this.password);
		repository.setAuthenticationManager(authManager);
	}
    
	/**
	 * 从SVN服务器获取文件
	 * @param filePath 相对于仓库根目录的路径
	 * @param outputStream 要输出的目标流,可以是文件流 FileOutputStream
	 * @param version 要checkout的版本号
	 * @return 返回checkout文件的版本号
	 * @throws Exception 可以自定义Exception
	 */
    public long getFileFromSVN(String filePath, OutputStream outputStream,
			long version) throws Exception {
		SVNNodeKind node = null;
		try {
			node = repository.checkPath(filePath, version);
		} catch (SVNException e) {
			throw new Exception("SVN检测不到该文件:" + filePath, e);
		}
		if (node != SVNNodeKind.FILE) {
			throw new Exception(node.toString() + "不是文件");
		}
		SVNProperties properties = new SVNProperties();
		try {
			repository.getFile(filePath, version, properties, outputStream);
		} catch (SVNException e) {
			throw new Exception("获取SVN服务器中的" + filePath + "文件失败", e);
		}
		return Long.parseLong(properties.getStringValue("svn:entry:revision"));
	}
    /**
     * 获取目录下的所有文件和子目录
     * @param res 包含目录参数的资源对象.参加{@link Resource#getPath()}
     * @return 资源列表
     * @throws Exception
     */
    @SuppressWarnings("unchecked")
	public List<Resource> getChildren(Resource res) throws Exception {
		String path = res.getPath();
		Collection<SVNDirEntry> entries;
		try {
			entries = repository.getDir(path, -1, null, (Collection) null);
		} catch (SVNException e) {
			throw new Exception("获得" + path + "下级目录失败", e);
		}
		List<Resource> result = new ArrayList<Resource>();
		for (SVNDirEntry entry : entries) {
			if (containsSpecialFile(entry)) {
				Resource resource = new Resource();
				resource.setName(entry.getName());
				resource.setPath(entry.getURL().getPath());
				resource.setFile(entry.getKind() == SVNNodeKind.FILE);
				result.add(resource);
			}
		}
		return result;
	}
    /**
     * 判断文件是否存在
     * @param entry 要判断的节点.参加{@link SVNDirEntry}
     * @return 
     * @throws Exception
     */
    @SuppressWarnings("unchecked")
	private boolean containsSpecialFile(SVNDirEntry entry)
	throws Exception {
		if (entry.getKind() == SVNNodeKind.FILE) {
			return true;
		} else if (entry.getKind() == SVNNodeKind.DIR) {
			Collection<SVNDirEntry> entries;
			String path = entry.getURL().getPath();
			try {
				entries = repository.getDir(path, -1, null, (Collection) null);
			} catch (SVNException e) {
				throw new Exception("获得" + path + "下级目录失败", e);
			}
			for (SVNDirEntry unit : entries) {
				if (containsSpecialFile(unit)) {
					return true;
				}
			}
			return false;
		}
		return false;
	}
    
    @Test
    public void testGetFile() { 
    	OutputStream outputStream;
		try {
			initialize();
			String outFileName = "D:/t1/11.txt";
			outputStream = new FileOutputStream(outFileName);
			System.out.println(getFileFromSVN("/t1/11.txt",outputStream,7L));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
    
    @Test
    public void testGetDir() {
		try {
			initialize();
			Resource res = new Resource();
			res.setPath("/app1/");
			List<Resource> rs = getChildren(res);
			for(Resource r : rs) {
				System.out.println(r.getFile()?"file:":"directory:" + r.getPath());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
}

package org.xiangxji.svn;
/**
 * 资源对象
 * @author <a href="xiangxji@gmail.com">xiangxji</a>
 * @since 2010-03-27
 */
public class Resource {
	/**
	 * 相对仓库根目录的路径
	 */
    private String path;
    /**
     * 文件/文件夹的名称
     */
    private String name;
    /**
     * 是否是文件 文件:true | 文件夹:false
     */
    private boolean isFile;
    /**
     * 版本号
     */
    private long SVNVersion;
    /**
     * 本地路径
     */
    private String localPath;
    
    public String getLocalPath() {
		return localPath;
	}

	public void setLocalPath(String localPath) {
		this.localPath = localPath;
	}

	public long getSVNVersion() {
		return SVNVersion;
	}

	public void setSVNVersion(long sVNVersion) {
		SVNVersion = sVNVersion;
	}

	public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean getFile() {
        return isFile;
    }

    public void setFile(boolean isFile) {
        this.isFile = isFile;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

}
 

 

 

  • svn.zip (2.4 KB)
  • 下载次数: 411
分享到:
评论
3 楼 qeshine 2012-12-21  
你好,svnkit能不能直接操作版本库中的内容。比如说,我想把一个文件剪切到另一个文件夹下,而并不在本地生成版本库
2 楼 yonge812 2012-07-11  
tmd258 写道
您好,大哥。
请教一个问题:
您这里的获取仓库的一个文件的时候,都要指定它的修正版本号,如果我知道修正版本号,那怎么办呢?可否获得最新的版本文件?
请指教

获取最新版本文件,可以将版本号写成-1,或者head
1 楼 tmd258 2011-12-27  
您好,大哥。
请教一个问题:
您这里的获取仓库的一个文件的时候,都要指定它的修正版本号,如果我知道修正版本号,那怎么办呢?可否获得最新的版本文件?
请指教

相关推荐

    java调用SVNKit示例

    Java调用SVNKit是为了在Java程序中...总结来说,这个Java示例展示了如何使用SVNKit库在Java程序中进行基本的SVN操作,如登录验证和查询目录条目。开发者可以根据这些基础,扩展实现其他SVN功能,如提交、更新、删除等。

    SVNKit实例 + jar包 + SVNKit API

    在这个实例中,我们拥有一个完整的项目,包含了SVNKit的使用示例,可以直接导入并运行,这对于学习和理解如何在Java应用中利用SVNKit进行版本控制非常有帮助。 一、SVNKit基本操作 1. **初始化仓库连接**:通过`SVN...

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

    这个压缩包包含了SVNKit的帮助文档、API参考以及示例代码,是学习和使用SVNKit的重要资源。 首先,帮助文档是理解SVNKit功能的关键。它通常会详细介绍如何初始化SVN仓库,创建新项目,管理文件版本,解决冲突,以及...

    svnkit帮助文档API

    此外,文档通常还包括示例代码,有助于快速上手。 总之,SVNKit是一个全面的Subversion客户端实现,适用于那些希望在Java环境中集成版本控制功能的项目。离线API文档是开发者不可或缺的参考资料,它能帮助开发者...

    SVNKit1.7.9

    6. **文档和示例**:SVNKit通常会提供详细的文档和示例代码,帮助开发者快速理解和使用这个库。这包括Javadoc,示例应用程序,以及在线教程和社区支持。 在压缩包文件`svnkit-1.7.9`中,可能包含以下内容: - `...

    SVNKit开发的Demo

    4. **代码示例** 在`SVNKitTest`这个文件中,可能会有以下关键步骤: - 创建`SVNClientManager`实例,这是执行所有SVN操作的入口点。 - 配置认证信息,包括用户名和密码,以便连接到SVN服务器。 - 调用`checkout...

    SVNkit的Jar包 和实例代码

    描述中提到的“实例代码”意味着该压缩包中可能包含了一些示例代码,这些代码展示了如何使用SVNkit进行实际操作。这对于初学者或者需要快速上手的开发者来说是非常宝贵的资源,因为他们可以直接参考这些代码了解如何...

    svnkit1.8.15

    1. SVNKit简介: SVNKit是一个纯Java实现的Subversion客户端库,无需依赖本地SVN客户端或者C语言的SWIG接口。它为开发者提供了API,可以在不离开Java环境的情况下执行所有常见的SVN操作。此外,SVNKit还支持多种...

    svnKit java操作svn

    ### SVNKit Java操作SVN详解 #### 一、SVN快速入门 ...以上是对使用SVNKit进行SVN操作的基本介绍和示例代码,涵盖了从快速入门到高级操作的全过程。希望这些内容能够帮助您更好地理解和掌握SVNKit在Java中的应用。

    svnkit-demo.rar

    标题 "svnkit-demo.rar" 暗示了一个关于使用 SVNKit 框架进行 Subversion(SVN)操作的示例项目。这个项目可能包含了演示如何对比不同版本号的文件、管理版本库以及获取相关信息并将其格式化为 JSON 的代码。 SVN...

    svnkit的demo

    这个"svnkit的demo"可能是包含了一些示例代码或者教程,用于演示如何使用SVNKit库进行SVN操作。 首先,我们来了解一下SVNKit的基本概念和功能: 1. **SVN连接管理**:SVNKit支持多种连接方式,包括HTTP、HTTPS、...

    svnkit-1.7.11

    10. **社区支持**:SVNKit有一个活跃的开发者社区,提供了详细的文档、示例代码和论坛支持,帮助开发者解决问题并充分利用该库的功能。 综上所述,SVNKit 1.7.11是Java开发者实现Subversion功能的强大工具,它为...

    纯java操作svn--svnkit API

    本文将详细解析SVNKit API中的几个关键方法,并通过一个具体的示例来展示如何使用这些方法实现常见的SVN操作。 #### SVNKit API简介 SVNKit是一个完全由Java编写的Subversion客户端库,它允许开发者在Java应用程序...

    SVNkit的pom文件 和实例代码

    在给定的资源中,"SVNkit的pom文件"指的是Maven的配置文件,而"实例代码"则是使用SVNKit进行操作的示例程序。 `pom.xml`是Maven项目对象模型(Project Object Model)文件,它是Maven项目的核心。在这个文件中,...

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

    通常,这种命名方式意味着包含了一系列与该版本相关的文件,如不同模块的jar包、文档、示例代码等。 总的来说,这个压缩包提供的是SVNKit 1.7.11版本的开发资源,包括API jar包和源代码。开发者可以利用这些资源在...

    SVNKit开发手册

    SVNKit是一种Java库,它提供了对Subversion版本控制系统的完整接口,允许开发者在Java应用程序中集成Subversion功能。SVNKit开发手册为想要学习SVN二次开发的程序员提供了全面的指南,涵盖了SVNKit的主要组件与用法...

    java实现svn,svnkit框架的简单应用

    一、SVNKit简介 SVNKit是一个开源的Java库,它为Java应用程序提供了对Subversion API的完整访问。由于是用Java编写,它可以在任何支持Java的平台上运行,包括Windows、Linux、Mac OS等。SVNKit不仅提供了命令行工具...

    SVNKit开发指南

    更多关于SVNKit的详细信息,包括官方文档、社区论坛、示例代码等,都可作为进一步学习的资源。了解这些资源将有助于更深入地掌握SVNKit的使用技巧,提高开发效率。 总之,SVNKit为Java开发者提供了一个强大且灵活的...

    SVNKit-tmatesoft 1.10.0

    以下是一个基本示例,展示如何使用SVNKit 1.10.0获取SVN仓库的日志: ```java import com.tmatesoft.svn.core.*; import com.tmatesoft.svn.core.wc.*; import com.tmatesoft.svn.core.io.*; import ...

Global site tag (gtag.js) - Google Analytics