当前位置:   article > 正文

【统计每天开发的代码行数】Java脚本结合Git工具⭐️实现每天提交代码量的统计_idea git 代码新增行数

idea git 代码新增行数

目录

前言

环境

一、引入JGit库,因为要通过代码提交的记录来统计行数

二、脚本类编写

三、脚本测试

四、脚本重要方法的分析 

五、脚本扩展


前言

        小伙伴们大家好,今天搭配ChatGPT搞了一个可以统计每天代码提交量的脚本,一起来看看吧

环境

        开发工具:IDEA,版本管理工具:Git,项目依赖管理工具:Maven,Java环境:1.8

注意:IDEA如何整合Github参考这篇IDEA连接Github⭐️使用Git工具上传本地文件到远程仓库-CSDN博客

一、引入JGit库,因为要通过代码提交的记录来统计行数


        1.1 使用Maven作为项目的构建工具,配置要引入的依赖等待maven自动下载

        注意:可能出现Maven提示找不到这个依赖库

org.eclipse.jgit:org.eclipse.jgit:jar:5.11.0.202105131744-r was not found in https://repo.maven.apache.org/maven2 during a previous attempt. This failure was cached in the local repository and resolution is not reattempted until the update interval of central has elapsed or updates are forced

        解决方法:到官网下载jar包,手动导入(注意与自己的jdk版本兼容的),我这里选择的5.版本的,下载以后,就跟上篇文章讲的自定义jar包的引入方式相同了,新建一个与src同级的包,将jar包复制到这里,右键jar包,点击“add libiary"即可,手动引入也就完成了

https://search.maven.org/remotecontent?filepath=org/eclipse/jgit/org.eclipse.jgit/5.12.0.202106070339-r/org.eclipse.jgit-5.12.0.202106070339-r.jar

  1. <dependency>
  2. <groupId>org.eclipse.jgit</groupId>
  3. <artifactId>org.eclipse.jgit</artifactId>
  4. <version>5.11.0.202105131744-r</version>
  5. </dependency>

二、脚本类编写


        这里除了本地使用,也可以封装为jar包,供别人使用,封装jar包方法跟这个如出一辙

【Java封装Jar包】将自己的代码封装为一个jar包⭐️以便在别的项目可以直接引用使用-CSDN博客

  1. import org.eclipse.jgit.api.Git;
  2. import org.eclipse.jgit.api.LogCommand;
  3. import org.eclipse.jgit.api.errors.GitAPIException;
  4. import org.eclipse.jgit.diff.*;
  5. import org.eclipse.jgit.lib.ObjectId;
  6. import org.eclipse.jgit.lib.PersonIdent;
  7. import org.eclipse.jgit.patch.FileHeader;
  8. import org.eclipse.jgit.revwalk.RevCommit;
  9. import org.eclipse.jgit.revwalk.RevWalk;
  10. import org.eclipse.jgit.util.io.DisabledOutputStream;
  11. import java.io.IOException;
  12. import java.nio.file.Path;
  13. import java.nio.file.Paths;
  14. import java.time.LocalDate;
  15. import java.util.List;
  16. public class TestCountByGit {
  17. public static void main(String[] args) {
  18. // 1. 获取今天的日期
  19. LocalDate today = LocalDate.now();
  20. // 2. 打开项目文件夹
  21. String projectFolder = "D:\\Projects\\GithubTest\\springboot_hb";
  22. Path folderPath = Paths.get(projectFolder);
  23. // 3. 获取昨天的日期
  24. LocalDate yesterday = today.minusDays(1);
  25. // 4. 统计行数
  26. int totalLines = countLinesSinceYesterday(folderPath, yesterday);
  27. // 5. 输出统计结果
  28. String result = today.toString() + " 提交的代码行数为:" + totalLines;
  29. System.out.println(result);
  30. }
  31. private static int countLinesSinceYesterday(Path folderPath, LocalDate yesterday) {
  32. int totalLines = 0;
  33. try (Git git = Git.open(folderPath.toFile())) {
  34. // 使用JGit获取Git提交记录
  35. LogCommand logCommand = git.log();
  36. Iterable<RevCommit> commits = logCommand.call();
  37. for (RevCommit commit : commits) {
  38. // 获取提交的时间戳
  39. PersonIdent author = commit.getAuthorIdent();
  40. long commitTime = author.getWhen().getTime();
  41. // 将时间戳转换为LocalDate对象
  42. LocalDate commitDate = LocalDate.ofEpochDay(commitTime / (24 * 60 * 60 * 1000));
  43. // 判断提交日期是否在昨天之后
  44. if (commitDate.isAfter(yesterday)) {
  45. // 获取提交的代码更改
  46. try (RevWalk revWalk = new RevWalk(git.getRepository())) {
  47. RevCommit parentCommit = revWalk.parseCommit(commit.getParent(0));
  48. int linesChanged = getLinesChanged(git, parentCommit.getId(), commit.getId());
  49. totalLines += linesChanged;
  50. }
  51. }
  52. }
  53. } catch (IOException | GitAPIException e) {
  54. e.printStackTrace();
  55. }
  56. return totalLines;
  57. }
  58. private static int getLinesChanged(Git git, ObjectId oldCommit, ObjectId newCommit) throws IOException {
  59. // 使用JGit获取两个提交之间的代码更改,并统计新增行数
  60. DiffFormatter diffFormatter = new DiffFormatter(DisabledOutputStream.INSTANCE);
  61. diffFormatter.setRepository(git.getRepository());
  62. diffFormatter.setDiffComparator(RawTextComparator.DEFAULT);
  63. diffFormatter.setDetectRenames(true);
  64. List<DiffEntry> diffs = diffFormatter.scan(oldCommit, newCommit);
  65. int linesChanged = 0;
  66. for (DiffEntry diff : diffs) {
  67. FileHeader fileHeader = diffFormatter.toFileHeader(diff);
  68. EditList editList = fileHeader.toEditList();
  69. for (Edit edit : editList) {
  70. linesChanged += edit.getEndB() - edit.getBeginB();
  71. }
  72. }
  73. return linesChanged;
  74. }
  75. }

