根据代码中关键字查找git提交人

工作中遇到一个需求,需要梳理业务日志文件中冗余日志,以便判断是否需要删除。梳理过程中把日志中打印的关键字筛选出来的,但这些关键字所在的代码是谁提交的,这个需要统计出来,以便后期与该提交人确认该行日志是否可以删除。于是写了个程序用来查找对应的git提交人。

import com.google.common.io.LineReader;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class ReadCodeFile {

    /**
     * 根据关键字搜索文件,以及对应的最后一次提交人
     *
     * @param systemPath
     * @param keyword
     * @param file
     */
    public static void singleFile(String systemPath, String keyword, File file) {
        // 读取文件
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "utf-8"));
            String line;
            int lineNo = 1;
            while ((line = br.readLine()) != null) {
                if (line.indexOf(keyword) >= 0) {
                    String filePath = file.getPath().replace(systemPath + "\\", "");
                    String[] cmds = new String[3];
                    cmds[0] = "cmd.exe" ;  // 调用外部程序
                    cmds[1] = "/C" ;       // 外部程序参数,是执行完命令后关闭命令窗口。 /K是不关闭窗口,这里导致进程不结束,java主线程挂起
                    cmds[2] = "cd /d " + systemPath + " & git --git-dir " + systemPath + "\\.git blame " + filePath + " -L" +
                            lineNo+"," + lineNo;//cmd调用的命令
                    System.out.println(cmds[2]);
                    Process process = Runtime.getRuntime().exec(cmds);
                    int waitFor = process.waitFor();
//                    System.out.println("waitFor:" + waitFor);
//                    System.out.println("process.exitValue():" + process.exitValue());
                    LineReader lineReader = new LineReader(new InputStreamReader(process.getInputStream()));
                    String outputLine;
                    while ((outputLine = lineReader.readLine()) != null){
                        System.out.println(outputLine);
                        // 获取提交人名称
                        String commiter = outputLine.split(" ")[1];
                        System.out.println("最近一次提交人:" + commiter.replace("(", ""));
                    }
                    LineReader lineReader2 = new LineReader(new InputStreamReader(process.getErrorStream()));
                    String outputLine2;
                    while ((outputLine2 = lineReader2.readLine()) != null){
                        System.out.println();
                        System.out.println("++++++++++++++++++++++++++ 执行异常:" + outputLine2);
                    }
                }
                lineNo++;
            }
            br.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 读取文件,如果是目录则遍历该目录所有文件和子目录
     *
     * @param systemPath
     * @param keyword
     * @param file
     */
    public static void fileDictory(String systemPath, String keyword, File file) {
        try {
            if (file != null && file.isDirectory()) {
                // 当前路径是目录,遍历该目录
                File[] fileArray = file.listFiles();
                for (File f : fileArray) {
                    fileDictory(systemPath, keyword, f);
                }
            } else if (file.getName().endsWith("java")) {
                // 当前路径是文件,只搜索java文件
                singleFile(systemPath, keyword, file);
            }
        } catch (Exception e) {
            e.printStackTrace();
            ;
        }
    }

    public static void main(String[] args) {
        // 项目本地路径
        String systemPath = "D:\\project\\myproject";
        // 查找关键字
        String[] keywordArray = {"业务报警通知未配置接收人"};
        try {
            for (String keyword : keywordArray) {
                fileDictory(systemPath, keyword, new File(systemPath));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 打印结果如下(只):

cd /d D:\project\myproject & git --git-dir D:\project\myproject\.git blame myproject\pj-alarm\src\main\java\com\liang\alarm\record\service\AlarmRecordServiceImpl.java -L127,127
d960fdc499 (atai555 2020-04-15 19:35:49 +0800 127)                 LoggerUtils.logBizInfo("业务报警通知未配置接收人");
最近一次提交人:atai555

  

posted on 2022-05-10 15:59  阿泰555  阅读(353)  评论(0编辑  收藏  举报

导航