经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 软件/图像 » Git » 查看文章
使用Java统计gitlab代码行数
来源:cnblogs  作者:唐凯  时间:2023/10/9 10:47:09  对本文有异议

一、背景:

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

二、 可实现方式

       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. <!-- gitlab-api SDK-->
  2. <dependency>
  3. <groupId>org.gitlab4j</groupId>
  4. <artifactId>gitlab4j-api</artifactId>
  5. <version>5.3.0</version>
  6. </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. * 获取项目与group中的人员信息
  59. *
  60. * @param groupPath
  61. * @return
  62. * @throws Exception
  63. */
  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. }

原文链接:https://www.cnblogs.com/tangkai/p/17750938.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号