diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2019-07-20 10:53:14 +0100 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2019-07-20 10:53:14 +0100 |
commit | 4c25da8a7ba7437657c3e2da592145113d3532f4 (patch) | |
tree | 40f0468135089ff4f9e967bf8ee74b020bee67f7 /src/git.h | |
download | netfs-gitfs-4c25da8a7ba7437657c3e2da592145113d3532f4.tar.bz2 netfs-gitfs-4c25da8a7ba7437657c3e2da592145113d3532f4.tar.xz netfs-gitfs-4c25da8a7ba7437657c3e2da592145113d3532f4.zip |
Initial commit
Not a lot of stuff, hard coded paths, tests against /usr/portage
Diffstat (limited to 'src/git.h')
-rw-r--r-- | src/git.h | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/src/git.h b/src/git.h new file mode 100644 index 0000000..c0ae4e3 --- /dev/null +++ b/src/git.h @@ -0,0 +1,91 @@ +#ifndef GITFS_GIT_H +#define GITFS_GIT_H + +#include <memory> +#include <git2.h> +#include <ostream> + +namespace GitFS { + namespace Git { + struct Error { + int err; + int klass; + const char * message; + }; + void throwError(int err); + + template<typename ... P, typename ... A> + void + gitSafe(int (*func)(P...), A ... p) + { + if (int _giterror = func(p...); _giterror != 0) { + throwError(_giterror); + } + } + + template<typename T> + using TPtr = std::shared_ptr<T>; + + template<typename R, typename ... P, typename ... A> + auto + gitSafeGet(int(*get)(R**, P...), void(*release)(R*), A ... p) + { + R * r = nullptr; + gitSafe(get, &r, p...); + return TPtr<R>(r, release); + } + + template<typename R, typename ... P, typename ... A> + 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 + |