Java统计GitLab代码量

文章介绍了如何使用Java和GitLab4jAPI来统计个人或团队在特定时间段内的代码行数,包括所有项目和指定成员的贡献。作者提供了示例代码,展示了如何获取项目信息、拉取成员列表以及分析提交记录以计算代码增删量。
摘要由CSDN通过智能技术生成

1、生成密钥

2、添加依赖

<dependency>
  <groupId>org.gitlab4j</groupId>
  <artifactId>gitlab4j-api</artifactId>
  <version>5.3.0</version>
 </dependency>

Java代码实现

统计所有项目的代码行数: 

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;
    }

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 GitLab API 来读取 GitLab 上的文件。以下是一个使用 Java 读取 GitLab 文件的示例代码: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.Base64; public class GitLabFileReader { public static void main(String[] args) throws IOException { String gitLabApiUrl = "https://gitlab.example.com/api/v4/projects/<project-id>/repository/files/<file-path>/raw?ref=<branch-or-tag-name>"; String gitLabAccessToken = "<access-token>"; String filePath = "/path/to/file"; String branchOrTagName = "master"; // or any other tag/branch name String encodedAccessToken = Base64.getEncoder().encodeToString(gitLabAccessToken.getBytes()); String urlStr = gitLabApiUrl .replace("<project-id>", "your-project-id-here") .replace("<file-path>", filePath) .replace("<branch-or-tag-name>", branchOrTagName); URL url = new URL(urlStr); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("PRIVATE-TOKEN", gitLabAccessToken); int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); System.out.println(response.toString()); } else { System.out.println("Failed to read file from GitLab. Response code: " + responseCode); } } } ``` 在上面的代码中,你需要将 `gitLabApiUrl` 变替换为你 GitLab 服务器的 API 地址,`gitLabAccessToken` 变替换为你的 GitLab 访问令牌,`filePath` 变替换为要读取的文件在 GitLab 上的路径,`branchOrTagName` 变替换为要读取的文件所在的分支或标签名称。然后运行代码,即可在控制台上看到文件的内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值