#ifndef GITFS_GIT_H #define GITFS_GIT_H #include #include #include namespace GitFS { namespace Git { template [[noreturn]] void throwError(int err); template void gitSafe(int (*func)(P...), A ... p) { if (int _giterror = func(p...)) { 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; } git_oid OidParse(const std::string_view & str); using RepositoryPtr = decltype(gitSafeGet( git_repository_open_bare, git_repository_free, nullptr)); RepositoryPtr RepositoryOpenBare(const std::string & path); using BlobPtr = decltype(gitSafeGet( git_blob_lookup, git_blob_free, nullptr, nullptr)); BlobPtr BlobLookup(const RepositoryPtr & repo, const git_oid & blob); using CommitPtr = decltype(gitSafeGet( git_commit_lookup, git_commit_free, nullptr, nullptr)); CommitPtr CommitLookup(const RepositoryPtr & repo, const git_oid & commitId); using TreePtr = decltype(gitSafeGet( git_tree_lookup, git_tree_free, nullptr, nullptr)); TreePtr TreeLookup(const RepositoryPtr & repo, const git_oid & treeId); using TreeEntryPtr = decltype(gitSafeGet( git_tree_entry_bypath, git_tree_entry_free, nullptr, nullptr)); TreeEntryPtr TreeEntryByPath(const TreePtr & tree, const std::string & path); using RefPtr = decltype(gitSafeGet( git_reference_dwim, git_reference_free, nullptr, nullptr)); RefPtr Commitish(const RepositoryPtr & repo, const std::string & name); RefPtr Resolve(const RefPtr &); } } namespace NetFS { struct Attr; Attr & operator<<(Attr &, const git_tree_entry &); Attr & operator<<(Attr &, const git_commit &); Attr & operator<<(Attr &, const git_blob &); } namespace std { std::ostream & operator<<(std::ostream &, const git_oid &); } #endif