`
happyqing
  • 浏览: 3205703 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

svn生成上线源码清单,版本号,用户名,源文件

    博客分类:
  • SVN
阅读更多

 

项目上线需要生成上线源码清单

需要的列

源码名称,源码路径,类型,SVN版本号,提交日期,开发人员

 

工具:

Setup-Subversion-1.6.23.msi 对应 TortoiseSVN 1.6

Setup-Subversion-1.7.22.msi 对应 TortoiseSVN 1.7

Setup-Subversion-1.8.14.msi 对应 TortoiseSVN 1.8

下载地址:

http://happyqing.iteye.com/blog/2270112

 

如果Subversion版本低会报错:

svn:  警告: “D:\subversion\PRO\trunk\sourcecode\projectName”不是工作副本

 

svn: 路径 'D:\subversion\PRO\trunk\sourcecode\projectName' 好像是 Subversion 1.7 或更高版本的工作
副本。请升级你的 Subversion客户端,以使用此工作副本。

 

 

命令:

安装好后,先配置环境变量。

svn stauts:从本地副本统计信息 

svn status -v D:\subversion\PRO\trunk\sourcecode\projectName> projectNameManifest.txt

此命令没能列出提交时间

 

生成这样的文本

                 3        3 happyqing  D:\subversion\PRO\trunk\sourcecode\projectName\src\org\jeecgframework\core\annotation
M                3        3 happyqing  D:\subversion\PRO\trunk\sourcecode\projectName\src\org\jeecgframework\core\annotation\Ehcache.java
?                3        3 happyqing  D:\subversion\PRO\trunk\sourcecode\projectName\src\org\jeecgframework\core\annotation\JeecgEntityTitle.java

 

 第1列     第2列    第3列    第4列    第5列

 状态       ?          版本号  用户名   源文件

 

状态是?的是本地新增的,M本地修改,还有其他的需要先处理

 

整理

生成的文本文件虽然可用,但是用起来太麻烦,需要整理

用程序整理后的效果:

Ehcache.java	projectName\src\org\jeecgframework\core\annotation\Ehcache.java		3	2016/1/6	赵一
JeecgEntityTitle.java	projectName\src\org\jeecgframework\core\annotation\JeecgEntityTitle.java		3	2016/1/6	赵一

往excel里粘贴时,右键 粘贴选项 A (只保留文本)

 

工具类

package util;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * SVN源码清单
 * 第一步 用svn命令生成原始清单
 * svn status -v D:\subversion\PRO\trunk\sourcecode\projectName > projectNameManifest.txt
 * @author happyqing
 * @Since 2016.1.13
 */
public class SVNManifest {
	
    private static String pathPrefix;
    private static Map<String, String> userNameMap = new HashMap<String, String>();
    private static Map<String, String> directoryDateMap = new HashMap<String, String>();
	
    /**
     * 读写txt文件
     * @param sourceFilePath
     * @param destFilePath
     */
	public static void readWriteTxt(String sourceFilePath, String destFilePath){
		try {
			File file = new File(sourceFilePath);
			File dest = new File(destFilePath);
			//BufferedReader reader = new BufferedReader(new FileReader(file)); //乱码
			BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"GBK")); // 考虑到编码格式
			BufferedWriter writer = new BufferedWriter(new FileWriter(dest));
			String line = reader.readLine();
			int readLines = 0;
			int writeLines = 0;
			while ((line = reader.readLine()) != null) {
				readLines++;
				if(validateProcess(line)){
					line = processLine(line);
					writer.write(line);
					writeLines++;
				}
			}
			System.out.println("读入行:"+readLines);
			System.out.println("写入行:"+writeLines);
			writer.flush();
			reader.close();
			writer.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 判断一行是否需要处理
	 * @param line
	 * @return
	 */
	public static boolean validateProcess(String line){
		//?号开头的不要
		if(line.startsWith("?")){
			return false;
		}
		//是目录的不要
		if(line.indexOf(".") < 0){
			return false;
		}
		
		//只要resources、src、WebContent下的
//		if(!(txt.indexOf("projectName\\resources\\") > -1 || txt.indexOf("projectName\\src\\") > -1 || txt.indexOf("projectName\\WebContent\\") > -1)){
//			return false;
//		}
		boolean needProcess = false;
		//Map<String, String> map = new HashMap <String, String>();
		Iterator<Map.Entry<String, String>> entries = directoryDateMap.entrySet().iterator();      
		while(entries.hasNext()){
		    Map.Entry<String, String> entry = entries.next();
		    if(line.indexOf(entry.getKey())> 0){
		    	needProcess = true;
		    }
		}
		
		if(!needProcess){
			return false;
		}

		return true;
	}
	
	/**
	 * 处理一行文本
	 * @param line
	 * @return
	 */
	public static String processLine(String line){
		//把空格替换为tab
		String str1 = line.substring(0, line.indexOf(pathPrefix));	//前半截
		String str2 = line.substring(line.indexOf(pathPrefix));		//后半截,文件名中可能会有空格
		line = str1.replaceAll(" +", "\t") + str2;
		//添加文件名列
		String filePath = line.substring(line.lastIndexOf("\t")+1);
		String fileName = filePath.substring(filePath.lastIndexOf("\\")+1);
		line = line + "\t" + fileName; // + "\r\n";
		
		//把英文用户名替换为中文
		Iterator<Map.Entry<String, String>> entries = userNameMap.entrySet().iterator();      
		while(entries.hasNext()){
		    Map.Entry<String, String> entry = entries.next();
		    if(line.indexOf(entry.getKey()) > -1){
		    	line = line.replaceAll(entry.getKey(), entry.getValue());
		    }
		}
		
		//添加日期列(自定义日期)
		Iterator<Map.Entry<String, String>> entries2 = directoryDateMap.entrySet().iterator();      
		while(entries2.hasNext()){
		    Map.Entry<String, String> entry = entries2.next();
		    if(line.indexOf(entry.getKey()) > -1){
		    	line = line + "\t" + entry.getValue();
		    }
		}
		
		//换列的顺序(看需要)
		String[] columnArr = line.split("\t");
		line = columnArr[5] + "\t" + columnArr[4] + "\t" + columnArr[2] + "\\t" + columnArr[6] + "\t" + columnArr[3];
		line+="\r\n";
		
		//去掉文件路径前缀
		String pathPrefixRegex = pathPrefix.replaceAll("\\\\", "\\\\\\\\");
		//System.out.println(pathPrefix);
		line = line.replaceAll(pathPrefixRegex, "");
		return line;
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//文件路径前缀,会被替换为空字符串
		pathPrefix = "D:\\subversion\\PRO\\trunk\\sourcecode\\";
		
		//用户名替换为中文(也可以用Sting[][])
		userNameMap.put("\tzhaoyi\t", "\t赵一\t");
		userNameMap.put("\tqianer\t", "\t钱二\t");
		
		//自定义目录的更新日期,用TortoiseSVN版本库浏览器查看
		directoryDateMap.put("projectName\\resources\\", "2016/1/11");
		directoryDateMap.put("projectName\\src", "2016/1/6");
		directoryDateMap.put("projectName\\WebContent\\", "2015/12/30");

		SVNManifest.readWriteTxt("D:\\project\\document\\projectNameManifest.txt","D:\\project\\document\\projectNameManifestFormat.txt");

	}

}

 

 

分享到:
评论

相关推荐

    根据svn版本库自动生成版本号

    在软件开发过程中,版本控制是至关重要的,它帮助开发者跟踪代码的变更,管理不同阶段的项目状态。...这种方法尤其适用于持续集成/持续部署(CI/CD)流程,自动化的版本生成可以无缝集成到构建和发布流程中。

    SVN生成版本号

    在软件开发过程中,版本控制是至关重要的,它...总的来说,通过集成SVN和VS,开发团队可以更有效地管理代码版本,同时自动化版本号的生成和更新过程,确保每个构建都有唯一的标识,从而提高软件的可维护性和可靠性。

    生成svn清单列表工具

    SVN清单列表,通常指的是在SVN仓库中的所有文件和目录的详细列表,包括文件名、路径、版本号等信息。这个工具在Windows环境下对于项目管理和代码审查具有重要意义。它可以帮助开发者快速了解项目的状态,查看文件的...

    VS编译发布根据SVN自动更新版本号

    Visual Studio(VS)作为流行的开发环境,配合Subversion(SVN)这样的版本控制系统,可以实现自动化地在编译发布时更新版本号。本文将深入探讨如何在VS中配置和实现这一功能。 首先,理解版本号的重要性。版本号...

    svn用户名和密码的配置

    在软件开发过程中,版本控制系统是不可或缺的工具,其中Subversion(简称svn)是一个广泛应用的集中式版本控制系统。本文将详细讲解如何配置svn的用户名和密码,以便于有效地管理和控制代码库的访问权限。 首先,...

    svn重新设置用户名和密码

    在使用Subversion(简称svn)进行版本控制时,有时我们需要更改访问仓库的用户名和密码,例如因为人员变动或安全策略更新。本篇文章将详细介绍如何在不同的操作系统和客户端环境下,重新设置svn的用户名和密码。 ...

    svn 添加帐号与密码

    其中,Subversion(简称SVN)是一种广泛应用的集中式版本控制系统。本文将详细介绍如何在SVN服务器上添加新的账号及其密码,包括必要的配置步骤。 #### 二、SVN账号添加流程 添加SVN账号主要包括两个关键步骤:在`...

    获取svn最新版本号示例 以及svn常用命令

    本文将深入探讨如何获取svn的最新版本号,并介绍一些常用的svn命令。 首先,获取svn的最新版本号通常是为了确保你正在使用的代码是最新的,避免因版本过旧而遇到已解决的问题或错过新功能。有几种方法可以获取: 1...

    自动获取svn版本号,修改指定dll,exe版本信息

    自动获取工程svn提交的版本号,然后修改指定dll,exe的版本信息。最好达到的效果是,每次提交完svn后重新编译代码,会将最后提交的版本号写到version里比如:2.0.0.64,;2.0是大版本号,手动修改资源信息即可,后两...

    VS2017 自动获取SVN版本控制号

    本篇将详细介绍如何在VS2017中配置自动获取SVN版本控制号,以便在每次编译时更新代码中的版本号。 首先,我们需要了解SVN版本号是什么。SVN reversion版本号是Subversion仓库中特定提交的唯一标识,它反映了代码库...

    MyEclipse下修改SVN用户名密码

    在IT行业中,版本控制系统是开发团队协作的重要工具,其中Subversion(SVN)是一个广泛应用的集中式版本控制系统。本文将详细讲解如何在MyEclipse这个集成开发环境中修改SVN的用户名和密码,以便于团队成员在遇到...

    linux svn密码生成工具

    在Linux环境中,版本控制系统Subversion(SVN)是团队协作中常用的一种工具,用于管理和跟踪代码变更。然而,对于SVN管理员来说,有效地管理和分配用户密码是一项繁琐的任务,尤其是在需要频繁更改或设置新密码时。...

    SVN用户名密码查看软件

    SVN(Subversion)是一种广泛使用的版本控制系统,用于管理和跟踪文件和目录的变更。它允许团队成员协同工作,记录每次更改,以便于回溯、合并和恢复错误。在使用SVN的过程中,用户经常需要设置用户名和密码来访问...

    svnstat工具源码升级

    分享下svn状态统计工具SvnStat 是开源的 在源码的基础上我做了些改动 现在已经是重新打好的jar包了 使用方法很简单 无需checkout配置库到本地 方法如下: 1 打开cmd 获取配置库指定日期内的log: svn log ...

    SVN源代码泄露全版本Dump源码

    "SVN源代码泄露全版本Dump源码"这个标题暗示了一个完整的SVN仓库数据被泄露,其中包括了所有版本的历史记录。 在描述中提到的“全版本Dump源码”意味着泄露的数据包含了SVN仓库的完整导出,这通常是一个大型的...

    maven 简单实用的配置,打包,获取svn版本号

    maven 简单实用的配置,打包,获取svn版本号、仓库等等实用

    Ubuntu自动编译Android版本并提交SVN版本

    C.) 根据 SVN 版本库和代码库的版本号,当前时间戳自劢生成编译版本号。 D.) 自劢检测是否在 linux 版本库中生成版本文件夹,如 V0, V1 …等。 E.) 根据自劢生成的编译版本号替换编译版本中 buildinfo.sh 的版本号。...

    windows下在svn钩子中获取,项目名称,作者,日志,时间,版本号

    在windows环境下,提交代码到svn中,使用钩子脚本,获取项目名称,提交人,提交时间,提交的日志信息,版本号,纯bat脚本。ps:不是pre-commit.bat文件,因为在该文件中获取不到真正的版本号。

    SVN插件源码

    SVN(Subversion)是一种广泛使用的版本控制系统,用于管理和跟踪文件和目录的变更。这个压缩包文件中的内容看起来是关于SVN密码和用户名找回的源代码,这通常涉及到安全性和认证过程。以下是对这些文件的详细解读:...

    浅谈在eclipse中如何修改svn的用户名和密码

    在使用Eclipse集成的Subversion(SVN)客户端进行代码版本控制时,我们经常会遇到需要修改保存在本地的SVN用户名和密码的情况。这可能是由于密码变更或是用户名需要更新所导致。为了避免每次提交或更新代码时都手动...

Global site tag (gtag.js) - Google Analytics