项目上线需要生成上线源码清单
需要的列
源码名称,源码路径,类型,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"); } }
相关推荐
build.properties文件是Ant的属性文件,它用来存储配置信息,如目录路径、版本号等。这些属性可以在build.xml中通过`${property.name}`引用,使得配置更加灵活。例如,你可以定义`src.dir=src/main/java`,然后在...
4. **代码分析**:Source Insight可以分析项目中的所有源文件,生成函数调用图、类继承图等,帮助开发者洞察项目整体结构。 5. **自定义设置**:用户可以根据个人习惯调整界面布局、快捷键设置,甚至编写自定义脚本...
- **正式版本**:采用“V”开头的标识方式,版本号由主版本号、次版本号和内部版本号组成。例如:“V2.0.1”表示主版本号为2,次版本号为0,内部版本号为1。 - **目录结构**:建议将配置项分为文档类、源码类与安装...
标题 "faces-1.7.7.tar-源码.rar" 提供的信息暗示这是一份名为 "faces" 的软件项目的源代码,版本号为 1.7.7,它被打包成一个 `.tar` 归档文件,然后可能通过RAR进行二次压缩。RAR是一种流行的文件压缩格式,通常...
此外,33个SVN版本控制文件说明了系统在开发过程中使用了版本控制系统来跟踪和管理代码变更,保证了代码的稳定性和可维护性。6个属性文件和4个JPG图片文件则可能是系统配置文件和界面素材,分别用于系统的配置和美化...
标题中的"sourceIn4.7z"暗示了这是一个包含源代码的7z格式压缩文件,其中的"4"可能指的是版本号或者是项目的一部分。7z是一种高压缩率的文件格式,由7-Zip软件创建,它在压缩效率和安全性上比传统的ZIP格式更胜一筹...
3. 详细的文件注释功能,Fisheye 对每一个源文件都进行了注释,包括作者、提交日期、版本号、以及提交代码等,并通过直观的图表进行显示; 4. 便捷的搜索功能,可以根据自己需要的文件名进行快速搜索,也可以直接...
`cmake-3.18.6-win64-x64.zip` 是CMake的一个Windows 64位版本的安装包,版本号为3.18.6。这个版本包含了CMake的所有核心组件,包括可执行文件、库、文档以及必要的支持文件,供用户在Windows环境下安装和使用CMake...