我跟着libgit2-backend项目为libgit2 ODB后端创建了mysql后端。
创建blob对象并将其放入支持mysql的ODB中相当容易,我正在使用git_blob_create_frombuffer
但是当谈到像树这样的其他ODB对象时,这很困难。
据我所知,从libgit2文档101示例和API参考,您可以使用treebuilder或index编写树,但这两个appoach都需要路径。 由于存储库是使用git_repository_wrap_odb
创建的虚假存储库我尝试使用像'README.md'之类的相对路径来构建树或索引,然后使用git_treebuilder_write或git_index_write_tree_to,但两者都在路径验证时失败。
我想知道将树对象写入mysql odb后端的选项。
提前致谢!
示例代码:
git_odb_backend_mysql(odb_backend,"localhost", "git2", "git2", "git2", 0, NULL, 0);
git_odb_new(&odb_backend->odb);
git_repository_wrap_odb(&repo, odb_backend->odb);
git_odb_add_backend(odb_backend->odb, odb_backend, 1);
git_blob_create_frombuffer(&oid, repo, str, strlen(str));
git_treebuilder_new(&bld, repo, NULL);
git_treebuilder_insert(NULL, bld, "README.md", &oid, 0100644);
git_treebuilder_write(&treeoid, repo, bld);
这是在windows 7 32位,visual studio 2013 express for desktop edition
上测试的Libgit2版本:0.22.1
我将测试代码放入libgit2_clar
str写入mysql:
select lower(hex(oid)),type, size, convert(uncompress(data) using utf8)
from git2_odb;
oid type size data
5dd01c177f5d7d1be5346a5bc18a569a7410c2ef 3 13 Hello, world!
调用git_treebuilder_insert
时出错错误讯息: libgit2_clar.exe中0x013A56A1处的未处理异常:0xC0000005:访问冲突读取位置0x00000000。
Visual Studio调试在libgit2 / src / win32 / path_w32.c,第196行停止
if (path__is_absolute(src)) {
答案 0 :(得分:0)
由于您正在获取segfault / AV,这是libgit2中的某个错误。最有可能的地方是路径验证,以确保没有插入危险或无效的路径。此NULL
值的可能位置是存储库的路径,因为它用于确定最终路径是否会尝试写入gitdir中的任何检查。
你正在使用的构造函数只是用于读取dabatase而AFAIK从未被测试过是一种编写方式。我建议使用打开存储库,然后使用git_repository_set_odb()
设置odb,如果你想使用存储库接口的话。