笔者最近开发的项目中,是通过SVN做为版本管理工具的,因为需要创建的文件太多,所以有许多文件是在原有文件基础上拷贝过来修改的,这里就涉及到一个问题,原有文件中注释里填的JAVA类名、作者工号、创建时间等,都是需要修改成我自己的,因为文件太多,一个个修改起来太麻烦,所以我写了一个程序来自动扫描这些文件并替换文件中指定注释。

1.需要从项目中筛选出我创建的文件:
这个就通过SVN提交日志来筛选吧,因为SVN提交历史中有提交人的工号,我通过筛选自己的工号就可以查出哪些文件是我的(当然需要注意的一点就是如果你改了别人的文件并提交,也会被筛选出,所以你可以对筛选出的文件做进一步的筛选,我这里就通过类名命名规则又筛了一次)。
查询SVN提交历史需要使用svnkit包,svnkit下载路径:svnkit这部分的实现类在后面提到的CheckSVNComment类中。2.替换文件中信息
文件筛选出来后,就需要检查该文件中注释信息是否正确,如果不正确的话,就需要替换成指定信息,我这里对注释中的文件名,作者,创建时间进行了检查(创建时间必须是有作者不正确的前提下才会检查)。
这部分的实现类在后面提到的ModifyFileContent类中。

import java.io.File;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set; 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.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.core.wc.SVNWCUtil; @SuppressWarnings("all")
public class CheckSVNComment { private static void setupLibrary() {
DAVRepositoryFactory.setup();
SVNRepositoryFactoryImpl.setup();
FSRepositoryFactory.setup();
} public static Set<String> svnFileList(String authorID) {
String url = "项目SVN路径";
String name = "svn帐号";
String password = "svn密码";
long startRevision = 0;
long endRevision = -1;
setupLibrary(); SVNRepository repository = null;
try {
repository = SVNRepositoryFactory.create(SVNURL.parseURIEncoded(url));
} catch (SVNException svne) {
svne.printStackTrace();
System.err.println(
"error while creating an SVNRepository for the location '" + url + "': " + svne.getMessage());
System.exit(1);
}
ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(name, password);
repository.setAuthenticationManager(authManager);
try {
endRevision = repository.getLatestRevision();
} catch (SVNException svne) {
System.err.println("error while fetching the latest repository revision: " + svne.getMessage());
System.exit(1);
} Collection logEntries = null;
try {
logEntries = repository.log(new String[] { "" }, null, startRevision, endRevision, true, true); } catch (SVNException svne) {
System.out.println("error while collecting log information for '" + url + "': " + svne.getMessage());
System.exit(1);
} Set<String> svnHistory = new HashSet<String>();
for (Iterator entries = logEntries.iterator(); entries.hasNext();) {
SVNLogEntry logEntry = (SVNLogEntry) entries.next();
// 指定作者
if (!authorID.equals(logEntry.getAuthor())) {
continue;
}
if (logEntry.getChangedPaths().size() > 0) {
Set changedPathsSet = logEntry.getChangedPaths().keySet();
for (Iterator changedPaths = changedPathsSet.iterator(); changedPaths.hasNext();) {
SVNLogEntryPath entryPath = (SVNLogEntryPath) logEntry.getChangedPaths().get(changedPaths.next()); String filePath = entryPath.getPath();
if (filePath.endsWith("java")) {
svnHistory.add(filePath);
}
}
}
}
System.out.println("检查出当前作者提交的文件数:" + svnHistory.size()); return svnHistory;
} public static void checkFileComment(String path, String authorID) {
ModifyFileContent f = new ModifyFileContent();
File file = new File(path);
String target = " * FileName";
String newContent = " * FileName: " + file.getName();
f.operationFile(file, target, newContent, authorID);
} public static void main(String[] args) {
String authorID = "工号ID";
Set<String> svnHistory = CheckSVNComment.svnFileList(authorID);
for (String filePath : svnHistory) {
// if (filePath.toLowerCase().indexOf("message")>=0 || filePath.toLowerCase().indexOf("singlewithdraw")>=0)
// {
// System.out.println(filePath);
String newFilePath = filePath.replace("/branches/", "D:\\project\\").replace("/", "\\"); // 检查文件中注释信息
checkFileComment(newFilePath, authorID);
// }
}
}
}
package zz.test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry; public class ModifyFileContent { private String target; private String newContent; private static final Map<String, String> necessaryMap = new HashMap<String, String>(); private static final Map<String, String> choiceMap = new HashMap<String, String>(); static {
choiceMap.put(" * Date", " * Date: 2017/7/17 15:26");
choiceMap.put(" * @DATE", " * @DATE 2017/7/17 15:26");
} public ModifyFileContent() {
} private String checkLine(String originalLine, boolean flag) {
if (originalLine.startsWith(this.target) && !originalLine.equals(this.newContent)) {
return newContent;
}
for (Entry<String, String> entry : necessaryMap.entrySet()) {
if (originalLine.startsWith(entry.getKey()) && !originalLine.equals(entry.getValue())) { return entry.getValue();
}
}
if (!flag) {
return null;
}
for (Entry<String, String> entry : choiceMap.entrySet()) {
if (originalLine.startsWith(entry.getKey()) && !originalLine.equals(entry.getValue())) { return entry.getValue();
}
} return null;
} public void operationFile(File file, String target, String newContent, String authorID) {
this.target = target;
this.newContent = newContent; necessaryMap.put(" * Author", " * Author: " + authorID);
necessaryMap.put(" * @USER", " * @USER " + authorID); try {
InputStream is = new FileInputStream(file);
BufferedReader reader = new BufferedReader(new InputStreamReader(is)); String filename = file.getName();
// tmpfile为缓存文件,代码运行完毕后此文件将重命名为源文件名字。
File tmpfile = new File(file.getParentFile().getAbsolutePath() + "\\" + filename + ".tmp"); BufferedWriter writer = new BufferedWriter(new FileWriter(tmpfile)); boolean flag = false;
String str = null;
while (true) {
str = reader.readLine(); if (str == null)
break; String newLine = checkLine(str, flag);
if (newLine != null) {
writer.write(newLine + "\n");
flag = true;
} else {
writer.write(str + "\n");
}
} is.close(); writer.flush();
writer.close(); if (flag) {
file.delete();
tmpfile.renameTo(new File(file.getAbsolutePath()));
} else {
tmpfile.delete();
}
} catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) {
System.out.println("+++++++++ start");
ModifyFileContent f = new ModifyFileContent();
File file = new File("C:\\Users\\XXXXXX\\Desktop\\MessageNoticeJob.java");
String target = " * FileName";
String newContent = " * FileName: " + file.getName();
String authorID = "工号ID";
f.operationFile(file, target, newContent, authorID);
System.out.println("+++++++++ end");
} }

  

