• 使用Java统计gitlab代码行数


    一、背景:

           需要对当前公司所有的项目进行代码行数的统计

    二、 可实现方式

      1.脚本:通过git脚本将所有的项目拉下来并然后通过进行代码行数的统计

      样例:

    复制代码
    echo 创建项目对应的文件夹
    mkdir 项目名称echo 切到创建的文件夹中
    cd 项目名称echo 进行git初始化
    git init
    echo 添加远程仓库
    git remote add origin 项目地址
    git fetch origin
    git checkout -b master origin/master
    echo 切换检出的分支为master
    git branch
    echo 拉取项目代码
    git pull origin master
    echo  将项目名称追加输出到上级目录的projectCount.txt文件中注意逗号分隔
    echo 项目名称, >> ../projectCount.txt
    echo 使用git命令统计该项目的代码行数并将结果追加到上级目录的projectCount.txt文件中
    git ls-files | xargs cat | wc -l >> ../projectCount.txt
    cd ..
    echo 创建项目对应的文件夹
    mkdir 项目名称
    ...
    将该代码保存成sh脚本,在gitbash命令行执行
    复制代码

    将所有的项目进行脚本处理之后便可以得到一张项目名称,代码行数的txt文件,因为以逗号分隔故转换成csv文件后可以复制到excel中进行统计排序处理

     2.通过接口:gitlab提供的有标准的API接口可以通过调用API的方式进行统计

      在网上进行一番的搜索发现已经有封装好的SDK包添加maven依赖后可以直接使用

      样例:

      引入maven依赖,如果需要其他的版本可以到github上面找到对应的版本:https://github.com/gitlab4j/gitlab4j-api

    
            <dependency>
                <groupId>org.gitlab4jgroupId>
                <artifactId>gitlab4j-apiartifactId>
                <version>5.3.0version>
            dependency>

    统计所有项目的代码行数: 

    复制代码
        private String url = "gitlab的仓库地址";
    
        private String authToken = "用户的token";
    
        private GitLabApi gitLabAPI = new GitLabApi(url, authToken);
    
    
        /**
         * 统计每个项目的代码行数
         *
         * @throws Exception
         */
        @Test
        public void codeTotalCount() throws Exception {
            //拉取属于我的所有项目
            List projectList = gitLabAPI.getProjectApi().getOwnedProjects();
            for (Project proj : projectList) {
                String namespace = proj.getNamespace().getFullPath();
                String name = proj.getPath();
                String url = proj.getWebUrl();
                log.info("项目命名空间:{}, 项目名称:{}, 项目地址:{}", namespace, name, url);
                //获取项目信息包含statistics信息
                Project project = gitLabAPI.getProjectApi().getProject(namespace, name, true);
                ProjectStatistics projectStatistics = project.getStatistics();
                Long totalLines = projectStatistics.getRepositorySize();
                log.info("项目名称:{}, 代码行数:{}", name, totalLines);
            }
        }
    复制代码

          统计某一段时间人员的代码行数:   

    复制代码
        private String url = "gitlab仓库地址";
    
        private String authToken = "用户的token";
    
        private GitLabApi gitLabAPI = new GitLabApi(url, authToken);
    
        /**
         * 统计人员某段时间的代码行数
         *
         * @throws Exception
         */
        @Test
        public void codeAuthorCount() throws Exception {
            gitLabAPI.enableRequestResponseLogging(Level.ALL);
            List projectList = gitLabAPI.getProjectApi().getOwnedProjects();
            //获取项目中的人员信息
            List userList = getMembers("in");
            log.info("查询人员列表:{}", JSON.toJSONString(userList));
            Date start = DateUtil.parse("2023-07-01 00:00:00", "yyyy-MM-dd HH:mm:ss");
            Date end = DateUtil.parse("2023-10-01 00:00:00", "yyyy-MM-dd HH:mm:ss");
            for (User user : userList) {
                Integer addCode = 0;
                Integer delCode = 0;
                Integer totalCode = 0;
                String name = user.getName();
                String userName = user.getUsername();
                String state = user.getState();
                //检查用户信息,不符合要求的用户如 blocked 可进行跳过
                if (checkUserInfo(name, state)) {
                    continue;
                }
                for (Project p : projectList) {
                    List commitList = gitLabAPI.getCommitsApi().getCommits(p.getId(), "master", start, end);
                    for (Commit commit : commitList) {
                        //因commit信息中没有用户的memberId信息,每个人提交信息有些缺失故进行多次判断
                        if (userName.contains(commit.getAuthorName()) ||
                                commit.getCommitterEmail().contains(userName) ||
                                commit.getAuthorEmail().contains(userName)) {
                            Commit c = gitLabAPI.getCommitsApi().getCommit(p.getId(), commit.getShortId());
                            //添加代码行数
                            addCode += c.getStats().getAdditions();
                            //删除代码行数
                            delCode += c.getStats().getDeletions();
                            //累计修改行数
                            totalCode += c.getStats().getTotal();
                        }
                    }
                }
                log.info("开始时间:{},结束时间:{},姓名:{}, 添加代码行数:{}, 删除代码行数:{}, 累计变更行数:{}", start, end, name, addCode, delCode, totalCode);
            }
        }
    
        private boolean checkUserInfo(String name, String state) {
            if (state.equals("blocked") ||
                    name.contains("产品部") 
            ) {
                return true;
            }
            return false;
        }
        
        /**
         * 获取项目与group中的人员信息
         *
         * @param groupPath
         * @return
         * @throws Exception
         */
    
        private List getMembers(String groupPath) throws Exception {
            List userList = new ArrayList<>();
    
            //获取所有组路径下的人员信息
            List groupList = gitLabAPI.getGroupApi().getGroups();
            List projectList = new ArrayList<>();
            for (Group g : groupList) {
                log.info("组名称:{}, 组路径:{}", g.getDescription(), g.getFullPath());
                List members = gitLabAPI.getGroupApi().getMembers(g.getId());
                projectList.addAll(gitLabAPI.getGroupApi().getProjects(g.getId()));
                for (Member m : members) {
                    if (!checkMemberExist(userList, m)) {
                        User user = gitLabAPI.getUserApi().getUser(m.getId());
                        userList.add(user);
                    }
                }
            }
    
            //获取所有Project的人员信息
            for (Project project : projectList) {
                String name = project.getPath();
                Long id = project.getId();
                log.info("项目名称:{}, 项目Id:{}", name, id);
                List members = gitLabAPI.getProjectApi().getMembers(id);
                for (Member m : members) {
                    if (!checkMemberExist(userList, m)) {
                        User user = gitLabAPI.getUserApi().getUser(m.getId());
                        userList.add(user);
                    }
    
                }
            }
            return userList;
        }
    
        /**
         * 判断人员是否已经存在
         *
         * @param userList
         * @param m
         * @return
         */
        private boolean checkMemberExist(List userList, Member m) {
            for (User user : userList) {
                if (user.getId().equals(m.getId())) {
                    return true;
                }
            }
            return false;
        }
    复制代码
  • 相关阅读:
    python操作windows桌面实现鼠标、键盘操作,python之pyautogui库文档详解
    LomBok常用注解及详细介绍
    康力源体育IPO过会:年营收7亿 衡墩建控制98%股权
    举例详解 TCP/IP 五层(或四层)模型与 OSI七层模型对比 (画图详解 一篇看懂!)
    Eclipse安装使用UML插件
    回溯算法之简单组合
    前端也该刷点算法题——双指针解“链表”题也太香了叭!
    Python中的并发编程(5)PyQt 多线程
    最高月薪16K,不要在意起跑的年龄,贵在有颗奔跑的心~
    华为存储密码恢复
  • 原文地址:https://www.cnblogs.com/tangkai/p/17750938.html