如何使用Java统计gitlab代码行数

 更新时间:2023年10月09日 12:16:04   作者:唐凯  
这篇文章主要介绍了如何使用Java统计gitlab代码行数,实现方式通过git脚本将所有的项目拉下来并然后通过进行代码行数的统计,需要的朋友可以参考下

一、背景:

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

二、 可实现方式

       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

<!--        gitlab-api SDK-->
        <dependency>
            <groupId>org.gitlab4j</groupId>
            <artifactId>gitlab4j-api</artifactId>
            <version>5.3.0</version>
        </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<Project> 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<Project> projectList = gitLabAPI.getProjectApi().getOwnedProjects();
        //获取项目中的人员信息
        List<User> 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<Commit> 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<User> getMembers(String groupPath) throws Exception {
        List<User> userList = new ArrayList<>();
        //获取所有组路径下的人员信息
        List<Group> groupList = gitLabAPI.getGroupApi().getGroups();
        List<Project> projectList = new ArrayList<>();
        for (Group g : groupList) {
            log.info("组名称:{}, 组路径:{}", g.getDescription(), g.getFullPath());
            List<Member> 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<Member> 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<User> userList, Member m) {
        for (User user : userList) {
            if (user.getId().equals(m.getId())) {
                return true;
            }
        }
        return false;
    }

到此这篇关于如何使用Java统计gitlab代码行数的文章就介绍到这了,更多相关Java统计gitlab代码行数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • RabbitMQ之消息的可靠性方案详解

    RabbitMQ之消息的可靠性方案详解

    这篇文章主要介绍了RabbitMQ之消息的可靠性方案详解,MQ 消息数据完整的链路为:从 Producer 发送消息到 RabbitMQ 服务器中,再由 Broker 服务的 Exchange 根据 Routing_Key 路由到指定的 Queue 队列中,最后投送到消费者中完成消费,需要的朋友可以参考下
    2023-08-08
  • Intellij IDEA的一些调试技巧(小结)

    Intellij IDEA的一些调试技巧(小结)

    本篇文章主要介绍了Intellij IDEA的一些调试技巧(小结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • 出现log.info报红的解决方案

    出现log.info报红的解决方案

    这篇文章主要介绍了出现log.info报红的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Spring Security入门demo案例

    Spring Security入门demo案例

    Spring Security是一个高度自定义的安全框架,本文主要介绍了Spring Security入门,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Spring Cloud Alibaba微服务组件Sentinel实现熔断限流

    Spring Cloud Alibaba微服务组件Sentinel实现熔断限流

    这篇文章主要为大家介绍了Spring Cloud Alibaba微服务组件Sentinel实现熔断限流过程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • java WebSocket 服务端实现代码

    java WebSocket 服务端实现代码

    WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端,这篇文章主要介绍了java WebSocket 服务端代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • JAVA实现读取txt文件内容的方法

    JAVA实现读取txt文件内容的方法

    本篇文章主要介绍了JAVA实现读取txt文件内容的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • Java设计模式之工厂模式

    Java设计模式之工厂模式

    这篇文章主要为大家详细介绍了Java设计模式之工厂模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • SpringBoot解决跨域请求拦截问题代码实例

    SpringBoot解决跨域请求拦截问题代码实例

    这篇文章主要介绍了SpringBoot解决跨域请求拦截代码实例,在微服务开发中,一个系统包含多个微服务,会存在跨域请求的场景。 本文讲解SpringBoot解决跨域请求拦截的问题。,需要的朋友可以参考下
    2019-06-06
  • java实现求只出现一次的数字

    java实现求只出现一次的数字

    本文主要介绍了java实现求只出现一次的数字,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02

最新评论