最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何使用Java統(tǒng)計(jì)gitlab代碼行數(shù)

 更新時(shí)間:2023年10月09日 12:16:04   作者:唐凱  
這篇文章主要介紹了如何使用Java統(tǒng)計(jì)gitlab代碼行數(shù),實(shí)現(xiàn)方式通過git腳本將所有的項(xiàng)目拉下來并然后通過進(jìn)行代碼行數(shù)的統(tǒng)計(jì),需要的朋友可以參考下

一、背景:

       需要對(duì)當(dāng)前公司所有的項(xiàng)目進(jìn)行代碼行數(shù)的統(tǒng)計(jì)

二、 可實(shí)現(xiàn)方式

       1.腳本:通過git腳本將所有的項(xiàng)目拉下來并然后通過進(jìn)行代碼行數(shù)的統(tǒng)計(jì)

        樣例:

echo 創(chuàng)建項(xiàng)目對(duì)應(yīng)的文件夾
mkdir 項(xiàng)目名稱echo 切到創(chuàng)建的文件夾中
cd 項(xiàng)目名稱echo 進(jìn)行g(shù)it初始化
git init
echo 添加遠(yuǎn)程倉庫
git remote add origin 項(xiàng)目地址
git fetch origin
git checkout -b master origin/master
echo 切換檢出的分支為master
git branch
echo 拉取項(xiàng)目代碼
git pull origin master
echo  將項(xiàng)目名稱追加輸出到上級(jí)目錄的projectCount.txt文件中注意逗號(hào)分隔
echo 項(xiàng)目名稱, >> ../projectCount.txt
echo 使用git命令統(tǒng)計(jì)該項(xiàng)目的代碼行數(shù)并將結(jié)果追加到上級(jí)目錄的projectCount.txt文件中
git ls-files | xargs cat | wc -l >> ../projectCount.txt
cd ..
echo 創(chuàng)建項(xiàng)目對(duì)應(yīng)的文件夾
mkdir 項(xiàng)目名稱
...
將該代碼保存成sh腳本,在gitbash命令行執(zhí)行

將所有的項(xiàng)目進(jìn)行腳本處理之后便可以得到一張項(xiàng)目名稱,代碼行數(shù)的txt文件,因?yàn)橐远禾?hào)分隔故轉(zhuǎn)換成csv文件后可以復(fù)制到excel中進(jìn)行統(tǒng)計(jì)排序處理

       2.gitlab提供的有標(biāo)準(zhǔn)的API接口可以通過調(diào)用API的方式進(jìn)行統(tǒng)計(jì)

         在網(wǎng)上進(jìn)行一番的搜索發(fā)現(xiàn)已經(jīng)有封裝好的SDK包添加maven依賴后可以直接使用

         樣例:

        引入maven依賴,如果需要其他的版本可以到github上面找到對(duì)應(yīng)的版本: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)計(jì)所有項(xiàng)目的代碼行數(shù):     

private String url = "gitlab的倉庫地址";
    private String authToken = "用戶的token";
    private GitLabApi gitLabAPI = new GitLabApi(url, authToken);
    /**
     * 統(tǒng)計(jì)每個(gè)項(xiàng)目的代碼行數(shù)
     *
     * @throws Exception
     */
    @Test
    public void codeTotalCount() throws Exception {
        //拉取屬于我的所有項(xiàng)目
        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("項(xiàng)目命名空間:{}, 項(xiàng)目名稱:{}, 項(xiàng)目地址:{}", namespace, name, url);
            //獲取項(xiàng)目信息包含statistics信息
            Project project = gitLabAPI.getProjectApi().getProject(namespace, name, true);
            ProjectStatistics projectStatistics = project.getStatistics();
            Long totalLines = projectStatistics.getRepositorySize();
            log.info("項(xiàng)目名稱:{}, 代碼行數(shù):{}", name, totalLines);
        }
    }

      統(tǒng)計(jì)某一段時(shí)間人員的代碼行數(shù):      

