使用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);
}
}
统计某一段时间人员的代码行数:
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代码行数的更多相关文章
- Atitit.Guibutton与面板---项目规模的评估----文件数统计,结构,代码行数,每类型文件行数.
Atitit.Guibutton与面板---项目规模的评估----文件数统计,结构,代码行数,每类型文件行数. 1. Kpi::: 代码行数(凝视行数,空白的行数), 方法数,class数 1 2. ...
- Atitit.Gui按钮与面板---项目规模的评估----文件数统计,结构,代码行数,每类型文件行数.
Atitit.Gui按钮与面板---项目规模的评估----文件数统计,结构,代码行数,每类型文件行数. 1. Kpi::: 代码行数(注释行数,空白的行数), 方法数,class数 1 2. 过滤器 ...
- 使用PYTHON统计项目代码行数
目录 一 使用PYTHON统计项目代码行数 二 应用实例 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 使用PYTHON统计项目代码行数 遇到一个非常小的需求:统计一个项目里头的各类源代码 ...
- VS2012 利用正则统计项目代码行数
原文:VS2012 利用正则统计项目代码行数 #开头和/开头或者空行都不计入代码量, 搜索出来以后最后一行就是代码行数了:
- Visual Studio使用正则表达式快速统计总共代码行数
原文:Visual Studio使用正则表达式快速统计总共代码行数 按CTRL+SHIFT+F,勾上支持正则表达式,然后输入搜索内容: <span style="font-family ...
- IDEA 怎么统计项目代码行数
引言 IDEA 统计项目代码行数,主要是使用 Statistic 插件来统计 第一步 点击 File->Settings,如下图所示: 第二步 点击 install 安装 Statistic 插 ...
- iOS - Xcode项目统计总代码行数
最新公司需要把项目代码量统计一下,第一时间找到Xcode插件管理工具Alcatraz,查找插件ZLXCodeLine,这是一个快速统计Xcode工程项目代码量的插件,好像已经不支持Alcatraz安装 ...
- iOS开发_统计xcode代码行数
如果要统计ios开发代码,包括头文件的,终端命令进入项目目录下,命令如下 find . -name "*.m" -or -name "*.h" -or -nam ...
- Visual Studio统计有效代码行数
在网上看到别人用的方法: 按CTRL+SHIFT+F (Find in files),勾上支持正则表达式,然后输入搜索内容: ^:b*[^:b#/]+.*$ 以上表达式的统计可做到:#开头和/开头或者 ...
- IOS开发 统计XCODE 代码行数
如果要统计ios开发代码,包括头文件的,终端命令进入项目目录下,命令如下 find . -name "*.m" -or -name "*.h" -or -nam ...
随机推荐
- R数据分析:解决科研中的“可重复危机”,理解Rmarkdown
不知道刚接触科研的大伙儿有没有这么一个感觉,别人的研究很大可能你重复不出来,尤其是社科实证研究,到现在我都还觉得所谓的实证是个很玄乎的东西: 如果是刚开始做数据分析,很多时候你会发现自己的分析结果过几 ...
- 前端Vue自定义简单实用轮播图封装组件 快速实现轮播图
前端Vue自定义简单实用轮播图封装组件 快速实现轮播图, 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13153 效果图如下: ...
- 用JavaScript撸一个静态链表
最近重新开始翻起<大话数据结构>,看到了静态链表部分里面讲C语言是利用数组模拟,觉得十分有趣.但是在JavaScript中,也可以用类似的方式去实现,定义一个数据域和一个结点域,然后实现链 ...
- Hello-FPGA CoaXPress 2.0 FPGA HOST IP Core Demo User Manual
目录 Hello-FPGA CoaXPress 2.0 Host FPGA IP Core Demo 4 1 说明 4 2 设备连接 5 3 VIVADO FPGA工程 6 4 SDK工程 9 图 1 ...
- Mysql基础7-约束
一.约束的基本概念 1.概念:约束是作用于表中字段上的规则,用于限制储存在表中的数据 2.目的:保证数据库中的数据的正确性,有效性和完整性 3.分类 非空约束(not null):限制该字段的数据不能 ...
- HTB靶场之OnlyForYou
准备: 攻击机:虚拟机kali. 靶机:OnlyForYou,htb网站:https://www.hackthebox.com/,靶机地址:https://app.hackthebox.com/mac ...
- 【游记】NOIP2022 预备赛游记
Day -2 \(NOIP\) 就要来了,\(CSYZ\) 斥巨资给我们在 \(NOIP\) 正式考点举办了一场 \(NOIP\) 预备赛,真是太感动了~~ \(cy\) 说明天要颁奖,激动激动! D ...
- python分割多个分隔符
想一次指定多个分隔符,可以用re模块 import retext='3.14:15'result = re.split('[.:]', text)print(result) 输出结果如下: ['3', ...
- Topic太多,RocketMQ炸了!
网上博客常说,kafka的topic数量过多会影响kafka,而RocketMQ不会受到topic数量影响. 但是,果真如此吗? 最近排查一个问题,发现RocketMQ稳定性同样受到topic数量影响 ...
- 深入理解Linux内核——内存管理(3)
提要:本系列文章主要参考MIT 6.828课程以及两本书籍<深入理解Linux内核> <深入Linux内核架构>对Linux内核内容进行总结. 内存管理的实现覆盖了多个领域: ...