如:

/*
* Copyright (C), 2002-2015, XXXXXX公司
* FileName: RechargeSuccessCallBackHandler.java
* Author: 11111111
* Date: 2017/3/6 11:31
* Description: //模块目的、功能描述
* History: //修改记录
* <author> <time> <version> <desc>
* 修改人姓名 修改时间 版本号 描述
*/
package xxxxxx;

import xxxxxx;

/**
* 〈一句话功能简述〉
* 〈出款处理器〉
*
* @USER 11111111
* @DATE 2017/3/6 11:31
* @SEE [相关类/方法](可选)
* @SINCE [产品/模块版本] (可选)
*/

修改后:

/*
* Copyright (C), 2002-2015, XXXXXX公司
* FileName: SingleWithdrawRefundTicketCallBackHandler.java
* Author: 12345678
* Date: 2017/7/17 15:26
* Description: //模块目的、功能描述
* History: //修改记录
* <author> <time> <version> <desc>
* 修改人姓名 修改时间 版本号 描述
*/
package XXXXXX;

import XXXXXX;

/**
* 〈一句话功能简述〉
* 〈出款处理器〉
*
* @USER 12345678
* @DATE 2017/7/17 15:26
* @SEE [相关类/方法](可选)
* @SINCE [产品/模块版本] (可选)
*/

