diff options
Diffstat (limited to 'src/git.h')
-rw-r--r-- | src/git.h | 71 |
1 files changed, 25 insertions, 46 deletions
@@ -7,81 +7,60 @@ namespace GitFS { namespace Git { - struct Error { - int err; - int klass; - const char * message; - }; - void throwError(int err); - - template<typename ... P, typename ... A> + template<typename E> + [[noreturn]] void throwError(int err); + + template<typename E, typename ... P, typename ... A> void gitSafe(int (*func)(P...), A ... p) { if (int _giterror = func(p...); _giterror != 0) { - throwError(_giterror); + throwError<E>(_giterror); } } - [[noreturn]] void ErrorToSystemError(const Error & e); - template<typename T> using TPtr = std::shared_ptr<T>; - template<typename R, typename ... P, typename ... A> + template<typename E, typename R, typename ... P, typename ... A> auto gitSafeGet(int(*get)(R**, P...), void(*release)(R*), A ... p) { R * r = nullptr; - gitSafe(get, &r, p...); + gitSafe<E>(get, &r, p...); return TPtr<R>(r, release); } - template<typename R, typename ... P, typename ... A> + template<typename E, typename R, typename ... P, typename ... A> auto gitSafeGet(int(*get)(R**, P...), A ... p) { R * r = nullptr; - gitSafe(get, &r, p...); + gitSafe<E>(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; - } + git_oid OidParse(const std::string_view & str); - inline auto RepositoryOpenBare(const std::string & path) - { - return gitSafeGet(git_repository_open_bare, git_repository_free, path.c_str()); - } - using RepositoryPtr = decltype(RepositoryOpenBare("")); + using RepositoryPtr = decltype(gitSafeGet<std::exception>( + git_repository_open_bare, git_repository_free, nullptr)); + RepositoryPtr RepositoryOpenBare(const std::string & path); - 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({}, {})); + using BlobPtr = decltype(gitSafeGet<std::exception>( + git_blob_lookup, git_blob_free, nullptr, nullptr)); + BlobPtr BlobLookup(const RepositoryPtr & repo, const git_oid & blob); - 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({}, {})); + using CommitPtr = decltype(gitSafeGet<std::exception>( + git_commit_lookup, git_commit_free, nullptr, nullptr)); + CommitPtr CommitLookup(const RepositoryPtr & repo, const git_oid & commitId); - 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({}, {})); + using TreePtr = decltype(gitSafeGet<std::exception>( + git_tree_lookup, git_tree_free, nullptr, nullptr)); + TreePtr TreeLookup(const RepositoryPtr & repo, const git_oid & treeId); - 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({}, {})); + using TreeEntryPtr = decltype(gitSafeGet<std::exception>( + git_tree_entry_bypath, git_tree_entry_free, nullptr, nullptr)); + TreeEntryPtr TreeEntryByPath(const TreePtr & tree, const std::string & path); } } |