代码量统计

首先通过sudo yum install libgit2-devel 安装库文件

#define COMMIT_OLD_ID "9bcc1bd3b27a514118ee7452edc0ddd18730df78"
#define COMMIT_NEW_ID "1b885aba4c27661dd3e5270fe1d7e562b4224153"

#include <iostream>
#include <git2.h>

typedef struct _code_node
{
    int add;
    int delte;
}code_node, *pcode_node;

code_node code_num = {0};

int get_node_num(git_repository* repo, std::string  commitIdA, std::string  commitIdB)
{
        // 获取两个提交的 OID(哈希)
    git_oid oldCommitId, newCommitId;
    int error =

    git_oid_fromstr(&oldCommitId, commitIdA.c_str());
    git_oid_fromstr(&newCommitId, commitIdB.c_str());

    // 检查提交是否存在
    git_commit* oldCommit = nullptr;
    git_commit* newCommit = nullptr;
    error = git_commit_lookup(&oldCommit, repo, &oldCommitId);
    if (error != 0) {
        std::cerr << "Failed to lookup old commit: " << giterr_last()->message << std::endl;
        return 1;
    }

    error = git_commit_lookup(&newCommit, repo, &newCommitId);
    if (error != 0) {
        std::cerr << "Failed to lookup new commit: " << giterr_last()->message << std::endl;
        git_commit_free(oldCommit);
        return 1;
    }

    // 获取两个提交的树
    git_tree* oldTree;
    git_tree* newTree;

    error = git_commit_tree(&oldTree, oldCommit);
    if (error != 0) {
        std::cerr << "Failed to get old tree: " << giterr_last()->message << std::endl;
        git_commit_free(oldCommit);
        git_commit_free(newCommit);
        return 1;
    }

    error = git_commit_tree(&newTree, newCommit);
    if (error != 0) {
        std::cerr << "Failed to get new tree: " << giterr_last()->message << std::endl;
        git_commit_free(oldCommit);
        git_commit_free(newCommit);
        return 1;
    }

    // 初始化差异选项
    git_diff_options diffOpts = GIT_DIFF_OPTIONS_INIT;
    git_diff* diff = nullptr;
    error = git_diff_tree_to_tree(&diff, repo, oldTree, newTree, &diffOpts);
    if (error != 0) {
        std::cerr << "Failed to calculate diff: " << giterr_last()->message << std::endl;
        git_commit_free(oldCommit);
        git_commit_free(newCommit);
        return 1;
    }

    // 获取差异的统计信息
    git_diff_stats* stats = nullptr;
    error = git_diff_get_stats(&stats, diff);
    if (error != 0) {
        std::cerr << "Failed to get diff stats: " << giterr_last()->message << std::endl;
    } else {
        code_num.add += git_diff_stats_insertions(stats);
        code_num.delte += git_diff_stats_deletions(stats);
        // 释放统计信息
        git_diff_stats_free(stats);
    }

    // 释放资源
    git_diff_free(diff);
    git_commit_free(oldCommit);
    git_commit_free(newCommit);
    return 0;
}
int main() {
    git_libgit2_init();

    // 打开或初始化 Git 存储库
    git_repository* repo = nullptr;
    int error = git_repository_open(&repo, "/home/CodeHub/NetAnalysis");
    if (error != 0) {
        std::cerr << "Failed to open repository: " << giterr_last()->message << std::endl;
        git_libgit2_shutdown();
        return 1;
    }

    get_node_num(repo, COMMIT_OLD_ID, COMMIT_NEW_ID);
    std::cout << "Total additions: " << code_num.add << std::endl;
    std::cout << "Total deletions: " << code_num.delte << std::endl;
    git_repository_free(repo);
    git_libgit2_shutdown();

    return 0;
}

 

 

posted @ 2023-09-04 23:48  伤痕累累的笨蛋  阅读(34)  评论(0编辑  收藏  举报