使用Java统计gitlab代码行数

这篇具有很好参考价值的文章主要介绍了使用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

<!--        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);
        }
    }

      统计某一段时间人员的代码行数:   文章来源地址https://www.toymoban.com/news/detail-710566.html

    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代码行数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • git使用-关于使用git命令统计整个项目的代码行数、提交者贡献统计等等

    可以使用以下命令来统计整个项目的代码行数: 这个命令会列出当前git仓库中所有的文件,然后将这些文件作为参数传递给 wc -l 命令,用于计算每个文件的行数。最终输出的结果是整个项目的代码行数。 请注意,这个命令只会计算代码文件的行数,不包括注释、空白行和其

    2024年02月09日
    浏览(60)
  • 统计 Git 代码行数

    要统计 Git 代码行数,您可以使用以下命令: 其中 作者 是您要统计代码行数的作者名称。如果您要统计所有作者的代码行数,可以省略 --author=作者 部分。 此命令会输出所有提交的代码行数总和。如果您想要查看每次提交的代码行数,可以使用以下命令: 这个命令会输出每

    2024年02月11日
    浏览(47)
  • git 代码行数统计

    【1】统计所有代码行数 当前代码都存放在git仓库下,当需进行代码行数统计时,让开发人员在代码路径下运行如下指令,可统计出当前仓库中的代码行数: 【2】统计一定时间内产生的代码行数 此处提供时间参数执行方式,`--since`:起始时间,`--until`:终止时间: --since =

    2024年02月11日
    浏览(48)
  • Git统计个人提交代码行数

    在实际开发中,常常会想查看自己对于某个项目的贡献,管理者会查看项目下各成员的贡献,就需要使用到git的命令进行代码提交的统计。 进入到自己的项目文件中,右键点击Git Bash Here 打开后界面 这个统计是以当前所在分支为基准统计的,所以如果是迭代式的往后更迭,统

    2024年02月05日
    浏览(49)
  • 【git】Git 指令统计代码行数

    目录 统计代码行数 加过滤条件 统计当前项目代码行数  细分每个文件的代码行数,相当于把上面命令细化: 以下绝大部分摘自:https://blog.csdn.net/qq_39529663/article/details/107763133 1、统计某个时间段内的代码行数; –since=统计开始时间 –until=统计结束时间 git log --since=2020-01-0

    2024年02月03日
    浏览(55)
  • 统计Git项目各成员贡献量(代码行数、提交次数)

    在项目的文件夹中,右键,选择Git Bash Here 会弹出命令行框 使用下面的代码去统计

    2024年02月11日
    浏览(61)
  • 项目代码行数统计,总行数统计,任意语言,忽略目录/指定多个文件,分分钟搞定。

    工具大小:3.6M 下载地址: https://www.zeropo.com/SourceCounter.zip 使用方式:下载运行exe(无需安装) 其他拓展 如质量指标:单元测试用例密度,单元测试缺陷密度,综合测试用例密度,综合测试缺陷密度 人工数和成本分析设定:代码生产率,多少行/人每月、一个人月的上班日数

    2024年02月19日
    浏览(48)
  • x-cmd pkg | tokei - 代码行数统计工具

    tokei 是一个使用 Rust 编写的显示有关代码统计信息的命令行工具,可以分门别类的统计目录内的代码行数。 tokei 具有良好的跨平台性,可以在 Linux、macOS、Windows 等多种平台上安装运行。 使用 x tokei 即可自动下载并使用 在终端运行 eval \\\"$(curl https://get.x-cmd.com)\\\" 即可完成 x 命令

    2024年01月16日
    浏览(53)
  • 【工具】Github统计代码行数工具推荐(VScode插件、兼容任何平台、不用下载安装包)

    需求: 1)被要求统计代码行数; 2)不想打开Linux,懒得下载Windows版本GitStats; 3)打开了Linux但也不记得find命令行怎么用; 4)打开了Linux,装好了Gitstats但自己没有图形化界面所以无法打开其输出结果; 5)习惯用VScode编程。 其他工具: 1)Linux愿意使用Gitstats的请直接转到

    2024年02月05日
    浏览(54)
  • 【工具】VS Code Counter|除了Gitstats之外的Github一键统计代码行数工具

    需求: 1)被要求统计代码行数; 2)不想打开Linux,懒得下载Windows版本GitStats; 3)打开了Linux但也不记得find命令行怎么用; 4)打开了Linux,装好了Gitstats但自己没有图形化界面所以无法打开其输出结果; 5)习惯用VScode编程。 其他工具: 1)Linux愿意使用Gitstats的请直接转到

    2024年01月20日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包