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 public:
59  Git(GitContext const &cx, QString const &repodir, QString const &submodpath, QString 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  QByteArray toQByteArray(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  QString resultQString(const std::optional<GitResult> &var) const;
82  std::optional<GitResult> exec_git(QString const &arg, AbstractGitSession::Option const &opt)
83  {
84  return session_->exec_git(arg, opt);
85  }
86  std::optional<GitResult> git(QString const &arg)
87  {
88  return exec_git(arg, {});
89  }
90  std::optional<GitResult> git_nolog(QString const &arg, AbstractPtyProcess *pty)
91  {
93  opt.pty = pty;
94  opt.log = false;
95  return exec_git(arg, opt);
96  }
97  std::optional<GitResult> git_nochdir(QString const &arg, AbstractPtyProcess *pty)
98  {
100  opt.pty = pty;
101  opt.chdir = false;
102  return exec_git(arg, opt);
103  }
104  bool remove(QString const &path)
105  {
106  return session_->remove(path);
107  }
108 
109  void setWorkingRepositoryDir(QString const &repo, const QString &sshkey);
110  void setSubmodulePath(const QString &submodpath);
111 
112  QString workingDir() const
113  {
114  return session_->workingDir();
115  }
116  QString const &sshKey() const;
117  void setSshKey(const QString &sshkey);
118 
119  QString getCurrentBranchName();
120  bool isValidWorkingCopy() const;
121  QString version();
122  bool init();
123  QStringList getUntrackedFiles();
124 
125  GitCommitItemList log_all(GitHash const &id, int maxcount);
126  GitCommitItemList log_file(QString const &path, int maxcount);
127  std::vector<GitHash> rev_list_all(GitHash const &id, int maxcount);
128 
129  std::optional<GitCommitItem> log_signature(GitHash const &id);
130  GitCommitItemList log(int maxcount);
131  std::optional<GitCommitItem> queryCommitItem(const GitHash &id);
132 
133  static GitCloneData preclone(QString const &url, QString const &path);
134  bool clone(GitCloneData const &data, AbstractPtyProcess *pty);
135 
136  std::vector<GitFileStatus> status_s();
137  std::optional<QByteArray> cat_file(GitHash const &id);
138  void resetFile(QString const &path);
139  void resetAllFiles();
140 
141  void rm(QString const &path, bool rm_real_file);
142 
143  void add_A();
144  bool unstage_all();
145 
146  void stage(QString const &path);
147  bool stage(QStringList const &paths, AbstractPtyProcess *pty);
148  void unstage(QString const &path);
149  void unstage(QStringList const &paths);
150  bool pull(AbstractPtyProcess *pty = nullptr);
151 
152  bool fetch(AbstractPtyProcess *pty = nullptr, bool prune = false);
153 
154  QList<GitBranch> branches();
155 
156  QString diff(QString const &old_id, QString const &new_id);
157  QString diff_file(QString const &old_path, QString const &new_path);
158 
159  std::vector<std::string> diff_name_only_head();
160  std::string diff_full_index_head_file(const QString &file);
161 
162  QList<GitDiffRaw> diff_raw(GitHash const &old_id, GitHash const &new_id);
163 
164  QString status();
165  bool commit(QString const &text, bool sign, AbstractPtyProcess *pty);
166  bool commit_amend_m(QString const &text, bool sign, AbstractPtyProcess *pty);
167  bool revert(const GitHash &id);
168  bool push_tags(AbstractPtyProcess *pty = nullptr);
169  void remote_v(std::vector<GitRemote> *out);
170  void createBranch(QString const &name);
171  void checkoutBranch(QString const &name);
172  void mergeBranch(QString const &name, GitMergeFastForward ff, bool squash);
173  bool deleteBranch(QString const &name);
174 
175  bool checkout(QString const &branch_name, QString const &id = {});
176  bool checkout_detach(QString const &id);
177 
178  void rebaseBranch(QString const &name);
179  void rebase_abort();
180 
181  bool isValidWorkingCopy(QString const &dir) const;
182  QString diff_to_file(QString const &old_id, QString const &path);
183  QString errorMessage(const std::optional<GitResult> &var) const;
184 
185  GitHash rev_parse(QString const &name);
186  QList<GitTag> tags();
187  bool tag(QString const &name, GitHash const &id = {});
188  bool delete_tag(QString const &name, bool remote);
189  void setRemoteURL(const GitRemote &remote);
190  void addRemoteURL(const GitRemote &remote);
191  void removeRemote(QString const &name);
192  QStringList getRemotes();
193 
194  GitUser getUser(GitSource purpose);
195  void setUser(GitUser const&user, bool global);
196 
197  bool reset_head1();
198  bool reset_hard();
199  bool clean_df();
200  bool push_u(bool set_upstream, QString const &remote, QString const &branch, bool force, AbstractPtyProcess *pty);
201  QString objectType(const GitHash &id);
202  bool rm_cached(QString const &file);
203  void cherrypick(QString const &name);
204  QString getCherryPicking() const;
205 
206  QString getMessage(const QString &id);
207 
208  using ReflogItemList = QList<GitReflogItem>;
209 
210  bool reflog(ReflogItemList *out, int maxcount = 100);
211  QByteArray blame(QString const &path);
212 
213  QString signingKey(GitSource purpose);
214  bool setSigningKey(QString const &id, bool global);
216  bool setSignPolicy(GitSource source, GitSignPolicy policy);
217  bool configGpgProgram(QString const &path, bool global);
218 
219  struct RemoteInfo {
220  QString commit_id;
221  QString name;
222  };
223  QList<RemoteInfo> ls_remote();
224 
225  bool stash();
226  bool stash_apply();
227  bool stash_drop();
228 
229  QList<GitSubmoduleItem> submodules();
230  bool submodule_add(const GitCloneData &data, bool force, AbstractPtyProcess *pty);
232  static std::optional<GitCommitItem> parseCommit(QByteArray const &ba);
233  QString queryEntireCommitMessage(const GitHash &id);
234 
235  QString getDefaultBranch();
236  void setDefaultBranch(QString const &branchname);
237  void unsetDefaultBranch();
238  QDateTime repositoryLastModifiedTime();
239 
240  std::optional<std::vector<GitFileItem>> ls(const QString &path);
241  std::optional<std::vector<char>> readfile(const QString &path);
242 };
243 
245  enum class Type {
246  None,
247  BranchLocal,
248  BranchRemote,
249  Tag,
250  };
252  QString remote;
253  QString name;
255 };
256 using NamedCommitList = QList<NamedCommitItem>;
257 
258 void parseDiff(const std::string_view &s, GitDiff const *info, GitDiff *out);
259 
260 void parseGitSubModules(QByteArray const &ba, QList<GitSubmoduleItem> *out);
261 
262 #endif // GIT_H
ApplicationGlobal * global
Definition: main.cpp:28
GitSignPolicy
Definition: GitTypes.h:408
GitMergeFastForward
Definition: GitTypes.h:360
GitSource
Definition: GitTypes.h:253
GitSignatureGrade
Definition: GitTypes.h:414
void parseDiff(const std::string_view &s, GitDiff const *info, GitDiff *out)
Definition: Git.cpp:1744
QList< NamedCommitItem > NamedCommitList
Definition: Git.h:256
void parseGitSubModules(QByteArray const &ba, QList< GitSubmoduleItem > *out)
Definition: Git.cpp:1785
Definition: AbstractProcess.h:11
Definition: GitTypes.h:142
Definition: Git.h:9
std::shared_ptr< AbstractGitSession > connect() const
Definition: Git.cpp:1827
QString ssh_command
Definition: Git.h:12
QString git_command
Definition: Git.h:11
Definition: GitTypes.h:429
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:1483
QString getDefaultBranch()
Definition: Git.cpp:292
bool fetch(AbstractPtyProcess *pty=nullptr, bool prune=false)
Definition: Git.cpp:1218
QStringList getRemotes()
Definition: Git.cpp:1328
QString getCurrentBranchName()
Definition: Git.cpp:314
bool stash_drop()
Definition: Git.cpp:1404
void addRemoteURL(const GitRemote &remote)
Definition: Git.cpp:1468
std::optional< GitResult > git_nolog(QString const &arg, AbstractPtyProcess *pty)
Definition: Git.h:90
std::optional< GitResult > git(QString const &arg)
Definition: Git.h:86
void resetAllFiles()
Definition: Git.cpp:1147
static bool isUncommited(GitCommitItem const &item)
Definition: Git.h:44
void setUser(GitUser const &user, bool global)
Definition: Git.cpp:1366
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:1614
static GitCloneData preclone(QString const &url, QString const &path)
Definition: Git.cpp:864
void rebase_abort()
Definition: Git.cpp:1323
GitSignPolicy signPolicy(GitSource source)
Definition: Git.cpp:1674
GitCommitItemList log_file(QString const &path, int maxcount)
Definition: Git.cpp:608
bool pull(AbstractPtyProcess *pty=nullptr)
Definition: Git.cpp:1211
std::vector< GitFileStatus > status_s()
Definition: Git.cpp:1094
void rm(QString const &path, bool rm_real_file)
Definition: Git.cpp:1152
QList< GitBranch > branches()
Definition: Git.cpp:404
AbstractGitSession::Info const & gitinfo() const
Definition: Git.h:70
AbstractGitSession::Info & gitinfo()
Definition: Git.h:66
QDateTime repositoryLastModifiedTime()
Definition: Git.cpp:661
bool commit_(QString const &msg, bool amend, bool sign, AbstractPtyProcess *pty)
Definition: Git.cpp:1008
std::optional< GitResult > exec_git(QString const &arg, AbstractGitSession::Option const &opt)
Definition: Git.h:82
std::optional< QByteArray > cat_file(GitHash const &id)
Definition: Git.cpp:1108
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:1399
QString getCherryPicking() const
Definition: Git.cpp:1256
QList< GitSubmoduleItem > submodules()
Definition: Git.cpp:920
QList< RemoteInfo > ls_remote()
Definition: Git.cpp:1625
~Git()=default
QString encodeQuotedText(QString const &str)
Definition: Git.cpp:986
void createBranch(QString const &name)
Definition: Git.cpp:1241
void mergeBranch(QString const &name, GitMergeFastForward ff, bool squash)
Definition: Git.cpp:1276
GitCommitItemList log(int maxcount)
Definition: Git.cpp:656
QString workingDir() const
Definition: Git.h:112
QString const & sshKey() const
Definition: Git.cpp:56
bool remove(QString const &path)
Definition: Git.h:104
void cherrypick(QString const &name)
Definition: Git.cpp:1251
bool configGpgProgram(QString const &path, bool global)
Definition: Git.cpp:1713
bool rm_cached(QString const &file)
Definition: Git.cpp:1409
GitCommitItemList log_all(GitHash const &id, int maxcount)
コミットログを取得する
Definition: Git.cpp:582
bool commit(QString const &text, bool sign, AbstractPtyProcess *pty)
Definition: Git.cpp:1030
void checkoutBranch(QString const &name)
Definition: Git.cpp:1246
void add_A()
Definition: Git.cpp:1161
bool submodule_update(const GitSubmoduleUpdateData &data, AbstractPtyProcess *pty)
Definition: Git.cpp:971
static std::optional< GitCommitItem > parseCommit(QByteArray const &ba)
Definition: Git.cpp:750
void removeRemote(QString const &name)
Definition: Git.cpp:1476
void unstage(QString const &path)
Definition: Git.cpp:1188
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:1461
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:953
void stage(QString const &path)
Definition: Git.cpp:1166
bool clean_df()
Definition: Git.cpp:1389
QString signingKey(GitSource purpose)
Definition: Git.cpp:1645
bool stash()
Definition: Git.cpp:1394
GitHash rev_parse(QString const &name)
Definition: Git.cpp:165
std::vector< GitFileStatus > status_s_()
Definition: Git.cpp:1073
void setDefaultBranch(QString const &branchname)
Definition: Git.cpp:300
void clearCommandCache()
Definition: Git.cpp:29
bool unstage_all()
Definition: Git.cpp:1206
void rebaseBranch(QString const &name)
Definition: Git.cpp:1318
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:1035
void remote_v(std::vector< GitRemote > *out)
Definition: Git.cpp:1415
GitUser getUser(GitSource purpose)
Definition: Git.cpp:1341
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:1661
Git(Git &&r)=delete
bool push_tags(AbstractPtyProcess *pty=nullptr)
Definition: Git.cpp:1065
bool reset_head1()
Definition: Git.cpp:1379
static GitSignatureGrade evaluateSignature(char c)
Definition: Git.h:22
void resetFile(QString const &path)
Definition: Git.cpp:1142
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:1301
bool checkout_detach(QString const &id)
Definition: Git.cpp:1313
bool deleteBranch(QString const &name)
Definition: Git.cpp:1296
static std::optional< GitCommitItem > parseCommitItem(const QString &line)
Definition: Git.cpp:535
QString objectType(const GitHash &id)
Definition: Git.cpp:1099
bool tag(QString const &name, GitHash const &id={})
Definition: Git.cpp:197
bool setSignPolicy(GitSource source, GitSignPolicy policy)
Definition: Git.cpp:1692
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:1230
bool reset_hard()
Definition: Git.cpp:1384
QList< GitReflogItem > ReflogItemList
Definition: Git.h:208
bool clone(GitCloneData const &data, AbstractPtyProcess *pty)
Definition: Git.cpp:893
std::optional< GitResult > git_nochdir(QString const &arg, AbstractPtyProcess *pty)
Definition: Git.h:97
QString queryEntireCommitMessage(const GitHash &id)
Definition: Git.cpp:1117
bool revert(const GitHash &id)
Definition: Git.cpp:1040
bool push_u(bool set_upstream, QString const &remote, QString const &branch, bool force, AbstractPtyProcess *pty)
Definition: Git.cpp:1047
void clearObjectCache()
Definition: Git.cpp:34
bool isValidGitCommand() const
Definition: Git.h:76
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:1270
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:220
Definition: GitTypes.h:247
Definition: GitTypes.h:114
GitHash commit_id
Definition: GitTypes.h:115
Definition: GitTypes.h:11
Definition: GitTypes.h:378
Definition: GitTypes.h:211
Definition: Git.h:219
QString name
Definition: Git.h:221
QString commit_id
Definition: Git.h:220
Definition: Git.h:244
Type type
Definition: Git.h:251
QString remote
Definition: Git.h:252
Type
Definition: Git.h:245
GitHash id
Definition: Git.h:254
QString name
Definition: Git.h:253