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 <QDateTime>
7 #include <zlib.h>
8 
9 class GitContext {
10 public:
11  QString git_command;
12  QString ssh_command;
13 
14  std::shared_ptr<AbstractGitSession> connect() const;
15 };
16 
17 class Git {
18  friend class GitRunner;
19 private:
20  std::shared_ptr<AbstractGitSession> session_;
21 public:
23  {
24  switch (c) {
25  case 'G':
27  case 'U':
28  case 'X':
29  case 'Y':
31  case 'B':
32  case 'R':
34  case 'E':
36  case 'N':
37  case ' ':
38  case 0:
40  }
42  }
43 
44  static bool isUncommited(GitCommitItem const &item)
45  {
46  return !item.commit_id.isValid();
47  }
48 
49 private:
50  QStringList make_branch_list_(const std::optional<GitResult> &result);
51  std::vector<GitFileStatus> status_s_();
52  bool commit_(QString const &msg, bool amend, bool sign, AbstractPtyProcess *pty);
53  static void parseAheadBehind(QString const &s, GitBranch *b);
54  Git();
55  void _init(const GitContext &cx);
56  QString encodeQuotedText(QString const &str);
57  static std::optional<GitCommitItem> parseCommitItem(const QString &line);
58  QString submoduleURL(const QString &path);
59 public:
60  Git(GitContext const &cx, QString const &repodir, QString const &submodpath, QString const &sshkey);
61  Git(Git &&r) = delete;
62  ~Git() = default;
63 
64  void clearCommandCache();
65  void clearObjectCache();
66 
68  {
69  return session_->gitinfo();
70  }
72  {
73  return session_->gitinfo();
74  }
75 
76  QByteArray toQByteArray(const std::optional<GitResult> &var) const;
77  bool isValidGitCommand() const
78  {
79  return session_->is_connected();
80  }
81  std::string resultStdString(const std::optional<GitResult> &var) const;
82  QString resultQString(const std::optional<GitResult> &var) const;
83  std::optional<GitResult> exec_git(QString const &arg, AbstractGitSession::Option const &opt)
84  {
85  return session_->exec_git(arg, opt);
86  }
87  std::optional<GitResult> git(QString const &arg)
88  {
89  return exec_git(arg, {});
90  }
91  std::optional<GitResult> git_nolog(QString const &arg, AbstractPtyProcess *pty)
92  {
94  opt.pty = pty;
95  opt.log = false;
96  return exec_git(arg, opt);
97  }
98  std::optional<GitResult> git_nochdir(QString const &arg, AbstractPtyProcess *pty)
99  {
101  opt.pty = pty;
102  opt.chdir = false;
103  return exec_git(arg, opt);
104  }
105  bool remove(QString const &path)
106  {
107  return session_->remove(path);
108  }
109 
110  void setWorkingRepositoryDir(QString const &repo, const QString &sshkey);
111  void setSubmodulePath(const QString &submodpath);
112 
113  QString workingDir() const
114  {
115  return session_->workingDir();
116  }
117  QString const &sshKey() const;
118  void setSshKey(const QString &sshkey);
119 
120  QString getCurrentBranchName();
121  bool isValidWorkingCopy() const;
122  QString version();
123  bool init();
124  QStringList getUntrackedFiles();
125 
126  GitCommitItemList log_all(GitHash const &id, int maxcount);
127  GitCommitItemList log_file(QString const &path, int maxcount);
128  std::vector<GitHash> rev_list_all(GitHash const &id, int maxcount);
129 
130  std::optional<GitCommitItem> log_signature(GitHash const &id);
131  GitCommitItemList log(int maxcount);
132  std::optional<GitCommitItem> queryCommitItem(const GitHash &id);
133 
134  static GitCloneData preclone(QString const &url, QString const &path);
135  bool clone(GitCloneData const &data, AbstractPtyProcess *pty);
136 
137  std::vector<GitFileStatus> status_s();
138  std::optional<QByteArray> cat_file(GitHash const &id);
139  void resetFile(QString const &path);
140  void resetAllFiles();
141 
142  void rm(QString const &path, bool rm_real_file);
143 
144  void add_A();
145  bool unstage_all();
146 
147  void stage(QString const &path);
148  bool stage(QStringList const &paths, AbstractPtyProcess *pty);
149  void unstage(QString const &path);
150  void unstage(QStringList const &paths);
151  bool pull(AbstractPtyProcess *pty = nullptr);
152 
153  bool fetch(AbstractPtyProcess *pty = nullptr, bool prune = false);
154 
155  QList<GitBranch> branches();
156 
157  QString diff(QString const &old_id, QString const &new_id);
158  QString diff_file(QString const &old_path, QString const &new_path);
159 
160  std::vector<std::string> diff_name_only_head();
161  std::string diff_full_index_head_file(const QString &file);
162 
163  QList<GitDiffRaw> diff_raw(GitHash const &old_id, GitHash const &new_id);
164 
165  QString status();
166  bool commit(QString const &text, bool sign, AbstractPtyProcess *pty);
167  bool commit_amend_m(QString const &text, bool sign, AbstractPtyProcess *pty);
168  bool revert(const GitHash &id);
169  bool push_tags(AbstractPtyProcess *pty = nullptr);
170  void remote_v(std::vector<GitRemote> *out);
171  void createBranch(QString const &name);
172  void checkoutBranch(QString const &name);
173  void mergeBranch(QString const &name, GitMergeFastForward ff, bool squash);
174  bool deleteBranch(QString const &name);
175 
176  bool checkout(QString const &branch_name, QString const &id = {});
177  bool checkout_detach(QString const &id);
178 
179  void rebaseBranch(QString const &name);
180  void rebase_abort();
181 
182  bool isValidWorkingCopy(QString const &dir) const;
183  QString diff_to_file(QString const &old_id, QString const &path);
184  QString errorMessage(const std::optional<GitResult> &var) const;
185 
186  GitHash rev_parse(QString const &name);
187  QList<GitTag> tags();
188  bool tag(QString const &name, GitHash const &id = {});
189  bool delete_tag(QString const &name, bool remote);
190  void setRemoteURL(const GitRemote &remote);
191  void addRemoteURL(const GitRemote &remote);
192  void removeRemote(QString const &name);
193  QStringList getRemotes();
194 
195  GitUser getUser(GitSource purpose);
196  void setUser(GitUser const&user, bool global);
197 
198  bool reset_head1();
199  bool reset_hard();
200  bool clean_df();
201  bool push_u(bool set_upstream, QString const &remote, QString const &branch, bool force, AbstractPtyProcess *pty);
202  QString objectType(const GitHash &id);
203  bool rm_cached(QString const &file);
204  void cherrypick(QString const &name);
205  QString getCherryPicking() const;
206 
207  QString getMessage(const QString &id);
208 
209  using ReflogItemList = QList<GitReflogItem>;
210 
211  bool reflog(ReflogItemList *out, int maxcount = 100);
212  QByteArray blame(QString const &path);
213 
214  QString signingKey(GitSource purpose);
215  bool setSigningKey(QString const &id, bool global);
217  bool setSignPolicy(GitSource source, GitSignPolicy policy);
218  bool configGpgProgram(QString const &path, bool global);
219 
220  struct RemoteInfo {
221  QString commit_id;
222  QString name;
223  };
224  QList<RemoteInfo> ls_remote();
225 
226  bool stash();
227  bool stash_apply();
228  bool stash_drop();
229 
230  QList<GitSubmoduleItem> submodules();
231  bool submodule_add(const GitCloneData &data, bool force, AbstractPtyProcess *pty);
233  static std::optional<GitCommitItem> parseCommit(QByteArray const &ba);
234  QString queryEntireCommitMessage(const GitHash &id);
235 
236  QString getDefaultBranch();
237  void setDefaultBranch(QString const &branchname);
238  void unsetDefaultBranch();
239  QDateTime repositoryLastModifiedTime();
240 
241  std::optional<std::vector<GitFileItem>> ls(const QString &path);
242  std::optional<std::vector<char>> readfile(const QString &path);
243 };
244 
246  enum class Type {
247  None,
248  BranchLocal,
249  BranchRemote,
250  Tag,
251  };
253  QString remote;
254  QString name;
256 };
257 using NamedCommitList = QList<NamedCommitItem>;
258 
259 void parseDiff(const std::string_view &s, GitDiff const *info, GitDiff *out);
260 
261 void parseGitSubModules(QByteArray const &ba, QList<GitSubmoduleItem> *out);
262 
263 #endif // GIT_H
ApplicationGlobal * global
Definition: main.cpp:28
GitSignPolicy
Definition: GitTypes.h:412
GitMergeFastForward
Definition: GitTypes.h:364
GitSource
Definition: GitTypes.h:257
GitSignatureGrade
Definition: GitTypes.h:418
void parseDiff(const std::string_view &s, GitDiff const *info, GitDiff *out)
Definition: Git.cpp:1756
QList< NamedCommitItem > NamedCommitList
Definition: Git.h:257
void parseGitSubModules(QByteArray const &ba, QList< GitSubmoduleItem > *out)
Definition: Git.cpp:1797
Definition: AbstractProcess.h:11
Definition: GitTypes.h:142
Definition: Git.h:9
std::shared_ptr< AbstractGitSession > connect() const
Definition: Git.cpp:1839
QString ssh_command
Definition: Git.h:12
QString git_command
Definition: Git.h:11
Definition: GitTypes.h:433
Definition: GitTypes.h:31
bool isValid() const
Definition: GitTypes.cpp:98
Definition: GitRunner.h:14
Definition: Git.h:17
bool reflog(ReflogItemList *out, int maxcount=100)
Definition: Git.cpp:1495
QString getDefaultBranch()
Definition: Git.cpp:292
bool fetch(AbstractPtyProcess *pty=nullptr, bool prune=false)
Definition: Git.cpp:1230
QStringList getRemotes()
Definition: Git.cpp:1340
QString getCurrentBranchName()
Definition: Git.cpp:314
bool stash_drop()
Definition: Git.cpp:1416
void addRemoteURL(const GitRemote &remote)
Definition: Git.cpp:1480
std::optional< GitResult > git_nolog(QString const &arg, AbstractPtyProcess *pty)
Definition: Git.h:91
std::optional< GitResult > git(QString const &arg)
Definition: Git.h:87
void resetAllFiles()
Definition: Git.cpp:1159
static bool isUncommited(GitCommitItem const &item)
Definition: Git.h:44
void setUser(GitUser const &user, bool global)
Definition: Git.cpp:1378
bool isValidWorkingCopy() const
Definition: Git.cpp:112
void setWorkingRepositoryDir(QString const &repo, const QString &sshkey)
Definition: Git.cpp:44
void unsetDefaultBranch()
Definition: Git.cpp:307
QString status()
Definition: Git.cpp:68
std::string resultStdString(const std::optional< GitResult > &var) const
Definition: Git.cpp:84
QByteArray blame(QString const &path)
Definition: Git.cpp:1626
static GitCloneData preclone(QString const &url, QString const &path)
Definition: Git.cpp:864
void rebase_abort()
Definition: Git.cpp:1335
GitSignPolicy signPolicy(GitSource source)
Definition: Git.cpp:1686
GitCommitItemList log_file(QString const &path, int maxcount)
Definition: Git.cpp:608
bool pull(AbstractPtyProcess *pty=nullptr)
Definition: Git.cpp:1223
std::vector< GitFileStatus > status_s()
Definition: Git.cpp:1106
void rm(QString const &path, bool rm_real_file)
Definition: Git.cpp:1164
QList< GitBranch > branches()
Definition: Git.cpp:404
AbstractGitSession::Info const & gitinfo() const
Definition: Git.h:71
AbstractGitSession::Info & gitinfo()
Definition: Git.h:67
QDateTime repositoryLastModifiedTime()
Definition: Git.cpp:661
bool commit_(QString const &msg, bool amend, bool sign, AbstractPtyProcess *pty)
Definition: Git.cpp:1020
std::optional< GitResult > exec_git(QString const &arg, AbstractGitSession::Option const &opt)
Definition: Git.h:83
std::optional< QByteArray > cat_file(GitHash const &id)
Definition: Git.cpp:1120
QString version()
Definition: Git.cpp:141
QString diff_file(QString const &old_path, QString const &new_path)
Definition: Git.cpp:227
bool stash_apply()
Definition: Git.cpp:1411
QString getCherryPicking() const
Definition: Git.cpp:1268
QList< GitSubmoduleItem > submodules()
Definition: Git.cpp:932
QList< RemoteInfo > ls_remote()
Definition: Git.cpp:1637
~Git()=default
QString encodeQuotedText(QString const &str)
Definition: Git.cpp:998
void createBranch(QString const &name)
Definition: Git.cpp:1253
QString submoduleURL(const QString &path)
Definition: Git.cpp:920
void mergeBranch(QString const &name, GitMergeFastForward ff, bool squash)
Definition: Git.cpp:1288
GitCommitItemList log(int maxcount)
Definition: Git.cpp:656
QString workingDir() const
Definition: Git.h:113
QString const & sshKey() const
Definition: Git.cpp:56
bool remove(QString const &path)
Definition: Git.h:105
void cherrypick(QString const &name)
Definition: Git.cpp:1263
bool configGpgProgram(QString const &path, bool global)
Definition: Git.cpp:1725
bool rm_cached(QString const &file)
Definition: Git.cpp:1421
GitCommitItemList log_all(GitHash const &id, int maxcount)
コミットログを取得する
Definition: Git.cpp:582
bool commit(QString const &text, bool sign, AbstractPtyProcess *pty)
Definition: Git.cpp:1042
void checkoutBranch(QString const &name)
Definition: Git.cpp:1258
void add_A()
Definition: Git.cpp:1173
bool submodule_update(const GitSubmoduleUpdateData &data, AbstractPtyProcess *pty)
Definition: Git.cpp:983
static std::optional< GitCommitItem > parseCommit(QByteArray const &ba)
Definition: Git.cpp:750
void removeRemote(QString const &name)
Definition: Git.cpp:1488
void unstage(QString const &path)
Definition: Git.cpp:1200
QList< GitDiffRaw > diff_raw(GitHash const &old_id, GitHash const &new_id)
Definition: Git.cpp:250
QString diff_to_file(QString const &old_id, QString const &path)
Definition: Git.cpp:284
void _init(const GitContext &cx)
Definition: Git.cpp:39
QString errorMessage(const std::optional< GitResult > &var) const
Definition: Git.cpp:101
void setRemoteURL(const GitRemote &remote)
Definition: Git.cpp:1473
QByteArray toQByteArray(const std::optional< GitResult > &var) const
Definition: Git.cpp:76
bool submodule_add(const GitCloneData &data, bool force, AbstractPtyProcess *pty)
Definition: Git.cpp:965
void stage(QString const &path)
Definition: Git.cpp:1178
bool clean_df()
Definition: Git.cpp:1401
QString signingKey(GitSource purpose)
Definition: Git.cpp:1657
bool stash()
Definition: Git.cpp:1406
GitHash rev_parse(QString const &name)
Definition: Git.cpp:165
std::vector< GitFileStatus > status_s_()
Definition: Git.cpp:1085
void setDefaultBranch(QString const &branchname)
Definition: Git.cpp:300
void clearCommandCache()
Definition: Git.cpp:29
bool unstage_all()
Definition: Git.cpp:1218
void rebaseBranch(QString const &name)
Definition: Git.cpp:1330
QString diff(QString const &old_id, QString const &new_id)
Definition: Git.cpp:219
QString resultQString(const std::optional< GitResult > &var) const
Definition: Git.cpp:92
bool commit_amend_m(QString const &text, bool sign, AbstractPtyProcess *pty)
Definition: Git.cpp:1047
void remote_v(std::vector< GitRemote > *out)
Definition: Git.cpp:1427
GitUser getUser(GitSource purpose)
Definition: Git.cpp:1353
static void parseAheadBehind(QString const &s, GitBranch *b)
Definition: Git.cpp:338
void setSshKey(const QString &sshkey)
Definition: Git.cpp:61
bool setSigningKey(QString const &id, bool global)
Definition: Git.cpp:1673
Git(Git &&r)=delete
bool push_tags(AbstractPtyProcess *pty=nullptr)
Definition: Git.cpp:1077
bool reset_head1()
Definition: Git.cpp:1391
static GitSignatureGrade evaluateSignature(char c)
Definition: Git.h:22
void resetFile(QString const &path)
Definition: Git.cpp:1154
QList< GitTag > tags()
Definition: Git.cpp:178
std::optional< std::vector< GitFileItem > > ls(const QString &path)
Definition: Git.cpp:672
QStringList getUntrackedFiles()
Definition: Git.cpp:326
std::optional< GitCommitItem > queryCommitItem(const GitHash &id)
Definition: Git.cpp:849
bool checkout(QString const &branch_name, QString const &id={})
Definition: Git.cpp:1313
bool checkout_detach(QString const &id)
Definition: Git.cpp:1325
bool deleteBranch(QString const &name)
Definition: Git.cpp:1308
static std::optional< GitCommitItem > parseCommitItem(const QString &line)
Definition: Git.cpp:535
QString objectType(const GitHash &id)
Definition: Git.cpp:1111
bool tag(QString const &name, GitHash const &id={})
Definition: Git.cpp:197
bool setSignPolicy(GitSource source, GitSignPolicy policy)
Definition: Git.cpp:1704
std::vector< std::string > diff_name_only_head()
Definition: Git.cpp:235
std::optional< std::vector< char > > readfile(const QString &path)
Definition: Git.cpp:677
std::string diff_full_index_head_file(const QString &file)
Definition: Git.cpp:243
bool delete_tag(QString const &name, bool remote)
Definition: Git.cpp:204
QStringList make_branch_list_(const std::optional< GitResult > &result)
Definition: Git.cpp:1242
bool reset_hard()
Definition: Git.cpp:1396
QList< GitReflogItem > ReflogItemList
Definition: Git.h:209
bool clone(GitCloneData const &data, AbstractPtyProcess *pty)
Definition: Git.cpp:893
std::optional< GitResult > git_nochdir(QString const &arg, AbstractPtyProcess *pty)
Definition: Git.h:98
QString queryEntireCommitMessage(const GitHash &id)
Definition: Git.cpp:1129
bool revert(const GitHash &id)
Definition: Git.cpp:1052
bool push_u(bool set_upstream, QString const &remote, QString const &branch, bool force, AbstractPtyProcess *pty)
Definition: Git.cpp:1059
void clearObjectCache()
Definition: Git.cpp:34
bool isValidGitCommand() const
Definition: Git.h:77
bool init()
Definition: Git.cpp:147
std::shared_ptr< AbstractGitSession > session_
Definition: Git.h:20
Git()
Definition: Git.cpp:18
std::optional< GitCommitItem > log_signature(GitHash const &id)
Git::log_signature.
Definition: Git.cpp:689
QString getMessage(const QString &id)
Definition: Git.cpp:1282
std::vector< GitHash > rev_list_all(GitHash const &id, int maxcount)
Definition: Git.cpp:634
void setSubmodulePath(const QString &submodpath)
Definition: Git.cpp:50
static Variant var(jstream::Reader const &reader)
Definition: jstream.h:1612
Definition: AbstractGitSession.h:25
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:224
Definition: GitTypes.h:251
Definition: GitTypes.h:114
GitHash commit_id
Definition: GitTypes.h:115
Definition: GitTypes.h:11
Definition: GitTypes.h:382
Definition: GitTypes.h:215
Definition: Git.h:220
QString name
Definition: Git.h:222
QString commit_id
Definition: Git.h:221
Definition: Git.h:245
Type type
Definition: Git.h:252
QString remote
Definition: Git.h:253
Type
Definition: Git.h:246
GitHash id
Definition: Git.h:255
QString name
Definition: Git.h:254