【发布时间】: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