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