Code forensics  0.1
Generate historical information about code changes
git_ir.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <cassert>
4 #include <sqlite_orm/sqlite_orm.h>
5 #include <concepts>
6 #include <iostream>
7 #include <filesystem>
8 #include <unordered_map>
9 
10 
11 #include "common.hpp"
12 #include "dod_base.hpp"
13 
14 
15 using namespace sqlite_orm;
16 
17 template <dod::IsIdType T>
18 auto operator<<(std::ostream& stream, T id) -> std::ostream& {
19  if (id.isNil()) {
20  stream << "NULL";
21  } else {
22  stream << id.getValue();
23  }
24  return stream;
25 }
26 
27 namespace sqlite_orm {
28 template <dod::IsIdType T>
29 struct type_printer<T> : public integer_printer {};
30 
31 template <dod::IsIdType T>
32 struct statement_binder<T> {
33  auto bind(sqlite3_stmt* stmt, int index, T value) -> int {
34  if (value.isNil()) {
35  return sqlite3_bind_null(stmt, index);
36 
37  } else {
38  return statement_binder<typename T::id_base_type>().bind(
39  stmt, index, value.getValue());
40  }
41  }
42 };
43 
44 template <dod::IsIdType T>
45 struct field_printer<T> {
46  auto operator()(T t) const -> std::string {
47  if (t.isNil()) {
48  return "NULL";
49  } else {
50  return field_printer<typename T::id_base_type>()(t.getValue());
51  }
52  }
53 };
54 
55 template <dod::IsIdType T>
56 struct row_extractor<T> {
57  auto extract(const char* row_value) -> T {
58  return T::FromValue(std::stoi(row_value));
59  }
60 
61  auto extract(sqlite3_stmt* stmt, int columnIndex) -> T {
62  return T::FromValue(sqlite3_column_int(stmt, columnIndex));
63  }
64 };
65 }; // namespace sqlite_orm
66 
67 
68 namespace ir {
69 
70 DECL_ID_TYPE(LineData, LineId, std::size_t);
71 DECL_ID_TYPE(Commit, CommitId, std::size_t);
72 DECL_ID_TYPE(File, FileId, std::size_t);
73 DECL_ID_TYPE(FilePath, FilePathId, std::size_t);
74 DECL_ID_TYPE(Directory, DirectoryId, std::size_t);
75 DECL_ID_TYPE(String, StringId, std::size_t);
76 
77 } // namespace ir
78 
79 
80 namespace dod {
83 template <>
84 struct id_type<Str> {
85  using type = ir::StringId;
86 };
87 } // namespace dod
88 
89 namespace ir {
90 
91 DECL_ID_TYPE(Author, AuthorId, int);
92 
94 
97 struct FilePath {
98  using id_type = FilePathId;
99  ir::StringId path;
100  Opt<ir::DirectoryId> dir;
101 
102  bool operator==(CR<FilePath> other) const {
103  return this->path == other.path;
104  }
105 };
106 
107 struct EditedFile {
108  ir::FilePathId path;
109  int added;
110  int removed;
111 };
112 
113 struct RenamedFile {
114  ir::FilePathId old_path;
115  ir::FilePathId new_path;
116 };
117 
120 struct Commit {
121  using id_type = CommitId;
122  AuthorId author;
123  i64 time;
124  int timezone;
125  Str hash;
126  int period;
127  Str message;
128  Vec<EditedFile> edited_files;
129  Vec<RenamedFile> renamed_files;
130 };
131 
132 
135 struct File {
136  using id_type = FileId;
137  CommitId commit_id;
138  ir::FilePathId path;
140  Vec<LineId> lines;
141 };
142 
143 
146 struct Directory {
147  using id_type = DirectoryId;
148  Opt<DirectoryId> parent;
149  Str name;
150 
151  auto operator==(CR<Directory> other) const -> bool {
152  return name == other.name && parent == other.parent;
153  }
154 };
155 
158 struct String {
159  using id_type = StringId;
160  Str text;
161  auto operator==(CR<String> other) const -> bool {
162  return text == other.text;
163  }
164 };
165 
168 struct Author {
169  using id_type = AuthorId;
170  Str name;
171  Str email;
172 
173  auto operator==(CR<Author> other) const -> bool {
174  return name == other.name && email == other.email;
175  }
176 };
177 
178 
186 struct LineData {
187  using id_type = LineId;
188  AuthorId author;
189  i64 time;
190  StringId content;
191  CommitId commit;
192  int nesting;
193 
194  auto operator==(CR<LineData> other) const -> bool {
195  return author == other.author && time == other.time &&
196  content == other.content;
197  }
198 };
199 } // namespace ir
200 
201 
202 // Taken from the SO answer
203 // https://stackoverflow.com/questions/2590677/how-do-i-combine-hash-values-in-c0x
204 inline void hash_combine(std::size_t& seed) {}
205 
207 template <typename T, typename... Rest>
208 inline void hash_combine(std::size_t& seed, const T& v, Rest... rest) {
209  std::hash<T> hasher;
210  seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
211  hash_combine(seed, rest...);
212 }
213 
215 #define MAKE_HASHABLE(__type, __varname, ...) \
216  namespace std { \
217  template <> \
218  struct hash<__type> { \
219  auto operator()(const __type& __varname) const \
220  -> std::size_t { \
221  std::size_t ret = 0; \
222  hash_combine(ret, __VA_ARGS__); \
223  return ret; \
224  } \
225  }; \
226  }
227 
228 // Add hashing declarations for the author and line data - they will be
229 // interned. `std::string` already has the hash structure.
230 MAKE_HASHABLE(ir::Author, it, it.name, it.email);
231 MAKE_HASHABLE(ir::LineData, it, it.author, it.time, it.content);
232 MAKE_HASHABLE(ir::Directory, it, it.name, it.parent);
233 MAKE_HASHABLE(ir::String, it, it.text);
235 
236 namespace ir {
239  dod::MultiStore<
240  dod::InternStore<AuthorId, Author>, // Full list of authors
241  dod::InternStore<LineId, LineData>, // found lines
242  dod::Store<FileId, File>, // files
243  dod::InternStore<FilePathId, FilePath>, // file paths
244  dod::Store<CommitId, Commit>, // all commits
245  dod::InternStore<DirectoryId, Directory>, // all directories
246  dod::InternStore<StringId, String> // all interned strings
247  >
249 
250  std::unordered_map<Str, DirectoryId> prefixes;
251 
253  auto parentDirectory(CR<Path> dir) -> Opt<DirectoryId> {
254  if (dir.has_parent_path()) {
255  auto parent = dir.parent_path();
256  auto native = parent.native();
257  if (prefixes.contains(native)) {
258  return prefixes.at(native);
259  } else {
260  auto result = getDirectory(parent);
261  prefixes.insert({parent, result});
262  return result;
263  }
264  } else {
265  return Opt<DirectoryId>{};
266  }
267  }
268 
270  auto getDirectory(CR<Path> dir) -> DirectoryId {
271  return add(ir::Directory{
272  .parent = parentDirectory(dir), .name = dir.native()});
273  }
274 
275  FilePathId getFilePath(CR<Str> file) {
276  if (file.starts_with(" ")) {
277  std::cerr << file << std::endl;
278  assert(false);
279  }
280 
281 
282  auto result = add(ir::FilePath{
283  .path = add(String{file}), .dir = parentDirectory(file)});
284 
285  assert(!at(at(result).path).text.starts_with(" "));
286 
287  return result;
288  }
289 
291  template <dod::IsIdType Id>
292  auto at(Id id) -> typename dod::value_type_t<Id>& {
293  return multi.at<Id>(id);
294  }
295 
296  template <dod::IsIdType Id>
297  [[nodiscard]] auto cat(Id id) const -> CR<dod::value_type_t<Id>> {
298  return multi.at<Id>(id);
299  }
300 
302  template <typename T>
303  [[nodiscard]] auto add(CR<T> it) -> dod::id_type_t<T> {
304  return multi.add<T>(it);
305  }
306 };
307 
308 
312 
314 struct orm_file : File {
315  FileId id;
316  inline orm_file()
317  : File{.commit_id = CommitId::Nil(), .path = FilePathId::Nil()}
318  , id(FileId::Nil()) {}
319  inline orm_file(FileId _id, CR<File> base) : File(base), id(_id) {}
320 };
321 
323 struct orm_commit : Commit {
324  CommitId id;
325 
326  inline orm_commit()
327  : Commit{.author = AuthorId::Nil()}, id(CommitId::Nil()) {}
328  inline orm_commit(CommitId _id, CR<Commit> base)
329  : Commit(base), id(_id) {}
330 };
331 
333 struct orm_dir : Directory {
334  DirectoryId id;
335 
336  inline orm_dir() : Directory{}, id(DirectoryId::Nil()) {}
337  inline orm_dir(DirectoryId _id, CR<Directory> base)
338  : Directory(base), id(_id) {}
339 };
340 
342 struct orm_string : String {
343  StringId id;
344 
345  inline orm_string() : String{}, id(StringId::Nil()) {}
346  inline orm_string(StringId _id, CR<String> base)
347  : String(base), id(_id) {}
348 };
349 
351 struct orm_author : Author {
352  AuthorId id;
353 
354 
355  inline orm_author() : Author{}, id(AuthorId::Nil()) {}
356  inline orm_author(AuthorId _id, CR<Author> base)
357  : Author(base), id(_id) {}
358 };
359 
361 struct orm_line : LineData {
362  LineId id;
363  inline orm_line()
364  : LineData{.author = AuthorId::Nil(), .content = StringId::Nil(), .commit = CommitId::Nil()}
365  , id(LineId::Nil()) {}
366 
367  inline orm_line(LineId _id, CR<LineData> base)
368  : LineData(base), id(_id) {}
369 };
370 
373  FileId file;
374  int index;
375  LineId line;
376 };
377 
379  CommitId commit;
380 };
381 
383  CommitId commit;
384 };
385 
387  FilePathId id;
388 };
389 
390 inline void exec(sqlite3* db, Str query) {
391  int rc = sqlite3_exec(db, query.c_str(), nullptr, nullptr, nullptr);
392  if (rc != SQLITE_OK) {
393  throw std::runtime_error(
394  "DB execution failure for query '" + query +
395  "': " + sqlite3_errmsg(db) + " error: " + sqlite3_errstr(rc));
396  }
397 }
398 
400 inline auto create_db(CR<Str> storagePath) {
401  auto storage = make_storage(
402  storagePath,
403  make_table<orm_renamed_file>(
404  "renamed",
405  make_column("rcommit", &orm_renamed_file::commit),
406  make_column("old_path", &orm_renamed_file::old_path),
407  make_column("new_path", &orm_renamed_file::new_path)),
408  make_table<orm_file_path>(
409  "paths",
410  make_column("id", &orm_file_path::id, primary_key()),
411  make_column("path", &orm_file_path::path),
412  make_column("dir", &orm_file_path::dir)),
413  make_table<orm_commit>(
414  "rcommit",
415  make_column("id", &orm_commit::id, primary_key()),
416  make_column("author", &orm_commit::author),
417  make_column("time", &orm_commit::time),
418  make_column("hash", &orm_commit::hash),
419  make_column("period", &orm_commit::period),
420  make_column("timezone", &orm_commit::timezone),
421  make_column("message", &orm_commit::message)),
422  make_table<orm_file>(
423  "file",
424  make_column("id", &orm_file::id, primary_key()),
425  make_column("rcommit", &orm_file::commit_id),
426  make_column("path", &orm_file::path)),
427  make_table<orm_author>(
428  "author",
429  make_column("id", &orm_author::id, primary_key()),
430  make_column("name", &orm_author::name),
431  make_column("email", &orm_author::email)),
432  make_table<orm_edited_files>(
433  "edited_files",
434  make_column("rcommit", &orm_edited_files::commit),
435  make_column("added", &orm_edited_files::added),
436  make_column("removed", &orm_edited_files::removed),
437  make_column("path", &orm_edited_files::path)),
438  make_table<orm_line>(
439  "line",
440  make_column("id", &orm_line::id, primary_key()),
441  make_column("author", &orm_line::author),
442  make_column("time", &orm_line::time),
443  make_column("content", &orm_line::content),
444  make_column("rcommit", &orm_line::commit),
445  make_column("nesting", &orm_line::nesting)),
446  make_table<orm_lines_table>(
447  "file_lines",
448  make_column("file", &orm_lines_table::file),
449  make_column("idx", &orm_lines_table::index),
450  make_column("line", &orm_lines_table::line)),
451  make_table<orm_dir>(
452  "dir",
453  make_column("id", &orm_dir::id, primary_key()),
454  make_column("parent", &orm_dir::parent),
455  make_column("name", &orm_dir::name)),
456  make_table<orm_string>(
457  "strings",
458  make_column("id", &orm_string::id, primary_key()),
459  make_column("text", &orm_string::text)));
460 
461  storage.on_open = [](sqlite3* db) {
462  // do what you want once open happened
463  exec(db, "DROP VIEW IF EXISTS file_version_with_path;--");
464  exec(db, R"(
465 CREATE VIEW file_version_with_path AS SELECT file.id AS id,
466  file.rcommit,
467  paths.path AS path_id,
468  strings.text AS PATH,
469  paths.dir AS dir
470  FROM FILE
471  INNER JOIN paths
472  ON file.path = paths.id
473  INNER JOIN strings
474  ON path_id = strings.id;--
475 )");
476  exec(db, "DROP VIEW IF EXISTS file_version_with_path_dir;--");
477  exec(db, R"(
478 CREATE VIEW file_version_with_path_dir AS SELECT fv.id,
479  fv.rcommit as rcommit,
480  fv.path as path,
481  fv.path_id as path_id,
482  dir.name AS dir
483  FROM file_version_with_path AS fv
484  INNER JOIN dir
485  ON fv.dir = dir.id;--
486  )");
487 
488  exec(db, "DROP VIEW IF EXISTS file_path_with_dir;--");
489  exec(db, R"(
490 CREATE VIEW file_path_with_dir AS SELECT paths.id AS path_id,
491  strings.text AS PATH,
492  dir.name AS dir
493  FROM paths
494  INNER JOIN strings
495  ON paths.path = strings.id
496  LEFT OUTER JOIN dir
497  ON paths.dir = dir.id;--
498  )");
499  };
500 
501  return storage;
502 }
503 
505 using DbConnection = decltype(create_db(""));
506 
507 } // namespace ir
ir::orm_edited_files::commit
CommitId commit
Definition: git_ir.hpp:379
ir::orm_renamed_file
Definition: git_ir.hpp:382
ir::orm_line::orm_line
orm_line(LineId _id, CR< LineData > base)
Definition: git_ir.hpp:367
sqlite_orm
Definition: git_ir.hpp:27
ir::orm_author
ORM wrapper for the author data.
Definition: git_ir.hpp:351
ir::orm_string
ORM wrapper for the string data.
Definition: git_ir.hpp:342
ir::FilePath
file path with associated parent directory information
Definition: git_ir.hpp:97
ir::RenamedFile
Definition: git_ir.hpp:113
ir::Commit::renamed_files
Vec< RenamedFile > renamed_files
Definition: git_ir.hpp:129
ir::LineData::operator==
auto operator==(CR< LineData > other) const -> bool
Line indentation depth.
Definition: git_ir.hpp:194
ir::orm_file::orm_file
orm_file(FileId _id, CR< File > base)
Definition: git_ir.hpp:319
ir::FilePath::dir
Opt< ir::DirectoryId > dir
Definition: git_ir.hpp:100
ir::orm_line::id
LineId id
Definition: git_ir.hpp:362
ir::content_manager::cat
auto cat(Id id) const -> CR< dod::value_type_t< Id >>
Definition: git_ir.hpp:297
ir::orm_edited_files
Definition: git_ir.hpp:378
ir::orm_commit::orm_commit
orm_commit()
Definition: git_ir.hpp:326
ir::orm_line
ORM wrapper for the line data.
Definition: git_ir.hpp:361
ir::orm_commit
ORM wrapper for the commit data.
Definition: git_ir.hpp:323
ir::orm_dir
ORM wrapper for the directory data.
Definition: git_ir.hpp:333
ir::content_manager::getFilePath
FilePathId getFilePath(CR< Str > file)
Definition: git_ir.hpp:275
ir::orm_string::orm_string
orm_string(StringId _id, CR< String > base)
Definition: git_ir.hpp:346
ir::Commit::message
Str message
Number of the period that commit was attributed to.
Definition: git_ir.hpp:127
ir::LineData::nesting
int nesting
Definition: git_ir.hpp:192
ir::Directory::operator==
auto operator==(CR< Directory > other) const -> bool
Id of the string.
Definition: git_ir.hpp:151
ir::orm_line::orm_line
orm_line()
Definition: git_ir.hpp:363
ir::EditedFile::added
int added
Definition: git_ir.hpp:109
ir
Definition: git_ir.hpp:68
ir::orm_lines_table::index
int index
Definition: git_ir.hpp:374
ir::LineData::commit
CommitId commit
Content of the line.
Definition: git_ir.hpp:191
ir::DECL_ID_TYPE
DECL_ID_TYPE(Author, AuthorId, int)
dod
Definition: git_ir.hpp:80
ir::Commit::hash
Str hash
timezone where commit was taken
Definition: git_ir.hpp:125
sqlite_orm::field_printer< T >::operator()
auto operator()(T t) const -> std::string
Definition: git_ir.hpp:46
ir::Author::id_type
AuthorId id_type
Definition: git_ir.hpp:169
ir::Directory::name
Str name
Parent directory ID.
Definition: git_ir.hpp:149
ir::FilePath::path
ir::StringId path
Definition: git_ir.hpp:99
ir::orm_dir::orm_dir
orm_dir(DirectoryId _id, CR< Directory > base)
Definition: git_ir.hpp:337
ir::File::commit_id
CommitId commit_id
Definition: git_ir.hpp:137
ir::orm_renamed_file::commit
CommitId commit
Definition: git_ir.hpp:383
ir::File::lines
Vec< LineId > lines
Definition: git_ir.hpp:140
ir::DbConnection
decltype(create_db("")) DbConnection
Database connection type alias.
Definition: git_ir.hpp:505
ir::LineData::content
StringId content
Time line was written.
Definition: git_ir.hpp:190
ir::orm_author::orm_author
orm_author()
Definition: git_ir.hpp:355
ir::orm_file
ORM wrapper for the file data.
Definition: git_ir.hpp:314
ir::orm_string::id
StringId id
Definition: git_ir.hpp:343
ir::content_manager::at
auto at(Id id) -> typename dod::value_type_t< Id > &
Get reference to value pointed to by the ID.
Definition: git_ir.hpp:292
ir::String::text
Str text
Definition: git_ir.hpp:160
ir::FilePath::id_type
FilePathId id_type
Definition: git_ir.hpp:98
sqlite_orm::row_extractor< T >::extract
auto extract(sqlite3_stmt *stmt, int columnIndex) -> T
Definition: git_ir.hpp:61
ir::Commit::time
i64 time
references unique author id
Definition: git_ir.hpp:123
ir::String
Table of interned stirngs for different purposes.
Definition: git_ir.hpp:158
ir::orm_string::orm_string
orm_string()
Definition: git_ir.hpp:345
ir::File::id_type
FileId id_type
Definition: git_ir.hpp:136
ir::orm_lines_table
ORM wrapper for the file lines data ir::File::lines.
Definition: git_ir.hpp:372
ir::FilePath::operator==
bool operator==(CR< FilePath > other) const
Definition: git_ir.hpp:102
ir::File
single version of the file that appeared in some commit
Definition: git_ir.hpp:135
MAKE_HASHABLE
#define MAKE_HASHABLE(__type, __varname,...)
Declare boilerplate type hasing using list of fields.
Definition: git_ir.hpp:215
ir::Commit::edited_files
Vec< EditedFile > edited_files
Commit message.
Definition: git_ir.hpp:128
sqlite_orm::statement_binder< T >::bind
auto bind(sqlite3_stmt *stmt, int index, T value) -> int
Definition: git_ir.hpp:33
dod::id_type< Str >::type
ir::StringId type
Definition: git_ir.hpp:85
ir::content_manager::parentDirectory
auto parentDirectory(CR< Path > dir) -> Opt< DirectoryId >
Get optional parent directory Id from the path.
Definition: git_ir.hpp:253
sqlite_orm::row_extractor< T >::extract
auto extract(const char *row_value) -> T
Definition: git_ir.hpp:57
ir::LineData::time
i64 time
Line author ID.
Definition: git_ir.hpp:189
ir::Commit::id_type
CommitId id_type
Definition: git_ir.hpp:121
ir::content_manager::getDirectory
auto getDirectory(CR< Path > dir) -> DirectoryId
Get directory ID from the provided path.
Definition: git_ir.hpp:270
ir::orm_commit::id
CommitId id
Definition: git_ir.hpp:324
ir::Directory::parent
Opt< DirectoryId > parent
Definition: git_ir.hpp:148
ir::orm_commit::orm_commit
orm_commit(CommitId _id, CR< Commit > base)
Definition: git_ir.hpp:328
ir::orm_lines_table::file
FileId file
Definition: git_ir.hpp:373
ir::content_manager::add
auto add(CR< T > it) -> dod::id_type_t< T >
Push in a value, return newly generated ID.
Definition: git_ir.hpp:303
ir::EditedFile
Definition: git_ir.hpp:107
ir::orm_dir::id
DirectoryId id
Definition: git_ir.hpp:334
ir::exec
void exec(sqlite3 *db, Str query)
Definition: git_ir.hpp:390
ir::Author
Author - name and email found during the source code analysis.
Definition: git_ir.hpp:168
ir::Author::email
Str email
Definition: git_ir.hpp:171
ir::Directory
Full directory path and it's parent ID.
Definition: git_ir.hpp:146
ir::Author::name
Str name
Definition: git_ir.hpp:170
ir::orm_file::orm_file
orm_file()
Definition: git_ir.hpp:316
ir::RenamedFile::old_path
ir::FilePathId old_path
Definition: git_ir.hpp:114
ir::Directory::id_type
DirectoryId id_type
Definition: git_ir.hpp:147
operator<<
auto operator<<(std::ostream &stream, T id) -> std::ostream &
Definition: git_ir.hpp:18
ir::LineData
Unique combination of author+time+content for some line in database.
Definition: git_ir.hpp:186
ir::create_db
auto create_db(CR< Str > storagePath)
Instantiate database connection.
Definition: git_ir.hpp:400
ir::orm_author::id
AuthorId id
Definition: git_ir.hpp:352
ir::orm_author::orm_author
orm_author(AuthorId _id, CR< Author > base)
Definition: git_ir.hpp:356
ir::Commit::timezone
int timezone
posix time
Definition: git_ir.hpp:124
ir::content_manager
Main store for repository analysis.
Definition: git_ir.hpp:238
ir::orm_file::id
FileId id
Definition: git_ir.hpp:315
ir::LineData::author
AuthorId author
Definition: git_ir.hpp:188
ir::orm_file_path::id
FilePathId id
Definition: git_ir.hpp:387
ir::orm_lines_table::line
LineId line
Definition: git_ir.hpp:375
ir::orm_dir::orm_dir
orm_dir()
Definition: git_ir.hpp:336
ir::Commit::author
AuthorId author
Definition: git_ir.hpp:122
ir::String::operator==
auto operator==(CR< String > other) const -> bool
Textual content of the line.
Definition: git_ir.hpp:161
ir::Author::operator==
auto operator==(CR< Author > other) const -> bool
Definition: git_ir.hpp:173
ir::content_manager::prefixes
std::unordered_map< Str, DirectoryId > prefixes
Definition: git_ir.hpp:250
commit_id
const git_oid * commit_id(const git_commit *commit)
Definition: gitwrap.hpp:3841
hash_combine
void hash_combine(std::size_t &seed)
Definition: git_ir.hpp:204
ir::EditedFile::removed
int removed
Definition: git_ir.hpp:110
ir::Commit
single commit by author, taken at some point in time
Definition: git_ir.hpp:120
ir::RenamedFile::new_path
ir::FilePathId new_path
Definition: git_ir.hpp:115
ir::content_manager::multi
dod::MultiStore< dod::InternStore< AuthorId, Author >, dod::InternStore< LineId, LineData >, dod::Store< FileId, File >, dod::InternStore< FilePathId, FilePath >, dod::Store< CommitId, Commit >, dod::InternStore< DirectoryId, Directory >, dod::InternStore< StringId, String > > multi
Definition: git_ir.hpp:248
ir::LineData::id_type
LineId id_type
Definition: git_ir.hpp:187
ir::orm_file_path
Definition: git_ir.hpp:386
ir::String::id_type
StringId id_type
Definition: git_ir.hpp:159
ir::Commit::period
int period
git hash of the commit
Definition: git_ir.hpp:126
ir::EditedFile::path
ir::FilePathId path
Definition: git_ir.hpp:108