基于SVN提交历史筛选作者并修改文件内容的更多相关文章

  1. 绕过基于签名的XSS筛选器:修改HTML

    绕过基于签名的XSS筛选器:修改HTML 在很多情况下,您可能会发现基于签名的过滤器只需切换到一个不太熟悉的执行脚本的方法即可.如果失败了,您需要查看混淆攻击的方法. 本文提供了HTML语法可以被混淆 ...

  2. Web 在线文件管理器学习笔记与总结(5)修改文件内容

    ① 读出要修改的文件的内容 ② 进行修改 ③ 将修改后的内容写进文件 index.php: <?php require 'dir.func.php'; require 'file.func.ph ...

  3. java修改文件内容

    文件的读和写,大家都不陌生,但是修改呢?按照普通的读写流去修改的话,只能全部读取出来,在内存中修改好后,全部写进去,这样对于文件内容过多的时,性能很低. 最近在遇到这个问题的时候,发现RandomAc ...

  4. python笔记(三)---文件读写、修改文件内容、处理json、函数

    文件读写(一) #r 只读,打开文件不存在的话,会报错 #w 只写,会清空原来文件的内容 #a 追加写,不会请求,打开的文件不存在的话,也会帮你新建的一个文件 print(f.read()) #获取到 ...

  5. Java之修改文件内容:字符串逐行替换

    依赖包: <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</a ...

  6. linux下C++修改文件内容

    C fwrite在任意位置写入文件,并可修改文件内容 想实现类似迅雷那样下载时可以从文件半中间写入的功能 #include<stdio.h> int main() { FILE *fp; ...

  7. python 修改文件内容

    python 修改文件内容 一.修改原文件方式 1 def alter(file,old_str,new_str): 2 """ 3 替换文件中的字符串 4 :param ...

  8. python 文件操作(二) 替换性修改文件内容

    正常情况我们想要仅对文件某一行的内容进行修改,而不改变其他内容,在原文件的基础上不能修改,因为当我们对原文件进行写操作时,如果原文件里面有内容,就会清空,在这种情况下,只能对文件进行替换性修改:即重新 ...

  9. Python修改文件内容

    工作中要写个脚本来修改文件的内容,然后就写了一个刷子: #coding:utf8 import os def modify_file(old_file, new_version, old_versio ...

随机推荐

  1. Day11作业及默写

    1.写函数,传入n个数,返回字典{'max':最大值,'min':最小值} 例如:min_max(2,5,7,8,4) 返回:{'max':8,'min':2}(此题用到max(),min()内置函数 ...

  2. LeetCode—66、88、118、119、121 Array(Easy)

    66. Plus One Given a non-negative integer represented as a non-empty array of digits, plus one to th ...

  3. 基于链路的OSPF简单口令认证

    实验要求:掌握基于链路的OSPF简单口令认证 拓扑如下: 配置如下: R1enable configure terminal interface s0/0/0ip address 192.168.1. ...

  4. lvm创建和快照

    查看磁盘 创建分区 新建1G的1分区 新建1G的2分区 新建1G的3分区 查看新建的分区 因标准分区是83交换分区是82做lv是8e所以要改变类型 查看: 保存退出: 创建物理卷pv 将物理卷pv创建 ...

  5. Python学习笔记第二十三周(Flask架构)

    目录: 一.变量引用 内容: 备注:PyCharm小技巧,comm+alt+l  自动修改格式,comm+alt+return  向上添加新行 一.变量引用 1.url生成 from flask im ...

  6. BT觀念分享和常見問題彙整

    一. TCP/IP基本觀念 1. IP : 每台在TCP/IP網路上的電腦必須具備的一個代表號或一個地址.IP又分為private IP(192.168.x.x /10.x.x.x /172.16.x ...

  7. 【leetcode】234. Palindrome Linked List

    234. Palindrome Linked List 1. 使用快慢指针找中点的原理是fast和slow两个指针,每次快指针走两步,慢指针走一步,等快指针走完时,慢指针的位置就是中点.如果是偶数个数 ...

  8. JavaBasic_01

    计算机和编程语言 谷歌pagerank算法:给每一个网页有一个权值 被越多网页引用的网页越重要 被越重要的网页引用越重要 给每一个网页赋予权值,空网页权值为0 (马尔科夫链) 机器语言 汇编语言 高级 ...

  9. unity 实现调用Windows窗口/对话框交互

    Unity调用Window窗口 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...

  10. Gym - 101002K:YATP (树分治+二分+斜率优化)

    题意:给定带点权边权的树,定义路径的花费=路径边权和e+起点点权w[s]*终点点权w[t].N<2e5,e,w<1e6: 思路:首先,需要树分治. 然后得到方程dp[i]=min{ dis ...