三、脚本测试


这个分支里面总共有四个提交 ,其中一个是今天提交的,运行结果如下,统计到的代码行数为257行,可能这些行数不一定全都有内容,但是简单的统计功能还是实现了的

四、脚本重要方法的分析 


        main方法分析:这个文件路径指的是项目包的路径

        countLinesSinceYesterday方法分析

        getLinesChanged方法分析

五、脚本扩展


         当前脚本只是统计本地的分支,通过JGit库打开本地的Git仓库统计更改,不涉及对于远程的分支或者别人的提交

        想要统计远程分支的提交,可以改动方法,大概就是先获取远程仓库的引用,然后拉取到本地,再进行操作        

        后面有时间的话,改一下方法结构,封装成一个jar包给大家方便使用


2024/1/19          补充,改造脚本封装为一个可引用jar包

        改动的主要是countLinesSinceYesterday方法,将一些计算转换之类的操作封装到了方法内部,修改后的类如下

  1. public class TestCountByGit {
  2. //修改了方法的参数,可以自定义输入文件的位置以及查看天数
  3. public static void countLinesSinceYesterday(String path, int lastDayInt) {
  4. Path folderPath = Paths.get(path);
  5. LocalDate today = LocalDate.now();
  6. LocalDate lastDay = today.minusDays(lastDayInt);
  7. int totalLines = 0;
  8. try (Git git = Git.open(folderPath.toFile())) {
  9. // 使用JGit获取Git提交记录
  10. LogCommand logCommand = git.log();
  11. Iterable<RevCommit> commits = logCommand.call();
  12. for (RevCommit commit : commits) {
  13. // 获取提交的时间戳
  14. PersonIdent author = commit.getAuthorIdent();
  15. long commitTime = author.getWhen().getTime();
  16. // 将时间戳转换为LocalDate对象
  17. LocalDate commitDate = LocalDate.ofEpochDay(commitTime / (24 * 60 * 60 * 1000));
  18. // 判断提交日期是否在昨天之后
  19. if (commitDate.isAfter(lastDay)) {
  20. // 获取提交的代码更改
  21. try (RevWalk revWalk = new RevWalk(git.getRepository())) {
  22. RevCommit parentCommit = revWalk.parseCommit(commit.getParent(0));
  23. int linesChanged = getLinesChanged(git, parentCommit.getId(), commit.getId());
  24. totalLines += linesChanged;
  25. }
  26. }
  27. }
  28. } catch (IOException | GitAPIException e) {
  29. e.printStackTrace();
  30. }
  31. String result = today.toString() + " 提交的代码行数为:" + totalLines;
  32. System.out.println(result);
  33. }
  34. private static int getLinesChanged(Git git, ObjectId oldCommit, ObjectId newCommit) throws IOException {
  35. // 使用JGit获取两个提交之间的代码更改,并统计新增行数
  36. DiffFormatter diffFormatter = new DiffFormatter(DisabledOutputStream.INSTANCE);
  37. diffFormatter.setRepository(git.getRepository());
  38. diffFormatter.setDiffComparator(RawTextComparator.DEFAULT);
  39. diffFormatter.setDetectRenames(true);
  40. List<DiffEntry> diffs = diffFormatter.scan(oldCommit, newCommit);
  41. int linesChanged = 0;
  42. for (DiffEntry diff : diffs) {
  43. FileHeader fileHeader = diffFormatter.toFileHeader(diff);
  44. EditList editList = fileHeader.toEditList();
  45. for (Edit edit : editList) {
  46. linesChanged += edit.getEndB() - edit.getBeginB();
  47. }
  48. }
  49. return linesChanged;
  50. }
  51. }

         封装为jar包之后可以将整个demo_jar文件夹复制到新项目中,因为我们封装的jar包中引用到了这些三方jar包,然后右键文件夹整个添加为libiary即可

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/387962
推荐阅读
相关标签
  

闽ICP备14008679号