`
hbxflihua
  • 浏览: 691403 次
  • 性别: 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 命令行工具。...

    基于Retinex模型与多尺度融合的低光照图像增强算法及其应用

    内容概要:本文介绍了一种基于Retinex模型和多尺度融合的低光照图像增强算法。首先,通过对原图像进行光照图分解并利用Retinex模型进行估计,再经过伽马矫正获得亮度均衡的图像。接着,为补偿伽马矫正当中的过曝细节丢失,进行了锐化处理以提升图像细节。最后,在多尺度融合金字塔模型下,根据不同输入图像的权重进行融合,从而得到最终的增强图像。文中还详细介绍了五个非参考图像质量评价指标(BRISQUE,CEIQ,ENIQA,NIQE,PIQE),用以评估算法的效果。 适合人群:从事计算机视觉、图像处理领域的研究人员和技术人员。 使用场景及目标:适用于需要在低光照条件下获取高质量图像的各种应用场景,如安防监控、自动驾驶、医疗影像等领域。目的是提高图像的亮度、对比度和细节,确保后续图像处理任务的有效性和准确性。 其他说明:该算法不仅提高了低光照环境拍摄照片的质量,也为其他计算机视觉应用提供了更好的图像素材,具有重要的社会和经济价值。

    scratch少儿编程逻辑思维游戏源码-奔跑吧!忍者.zip

    scratch少儿编程逻辑思维游戏源码-奔跑吧!忍者.zip

    基于人工蜂群算法的智能路径规划系统:全局搜索、鲁棒性强、灵活多用的路径规划解决方案

    内容概要:本文详细介绍了基于人工蜂群算法的路径规划系统。该算法模拟蜜蜂觅食行为,通过多个个体的并行搜索,实现了全局搜索能力强、鲁棒性和适应性强、适用范围广、算法设计灵活以及具有分布式计算能力等特点。文中还提供了简化的代码片段,展示了如何实现地图创建、保存和起始地点更改等功能,进一步解释了算法的具体实现方法。 适合人群:对路径规划算法感兴趣的科研人员、工程师和技术爱好者。 使用场景及目标:适用于复杂环境下的单目标或多目标路径规划问题,旨在帮助研究人员和开发者更好地理解和应用人工蜂群算法,提升路径规划系统的性能和效率。 其他说明:该算法不仅在理论上具有较高的研究价值,还在实际应用中展现了广泛的潜力,特别是在智能交通、机器人导航等领域。

    基于鲸鱼算法优化LSSVM回归模型:提高预测准确率与全局优化能力

    内容概要:本文介绍了如何使用鲸鱼算法优化最小二乘支持向量机(LSSVM)的回归预测模型。通过模拟鲸鱼群体的行为,优化LSSVM中的惩罚参数和核惩罚参数,提高了预测的准确性和可靠性。鲸鱼算法具有广泛的适用性、强大的全局优化能力和高效的计算特点,使其成为解决各类回归预测问题的有效工具。文中还提供了具体的Python代码实现,展示了从基本LSSVM预测到参数优化的具体步骤,并通过实验数据验证了优化后的模型在训练时间和预测精度上的显著优势。 适合人群:对机器学习、优化算法感兴趣的开发者和技术研究人员,尤其是希望深入了解和支持向量机优化的人群。 使用场景及目标:适用于需要提高回归预测准确性的应用场景,如金融预测、气象预报等领域。目标是通过优化模型参数,获得更高的预测精度和更快的计算速度。 其他说明:鲸鱼算法不仅在理论上具有优越性,在实际应用中也能显著提升模型性能。建议根据具体的数据规模调整算法参数,以达到最佳效果。

    scratch少儿编程逻辑思维游戏源码-超级猫.zip

    scratch少儿编程逻辑思维游戏源码-超级猫.zip

    scratch少儿编程逻辑思维游戏源码-超级马里奥世界 多人游戏.zip

    scratch少儿编程逻辑思维游戏源码-超级马里奥世界 多人游戏.zip

    scratch少儿编程逻辑思维游戏源码-丛林探险跑酷.zip

    scratch少儿编程逻辑思维游戏源码-丛林探险跑酷.zip

    【java】智能自助式停车场管理系统后台web管理服务器javaweb项目.zip

    【java】智能自助式停车场管理系统后台web管理服务器javaweb项目

    二阶系统PID控制器设计与仿真的灵活性及性能优化研究

    内容概要:本文详细介绍了二阶系统的PID控制器设计与仿真方法,展示了如何通过MATLAB进行系统建模和控制器参数调整。首先构建了一个典型的二阶系统作为例子,通过设置不同的PID参数(比例P、积分I、微分D),演示了如何优化系统的阶跃响应特性。文中还讨论了不同参数对系统稳定性的影响,以及如何应对非线性环节带来的挑战。此外,作者强调了PID控制器参数调整的重要性,并提供了几种实用技巧,如使用MATLAB内置工具pidTuner进行参数整定,以及尝试更换不同的被控对象来测试控制器的适应性和鲁棒性。 适合人群:自动化工程专业学生、从事工业控制系统设计的技术人员、对PID控制感兴趣的科研工作者。 使用场景及目标:① 学习如何利用MATLAB搭建二阶系统并设计PID控制器;② 掌握PID参数调整的基本方法及其对系统性能的影响;③ 提升解决实际工业控制问题的能力,特别是在面对复杂动态环境时。 阅读建议:读者可以通过跟随文中的步骤,在自己的环境中重现实验结果,从而加深对PID控制理论的理解。同时,鼓励读者尝试修改系统参数或引入新的干扰因素,进一步探索PID控制器的应用边界。

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

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

    少儿编程scratch项目源代码文件案例素材-圣诞老人VS机器人.zip

    少儿编程scratch项目源代码文件案例素材-圣诞老人VS机器人.zip

    基于AT89C51单片机交通灯课程设计

    【基于AT89C51单片机的交通灯系统】是电子工程领域中的一个经典实践项目,尤其适合初学者进行单片机编程和硬件控制的学习。AT89C51是一款广泛应用的8位微处理器,由美国Atmel公司生产,具有4KB的可编程Flash存储器,可以执行各种控制任务,包括交通灯系统的控制。 交通灯控制系统是城市交通管理的重要组成部分,通过红绿黄三色灯的变化来指示行人和车辆何时通行。在本项目中,交通灯系统采用AT89C51单片机作为核心控制器,通过编程实现红绿黄灯的定时切换,确保交通流畅且安全。 DSN(Design Suite Notation)文件,如`C51交通灯.DSN`,通常是在电路设计软件,如Keil uVision或Proteus中创建的工程文件。这种文件包含了整个项目的配置信息,包括源代码、元器件库、仿真设置等,使得开发者可以在虚拟环境中对交通灯系统进行仿真测试。Proteus是一款强大的电子电路仿真软件,可以直观地模拟硬件电路的行为,无需物理硬件即可验证设计的正确性。 数码管(7段显示器)是显示倒计时的关键部件。在这个项目中,数码管用于显示每个灯组的剩余时间,增强用户交互体验,使驾驶员和行人能够清晰了解何时转换灯色。AT89C51通过串行或并行接口与数码管连接,并通过特定的驱动程序代码控制数码管的显示内容。 编程方面,AT89C51使用C51语言编写,这是一种为8051系列单片机定制的C语言变体。代码中包含的详细注释对于初学者理解程序逻辑至关重要,通过注释可以学习如何设置定时器、中断服务子程序以及I/O端口操作,这些都是单片机编程的基础知识。 交通灯的控制通常基于定时器中断,例如,可以设置一个定时器在特定周期后触发中断,然后在中断服务程序中改变灯的状态。此外,为了实现数码管显示,可能需要用到移位寄存器和译码器等外围设备,这些都需要在代码中进行编程控制。 这个项目涵

    基于MATLAB的改进带记忆模拟退火算法求解TSP问题(多普勒型降温曲线)

    内容概要:本文介绍了一种基于MATLAB的改进带记忆模拟退火算法用于求解旅行商问题(TSP)。该算法引入了多普勒型降温曲线和记忆功能,使得算法在前期进行全局搜索而在后期进行精细调整。文中详细展示了算法的核心代码片段,如多普勒型降温曲线的实现和记忆功能的具体实现方式。此外,作者提供了对多个经典数据集(如att48、中国31/64/144城市数据)的测试结果,证明了该算法的有效性和优越性。同时,还给出了自定义数据集的测试方法和路径可视化的代码。 适合人群:对优化算法感兴趣的研究人员和技术爱好者,尤其是那些希望深入了解模拟退火算法及其应用的人群。 使用场景及目标:适用于需要解决复杂组合优化问题的场景,特别是涉及路径规划、物流配送等领域。目标是提供一种高效、稳定的解决方案,帮助用户快速获得高质量的解。 其他说明:本文不仅提供了完整的代码实现,还包括详细的解释和测试实例,便于读者理解和实践。对于想要进一步探索或修改算法的人来说,这是一个很好的起点。

    MMC-HVDC电能质量调节系统及其背靠背模块化多电平换流器在电网与粒子加速器中的应用

    内容概要:本文详细介绍了MMC-HVDC电能质量调节系统及其背靠背模块化多电平换流器(MMC)的工作原理和技术优势。MMC-HVDC系统主要用于保护敏感电网免受瞬态电压骤降的影响,通过内部能量存储和整流器控制线路电流,确保电网的稳定性。此外,该系统还具备无功功率补偿、低谐波失真和高冗余性的特点。文中特别提到MMC-HVDC在粒子加速器领域的应用和发展前景,强调了其在复杂环境中的适应性和可靠性。 适合人群:从事电力系统工程、电能质量管理、粒子加速器设计的研究人员和技术人员。 使用场景及目标:适用于需要解决瞬态电压骤降问题的电力系统,特别是在粒子加速器等对电能质量有较高要求的场合。目标是提高电网的稳定性和效率,减少设备损坏和系统不稳定性。 其他说明:文章还讨论了MMC-HVDC的设计和开发过程,包括模块化结构设计、能量存储优化和控制算法改进等方面的内容。

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

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

    scratch少儿编程逻辑思维游戏源码-暴徒危机.zip

    scratch少儿编程逻辑思维游戏源码-暴徒危机.zip

Global site tag (gtag.js) - Google Analytics