Guitar
Git.h
Go to the documentation of this file.
1 #ifndef GIT_H
2 #define GIT_H
3 
4 #include "GitBasicSession.h"
5 #include "GitTypes.h"
6 #include "common/misc.h"
7 #include <QDateTime>
8 #include <zlib.h>
9 
10 
11 class GitContext {
12 public:
13  QString git_command;
14  QString ssh_command;
15 
16  std::shared_ptr<AbstractGitSession> connect() const;
17 };
18 
19 class Git {
20  friend class GitRunner;
21 private:
22  std::shared_ptr<AbstractGitSession> session_;
23 public:
25  {
26  switch (c) {
27  case 'G':
29  case 'U':
30  case 'X':
31  case 'Y':
33  case 'B':
34  case 'R':
36  case 'E':
38  case 'N':
39  case ' ':
40  case 0:
42  }
44  }
45 
46  static bool isUncommited(GitCommitItem const &item)
47  {
48  return !item.commit_id.isValid();
49  }
50 
51 private:
52  QStringList make_branch_list_(const std::optional<GitResult> &result);
53  std::vector<GitFileStatus> status_s_();
54  bool commit_(QString const &msg, bool amend, bool sign, AbstractPtyProcess *pty);
55  static void parseAheadBehind(QString const &s, GitBranch *b);
56  Git();
57  void _init(const GitContext &cx);
58  QString encodeQuotedText(QString const &str);
59  static std::optional<GitCommitItem> parseCommitItem(const QString &line);
60 public:
61  Git(GitContext const &cx, QString const &repodir, QString const &submodpath, QString const &sshkey);
62  Git(Git &&r) = delete;
63  ~Git() = default;
64 
65  void clearCommandCache();
66 
68  {
69  return session_->gitinfo();
70  }
72  {
73  return session_->gitinfo();
74  }
75 
77  {
78  return session_->gitinfo2();
79  }
81  {
82  return session_->gitinfo2();
83  }
84 
85  QByteArray toQByteArray(const std::optional<GitResult> &var) const;
86  bool isValidGitCommand() const
87  {
88  return session_->is_connected();
89  }
90  std::string resultStdString(const std::optional<GitResult> &var) const;
91  QString resultQString(const std::optional<GitResult> &var) const;
92  std::optional<GitResult> exec_git(QString const &arg, AbstractGitSession::Option const &opt)
93  {
94  return session_->exec_git(arg, opt);
95  }
96  std::optional<GitResult> git(QString const &arg)
97  {
98  return exec_git(arg, {});
99  }
100  std::optional<GitResult> git_nolog(QString const &arg, AbstractPtyProcess *pty)
101  {
103  opt.pty = pty;
104  opt.log = false;
105  return exec_git(arg, opt);
106  }
107  std::optional<GitResult> git_nochdir(QString const &arg, AbstractPtyProcess *pty)
108  {
110  opt.pty = pty;
111  opt.chdir = false;
112  return exec_git(arg, opt);
113  }
114  bool remove(QString const &path)
115  {
116  return session_->remove(path);
117  }
118 
119  void setWorkingRepositoryDir(QString const &repo, const QString &sshkey);
120  void setSubmodulePath(const QString &submodpath);
121 
122  QString workingDir() const
123  {
124  return session_->workingDir();
125  }
126  QString const &sshKey() const;
127  void setSshKey(const QString &sshkey);
128 
129  QString getCurrentBranchName();
130  bool isValidWorkingCopy() const;
131  QString version();
132  bool init();
133  QStringList getUntrackedFiles();
134 
135  GitCommitItemList log_all(GitHash const &id, int maxcount);
136  GitCommitItemList log_file(QString const &path, int maxcount);
137  QStringList rev_list_all(GitHash const &id, int maxcount);
138 
139  std::optional<GitCommitItem> log_signature(GitHash const &id);
140  GitCommitItemList log(int maxcount);
141  std::optional<GitCommitItem> queryCommitItem(const GitHash &id);
142 
143  static GitCloneData preclone(QString const &url, QString const &path);
144  bool clone(GitCloneData const &data, AbstractPtyProcess *pty);
145 
146  std::vector<GitFileStatus> status_s();
147  std::optional<QByteArray> cat_file(GitHash const &id);
148  void resetFile(QString const &path);
149  void resetAllFiles();
150 
151  void rm(QString const &path, bool rm_real_file);
152 
153  void add_A();
154  bool unstage_all();
155 
156  void stage(QString const &path);
157  bool stage(QStringList const &paths, AbstractPtyProcess *pty);
158  void unstage(QString const &path);
159  void unstage(QStringList const &paths);
160  bool pull(AbstractPtyProcess *pty = nullptr);
161 
162  bool fetch(AbstractPtyProcess *pty = nullptr, bool prune = false);
163 
164  QList<GitBranch> branches();
165 
166  QString diff(QString const &old_id, QString const &new_id);
167  QString diff_file(QString const &old_path, QString const &new_path);
168 
169  std::vector<std::string> diff_name_only_head();
170  std::string diff_full_index_head_file(const QString &file);
171 
172  QList<GitDiffRaw> diff_raw(GitHash const &old_id, GitHash const &new_id);
173 
174  QString status();
175  bool commit(QString const &text, bool sign, AbstractPtyProcess *pty);
176  bool commit_amend_m(QString const &text, bool sign, AbstractPtyProcess *pty);
177  bool revert(const GitHash &id);
178  bool push_tags(AbstractPtyProcess *pty = nullptr);
179  void remote_v(std::vector<GitRemote> *out);
180  void createBranch(QString const &name);
181  void checkoutBranch(QString const &name);
182  void mergeBranch(QString const &name, GitMergeFastForward ff, bool squash);
183  bool deleteBranch(QString const &name);
184 
185  bool checkout(QString const &branch_name, QString const &id = {});
186  bool checkout_detach(QString const &id);
187 
188  void rebaseBranch(QString const &name);
189  void rebase_abort();
190 
191  bool isValidWorkingCopy(QString const &dir) const;
192  QString diff_to_file(QString const &old_id, QString const &path);
193  QString errorMessage(const std::optional<GitResult> &var) const;
194 
195  GitHash rev_parse(QString const &name);
196  QList<GitTag> tags();
197  bool tag(QString const &name, GitHash const &id = {});
198  bool delete_tag(QString const &name, bool remote);
199  void setRemoteURL(const GitRemote &remote);
200  void addRemoteURL(const GitRemote &remote);
201  void removeRemote(QString const &name);
202  QStringList getRemotes();
203 
204  GitUser getUser(GitSource purpose);
205  void setUser(GitUser const&user, bool global);
206 
207  bool reset_head1();
208  bool reset_hard();
209  bool clean_df();
210  bool push_u(bool set_upstream, QString const &remote, QString const &branch, bool force, AbstractPtyProcess *pty);
211  QString objectType(const GitHash &id);
212  bool rm_cached(QString const &file);
213  void cherrypick(QString const &name);
214  QString getCherryPicking() const;
215 
216  QString getMessage(const QString &id);
217 
218  using ReflogItemList = QList<GitReflogItem>;
219 
220  bool reflog(ReflogItemList *out, int maxcount = 100);
221  QByteArray blame(QString const &path);
222 
223  QString signingKey(GitSource purpose);
224  bool setSigningKey(QString const &id, bool global);
226  bool setSignPolicy(GitSource source, GitSignPolicy policy);
227  bool configGpgProgram(QString const &path, bool global);
228 
229  struct RemoteInfo {
230  QString commit_id;
231  QString name;
232  };
233  QList<RemoteInfo> ls_remote();
234 
235  bool stash();
236  bool stash_apply();
237  bool stash_drop();
238 
239  QList<GitSubmoduleItem> submodules();
240  bool submodule_add(const GitCloneData &data, bool force, AbstractPtyProcess *pty);
242  static std::optional<GitCommitItem> parseCommit(QByteArray const &ba);
243  QString queryEntireCommitMessage(const GitHash &id);
244 
245  QString getDefaultBranch();
246  void setDefaultBranch(QString const &branchname);
247  void unsetDefaultBranch();
248  QDateTime repositoryLastModifiedTime();
249 
250  std::optional<std::vector<GitFileItem>> ls(const QString &path);
251  std::optional<std::vector<char>> readfile(const QString &path);
252 };
253 
255  enum class Type {
256  None,
257  BranchLocal,
258  BranchRemote,
259  Tag,
260  };
262  QString remote;
263  QString name;
265 };
266 using NamedCommitList = QList<NamedCommitItem>;
267 
268 void parseDiff(const std::string_view &s, GitDiff const *info, GitDiff *out);
269 
270 void parseGitSubModules(QByteArray const &ba, QList<GitSubmoduleItem> *out);
271 
272 #endif // GIT_H
ApplicationGlobal * global
Definition: main.cpp:28
GitSignPolicy
Definition: GitTypes.h:441
GitMergeFastForward
Definition: GitTypes.h:393
GitSource
Definition: GitTypes.h:286
GitSignatureGrade
Definition: GitTypes.h:447
void parseDiff(const std::string_view &s, GitDiff const *info, GitDiff *out)
Definition: Git.cpp:1739
QList< NamedCommitItem > NamedCommitList
Definition: Git.h:266
void parseGitSubModules(QByteArray const &ba, QList< GitSubmoduleItem > *out)
Definition: Git.cpp:1780
Definition: AbstractProcess.h:11
Definition: GitTypes.h:143
Definition: Git.h:11
std::shared_ptr< AbstractGitSession > connect() const
Definition: Git.cpp:1822
QString ssh_command
Definition: Git.h:14
QString git_command
Definition: Git.h:13
Definition: GitTypes.h:462
Definition: GitTypes.h:32
bool isValid() const
Definition: GitTypes.cpp:97
Definition: GitRunner.h:11
Definition: Git.h:19
bool reflog(ReflogItemList *out, int maxcount=100)
Definition: Git.cpp:1478
QString getDefaultBranch()
Definition: Git.cpp:294
bool fetch(AbstractPtyProcess *pty=nullptr, bool prune=false)
Definition: Git.cpp:1213
QStringList getRemotes()
Definition: Git.cpp:1323
QString getCurrentBranchName()
Definition: Git.cpp:316
bool stash_drop()
Definition: Git.cpp:1399
void addRemoteURL(const GitRemote &remote)
Definition: Git.cpp:1463
std::optional< GitResult > git_nolog(QString const &arg, AbstractPtyProcess *pty)
Definition: Git.h:100
std::optional< GitResult > git(QString const &arg)
Definition: Git.h:96
void resetAllFiles()
Definition: Git.cpp:1142
static bool isUncommited(GitCommitItem const &item)
Definition: Git.h:46
void setUser(GitUser const &user, bool global)
Definition: Git.cpp:1361
bool isValidWorkingCopy() const
Definition: Git.cpp:114
void setWorkingRepositoryDir(QString const &repo, const QString &sshkey)
Definition: Git.cpp:40
void unsetDefaultBranch()
Definition: Git.cpp:309
QString status()
Definition: Git.cpp:64
std::string resultStdString(const std::optional< GitResult > &var) const
Definition: Git.cpp:80
QByteArray blame(QString const &path)
Definition: Git.cpp:1609
static GitCloneData preclone(QString const &url, QString const &path)
Definition: Git.cpp:859
void rebase_abort()
Definition: Git.cpp:1318
GitSignPolicy signPolicy(GitSource source)
Definition: Git.cpp:1669
GitCommitItemList log_file(QString const &path, int maxcount)
Definition: Git.cpp:607
bool pull(AbstractPtyProcess *pty=nullptr)
Definition: Git.cpp:1206
std::vector< GitFileStatus > status_s()
Definition: Git.cpp:1089
void rm(QString const &path, bool rm_real_file)
Definition: Git.cpp:1147
QList< GitBranch > branches()
Definition: Git.cpp:406
AbstractGitSession::Info const & gitinfo() const
Definition: Git.h:71
AbstractGitSession::Info & gitinfo()
Definition: Git.h:67
QDateTime repositoryLastModifiedTime()
Definition: Git.cpp:656
bool commit_(QString const &msg, bool amend, bool sign, AbstractPtyProcess *pty)
Definition: Git.cpp:1003
std::optional< GitResult > exec_git(QString const &arg, AbstractGitSession::Option const &opt)
Definition: Git.h:92
std::optional< QByteArray > cat_file(GitHash const &id)
Definition: Git.cpp:1103
QString version()
Definition: Git.cpp:143
QString diff_file(QString const &old_path, QString const &new_path)
Definition: Git.cpp:229
bool stash_apply()
Definition: Git.cpp:1394
QString getCherryPicking() const
Definition: Git.cpp:1251
QList< GitSubmoduleItem > submodules()
Definition: Git.cpp:915
QList< RemoteInfo > ls_remote()
Definition: Git.cpp:1620
AbstractGitSession::Info2 & gitinfo2()
Definition: Git.h:76
~Git()=default
QString encodeQuotedText(QString const &str)
Definition: Git.cpp:981
void createBranch(QString const &name)
Definition: Git.cpp:1236
void mergeBranch(QString const &name, GitMergeFastForward ff, bool squash)
Definition: Git.cpp:1271
GitCommitItemList log(int maxcount)
Definition: Git.cpp:651
QString workingDir() const
Definition: Git.h:122
QString const & sshKey() const
Definition: Git.cpp:52
bool remove(QString const &path)
Definition: Git.h:114
void cherrypick(QString const &name)
Definition: Git.cpp:1246
bool configGpgProgram(QString const &path, bool global)
Definition: Git.cpp:1708
bool rm_cached(QString const &file)
Definition: Git.cpp:1404
GitCommitItemList log_all(GitHash const &id, int maxcount)
コミットログを取得する
Definition: Git.cpp:583
bool commit(QString const &text, bool sign, AbstractPtyProcess *pty)
Definition: Git.cpp:1025
void checkoutBranch(QString const &name)
Definition: Git.cpp:1241
void add_A()
Definition: Git.cpp:1156
bool submodule_update(const GitSubmoduleUpdateData &data, AbstractPtyProcess *pty)
Definition: Git.cpp:966
static std::optional< GitCommitItem > parseCommit(QByteArray const &ba)
Definition: Git.cpp:745
void removeRemote(QString const &name)
Definition: Git.cpp:1471
void unstage(QString const &path)
Definition: Git.cpp:1183
QList< GitDiffRaw > diff_raw(GitHash const &old_id, GitHash const &new_id)
Definition: Git.cpp:252
QString diff_to_file(QString const &old_id, QString const &path)
Definition: Git.cpp:286
void _init(const GitContext &cx)
Definition: Git.cpp:35
QString errorMessage(const std::optional< GitResult > &var) const
Definition: Git.cpp:97
void setRemoteURL(const GitRemote &remote)
Definition: Git.cpp:1456
QByteArray toQByteArray(const std::optional< GitResult > &var) const
Definition: Git.cpp:72
bool submodule_add(const GitCloneData &data, bool force, AbstractPtyProcess *pty)
Definition: Git.cpp:948
void stage(QString const &path)
Definition: Git.cpp:1161
bool clean_df()
Definition: Git.cpp:1384
QString signingKey(GitSource purpose)
Definition: Git.cpp:1640
bool stash()
Definition: Git.cpp:1389
GitHash rev_parse(QString const &name)
Definition: Git.cpp:167
std::vector< GitFileStatus > status_s_()
Definition: Git.cpp:1068
void setDefaultBranch(QString const &branchname)
Definition: Git.cpp:302
void clearCommandCache()
Definition: Git.cpp:30
bool unstage_all()
Definition: Git.cpp:1201
void rebaseBranch(QString const &name)
Definition: Git.cpp:1313
QString diff(QString const &old_id, QString const &new_id)
Definition: Git.cpp:221
QString resultQString(const std::optional< GitResult > &var) const
Definition: Git.cpp:88
bool commit_amend_m(QString const &text, bool sign, AbstractPtyProcess *pty)
Definition: Git.cpp:1030
void remote_v(std::vector< GitRemote > *out)
Definition: Git.cpp:1410
GitUser getUser(GitSource purpose)
Definition: Git.cpp:1336
static void parseAheadBehind(QString const &s, GitBranch *b)
Definition: Git.cpp:340
void setSshKey(const QString &sshkey)
Definition: Git.cpp:57
bool setSigningKey(QString const &id, bool global)
Definition: Git.cpp:1656
Git(Git &&r)=delete
bool push_tags(AbstractPtyProcess *pty=nullptr)
Definition: Git.cpp:1060
QStringList rev_list_all(GitHash const &id, int maxcount)
Definition: Git.cpp:631
bool reset_head1()
Definition: Git.cpp:1374
AbstractGitSession::Info2 const & gitinfo2() const
Definition: Git.h:80
static GitSignatureGrade evaluateSignature(char c)
Definition: Git.h:24
void resetFile(QString const &path)
Definition: Git.cpp:1137
QList< GitTag > tags()
Definition: Git.cpp:180
std::optional< std::vector< GitFileItem > > ls(const QString &path)
Definition: Git.cpp:667
QStringList getUntrackedFiles()
Definition: Git.cpp:328
std::optional< GitCommitItem > queryCommitItem(const GitHash &id)
Definition: Git.cpp:844
bool checkout(QString const &branch_name, QString const &id={})
Definition: Git.cpp:1296
bool checkout_detach(QString const &id)
Definition: Git.cpp:1308
bool deleteBranch(QString const &name)
Definition: Git.cpp:1291
static std::optional< GitCommitItem > parseCommitItem(const QString &line)
Definition: Git.cpp:537
QString objectType(const GitHash &id)
Definition: Git.cpp:1094
bool tag(QString const &name, GitHash const &id={})
Definition: Git.cpp:199
bool setSignPolicy(GitSource source, GitSignPolicy policy)
Definition: Git.cpp:1687
std::vector< std::string > diff_name_only_head()
Definition: Git.cpp:237
std::optional< std::vector< char > > readfile(const QString &path)
Definition: Git.cpp:672
std::string diff_full_index_head_file(const QString &file)
Definition: Git.cpp:245
bool delete_tag(QString const &name, bool remote)
Definition: Git.cpp:206
QStringList make_branch_list_(const std::optional< GitResult > &result)
Definition: Git.cpp:1225
bool reset_hard()
Definition: Git.cpp:1379
QList< GitReflogItem > ReflogItemList
Definition: Git.h:218
bool clone(GitCloneData const &data, AbstractPtyProcess *pty)
Definition: Git.cpp:888
std::optional< GitResult > git_nochdir(QString const &arg, AbstractPtyProcess *pty)
Definition: Git.h:107
QString queryEntireCommitMessage(const GitHash &id)
Definition: Git.cpp:1112
bool revert(const GitHash &id)
Definition: Git.cpp:1035
bool push_u(bool set_upstream, QString const &remote, QString const &branch, bool force, AbstractPtyProcess *pty)
Definition: Git.cpp:1042
bool isValidGitCommand() const
Definition: Git.h:86
bool init()
Definition: Git.cpp:149
std::shared_ptr< AbstractGitSession > session_
Definition: Git.h:22
Git()
Definition: Git.cpp:19
std::optional< GitCommitItem > log_signature(GitHash const &id)
Git::log_signature.
Definition: Git.cpp:684
QString getMessage(const QString &id)
Definition: Git.cpp:1265
void setSubmodulePath(const QString &submodpath)
Definition: Git.cpp:46
static Variant var(jstream::Reader const &reader)
Definition: jstream.h:1612
Definition: AbstractGitSession.h:30
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:253
Definition: GitTypes.h:280
Definition: GitTypes.h:115
GitHash commit_id
Definition: GitTypes.h:116
Definition: GitTypes.h:12
Definition: GitTypes.h:411
Definition: GitTypes.h:244
Definition: Git.h:229
QString name
Definition: Git.h:231
QString commit_id
Definition: Git.h:230
Definition: Git.h:254
Type type
Definition: Git.h:261
QString remote
Definition: Git.h:262
Type
Definition: Git.h:255
GitHash id
Definition: Git.h:264
QString name
Definition: Git.h:263