Guitar
Git.h
Go to the documentation of this file.
1 #ifndef GIT_H
2 #define GIT_H
3 
4 #include "AbstractGitSession.h"
5 #include "GitTypes.h"
6 #include <zlib.h>
7 
8 class GitContext {
9 public:
10  std::string git_command;
11  std::string ssh_command;
12 
13  std::shared_ptr<AbstractGitSession> connect() const;
14 };
15 
16 class Git {
17  friend class GitRunner;
18 private:
19  std::shared_ptr<AbstractGitSession> session_;
20 public:
22  {
23  switch (c) {
24  case 'G':
26  case 'U':
27  case 'X':
28  case 'Y':
30  case 'B':
31  case 'R':
33  case 'E':
35  case 'N':
36  case ' ':
37  case 0:
39  }
41  }
42 
43  static bool isUncommitted(GitCommitItem const &item)
44  {
45  return !item.commit_id.isValid();
46  }
47 
48 private:
49  std::vector<std::string> make_branch_list_(const std::optional<GitResult> &result);
50  std::vector<GitFileStatus> status_s_u_(std::string *out);
51  bool commit_(const std::string &msg, bool amend, bool sign, AbstractPtyProcess *pty);
52  static void parseAheadBehind(const std::string &s, GitBranch *b);
53  Git();
54  void _init(const GitContext &cx);
55  static std::string quoted_text(std::string const &str);
56  static std::optional<GitCommitItem> parseCommitItem(const std::string &line);
57  std::string submoduleURL(std::string const &path);
58 public:
59  Git(GitContext const &cx, std::string const &repodir, std::string const &submodpath, std::string const &sshkey);
60  Git(Git &&r) = delete;
61  ~Git() = default;
62 
63  void clearCommandCache();
64  void clearObjectCache();
65 
67  {
68  return session_->gitinfo();
69  }
71  {
72  return session_->gitinfo();
73  }
74 
75  std::vector<char> toByteArray(const std::optional<GitResult> &var) const;
76  bool isValidGitCommand() const
77  {
78  return session_->is_connected();
79  }
80  std::string resultStdString(const std::optional<GitResult> &var) const;
81 #ifdef QT_VERSION
82  QString resultQString(const std::optional<GitResult> &var) const;
83 #endif
84  std::optional<GitResult> exec_git(std::string const &arg, AbstractGitSession::Option const &opt)
85  {
86  return session_->exec_git(arg, opt);
87  }
88  std::optional<GitResult> git(std::string const &arg)
89  {
90  return exec_git(arg, {});
91  }
92  std::optional<GitResult> git_nolog(std::string const &arg, AbstractPtyProcess *pty)
93  {
95  opt.pty = pty;
96  opt.log = false;
97  return exec_git(arg, opt);
98  }
99  std::optional<GitResult> git_nochdir(std::string const &arg, AbstractPtyProcess *pty)
100  {
102  opt.pty = pty;
103  opt.chdir = false;
104  return exec_git(arg, opt);
105  }
106  bool remove(std::string const &path)
107  {
108  return session_->remove(path);
109  }
110 
111  void setWorkingRepositoryDir(std::string const &repo, std::string const &sshkey);
112  void setSubmodulePath(std::string const &submodpath);
113 
114  std::string workingDir() const
115  {
116  return session_->workingDir();
117  }
118  const std::string &sshKey() const;
119  void setSshKey(std::string const &sshkey);
120 
121  std::string getCurrentBranchName();
122  bool isValidWorkingCopy() const;
123  std::string version();
124  bool init();
125  std::vector<std::string> getUntrackedFiles();
126 
127  GitCommitItemList log_file(const std::string &path, int maxcount);
128  GitCommitItemList log_all(GitHash const &id, int maxcount);
129  std::vector<GitHash> rev_list_all(GitHash const &id, int maxcount);
130 
131  std::optional<GitCommitItem> log_signature(GitHash const &id);
132  GitCommitItemList log(int maxcount);
133  std::optional<GitCommitItem> queryCommitItem(const GitHash &id);
134 
135  static GitCloneData preclone(const std::string &url, const std::string &path);
136  bool clone(GitCloneData const &data, AbstractPtyProcess *pty);
137 
138  std::vector<GitFileStatus> status_s_u(std::string *out = nullptr);
139  std::optional<std::vector<char>> cat_file(GitHash const &id);
140  void resetFile(const std::string &path);
141  void resetAllFiles();
142 
143  void rm(const std::string &path, bool rm_real_file);
144 
145  void add_A();
146  bool unstage_all();
147 
148  void stage(const std::string &path);
149  bool stage(std::vector<std::string> const &paths, AbstractPtyProcess *pty);
150  void unstage(const std::string &path);
151  void unstage(std::vector<std::string> const &paths);
152  bool pull(AbstractPtyProcess *pty = nullptr);
153 
154  bool fetch(AbstractPtyProcess *pty = nullptr, bool prune = false);
155 
156  std::vector<GitBranch> branches();
157 
158  std::string diff(const std::string &old_id, const std::string &new_id, const GitDiffOption &opt);
159  std::string diff_file(const std::string &old_path, const std::string &new_path, const GitDiffOption &opt);
160  std::string diff_to_file(const std::string &old_id, const std::string &path, const GitDiffOption &opt);
161 
162  std::vector<std::string> diff_name_only_head();
163  std::string diff_full_index_head_file(const std::string &file);
164 
165  std::vector<GitDiffRaw> diff_raw(GitHash const &old_id, GitHash const &new_id);
166 
167  std::string status();
168  bool commit(const std::string &text, bool sign, AbstractPtyProcess *pty);
169  bool commit_amend_m(const std::string &text, bool sign, AbstractPtyProcess *pty);
170  bool revert(const GitHash &id);
171  bool push_tags(AbstractPtyProcess *pty = nullptr);
172  void remote_v(std::vector<GitRemote> *out);
173  void createBranch(const std::string &name);
174  void checkoutBranch(std::string const &name);
175  void mergeBranch(const std::string &name, GitMergeFastForward ff, bool squash);
176  bool deleteBranch(std::string const &name);
177 
178  bool checkout(const std::string &branch_name, const std::string &id = {});
179  bool checkout_detach(std::string const &id);
180 
181  void rebaseBranch(const std::string &name);
182  bool rebase_continue();
183  bool rebase_abort();
184  bool rebase_quit();
185 
186  bool isValidWorkingCopy(const std::string &dir) const;
187  std::string errorMessage(const std::optional<GitResult> &var) const;
188 
189  GitHash rev_parse(std::string const &name);
190  std::vector<GitTag> tags();
191  bool tag(const std::string &name, GitHash const &id = {});
192  bool delete_tag(const std::string &name, bool remote);
193  void setRemoteURL(const GitRemote &remote);
194  void addRemoteURL(const GitRemote &remote);
195  void removeRemote(const std::string &name);
196  std::vector<std::string> getRemotes();
197 
198  GitUser getUser(GitSource purpose);
199  void setUser(GitUser const&user, bool global);
200 
201  bool reset_head1();
202  bool reset_hard();
203  bool clean_df();
204  bool push_u(bool set_upstream, std::string const &remote, std::string const &branch, bool force, AbstractPtyProcess *pty);
205  std::string objectType(const GitHash &id);
206  bool rm_cached(const std::string &file);
207  void cherrypick(std::string const &name);
208  std::string getCherryPicking() const;
209 
210  std::string getMessage(const std::string &id);
211 
212  using ReflogItemList = std::vector<GitReflogItem>;
213 
214  std::optional<Git::ReflogItemList> reflog(int maxcount = 100);
215  std::vector<char> blame(const std::string &path);
216 
217  std::string signingKey(GitSource purpose);
218  bool setSigningKey(const std::string &id, bool global);
220  bool setSignPolicy(GitSource source, GitSignPolicy policy);
221  bool configGpgProgram(const std::string &path, bool global);
222 
223  struct RemoteInfo {
224  std::string commit_id;
225  std::string name;
226  };
227  std::vector<RemoteInfo> ls_remote();
228 
229  std::string rev_parse_show_toplevel();
230 
231  bool stash();
232  bool stash_apply();
233  bool stash_drop();
234 
235  std::vector<GitSubmoduleItem> submodules();
236  bool submodule_add(const GitCloneData &data, bool force, AbstractPtyProcess *pty);
238  static std::optional<GitCommitItem> parseCommit(const std::vector<char> &ba);
239  std::string queryEntireCommitMessage(const GitHash &id);
240 
241  std::string getDefaultBranch();
242  void setDefaultBranch(const std::string &branchname);
243  void unsetDefaultBranch();
245 
246  std::optional<std::vector<GitFileItem>> ls(std::string const &path);
247  std::optional<std::vector<char>> readfile(std::string const &path);
248 };
249 
251  enum class Type {
252  None,
253  BranchLocal,
254  BranchRemote,
255  Tag,
256  };
258  std::string remote;
259  std::string name;
261 };
262 using NamedCommitList = std::vector<NamedCommitItem>;
263 
264 std::vector<GitSubmoduleItem> parseGitSubModules(QByteArray const &ba);
265 
266 #endif // GIT_H
ApplicationGlobal * global
Definition: main.cpp:24
GitSignPolicy
Definition: GitTypes.h:464
GitMergeFastForward
Definition: GitTypes.h:416
GitSource
Definition: GitTypes.h:309
GitSignatureGrade
Definition: GitTypes.h:470
std::vector< GitSubmoduleItem > parseGitSubModules(QByteArray const &ba)
Definition: Git.cpp:1783
std::vector< NamedCommitItem > NamedCommitList
Definition: Git.h:262
Definition: AbstractProcess.h:31
Definition: DateTime.h:52
Definition: GitTypes.h:157
Definition: Git.h:8
std::shared_ptr< AbstractGitSession > connect() const
Definition: Git.cpp:1828
std::string ssh_command
Definition: Git.h:11
std::string git_command
Definition: Git.h:10
Definition: GitTypes.h:31
bool isValid() const
Definition: GitTypes.cpp:91
Definition: GitRunner.h:13
Definition: Git.h:16
std::string queryEntireCommitMessage(const GitHash &id)
Definition: Git.cpp:1133
bool fetch(AbstractPtyProcess *pty=nullptr, bool prune=false)
Definition: Git.cpp:1240
bool stash_drop()
Definition: Git.cpp:1444
void addRemoteURL(const GitRemote &remote)
Definition: Git.cpp:1509
void mergeBranch(const std::string &name, GitMergeFastForward ff, bool squash)
Definition: Git.cpp:1299
void resetAllFiles()
Definition: Git.cpp:1162
std::string diff_to_file(const std::string &old_id, const std::string &path, const GitDiffOption &opt)
Definition: Git.cpp:255
void setUser(GitUser const &user, bool global)
Definition: Git.cpp:1406
bool isValidWorkingCopy() const
Definition: Git.cpp:121
void unsetDefaultBranch()
Definition: Git.cpp:338
std::string resultStdString(const std::optional< GitResult > &var) const
Definition: Git.cpp:90
DateTime repositoryLastModifiedTime()
Definition: Git.cpp:774
std::string getDefaultBranch()
Definition: Git.cpp:321
GitSignPolicy signPolicy(GitSource source)
Definition: Git.cpp:1715
std::vector< RemoteInfo > ls_remote()
Definition: Git.cpp:1666
bool pull(AbstractPtyProcess *pty=nullptr)
Definition: Git.cpp:1233
AbstractGitSession::Info const & gitinfo() const
Definition: Git.h:70
std::optional< std::vector< char > > readfile(std::string const &path)
Definition: Git.cpp:790
AbstractGitSession::Info & gitinfo()
Definition: Git.h:66
bool commit_amend_m(const std::string &text, bool sign, AbstractPtyProcess *pty)
Definition: Git.cpp:1045
bool stash_apply()
Definition: Git.cpp:1439
bool tag(const std::string &name, GitHash const &id={})
Definition: Git.cpp:210
static void parseAheadBehind(const std::string &s, GitBranch *b)
Definition: Git.cpp:369
void unstage(const std::string &path)
Definition: Git.cpp:1209
std::string diff_full_index_head_file(const std::string &file)
Definition: Git.cpp:270
bool rebase_abort()
Definition: Git.cpp:1356
void setDefaultBranch(const std::string &branchname)
Definition: Git.cpp:329
~Git()=default
static std::optional< GitCommitItem > parseCommitItem(const std::string &line)
Definition: Git.cpp:664
bool setSigningKey(const std::string &id, bool global)
Definition: Git.cpp:1702
static std::string quoted_text(std::string const &str)
Definition: Git.cpp:1004
std::vector< GitFileStatus > status_s_u_(std::string *out)
Definition: Git.cpp:1082
GitCommitItemList log(int maxcount)
Definition: Git.cpp:769
void resetFile(const std::string &path)
Definition: Git.cpp:1157
bool deleteBranch(std::string const &name)
Definition: Git.cpp:1319
GitCommitItemList log_all(GitHash const &id, int maxcount)
Definition: Git.cpp:743
std::string diff(const std::string &old_id, const std::string &new_id, const GitDiffOption &opt)
Definition: Git.cpp:241
void setWorkingRepositoryDir(std::string const &repo, std::string const &sshkey)
Definition: Git.cpp:57
void cherrypick(std::string const &name)
Definition: Git.cpp:1273
std::vector< GitSubmoduleItem > submodules()
Definition: Git.cpp:940
void createBranch(const std::string &name)
Definition: Git.cpp:1263
bool rm_cached(const std::string &file)
Definition: Git.cpp:1449
void add_A()
Definition: Git.cpp:1182
bool submodule_update(const GitSubmoduleUpdateData &data, AbstractPtyProcess *pty)
Definition: Git.cpp:989
static GitCloneData preclone(const std::string &url, const std::string &path)
Definition: Git.cpp:878
bool commit(const std::string &text, bool sign, AbstractPtyProcess *pty)
Definition: Git.cpp:1040
void _init(const GitContext &cx)
Definition: Git.cpp:52
void setRemoteURL(const GitRemote &remote)
Definition: Git.cpp:1501
std::string diff_file(const std::string &old_path, const std::string &new_path, const GitDiffOption &opt)
Definition: Git.cpp:248
void checkoutBranch(std::string const &name)
Definition: Git.cpp:1268
bool rebase_quit()
Definition: Git.cpp:1351
std::string getMessage(const std::string &id)
Definition: Git.cpp:1293
std::string getCurrentBranchName()
Definition: Git.cpp:345
bool submodule_add(const GitCloneData &data, bool force, AbstractPtyProcess *pty)
Definition: Git.cpp:972
std::string status()
Definition: Git.cpp:78
static bool isUncommitted(GitCommitItem const &item)
Definition: Git.h:43
std::vector< GitDiffRaw > diff_raw(GitHash const &old_id, GitHash const &new_id)
Definition: Git.cpp:285
std::vector< char > toByteArray(const std::optional< GitResult > &var) const
Definition: Git.cpp:84
bool clean_df()
Definition: Git.cpp:1429
static std::optional< GitCommitItem > parseCommit(const std::vector< char > &ba)
Definition: Git.cpp:569
bool stash()
Definition: Git.cpp:1434
bool remove(std::string const &path)
Definition: Git.h:106
GitCommitItemList log_file(const std::string &path, int maxcount)
コミットログを取得する
Definition: Git.cpp:719
GitHash rev_parse(std::string const &name)
Definition: Git.cpp:177
void setSubmodulePath(std::string const &submodpath)
Definition: Git.cpp:63
void clearCommandCache()
Definition: Git.cpp:42
bool unstage_all()
Definition: Git.cpp:1228
std::optional< std::vector< char > > cat_file(GitHash const &id)
Definition: Git.cpp:1124
void remote_v(std::vector< GitRemote > *out)
Definition: Git.cpp:1455
GitUser getUser(GitSource purpose)
Definition: Git.cpp:1374
std::vector< GitFileStatus > status_s_u(std::string *out=nullptr)
Definition: Git.cpp:1110
std::string version()
Definition: Git.cpp:153
std::string errorMessage(const std::optional< GitResult > &var) const
Definition: Git.cpp:110
Git(Git &&r)=delete
bool push_u(bool set_upstream, std::string const &remote, std::string const &branch, bool force, AbstractPtyProcess *pty)
Definition: Git.cpp:1057
std::string signingKey(GitSource purpose)
Definition: Git.cpp:1686
bool push_tags(AbstractPtyProcess *pty=nullptr)
Definition: Git.cpp:1074
std::optional< Git::ReflogItemList > reflog(int maxcount=100)
Definition: Git.cpp:1525
bool reset_head1()
Definition: Git.cpp:1419
void removeRemote(const std::string &name)
Definition: Git.cpp:1518
static GitSignatureGrade evaluateSignature(char c)
Definition: Git.h:21
std::optional< GitCommitItem > queryCommitItem(const GitHash &id)
Definition: Git.cpp:863
std::string getCherryPicking() const
Definition: Git.cpp:1278
bool delete_tag(const std::string &name, bool remote)
Definition: Git.cpp:217
void rebaseBranch(const std::string &name)
Definition: Git.cpp:1341
bool checkout(const std::string &branch_name, const std::string &id={})
Definition: Git.cpp:1324
bool configGpgProgram(const std::string &path, bool global)
Definition: Git.cpp:1752
std::vector< GitTag > tags()
Definition: Git.cpp:189
void stage(const std::string &path)
Definition: Git.cpp:1187
bool setSignPolicy(GitSource source, GitSignPolicy policy)
Definition: Git.cpp:1732
std::vector< std::string > diff_name_only_head()
Definition: Git.cpp:262
std::string objectType(const GitHash &id)
Definition: Git.cpp:1115
std::vector< std::string > getUntrackedFiles()
Definition: Git.cpp:357
bool reset_hard()
Definition: Git.cpp:1424
std::optional< GitResult > git_nolog(std::string const &arg, AbstractPtyProcess *pty)
Definition: Git.h:92
std::optional< GitResult > git(std::string const &arg)
Definition: Git.h:88
std::optional< GitResult > exec_git(std::string const &arg, AbstractGitSession::Option const &opt)
Definition: Git.h:84
void rm(const std::string &path, bool rm_real_file)
Definition: Git.cpp:1167
bool clone(GitCloneData const &data, AbstractPtyProcess *pty)
Definition: Git.cpp:901
bool commit_(const std::string &msg, bool amend, bool sign, AbstractPtyProcess *pty)
Definition: Git.cpp:1018
std::vector< std::string > make_branch_list_(const std::optional< GitResult > &result)
Definition: Git.cpp:1252
std::string rev_parse_show_toplevel()
Definition: Git.cpp:1176
std::vector< char > blame(const std::string &path)
Definition: Git.cpp:1655
bool rebase_continue()
Definition: Git.cpp:1346
std::vector< GitBranch > branches()
Definition: Git.cpp:435
bool checkout_detach(std::string const &id)
Definition: Git.cpp:1336
std::vector< GitReflogItem > ReflogItemList
Definition: Git.h:212
const std::string & sshKey() const
Definition: Git.cpp:68
std::optional< std::vector< GitFileItem > > ls(std::string const &path)
Definition: Git.cpp:785
std::string workingDir() const
Definition: Git.h:114
bool revert(const GitHash &id)
Definition: Git.cpp:1050
std::vector< std::string > getRemotes()
Definition: Git.cpp:1361
void clearObjectCache()
Definition: Git.cpp:47
bool isValidGitCommand() const
Definition: Git.h:76
void setSshKey(std::string const &sshkey)
Definition: Git.cpp:73
bool init()
Definition: Git.cpp:159
std::shared_ptr< AbstractGitSession > session_
Definition: Git.h:19
std::optional< GitResult > git_nochdir(std::string const &arg, AbstractPtyProcess *pty)
Definition: Git.h:99
std::string submoduleURL(std::string const &path)
Definition: Git.cpp:930
Git()
Definition: Git.cpp:31
std::optional< GitCommitItem > log_signature(GitHash const &id)
Git::log_signature.
Definition: Git.cpp:802
std::vector< GitHash > rev_list_all(GitHash const &id, int maxcount)
Definition: Git.cpp:748
static Variant var(jstream::Reader const &reader)
Definition: jstream.h:1738
Definition: AbstractGitSession.h:24
Definition: AbstractGitSession.h:17
AbstractPtyProcess * pty
Definition: AbstractGitSession.h:22
bool log
Definition: AbstractGitSession.h:20
bool chdir
Definition: AbstractGitSession.h:19
Definition: GitTypes.h:276
Definition: GitTypes.h:303
Definition: GitTypes.h:121
GitHash commit_id
Definition: GitTypes.h:122
Definition: GitTypes.h:518
Definition: GitTypes.h:11
Definition: GitTypes.h:434
Definition: GitTypes.h:267
Definition: Git.h:223
std::string name
Definition: Git.h:225
std::string commit_id
Definition: Git.h:224
Definition: Git.h:250
Type type
Definition: Git.h:257
std::string remote
Definition: Git.h:258
Type
Definition: Git.h:251
GitHash id
Definition: Git.h:260
std::string name
Definition: Git.h:259