Guitar
GitTypes.h
Go to the documentation of this file.
1 #ifndef GITTYPES_H
2 #define GITTYPES_H
3 
4 #include "MyProcess.h"
5 #include "common/misc.h"
6 #include <QDateTime>
7 #include <QString>
8 
9 #define GIT_ID_LENGTH (40)
10 #define PATH_PREFIX "*"
11 
12 struct GitRemote {
13  QString name;
14  QString url_fetch;
15  QString url_push;
16  QString ssh_key;
17  bool operator < (GitRemote const &r) const
18  {
19  return name < r.name;
20  }
21  QString const &url() const
22  {
23  return url_fetch;
24  }
25  void set_url(QString const &url)
26  {
27  url_fetch = url;
28  url_push = url;
29  }
30 };
31 
32 class GitHash {
33 private:
34  bool valid_ = false;
35  uint8_t id_[GIT_ID_LENGTH / 2];
36  template <typename VIEW> void _assign(VIEW const &id);
37 public:
38  GitHash();
39  explicit GitHash(std::string_view const &id);
40  explicit GitHash(QString const &id);
41  explicit GitHash(char const *id);
42  void assign(std::string_view const &id);
43  void assign(const QString &id);
44  QString toQString(int maxlen = -1) const;
45  bool isValid() const;
46  int compare(GitHash const &other) const;
47  operator bool () const;
48  size_t _std_hash() const;
49 
50  static bool isValidID(QString const &id);
51 
52  static bool isValidID(GitHash const &id)
53  {
54  return id.isValid();
55  }
56 };
57 
58 static inline bool operator == (GitHash const &l, GitHash const &r)
59 {
60  return l.compare(r) == 0;
61 }
62 
63 static inline bool operator < (GitHash const &l, GitHash const &r)
64 {
65  return l.compare(r) < 0;
66 }
67 
68 namespace std {
69 template <> class hash<GitHash> {
70 public:
71  size_t operator () (GitHash const &h) const
72  {
73  return h._std_hash();
74  }
75 };
76 }
77 
78 struct GitObject {
79  enum class Type { // 値は固定。packフォーマットで決まってる
80  NONE = -1,
81  UNKNOWN = 0,
82  COMMIT = 1,
83  TREE = 2,
84  BLOB = 3,
85  TAG = 4,
86  UNDEFINED = 5,
87  OFS_DELTA = 6,
88  REF_DELTA = 7,
89  };
91  QByteArray content;
92  operator bool () const
93  {
94  return type != Type::NONE;
95  }
96 };
97 
98 struct GitFileItem {
99  QString name;
100  bool isdir = false;
101 };
102 
103 struct GitTreeLine {
104  int index;
105  int depth;
106  int color_number = 0;
107  bool bend_early = false;
108  GitTreeLine(int index = -1, int depth = -1)
109  : index(index)
110  , depth(depth)
111  {
112  }
113 };
114 
118  QList<GitHash> parent_ids;
119  QString author;
120  QString email;
121  QString message;
122  QDateTime commit_date;
123  std::vector<GitTreeLine> parent_lines;
124  bool has_gpgsig = false;
125  QString gpgsig;
126  struct {
127  QString text;
128  char verify = 0; // git log format:%G?
129  std::vector<uint8_t> key_fingerprint;
130  QString trust;
131  } sign;
132  bool has_child = false;
133  int marker_depth = -1;
134  bool resolved = false;
135  bool order_fixed = false; // 時差や時計の誤差などの影響により、並び順の調整が行われたとき
136  void setParents(QStringList const &list);
137  operator bool () const
138  {
139  return commit_id;
140  }
141 };
142 
144 public:
145  std::vector<GitCommitItem> list;
146  std::map<GitHash, size_t> index;
147  size_t size() const
148  {
149  return list.size();
150  }
151  void resize(size_t n)
152  {
153  list.resize(n);
154  }
155  GitCommitItem &at(size_t i)
156  {
157  return list[i];
158  }
159  GitCommitItem const &at(size_t i) const
160  {
161  return list.at(i);
162  }
164  {
165  return at(i);
166  }
167  GitCommitItem const &operator [] (size_t i) const
168  {
169  return at(i);
170  }
171  void clear()
172  {
173  list.clear();
174  }
175  bool empty() const
176  {
177  return list.empty();
178  }
179  void updateIndex()
180  {
181  index.clear();
182  for (size_t i = 0; i < list.size(); i++) {
183  index[list[i].commit_id] = i;
184  }
185  }
187  {
188  auto it = index.find(id);
189  if (it != index.end()) {
190  return &list[it->second];
191  }
192  return nullptr;
193  }
194  GitCommitItem const *find(GitHash const &id) const
195  {
196  return const_cast<GitCommitItemList *>(this)->find(id);
197  }
198 };
199 
200 class GitResult {
201 private:
203 public:
204  void set_exit_code(int code)
205  {
206  status_.exit_code = code;
207  }
208  void set_output(std::vector<char> const &out)
209  {
210  status_.output = out;
211  }
212  void set_error_message(std::string const &msg)
213  {
214  status_.error_message = msg;
215  }
216 
217  bool ok() const
218  {
219  return status_.ok;
220  }
221  int exit_code()
222  {
223  return status_.exit_code;
224  }
225  std::vector<char> const &output() const
226  {
227  return status_.output;
228  }
229  std::string error_message() const
230  {
231  return status_.error_message;
232  }
233  std::string log_message() const
234  {
235  return status_.log_message;
236  }
237 };
238 
239 struct GitTag {
240  QString name;
242 };
243 
244 struct GitUser {
245  QString name;
246  QString email;
247  operator bool () const
248  {
250  }
251 };
252 
253 struct GitBranch {
254  QString name;
256  QString remote;
257  int ahead = 0;
258  int behind = 0;
259  enum {
261  Current = 0x0001,
262  HeadDetachedAt = 0x0002,
264  };
265  int flags = 0;
266  operator bool () const
267  {
268  return id.isValid() && !name.isEmpty();
269  }
270  bool isCurrent() const
271  {
272  return flags & Current;
273  }
274  bool isHeadDetached() const
275  {
276  return flags & HeadDetachedAt;
277  }
278 };
279 
280 struct GitCloneData {
281  QString url;
282  QString basedir;
283  QString subdir;
284 };
285 
286 enum class GitSource {
287  Default,
288  Global,
289  Local,
290 };
291 
293 public:
294  enum class Code : unsigned int {
295  Unknown,
296  Ignored,
297  Untracked,
298  NotUpdated = 0x10000000,
299  Staged_ = 0x20000000,
301  AddedToIndex,
305  Unmerged_ = 0x40000000,
313  Tracked_ = 0xf0000000
314  };
315 
316  struct Data {
317  char code_x = 0;
318  char code_y = 0;
320  QString rawpath1;
321  QString rawpath2;
322  QString path1;
323  QString path2;
324  } data;
325 
326  static Code parseFileStatusCode(char x, char y);
327 
328  bool isStaged() const
329  {
330  return (int)data.code & (int)Code::Staged_;
331  }
332 
333  bool isUnmerged() const
334  {
335  return (int)data.code & (int)Code::Unmerged_;
336  }
337 
338  bool isTracked() const
339  {
340  return (int)data.code & (int)Code::Tracked_;
341  }
342 
343  void parse(QString const &text);
344 
345  GitFileStatus() = default;
346 
347  GitFileStatus(QString const &text)
348  {
349  parse(text);
350  }
351 
352  Code code() const
353  {
354  return data.code;
355  }
356 
357  int code_x() const
358  {
359  return data.code_x;
360  }
361 
362  int code_y() const
363  {
364  return data.code_y;
365  }
366 
367  bool isDeleted() const
368  {
369  return code_x() == 'D' || code_y() == 'D';
370  }
371 
372  QString path1() const
373  {
374  return data.path1;
375  }
376 
377  QString path2() const
378  {
379  return data.path2;
380  }
381 
382  QString rawpath1() const
383  {
384  return data.rawpath1;
385  }
386 
387  QString rawpath2() const
388  {
389  return data.rawpath2;
390  }
391 };
392 
394  Default,
395  No,
396  Only,
397 };
398 
400  QString name;
402  QString path;
403  QString refs;
404  QString url;
405  operator bool () const
406  {
407  return id.isValid() && !path.isEmpty();
408  }
409 };
410 
412  bool init = true;
413  bool recursive = true;
414 };
415 
416 struct GitDiffRaw {
417  struct AB {
418  QString id;
419  QString mode;
420  } a, b;
421  QString state;
422  QStringList files;
423 };
424 
426  QString id;
427  QString head;
428  QString command;
429  QString message;
430  struct File {
431  QString atts_a;
432  QString atts_b;
433  QString id_a;
434  QString id_b;
435  QString type;
436  QString path;
437  };
438  QList<File> files;
439 };
440 
445 };
446 
447 enum class GitSignatureGrade {
448  NoSignature,
449  Unknown,
450  Good,
451  Dubious,
452  Missing,
453  Bad,
454 };
455 
456 class GitHunk {
457 public:
458  std::string at;
459  std::vector<std::string> lines;
460 };
461 
462 class GitDiff {
463 public:
464  enum class Type {
465  Unknown,
466  Modify,
467  Copy,
468  Rename,
469  Create,
470  Delete,
471  ChType,
472  Unmerged,
473  };
475  QString diff;
476  QString index;
477  QString path;
478  QString mode;
479  struct BLOB_AB_ {
480  QString a_id_or_path; // コミットIDまたはファイルパス。パスのときは PATH_PREFIX('*')で始まる
481  QString b_id_or_path;
482  } blob;
483  QList<GitHunk> hunks;
488  GitDiff() = default;
489  GitDiff(QString const &id, QString const &path, QString const &mode);
490  bool isSubmodule() const;
491 private:
492  void makeForSingleFile(GitDiff *diff, QString const &id_a, QString const &id_b, QString const &path, QString const &mode);
493 };
494 
495 QString gitTrimPath(QString const &s);
496 
497 #endif // GITTYPES_H
GitSignPolicy
Definition: GitTypes.h:441
@ True
Definition: GitTypes.h:444
@ Unset
Definition: GitTypes.h:442
@ False
Definition: GitTypes.h:443
#define GIT_ID_LENGTH
Definition: GitTypes.h:9
static bool operator==(GitHash const &l, GitHash const &r)
Definition: GitTypes.h:58
GitMergeFastForward
Definition: GitTypes.h:393
QString gitTrimPath(QString const &s)
Definition: GitTypes.cpp:151
GitSource
Definition: GitTypes.h:286
GitSignatureGrade
Definition: GitTypes.h:447
static bool operator<(GitHash const &l, GitHash const &r)
Definition: GitTypes.h:63
Definition: GitTypes.h:143
void resize(size_t n)
Definition: GitTypes.h:151
void clear()
Definition: GitTypes.h:171
std::map< GitHash, size_t > index
Definition: GitTypes.h:146
size_t size() const
Definition: GitTypes.h:147
GitCommitItem const * find(GitHash const &id) const
Definition: GitTypes.h:194
void updateIndex()
Definition: GitTypes.h:179
GitCommitItem * find(GitHash const &id)
Definition: GitTypes.h:186
bool empty() const
Definition: GitTypes.h:175
GitCommitItem & operator[](size_t i)
Definition: GitTypes.h:163
std::vector< GitCommitItem > list
Definition: GitTypes.h:145
GitCommitItem & at(size_t i)
Definition: GitTypes.h:155
GitCommitItem const & at(size_t i) const
Definition: GitTypes.h:159
Definition: GitTypes.h:462
struct GitDiff::BLOB_AB_ blob
GitDiff()=default
void makeForSingleFile(GitDiff *diff, QString const &id_a, QString const &id_b, QString const &path, QString const &mode)
Definition: Git.cpp:1726
struct GitDiff::SubmoduleDetail a_submodule
Type
Definition: GitTypes.h:464
QString mode
Definition: GitTypes.h:478
QString index
Definition: GitTypes.h:476
QString path
Definition: GitTypes.h:477
QList< GitHunk > hunks
Definition: GitTypes.h:483
struct GitDiff::SubmoduleDetail b_submodule
QString diff
Definition: GitTypes.h:475
bool isSubmodule() const
Definition: GitTypes.cpp:189
Type type
Definition: GitTypes.h:474
Definition: GitTypes.h:292
int code_y() const
Definition: GitTypes.h:362
bool isStaged() const
Definition: GitTypes.h:328
void parse(QString const &text)
Definition: Git.cpp:1583
bool isTracked() const
Definition: GitTypes.h:338
int code_x() const
Definition: GitTypes.h:357
QString path2() const
Definition: GitTypes.h:377
Code code() const
Definition: GitTypes.h:352
static Code parseFileStatusCode(char x, char y)
Definition: Git.cpp:1561
QString rawpath2() const
Definition: GitTypes.h:387
QString path1() const
Definition: GitTypes.h:372
bool isUnmerged() const
Definition: GitTypes.h:333
QString rawpath1() const
Definition: GitTypes.h:382
GitFileStatus(QString const &text)
Definition: GitTypes.h:347
bool isDeleted() const
Definition: GitTypes.h:367
GitFileStatus()=default
Code
Definition: GitTypes.h:294
struct GitFileStatus::Data data
Definition: GitTypes.h:32
void _assign(VIEW const &id)
Definition: GitTypes.cpp:46
size_t _std_hash() const
Definition: GitTypes.cpp:120
bool valid_
Definition: GitTypes.h:34
uint8_t id_[GIT_ID_LENGTH/2]
Definition: GitTypes.h:35
void assign(std::string_view const &id)
Definition: GitTypes.cpp:71
GitHash()
Definition: GitTypes.cpp:27
bool isValid() const
Definition: GitTypes.cpp:97
int compare(GitHash const &other) const
Definition: GitTypes.cpp:107
static bool isValidID(GitHash const &id)
Definition: GitTypes.h:52
QString toQString(int maxlen=-1) const
Definition: GitTypes.cpp:81
static bool isValidID(QString const &id)
Definition: GitTypes.cpp:125
Definition: GitTypes.h:456
std::string at
Definition: GitTypes.h:458
std::vector< std::string > lines
Definition: GitTypes.h:459
Definition: GitTypes.h:200
int exit_code()
Definition: GitTypes.h:221
std::vector< char > const & output() const
Definition: GitTypes.h:225
void set_error_message(std::string const &msg)
Definition: GitTypes.h:212
void set_exit_code(int code)
Definition: GitTypes.h:204
std::string error_message() const
Definition: GitTypes.h:229
ProcessStatus status_
Definition: GitTypes.h:202
bool ok() const
Definition: GitTypes.h:217
void set_output(std::vector< char > const &out)
Definition: GitTypes.h:208
std::string log_message() const
Definition: GitTypes.h:233
Definition: MyProcess.h:21
bool ok
Definition: MyProcess.h:23
int exit_code
Definition: MyProcess.h:24
std::string error_message
Definition: MyProcess.h:26
std::vector< char > output
Definition: MyProcess.h:25
std::string log_message
Definition: MyProcess.h:27
static bool isValidMailAddress(const QString &email)
文字列が有効なメールアドレスか判定する
Definition: misc.cpp:748
Definition: GitTypes.h:68
Definition: GitTypes.h:253
GitHash id
Definition: GitTypes.h:255
int ahead
Definition: GitTypes.h:257
int flags
Definition: GitTypes.h:265
@ Current
Definition: GitTypes.h:261
@ HeadDetachedFrom
Definition: GitTypes.h:263
@ None
Definition: GitTypes.h:260
@ HeadDetachedAt
Definition: GitTypes.h:262
int behind
Definition: GitTypes.h:258
bool isHeadDetached() const
Definition: GitTypes.h:274
bool isCurrent() const
Definition: GitTypes.h:270
QString name
Definition: GitTypes.h:254
QString remote
Definition: GitTypes.h:256
Definition: GitTypes.h:280
QString subdir
Definition: GitTypes.h:283
QString url
Definition: GitTypes.h:281
QString basedir
Definition: GitTypes.h:282
Definition: GitTypes.h:115
QList< GitHash > parent_ids
Definition: GitTypes.h:118
bool has_child
Definition: GitTypes.h:132
void setParents(QStringList const &list)
Definition: Git.cpp:11
GitHash tree
Definition: GitTypes.h:117
bool order_fixed
Definition: GitTypes.h:135
bool resolved
Definition: GitTypes.h:134
QString message
Definition: GitTypes.h:121
bool has_gpgsig
Definition: GitTypes.h:124
GitHash commit_id
Definition: GitTypes.h:116
QString text
Definition: GitTypes.h:127
QDateTime commit_date
Definition: GitTypes.h:122
QString email
Definition: GitTypes.h:120
QString trust
Definition: GitTypes.h:130
struct GitCommitItem::@7 sign
QString author
Definition: GitTypes.h:119
char verify
Definition: GitTypes.h:128
std::vector< GitTreeLine > parent_lines
Definition: GitTypes.h:123
QString gpgsig
Definition: GitTypes.h:125
std::vector< uint8_t > key_fingerprint
Definition: GitTypes.h:129
int marker_depth
Definition: GitTypes.h:133
Definition: GitTypes.h:417
QString mode
Definition: GitTypes.h:419
QString id
Definition: GitTypes.h:418
Definition: GitTypes.h:416
QString state
Definition: GitTypes.h:421
struct GitDiffRaw::AB a
QStringList files
Definition: GitTypes.h:422
struct GitDiffRaw::AB b
Definition: GitTypes.h:479
QString a_id_or_path
Definition: GitTypes.h:480
QString b_id_or_path
Definition: GitTypes.h:481
Definition: GitTypes.h:484
GitSubmoduleItem item
Definition: GitTypes.h:485
GitCommitItem commit
Definition: GitTypes.h:486
Definition: GitTypes.h:98
bool isdir
Definition: GitTypes.h:100
QString name
Definition: GitTypes.h:99
Definition: GitTypes.h:316
char code_y
Definition: GitTypes.h:318
QString path1
Definition: GitTypes.h:322
Code code
Definition: GitTypes.h:319
QString path2
Definition: GitTypes.h:323
QString rawpath2
Definition: GitTypes.h:321
char code_x
Definition: GitTypes.h:317
QString rawpath1
Definition: GitTypes.h:320
Definition: GitTypes.h:78
QByteArray content
Definition: GitTypes.h:91
Type type
Definition: GitTypes.h:90
Type
Definition: GitTypes.h:79
Definition: GitTypes.h:430
QString type
Definition: GitTypes.h:435
QString atts_b
Definition: GitTypes.h:432
QString path
Definition: GitTypes.h:436
QString id_b
Definition: GitTypes.h:434
QString id_a
Definition: GitTypes.h:433
QString atts_a
Definition: GitTypes.h:431
Definition: GitTypes.h:425
QString command
Definition: GitTypes.h:428
QList< File > files
Definition: GitTypes.h:438
QString id
Definition: GitTypes.h:426
QString message
Definition: GitTypes.h:429
QString head
Definition: GitTypes.h:427
Definition: GitTypes.h:12
QString const & url() const
Definition: GitTypes.h:21
QString url_fetch
Definition: GitTypes.h:14
bool operator<(GitRemote const &r) const
Definition: GitTypes.h:17
QString ssh_key
Definition: GitTypes.h:16
QString name
Definition: GitTypes.h:13
QString url_push
Definition: GitTypes.h:15
void set_url(QString const &url)
Definition: GitTypes.h:25
Definition: GitTypes.h:399
QString refs
Definition: GitTypes.h:403
GitHash id
Definition: GitTypes.h:401
QString path
Definition: GitTypes.h:402
QString name
Definition: GitTypes.h:400
QString url
Definition: GitTypes.h:404
Definition: GitTypes.h:411
bool recursive
Definition: GitTypes.h:413
bool init
Definition: GitTypes.h:412
Definition: GitTypes.h:239
QString name
Definition: GitTypes.h:240
GitHash id
Definition: GitTypes.h:241
Definition: GitTypes.h:103
bool bend_early
Definition: GitTypes.h:107
int color_number
Definition: GitTypes.h:106
GitTreeLine(int index=-1, int depth=-1)
Definition: GitTypes.h:108
int depth
Definition: GitTypes.h:105
int index
Definition: GitTypes.h:104
Definition: GitTypes.h:244
QString name
Definition: GitTypes.h:245
QString email
Definition: GitTypes.h:246