Guitar
Git.h
Go to the documentation of this file.
1 #ifndef GIT_H
2 #define GIT_H
3 
4 #include "AbstractProcess.h"
5 #include "common/misc.h"
6 #include <QDateTime>
7 #include <QDebug>
8 #include <QMutex>
9 #include <QObject>
10 #include <functional>
11 #include <memory>
12 #include <optional>
13 
14 #define SINGLE_THREAD 0
15 
16 #define GIT_ID_LENGTH (40)
17 
18 class Win32PtyProcess;
19 
20 enum class LineSide {
21  Left,
22  Right,
23 };
24 
25 struct TreeLine {
26  int index;
27  int depth;
28  int color_number = 0;
29  bool bend_early = false;
30  TreeLine(int index = -1, int depth = -1)
31  : index(index)
32  , depth(depth)
33  {
34  }
35 };
36 
37 class Git;
38 using GitPtr = std::shared_ptr<Git>;
39 
40 class Git : QObject {
41 public:
42  class CommitID {
43  private:
44  bool valid = false;
45  uint8_t id[GIT_ID_LENGTH / 2];
46  public:
47  CommitID() = default;
48  CommitID(QString const &qid);
49  CommitID(char const *id);
50  void assign(const QString &qid);
51  QString toQString(int maxlen = -1) const;
52  bool isValid() const;
53  int compare(CommitID const &other) const
54  {
55  if (!valid && other.valid) return -1;
56  if (valid && !other.valid) return 1;
57  if (!valid && !other.valid) return 0;
58  return memcmp(id, other.id, sizeof(id));
59  }
60  operator bool () const
61  {
62  return isValid();
63  }
64  };
65  class Context {
66  public:
67  QString git_command;
68  QString ssh_command;
69  QString ssh_private_key;
70  };
71 
72  struct Object {
73  enum class Type { // 値は固定。packフォーマットで決まってる
74  NONE = -1,
75  UNKNOWN = 0,
76  COMMIT = 1,
77  TREE = 2,
78  BLOB = 3,
79  TAG = 4,
80  UNDEFINED = 5,
81  OFS_DELTA = 6,
82  REF_DELTA = 7,
83  };
85  QByteArray content;
86  };
87 
88  struct SubmoduleItem {
89  QString name;
91  QString path;
92  QString refs;
93  QString url;
94  operator bool () const
95  {
96  return isValidID(id) && !path.isEmpty();
97  }
98  };
99 
100  enum class SignatureGrade {
101  NoSignature,
102  Unknown,
103  Good,
104  Dubious,
105  Missing,
106  Bad,
107  };
108 
109  struct CommitItem {
111  QList<CommitID> parent_ids;
112  QString author;
113  QString email;
114  QString message;
115  QDateTime commit_date;
116  std::vector<TreeLine> parent_lines;
117  QString gpgsig;
118  struct {
119  QString text;
120  char verify = 0; // git log format:%G?
121  std::vector<uint8_t> key_fingerprint;
122  QString trust;
123  } sign;
124  bool has_child = false;
125  int marker_depth = -1;
126  bool resolved = false;
127  bool strange_date = false;
128  void setParents(QStringList const &list);
129  };
130 
132  public:
133  std::vector<CommitItem> list;
134  std::map<CommitID, size_t> index;
135  size_t size() const
136  {
137  return list.size();
138  }
139  CommitItem &at(size_t i)
140  {
141  return list.at(i);
142  }
143  CommitItem const &at(size_t i) const
144  {
145  return list.at(i);
146  }
148  {
149  return at(i);
150  }
151  CommitItem const &operator [] (size_t i) const
152  {
153  return at(i);
154  }
155  void clear()
156  {
157  list.clear();
158  }
159  bool empty() const
160  {
161  return list.empty();
162  }
163  void updateIndex()
164  {
165  index.clear();
166  for (size_t i = 0; i < list.size(); i++) {
167  index[list[i].commit_id] = i;
168  }
169  }
171  {
172  auto it = index.find(id);
173  if (it != index.end()) {
174  return &list[it->second];
175  }
176  return nullptr;
177  }
178  CommitItem const *find(CommitID const &id) const
179  {
180  return const_cast<CommitItemList *>(this)->find(id);
181  }
182  };
183 
184  class Hunk {
185  public:
186  std::string at;
187  std::vector<std::string> lines;
188  };
189  class Diff {
190  public:
191  enum class Type {
192  Unknown,
193  Modify,
194  Copy,
195  Rename,
196  Create,
197  Delete,
198  ChType,
199  Unmerged,
200  };
202  QString diff;
203  QString index;
204  QString path;
205  QString mode;
206  struct BLOB_AB_ {
207  QString a_id_or_path; // コミットIDまたはファイルパス。パスのときは PATH_PREFIX('*')で始まる
208  QString b_id_or_path;
209  } blob;
210  QList<Hunk> hunks;
215  Diff() = default;
216  Diff(QString const &id, QString const &path, QString const &mode)
217  {
218  makeForSingleFile(this, QString(GIT_ID_LENGTH, '0'), id, path, mode);
219  }
220  bool isSubmodule() const
221  {
222  return mode == "160000";
223  }
224  private:
225  void makeForSingleFile(Git::Diff *diff, QString const &id_a, QString const &id_b, QString const &path, QString const &mode);
226  };
227 
229  {
230  switch (c) {
231  case 'G':
232  return SignatureGrade::Good;
233  case 'U':
234  case 'X':
235  case 'Y':
237  case 'B':
238  case 'R':
239  return SignatureGrade::Bad;
240  case 'E':
242  case 'N':
243  case ' ':
244  case 0:
246  }
248  }
249 
250  static bool isUncommited(CommitItem const &item)
251  {
252  return !item.commit_id.isValid();
253  }
254 
255  struct Branch {
256  QString name;
258  QString remote;
259  int ahead = 0;
260  int behind = 0;
261  enum {
263  Current = 0x0001,
264  HeadDetachedAt = 0x0002,
266  };
267  int flags = 0;
268  operator bool () const
269  {
270  return id.isValid() && !name.isEmpty();
271  }
272  bool isCurrent() const
273  {
274  return flags & Current;
275  }
276  bool isHeadDetached() const
277  {
278  return flags & HeadDetachedAt;
279  }
280  };
281 
282  struct Tag {
283  QString name;
285  };
286 
287  enum class FileStatusCode : unsigned int {
288  Unknown,
289  Ignored,
290  Untracked,
291  NotUpdated = 0x10000000,
292  Staged_ = 0x20000000,
294  AddedToIndex,
298  Unmerged_ = 0x40000000,
306  Tracked_ = 0xf0000000
307  };
308 
309  enum class MergeFastForward {
310  Default,
311  No,
312  Only,
313  };
314 
315  class FileStatus {
316  public:
317  struct Data {
318  char code_x = 0;
319  char code_y = 0;
321  QString rawpath1;
322  QString rawpath2;
323  QString path1;
324  QString path2;
325  } data;
326 
327  static FileStatusCode parseFileStatusCode(char x, char y);
328 
329  bool isStaged() const
330  {
331  return (int)data.code & (int)FileStatusCode::Staged_;
332  }
333 
334  bool isUnmerged() const
335  {
336  return (int)data.code & (int)FileStatusCode::Unmerged_;
337  }
338 
339  bool isTracked() const
340  {
341  return (int)data.code & (int)FileStatusCode::Tracked_;
342  }
343 
344  void parse(QString const &text);
345 
346  FileStatus() = default;
347 
348  FileStatus(QString const &text)
349  {
350  parse(text);
351  }
352 
354  {
355  return data.code;
356  }
357 
358  int code_x() const
359  {
360  return data.code_x;
361  }
362 
363  int code_y() const
364  {
365  return data.code_y;
366  }
367 
368  bool isDeleted() const
369  {
370  return code_x() == 'D' || code_y() == 'D';
371  }
372 
373  QString path1() const
374  {
375  return data.path1;
376  }
377 
378  QString path2() const
379  {
380  return data.path2;
381  }
382 
383  QString rawpath1() const
384  {
385  return data.rawpath1;
386  }
387 
388  QString rawpath2() const
389  {
390  return data.rawpath2;
391  }
392  };
393  using FileStatusList = std::vector<FileStatus>;
394 
395  static QString trimPath(QString const &s);
396 
397 private:
398  struct Private;
399  Private *m;
400  QStringList make_branch_list_();
401  QByteArray cat_file_(const CommitID &id);
403  bool commit_(QString const &msg, bool amend, bool sign, AbstractPtyProcess *pty);
404 // bool push_(bool tags, AbstractPtyProcess *pty);
405  static void parseAheadBehind(QString const &s, Branch *b);
406  Git();
407  QString encodeQuotedText(QString const &str);
408  static std::optional<CommitItem> parseCommitItem(const QString &line);
409 public:
410  Git(Context const &cx, QString const &repodir, QString const &submodpath, QString const &sshkey);
411  Git(Git &&r) = delete;
412  ~Git() override;
413 
414  using callback_t = bool (*)(void *, const char *, int);
415 
416  void setLogCallback(callback_t func, void *cookie);
417 
418  QByteArray toQByteArray() const;
419  void setGitCommand(QString const &gitcmd, const QString &sshcmd = {});
420  QString gitCommand() const;
421  void clearResult();
422  std::string resultStdString() const;
423  QString resultQString() const;
424  bool chdirexec(std::function<bool ()> const &fn);
425  struct Option {
426  bool chdir = true;
427  bool log = true;
428  bool errout = false;
430  QString prefix;
431  };
432  bool git(QString const &arg, Option const &opt);
433  bool git(QString const &arg)
434  {
435  return git(arg, {});
436  }
437  bool git_nolog(QString const &arg)
438  {
439  Option opt;
440  opt.log = false;
441  return git(arg, opt);
442  }
443  bool git_nochdir(QString const &arg)
444  {
445  Option opt;
446  opt.chdir = false;
447  return git(arg, opt);
448  }
449 
450  void setWorkingRepositoryDir(QString const &repo, const QString &submodpath, const QString &sshkey);
451  QString workingDir() const;
452  QString const &sshKey() const;
453  void setSshKey(const QString &sshkey) const;
454 
455  QString getCurrentBranchName();
456  bool isValidWorkingCopy() const;
457  QString version();
458  bool init();
459  QStringList getUntrackedFiles();
460  CommitItemList log_all(CommitID const &id, int maxcount);
461  std::optional<CommitItem> log_signature(CommitID const &id);
462  CommitItemList log(int maxcount);
463  std::optional<CommitItem> queryCommit(const CommitID &id);
464 
465  struct CloneData {
466  QString url;
467  QString basedir;
468  QString subdir;
469  };
470  static CloneData preclone(QString const &url, QString const &path);
471  bool clone(CloneData const &data, AbstractPtyProcess *pty);
472 
474  std::optional<QByteArray> cat_file(const CommitID &id);
475  void resetFile(QString const &path);
476  void resetAllFiles();
477 
478  void removeFile(QString const &path);
479 
480  void add_A();
481  void unstage_all();
482 
483  void stage(QString const &path);
484  void stage(QStringList const &paths);
485  void unstage(QString const &path);
486  void unstage(QStringList const &paths);
487  void pull(AbstractPtyProcess *pty = nullptr);
488 
489  void fetch(AbstractPtyProcess *pty = nullptr, bool prune = false);
490  void fetch_tags_f(AbstractPtyProcess *pty);
491 
492  QList<Branch> branches();
493 
494  int getProcessExitCode() const;
495 
496  QString diff(QString const &old_id, QString const &new_id);
497  QString diff_file(QString const &old_path, QString const &new_path);
498 
499  struct DiffRaw {
500  struct AB {
501  QString id;
502  QString mode;
503  } a, b;
504  QString state;
505  QStringList files;
506  };
507 
508  struct Remote {
509  QString name;
510  QString url;
511  QString purpose;
512  QString ssh_key;
513  };
514 
515  QList<DiffRaw> diff_raw(CommitID const &old_id, CommitID const &new_id);
516 
517  static bool isValidID(QString const &id);
518  static bool isValidID(CommitID const &id)
519  {
520  return id.isValid();
521  }
522 
523  QString status();
524  bool commit(QString const &text, bool sign, AbstractPtyProcess *pty);
525  bool commit_amend_m(QString const &text, bool sign, AbstractPtyProcess *pty);
526  bool revert(const CommitID &id);
527  bool push_tags(AbstractPtyProcess *pty = nullptr);
528  void getRemoteURLs(QList<Remote> *out);
529  void createBranch(QString const &name);
530  void checkoutBranch(QString const &name);
531  void mergeBranch(QString const &name, MergeFastForward ff, bool squash);
532  void rebaseBranch(QString const &name);
533  static bool isValidWorkingCopy(QString const &dir);
534  QString diff_to_file(QString const &old_id, QString const &path);
535  QString errorMessage() const;
536 
537  GitPtr dup() const;
538  CommitID rev_parse(QString const &name);
539  QList<Tag> tags();
540  QList<Tag> tags2();
541  bool tag(QString const &name, const CommitID &id = QString());
542  void delete_tag(QString const &name, bool remote);
543  void setRemoteURL(const Remote &remote);
544  void addRemoteURL(const Remote &remote);
545  void removeRemote(QString const &name);
546  QStringList getRemotes();
547 
548  struct User {
549  QString name;
550  QString email;
551  operator bool () const
552  {
554  }
555  };
556  enum class Source {
557  Default,
558  Global,
559  Local,
560  };
561 
562  User getUser(Source purpose);
563  void setUser(User const&user, bool global);
564 
565  bool reset_head1();
566  bool reset_hard();
567  bool clean_df();
568  void push_u(bool set_upstream, QString const &remote, QString const &branch, bool force, AbstractPtyProcess *pty);
569  QString objectType(const CommitID &id);
570  bool rm_cached(QString const &file);
571  void cherrypick(QString const &name);
572  QString getCherryPicking() const;
573 
574  QString getMessage(const QString &id);
575 
576  struct ReflogItem {
577  QString id;
578  QString head;
579  QString command;
580  QString message;
581  struct File {
582  QString atts_a;
583  QString atts_b;
584  QString id_a;
585  QString id_b;
586  QString type;
587  QString path;
588  };
589  QList<File> files;
590  };
591  using ReflogItemList = QList<ReflogItem>;
592 
593  bool reflog(ReflogItemList *out, int maxcount = 100);
594  QByteArray blame(QString const &path);
595 
596  enum SignPolicy {
600  };
601  QString signingKey(Source purpose);
602  bool setSigningKey(QString const &id, bool global);
603  SignPolicy signPolicy(Source source);
604  bool setSignPolicy(Source source, SignPolicy policy);
605  bool configGpgProgram(QString const &path, bool global);
606 
607  struct RemoteInfo {
608  QString commit_id;
609  QString name;
610  };
611  QList<RemoteInfo> ls_remote();
612 
613  bool stash();
614  bool stash_apply();
615  bool stash_drop();
616 
618  bool init = true;
619  bool recursive = true;
620  };
621 
622 
623  QList<SubmoduleItem> submodules();
624  bool submodule_add(const CloneData &data, bool force, AbstractPtyProcess *pty);
626  static CommitItem parseCommit(const QByteArray &ba);
627 };
628 
630  enum class Type {
631  None,
632  BranchLocal,
633  BranchRemote,
634  Tag,
635  };
637  QString remote;
638  QString name;
640 };
641 using NamedCommitList = QList<NamedCommitItem>;
642 
643 void parseDiff(std::string const &s, Git::Diff const *info, Git::Diff *out);
644 
645 void parseGitSubModules(QByteArray const &ba, QList<Git::SubmoduleItem> *out);
646 
647 static inline bool operator == (Git::CommitID const &l, Git::CommitID const &r)
648 {
649  return l.compare(r) == 0;
650 }
651 
652 static inline bool operator < (Git::CommitID const &l, Git::CommitID const &r)
653 {
654  return l.compare(r) < 0;
655 }
656 
657 #endif // GIT_H
Git::ReflogItem::File::atts_a
QString atts_a
Definition: Git.h:582
Git::Diff::Type
Type
Definition: Git.h:191
MyProcess.h
Git::errorMessage
QString errorMessage() const
Definition: Git.cpp:221
Git::CommitItem::commit_date
QDateTime commit_date
Definition: Git.h:115
Git::CommitItemList::index
std::map< CommitID, size_t > index
Definition: Git.h:134
Git::branches
QList< Branch > branches()
Definition: Git.cpp:616
parseDiff
void parseDiff(std::string const &s, Git::Diff const *info, Git::Diff *out)
Definition: Git.cpp:1792
Git::CommitItem::parent_lines
std::vector< TreeLine > parent_lines
Definition: Git.h:116
Git::SignatureGrade::Unknown
@ Unknown
Git::Diff::Type::Unknown
@ Unknown
Git::removeFile
void removeFile(QString const &path)
Definition: Git.cpp:1235
Git::git
bool git(QString const &arg)
Definition: Git.h:433
Git::isValidWorkingCopy
bool isValidWorkingCopy() const
Definition: Git.cpp:353
Git::Private::Info::callback_cookie
void * callback_cookie
Definition: Git.cpp:95
UnixProcess::errstring
QString errstring()
Definition: UnixProcess.cpp:322
Git::FileStatusCode::UpdatedInIndex
@ UpdatedInIndex
Git::FileStatusCode::Unmerged_AddedByUs
@ Unmerged_AddedByUs
Git::setUser
void setUser(User const &user, bool global)
Definition: Git.cpp:1414
Git::createBranch
void createBranch(QString const &name)
Definition: Git.cpp:1322
Git::Object::type
Type type
Definition: Git.h:84
operator<
static bool operator<(Git::CommitID const &l, Git::CommitID const &r)
Definition: Git.h:652
Git::rm_cached
bool rm_cached(QString const &file)
Definition: Git.cpp:1457
Git::FileStatus::path1
QString path1() const
Definition: Git.h:373
misc::splitWords
static QStringList splitWords(QString const &text)
文字列を単語に分割する。
Definition: misc.cpp:162
Git::delete_tag
void delete_tag(QString const &name, bool remote)
Definition: Git.cpp:451
Git::ReflogItem::File::id_b
QString id_b
Definition: Git.h:585
Git::Diff::type
Type type
Definition: Git.h:201
Git::Object::Type::NONE
@ NONE
Git::Option::log
bool log
Definition: Git.h:427
Git::CommitItemList::size
size_t size() const
Definition: Git.h:135
Git::setSigningKey
bool setSigningKey(QString const &id, bool global)
Definition: Git.cpp:1710
Git::version
QString version()
Definition: Git.cpp:358
Git::Branch::behind
int behind
Definition: Git.h:260
Git::Private::Info::working_repo_dir
QString working_repo_dir
Definition: Git.cpp:92
Git::Private::Info::fn_log_writer_callback
callback_t fn_log_writer_callback
Definition: Git.cpp:94
Git::Branch::None
@ None
Definition: Git.h:262
Git::MergeFastForward::Default
@ Default
UnixProcess::errbytes
std::vector< char > errbytes
Definition: UnixProcess.h:17
GitPtr
std::shared_ptr< Git > GitPtr
Definition: Git.h:38
Git::FileStatus::Data::code_x
char code_x
Definition: Git.h:318
parseDiff
void parseDiff(std::string const &s, Git::Diff const *info, Git::Diff *out)
Definition: Git.cpp:1792
Git::getCherryPicking
QString getCherryPicking() const
Definition: Git.cpp:1337
Git::diff
QString diff(QString const &old_id, QString const &new_id)
Definition: Git.cpp:464
Git::CommitItem::strange_date
bool strange_date
Definition: Git.h:127
NamedCommitItem::type
Type type
Definition: Git.h:636
Git::Diff::SubmoduleDetail
Definition: Git.h:211
Git::getUntrackedFiles
QStringList getUntrackedFiles()
Definition: Git.cpp:538
Git::Object::Type::COMMIT
@ COMMIT
Git::unstage
void unstage(QString const &path)
Definition: Git.cpp:1262
Git::Diff::Type::ChType
@ ChType
Git::Tag
Definition: Git.h:282
parseGitSubModules
void parseGitSubModules(const QByteArray &ba, QList< Git::SubmoduleItem > *out)
Definition: Git.cpp:1838
Git::encodeQuotedText
QString encodeQuotedText(QString const &str)
Definition: Git.cpp:1088
NamedCommitList
QList< NamedCommitItem > NamedCommitList
Definition: Git.h:641
Git::CommitID::isValid
bool isValid() const
Definition: Git.cpp:76
Git::Context
Definition: Git.h:65
Git::evaluateSignature
static SignatureGrade evaluateSignature(char c)
Definition: Git.h:228
Git::Object::Type::BLOB
@ BLOB
Git::DiffRaw
Definition: Git.h:499
Git::SubmoduleItem::id
Git::CommitID id
Definition: Git.h:90
Git::setSignPolicy
bool setSignPolicy(Source source, SignPolicy policy)
Definition: Git.cpp:1740
Git::CommitItemList::updateIndex
void updateIndex()
Definition: Git.h:163
Git::git
bool git(QString const &arg, Option const &opt)
Definition: Git.cpp:245
Git::CommitID::toQString
QString toQString(int maxlen=-1) const
Definition: Git.cpp:60
Git::CommitItem::email
QString email
Definition: Git.h:113
Git::Diff::Type::Copy
@ Copy
Git::removeRemote
void removeRemote(QString const &name)
Definition: Git.cpp:1500
NamedCommitItem::Type::Tag
@ Tag
Git::rev_parse
CommitID rev_parse(QString const &name)
Definition: Git.cpp:384
Git::Context::ssh_command
QString ssh_command
Definition: Git.h:68
Git::objectType
QString objectType(const CommitID &id)
Definition: Git.cpp:1198
Git::tags
QList< Tag > tags()
Definition: Git.cpp:394
DiffPane::Left
@ Left
Git::CommitItem::gpgsig
QString gpgsig
Definition: Git.h:117
Git::~Git
~Git() override
Definition: Git.cpp:117
Git::FileStatusCode::Unmerged_BothAdded
@ Unmerged_BothAdded
Git::SubmoduleUpdateData
Definition: Git.h:617
Git::DiffRaw::a
struct Git::DiffRaw::AB a
Git::clone
bool clone(CloneData const &data, AbstractPtyProcess *pty)
Definition: Git.cpp:999
Git::Branch::id
Git::CommitID id
Definition: Git.h:257
Git::Remote::url
QString url
Definition: Git.h:510
Git::submodules
QList< SubmoduleItem > submodules()
Definition: Git.cpp:1026
Git::CloneData::url
QString url
Definition: Git.h:466
TreeLine::color_number
int color_number
Definition: Git.h:28
Git::FileStatusCode::Unmerged_DeletedByThem
@ Unmerged_DeletedByThem
Git::ReflogItem::id
QString id
Definition: Git.h:577
Git::FileStatus::Data::path2
QString path2
Definition: Git.h:324
Git::FileStatusList
std::vector< FileStatus > FileStatusList
Definition: Git.h:393
Git::CommitItem::sign
struct Git::CommitItem::@4 sign
Git::CommitItem::commit_id
CommitID commit_id
Definition: Git.h:110
Git::CommitItem::marker_depth
int marker_depth
Definition: Git.h:125
Git::parseAheadBehind
static void parseAheadBehind(QString const &s, Branch *b)
Definition: Git.cpp:550
Git::Branch::remote
QString remote
Definition: Git.h:258
Git::gitCommand
QString gitCommand() const
Definition: Git.cpp:208
Git::resultStdString
std::string resultStdString() const
Definition: Git.cpp:190
AbstractPtyProcess::setChangeDir
void setChangeDir(QString const &dir)
Definition: AbstractProcess.cpp:3
UnixProcess
Definition: UnixProcess.h:11
Git::setLogCallback
void setLogCallback(callback_t func, void *cookie)
Definition: Git.cpp:122
Git::FileStatus::Data
Definition: Git.h:317
Git::Diff::BLOB_AB_::b_id_or_path
QString b_id_or_path
Definition: Git.h:208
Git::reflog
bool reflog(ReflogItemList *out, int maxcount=100)
Definition: Git.cpp:1507
Git::Private::Info::git_command
QString git_command
Definition: Git.cpp:91
Git::getRemotes
QStringList getRemotes()
Definition: Git.cpp:1382
Git::status
QString status()
Definition: Git.cpp:178
Git::FileStatusCode::Unmerged_BothDeleted
@ Unmerged_BothDeleted
Git::CommitItemList::clear
void clear()
Definition: Git.h:155
Git::stash_apply
bool stash_apply()
Definition: Git.cpp:1447
TreeLine::TreeLine
TreeLine(int index=-1, int depth=-1)
Definition: Git.h:30
Git::Diff::mode
QString mode
Definition: Git.h:205
Git::Branch
Definition: Git.h:255
Git::setWorkingRepositoryDir
void setWorkingRepositoryDir(QString const &repo, const QString &submodpath, const QString &sshkey)
Definition: Git.cpp:128
Git::False
@ False
Definition: Git.h:598
NamedCommitItem::Type::None
@ None
Git::ReflogItem::command
QString command
Definition: Git.h:579
callback_t
Git::callback_t callback_t
Definition: Git.cpp:87
Git::Branch::isCurrent
bool isCurrent() const
Definition: Git.h:272
Git::Diff::Diff
Diff()=default
Git::mergeBranch
void mergeBranch(QString const &name, MergeFastForward ff, bool squash)
Definition: Git.cpp:1357
Git::Remote
Definition: Git.h:508
Git::MergeFastForward::Only
@ Only
Git::push_tags
bool push_tags(AbstractPtyProcess *pty=nullptr)
Definition: Git.cpp:1167
Git::DiffRaw::AB::mode
QString mode
Definition: Git.h:502
Git::Context::ssh_private_key
QString ssh_private_key
Definition: Git.h:69
Git::ReflogItemList
QList< ReflogItem > ReflogItemList
Definition: Git.h:591
Git::Hunk
Definition: Git.h:184
Git::RemoteInfo::commit_id
QString commit_id
Definition: Git.h:608
Git::Hunk::lines
std::vector< std::string > lines
Definition: Git.h:187
Git::ReflogItem::File::path
QString path
Definition: Git.h:587
Git::ReflogItem::message
QString message
Definition: Git.h:580
Git::FileStatus::FileStatus
FileStatus(QString const &text)
Definition: Git.h:348
Git::FileStatus::parseFileStatusCode
static FileStatusCode parseFileStatusCode(char x, char y)
Definition: Git.cpp:1618
Git::FileStatusCode::DeletedFromIndex
@ DeletedFromIndex
Git::submodule_update
bool submodule_update(const SubmoduleUpdateData &data, AbstractPtyProcess *pty)
Definition: Git.cpp:1073
Git::CommitItemList::empty
bool empty() const
Definition: Git.h:159
Git::setRemoteURL
void setRemoteURL(const Remote &remote)
Definition: Git.cpp:1485
Git::add_A
void add_A()
Definition: Git.cpp:1240
Git::True
@ True
Definition: Git.h:599
Git::Diff::a_submodule
struct Git::Diff::SubmoduleDetail a_submodule
Git::commit_amend_m
bool commit_amend_m(QString const &text, bool sign, AbstractPtyProcess *pty)
Definition: Git.cpp:1137
Git::status_s
FileStatusList status_s()
Definition: Git.cpp:1193
Git::ReflogItem::File::id_a
QString id_a
Definition: Git.h:584
Git::signingKey
QString signingKey(Source purpose)
Definition: Git.cpp:1695
Git::CommitID::compare
int compare(CommitID const &other) const
Definition: Git.h:53
Git::FileStatus::parse
void parse(QString const &text)
Definition: Git.cpp:1640
operator==
static bool operator==(Git::CommitID const &l, Git::CommitID const &r)
Definition: Git.h:647
Git::commit_
bool commit_(QString const &msg, bool amend, bool sign, AbstractPtyProcess *pty)
Definition: Git.cpp:1110
Git::Object::Type::UNKNOWN
@ UNKNOWN
Git::Private::Info
Definition: Git.cpp:90
Git::configGpgProgram
bool configGpgProgram(QString const &path, bool global)
Definition: Git.cpp:1761
Git::FileStatus::path2
QString path2() const
Definition: Git.h:378
Git
Definition: Git.h:40
Git::Branch::flags
int flags
Definition: Git.h:267
Git::workingDir
QString workingDir() const
Definition: Git.cpp:135
Git::reset_hard
bool reset_hard()
Definition: Git.cpp:1432
Git::User::name
QString name
Definition: Git.h:549
Git::CloneData::subdir
QString subdir
Definition: Git.h:468
Git::FileStatus::isDeleted
bool isDeleted() const
Definition: Git.h:368
Git::CommitItemList::at
CommitItem & at(size_t i)
Definition: Git.h:139
Git::Branch::HeadDetachedAt
@ HeadDetachedAt
Definition: Git.h:264
Git::CommitItem::has_child
bool has_child
Definition: Git.h:124
misc.h
Git::FileStatusCode::CopiedInIndex
@ CopiedInIndex
Git::isUncommited
static bool isUncommited(CommitItem const &item)
Definition: Git.h:250
Git::FileStatusCode::Staged_
@ Staged_
Git::FileStatus::FileStatus
FileStatus()=default
Git::Private::ssh_key_override
QString ssh_key_override
Definition: Git.cpp:99
Git::MergeFastForward::No
@ No
Git::Context::git_command
QString git_command
Definition: Git.h:67
Git::FileStatus::code
FileStatusCode code() const
Definition: Git.h:353
Git::FileStatus::Data::path1
QString path1
Definition: Git.h:323
Git::CommitItem::trust
QString trust
Definition: Git.h:122
Git::cherrypick
void cherrypick(QString const &name)
Definition: Git.cpp:1332
NamedCommitItem
Definition: Git.h:629
DiffPane::Right
@ Right
Git::FileStatusCode::Unknown
@ Unknown
Git::make_branch_list_
QStringList make_branch_list_()
Definition: Git.cpp:1311
TreeLine
Definition: Git.h:25
Git::cat_file_
QByteArray cat_file_(const CommitID &id)
Definition: Git.cpp:1207
Git::SubmoduleUpdateData::recursive
bool recursive
Definition: Git.h:619
Git::SubmoduleItem::name
QString name
Definition: Git.h:89
Git::stage
void stage(QString const &path)
Definition: Git.cpp:1245
Git::git_nolog
bool git_nolog(QString const &arg)
Definition: Git.h:437
Git::parseCommit
static CommitItem parseCommit(const QByteArray &ba)
Definition: Git.cpp:879
NamedCommitItem::Type::BranchRemote
@ BranchRemote
Git::DiffRaw::AB::id
QString id
Definition: Git.h:501
Git::CommitID::valid
bool valid
Definition: Git.h:44
Git::SubmoduleItem::url
QString url
Definition: Git.h:93
UnixProcess::wait
int wait()
Definition: UnixProcess.cpp:287
Git::rebaseBranch
void rebaseBranch(QString const &name)
Definition: Git.cpp:1377
Git::Diff::SubmoduleDetail::commit
Git::CommitItem commit
Definition: Git.h:213
NamedCommitItem::name
QString name
Definition: Git.h:638
TreeLine::depth
int depth
Definition: Git.h:27
Git::Tag::name
QString name
Definition: Git.h:283
Git::getUser
User getUser(Source purpose)
Definition: Git.cpp:1395
Git::trimPath
static QString trimPath(QString const &s)
Definition: Git.cpp:1587
Git::CommitItem::parent_ids
QList< CommitID > parent_ids
Definition: Git.h:111
Git::Diff::b_submodule
struct Git::Diff::SubmoduleDetail b_submodule
Git::FileStatus::Data::rawpath2
QString rawpath2
Definition: Git.h:322
Git::ReflogItem::head
QString head
Definition: Git.h:578
Git::callback_t
bool(*)(void *, const char *, int) callback_t
Definition: Git.h:414
Git::Option::errout
bool errout
Definition: Git.h:428
Git::DiffRaw::AB
Definition: Git.h:500
Git::Remote::name
QString name
Definition: Git.h:509
Git::resultQString
QString resultQString() const
Definition: Git.cpp:197
Git::cat_file
std::optional< QByteArray > cat_file(const CommitID &id)
Definition: Git.cpp:1216
Git::FileStatusCode::Unmerged_DeletedByUs
@ Unmerged_DeletedByUs
Git::CommitItem::message
QString message
Definition: Git.h:114
Git::Source
Source
Definition: Git.h:556
Git::submodule_add
bool submodule_add(const CloneData &data, bool force, AbstractPtyProcess *pty)
Definition: Git.cpp:1055
Git::diff_file
QString diff_file(QString const &old_path, QString const &new_path)
Definition: Git.cpp:472
Git::CommitItem::setParents
void setParents(QStringList const &list)
Definition: Git.cpp:27
Git::Object::Type::UNDEFINED
@ UNDEFINED
Git::SubmoduleItem
Definition: Git.h:88
Git::MergeFastForward
MergeFastForward
Definition: Git.h:309
Win32PtyProcess
Definition: Win32PtyProcess.h:10
Git::User
Definition: Git.h:548
Git::push_u
void push_u(bool set_upstream, QString const &remote, QString const &branch, bool force, AbstractPtyProcess *pty)
Definition: Git.cpp:1149
Git::tags2
QList< Tag > tags2()
Definition: Git.cpp:425
Git::CommitID
Definition: Git.h:42
Git::Diff::makeForSingleFile
void makeForSingleFile(Git::Diff *diff, QString const &id_a, QString const &id_b, QString const &path, QString const &mode)
Definition: Git.cpp:1779
joinpath.h
Git::Hunk::at
std::string at
Definition: Git.h:186
Git::Object::content
QByteArray content
Definition: Git.h:85
Git::SignatureGrade::NoSignature
@ NoSignature
Git::FileStatusCode::RenamedInIndex
@ RenamedInIndex
Git::CommitID::id
uint8_t id[GIT_ID_LENGTH/2]
Definition: Git.h:45
Git::FileStatus::data
struct Git::FileStatus::Data data
Git::CloneData
Definition: Git.h:465
Git::FileStatus::code_x
int code_x() const
Definition: Git.h:358
Git::Private::info
Info info
Definition: Git.cpp:97
Git::m
Private * m
Definition: Git.h:398
Git::FileStatus::rawpath2
QString rawpath2() const
Definition: Git.h:388
misc::splitLines
static QStringList splitLines(QByteArray const &ba, std::function< QString(char const *ptr, size_t len)> const &tos)
QByteArrayの文字列を行に分割する。
Definition: misc.cpp:33
Git::getCurrentBranchName
QString getCurrentBranchName()
Definition: Git.cpp:526
Git::Branch::ahead
int ahead
Definition: Git.h:259
Git::commit
bool commit(QString const &text, bool sign, AbstractPtyProcess *pty)
Definition: Git.cpp:1132
Git::CommitItemList
Definition: Git.h:131
misc::hex_string_to_bin
static std::vector< uint8_t > hex_string_to_bin(std::string_view const &s, const char *sep=nullptr)
16進数文字列をバイナリデータに変換する
Definition: misc.cpp:604
Git::Diff::Type::Create
@ Create
Git::Diff::isSubmodule
bool isSubmodule() const
Definition: Git.h:220
Git::CommitItemList::list
std::vector< CommitItem > list
Definition: Git.h:133
Git::ReflogItem::files
QList< File > files
Definition: Git.h:589
Git::DiffRaw::files
QStringList files
Definition: Git.h:505
Git::toQByteArray
QByteArray toQByteArray() const
Definition: Git.cpp:184
Git::FileStatus::isTracked
bool isTracked() const
Definition: Git.h:339
Git::User::email
QString email
Definition: Git.h:550
AbstractPtyProcess::start
virtual void start(QString const &cmd, QString const &env, QVariant const &userdata=QVariant())=0
Git::Object::Type::TREE
@ TREE
Git::CommitItemList::find
const CommitItem * find(CommitID const &id) const
Definition: Git.h:178
Git::addRemoteURL
void addRemoteURL(const Remote &remote)
Definition: Git.cpp:1492
Git::Branch::HeadDetachedFrom
@ HeadDetachedFrom
Definition: Git.h:265
Git::Object::Type::OFS_DELTA
@ OFS_DELTA
Git::Source::Global
@ Global
Git::ReflogItem::File::type
QString type
Definition: Git.h:586
Git.h
Git::FileStatus::rawpath1
QString rawpath1() const
Definition: Git.h:383
Git::FileStatus::code_y
int code_y() const
Definition: Git.h:363
Git::Diff::index
QString index
Definition: Git.h:203
NamedCommitItem::Type
Type
Definition: Git.h:630
Git::ReflogItem::File::atts_b
QString atts_b
Definition: Git.h:583
Git::SignatureGrade::Missing
@ Missing
Git::Branch::name
QString name
Definition: Git.h:256
Git::diff_to_file
QString diff_to_file(QString const &old_id, QString const &path)
Definition: Git.cpp:514
Git::diff_raw
QList< DiffRaw > diff_raw(CommitID const &old_id, CommitID const &new_id)
Definition: Git.cpp:480
Git::Tag::id
Git::CommitID id
Definition: Git.h:284
Git::Unset
@ Unset
Definition: Git.h:597
Git::Diff::path
QString path
Definition: Git.h:204
Git::log_signature
std::optional< CommitItem > log_signature(CommitID const &id)
Git::log_signature.
Definition: Git.cpp:818
Git::isValidID
static bool isValidID(QString const &id)
Definition: Git.cpp:154
Git::Diff::diff
QString diff
Definition: Git.h:202
Git::Remote::purpose
QString purpose
Definition: Git.h:511
Git::Diff::hunks
QList< Hunk > hunks
Definition: Git.h:210
Git::git_nochdir
bool git_nochdir(QString const &arg)
Definition: Git.h:443
Git::SignPolicy
SignPolicy
Definition: Git.h:596
misc::isValidMailAddress
static bool isValidMailAddress(const QString &email)
文字列が有効なメールアドレスか判定する
Definition: misc.cpp:546
Git::sshKey
const QString & sshKey() const
Definition: Git.cpp:144
Git::Diff::SubmoduleDetail::item
Git::SubmoduleItem item
Definition: Git.h:212
Git::Option
Definition: Git.h:425
Git::signPolicy
SignPolicy signPolicy(Source source)
Definition: Git.cpp:1723
Git::setSshKey
void setSshKey(const QString &sshkey) const
Definition: Git.cpp:149
Git::SubmoduleUpdateData::init
bool init
Definition: Git.h:618
Git::ls_remote
QList< RemoteInfo > ls_remote()
Definition: Git.cpp:1676
GIT_ID_LENGTH
#define GIT_ID_LENGTH
Definition: Git.h:16
global
ApplicationGlobal * global
Definition: main.cpp:33
Git::log_all
CommitItemList log_all(CommitID const &id, int maxcount)
コミットログを取得する
Definition: Git.cpp:791
Git::SubmoduleItem::refs
QString refs
Definition: Git.h:92
Git::CommitItem::author
QString author
Definition: Git.h:112
Git::init
bool init()
Definition: Git.cpp:366
Git::FileStatus::Data::code_y
char code_y
Definition: Git.h:319
UnixProcess::outbytes
std::vector< char > outbytes
Definition: UnixProcess.h:16
Git::Private
Definition: Git.cpp:89
NamedCommitItem::id
Git::CommitID id
Definition: Git.h:639
Git::Private::ssh_command
QString ssh_command
Definition: Git.cpp:98
Git::Remote::ssh_key
QString ssh_key
Definition: Git.h:512
Git::unstage_all
void unstage_all()
Definition: Git.cpp:1280
Git::Private::error_message
QString error_message
Definition: Git.cpp:101
Git::FileStatusCode::Unmerged_
@ Unmerged_
Git::Diff::BLOB_AB_
Definition: Git.h:206
Git::CommitItem
Definition: Git.h:109
GitObjectManager.h
Git::Diff
Definition: Git.h:189
Git::fetch_tags_f
void fetch_tags_f(AbstractPtyProcess *pty)
Definition: Git.cpp:1303
Git::SignatureGrade
SignatureGrade
Definition: Git.h:100
Git::Diff::blob
struct Git::Diff::BLOB_AB_ blob
AbstractPtyProcess
Definition: AbstractProcess.h:10
Git::ReflogItem::File
Definition: Git.h:581
Git::ReflogItem
Definition: Git.h:576
Git::fetch
void fetch(AbstractPtyProcess *pty=nullptr, bool prune=false)
Definition: Git.cpp:1292
Git::stash_drop
bool stash_drop()
Definition: Git.cpp:1452
Git::Private::Info::submodule_path
QString submodule_path
Definition: Git.cpp:93
Git::queryCommit
std::optional< CommitItem > queryCommit(const CommitID &id)
Definition: Git.cpp:957
Git::isValidID
static bool isValidID(CommitID const &id)
Definition: Git.h:518
Git::CommitItem::verify
char verify
Definition: Git.h:120
misc::normalizePathSeparator
static QString normalizePathSeparator(QString const &str)
Definition: misc.cpp:266
NamedCommitItem::Type::BranchLocal
@ BranchLocal
UnixProcess::start
void start(QString const &command, bool use_input)
Definition: UnixProcess.cpp:272
Git::DiffRaw::b
struct Git::DiffRaw::AB b
Git::Object::Type
Type
Definition: Git.h:73
Git::SubmoduleItem::path
QString path
Definition: Git.h:91
Git::Option::pty
AbstractPtyProcess * pty
Definition: Git.h:429
_SkipEmptyParts
#define _SkipEmptyParts
Definition: misc.h:15
Git::resetAllFiles
void resetAllFiles()
Definition: Git.cpp:1230
Git::FileStatus::Data::code
FileStatusCode code
Definition: Git.h:320
Git::FileStatusCode::Unmerged_AddedByThem
@ Unmerged_AddedByThem
AbstractProcess.h
Git::FileStatusCode
FileStatusCode
Definition: Git.h:287
Git::CommitID::CommitID
CommitID()=default
Git::Diff::Type::Unmerged
@ Unmerged
Git::Diff::Diff
Diff(QString const &id, QString const &path, QString const &mode)
Definition: Git.h:216
Git::tag
bool tag(QString const &name, const CommitID &id=QString())
Definition: Git.cpp:444
Git::chdirexec
bool chdirexec(std::function< bool()> const &fn)
Definition: Git.cpp:231
Git::revert
bool revert(const CommitID &id)
Definition: Git.cpp:1142
Git::Branch::isHeadDetached
bool isHeadDetached() const
Definition: Git.h:276
Git::Git
Git()
Definition: Git.cpp:105
Git::Diff::Type::Modify
@ Modify
NamedCommitItem::remote
QString remote
Definition: Git.h:637
TreeLine::bend_early
bool bend_early
Definition: Git.h:29
Git::CommitItemList::at
const CommitItem & at(size_t i) const
Definition: Git.h:143
Git::Private::result
std::vector< char > result
Definition: Git.cpp:100
Git::pull
void pull(AbstractPtyProcess *pty=nullptr)
Definition: Git.cpp:1285
Git::getRemoteURLs
void getRemoteURLs(QList< Remote > *out)
Definition: Git.cpp:1463
Git::FileStatusCode::Ignored
@ Ignored
Git::Object
Definition: Git.h:72
TreeLine::index
int index
Definition: Git.h:26
Git::checkoutBranch
void checkoutBranch(QString const &name)
Definition: Git.cpp:1327
Git::RemoteInfo
Definition: Git.h:607
parseGitSubModules
void parseGitSubModules(QByteArray const &ba, QList< Git::SubmoduleItem > *out)
Definition: Git.cpp:1838
Git::log
CommitItemList log(int maxcount)
Definition: Git.cpp:874
Git::FileStatusCode::Tracked_
@ Tracked_
Git::Source::Default
@ Default
Git::status_s_
FileStatusList status_s_()
Definition: Git.cpp:1175
Git::FileStatus::Data::rawpath1
QString rawpath1
Definition: Git.h:321
Git::Option::chdir
bool chdir
Definition: Git.h:426
Git::parseCommitItem
static std::optional< CommitItem > parseCommitItem(const QString &line)
Definition: Git.cpp:731
AbstractPtyProcess::userVariant
const QVariant & userVariant() const
Definition: AbstractProcess.cpp:13
Git::CommitItemList::find
CommitItem * find(CommitID const &id)
Definition: Git.h:170
Git::FileStatusCode::AddedToIndex
@ AddedToIndex
Git::Source::Local
@ Local
Git::Branch::Current
@ Current
Definition: Git.h:263
Git::Private::process_exit_code
int process_exit_code
Definition: Git.cpp:102
Git::CommitItem::resolved
bool resolved
Definition: Git.h:126
Git::SignatureGrade::Bad
@ Bad
Git::Diff::BLOB_AB_::a_id_or_path
QString a_id_or_path
Definition: Git.h:207
LineSide
LineSide
Definition: Git.h:20
Git::SignatureGrade::Good
@ Good
Git::Object::Type::TAG
@ TAG
Git::stash
bool stash()
Definition: Git.cpp:1442
Git::getMessage
QString getMessage(const QString &id)
Definition: Git.cpp:1351
Git::resetFile
void resetFile(QString const &path)
Definition: Git.cpp:1225
toQString
QString toQString(const std::vector< char > &vec)
Definition: Win32Process.cpp:235
Git::Diff::Type::Rename
@ Rename
Git::SignatureGrade::Dubious
@ Dubious
Git::blame
QByteArray blame(QString const &path)
Definition: Git.cpp:1666
Git::CommitItemList::operator[]
CommitItem & operator[](size_t i)
Definition: Git.h:147
Git::FileStatus::isUnmerged
bool isUnmerged() const
Definition: Git.h:334
Git::FileStatusCode::NotUpdated
@ NotUpdated
Git::FileStatus::isStaged
bool isStaged() const
Definition: Git.h:329
Git::setGitCommand
void setGitCommand(QString const &gitcmd, const QString &sshcmd={})
Definition: Git.cpp:202
Git::DiffRaw::state
QString state
Definition: Git.h:504
Git::Option::prefix
QString prefix
Definition: Git.h:430
Git::Diff::Type::Delete
@ Delete
Git::FileStatusCode::Unmerged_BothModified
@ Unmerged_BothModified
Git::FileStatus
Definition: Git.h:315
Git::getProcessExitCode
int getProcessExitCode() const
Definition: Git.cpp:226
Git::CommitID::assign
void assign(const QString &qid)
Definition: Git.cpp:35
Git::dup
GitPtr dup() const
Definition: Git.cpp:324
Git::FileStatusCode::Untracked
@ Untracked
Git::CloneData::basedir
QString basedir
Definition: Git.h:467
Git::CommitItem::key_fingerprint
std::vector< uint8_t > key_fingerprint
Definition: Git.h:121
Git::reset_head1
bool reset_head1()
Definition: Git.cpp:1427
Git::Object::Type::REF_DELTA
@ REF_DELTA
Git::clearResult
void clearResult()
Definition: Git.cpp:214
Git::RemoteInfo::name
QString name
Definition: Git.h:609
Git::CommitItem::text
QString text
Definition: Git.h:119
Git::clean_df
bool clean_df()
Definition: Git.cpp:1437
Git::preclone
static CloneData preclone(QString const &url, QString const &path)
Definition: Git.cpp:970