summaryrefslogtreecommitdiff
path: root/src/repo.h
blob: 795dd87f662b754e3e9f103c364163968362bd94 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#ifndef GITFS_REPO_H
#define GITFS_REPO_H

#include "git.h"
#include <Ice/Config.h>
#include <Ice/Optional.h>
#include <ctime>
#include <directory.h>
#include <file.h>
#include <functional>
#include <string>
#include <string_view>
#include <types.h>
#include <volume.h>
namespace Ice {
	struct Current;
}

namespace GitFS {
	using namespace NetFS;
	using PropertyReader = std::function<std::string(const std::string_view &)>;
	class Repo : public Volume {
	public:
		Repo(const PropertyReader &);

		void disconnect(const ::Ice::Current & current) override;
		DirectoryPrxPtr opendir(ReqEnv env, ::std::string path, const ::Ice::Current & current) override;
		VFS statfs(ReqEnv env, ::std::string path, const ::Ice::Current & current) override;
		int access(ReqEnv env, ::std::string path, int mode, const ::Ice::Current & current) override;
		Attr getattr(ReqEnv env, ::std::string path, const ::Ice::Current & current) override;
		::std::string readlink(ReqEnv env, ::std::string path, const ::Ice::Current & current) override;
		FilePrxPtr open(ReqEnv env, ::std::string path, int flags, const ::Ice::Current & current) override;
		FilePrxPtr create(ReqEnv env, ::std::string path, int flags, int mode, const ::Ice::Current & current) override;
		void truncate(ReqEnv env, ::std::string path, long long int size, const ::Ice::Current & current) override;
		void unlink(ReqEnv env, ::std::string path, const ::Ice::Current & current) override;
		void mkdir(ReqEnv env, ::std::string path, int mode, const ::Ice::Current & current) override;
		void rmdir(ReqEnv env, ::std::string path, const ::Ice::Current & current) override;
		void mknod(ReqEnv env, ::std::string path, int mode, int dev, const ::Ice::Current & current) override;
		void symlink(ReqEnv env, ::std::string path1, ::std::string path2, const ::Ice::Current & current) override;
		void link(ReqEnv env, ::std::string path1, ::std::string path2, const ::Ice::Current & current) override;
		void rename(ReqEnv env, ::std::string from, ::std::string to, const Ice::optional<Ice::Int>,
				const ::Ice::Current & current) override;
		void chmod(ReqEnv env, ::std::string path, int mode, const ::Ice::Current & current) override;
		void chown(ReqEnv env, ::std::string path, int uid, int gid, const ::Ice::Current & current) override;
		void utimens(ReqEnv env, ::std::string path, long long int atime, long long int atimens, long long int mtime,
				long long int mtimens, const ::Ice::Current & current) override;

	private:
		void update();

		friend class Directory;
		friend class Blob;
		const Git::RepositoryPtr repo;
		const std::string commitish;
		Git::RefPtr ref;
		bool isBranch;
		std::time_t resolvedAt;
		Git::CommitPtr commit;
		Git::TreePtr tree;
		const std::string gid, uid;
	};
}

#endif