#ifndef GITFS_GIT_H #define GITFS_GIT_H #include #include #include namespace GitFS { namespace Git { struct Error { int err; int klass; const char * message; }; void throwError(int err); template void gitSafe(int (*func)(P...), A ... p) { if (int _giterror = func(p...); _giterror != 0) { throwError(_giterror); } } template using TPtr = std::shared_ptr; template auto gitSafeGet(int(*get)(R**, P...), void(*release)(R*), A ... p) { R * r = nullptr; gitSafe(get, &r, p...); return TPtr(r, release); } template auto gitSafeGet(int(*get)(R**, P...), A ... p) { R * r = nullptr; gitSafe(get, &r, p...); return r; } inline auto OidParse(const std::string_view & str) { git_oid oid; gitSafe(git_oid_fromstrn, &oid, str.data(), str.length()); return oid; } inline auto RepositoryOpenBare(const std::string & path) { return gitSafeGet(git_repository_open_bare, git_repository_free, path.c_str()); } using RepositoryPtr = decltype(RepositoryOpenBare("")); inline auto BlobLookup(const RepositoryPtr & repo, const git_oid & blob) { return gitSafeGet(git_blob_lookup, git_blob_free, repo.get(), &blob); } using BlobPtr = decltype(BlobLookup({}, {})); inline auto CommitLookup(const RepositoryPtr & repo, const git_oid & commitId) { return gitSafeGet(git_commit_lookup, git_commit_free, repo.get(), &commitId); } using CommitPtr = decltype(CommitLookup({}, {})); inline auto TreeLookup(const RepositoryPtr & repo, const git_oid & treeId) { return gitSafeGet(git_tree_lookup, git_tree_free, repo.get(), &treeId); } using TreePtr = decltype(TreeLookup({}, {})); inline auto TreeEntryByPath(const TreePtr & tree, const std::string & path) { return gitSafeGet(git_tree_entry_bypath, git_tree_entry_free, tree.get(), path.c_str() + 1); } using TreeEntryPtr = decltype(TreeEntryByPath({}, {})); } } namespace std { std::ostream & operator<<(std::ostream &, const git_oid &); } #endif