
使用SVNKit与ANT导出SVN版本差异的列表.pdf
8页使用 SVNKit 与 ANT 导出 SVN版本差异的列表现在 SVN 用的越来越多,很多时候,经常面临这样的问题,怎么才能够知道2 个不同的版本之间的差异如果使用TortoiseSVN ,其实也好办首先打开一个项目目录,选择一个目录,单击右键,再选择“show log” 再选择两个不同的版本(高亮),点击右键“compare revisions” :这样就得到了两个版本之间的差异文件列表:如果需要导出,那么选择文件,再右键单击:这样就得到差异文件了不过我们是写程序的,用的最多是Eclipse,窗口切换来去的,多麻烦 还有没有更好的办法呢回答是有的 在这里我们要非常感谢SVNKIT这样一个工具包 SVNKIT是一个纯JAVA的 SVN API Eclipse的 SVN插件正是基于这个API的先简单介绍一下SVNKIT 这个东西基本上是全能的,支持这样一些特性支持 http(s), svn, svn(+ssh) 以及 file 协议访问SVN 库支持工作拷贝的全部操作支持仓库的管理操作:创建、装载、导出没有安装SVN的环境也可以用好啊,这正是我们想要的怎么做呢?从SVNKIT API来看,它提供了一组Client 接口的 API。
通过这些API我们可以操作工作拷贝,获得仓库版本的信息 为了比较版本之间的差异,我们会使用到SVNDiffClient, 为了单独CheckOut 差异文件,我们会使用到SVNUpdateClient,为了得到差异版本的提交日志,我们会使用到SVNLogClient 首先要连接到SVN库//初始化DAVRepositoryFactory.setup(); //仓库路径this. branchURL = SVNURL.parseURIEncoded(branchURL); this. username = username; this. password = password; this. startingRevision = SVNRevision.create(startingRevision); this. endingRevision = SVNRevision.create(endingRevision); //仓库访问身份认证this. authManager= SVNWCUtil.createDefaultAuthenticationManager( this. username, this. password);然后就是取差异列表。
SVN的 Client 接口提供有回调句柄,回调句柄非常的有用我们可以实现ISVNDiffStatusHandler 接口,进步的处理差异,看看哪个差异是我们需要保留的在这里,我们认为NodeKind 必须是文件类型的,而且是新增的或者修改的,那就放入差异列表ImplISVNDiffStatusHandler handler = newImplISVNDiffStatusHandler(changes); diffClient.doDiffStatus(this. branchURL, this. startingRevision, this. branchURL, this. endingRevision, svnDepth, false, handler); ///省略一些代码publicvoid handleDiffStatus(SVNDiffStatus status) throws SVNException { if (status.getKind() == SVNNodeKind.FILE }提取好差异列表,那么就可以根据差异列表进行CheckOut 了SVNUpdateClient updateClient = newSVNUpdateClient(authManager, SVNWCUtil.createDefaultOptions( true)); Changes = getChangeList(); for (int idx = 0; idx 写 AntTask 就比较简单, 继承一下org.apache.tools.ant.Task,自己实现execute 这个方法就可以了。
publicvoid execute() throws BuildException { // TODO Auto-generated method stubsuper.execute(); SVNChangedFiles changedFiles = newSVNChangedFiles(getBranch(), getUsername(), getPassword(), getStart(), getEnd(), getDestination());System.out .println(“ 导出到目录 :\t“ + getDestination()); ArrayList changes = changedFiles.list(); for ( int idx = 0; idx < changes.size(); idx++) { SVNDiffStatus change = (SVNDiffStatus) changes.get(idx); ArrayList singleChange = new ArrayList(); singleChange.add(change); try { changedFiles.export(singleChange); } catch (Exception e) { e.printStackTrace(); } System.out .println(“\t正在导出 :\t“ + change.getFile()); } }哦哦, 参数比较多, 可能以后还有一些其他的参数会加入,如果配置文件改了,跟以前不兼容怎么办,没关系,再来个Builder 解决这个问题publicclass SVNChangedFiles { private String branch; private String username; //略过其他属性publicstaticclass Builder { private String branch; private String username; public Builder(String branch, String username) { this. branch = servingSize; this. username = servings; } public Builder startingRevision (long strev) { startingRevision = strev; returnthis; } public Builder endingRevision(long endrev) { endingRevision = endrev; returnthis; } //省略其他 builder public SVNChangedFiles build() { returnnew SVNChangedFiles (this); } } private SVNChangedFiles (Builder builder) { username = builder.username; password = builder.password; //略过其他属性} }好,调用的时候就成了类似如下这样:SVNChangedFiles changeFiles = newSVNChangedFiles.Builder(“username”, ” password”).startingRevision(9318) .endingRevision(9349) .url(“http://192.168.49.47/svn/repo_projects/waf_最新开发架构/code/waf/trunk”).distionation(“” ) .build(); 嗯,看上去漂亮多了,再测试一下,没有问题,大功告成。












