使用Java统计gitlab代码行数

王柳  金牌会员 | 2023-10-19 22:19:08 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 909|帖子 909|积分 2727

一、背景:
       需要对当前公司所有的项目进行代码行数的统计
二、 可实现方式
       1.脚本:通过git脚本将所有的项目拉下来并然后通过进行代码行数的统计
        样例:
  1. echo 创建项目对应的文件夹
  2. mkdir 项目名称echo 切到创建的文件夹中
  3. cd 项目名称echo 进行git初始化
  4. git init
  5. echo 添加远程仓库
  6. git remote add origin 项目地址
  7. git fetch origin
  8. git checkout -b master origin/master
  9. echo 切换检出的分支为master
  10. git branch
  11. echo 拉取项目代码
  12. git pull origin master
  13. echo  将项目名称追加输出到上级目录的projectCount.txt文件中注意逗号分隔
  14. echo 项目名称, >> ../projectCount.txt
  15. echo 使用git命令统计该项目的代码行数并将结果追加到上级目录的projectCount.txt文件中
  16. git ls-files | xargs cat | wc -l >> ../projectCount.txt
  17. cd ..
  18. echo 创建项目对应的文件夹
  19. mkdir 项目名称
  20. ...
  21. 将该代码保存成sh脚本,在gitbash命令行执行
复制代码
将所有的项目进行脚本处理之后便可以得到一张项目名称,代码行数的txt文件,因为以逗号分隔故转换成csv文件后可以复制到excel中进行统计排序处理
       2.gitlab提供的有标准的API接口可以通过调用API的方式进行统计
         在网上进行一番的搜索发现已经有封装好的SDK包添加maven依赖后可以直接使用
         样例:
        引入maven依赖,如果需要其他的版本可以到github上面找到对应的版本:https://github.com/gitlab4j/gitlab4j-api
  1.         <dependency>
  2.             <groupId>org.gitlab4j</groupId>
  3.             <artifactId>gitlab4j-api</artifactId>
  4.             <version>5.3.0</version>
  5.         </dependency>
复制代码
       统计所有项目的代码行数:
     
  1.     private String url = "gitlab的仓库地址";
  2.     private String authToken = "用户的token";
  3.     private GitLabApi gitLabAPI = new GitLabApi(url, authToken);
  4.     /**
  5.      * 统计每个项目的代码行数
  6.      *
  7.      * @throws Exception
  8.      */
  9.     @Test
  10.     public void codeTotalCount() throws Exception {
  11.         //拉取属于我的所有项目
  12.         List<Project> projectList = gitLabAPI.getProjectApi().getOwnedProjects();
  13.         for (Project proj : projectList) {
  14.             String namespace = proj.getNamespace().getFullPath();
  15.             String name = proj.getPath();
  16.             String url = proj.getWebUrl();
  17.             log.info("项目命名空间:{}, 项目名称:{}, 项目地址:{}", namespace, name, url);
  18.             //获取项目信息包含statistics信息
  19.             Project project = gitLabAPI.getProjectApi().getProject(namespace, name, true);
  20.             ProjectStatistics projectStatistics = project.getStatistics();
  21.             Long totalLines = projectStatistics.getRepositorySize();
  22.             log.info("项目名称:{}, 代码行数:{}", name, totalLines);
  23.         }
  24.     }
