最近在做一个仓库管理系统,架构在svn之上。要求每一项操作要记录在log文件中,弄了很久起初感觉无法向库中的文本文件添加东西,就是修改库中的文本文件。于是采用了一个很笨的办法: 现将库中的log文件export下来到本地,修改完之后将库中的原来的log文件删除,然后上传(import)本地这个新的日志文件,然后删除掉本地的这个日志文件。
先看看代码:
package com.repositoryclient.svnoptions; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl; import org.tmatesoft.svn.core.internal.wc.DefaultSVNOptions; import org.tmatesoft.svn.core.wc.ISVNOptions; 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.SVNMoveClient; import org.tmatesoft.svn.core.wc.SVNRevision; import org.tmatesoft.svn.core.wc.SVNUpdateClient; import org.tmatesoft.svn.core.wc.SVNWCUtil; import com.repositoryclient.models.User; import com.repositoryclient.treeview.FileNode; public class UserLogOption { public boolean doLog(String userName,String passwd,String LogMessage){ SVNClientManager ourClientManager; SVNRepositoryFactoryImpl.setup(); SVNURL repositoryUrl = null; String SVNServerUrl=User.getLogUrl(); File outFile=new File("./"); try { repositoryUrl = SVNURL.parseURIEncoded(SVNServerUrl); ISVNOptions options = SVNWCUtil.createDefaultOptions(true); ourClientManager = SVNClientManager.newInstance( (DefaultSVNOptions) options, userName, passwd); //将log文件下载到本地 SVNUpdateClient updateClient=ourClientManager.getUpdateClient(); updateClient.doExport(repositoryUrl, outFile, SVNRevision.HEAD, SVNRevision.HEAD, LogMessage,false,true); //添加此次操作的内容到log文件 try { BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("./Log.txt",true))); bw.append("\r\n"+LogMessage); bw.flush(); bw.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } //上传新的log文件,替换掉老的log文件 outFile=new File("./log.txt"); SVNURL repositoryTrgtUrl = SVNURL.parseURIEncoded(SVNServerUrl); SVNCopySource[] copySources = new SVNCopySource[1]; copySources[0] = new SVNCopySource(null, null, outFile); SVNCopyClient copyClient=ourClientManager.getCopyClient(); SVNMoveClient moveClient=ourClientManager.getMoveClient(); SVNCommitClient commitClient=ourClientManager.getCommitClient(); SVNURL[] svnurl = new SVNURL[1]; svnurl[0] = SVNURL.parseURIEncoded(SVNServerUrl); commitClient.doDelete(svnurl, "delete log file."); commitClient.doImport(outFile, repositoryTrgtUrl, "dologlog", true); //updateClient.doSwitch(outFile,repositoryTrgtUrl,SVNRevision.HEAD , true); //copyClient.doCopy(copySources, repositoryTrgtUrl, true, true, true, "move", null); //SVNCommitClient commitClient=ourClientManager.getCommitClient(); //commitClient.doCommit(new File[]{outFile}, false, LogMessage, true, true); //删除本地的log文件 outFile.delete(); return true; } catch (SVNException e) { // TODO: handle exception e.printStackTrace(); return false; } } }
测试代码:
package com.repositoryclient.svnoptions; import com.repositoryclient.models.User; public class testlog { public static void main(String args[]){ UserLogOption logOption=new UserLogOption(); logOption.doLog(User.getUserName(), User.getPasswd(), "do log is good."); } }
发现虽然是可行的,但是真的很不好。
于是给svnkit的作者写了封邮件问了问能否直接修改库中的文本文件,他们很快给我回了邮件
You need to commit a file modification. There is an example at http://wiki.svnkit.com/Committing_To_A_Repository Alexander Kitaev, TMate Software Support, TMate Software, http://subgit.com/ - Safe Svn To Git Migration! http://svnkit.com/ - Java [Sub]Versioning Library! http://hg4j.com/ - Java Mercurial Library! http://sqljet.com/ - Java SQLite Library!
于是我就试了试svnkit的low api,结果成功了,但是有点问题:直接覆盖了log中的内容而不是添加到log中原内容的后边。这个之后再解决。
先看看代码:
public void logRepository(){ FSRepositoryFactory.setup(); try { byte[] oldData={}; byte[] newData; String logMessage="you are the god."; newData=logMessage.getBytes(); SVNRepository repository=SVNRepositoryFactory.create(SVNURL.parseURIDecoded("http://10.13.30.22/svn/SVNRepository/Log/")); ISVNAuthenticationManager authenticationManager = SVNWCUtil .createDefaultAuthenticationManager(userName, passwd); repository.setAuthenticationManager(authenticationManager); ISVNEditor editor=repository.getCommitEditor("logMessage", null,true,null); editor.openRoot(-1); editor.openFile("log.txt", -1); editor.applyTextDelta("log.txt", null); SVNDeltaGenerator deltaGenerator = new SVNDeltaGenerator( ); String checksum =deltaGenerator.sendDelta( "log.txt" ,new ByteArrayInputStream(newData),editor , true ); // String checksum = deltaGenerator.sendDelta( "log.txt" , new ByteArrayInputStream(oldData) , -1 , new ByteArrayInputStream(newData) , editor , true ); //Closes filePath. editor.closeFile( "log.txt" , checksum ); //Closes the root directory. editor.closeDir( ); editor.closeEdit(); } catch (SVNException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
这个执行完之后,就将库中Log文件夹下的log.txt文件的内容修改为: you are the god.了。
注意这个很重要的类:SVNDeltaGenerator:http:
http://svnkit.com/kb/javadoc/org/tmatesoft/svn/core/io/diff/SVNDeltaGenerator.html#sendDelta(java.lang.String, java.io.InputStream, long, java.io.InputStream, org.tmatesoft.svn.core.io.ISVNDeltaConsumer, boolean)
public String sendDelta(String path, InputStream target, ISVNDeltaConsumer consumer, boolean computeChecksum) throws SVNException Generates a series of diff windows of fixed size comparing target bytes (from target stream) against an empty file and sends produced windows to the provided consumer. consumer's textDeltaChunk() method is called to receive and process generated windows. Now new data comes within a window, so the output stream is either ignored (if it's null) or immediately closed (if it's not null). If computeChecksum is true, the return value will be a strig containing a hex representation of the MD5 digest computed for the target contents. Parameters: path - a file repository path target - an input stream to read target bytes from consumer - a diff windows consumer computeChecksum - true to compute a checksum Returns: if computeChecksum is true, a string representing a hex form of the MD5 checksum computed for the target contents; otherwise null Throws: SVNException
---------------------------------------------------------------------------------------------------------------------------------------------------------------
刚才上面提到的问题有一个笨办法,就是获得log.txt的原内容,将新的log信息组织到原内容的后面,然后通过sendDelta就行了。
上代码:
public void logRepository(String logMessage){ FSRepositoryFactory.setup(); try { String readmeContent=getFileInfo("http://10.13.30.22/svn/SVNRepository/Log/log.txt"); SVNRepository repository=SVNRepositoryFactory.create(SVNURL.parseURIDecoded("http://10.13.30.22/svn/SVNRepository/Log/")); ISVNAuthenticationManager authenticationManager = SVNWCUtil .createDefaultAuthenticationManager(userName, passwd); repository.setAuthenticationManager(authenticationManager); ISVNEditor editor=repository.getCommitEditor("logMessage", null,true,null); editor.openRoot(-1); editor.openFile("log.txt", -1); editor.applyTextDelta("log.txt", null); SVNDeltaGenerator deltaGenerator = new SVNDeltaGenerator( ); String checksum =deltaGenerator.sendDelta( "log.txt" ,new StringBufferInputStream(readmeContent+"\r\n"+logMessage),editor , true ); // String checksum = deltaGenerator.sendDelta( "log.txt" , new ByteArrayInputStream(oldData) , -1 , new ByteArrayInputStream(newData) , editor , true ); //Closes filePath. editor.closeFile( "log.txt" , checksum ); //Closes the root directory. editor.closeDir( ); editor.closeEdit(); } catch (SVNException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
public String getFileInfo(String SVNServerUrl){ SVNClientManager ourClientManager; // 初始化支持svn://协议的库 SVNRepositoryFactoryImpl.setup(); // 相关变量赋值 SVNURL repositoryUrl = null; try { repositoryUrl = SVNURL.parseURIEncoded(SVNServerUrl); ISVNOptions options = SVNWCUtil.createDefaultOptions(true); // 实例化客户端管理类 ourClientManager = SVNClientManager.newInstance( (DefaultSVNOptions) options, userName, passwd); OutputStream outputStream; outputStream = new ByteArrayOutputStream(); SVNWCClient svnWCClient = ourClientManager.getWCClient(); svnWCClient.doGetFileContents(repositoryUrl, SVNRevision.HEAD, SVNRevision.HEAD, false, outputStream); return outputStream.toString(); } catch (SVNException e) { // TODO: handle exception e.printStackTrace(); return null; } }
测试代码:
package com.repositoryclient.svnoptions; import com.repositoryclient.models.User; public class testEditor { public static void main(String args[]){ StoreManagerFileNodeOption fileNodeOption=new StoreManagerFileNodeOption(User.getUserName(), User.getPasswd()); fileNodeOption.logRepository("新的log信息"); } }
相关推荐
SVNKit是一个强大的Java库,它实现了Subversion(SVN)客户端功能,允许开发者在Java应用程序中集成版本控制系统。这个“svnkit帮助文档API”是一个离线版的资源,提供了详细的信息来帮助开发者理解和使用SVNKit库。...
SVNKit是一个强大的Java库,它实现了Subversion(SVN)客户端功能,允许开发者在Java应用程序中集成版本控制系统。SVNKit提供了丰富的API,使得开发者能够执行常见的SVN操作,如检出、提交、更新、合并等。这个...
为了更好地集成SVN功能到Java应用中,SVNKit提供了一套全面且强大的API。本文将详细解析SVNKit API中的几个关键方法,并通过一个具体的示例来展示如何使用这些方法实现常见的SVN操作。 #### SVNKit API简介 SVNKit...
SVNKit是一个强大的Java库,它实现了Subversion(SVN)客户端的功能,允许开发者在Java应用程序中集成版本控制系统。SVNKit提供了丰富的API,使得开发者能够执行诸如版本控制、提交、更新、比较、合并等SVN操作。在...
目前真正自己写的svnkit底层接口使用代码,svnkit很稳定,但接口使用说明不清晰,所以会导致了使用过程中会有很多的坑,实例中有完整的解决方法
SVNKit是一个强大的Java库,它实现了Subversion(SVN)版本控制系统的主要功能,使得开发者能够在Java应用程序中轻松地处理版本控制操作。这个压缩包文件包含的是SVNKit的英文API文档,对于那些无法访问互联网或者...
官方文档提到,svnkit提供了三种类型的api:high level api、low level api和java hl api。本文简单介绍一下svnkit的high level api和low level api。 high level api提供了与命令行工具svn相同的功能,使用它可以...
其他SVNKit的操作包括CheckOut,DoCommit,DoDiff,DoImport,DoUpdate,查看上次备注信息(message/log),DisplayFile(查看svn文件属性)DisplayRepositoryTree(查看某路径下的所有文件)
Java实现SVN,主要借助的是SVNKit框架,这是一款完全用Java编写的Subversion库,使得Java开发者能够轻松地在应用程序中集成版本控制系统Subversion的功能。本文将深入探讨如何使用SVNKit进行基础操作以及日志管理。 ...
SVNKit (JavaSVN) 是一个纯 Java 的 SVN 客户端库,使用 SVNKit 无需安装任何 SVN 的客户端,支持各种操作系统。 这不是一个开源的类库,但你可以免费使用。 通过SVNKit,你可以在SVN上开发出自己的应用
SVNKit是一个全面的、纯Java实现的Subversion(SVN)客户端库,它允许开发者在Java应用程序中集成版本控制系统Subversion的功能。Subversion是一种广泛使用的版本控制系统,用于跟踪文件和目录的更改,便于团队协作...
SVNKit是一个强大的Java库,它允许开发人员在应用程序中集成Subversion(SVN)版本控制系统。这个库提供了丰富的API,使得与SVN服务器交互变得简单,包括创建、更新、提交、导出、合并和分支等操作。在给定的资源中...
这个"SVNKit开发的Demo"是展示如何利用SVNKit在Java应用中实现SVN的基本功能,如检出(Checkout)和文件差异对比(Compare)。通过这个Demo,我们可以深入理解SVNKit的工作原理和API用法。 1. **SVNKit介绍** ...
利用svnkit操作svn,实现对版本修改文件的导出,可以导出多个版本,.java文件将会在本地取出.class文件,导出后压缩成压缩包,主要用于服务器上的资源更新,不需要开发人员去找到对应的.class文件或其他文件压缩然后...
SVNKit是一个强大的Java库,它为Subversion(SVN)版本控制系统提供了全面的API支持。这个库使得开发者能够在Java应用程序中实现与SVN服务器的交互,包括版本控制操作、仓库浏览、信息获取等功能。本篇文章将深入...
通过SVNkit提供的API,你可以创建新的版本库,克隆现有的版本库到本地,对文件和目录进行添加、修改、删除,然后将这些更改提交到版本库。此外,还可以执行版本间的差异比较、分支和合并操作,以及回滚到特定版本等...
SVNKit是一个强大的Java库,它实现了Subversion(SVN)客户端功能,允许开发者在Java应用程序中集成版本控制系统。SVNKit提供了丰富的API,用于执行常见的SVN操作,如检查、更新、提交、合并和分支等。这个"svnkit的...
SVNKit是一款纯Java实现的Subversion(SVN)客户端库,它允许开发者在Java应用程序中直接集成SVN功能,无需依赖任何本地SVN客户端。这个压缩包提供的"svnkit-1.10.6"是SVNKit的一个版本,包含了支持Java开发的SVN...
* Eclipse 集成开发环境:使用 Eclipse 集成开发环境可以方便地开发和调试 SVNKit 应用程序。 * Maven 依赖关系:SVNKit 依赖于 Maven 依赖关系,以便管理项目依赖项。 SVNKit 结构 第三部分是 SVNKit 结构,...
SVNKit是一种Java库,它提供了对Subversion版本控制系统的完整接口,允许开发者在Java应用程序中集成Subversion功能。SVNKit开发手册为想要学习SVN二次开发的程序员提供了全面的指南,涵盖了SVNKit的主要组件与用法...