基于SVN提交历史筛选作者并修改文件内容

笔者最近开发的项目中,是通过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");
    }

}

  

时间: 2024-10-10 19:38:14

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

java修改文件内容

文件的读和写,大家都不陌生,但是修改呢?按照普通的读写流去修改的话,只能全部读取出来,在内存中修改好后,全部写进去,这样对于文件内容过多的时,性能很低. 最近在遇到这个问题的时候,发现RandomAccessFile这个类正好能解决我的问题,废话不多说,下面直接贴代码,分享给大家,有不对的地方欢迎指教,谢谢 /**     * 修改文件内容     * @param fileName     * @param oldstr     * @param newStr     * @return  

[转载]sed实现直接修改文件内容

sed实现直接修改文件内容 sed是实现对流的编辑.通常,我们使用sed可以实现内容的编辑后然后保存成另外的一个文件,如果正确的话,才写入到源文件.但是某些时候,我们需要直接修改文件,因为,保存文件到一个文件,然后再覆盖原文件的办法显得很麻烦.其实很简单,只需要一个 -i 参数就可以了.比如,我想替换文件中的 properties 为 property ,可以使用 sed  's/properties/property/g'  build.xml这种方式,其实并没有修改build.xml文件的内

python修改文件内容,不需要read,write多个动作。

python  要修改文件内容,常用 是先read,后write , 再 rename,很不爽. 比如:需要 把       yuv_dir ="../HD/"   # "H:/HD_Master/1080i25/" 改为       yuv_dir ="C:/HD/"   # "H:/HD_Master/1080i25/" 很简单,但实际不好操作,因为read后文件指针就到后一行了,要使用seek到前一行等,很不好. 很多应

linux下C++修改文件内容

C fwrite在任意位置写入文件,并可修改文件内容 想实现类似迅雷那样下载时可以从文件半中间写入的功能 1 #include<stdio.h> 2 int main() 3 { 4 FILE *fp; 5 fp=fopen("overwrite.bin","rb+"); //使用rb+模式,可以往半中间插入数据,而且是覆盖插入,若使用"ab+"每次都插入到最后面,调用fseek也没用 6 if(NULL != fp) 7 { 8 i

python 修改文件内容

python 修改文件内容 一.修改原文件方式 1 def alter(file,old_str,new_str): 2 """ 3 替换文件中的字符串 4 :param file:文件名 5 :param old_str:就字符串 6 :param new_str:新字符串 7 :return: 8 """ 9 file_data = "" 10 with open(file, "r", encoding

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

正常情况我们想要仅对文件某一行的内容进行修改,而不改变其他内容,在原文件的基础上不能修改,因为当我们对原文件进行写操作时,如果原文件里面有内容,就会清空,在这种情况下,只能对文件进行替换性修改:即重新创建一个文件,把原文件的内容按行复制到新文件里,当复制到要修改的那一行时,就用我们需要的内容来替换原有的内容 eg:我们要修改原文件的第五行内容为"hello,小双双",实现源码如下: # 替换性修改文件内容 f_read = open('小双双', 'r', encoding='utf8

python 修改文件内容的程序

#1.修改文件的内容 #运行的时候要 python xxx.py hh.txt hehe hahaimport sys,osinputs = sys.argv#存的是所有运行时候传进来的参数#它就是用来获取在用python命令运行python文件的时候,传入的参数#1.判断用户输入的是不是够个数if len(inputs)<4: print('参数不够,至少需要3个参数,e.g: python xx.py xx.txt old_str new_str..')else: file_name = i

Python修改文件内容

import sys import os name=(sys.argv) #用来存储输入的4个参数 if len(name)<4: #判断输入参数是否小于4个 print('至少传入4个参数') exit() #如果小于4个参数,不往下执行直接退出 f=open('d:/'+name[1],'a+') #以追加方式打开要更改的文件 f1=open('d:/'+name[1]+'.new','w') #同时以写的方式打开一个新文件 f.seek(0) #文件指针指向开头 for line in f

修改文件内容

修改文件头内容: 通过使用rb+模式,代码如下: void CfileTestDlg::OnBnClickedButton1() { struct student { char name [96]; int nId ; char desc[1024]; }; FILE *fp = fopen("D:\\20080507.log ", "rb+"); if (fp==0) { printf("can't open file\n"); return