`
Reset
  • 浏览: 16604 次
  • 性别: Icon_minigender_1
  • 来自: 济南
文章分类
社区版块
存档分类
最新评论

SVN 根据条件导出指定文件

    博客分类:
  • java
 
阅读更多

工作需要,写了个SVN 根据条件导出指定文件的工具。可自行扩展优化,如定制ANT任务什么的,只实现了核心功能。依赖svnkit 。

/**
 * 
 */
package com.elotter.common.svn;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.io.FileUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.tmatesoft.svn.core.ISVNLogEntryHandler;
import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNException;
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.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.ISVNOptions;
import org.tmatesoft.svn.core.wc.SVNClientManager;
import org.tmatesoft.svn.core.wc.SVNLogClient;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc.SVNWCUtil;

/**
 * @author liuhx
 *
 */
public class SvnExportTool {
	private static Log logger = LogFactory.getLog(SvnExportTool.class);

	public static final Pattern  PROTOCOL = Pattern.compile("(\\w+://[\\w|\\d|.]+)");	
    private static volatile SvnExportTool svnExportTool ;
    
    private SvnExportTool(){
		SVNRepositoryFactoryImpl.setup();		
		FSRepositoryFactory.setup();  
	    DAVRepositoryFactory.setup();
    }
    
    public static SvnExportTool getInstance(){
    	if(svnExportTool==null){
    		svnExportTool = new SvnExportTool();
    	}
    	return svnExportTool;
    }
	/**
	 * 比较版本导出
	 * @param repositoryURL	
	 * @param dist	导出的目录文件夹
	 * @param userName	用户名
	 * @param password	密码
	 * @param startRevision	起始版本
	 * @param endRevision	结束版本
	 * @throws SVNException
	 * @throws IOException
	 */
	public void export(String svnHost,String project,String dist,String userName,String password,long startRevision ,long endRevision,EnableExportHandler enableExport) throws SVNException, IOException{		
		 export(svnHost,project, dist, userName, password, startRevision , endRevision,false, enableExport) ;
	}
	/**
	 * 比较版本导出
	 * @param repositoryURL	
	 * @param dist	导出的目录文件夹
	 * @param userName	用户名
	 * @param password	密码
	 * @param startRevision	起始版本
	 * @param endRevision	结束版本
	 * @param lastVersion	是否导出最新版本
	 * @throws SVNException
	 * @throws IOException
	 */
	@SuppressWarnings({ "unchecked", "deprecation" })
	public synchronized void export(String svnHost,String project,String dist,String userName,String password,long startRevision ,long endRevision,boolean lastVersion,EnableExportHandler enableExport) throws SVNException, IOException{		
	    ISVNAuthenticationManager authManager = SVNWCUtil .createDefaultAuthenticationManager(userName, password);  

		ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
		//创建SVNClientManager的实例
		SVNClientManager clientManager = SVNClientManager.newInstance((DefaultSVNOptions) options, authManager);
		
		ExportLogEntryHandler handler = new ExportLogEntryHandler();
		
//		Matcher matcher = PROTOCOL.matcher(repositoryURL);
//		String svnHost = null;
//		if(matcher.find()){
//			svnHost = matcher.group(1);
//		}else
//			svnHost = repositoryURL;
		//获得历史记录
		getHistoryEntrys(clientManager,svnHost+project,startRevision ,endRevision,handler);
		
		List<SVNLogEntry> history =	compareRevision(handler.history);
		
		StringBuilder log = new StringBuilder();
		for(SVNLogEntry entry:history){
			if(enableExport!=null){
				//判断能否导出,若不能导出继续
				if(!enableExport.enableExport(entry)){
					continue;
				}
			}
			log.append(entry.getRevision()).append(" ").append(entry.getDate().toLocaleString()).append(" ").append(entry.getAuthor()).append(" ").append(entry.getMessage()).append("\r\n");
			Collection<SVNLogEntryPath> paths = entry.getChangedPaths().values();
			logger.info("export "+svnHost);
			for (SVNLogEntryPath path : paths) {
				
				log.append(path).append("\r\n");
				if(path.getType()=='D'){//删除
					File file = new File(dist,path.getPath());
					if(file.exists()){
						SvnExportTool.logger.info(" 删除 "+file.getAbsolutePath());
						file.delete();
					}else{
						SvnExportTool.logger.info(file.getAbsolutePath()+"不存在!!");
					}
					continue;
				}
				//添加或更新
				File file = new File(dist,path.getPath());
				if(!file.getParentFile().exists()){
					file.getParentFile().mkdirs();
				}
				SvnExportTool.logger.info(path.getType()+" "+path.getPath());
				
				SVNRevision fileVersion = null;
				if(lastVersion){
					fileVersion = SVNRevision.HEAD;
				}else{
					fileVersion = SVNRevision.create(entry.getRevision());
				}
				try{
					//导出
					clientManager.getUpdateClient().doExport(SVNURL.parseURIEncoded(svnHost +path.getPath()),file, SVNRevision.HEAD,fileVersion,"native", true,SVNDepth.INFINITY);
				}catch(Exception e){
					System.out.println( e.getMessage());
				}
			}
			log.append("\r\n");
		}
		FileUtils.writeStringToFile(new File(dist,"logger.log"), log.toString(), "UTF-8");
	}
	/**
	 * 比较版本
	 * @param list
	 * @return
	 */
	private  List<SVNLogEntry>  compareRevision(List<SVNLogEntry> list){
		return list;		
	}
	/**
	 * 获得版本区间的历史记录
	 * @param repositoryURL
	 * @param start
	 * @param end
	 * @param handler
	 * @throws SVNException
	 */
	private void getHistoryEntrys (SVNClientManager clientManager ,String repositoryURL,long start ,long end,ISVNLogEntryHandler handler) throws SVNException{
		SVNLogClient logClient = clientManager.getLogClient();
		SVNRevision startRevision = SVNRevision.create(start);
		SVNRevision endRevision = null;
		if(end==-1)
			endRevision = SVNRevision.HEAD;
		else
			endRevision = SVNRevision.create(end);
		
		logClient.doLog(SVNURL.parseURIEncoded(repositoryURL),new String[] {},SVNRevision.HEAD, startRevision, endRevision,false, true, Long.MAX_VALUE,handler);
	}
	
	class ExportLogEntryHandler implements ISVNLogEntryHandler {
		private List<SVNLogEntry> history = new ArrayList<SVNLogEntry>();
		
		public void handleLogEntry(SVNLogEntry logEntry) throws SVNException {
				//存储历史提交记录
				history.add(logEntry);
		}
	};
	
	public interface EnableExportHandler{
		public boolean enableExport(SVNLogEntry logEntry);
	}
	
}

 调用的时候

	public static void main(String[] args) throws SVNException, IOException{
		String svnHost = "svn://192.168.20.224/";
		SvnExportTool.getInstance().export(svnHost,"trunk/sdlfwap","c:/temp1","liuhongxu","111111",3114 ,-1,true,new EnableExportHandler(){
			@Override
			public boolean enableExport(SVNLogEntry logEntry) {
				if(logEntry.getAuthor().equals("liuhongxu")){
					return true;
				}
				return false;
			}
		});
	}
 

 

分享到:
评论
4 楼 ivanmissu 2015-07-23  
这个可以根据指定版本号来导出 指定版本号的文件是吗
3 楼 Reset 2012-05-17  
project 传的是项目名 , 全部源码就这些 ,你可以自己调试下 
2 楼 lyeqiufeng 2012-05-10  
   public void export(String svnHost,String project,String dist,String userName,String password,long startRevision ,long endRevision,EnableExportHandler enableExport) throws SVNException, IOException{        


楼主这里面这个project传的是什么值?
1 楼 lyeqiufeng 2012-05-10  
如果可以楼主能发把这个demo发给我,近来在做这个的开发,遇到瓶颈。lyeqiufeng@163.com

相关推荐

    java代码利用svnkit操作svn导出某版本或多个版本修改的文件

    利用svnkit操作svn,实现对版本修改文件的导出,可以导出多个版本,.java文件将会在本地取出.class文件,导出后压缩成压缩包,主要用于服务器上的资源更新,不需要开发人员去找到对应的.class文件或其他文件压缩然后...

    svn 日志导出 增量补丁工具

    筛选svn日志通常是通过命令行工具`svn log`完成的,可以通过指定日期范围、作者、提交信息关键字等参数来过滤日志。例如,如果我们只想查看某个开发者在过去一周内的提交,可以使用以下命令: ``` svn log -r {YYYY...

    Windows svnlog 转Excel

    可以修改bat文件中第二行的SVNPATH,导出指定SVN路径的log 方法二:在CMD命令行模式下执行命令WINsvnlog2excel.bat $SVNPATH, 即可在当前文件夹下生成指定SVN路径的LOG。 如WINsvnlog2excel.bat svn://192.168.0.84...

    PHP封装的svn类使用内置svn函数实现根据svn版本号导出相关文件示例

    标题中提到的“PHP封装的svn类使用内置svn函数实现根据svn版本号导出相关文件示例”,说明了本文将围绕使用PHP语言编写的svn版本控制类库来实现通过特定的svn版本号,导出与之关联的所有文件。标题直接指出该类库...

    svn patch 小工具 (自动提取改动文件)

    标题 "svn patch 小工具 (自动提取改动文件)" 暗示了这是一个关于版本控制系统Subversion(简称svn)和patch文件处理的工具。Subversion是广泛使用的版本控制软件,用于跟踪和管理代码库中的更改。patch文件则通常...

    python获取SVN日志

    指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间时间 获取SVN日志指定区间...

    SVN误操作导致的文件夹全是问号的问题

    这个`.bat`文件很可能是一个批处理脚本,用于删除指定目录下的`.svn`隐藏文件夹,从而解除SVN对文件的控制。在运行之前,请确保备份好重要数据,因为这会清除所有版本控制信息。 ### README.txt文件 `README.txt`...

    删除.svn文件

    例如,可以创建一个批处理文件,利用Windows的`for /r`命令遍历指定目录及其子目录,查找并删除所有的".svn"目录: ```batch @echo off for /r %cd% %%i in (.svn) do rd /s /q "%%i" ``` 这个批处理脚本会递归地...

    svn结果生成补丁

    - 使用`svn diff [文件或目录]`命令可以生成补丁文件,该文件记录了指定文件或目录在不同版本间的差异。 - 补丁文件通常以`.patch`为扩展名,可被`patch`命令或其他工具解析应用。 **4. 应用补丁** - `svn patch...

    svn服务器端删除文件

    使用`svnadmin dump`命令可以将整个存储库或其部分历史记录导出到一个文本文件中,作为备份。例如: ```bash svnadmin dump ../data/repositories/LinkAnalysisSystem -r0:101 &gt; dumpfile.txt ``` 这里,`-r0:101`...

    删除项目中的.svn文件

    从提供的`delete-svn-folders.reg`来看,这可能是一个Windows注册表文件,用于添加一个右键菜单项,使得用户能快速删除指定目录下的所有`.svn`子目录。 5. **注册表文件使用**:`.reg`文件用于导入或导出Windows...

    .svn删除软件

    如果你只是想临时断开与SVN服务器的连接,而保留版本历史,应使用`svn export`命令导出项目,而不是简单地删除`.svn`文件。 总之,".svn删除软件"是为了解决特定场景下对`.svn`文件的管理需求,理解其背后的目的和...

    svn安装与patch文件应用

    - **生成Patch文件**: 使用 `TortoiseSVN` 的 `Export` 功能导出文件夹,然后使用 `Diff` 工具对比两个版本之间的差异。 - **应用Patch文件**: 使用 `TortoiseSVN` 的 `Apply Patch` 功能将差异应用到目标文件夹。 ...

    如何通过公网以http方式访问单位的svn.让svn支持http协议

    接下来,在Apache配置文件中添加虚拟主机或者Location指令,定义SVN仓库的URL路径,并指定仓库的实际路径。例如: ``` *:80&gt; ServerName svn.yourcompany.com DocumentRoot "/var/www/html" &lt;Location /svn&gt; ...

    删除svn文件工具

    通常,当你从一个SVN仓库克隆或导出项目时,项目文件夹内会包含一个名为“.svn”的隐藏子目录,其中存储着SVN的工作副本信息,如版本库URL、修订版本、以及文件的暂存状态等。这些信息对于在SVN仓库中工作的用户是...

    svn操作完全手册

    SVN导出功能允许用户将SVN管理的文件或目录以非版本控制的形式导出至本地,通常用于生成静态副本,如报告或发布材料。导出的文件不包含SVN元数据,不会自动同步至服务器。 #### 七、SVN更新到指定旧版本(Update to...

    互不连接的两个SVN双向同步方法

    - 在笔记本上创建一个名为localcopy-1的目录,并从repository-1导出(export,不是检出checkout)所有需要的文件。导出操作不会包含SVN的元数据。 - 带着笔记本前往repository-2的所在地,创建localcopy-2目录,并...

    windows下svn安装文件和使用教程

    3. **忽略文件**:使用`.svnignore`文件,可以指定SVN忽略某些不需版本控制的文件。 4. **外部项目(Externals)**:可以将一个仓库中的目录链接到另一个仓库,实现跨仓库引用。 5. **备份与恢复**:定期备份仓库...

    git_export:在某些提交中导出 git 文件,例如 svn export

    ##功能git_export.bash+ftp_copy.py:导出某次git提交最新版,打包成一个文件夹,并从服务器ftp上下载备份文件git_backup.bash:复制出某次提交所有更改的文件,并备份上一个版本的这些文件到backup_文件夹##使用1....

    statSvn,svn导出工具

    StatSVN是一款强大的开发工具,专门用于从Subversion(简称SVN)版本控制系统中导出统计和分析数据。它能够帮助软件团队理解代码库的演变过程,提供关于代码提交、作者活动、文件修改频率等多方面的信息。通过这些...

Global site tag (gtag.js) - Google Analytics