一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 使用Java統計gitlab代碼行數

使用Java統計gitlab代碼行數

2023-10-13 06:21未知服務器之家 Java教程

一、背景: ? ? ? ?需要對當前公司所有的項目進行代碼行數的統計 二、 可實現方式 ? ? ? ?1.腳本:通過git腳本將所有的項目拉下來并然后通過進行代碼行數的統計 ? ? ? ? 樣例: echo 創建項目對應的文件夾 mkdir 項目名稱 ec

一、背景:

? ? ? ?需要對當前公司所有的項目進行代碼行數的統計

二、 可實現方式

? ? ? ?1.腳本:通過git腳本將所有的項目拉下來并然后通過進行代碼行數的統計

? ? ? ? 樣例:

echo 創建項目對應的文件夾
mkdir 項目名稱echo 切到創建的文件夾中
cd 項目名稱echo 進行git初始化
git init
echo 添加遠程倉庫
git remote add origin 項目地址
git fetch origin
git checkout -b master origin/master
echo 切換檢出的分支為master
git branch
echo 拉取項目代碼
git pull origin master
echo  將項目名稱追加輸出到上級目錄的projectCount.txt文件中注意逗號分隔
echo 項目名稱, >> ../projectCount.txt
echo 使用git命令統計該項目的代碼行數并將結果追加到上級目錄的projectCount.txt文件中
git ls-files | xargs cat | wc -l >> ../projectCount.txt
cd ..
echo 創建項目對應的文件夾
mkdir 項目名稱
...
將該代碼保存成sh腳本,在gitbash命令行執行

將所有的項目進行腳本處理之后便可以得到一張項目名稱,代碼行數的txt文件,因為以逗號分隔故轉換成csv文件后可以復制到excel中進行統計排序處理

? ? ? ?2.gitlab提供的有標準的API接口可以通過調用API的方式進行統計

? ? ? ? ?在網上進行一番的搜索發現已經有封裝好的SDK包添加maven依賴后可以直接使用

? ? ? ? ?樣例:

? ? ? ? 引入maven依賴,如果需要其他的版本可以到github上面找到對應的版本:https://github.com/gitlab4j/gitlab4j-api

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

? ? ? ?統計所有項目的代碼行數:

? ? ?

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美成人免费观看国产 | 国产区一二三四区2021 | 亚洲国产精品一区二区三区久久 | 污到你怀疑人生 | 趴好撅高打屁股sp调教h | 亚洲高清视频网站 | 热99精品 | 男男同志gaysxxx| 9l国产精品久久久久麻豆 | 国产亚洲精品久久yy5099 | 亚洲国产天堂久久综合网站 | a在线观看欧美在线观看 | 四虎影院在线免费播放 | 欧洲vodafonewi精品 | 亚洲 欧美 国产 日韩 字幕 | 精品AV综合导航 | 久久99国产精品二区不卡 | 青青青青青 | 欧美一区二区三区精品 | chinesezoozvideos| 亚洲另类中文字幕 | 高清视频大片免费观看 | 日韩精品成人在线 | 全日本爽视频在线 | 91国内精品线免费播放 | 国产成人免费 | 精品无码久久久久久久动漫 | 欧美特黄特色aaa大片免费看 | 亚洲第一区欧美日韩精品 | 天天久久影视色香综合网 | 翁熄性放纵交换300章 | 国产乱子伦在线观看不卡 | 亚洲精品福利你懂 | 视频在线观看一区二区三区 | 成 人 免费 小说在线观看 | 激情视频网址 | 精品日韩一区二区三区 | 满溢游泳池免费土豪全集下拉版 | 猫咪av | 99热在线免费观看 | 好大夫在线个人空间 |