Guitar
Git.h
Go to the documentation of this file.
1 
2 #ifndef GIT_H
3 #define GIT_H
4 
5 #include "GitSubmodule.h"
6 #include "AbstractGitSession.h"
7 #include "GitCloneData.h"
8 #include "GitRemote.h"
9 #include "GitResult.h"
10 #include "GitUser.h"
11 #include <optional>
12 #include <q/DateTime.h>
13 
14 struct GitDiffOption;
15 
16 class GitContext {
17 public:
18  std::string git_command;
19  std::string ssh_command;
20 
21  std::shared_ptr<AbstractGitSession> connect() const;
22 };
23 
24 class Git {
25  friend class GitRunner;
26 private:
27  std::shared_ptr<AbstractGitSession> session_;
28 public:
30  {
31  switch (c) {
32  case 'G':
34  case 'U':
35  case 'X':
36  case 'Y':
38  case 'B':
39  case 'R':
41  case 'E':
43  case 'N':
44  case ' ':
45  case 0:
47  }
49  }
50 
51  static bool isUncommitted(GitCommitItem const &item);
52 
53 private:
54  std::vector<std::string> make_branch_list_(const std::optional<GitResult> &result);
55  std::vector<GitFileStatus> status_s_u_(std::string *out);
56  bool commit_(const std::string &msg, bool amend, bool sign, AbstractPtyProcess *pty);
57  static void parseAheadBehind(const std::string &s, GitBranch *b);
58  Git();
59  void _init(const GitContext &cx);
60  static std::string quoted_text(std::string const &str);
61  static std::optional<GitCommitItem> parseCommitItem(const std::string &line);
62  std::string submoduleURL(std::string const &path);
63 public:
64  Git(GitContext const &cx, std::string const &repodir, std::string const &submodpath, std::string const &sshkey);
65  Git(Git &&r) = delete;
66  ~Git() = default;
67 
68  void clearCommandCache();
69  void clearObjectCache();
70 
72  {
73  return session_->gitinfo();
74  }
76  {
77  return session_->gitinfo();
78  }
79 
80  std::vector<char> toByteArray(const std::optional<GitResult> &var) const;
81  bool isValidGitCommand() const
82  {
83  return session_->is_connected();
84  }
85  std::string resultStdString(const std::optional<GitResult> &var) const;
86 #ifdef QT_VERSION
87  QString resultQString(const std::optional<GitResult> &var) const;
88 #endif
89  std::optional<GitResult> exec_git(std::string const &arg, AbstractGitSession::Option const &opt)
90  {
91  return session_->exec_git(arg, opt);
92  }
93  std::optional<GitResult> git(std::string const &arg)
94  {
95  return exec_git(arg, {});
96  }
97  std::optional<GitResult> git_nolog(std::string const &arg, AbstractPtyProcess *pty)
98  {
100  opt.pty = pty;
101  opt.log = false;
102  return exec_git(arg, opt);
103  }
104  std::optional<GitResult> git_nochdir(std::string const &arg, AbstractPtyProcess *pty)
105  {
107  opt.pty = pty;
108  opt.chdir = false;
109  return exec_git(arg, opt);
110  }
111  bool remove(std::string const &path)
112  {
113  return session_->remove(path);
114  }
115 
116  void setWorkingRepositoryDir(std::string const &repo, std::string const &sshkey);
117  void setSubmodulePath(std::string const &submodpath);
118 
119  std::string workingDir() const
120  {
121  return session_->workingDir();
122  }
123  const std::string &sshKey() const;
124  void setSshKey(std::string const &sshkey);
125 
126  std::string getCurrentBranchName();
127  bool isValidWorkingCopy() const;
128  std::string version();
129  bool init();
130  std::vector<std::string> getUntrackedFiles();
131 
132  GitCommitItemList log_file(const std::string &path, int maxcount);
133  GitCommitItemList log_all(GitHash const &id, int maxcount);
134  std::vector<GitHash> rev_list_all(GitHash const &id, int maxcount);
135 
136  std::optional<GitCommitItem> log_signature(GitHash const &id);
137  GitCommitItemList log(int maxcount);
138  std::optional<GitCommitItem> queryCommitItem(const GitHash &id);
139 
140  static GitCloneData preclone(const std::string &url, const std::string &path);
141  bool clone(GitCloneData const &data, AbstractPtyProcess *pty);
142 
143  std::vector<GitFileStatus> status_s_u(std::string *out = nullptr);
144  std::optional<std::vector<char>> cat_file(GitHash const &id);
145  void resetFile(const std::string &path);
146  void resetAllFiles();
147 
148  void rm(const std::string &path, bool rm_real_file);
149 
150  void add_A();
151  bool unstage_all();
152 
153  void stage(const std::string &path);
154  bool stage(std::vector<std::string> const &paths, AbstractPtyProcess *pty);
155  void unstage(const std::string &path);
156  void unstage(std::vector<std::string> const &paths);
157  bool pull(AbstractPtyProcess *pty = nullptr);
158 
159  bool fetch(AbstractPtyProcess *pty = nullptr, bool prune = false);
160 
161  std::vector<GitBranch> branches();
162 
163  std::string diff(const std::string &old_id, const std::string &new_id, const GitDiffOption &opt);
164  std::string diff_file(const std::string &old_path, const std::string &new_path, const GitDiffOption &opt);
165  std::string diff_to_file(const std::string &old_id, const std::string &path, const GitDiffOption &opt);
166 
167  std::vector<std::string> diff_name_only_head();
168  std::string diff_full_index_head_file(const std::string &file);
169 
170  std::vector<GitDiffRaw> diff_raw(GitHash const &old_id, GitHash const &new_id);
171 
172  std::string status();
173  bool commit(const std::string &text, bool sign, AbstractPtyProcess *pty);
174  bool commit_amend_m(const std::string &text, bool sign, AbstractPtyProcess *pty);
175  bool revert(const GitHash &id);
176  bool push_tags(AbstractPtyProcess *pty = nullptr);
177  std::vector<GitRemote> remote_v();
178  void createBranch(const std::string &name);
179  void checkoutBranch(std::string const &name);
180  void mergeBranch(const std::string &name, GitMergeFastForward ff, bool squash);
181  bool deleteBranch(std::string const &name);
182 
183  bool checkout(const std::string &branch_name, const std::string &id = {});
184  bool checkout_detach(std::string const &id);
185 
186  void rebaseBranch(const std::string &name);
187  bool rebase_continue();
188  bool rebase_abort();
189  bool rebase_quit();
190 
191  bool isValidWorkingCopy(const std::string &dir) const;
192  std::string errorMessage(const std::optional<GitResult> &var) const;
193 
194  GitHash rev_parse(std::string const &name);
195  std::vector<GitTag> tags();
196  bool tag(const std::string &name, GitHash const &id = {});
197  bool delete_tag(const std::string &name, bool remote);
198  void setRemoteURL(const GitRemote &remote);
199  void addRemoteURL(const GitRemote &remote);
200  void removeRemote(const std::string &name);
201  std::vector<std::string> getRemotes();
202 
203  GitUser getUser(GitSource purpose);
204  void setUser(GitUser const&user, bool global);
205 
206  bool reset_head1();
207  bool reset_hard();
208  bool clean_df();
209  bool push_u(bool set_upstream, std::string const &remote, std::string const &branch, bool force, AbstractPtyProcess *pty);
210  std::string objectType(const GitHash &id);
211  bool rm_cached(const std::string &file);
212  void cherrypick(std::string const &name);
213  std::string getCherryPicking() const;
214 
215  std::string getMessage(const std::string &id);
216 
217  using ReflogItemList = std::vector<GitReflogItem>;
218 
219  std::optional<Git::ReflogItemList> reflog(int maxcount = 100);
220  std::vector<char> blame(const std::string &path);
221 
222  std::string signingKey(GitSource purpose);
223  bool setSigningKey(const std::string &id, bool global);
225  bool setSignPolicy(GitSource source, GitSignPolicy policy);
226  bool configGpgProgram(const std::string &path, bool global);
227 
228  struct RemoteInfo {
229  std::string commit_id;
230  std::string name;
231  };
232  std::vector<RemoteInfo> ls_remote();
233 
234  std::string rev_parse_show_toplevel();
235 
236  bool stash();
237  bool stash_apply();
238  bool stash_drop();
239 
240  std::vector<GitSubmoduleItem> submodules();
241  bool submodule_add(const GitCloneData &data, bool force, AbstractPtyProcess *pty);
243  static std::optional<GitCommitItem> parseCommit(const std::vector<char> &ba);
244  std::string queryEntireCommitMessage(const GitHash &id);
245 
246  std::string getDefaultBranch();
247  void setDefaultBranch(const std::string &branchname);
248  void unsetDefaultBranch();
250 
251  std::optional<std::vector<GitFileItem>> ls(std::string const &path);
252  std::optional<std::vector<char>> readfile(std::string const &path);
253 };
254 
256  enum class Type {
257  None,
258  BranchLocal,
259  BranchRemote,
260  Tag,
261  };
263  std::string remote;
264  std::string name;
266 };
267 using NamedCommitList = std::vector<NamedCommitItem>;
268 
269 std::vector<GitSubmoduleItem> parseGitSubModules(QByteArray const &ba);
270 
271 #endif // GIT_H
ApplicationGlobal * global
Definition: main.cpp:27
GitSignPolicy
Definition: GitTypes.h:238
GitMergeFastForward
Definition: GitTypes.h:207
GitSource
Definition: GitTypes.h:100
GitSignatureGrade
Definition: GitTypes.h:244
std::vector< GitSubmoduleItem > parseGitSubModules(QByteArray const &ba)
Definition: Git.cpp:1787
std::vector< NamedCommitItem > NamedCommitList
Definition: Git.h:267
Definition: AbstractProcess.h:71
Definition: DateTime.h:52
Definition: GitTypes.h:30
Definition: Git.h:16
std::shared_ptr< AbstractGitSession > connect() const
Definition: Git.cpp:1832
std::string ssh_command
Definition: Git.h:19
std::string git_command
Definition: Git.h:18
Definition: GitHash.h:9
Definition: GitRunner.h:21
Definition: Git.h:24
std::string queryEntireCommitMessage(const GitHash &id)
Definition: Git.cpp:1144
bool fetch(AbstractPtyProcess *pty=nullptr, bool prune=false)
Definition: Git.cpp:1251
bool stash_drop()
Definition: Git.cpp:1460
void addRemoteURL(const GitRemote &remote)
Definition: Git.cpp:1526
void mergeBranch(const std::string &name, GitMergeFastForward ff, bool squash)
Definition: Git.cpp:1315
void resetAllFiles()
Definition: Git.cpp:1173
std::string diff_to_file(const std::string &old_id, const std::string &path, const GitDiffOption &opt)
Definition: Git.cpp:261
void setUser(GitUser const &user, bool global)
Definition: Git.cpp:1422
bool isValidWorkingCopy() const
Definition: Git.cpp:127
void unsetDefaultBranch()
Definition: Git.cpp:344
std::string resultStdString(const std::optional< GitResult > &var) const
Definition: Git.cpp:96
DateTime repositoryLastModifiedTime()
Definition: Git.cpp:780
std::string getDefaultBranch()
Definition: Git.cpp:327
GitSignPolicy signPolicy(GitSource source)
Definition: Git.cpp:1732
std::vector< RemoteInfo > ls_remote()
Definition: Git.cpp:1683
bool pull(AbstractPtyProcess *pty=nullptr)
Definition: Git.cpp:1244
AbstractGitSession::Info const & gitinfo() const
Definition: Git.h:75
std::optional< std::vector< char > > readfile(std::string const &path)
Definition: Git.cpp:796
AbstractGitSession::Info & gitinfo()
Definition: Git.h:71
bool commit_amend_m(const std::string &text, bool sign, AbstractPtyProcess *pty)
Definition: Git.cpp:1056
bool stash_apply()
Definition: Git.cpp:1455
bool tag(const std::string &name, GitHash const &id={})
Definition: Git.cpp:216
static void parseAheadBehind(const std::string &s, GitBranch *b)
Definition: Git.cpp:375
void unstage(const std::string &path)
Definition: Git.cpp:1220
std::string diff_full_index_head_file(const std::string &file)
Definition: Git.cpp:276
bool rebase_abort()
Definition: Git.cpp:1372
void setDefaultBranch(const std::string &branchname)
Definition: Git.cpp:335
~Git()=default
static std::optional< GitCommitItem > parseCommitItem(const std::string &line)
Definition: Git.cpp:670
bool setSigningKey(const std::string &id, bool global)
Definition: Git.cpp:1719
static std::string quoted_text(std::string const &str)
Definition: Git.cpp:1015
std::vector< GitFileStatus > status_s_u_(std::string *out)
Definition: Git.cpp:1093
GitCommitItemList log(int maxcount)
Definition: Git.cpp:775
void resetFile(const std::string &path)
Definition: Git.cpp:1168
bool deleteBranch(std::string const &name)
Definition: Git.cpp:1335
GitCommitItemList log_all(GitHash const &id, int maxcount)
Definition: Git.cpp:749
std::string diff(const std::string &old_id, const std::string &new_id, const GitDiffOption &opt)
Definition: Git.cpp:247
void setWorkingRepositoryDir(std::string const &repo, std::string const &sshkey)
Definition: Git.cpp:63
void cherrypick(std::string const &name)
Definition: Git.cpp:1289
std::vector< GitSubmoduleItem > submodules()
Definition: Git.cpp:951
void createBranch(const std::string &name)
Definition: Git.cpp:1279
bool rm_cached(const std::string &file)
Definition: Git.cpp:1465
void add_A()
Definition: Git.cpp:1193
bool submodule_update(const GitSubmoduleUpdateData &data, AbstractPtyProcess *pty)
Definition: Git.cpp:1000
static GitCloneData preclone(const std::string &url, const std::string &path)
Definition: Git.cpp:884
bool commit(const std::string &text, bool sign, AbstractPtyProcess *pty)
Definition: Git.cpp:1051
void _init(const GitContext &cx)
Definition: Git.cpp:58
void setRemoteURL(const GitRemote &remote)
Definition: Git.cpp:1518
std::string diff_file(const std::string &old_path, const std::string &new_path, const GitDiffOption &opt)
Definition: Git.cpp:254
void checkoutBranch(std::string const &name)
Definition: Git.cpp:1284
bool rebase_quit()
Definition: Git.cpp:1367
std::string getMessage(const std::string &id)
Definition: Git.cpp:1309
std::string getCurrentBranchName()
Definition: Git.cpp:351
bool submodule_add(const GitCloneData &data, bool force, AbstractPtyProcess *pty)
Definition: Git.cpp:983
std::string status()
Definition: Git.cpp:84
std::vector< GitDiffRaw > diff_raw(GitHash const &old_id, GitHash const &new_id)
Definition: Git.cpp:291
std::vector< char > toByteArray(const std::optional< GitResult > &var) const
Definition: Git.cpp:90
bool clean_df()
Definition: Git.cpp:1445
static std::optional< GitCommitItem > parseCommit(const std::vector< char > &ba)
Definition: Git.cpp:575
bool stash()
Definition: Git.cpp:1450
bool remove(std::string const &path)
Definition: Git.h:111
GitCommitItemList log_file(const std::string &path, int maxcount)
コミットログを取得する
Definition: Git.cpp:725
GitHash rev_parse(std::string const &name)
Definition: Git.cpp:183
void setSubmodulePath(std::string const &submodpath)
Definition: Git.cpp:69
void clearCommandCache()
Definition: Git.cpp:48
std::vector< GitRemote > remote_v()
Definition: Git.cpp:1471
bool unstage_all()
Definition: Git.cpp:1239
std::optional< std::vector< char > > cat_file(GitHash const &id)
Definition: Git.cpp:1135
GitUser getUser(GitSource purpose)
Definition: Git.cpp:1390
std::vector< GitFileStatus > status_s_u(std::string *out=nullptr)
Definition: Git.cpp:1121
std::string version()
Definition: Git.cpp:159
std::string errorMessage(const std::optional< GitResult > &var) const
Definition: Git.cpp:116
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:1068
std::string signingKey(GitSource purpose)
Definition: Git.cpp:1703
bool push_tags(AbstractPtyProcess *pty=nullptr)
Definition: Git.cpp:1085
std::optional< Git::ReflogItemList > reflog(int maxcount=100)
Definition: Git.cpp:1542
bool reset_head1()
Definition: Git.cpp:1435
void removeRemote(const std::string &name)
Definition: Git.cpp:1535
static GitSignatureGrade evaluateSignature(char c)
Definition: Git.h:29
std::optional< GitCommitItem > queryCommitItem(const GitHash &id)
Definition: Git.cpp:869
std::string getCherryPicking() const
Definition: Git.cpp:1294
bool delete_tag(const std::string &name, bool remote)
Definition: Git.cpp:223
void rebaseBranch(const std::string &name)
Definition: Git.cpp:1357
bool checkout(const std::string &branch_name, const std::string &id={})
Definition: Git.cpp:1340
bool configGpgProgram(const std::string &path, bool global)
Definition: Git.cpp:1769
std::vector< GitTag > tags()
Definition: Git.cpp:195
void stage(const std::string &path)
Definition: Git.cpp:1198
bool setSignPolicy(GitSource source, GitSignPolicy policy)
Definition: Git.cpp:1749
std::vector< std::string > diff_name_only_head()
Definition: Git.cpp:268
std::string objectType(const GitHash &id)
Definition: Git.cpp:1126
std::vector< std::string > getUntrackedFiles()
Definition: Git.cpp:363
bool reset_hard()
Definition: Git.cpp:1440
std::optional< GitResult > git_nolog(std::string const &arg, AbstractPtyProcess *pty)
Definition: Git.h:97
std::optional< GitResult > git(std::string const &arg)
Definition: Git.h:93
std::optional< GitResult > exec_git(std::string const &arg, AbstractGitSession::Option const &opt)
Definition: Git.h:89
void rm(const std::string &path, bool rm_real_file)
Definition: Git.cpp:1178
bool clone(GitCloneData const &data, AbstractPtyProcess *pty)
Definition: Git.cpp:907
bool commit_(const std::string &msg, bool amend, bool sign, AbstractPtyProcess *pty)
Definition: Git.cpp:1029
std::vector< std::string > make_branch_list_(const std::optional< GitResult > &result)
Definition: Git.cpp:1268
std::string rev_parse_show_toplevel()
Definition: Git.cpp:1187
std::vector< char > blame(const std::string &path)
Definition: Git.cpp:1672
bool rebase_continue()
Definition: Git.cpp:1362
std::vector< GitBranch > branches()
Definition: Git.cpp:441
bool checkout_detach(std::string const &id)
Definition: Git.cpp:1352
std::vector< GitReflogItem > ReflogItemList
Definition: Git.h:217
static bool isUncommitted(GitCommitItem const &item)
Definition: Git.cpp:1263
const std::string & sshKey() const
Definition: Git.cpp:74
std::optional< std::vector< GitFileItem > > ls(std::string const &path)
Definition: Git.cpp:791
std::string workingDir() const
Definition: Git.h:119
bool revert(const GitHash &id)
Definition: Git.cpp:1061
std::vector< std::string > getRemotes()
Definition: Git.cpp:1377
void clearObjectCache()
Definition: Git.cpp:53
bool isValidGitCommand() const
Definition: Git.h:81
void setSshKey(std::string const &sshkey)
Definition: Git.cpp:79
bool init()
Definition: Git.cpp:165
std::shared_ptr< AbstractGitSession > session_
Definition: Git.h:27
std::optional< GitResult > git_nochdir(std::string const &arg, AbstractPtyProcess *pty)
Definition: Git.h:104
std::string submoduleURL(std::string const &path)
Definition: Git.cpp:941
Git()
Definition: Git.cpp:37
std::optional< GitCommitItem > log_signature(GitHash const &id)
Git::log_signature.
Definition: Git.cpp:808
std::vector< GitHash > rev_list_all(GitHash const &id, int maxcount)
Definition: Git.cpp:754
static Variant var(jstream::Reader const &reader)
Definition: jstream.h:1739
Definition: AbstractGitSession.h:26
Definition: AbstractGitSession.h:19
AbstractPtyProcess * pty
Definition: AbstractGitSession.h:24
bool log
Definition: AbstractGitSession.h:22
bool chdir
Definition: AbstractGitSession.h:21
Definition: GitTypes.h:73
Definition: GitCloneData.h:7
Definition: GitCommitItem.h:21
Definition: GitDiff.h:55
Definition: GitRemote.h:7
Definition: GitSubmodule.h:19
Definition: GitUser.h:7
Definition: Git.h:228
std::string name
Definition: Git.h:230
std::string commit_id
Definition: Git.h:229
Definition: Git.h:255
Type type
Definition: Git.h:262
std::string remote
Definition: Git.h:263
Type
Definition: Git.h:256
GitHash id
Definition: Git.h:265
std::string name
Definition: Git.h:264