【问题标题】:libgit2 - need help to understand how git_diff_foreach workslibgit2 - 需要帮助来理解 git_diff_foreach 是如何工作的
【发布时间】:2015-04-30 07:36:51
【问题描述】:

我正在使用由 mysql 支持的 libgit2 0.22.2,odb/refdb。我正在测试 git_diff_foreach 函数,但不知道它是如何工作的,请指教!

下面是我的测试数据和代码,我将一个blob 'README.md' 放入odb 并提交,内容是'commit',后来我将另一个同名的blob 放入odb 并提交,这次的内容是'提交测试'

我试图区分 2 树以在 3 个回调(文件、块、行)中打印差异增量。但只有文件回调打印了一些东西

更新:

我调试了 foreach 函数,diff.h git_diff_file__resolve_zero_size 函数有错误。返回语句后弹出错误:

运行时检查失败 #2 - 变量“len”周围的堆栈已损坏。

代码:

获取差异:

int error;
git_object *commit;
git_commit *parent = NULL;
error = git_revparse_single(&commit, repo, "HEAD^{commit}");
error = git_commit_parent(&parent, (git_commit *)commit, 0);

git_tree *commit_tree = NULL, *parent_tree = NULL;
error = git_commit_tree(&commit_tree, (git_commit *)commit);
error = git_commit_tree(&parent_tree, parent);

git_diff *diff = NULL;
error = git_diff_tree_to_tree(&diff, repo, commit_tree, parent_tree, NULL);

git_mysql_tree_diff(mysql, repo, diff);

git_object_free(commit);
git_commit_free(parent);
git_tree_free(commit_tree);
git_tree_free(parent_tree);
git_diff_free(diff);

迭代差异:

int each_file_cb(const git_diff_delta *delta,float progress,void *payload)
{
    printf("new file:%s \n", delta->new_file.path);
    printf("old file:%s \n", delta->old_file.path);

    return 0;
}

int each_hunk_cb(
    const git_diff_delta *delta,
    const git_diff_hunk *hunk,
    void *payload)
{

    printf("hunk header:%s \n", hunk->header);

    return 0;
}

int each_line_cb(
    const git_diff_delta *delta,
    const git_diff_hunk *hunk,
    const git_diff_line *line,
    void *payload)
{
    printf("line content:%s \n", line->content);

    return 0;
}

int git_mysql_tree_diff(git_diff *diff){
    int error;

    error = git_diff_foreach(diff,
        each_file_cb,
        each_hunk_cb,
        each_line_cb,
        NULL);

    return error;
}

数据:

# oid,                                     type, size, data
'92168310a2a8e8d6577028d97931fd104965f6c5', '2', '37', 100644 README.md �����؊�J��B���f�N
'9f4ee02f459f6a28fa7a129fde6653d971429336', '1', '248', tree 92168310a2a8e8d6577028d97931fd104965f6c5 parent ad6aa3d0fcecefa5e9ea250a069da4d3be1f8e3d author Jerry Jin <jerry.yang.jin@gmail.com> 1430376253 +0800 committer Jerry Jin <jerry.yang.jin@gmail.com> 1430376253 +0800 encoding UTF-8 update readme
'ad6aa3d0fcecefa5e9ea250a069da4d3be1f8e3d', '1', '201', tree af0f65dba4ddecf5f4faf889cbd2852c341958c7 author Jerry Jin <jerry.yang.jin@gmail.com> 1430376223 +0800 committer Jerry Jin <jerry.yang.jin@gmail.com> 1430376223 +0800 encoding UTF-8 Initial Commit
'af0f65dba4ddecf5f4faf889cbd2852c341958c7', '2', '37', 100644 README.md ��vX"��}���lW�`@�#
'f8a612e3f687d88a984acaf41142ba85a3668d4e', '3', '11', commit test
'fcad765822a69c7de41bb1db186c57b160409923', '3', '6', commit

输出:

file progress:0.000000

【问题讨论】:

  • 似乎对 mysql 数据类型有不必要的引用,但无论如何,您确定您的树之间存在 差异吗?您没有打印正在处理的文件,因此不清楚是否正在发生任何事情。
  • 嗨,Carlos,感谢您的回复,我调试了每个函数的 diff,diff.h GIT_INLINE(int) git_diff_file__resolve_zero_size 函数中存在错误。在返回语句之后出现错误:运行时检查失败 #2 - 变量 'len' 周围的堆栈已损坏。
  • 我的代码中存在内存问题,这会阻止每个 diff 完成,将尝试修复内存问题并查看 diff 输出

标签: libgit2


【解决方案1】:

修复内存问题后,比较下面打印的每个

new file:README.md
old file:README.md

hunk header:@@ -1 +1 @@

line content:commit testd
line content:
\ No newline at end of file

line content:commit;
line content:
\ No newline at end of file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 2020-07-10
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多