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