前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >年度代码统计

年度代码统计

作者头像
肖哥哥
发布2020-12-28 10:30:58
8610
发布2020-12-28 10:30:58
举报
文章被收录于专栏:后台及大数据开发

年度汇报中需要统计代码的注释率、检视率、重复率....

很多统计可以从git从通过命令统计

比如

代码语言:javascript
复制
#统计具体某员工的代码提交量
git log --author=xiao.changwei--since=2020-01-01 --until=2020-12-31 --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --numstat | grep "\(.html\|.java\|.xml\|.properties\)$" | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done

#统计提交次数

注释率就真的不好统计了,就用最原始的方法写一个:

代码语言:javascript
复制
package com.xiao.utils;

import org.springframework.util.Assert;
import java.io.*;
import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import static java.util.stream.Collectors.*;

/**
 * @author xiao.changwei
 */
public class CodeStatistics {
    private static final String rootPath = "D:\\code\\cx";
    //因包含过多第三方js库,js库不做统计
    private static final List<String> staticsFileSuffixes = Arrays.asList("java", "xml", "sql", "conf", "properties", "yaml", "yml", "html");
    private static final List<String> excludePath = Arrays.asList("deprecated", "node_modules");
    private static List<File> files = new LinkedList<>();
    private static int whiteLines = 0;
    private static int commentLines = 0;
    private static int normalLines = 0;

    public static void main(String[] args) {
        File rootDir = new File(rootPath);
        if (rootDir.exists()) {
            getFileRecursively(rootDir);
            if (files.size() > 0) {
                files.forEach(file -> Statistics(file));
                System.out.println("空行数:" + whiteLines);
                System.out.println("注释行数:" + commentLines);
                System.out.println("代码行数:" + normalLines);
                System.out.println("文件总数:" + files.size());
                System.out.println("========================");
                BigDecimal bigDecimal = new BigDecimal(commentLines).divide(new BigDecimal(commentLines + normalLines), 4, BigDecimal.ROUND_HALF_UP);
                NumberFormat percent = NumberFormat.getPercentInstance();
                percent.setMaximumFractionDigits(4);
                System.out.println("代码注释率:" + percent.format(bigDecimal.doubleValue()));
                //按类型分类
                Map<String, List<String>> collect = files.stream().collect(groupingBy(file -> getFileSuffix(file.getName()), mapping(File::getAbsolutePath, toList())));
            }
        }
    }

    private static void getFileRecursively(File file) {
        Assert.notNull(file, "file can not be null");
        if (!shouldSkip(file) && file.isDirectory()) {
            for (File listFile : file.listFiles()) {
                if (listFile.isDirectory()) {
                    getFileRecursively(listFile);
                } else {
                    if (!shouldSkip(file) && filterBySuffix(listFile)) {
                        files.add(listFile);
                    }
                }
            }
        } else {
            if (!shouldSkip(file) && filterBySuffix(file)) {
                files.add(file);
            }
        }

    }

    private static boolean shouldSkip(File file) {
        String absolutePath = file.getAbsolutePath();
        for (String exclude : excludePath) {
            if (absolutePath.contains(exclude)) {
                return true;
            }
        }
        return false;
    }

    private static boolean filterBySuffix(File file) {
        String[] split = file.getName().split("\\.");
        if (split.length >= 2) {
            String suffix = split[split.length - 1];
            if (staticsFileSuffixes.contains(suffix)) {
                return true;
            }
        }
        return false;
    }

    private static String getFileSuffix(String fileName) {
        String[] split = fileName.split("\\.");
        if (split.length >= 2) {
            return split[split.length - 1];
        }
        return "";
    }


    private static void Statistics(File file) {
        BufferedReader br = null;
        boolean comment = false;
        try {
            br = new BufferedReader(new FileReader(file));
            String line = "";
            try {
                while ((line = br.readLine()) != null) {
                    line = line.trim();
                    if (line.matches("^[\\s&&[^\\n]]*$")) {
                        whiteLines++;
                    } else if (line.startsWith("/*") && !line.endsWith("*/")) {
                        commentLines++;
                        comment = true;
                    } else if (true == comment) {
                        commentLines++;
                        if (line.endsWith("*/")) {
                            comment = false;
                        }
                    } else if (line.startsWith("//")) {
                        commentLines++;
                    } else {
                        normalLines++;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-12-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档