复制代码
      统计某一段时间人员的代码行数:
        
  1.     private String url = "gitlab仓库地址";
  2.     private String authToken = "用户的token";
  3.     private GitLabApi gitLabAPI = new GitLabApi(url, authToken);
  4.     /**
  5.      * 统计人员某段时间的代码行数
  6.      *
  7.      * @throws Exception
  8.      */
  9.     @Test
  10.     public void codeAuthorCount() throws Exception {
  11.         gitLabAPI.enableRequestResponseLogging(Level.ALL);
  12.         List<Project> projectList = gitLabAPI.getProjectApi().getOwnedProjects();
  13.         //获取项目中的人员信息
  14.         List<User> userList = getMembers("in");
  15.         log.info("查询人员列表:{}", JSON.toJSONString(userList));
  16.         Date start = DateUtil.parse("2023-07-01 00:00:00", "yyyy-MM-dd HH:mm:ss");
  17.         Date end = DateUtil.parse("2023-10-01 00:00:00", "yyyy-MM-dd HH:mm:ss");
  18.         for (User user : userList) {
  19.             Integer addCode = 0;
  20.             Integer delCode = 0;
  21.             Integer totalCode = 0;
  22.             String name = user.getName();
  23.             String userName = user.getUsername();
  24.             String state = user.getState();
  25.             //检查用户信息,不符合要求的用户如 blocked 可进行跳过
  26.             if (checkUserInfo(name, state)) {
  27.                 continue;
  28.             }
  29.             for (Project p : projectList) {
  30.                 List<Commit> commitList = gitLabAPI.getCommitsApi().getCommits(p.getId(), "master", start, end);
  31.                 for (Commit commit : commitList) {
  32.                     //因commit信息中没有用户的memberId信息,每个人提交信息有些缺失故进行多次判断
  33.                     if (userName.contains(commit.getAuthorName()) ||
  34.                             commit.getCommitterEmail().contains(userName) ||
  35.                             commit.getAuthorEmail().contains(userName)) {
  36.                         Commit c = gitLabAPI.getCommitsApi().getCommit(p.getId(), commit.getShortId());
  37.                         //添加代码行数
  38.                         addCode += c.getStats().getAdditions();
  39.                         //删除代码行数
  40.                         delCode += c.getStats().getDeletions();
  41.                         //累计修改行数
  42.                         totalCode += c.getStats().getTotal();
  43.                     }
  44.                 }
  45.             }
  46.             log.info("开始时间:{},结束时间:{},姓名:{}, 添加代码行数:{}, 删除代码行数:{}, 累计变更行数:{}", start, end, name, addCode, delCode, totalCode);
  47.         }
  48.     }
  49.     private boolean checkUserInfo(String name, String state) {
  50.         if (state.equals("blocked") ||
  51.                 name.contains("产品部")
  52.         ) {
  53.             return true;
  54.         }
  55.         return false;
  56.     }
  57.    
  58.     /**
  59.      * 获取项目与group中的人员信息
  60.      *
  61.      * @param groupPath
  62.      * @return
  63.      * @throws Exception
  64.      */
  65.     private List<User> getMembers(String groupPath) throws Exception {
  66.         List<User> userList = new ArrayList<>();
  67.         //获取所有组路径下的人员信息
  68.         List<Group> groupList = gitLabAPI.getGroupApi().getGroups();
  69.         List<Project> projectList = new ArrayList<>();
  70.         for (Group g : groupList) {
  71.             log.info("组名称:{}, 组路径:{}", g.getDescription(), g.getFullPath());
  72.             List<Member> members = gitLabAPI.getGroupApi().getMembers(g.getId());
  73.             projectList.addAll(gitLabAPI.getGroupApi().getProjects(g.getId()));
  74.             for (Member m : members) {
  75.                 if (!checkMemberExist(userList, m)) {
  76.                     User user = gitLabAPI.getUserApi().getUser(m.getId());
  77.                     userList.add(user);
  78.                 }
  79.             }
  80.         }
  81.         //获取所有Project的人员信息
  82.         for (Project project : projectList) {
  83.             String name = project.getPath();
  84.             Long id = project.getId();
  85.             log.info("项目名称:{}, 项目Id:{}", name, id);
  86.             List<Member> members = gitLabAPI.getProjectApi().getMembers(id);
  87.             for (Member m : members) {
  88.                 if (!checkMemberExist(userList, m)) {
  89.                     User user = gitLabAPI.getUserApi().getUser(m.getId());
  90.                     userList.add(user);
  91.                 }
  92.             }
  93.         }
  94.         return userList;
  95.     }
  96.     /**
  97.      * 判断人员是否已经存在
  98.      *
  99.      * @param userList
  100.      * @param m
  101.      * @return
  102.      */
  103.     private boolean checkMemberExist(List<User> userList, Member m) {
  104.         for (User user : userList) {
  105.             if (user.getId().equals(m.getId())) {
  106.                 return true;
  107.             }
  108.         }
  109.         return false;
  110.     }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表