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 output_string() const
197  {
198  return std::string(status_.output.data(), status_.output.size());
199  }
200  std::string error_message() const
201  {
202  return status_.error_message;
203  }
204  std::string log_message() const
205  {
206  return status_.log_message;
207  }
208 };
209 
210 struct GitTag {
211  QString name;
213 };
214 
215 struct GitUser {
216  QString name;
217  QString email;
218  operator bool () const
219  {
221  }
222 };
223 
224 struct GitBranch {
225  QString name;
227  QString remote;
228  int ahead = 0;
229  int behind = 0;
230  enum {
232  Current = 0x0001,
233  HeadDetachedAt = 0x0002,
235  };
236  int flags = 0;
237  operator bool () const
238  {
239  return id.isValid() && !name.isEmpty();
240  }
241  bool isCurrent() const
242  {
243  return flags & Current;
244  }
245  bool isHeadDetached() const
246  {
247  return flags & HeadDetachedAt;
248  }
249 };
250 
251 struct GitCloneData {
252  QString url;
253  QString basedir;
254  QString subdir;
255 };
256 
257 enum class GitSource {
258  Default,
259  Global,
260  Local,
261 };
262 
264 public:
265  enum class Code : unsigned int {
266  Unknown,
267  Ignored,
268  Untracked,
269  NotUpdated = 0x10000000,
270  Staged_ = 0x20000000,
272  AddedToIndex,
276  Unmerged_ = 0x40000000,
284  Tracked_ = 0xf0000000
285  };
286 
287  struct Data {
288  char code_x = 0;
289  char code_y = 0;
291  QString rawpath1;
292  QString rawpath2;
293  QString path1;
294  QString path2;
295  } data;
296 
297  static Code parseFileStatusCode(char x, char y);
298 
299  bool isStaged() const
300  {
301  return (int)data.code & (int)Code::Staged_;
302  }
303 
304  bool isUnmerged() const
305  {
306  return (int)data.code & (int)Code::Unmerged_;
307  }
308 
309  bool isTracked() const
310  {
311  return (int)data.code & (int)Code::Tracked_;
312  }
313 
314  void parse(QString const &text);
315 
316  GitFileStatus() = default;
317 
318  GitFileStatus(QString const &text)
319  {
320  parse(text);
321  }
322 
323  Code code() const
324  {
325  return data.code;
326  }
327 
328  int code_x() const
329  {
330  return data.code_x;
331  }
332 
333  int code_y() const
334  {
335  return data.code_y;
336  }
337 
338  bool isDeleted() const
339  {
340  return code_x() == 'D' || code_y() == 'D';
341  }
342 
343  QString path1() const
344  {
345  return data.path1;
346  }
347 
348  QString path2() const
349  {
350  return data.path2;
351  }
352 
353  QString rawpath1() const
354  {
355  return data.rawpath1;
356  }
357 
358  QString rawpath2() const
359  {
360  return data.rawpath2;
361  }
362 };
363 
365  Default,
366  No,
367  Only,
368 };
369 
371  QString name;
373  QString path;
374  QString refs;
375  QString url;
376  operator bool () const
377  {
378  return id.isValid() && !path.isEmpty();
379  }
380 };
381 
383  bool init = true;
384  bool recursive = true;
385 };
386 
387 struct GitDiffRaw {
388  struct AB {
389  QString id;
390  QString mode;
391  } a, b;
392  QString state;
393  QStringList files;
394 };
395 
397  QString id;
398  QString head;
399  QString command;
400  QString message;
401  struct File {
402  QString atts_a;
403  QString atts_b;
404  QString id_a;
405  QString id_b;
406  QString type;
407  QString path;
408  };
409  QList<File> files;
410 };
411 
416 };
417 
418 enum class GitSignatureGrade {
419  NoSignature,
420  Unknown,
421  Good,
422  Dubious,
423  Missing,
424  Bad,
425 };
426 
427 class GitHunk {
428 public:
429  std::string at;
430  std::vector<std::string> lines;
431 };
432 
433 class GitDiff {
434 public:
435  enum class Type {
436  Unknown,
437  Modify,
438  Copy,
439  Rename,
440  Create,
441  Delete,
442  ChType,
443  Unmerged,
444  };
446  QString diff;
447  QString index;
448  QString path;
449  QString mode;
450  struct BLOB_AB_ {
451  QString a_id_or_path; // コミットIDまたはファイルパス。パスのときは PATH_PREFIX('*')で始まる
452  QString b_id_or_path;
453  } blob;
454  QList<GitHunk> hunks;
459  GitDiff() = default;
460  GitDiff(QString const &id, QString const &path, QString const &mode);
461  bool isSubmodule() const;
462 private:
463  void makeForSingleFile(GitDiff *diff, QString const &id_a, QString const &id_b, QString const &path, QString const &mode);
464 };
465 
466 QString gitTrimPath(QString const &s);
467 
468 #endif // GITTYPES_H
GitSignPolicy
Definition: GitTypes.h:412
@ True
Definition: GitTypes.h:415
@ Unset
Definition: GitTypes.h:413
@ False
Definition: GitTypes.h:414
#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:364
QString gitTrimPath(QString const &s)
Definition: GitTypes.cpp:152
GitSource
Definition: GitTypes.h:257
GitSignatureGrade
Definition: GitTypes.h:418
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:433
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:1743
struct GitDiff::SubmoduleDetail a_submodule
Type
Definition: GitTypes.h:435
QString mode
Definition: GitTypes.h:449
QString index
Definition: GitTypes.h:447
QString path
Definition: GitTypes.h:448
QList< GitHunk > hunks
Definition: GitTypes.h:454
struct GitDiff::SubmoduleDetail b_submodule
QString diff
Definition: GitTypes.h:446
bool isSubmodule() const
Definition: GitTypes.cpp:190
Type type
Definition: GitTypes.h:445
Definition: GitTypes.h:263
int code_y() const
Definition: GitTypes.h:333
bool isStaged() const
Definition: GitTypes.h:299
void parse(QString const &text)
Definition: Git.cpp:1600
bool isTracked() const
Definition: GitTypes.h:309
int code_x() const
Definition: GitTypes.h:328
QString path2() const
Definition: GitTypes.h:348
Code code() const
Definition: GitTypes.h:323
static Code parseFileStatusCode(char x, char y)
Definition: Git.cpp:1578
QString rawpath2() const
Definition: GitTypes.h:358
QString path1() const
Definition: GitTypes.h:343
bool isUnmerged() const
Definition: GitTypes.h:304
QString rawpath1() const
Definition: GitTypes.h:353
GitFileStatus(QString const &text)
Definition: GitTypes.h:318
bool isDeleted() const
Definition: GitTypes.h:338
GitFileStatus()=default
Code
Definition: GitTypes.h:265
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:427
std::string at
Definition: GitTypes.h:429
std::vector< std::string > lines
Definition: GitTypes.h:430
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:200
ProcessStatus status_
Definition: GitTypes.h:169
bool ok() const
Definition: GitTypes.h:184
std::string output_string() const
Definition: GitTypes.h:196
void set_output(std::vector< char > const &out)
Definition: GitTypes.h:175
std::string log_message() const
Definition: GitTypes.h:204
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:224
GitHash id
Definition: GitTypes.h:226
int ahead
Definition: GitTypes.h:228
int flags
Definition: GitTypes.h:236
@ Current
Definition: GitTypes.h:232
@ HeadDetachedFrom
Definition: GitTypes.h:234
@ None
Definition: GitTypes.h:231
@ HeadDetachedAt
Definition: GitTypes.h:233
int behind
Definition: GitTypes.h:229
bool isHeadDetached() const
Definition: GitTypes.h:245
bool isCurrent() const
Definition: GitTypes.h:241
QString name
Definition: GitTypes.h:225
QString remote
Definition: GitTypes.h:227
Definition: GitTypes.h:251
QString subdir
Definition: GitTypes.h:254
QString url
Definition: GitTypes.h:252
QString basedir
Definition: GitTypes.h:253
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:388
QString mode
Definition: GitTypes.h:390
QString id
Definition: GitTypes.h:389
Definition: GitTypes.h:387
QString state
Definition: GitTypes.h:392
struct GitDiffRaw::AB a
QStringList files
Definition: GitTypes.h:393
struct GitDiffRaw::AB b
Definition: GitTypes.h:450
QString a_id_or_path
Definition: GitTypes.h:451
QString b_id_or_path
Definition: GitTypes.h:452
Definition: GitTypes.h:455
GitSubmoduleItem item
Definition: GitTypes.h:456
GitCommitItem commit
Definition: GitTypes.h:457
Definition: GitTypes.h:97
bool isdir
Definition: GitTypes.h:99
QString name
Definition: GitTypes.h:98
Definition: GitTypes.h:287
char code_y
Definition: GitTypes.h:289
QString path1
Definition: GitTypes.h:293
Code code
Definition: GitTypes.h:290
QString path2
Definition: GitTypes.h:294
QString rawpath2
Definition: GitTypes.h:292
char code_x
Definition: GitTypes.h:288
QString rawpath1
Definition: GitTypes.h:291
Definition: GitTypes.h:77
QByteArray content
Definition: GitTypes.h:90
Type type
Definition: GitTypes.h:89
Type
Definition: GitTypes.h:78
Definition: GitTypes.h:401
QString type
Definition: GitTypes.h:406
QString atts_b
Definition: GitTypes.h:403
QString path
Definition: GitTypes.h:407
QString id_b
Definition: GitTypes.h:405
QString id_a
Definition: GitTypes.h:404
QString atts_a
Definition: GitTypes.h:402
Definition: GitTypes.h:396
QString command
Definition: GitTypes.h:399
QList< File > files
Definition: GitTypes.h:409
QString id
Definition: GitTypes.h:397
QString message
Definition: GitTypes.h:400
QString head
Definition: GitTypes.h:398
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:370
QString refs
Definition: GitTypes.h:374
GitHash id
Definition: GitTypes.h:372
QString path
Definition: GitTypes.h:373
QString name
Definition: GitTypes.h:371
QString url
Definition: GitTypes.h:375
Definition: GitTypes.h:382
bool recursive
Definition: GitTypes.h:384
bool init
Definition: GitTypes.h:383
Definition: GitTypes.h:210
QString name
Definition: GitTypes.h:211
GitHash id
Definition: GitTypes.h:212
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:215
QString name
Definition: GitTypes.h:216
QString email
Definition: GitTypes.h:217