summaryrefslogtreecommitdiff
path: root/src/git.h
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2019-07-20 10:53:14 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2019-07-20 10:53:14 +0100
commit4c25da8a7ba7437657c3e2da592145113d3532f4 (patch)
tree40f0468135089ff4f9e967bf8ee74b020bee67f7 /src/git.h
downloadnetfs-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.h91
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
+