#include #include #include "blob.h" #include "repo.h" GitFS::Blob::Blob(const Repo * r, const std::string & path) : repo(r), entry(getTreeEntry(path)), blob(getBlob()), blobSize(git_blob_rawsize(blob.get())), blobContent(static_cast(git_blob_rawcontent(blob.get()))) { } GitFS::Git::TreeEntryPtr GitFS::Blob::getTreeEntry(const std::string & path) const { try { return Git::TreeEntryByPath(repo->tree, path); } catch (const Git::Error & e) { Git::ErrorToSystemError(e); } } GitFS::Git::BlobPtr GitFS::Blob::getBlob() const { const auto mode = git_tree_entry_filemode(entry.get()); if (S_ISDIR(mode)) throw NetFS::SystemError(EISDIR); if (S_ISLNK(mode)) throw NetFS::SystemError(ELOOP); return Git::BlobLookup(repo->repo, *git_tree_entry_id(entry.get())); } void GitFS::Blob::close(const ::Ice::Current& current) { current.adapter->remove(current.id); } NetFS::Attr GitFS::Blob::fgetattr(ReqEnv, const ::Ice::Current&) { NetFS::Attr a; a << *blob << *entry << *repo->commit; a.gid = a.uid = "root"; return a; } NetFS::Buffer GitFS::Blob::read(long long int offset, long long int size, const ::Ice::Current&) { if (offset > blobSize) { return {}; } auto len = std::min(blobSize - offset, size); return NetFS::Buffer(blobContent + offset, blobContent + offset + len); } void GitFS::Blob::ftruncate(ReqEnv, long long int, const ::Ice::Current&) { throw NetFS::SystemError(EROFS); } void GitFS::Blob::write(long long int, long long int, Buffer, const ::Ice::Current&) { throw NetFS::SystemError(EROFS); }