`
hbxflihua
  • 浏览: 691382 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

一个基于svnkit的简单增量发布工具

阅读更多

 

package com.rd.svn;


import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNLogEntry;
import org.tmatesoft.svn.core.SVNLogEntryPath;
/**
 * 
 * @author lh
 *	
 */
public class Main {
	
	public static void main(String[] args) throws SVNException {
		System.out.println("===================== corp start =====================");
		String url = "http://xxx.com/branches/br_yyyy_v3.1.0_20170523";
		String copeDir = "D:/workspaces/p2pv3/v3.1.0";
		String targetDir = "f:/v3.1.0";
		String username = "zhangsan";
		String password = "zhangsan";
		String prefixDir = "/branches/br_yyyy_v3.1.0_20170523";
		List<String> pathList = new ArrayList<>();
		List<SVNLogEntry> logs = new SVNLog(url, username, password).getSVNLogs(6387,6402);//5837
		for (SVNLogEntry log : logs) {
			if (log.getAuthor().equals("xyadmin")) {
				continue;
			}
			System.out.println(log.getAuthor()+ ", 版本号:"+log.getRevision()+", 日期:"+ format(log.getDate()));
			Map<String, SVNLogEntryPath> paths = log.getChangedPaths();
			Iterator<String> its = paths.keySet().iterator();
			while (its.hasNext()) {
				String key = its.next();
				String path = paths.get(key).getPath();
				if(path.startsWith(prefixDir) && path.indexOf(".") !=-1){
					pathList.add(path);					
				}
			}
		}
		SVNLogEntry lastLog = logs.get(logs.size() - 1);
		System.out.println("文件数:"+pathList.size()+", 版本号:"+lastLog.getRevision()+", 日期:"+ format(lastLog.getDate()));
		
		for (String path : pathList) {
			path = path.replace(prefixDir, "");
			String srcPath = copeDir + path;
			String destDir = targetDir +path.substring(0, path.lastIndexOf("/"));
			FileUtils.copyGeneralFile(srcPath, destDir);
		}
		System.out.println("===================== corp over  =====================");
	}
	
	private static String format(Date date){
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		return format.format(date);
	}

}

 

package com.rd.svn;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.Properties;

/*
 * Java实现文件复制、剪切、删除操作
 * 文件指文件或文件夹
 * 文件分割符统一用"//"
 */

public class FileUtils {

	/**
	 * 复制文件或文件夹
	 * 
	 * @param srcPath
	 * @param destDir
	 *            目标文件所在的目录
	 * @return
	 */
	public static boolean copyGeneralFile(String srcPath, String destDir) {
		boolean flag = false;
		File file = new File(srcPath);
		if (!file.exists()) {
			return false;
		}
		if (file.isFile()) { // 源文件
			flag = copyFile(srcPath, destDir);
		} else if (file.isDirectory()) {
			//System.out.println(srcPath+":"+destDir);
			//flag = copyDirectory(srcPath, destDir);
		}
		return flag;
	}

	/**
	 * 复制文件
	 * 
	 * @param srcPath
	 *            源文件绝对路径
	 * @param destDir
	 *            目标文件所在目录
	 * @return boolean
	 */
	private static boolean copyFile(String srcPath, String destDir) {
		boolean flag = false;

		File srcFile = new File(srcPath);
		if (!srcFile.exists()) { // 源文件不存在
			//System.out.println("源文件不存在");
			return false;
		}
		// 获取待复制文件的文件名
		String fileName = srcPath
				.substring(srcPath.lastIndexOf("/"));
		String destPath = destDir + fileName;
		if (destPath.equals(srcPath)) { // 源文件路径和目标文件路径重复
			//System.out.println("源文件路径和目标文件路径重复!");
			return false;
		}
		File destFile = new File(destPath);
		if (destFile.exists() && destFile.isFile()) { // 该路径下已经有一个同名文件
			//System.out.println("目标目录下已有同名文件!");
			destFile.delete();
		}

		File destFileDir = new File(destDir);
		destFileDir.mkdirs();
		
		try {
			FileInputStream fis = new FileInputStream(srcPath);
			FileOutputStream fos = new FileOutputStream(destFile);
			byte[] buf = new byte[1024];
			int c;
			while ((c = fis.read(buf)) != -1) {
				fos.write(buf, 0, c);
			}
			fis.close();
			fos.close();

			flag = true;
		} catch (IOException e) {
			e.printStackTrace();
		}

		if (flag) {
			//System.out.println("复制文件成功!");
		}

		return flag;
	}

	/**
	 * 
	 * @param srcPath
	 *            源文件夹路径
	 * @param destPath
	 *            目标文件夹所在目录
	 * @return
	 */
	private static boolean copyDirectory(String srcPath, String destDir) {
		//System.out.println("复制文件夹开始!");
		boolean flag = false;

		File srcFile = new File(srcPath);
		if (!srcFile.exists()) { // 源文件夹不存在
			//System.out.println("源文件夹不存在");
			return false;
		}
		// 获得待复制的文件夹的名字,比如待复制的文件夹为"E://dir"则获取的名字为"dir"
		String dirName = getDirName(srcPath);
		// 目标文件夹的完整路径
		String destPath = destDir + File.separator + dirName;
		// //System.out.println("目标文件夹的完整路径为:" + destPath);

		if (destPath.equals(srcPath)) {
			//System.out.println("目标文件夹与源文件夹重复");
			return false;
		}
		File destDirFile = new File(destPath);
		if (destDirFile.exists()) { // 目标位置有一个同名文件夹
			//System.out.println("目标位置已有同名文件夹!");
			return false;
		}
		destDirFile.mkdirs(); // 生成目录

		File[] fileList = srcFile.listFiles(); // 获取源文件夹下的子文件和子文件夹
		if (fileList.length == 0) { // 如果源文件夹为空目录则直接设置flag为true,这一步非常隐蔽,debug了很久
			flag = true;
		} else {
			for (File temp : fileList) {
				if (temp.isFile()) { // 文件
					flag = copyFile(temp.getAbsolutePath(), destPath);
				} else if (temp.isDirectory()) { // 文件夹
					flag = copyDirectory(temp.getAbsolutePath(), destPath);
				}
				if (!flag) {
					break;
				}
			}
		}

		if (flag) {
			//System.out.println("复制文件夹成功!");
		}

		return flag;
	}

	/**
	 * 获取待复制文件夹的文件夹名
	 * 
	 * @param dir
	 * @return String
	 */
	private static String getDirName(String dir) {
		if (dir.endsWith(File.separator)) { // 如果文件夹路径以"//"结尾,则先去除末尾的"//"
			dir = dir.substring(0, dir.lastIndexOf(File.separator));
		}
		return dir.substring(dir.lastIndexOf(File.separator) + 1);
	}

	/**
	 * 删除文件或文件夹
	 * 
	 * @param path
	 *            待删除的文件的绝对路径
	 * @return boolean
	 */
	public static boolean deleteGeneralFile(String path) {
		boolean flag = false;

		File file = new File(path);
		if (!file.exists()) { // 文件不存在
			//System.out.println("要删除的文件不存在!");
		}

		if (file.isDirectory()) { // 如果是目录,则单独处理
			flag = deleteDirectory(file.getAbsolutePath());
		} else if (file.isFile()) {
			flag = deleteFile(file);
		}

		if (flag) {
			//System.out.println("删除文件或文件夹成功!");
		}

		return flag;
	}

	/**
	 * 删除文件
	 * 
	 * @param file
	 * @return boolean
	 */
	private static boolean deleteFile(File file) {
		return file.delete();
	}

	/**
	 * 删除目录及其下面的所有子文件和子文件夹,注意一个目录下如果还有其他文件或文件夹
	 * 则直接调用delete方法是不行的,必须待其子文件和子文件夹完全删除了才能够调用delete
	 * 
	 * @param path
	 *            path为该目录的路径
	 */
	private static boolean deleteDirectory(String path) {
		boolean flag = true;
		File dirFile = new File(path);
		if (!dirFile.isDirectory()) {
			return flag;
		}
		File[] files = dirFile.listFiles();
		for (File file : files) { // 删除该文件夹下的文件和文件夹
			// Delete file.
			if (file.isFile()) {
				flag = deleteFile(file);
			} else if (file.isDirectory()) {// Delete folder
				flag = deleteDirectory(file.getAbsolutePath());
			}
			if (!flag) { // 只要有一个失败就立刻不再继续
				break;
			}
		}
		flag = dirFile.delete(); // 删除空目录
		return flag;
	}

	/**
	 * 由上面方法延伸出剪切方法:复制+删除
	 * 
	 * @param destDir
	 *            同上
	 */
	public static boolean cutGeneralFile(String srcPath, String destDir) {
		if (!copyGeneralFile(srcPath, destDir)) {
			//System.out.println("复制失败导致剪切失败!");
			return false;
		}
		if (!deleteGeneralFile(srcPath)) {
			//System.out.println("删除源文件(文件夹)失败导致剪切失败!");
			return false;
		}

		//System.out.println("剪切成功!");
		return true;
	}

	public static void main(String[] args) throws IOException {
		//copyGeneralFile("E:\\test.txt", "E:\\New.txt"); // 复制文件
//		copyGeneralFile("E://hello", "E://world"); // 复制文件夹
//		deleteGeneralFile("E://onlinestockdb.sql"); // 删除文件
//		deleteGeneralFile("E://woman"); // 删除文件夹
		//cutGeneralFile("E://hello", "E://world"); // 剪切文件夹
		//cutGeneralFile("E:\\test.txt", "E:\\Cow"); // 剪切文件
		InputStream in = ClassLoader.getSystemResourceAsStream("care.properties");
		URL url = ClassLoader.getSystemResource("care.properties");
		//System.out.println(url.getPath());
		//System.out.println(url.toString());
		Properties p = new Properties();
		p.setProperty("lastTime", "2016-5-27 9:15:56");
		OutputStream os = new FileOutputStream(url.getPath());
		p.store(os, "little");
	}

}

 

package com.rd.svn;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.tmatesoft.svn.core.*;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.wc.SVNWCUtil;
/**
 * 日志查询类
 * @author lwp
 *
 */
public class SVNLog {
	
	private String url;
	private String username;
	private String password;
	private SVNRepository repository;

	public SVNLog(String url, String username, String password)
			throws SVNException {
		this.url = url;
		this.username = username;
		this.password = password;
		// 版本库初始化
		DAVRepositoryFactory.setup();
		repository = DAVRepositoryFactory.create(SVNURL.parseURIEncoded(url));
		ISVNAuthenticationManager authManager = SVNWCUtil
				.createDefaultAuthenticationManager(username, password);
		repository.setAuthenticationManager(authManager);
	}
	public List<SVNLogEntry> getSVNLogs(long startRevision, long endRevision) {
		try {
			// 存放结果
			List<SVNLogEntry> logEntries = new ArrayList<SVNLogEntry>();
			repository.log(new String[] { "/" }, logEntries, startRevision,
					endRevision, true, true);
			return logEntries;
		} catch (Exception ex) {
			System.out.println(ex.toString());
			return null;
		}
	}

	public List<SVNLogEntry> getSVNLogs(long startRevision) {
		long lastRevision = 0;
		try {
			lastRevision = repository.getLatestRevision();
			return getSVNLogs(startRevision,lastRevision);
		} catch (SVNException e) {
			e.printStackTrace();
			return null;
		}
	}
	//获取今日提交记录
	public List<SVNLogEntry> getSVNLogs() {
		long lastRevision = 0;
		long startRevision=0;
		DateFormat format = new SimpleDateFormat("yyyy-MM-dd"); 		
		try {
			Date today = format.parse(format.format(new Date(new Date().getTime()-24*60*60*1000)));
			startRevision = repository.getDatedRevision(today);
			//lastRevision = repository.getLatestRevision();
			return getSVNLogs(startRevision,-1);
		} catch (SVNException e) {
			e.printStackTrace();
			
			return null;
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}	
	public static void main(String[] args) throws SVNException {
		String url = "svn://XX";
		
		String username = "XX";
		String password = "XX";
		List<SVNLogEntry> logs = new SVNLog(url, username, password)
				.getSVNLogs();
		for (SVNLogEntry log : logs) {
			System.out.println(log.getDate());
		}
	}
}

 

分享到:
评论

相关推荐

    javaweb工程自动增量发布小工具

    在这个小工具中,通过比较当前版本与上一个发布版本的文件,确定哪些是新增、修改或删除的文件,然后只打包这些文件。 4. **自动化发布流程**:自动化的发布过程减少了人为错误的可能性,提高了发布效率。这个工具...

    基于ant和svnkit的WebProject增量打包工具(一)

    首先,下载工具后,解压到任意文件夹下。接下来就得为该工具配置环境变量(其实不配也行,就是以后调用麻烦点就是了^@^),比如我将其解压到E盘的根目录下,那么就得在window的环境变量中的path中配置上路径:“E:\...

    java实现svn更新和提交.rar

    SVNKit 是一个纯 Java 的 SVN 客户端库,它提供了与 SVN 服务器交互的全面功能,包括但不限于创建、更新、提交、分支、合并等操作。而 SVNKit-CLI 是 SVNKit 的命令行接口,允许通过 Java 程序调用 SVN 命令行工具。...

    基于MATLAB GUI的学生成绩管理系统:功能实现与应用

    内容概要:本文介绍了一款基于MATLAB GUI的学生成绩管理系统,旨在提升学校教学管理的效率和准确性。系统主要由三个模块组成:考试收录数据模块、考试数据分析模块和统计分析数据模块。它不仅支持成绩的录入、显示、排序、查找,还包括特征值分析、直方图绘制和教师评语录入等功能。通过对成绩数据的综合分析,系统能为学校教学管理提供客观科学的数据支持。 适合人群:教育工作者(如教师、管理人员)和技术爱好者(特别是对MATLAB GUI感兴趣的开发者)。 使用场景及目标:适用于各类学校和教育机构,用于管理和分析学生成绩,帮助教师和管理者更好地了解学生的学习状况,改进教学质量。 阅读建议:对于希望深入了解如何利用MATLAB GUI进行学生成绩管理的读者来说,本文提供了详细的系统设计思路和功能实现方法,值得仔细研读并尝试实践。

    基于T-Mats库的涡扇发动机气路故障仿真模型:自定义故障植入与真实运行扰动分析

    内容概要:本文介绍了基于T-Mats库的涡扇发动机气路故障仿真模型,涵盖了多种类型的故障植入(如部件流量、效率及压比故障),并允许自定义故障程序和组合。该模型通过对软阈值去噪处理后的信号序列进行分析,提取真实的运行扰动信息,确保输出数据符合CMAPASS的排列要求。此外,该模型能够模拟航空发动机的典型气路故障,帮助研发和技术人员更准确地预测和评估发动机性能,从而提前采取预防措施。 适合人群:航空航天领域的研发人员、技术人员以及对航空发动机故障仿真感兴趣的学者。 使用场景及目标:①用于研究和开发涡扇发动机的气路故障诊断系统;②辅助工程师进行故障预测和性能评估;③为后续数据分析和实验验证提供可靠的数据基础。 其他说明:该模型不仅提高了仿真的准确性,还增强了对发动机运行状态的理解,为提升发动机性能和可靠性提供了强有力的技术支持。

    scratch少儿编程逻辑思维游戏源码-scratch冒险.zip

    scratch少儿编程逻辑思维游戏源码-scratch冒险.zip

    少儿编程scratch项目源代码文件案例素材-爬塔.zip

    少儿编程scratch项目源代码文件案例素材-爬塔.zip

    合金凝固模型中的相场模拟与各向异性枝晶生长研究及其在激光增材制造中的应用

    内容概要:本文详细探讨了合金凝固模型中的相场模拟方法及其在各向异性枝晶生长研究中的应用。首先介绍了合金凝固模型的基本概念及其在现代制造业中的重要性,特别是在激光增材制造、选择性激光熔融和定向凝固技术中的应用。接着,重点讨论了相场模拟作为一种数值模拟方法,在预测合金凝固过程中组织结构演变方面的关键作用。文中还提供了MATLAB实现合金各向异性枝晶生长的具体代码及详细注释,以及Comsol用于偏微分方程求解的雪花生长模型。最后,文章总结了当前的研究进展,并展望了未来的发展趋势。 适合人群:从事材料科学、冶金工程、激光增材制造领域的研究人员和技术人员,尤其是对相场模拟和合金凝固感兴趣的学者。 使用场景及目标:适用于希望深入了解合金凝固过程、相场模拟方法及其在现代制造技术中应用的专业人士。目标是提高对合金凝固机制的理解,优化制造工艺,提升产品质量。 其他说明:文章不仅提供了理论分析,还包括具体的代码实现和详细的文献参考资料,有助于读者全面掌握相关技术和最新研究进展。

    少儿编程scratch项目源代码文件案例素材-史莱姆出击.zip

    少儿编程scratch项目源代码文件案例素材-史莱姆出击.zip

    少儿编程scratch项目源代码文件案例素材-忍者酷跑.zip

    少儿编程scratch项目源代码文件案例素材-忍者酷跑.zip

    scratch少儿编程逻辑思维游戏源码-点击灌篮.zip

    scratch少儿编程逻辑思维游戏源码-点击灌篮.zip

    基于RBF神经网络的PID控制器在PMSM转速环中的Simulink模型设计与性能分析

    内容概要:本文介绍了将基于RBF神经网络的PID控制器应用于永磁同步电机(PMSM)转速环控制的方法及其性能优势。传统的PID控制器在面对非线性和时变系统时存在参数整定困难的问题,而引入RBF神经网络可以实现实时在线调参,提高系统的灵活性和鲁棒性。文中详细描述了Simulink模型的设计,特别是Matlab s-function模块中RBF神经网络的具体实现,包括高斯函数激活和带惯性的权值更新机制。实验结果显示,在转速突变情况下,改进后的控制器能够迅速稳定系统,超调量控制在2%以内,调节时间较传统方法缩短约40%,并且在负载变化时表现出色,无需重新整定参数。 适合人群:从事电机控制系统研究和开发的技术人员,尤其是对PID控制器优化感兴趣的工程师。 使用场景及目标:适用于需要提升PMSM转速环控制精度和响应速度的应用场合,如工业自动化设备、机器人等领域。目标是通过引入智能算法解决传统PID控制器参数整定难题,提高系统性能。 阅读建议:关注RBF神经网络与PID控制器结合的具体实现细节,特别是在Matlab s-function模块中的编码技巧以及参数调整策略。同时,注意学习率的选择和动量项的作用,这对于实际应用至关重要。

    scratch少儿编程逻辑思维游戏源码-Scratch 奔跑.zip

    scratch少儿编程逻辑思维游戏源码-Scratch 奔跑.zip

    基于COMSOL有限元仿真的变压器辐射传热数值分析:从入门到进阶

    内容概要:本文详细介绍了基于COMSOL有限元软件的变压器辐射传热数值分析方法。首先,解释了变压器内外辐射传热的基本机理,包括热量通过传导、对流和辐射的方式传递,重点在于辐射传热的作用及其数学描述。接着,逐步引导读者从零开始构建有限元仿真模型,涵盖模型参数确定、网格划分、材料属性定义、边界条件设置、传热方程设定、仿真运行及结果分析等多个步骤。最后,探讨了进一步研究的方向,如不同因素(温度、材料属性、几何形状)对辐射传热的影响,以及该模型在电力电子设备和热管理系统的潜在应用。 适合人群:电气工程专业学生、初学者和技术爱好者,尤其是对有限元仿真和变压器辐射传热感兴趣的群体。 使用场景及目标:适用于希望通过实际操作掌握有限元仿真技能的人群,旨在帮助他们理解变压器辐射传热机制并能独立完成相关仿真项目。 其他说明:本文不仅提供了理论知识,还附带了详细的视频教程和仿真模型,使学习过程更加直观易懂。

    交错并联Boost PFC仿真电路模型:基于双闭环控制的BCM模式优化与应用

    内容概要:本文详细介绍了交错并联Boost PFC(功率因数校正)仿真电路模型的设计与实现,特别是在临界BCM模式下的双闭环控制特性。文章首先解释了该电路的经典结构及其优势,即能够有效降低开关损耗和电流纹波。接着,重点讨论了双闭环控制的具体实现方法,包括外环电压控制和内环电流控制的MATLAB/Simulink代码示例。文中还特别强调了电流环中零交叉检测的重要性以及交错并联结构中驱动信号相位差的精确设置。此外,作者分享了将模型从Simulink转换到Plecs和Psim时遇到的问题及解决方案,如更换为带反向恢复特性的二极管模型和重新校准控制环路的采样周期。最后,文章展示了优化后的电流波形图,验证了所提方法的有效性。 适合人群:电力电子工程师、电源设计师、从事电力系统仿真的研究人员和技术爱好者。 使用场景及目标:适用于需要进行高效电源设计的研究和开发项目,旨在提高电源系统的性能,减少谐波失真,提升功率因数校正效果。 其他说明:文中提供的具体代码片段和参数设置有助于读者更好地理解和复现实验结果。同时,对于希望深入理解双闭环控制系统和BCM模式的人来说,本文提供了宝贵的实践经验。

    scratch少儿编程逻辑思维游戏源码-3000 横版闯过.zip

    scratch少儿编程逻辑思维游戏源码-3000 横版闯过.zip

    空气涡轮发动机Matlab/Simulink动态仿真模型:部件级建模与PID控制应用

    内容概要:本文介绍了如何利用Matlab/Simulink构建空气涡轮发动机的动态仿真模型。首先,文章详细阐述了各个部件级模型的设计,包括进气道、涡轮、气室、压气机、尾喷管、转子动力学模块和容积模块。接着,重点讨论了PID控制器在维持发动机转速恒定方面的作用,尤其是在面对输出扭矩阶跃扰动时的表现。最后,提供了简单的Simulink模型代码片段,展示了如何设置和运行仿真模型,以便实时监控和调整发动机性能。 适合人群:航空航天工程领域的研究人员和技术人员,尤其是那些对空气涡轮发动机仿真感兴趣的读者。 使用场景及目标:适用于希望通过Matlab/Simulink进行空气涡轮发动机仿真研究的专业人士。主要目标是掌握空气涡轮发动机各部件的工作原理及其相互关系,同时学会使用PID控制器优化发动机性能。 其他说明:本文不仅提供了理论知识,还附有实际操作步骤和代码示例,帮助读者更好地理解和应用所学内容。

    少儿编程scratch项目源代码文件案例素材-收集能量.zip

    少儿编程scratch项目源代码文件案例素材-收集能量.zip

    scratch少儿编程逻辑思维游戏源码-弹回的球.zip

    scratch少儿编程逻辑思维游戏源码-弹回的球.zip

Global site tag (gtag.js) - Google Analytics