forked from olipfei/cbvcs
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathgit_libgit2_ops.h
115 lines (95 loc) · 3.45 KB
/
git_libgit2_ops.h
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#ifndef LibGit2_OPS_H
#define LibGit2_OPS_H
#include "VcsFileOp.h"
#include "VcsTreeItem.h"
#include <atomic>
#include <thread>
class LibGit2;
class LibGit2_Op : public VcsFileOp
{
public:
LibGit2_Op(LibGit2 &vcs, const wxString &vcsRootDir, ICommandExecuter &shellUtils) : VcsFileOp(vcsRootDir, shellUtils), m_vcs(vcs) {}
protected:
void DumpOutput(const wxArrayString &array) const
{
fprintf(stderr, "LibGit2::%s:%d array size %zu\n", __FUNCTION__, __LINE__, array.size());
for (size_t i = 0; i < array.size(); ++i)
{
fprintf(stderr, "LibGit2::%s:%d array[%zu] = %s\n", __FUNCTION__, __LINE__, i, array[i].ToUTF8().data());
}
};
LibGit2 &m_vcs;
private:
virtual void ExecuteImplementation(std::vector<std::shared_ptr<VcsTreeItem>>) = 0;
};
class ICommandExecuter;
enum ItemState;
class LibGit2UpdateOp : public LibGit2_Op
{
public:
LibGit2UpdateOp(LibGit2 &vcs, const wxString &vcsRootDir, ICommandExecuter &shellUtils);
protected:
void UpdateItem(VcsTreeItem *pf, const class GitRepo& gitRepo) const;
private:
virtual void ExecuteImplementation(std::vector<std::shared_ptr<VcsTreeItem>>);
};
class LibGit2AddOp : public LibGit2_Op
{
public:
LibGit2AddOp(LibGit2 &vcs, const wxString &vcsRootDir, ICommandExecuter &shellUtils) : LibGit2_Op(vcs, vcsRootDir, shellUtils) {}
protected:
virtual void ExecuteImplementation(std::vector<std::shared_ptr<VcsTreeItem>>);
};
class LibGit2CommitOp : public LibGit2AddOp
{
public:
LibGit2CommitOp(LibGit2 &vcs, const wxString &vcsRootDir, ICommandExecuter &shellUtils) : LibGit2AddOp(vcs, vcsRootDir, shellUtils) {}
private:
virtual void ExecuteImplementation(std::vector<std::shared_ptr<VcsTreeItem>>);
};
class LibGit2DiffOp : public LibGit2_Op
{
public:
LibGit2DiffOp(LibGit2 &vcs, const wxString &vcsRootDir, ICommandExecuter &shellUtils) : LibGit2_Op(vcs, vcsRootDir, shellUtils) {}
private:
virtual void ExecuteImplementation(std::vector<std::shared_ptr<VcsTreeItem>>);
};
class LibGit2RemoveOp : public LibGit2_Op
{
public:
LibGit2RemoveOp(LibGit2 &vcs, const wxString &vcsRootDir, ICommandExecuter &shellUtils) : LibGit2_Op(vcs, vcsRootDir, shellUtils) {}
private:
virtual void ExecuteImplementation(std::vector<std::shared_ptr<VcsTreeItem>>);
};
class LibGit2RestoreOp : public LibGit2_Op
{
public:
LibGit2RestoreOp(LibGit2 &vcs, const wxString &vcsRootDir, ICommandExecuter &shellUtils) : LibGit2_Op(vcs, vcsRootDir, shellUtils) {}
private:
virtual void ExecuteImplementation(std::vector<std::shared_ptr<VcsTreeItem>>);
};
class LibGit2UpdateFullOp : public LibGit2UpdateOp, public wxEvtHandler
{
public:
LibGit2UpdateFullOp(LibGit2 &vcs, const wxString &vcsRootDir, ICommandExecuter &shellUtils);
bool IsAborted() const{ return m_abort;};
~LibGit2UpdateFullOp()
{
m_abort = true;
if (m_executionThread.joinable())
m_executionThread.join();
}
struct ItemStateValue
{
std::shared_ptr<VcsTreeItem> m_treeItem;
ItemState m_State;
ItemStateValue(std::shared_ptr<VcsTreeItem> treeItem, ItemState state) : m_treeItem(treeItem), m_State(state){}
};
mutable std::vector<ItemStateValue> m_pendingStates;
private:
void ExecuteImplementation(std::vector<std::shared_ptr<VcsTreeItem>>) override;
void UpdateStates();
mutable std::thread m_executionThread;
std::atomic_bool m_abort = {false};
};
#endif // LibGit2_OPS_H