如何使用Java統(tǒng)計gitlab代碼行數(shù)
一、背景:
需要對當前公司所有的項目進行代碼行數(shù)的統(tǒng)計
二、 可實現(xiàn)方式
1.腳本:通過git腳本將所有的項目拉下來并然后通過進行代碼行數(shù)的統(tǒng)計
樣例:
echo 創(chuàng)建項目對應的文件夾 mkdir 項目名稱echo 切到創(chuàng)建的文件夾中 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命令統(tǒng)計該項目的代碼行數(shù)并將結果追加到上級目錄的projectCount.txt文件中 git ls-files | xargs cat | wc -l >> ../projectCount.txt cd .. echo 創(chuàng)建項目對應的文件夾 mkdir 項目名稱 ... 將該代碼保存成sh腳本,在gitbash命令行執(zhí)行
將所有的項目進行腳本處理之后便可以得到一張項目名稱,代碼行數(shù)的txt文件,因為以逗號分隔故轉換成csv文件后可以復制到excel中進行統(tǒng)計排序處理
2.gitlab提供的有標準的API接口可以通過調(diào)用API的方式進行統(tǒng)計
在網(wǎng)上進行一番的搜索發(fā)現(xiàn)已經(jīng)有封裝好的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>統(tǒng)計所有項目的代碼行數(shù):
private String url = "gitlab的倉庫地址";
private String authToken = "用戶的token";
private GitLabApi gitLabAPI = new GitLabApi(url, authToken);
/**
* 統(tǒng)計每個項目的代碼行數(shù)
*
* @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("項目名稱:{}, 代碼行數(shù):{}", name, totalLines);
}
}統(tǒng)計某一段時間人員的代碼行數(shù):
private String url = "gitlab倉庫地址";
private String authToken = "用戶的token";
private GitLabApi gitLabAPI = new GitLabApi(url, authToken);
/**
* 統(tǒng)計人員某段時間的代碼行數(shù)
*
* @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("查詢?nèi)藛T列表:{}", 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());
//添加代碼行數(shù)
addCode += c.getStats().getAdditions();
//刪除代碼行數(shù)
delCode += c.getStats().getDeletions();
//累計修改行數(shù)
totalCode += c.getStats().getTotal();
}
}
}
log.info("開始時間:{},結束時間:{},姓名:{}, 添加代碼行數(shù):{}, 刪除代碼行數(shù):{}, 累計變更行數(shù):{}", start, end, name, addCode, delCode, totalCode);
}
}
private boolean checkUserInfo(String name, String state) {
if (state.equals("blocked") ||
name.contains("產(chǎn)品部")
) {
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;
}
/**
* 判斷人員是否已經(jīng)存在
*
* @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統(tǒng)計gitlab代碼行數(shù)的文章就介紹到這了,更多相關Java統(tǒng)計gitlab代碼行數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java中 ? extends T 和 ? super&nb
本文主要介紹了Java中 ? extends T 和 ? super T的理解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-05-05
Spring Boot 實現(xiàn)https ssl免密登錄(X.509 pki登錄)
這篇文章主要介紹了Spring Boot 實現(xiàn)https ssl免密登錄(X.509 pki登錄),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01
SpringMVC Mybatis配置多個數(shù)據(jù)源并切換代碼詳解
這篇文章主要介紹了SpringMVC Mybatis配置多個數(shù)據(jù)源并切換代碼詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-11-11
深入理解SpringMVC的參數(shù)綁定與數(shù)據(jù)響應機制
本文將深入探討SpringMVC的參數(shù)綁定方式,包括基本類型、對象、集合等類型的綁定方式,以及如何處理參數(shù)校驗和異常。同時,本文還將介紹SpringMVC的數(shù)據(jù)響應機制,包括如何返回JSON、XML等格式的數(shù)據(jù),以及如何處理文件上傳和下載。2023-06-06
java中Base64字符串出現(xiàn)不合法字符的問題解決
非法的base64數(shù)據(jù)可能導致編碼或解碼過程出錯,本文主要介紹了java中Base64字符串出現(xiàn)不合法字符的問題解決,具有一定的參考價值,感興趣的可以了解一下2024-06-06