private String url = "gitlab倉庫地址";
    private String authToken = "用戶的token";
    private GitLabApi gitLabAPI = new GitLabApi(url, authToken);
    /**
     * 統(tǒng)計(jì)人員某段時(shí)間的代碼行數(shù)
     *
     * @throws Exception
     */
    @Test
    public void codeAuthorCount() throws Exception {
        gitLabAPI.enableRequestResponseLogging(Level.ALL);
        List<Project> projectList = gitLabAPI.getProjectApi().getOwnedProjects();
        //獲取項(xiàng)目中的人員信息
        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 可進(jìn)行跳過
            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信息,每個(gè)人提交信息有些缺失故進(jìn)行多次判斷
                    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();
                        //累計(jì)修改行數(shù)
                        totalCode += c.getStats().getTotal();
                    }
                }
            }
            log.info("開始時(shí)間:{},結(jié)束時(shí)間:{},姓名:{}, 添加代碼行數(shù):{}, 刪除代碼行數(shù):{}, 累計(jì)變更行數(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;
    }
    /**
     * 獲取項(xiàng)目與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("項(xiàng)目名稱:{}, 項(xiàng)目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;
    }

到此這篇關(guān)于如何使用Java統(tǒng)計(jì)gitlab代碼行數(shù)的文章就介紹到這了,更多相關(guān)Java統(tǒng)計(jì)gitlab代碼行數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解使用Spring Boot開發(fā)Web項(xiàng)目

    詳解使用Spring Boot開發(fā)Web項(xiàng)目

    這篇文章主要介紹了詳解使用Spring Boot開發(fā)Web項(xiàng)目,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • spring boot配置ssl實(shí)現(xiàn)HTTPS的方法

    spring boot配置ssl實(shí)現(xiàn)HTTPS的方法

    這篇文章主要介紹了spring boot配置ssl實(shí)現(xiàn)HTTPS的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-03-03
  • Spring Boot 數(shù)據(jù)可視化與圖表集成問題解析

    Spring Boot 數(shù)據(jù)可視化與圖表集成問題解析

    本章我們學(xué)習(xí)了Spring Boot數(shù)據(jù)可視化與圖表集成,包括數(shù)據(jù)可視化的定義與特點(diǎn)、圖表工具的定義與特點(diǎn)、Spring Boot與圖表工具的集成、Spring Boot的實(shí)際應(yīng)用場景,學(xué)會(huì)了在實(shí)際開發(fā)中處理數(shù)據(jù)可視化與圖表集成問題,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • 深入java垃圾回收的詳解

    深入java垃圾回收的詳解

    本篇文章是對(duì)java垃圾回收進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • SpringBoot實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換的四種對(duì)象映射方案

    SpringBoot實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換的四種對(duì)象映射方案

    在項(xiàng)目開發(fā)中,對(duì)象之間的相互轉(zhuǎn)換是一個(gè)高頻操作,尤其在分層架構(gòu)的系統(tǒng)中,數(shù)據(jù)在實(shí)體對(duì)象(Entity)、數(shù)據(jù)傳輸對(duì)象(DTO)、值對(duì)象(VO)之間的轉(zhuǎn)換尤為常見,選擇一個(gè)高效、可靠的對(duì)象映射方案對(duì)提高系統(tǒng)性能和開發(fā)效率至關(guān)重要,本文將介紹4種對(duì)象映射方案
    2025-06-06
  • 淺談Mybatis通用Mapper使用方法

    淺談Mybatis通用Mapper使用方法

    本篇文章主要介紹了淺談Mybatis通用Mapper使用方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • java學(xué)生管理系統(tǒng)界面簡單實(shí)現(xiàn)(全)

    java學(xué)生管理系統(tǒng)界面簡單實(shí)現(xiàn)(全)

    這篇文章主要為大家詳細(xì)介紹了java學(xué)生管理系統(tǒng)界面的簡單實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • MyBatis-Plus使用ActiveRecord(AR)實(shí)現(xiàn)CRUD

    MyBatis-Plus使用ActiveRecord(AR)實(shí)現(xiàn)CRUD

    本文將結(jié)合實(shí)例代碼,介紹MyBatis-Plus使用ActiveRecord(AR)實(shí)現(xiàn)CRUD,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • 基于SpringBoot+Beetl實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)庫DDL操作的實(shí)現(xiàn)指南

    基于SpringBoot+Beetl實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)庫DDL操作的實(shí)現(xiàn)指南

    你是否曾經(jīng)為了應(yīng)對(duì)頻繁的業(yè)務(wù)變化而疲于修改數(shù)據(jù)庫表結(jié)構(gòu)?是否因?yàn)槭謩?dòng)編寫SQL腳本而感到枯燥乏味?本文,我要分享一個(gè)強(qiáng)大的技術(shù)組——SpringBoot?+?Beetl,它可以幫助我們實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)庫DDL操作,需要的朋友可以參考下
    2026-01-01
  • Springboot webscoket自定義定時(shí)器

    Springboot webscoket自定義定時(shí)器

    這篇文章主要介紹了Springboot webscoket自定義定時(shí)器問題,總的來說這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達(dá)的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過程。希望通過這道題能給你帶來一種解題優(yōu)化的思路
    2023-01-01

最新評(píng)論

绍兴县| 五寨县| 安多县| 武平县| 盐津县| 东城区| 商都县| 绥滨县| 当阳市| 凤庆县| 奈曼旗| 厦门市| 当涂县| 南陵县| 抚宁县| 宁远县| 长汀县| 新巴尔虎右旗| 大宁县| 保德县| 科尔| 霍山县| 肇州县| 大港区| 禄丰县| 玛纳斯县| 敦煌市| 申扎县| 南京市| 米脂县| 桃源县| 如皋市| 泾源县| 正蓝旗| 金寨县| 凤翔县| 新平| 西乌珠穆沁旗| 永寿县| 桓仁| 微博|