mirror of
https://github.com/XRPLF/clio.git
synced 2025-11-04 11:55:51 +00:00
Compare commits
578 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b2eacf9868 | ||
|
|
77cec26cc9 | ||
|
|
6a848649b3 | ||
|
|
c761b50fa4 | ||
|
|
062ef9f0a5 | ||
|
|
c7fee023e7 | ||
|
|
e65351e9e6 | ||
|
|
8cea9ee7e2 | ||
|
|
9d299a1948 | ||
|
|
132ec743e1 | ||
|
|
bdb72f91a2 | ||
|
|
0cdc24023f | ||
|
|
c795cf371a | ||
|
|
e135aa49d5 | ||
|
|
5ba08b1d26 | ||
|
|
37cd79ceb0 | ||
|
|
1334bd05d9 | ||
|
|
437ea7bf98 | ||
|
|
f9f3bc928e | ||
|
|
aa1f3efda2 | ||
|
|
a6d21c1a02 | ||
|
|
49b80c7ad8 | ||
|
|
56ab943be5 | ||
|
|
9d3b4f0313 | ||
|
|
42c970a2a3 | ||
|
|
1125b09611 | ||
|
|
ce94f0f513 | ||
|
|
d39fb20022 | ||
|
|
967b85ca33 | ||
|
|
55b8134e6d | ||
|
|
66e8a65732 | ||
|
|
067dd72aed | ||
|
|
da5bf5c441 | ||
|
|
ff4bc5b0aa | ||
|
|
c56998477c | ||
|
|
df17b429c5 | ||
|
|
36c6caa7c0 | ||
|
|
642aaf8902 | ||
|
|
99400d74ba | ||
|
|
da10535bc0 | ||
|
|
f74b89cc8d | ||
|
|
d229ff1811 | ||
|
|
3a6390caf5 | ||
|
|
a8c90a31d9 | ||
|
|
531b647b1e | ||
|
|
cbc856b190 | ||
|
|
98ef83d470 | ||
|
|
d5ed0cff77 | ||
|
|
b18d73eef0 | ||
|
|
8f47128424 | ||
|
|
b8cb60b7db | ||
|
|
0dcbbf9afa | ||
|
|
c00342c792 | ||
|
|
82b8316978 | ||
|
|
890e5bb4c2 | ||
|
|
adadd70a05 | ||
|
|
e66cc7759e | ||
|
|
e931f27d3b | ||
|
|
1fe42c88c3 | ||
|
|
6b9c8a12d0 | ||
|
|
3fa1df9117 | ||
|
|
25876aef9b | ||
|
|
e744a5a8a9 | ||
|
|
230212213b | ||
|
|
7fcd3e48bd | ||
|
|
470585461d | ||
|
|
ec05b06370 | ||
|
|
1b7d35b16c | ||
|
|
6ff6956a53 | ||
|
|
dade122c6e | ||
|
|
8095e6893d | ||
|
|
48b0a7690c | ||
|
|
7372442f3a | ||
|
|
36a790d666 | ||
|
|
285dd008de | ||
|
|
332b66dc4f | ||
|
|
231556d850 | ||
|
|
d2439cc8a9 | ||
|
|
03d6b1a3b6 | ||
|
|
ebdcca51a6 | ||
|
|
7e5f94c3fd | ||
|
|
1be4d5186d | ||
|
|
8240508d19 | ||
|
|
03a01e55f9 | ||
|
|
828fea6e30 | ||
|
|
27a422369d | ||
|
|
b7d0fc0200 | ||
|
|
6e8de0b64e | ||
|
|
8e75818b4f | ||
|
|
27db183aff | ||
|
|
d9362311ca | ||
|
|
9d91fddce5 | ||
|
|
6d9446bf87 | ||
|
|
94706bfff9 | ||
|
|
a1243da956 | ||
|
|
8004a0e0ff | ||
|
|
6978431c6a | ||
|
|
8211440711 | ||
|
|
041608b243 | ||
|
|
e83dfcbcc3 | ||
|
|
010538d6fe | ||
|
|
c17cc37c1c | ||
|
|
9fa1740146 | ||
|
|
7312b4af80 | ||
|
|
c3125b4b1c | ||
|
|
43ced3bf9d | ||
|
|
ecb7cdae88 | ||
|
|
7b84fab076 | ||
|
|
74455f5b99 | ||
|
|
d47f3b71bd | ||
|
|
1842f26826 | ||
|
|
ee8a9f5ed0 | ||
|
|
8dbdb9d8e3 | ||
|
|
644a1fdb43 | ||
|
|
58a1833cf2 | ||
|
|
dc8d1658e3 | ||
|
|
73d427c1cb | ||
|
|
c7b637b3f3 | ||
|
|
51150d8474 | ||
|
|
a74970b81e | ||
|
|
b3e63b2491 | ||
|
|
a7f61c3e68 | ||
|
|
862fc48924 | ||
|
|
98ebc92bff | ||
|
|
e98e74d768 | ||
|
|
c94f55b7eb | ||
|
|
0f5da4414c | ||
|
|
33700e3305 | ||
|
|
a7a1a724e2 | ||
|
|
656ab286b6 | ||
|
|
190b5c6a37 | ||
|
|
27fe35a2d1 | ||
|
|
62f55a7dce | ||
|
|
26d663c0be | ||
|
|
9b0dab602f | ||
|
|
97a63db51d | ||
|
|
75c6ad5c8d | ||
|
|
52d6d2c54f | ||
|
|
b89cdb26f2 | ||
|
|
cce695c570 | ||
|
|
cea9c41a88 | ||
|
|
8575f786a8 | ||
|
|
08b02c64cb | ||
|
|
b358649cf9 | ||
|
|
6bd72355db | ||
|
|
a1699d7484 | ||
|
|
957aadd25a | ||
|
|
8f89a5913d | ||
|
|
ecfe5e84e5 | ||
|
|
03c0940649 | ||
|
|
dc5aacfe39 | ||
|
|
3fda74e3f7 | ||
|
|
df27c4e629 | ||
|
|
37ee74c293 | ||
|
|
ec335176bb | ||
|
|
ab33b26ec4 | ||
|
|
28c8fa2a9a | ||
|
|
12bbed194c | ||
|
|
1fa09006f8 | ||
|
|
e3b6fc4bd4 | ||
|
|
34594ff8c0 | ||
|
|
40eeb57920 | ||
|
|
3eb36c049c | ||
|
|
81602e8ae7 | ||
|
|
0cef9e0620 | ||
|
|
81d1b30607 | ||
|
|
923d021c83 | ||
|
|
cd2b09ffb7 | ||
|
|
3c62a1f42c | ||
|
|
f97e0690c8 | ||
|
|
eeaccbabd9 | ||
|
|
13d2d4e2ca | ||
|
|
350a45e7e2 | ||
|
|
ce86572274 | ||
|
|
ac97788db8 | ||
|
|
2893492569 | ||
|
|
b63e98bda0 | ||
|
|
f4df5c2185 | ||
|
|
93d5c12b14 | ||
|
|
2514b7986e | ||
|
|
d30e63d49a | ||
|
|
61f1e0853d | ||
|
|
eb1831c489 | ||
|
|
07bd4b0760 | ||
|
|
e26a1e37b5 | ||
|
|
e89640bcfb | ||
|
|
ae135759ef | ||
|
|
28188aa0f9 | ||
|
|
af485a0634 | ||
|
|
b609298870 | ||
|
|
d077093a8d | ||
|
|
781f3b3c48 | ||
|
|
a8bae96ad4 | ||
|
|
fe9649d872 | ||
|
|
431b5f5ab8 | ||
|
|
b1dc2775fb | ||
|
|
dd35a7cfd2 | ||
|
|
a9d685d5c0 | ||
|
|
6065d324b5 | ||
|
|
fe7b5fe18f | ||
|
|
1c663988f5 | ||
|
|
d11d566121 | ||
|
|
a467cb2526 | ||
|
|
f62e36dc94 | ||
|
|
d933ce2a29 | ||
|
|
db751e3807 | ||
|
|
3c4a8f0cfb | ||
|
|
397ce97175 | ||
|
|
ac6ad13f6c | ||
|
|
7d1d1749bc | ||
|
|
acf359d631 | ||
|
|
a34e107b86 | ||
|
|
b886586de3 | ||
|
|
a57abb15a3 | ||
|
|
c87586a265 | ||
|
|
8172670c93 | ||
|
|
3fdcd3315b | ||
|
|
dd018f1c5e | ||
|
|
c2b462da75 | ||
|
|
252920ec57 | ||
|
|
9ef6801c55 | ||
|
|
24c562fa2a | ||
|
|
35f119a268 | ||
|
|
1be368dcaf | ||
|
|
a5fbb01299 | ||
|
|
3b75d88a35 | ||
|
|
f0224581a5 | ||
|
|
b998473673 | ||
|
|
8ebe2d6a80 | ||
|
|
3bab90ca7a | ||
|
|
74660aebf1 | ||
|
|
db08de466a | ||
|
|
1bacad9e49 | ||
|
|
ca16858878 | ||
|
|
feae85782c | ||
|
|
b016c1d7ba | ||
|
|
0597a9d685 | ||
|
|
05bea6a971 | ||
|
|
fa660ef400 | ||
|
|
25d9e3cc36 | ||
|
|
58f13e1660 | ||
|
|
a16b680a7a | ||
|
|
320ebaa5d2 | ||
|
|
058df4d12a | ||
|
|
5145d07693 | ||
|
|
5e9e5f6f65 | ||
|
|
1ce7bcbc28 | ||
|
|
243858df12 | ||
|
|
b363cc93af | ||
|
|
200d97f0de | ||
|
|
1ec5d3e5a3 | ||
|
|
e062121917 | ||
|
|
1aab2b94b1 | ||
|
|
5de87b9ef8 | ||
|
|
398db13f4d | ||
|
|
5e8ffb66b4 | ||
|
|
939740494b | ||
|
|
ff3d2b5600 | ||
|
|
7080b4d549 | ||
|
|
8d783ecd6a | ||
|
|
5e6682ddc7 | ||
|
|
fca29694a0 | ||
|
|
a541e6d00e | ||
|
|
9bd38dd290 | ||
|
|
f683b25f76 | ||
|
|
91ad1ffc3b | ||
|
|
64b4a908da | ||
|
|
ac752c656e | ||
|
|
4fe868aaeb | ||
|
|
59eb40a1f2 | ||
|
|
0b5f667e4a | ||
|
|
fa42c5c900 | ||
|
|
0818b6ce5b | ||
|
|
e2cc56d25a | ||
|
|
caaa01bf0f | ||
|
|
4b53bef1f5 | ||
|
|
69f5025a29 | ||
|
|
d1c41a8bb7 | ||
|
|
207ba51461 | ||
|
|
ebe7688ccb | ||
|
|
6d9f8a7ead | ||
|
|
6ca777ea96 | ||
|
|
963685dd31 | ||
|
|
e36545058d | ||
|
|
44527140f0 | ||
|
|
0eaaa1fb31 | ||
|
|
1846f629a5 | ||
|
|
83af5af3c6 | ||
|
|
418a0ddbf2 | ||
|
|
6cfbfda014 | ||
|
|
91648f98ad | ||
|
|
71e1637c5f | ||
|
|
59cd2ce5aa | ||
|
|
d783edd57a | ||
|
|
1ce8a58167 | ||
|
|
92e5c4792b | ||
|
|
d7f36733bc | ||
|
|
435d56e7c5 | ||
|
|
bf3b24867c | ||
|
|
ec70127050 | ||
|
|
547cb340bd | ||
|
|
c20b14494a | ||
|
|
696b1a585c | ||
|
|
23442ff1a7 | ||
|
|
db4046e02a | ||
|
|
fc1b5ae4da | ||
|
|
5411fd7497 | ||
|
|
f6488f7024 | ||
|
|
e3ada6c5da | ||
|
|
d61d702ccd | ||
|
|
4d42cb3cdb | ||
|
|
111b55b397 | ||
|
|
c90bc15959 | ||
|
|
1804e3e9c0 | ||
|
|
24f69acd9e | ||
|
|
98d0a963dc | ||
|
|
665890d410 | ||
|
|
545886561f | ||
|
|
68eec01dbc | ||
|
|
02621fe02e | ||
|
|
6ad72446d1 | ||
|
|
1d0a43669b | ||
|
|
71aabc8c29 | ||
|
|
6b98579bfb | ||
|
|
375ac2ffa6 | ||
|
|
c6ca650767 | ||
|
|
2336148d0d | ||
|
|
12178abf4d | ||
|
|
b8705ae086 | ||
|
|
b83d7478ef | ||
|
|
4fd6d51d21 | ||
|
|
d195bdb66d | ||
|
|
50dbb51627 | ||
|
|
2f369e175c | ||
|
|
47e03a7da3 | ||
|
|
d7b84a2e7a | ||
|
|
e79425bc21 | ||
|
|
7710468f37 | ||
|
|
210d7fdbc8 | ||
|
|
ba8e7188ca | ||
|
|
271323b0f4 | ||
|
|
7b306f3ba0 | ||
|
|
73805d44ad | ||
|
|
f19772907d | ||
|
|
616f0176c9 | ||
|
|
9f4f5d319e | ||
|
|
dcbc4577c2 | ||
|
|
f4d8e18bf7 | ||
|
|
b3e001ebfb | ||
|
|
524821c0b0 | ||
|
|
a292a607c2 | ||
|
|
81894c0a90 | ||
|
|
0a7def18cd | ||
|
|
1e969ba13b | ||
|
|
ef62718a27 | ||
|
|
aadd9e50f0 | ||
|
|
d9e89746a4 | ||
|
|
557ea5d7f6 | ||
|
|
4cc3b3ec0f | ||
|
|
a960471ef4 | ||
|
|
871d43c85f | ||
|
|
5ce3fff788 | ||
|
|
a76194d299 | ||
|
|
14f9f98cf2 | ||
|
|
01e4eed130 | ||
|
|
893315c50d | ||
|
|
b83d206ced | ||
|
|
9d28e64383 | ||
|
|
b873af2d43 | ||
|
|
435db339df | ||
|
|
9836e4ceaf | ||
|
|
5d2c079f1a | ||
|
|
244337c5b6 | ||
|
|
b07fbb14dc | ||
|
|
7e8569b03a | ||
|
|
fc0c93b2ee | ||
|
|
8ba7388d58 | ||
|
|
0bbb539d0b | ||
|
|
c50174235f | ||
|
|
aace437245 | ||
|
|
2e3e8cd779 | ||
|
|
6f93e1003e | ||
|
|
14978ca91d | ||
|
|
9adcaeb21b | ||
|
|
d94fe4e7ab | ||
|
|
c8029255ba | ||
|
|
d548d44a61 | ||
|
|
4cae248b5c | ||
|
|
b3db4cadab | ||
|
|
02c0a1f11d | ||
|
|
6bc2ec745f | ||
|
|
d7d5d61747 | ||
|
|
f1b3a6b511 | ||
|
|
f52f36ecbc | ||
|
|
860d10cddc | ||
|
|
36ac3215e2 | ||
|
|
7776a5ffb6 | ||
|
|
4b2d53fc2f | ||
|
|
9a19519550 | ||
|
|
88e25687dc | ||
|
|
93e2ac529d | ||
|
|
0bc84fefbf | ||
|
|
36bb20806e | ||
|
|
dfe974d5ab | ||
|
|
bf65cfabae | ||
|
|
f42e024f38 | ||
|
|
d816ef54ab | ||
|
|
e60fd3e58e | ||
|
|
654168efec | ||
|
|
5d06a79f13 | ||
|
|
3320125d8f | ||
|
|
a1f93b09f7 | ||
|
|
232acaeff2 | ||
|
|
d86104577b | ||
|
|
e9937fab76 | ||
|
|
75c2011845 | ||
|
|
5604b37c02 | ||
|
|
f604856eab | ||
|
|
b69e4350a1 | ||
|
|
95da706fed | ||
|
|
1bb67217e5 | ||
|
|
21f1b70daf | ||
|
|
430812abf5 | ||
|
|
8d5e28ef30 | ||
|
|
4180d81819 | ||
|
|
21eeb9ae02 | ||
|
|
edd2e9dd4b | ||
|
|
b25ac5d707 | ||
|
|
9d10cff873 | ||
|
|
bc438ce58a | ||
|
|
b99a68e55f | ||
|
|
7a819f4955 | ||
|
|
6b78b1ad8b | ||
|
|
488e28e874 | ||
|
|
d26dd5a8cf | ||
|
|
67f0fa26ae | ||
|
|
a3211f4458 | ||
|
|
7d4e5ff0bd | ||
|
|
f6c2008540 | ||
|
|
d74ca4940b | ||
|
|
739807a7d7 | ||
|
|
9fa26be13a | ||
|
|
f0555af284 | ||
|
|
b7fa9b09fe | ||
|
|
08f7a7a476 | ||
|
|
703196b013 | ||
|
|
284986e7b7 | ||
|
|
09ac1b866e | ||
|
|
4112cc42df | ||
|
|
c07e04ce84 | ||
|
|
19455b4d6c | ||
|
|
1186622e58 | ||
|
|
023e02da15 | ||
|
|
8dbf049a71 | ||
|
|
fe5150dba4 | ||
|
|
992d5a7a70 | ||
|
|
b702b6e14e | ||
|
|
557c76233a | ||
|
|
6ba9903a37 | ||
|
|
81bf9894e4 | ||
|
|
047d64983c | ||
|
|
1708b929b8 | ||
|
|
a377514287 | ||
|
|
c51d696181 | ||
|
|
1a9d328f94 | ||
|
|
3b1dc60f63 | ||
|
|
0c2ca1737e | ||
|
|
2f65a26dc7 | ||
|
|
37c765a072 | ||
|
|
29f1f860d8 | ||
|
|
414a416938 | ||
|
|
1a4180f678 | ||
|
|
bca086d776 | ||
|
|
f81086f40c | ||
|
|
962fb12410 | ||
|
|
10af787324 | ||
|
|
5f32bbbd81 | ||
|
|
fa78d4e783 | ||
|
|
05b03b2086 | ||
|
|
866b1d32b3 | ||
|
|
8a1f00debb | ||
|
|
3ec5755930 | ||
|
|
a0d173feb8 | ||
|
|
b0f678411c | ||
|
|
1369eaeef6 | ||
|
|
bf217345ae | ||
|
|
7bb567761c | ||
|
|
4b94ed3e55 | ||
|
|
75c0d22f87 | ||
|
|
9803e86158 | ||
|
|
0f7e1d5517 | ||
|
|
cf7a6ecc89 | ||
|
|
5c9dce0f8a | ||
|
|
041aba9a0b | ||
|
|
b13c44eb12 | ||
|
|
a47bf2e8fe | ||
|
|
4b8dd7b981 | ||
|
|
d2c870db92 | ||
|
|
8e17039586 | ||
|
|
25067c97ed | ||
|
|
1310e5dde9 | ||
|
|
0a5bf911c1 | ||
|
|
6015faa0d3 | ||
|
|
e68fd3251a | ||
|
|
c13ac79552 | ||
|
|
b1299792a6 | ||
|
|
2cbf09d6ae | ||
|
|
42cf55fd0e | ||
|
|
e825be24cc | ||
|
|
997742b555 | ||
|
|
031ad411a6 | ||
|
|
486f1f2fd2 | ||
|
|
739dd81981 | ||
|
|
1f900fcf7f | ||
|
|
fc68664b02 | ||
|
|
ffa5c58b32 | ||
|
|
4bf3a228dc | ||
|
|
9091bb06f4 | ||
|
|
41e3176c56 | ||
|
|
bedca85c78 | ||
|
|
39157f8be4 | ||
|
|
3affda8b13 | ||
|
|
8cc2de5643 | ||
|
|
9b74b3f898 | ||
|
|
ea2837749a | ||
|
|
8bd8ab9b8a | ||
|
|
dc89d23e5a | ||
|
|
734c7a5c36 | ||
|
|
b17ef28f55 | ||
|
|
e56bd7b29e | ||
|
|
5bf334e5f7 | ||
|
|
97ef66d130 | ||
|
|
4c9c606202 | ||
|
|
a885551006 | ||
|
|
fae1ec0c8d | ||
|
|
de23f015d6 | ||
|
|
37f9493d15 | ||
|
|
49387059ef | ||
|
|
744af4b639 | ||
|
|
db2b9dac3b | ||
|
|
ccf73dc68c | ||
|
|
3de421c390 | ||
|
|
d4a9560c3f | ||
|
|
983aa29271 | ||
|
|
0ebe92de68 | ||
|
|
eb1ea28e27 | ||
|
|
1764f3524e | ||
|
|
777ae24f62 | ||
|
|
1ada879072 | ||
|
|
e2792f5a0c | ||
|
|
97c431680a | ||
|
|
0b454a2316 | ||
|
|
b7cae53fcd | ||
|
|
ac45cce5bd | ||
|
|
ef39c04e1e | ||
|
|
83a099a547 | ||
|
|
73337d0819 | ||
|
|
816625c44e | ||
|
|
48e87d7c07 | ||
|
|
dfe18ed682 | ||
|
|
92a072d7a8 | ||
|
|
24fca61b56 | ||
|
|
ae8303fdc8 | ||
|
|
709a8463b8 | ||
|
|
84d31986d1 | ||
|
|
d50f229631 | ||
|
|
379c89fb02 | ||
|
|
81f7171368 | ||
|
|
629b35d1dd | ||
|
|
6fc4cee195 | ||
|
|
b01813ac3d | ||
|
|
6bf8c5bc4e | ||
|
|
2ffd98f895 | ||
|
|
3edead32ba | ||
|
|
28980734ae | ||
|
|
ce60c8f64d | ||
|
|
39ef2ae33c | ||
|
|
d83975e750 |
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
Language: Cpp
|
Language: Cpp
|
||||||
AccessModifierOffset: -4
|
AccessModifierOffset: -4
|
||||||
AlignAfterOpenBracket: AlwaysBreak
|
AlignAfterOpenBracket: BlockIndent
|
||||||
AlignConsecutiveAssignments: false
|
AlignConsecutiveAssignments: false
|
||||||
AlignConsecutiveDeclarations: false
|
AlignConsecutiveDeclarations: false
|
||||||
AlignEscapedNewlinesLeft: true
|
AlignEscapedNewlinesLeft: true
|
||||||
@@ -18,23 +18,11 @@ AlwaysBreakBeforeMultilineStrings: true
|
|||||||
AlwaysBreakTemplateDeclarations: true
|
AlwaysBreakTemplateDeclarations: true
|
||||||
BinPackArguments: false
|
BinPackArguments: false
|
||||||
BinPackParameters: false
|
BinPackParameters: false
|
||||||
BraceWrapping:
|
|
||||||
AfterClass: true
|
|
||||||
AfterControlStatement: true
|
|
||||||
AfterEnum: false
|
|
||||||
AfterFunction: true
|
|
||||||
AfterNamespace: false
|
|
||||||
AfterObjCDeclaration: true
|
|
||||||
AfterStruct: true
|
|
||||||
AfterUnion: true
|
|
||||||
BeforeCatch: true
|
|
||||||
BeforeElse: true
|
|
||||||
IndentBraces: false
|
|
||||||
BreakBeforeBinaryOperators: false
|
BreakBeforeBinaryOperators: false
|
||||||
BreakBeforeBraces: Custom
|
BreakBeforeBraces: WebKit
|
||||||
BreakBeforeTernaryOperators: true
|
BreakBeforeTernaryOperators: true
|
||||||
BreakConstructorInitializersBeforeComma: true
|
BreakConstructorInitializersBeforeComma: true
|
||||||
ColumnLimit: 80
|
ColumnLimit: 120
|
||||||
CommentPragmas: '^ IWYU pragma:'
|
CommentPragmas: '^ IWYU pragma:'
|
||||||
ConstructorInitializerAllOnOneLineOrOnePerLine: true
|
ConstructorInitializerAllOnOneLineOrOnePerLine: true
|
||||||
ConstructorInitializerIndentWidth: 4
|
ConstructorInitializerIndentWidth: 4
|
||||||
@@ -43,13 +31,15 @@ Cpp11BracedListStyle: true
|
|||||||
DerivePointerAlignment: false
|
DerivePointerAlignment: false
|
||||||
DisableFormat: false
|
DisableFormat: false
|
||||||
ExperimentalAutoDetectBinPacking: false
|
ExperimentalAutoDetectBinPacking: false
|
||||||
|
FixNamespaceComments: true
|
||||||
ForEachMacros: [ Q_FOREACH, BOOST_FOREACH ]
|
ForEachMacros: [ Q_FOREACH, BOOST_FOREACH ]
|
||||||
|
IncludeBlocks: Regroup
|
||||||
IncludeCategories:
|
IncludeCategories:
|
||||||
- Regex: '^<(BeastConfig)'
|
- Regex: '^".*"$'
|
||||||
Priority: 0
|
Priority: 1
|
||||||
- Regex: '^<(ripple)/'
|
- Regex: '^<.*\.(h|hpp)>$'
|
||||||
Priority: 2
|
Priority: 2
|
||||||
- Regex: '^<(boost)/'
|
- Regex: '^<.*>$'
|
||||||
Priority: 3
|
Priority: 3
|
||||||
- Regex: '.*'
|
- Regex: '.*'
|
||||||
Priority: 4
|
Priority: 4
|
||||||
@@ -58,6 +48,8 @@ IndentCaseLabels: true
|
|||||||
IndentFunctionDeclarationAfterType: false
|
IndentFunctionDeclarationAfterType: false
|
||||||
IndentWidth: 4
|
IndentWidth: 4
|
||||||
IndentWrappedFunctionNames: false
|
IndentWrappedFunctionNames: false
|
||||||
|
IndentRequiresClause: true
|
||||||
|
RequiresClausePosition: OwnLine
|
||||||
KeepEmptyLinesAtTheStartOfBlocks: false
|
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||||
MaxEmptyLinesToKeep: 1
|
MaxEmptyLinesToKeep: 1
|
||||||
NamespaceIndentation: None
|
NamespaceIndentation: None
|
||||||
@@ -70,6 +62,7 @@ PenaltyBreakString: 1000
|
|||||||
PenaltyExcessCharacter: 1000000
|
PenaltyExcessCharacter: 1000000
|
||||||
PenaltyReturnTypeOnItsOwnLine: 200
|
PenaltyReturnTypeOnItsOwnLine: 200
|
||||||
PointerAlignment: Left
|
PointerAlignment: Left
|
||||||
|
QualifierAlignment: Right
|
||||||
ReflowComments: true
|
ReflowComments: true
|
||||||
SortIncludes: true
|
SortIncludes: true
|
||||||
SpaceAfterCStyleCast: false
|
SpaceAfterCStyleCast: false
|
||||||
|
|||||||
148
.clang-tidy
Normal file
148
.clang-tidy
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
---
|
||||||
|
Checks: '-*,
|
||||||
|
bugprone-argument-comment,
|
||||||
|
bugprone-assert-side-effect,
|
||||||
|
bugprone-bad-signal-to-kill-thread,
|
||||||
|
bugprone-bool-pointer-implicit-conversion,
|
||||||
|
bugprone-casting-through-void,
|
||||||
|
bugprone-chained-comparison,
|
||||||
|
bugprone-compare-pointer-to-member-virtual-function,
|
||||||
|
bugprone-copy-constructor-init,
|
||||||
|
bugprone-dangling-handle,
|
||||||
|
bugprone-dynamic-static-initializers,
|
||||||
|
bugprone-empty-catch,
|
||||||
|
bugprone-fold-init-type,
|
||||||
|
bugprone-forward-declaration-namespace,
|
||||||
|
bugprone-inaccurate-erase,
|
||||||
|
bugprone-inc-dec-in-conditions,
|
||||||
|
bugprone-incorrect-enable-if,
|
||||||
|
bugprone-incorrect-roundings,
|
||||||
|
bugprone-infinite-loop,
|
||||||
|
bugprone-integer-division,
|
||||||
|
bugprone-lambda-function-name,
|
||||||
|
bugprone-macro-parentheses,
|
||||||
|
bugprone-macro-repeated-side-effects,
|
||||||
|
bugprone-misplaced-operator-in-strlen-in-alloc,
|
||||||
|
bugprone-misplaced-pointer-arithmetic-in-alloc,
|
||||||
|
bugprone-misplaced-widening-cast,
|
||||||
|
bugprone-move-forwarding-reference,
|
||||||
|
bugprone-multi-level-implicit-pointer-conversion,
|
||||||
|
bugprone-multiple-new-in-one-expression,
|
||||||
|
bugprone-multiple-statement-macro,
|
||||||
|
bugprone-no-escape,
|
||||||
|
bugprone-non-zero-enum-to-bool-conversion,
|
||||||
|
bugprone-optional-value-conversion,
|
||||||
|
bugprone-parent-virtual-call,
|
||||||
|
bugprone-posix-return,
|
||||||
|
bugprone-redundant-branch-condition,
|
||||||
|
bugprone-reserved-identifier,
|
||||||
|
bugprone-shared-ptr-array-mismatch,
|
||||||
|
bugprone-signal-handler,
|
||||||
|
bugprone-signed-char-misuse,
|
||||||
|
bugprone-sizeof-container,
|
||||||
|
bugprone-sizeof-expression,
|
||||||
|
bugprone-spuriously-wake-up-functions,
|
||||||
|
bugprone-standalone-empty,
|
||||||
|
bugprone-string-constructor,
|
||||||
|
bugprone-string-integer-assignment,
|
||||||
|
bugprone-string-literal-with-embedded-nul,
|
||||||
|
bugprone-stringview-nullptr,
|
||||||
|
bugprone-suspicious-enum-usage,
|
||||||
|
bugprone-suspicious-include,
|
||||||
|
bugprone-suspicious-memory-comparison,
|
||||||
|
bugprone-suspicious-memset-usage,
|
||||||
|
bugprone-suspicious-missing-comma,
|
||||||
|
bugprone-suspicious-realloc-usage,
|
||||||
|
bugprone-suspicious-semicolon,
|
||||||
|
bugprone-suspicious-string-compare,
|
||||||
|
bugprone-swapped-arguments,
|
||||||
|
bugprone-switch-missing-default-case,
|
||||||
|
bugprone-terminating-continue,
|
||||||
|
bugprone-throw-keyword-missing,
|
||||||
|
bugprone-too-small-loop-variable,
|
||||||
|
bugprone-undefined-memory-manipulation,
|
||||||
|
bugprone-undelegated-constructor,
|
||||||
|
bugprone-unhandled-exception-at-new,
|
||||||
|
bugprone-unhandled-self-assignment,
|
||||||
|
bugprone-unique-ptr-array-mismatch,
|
||||||
|
bugprone-unsafe-functions,
|
||||||
|
bugprone-unused-local-non-trivial-variable,
|
||||||
|
bugprone-unused-raii,
|
||||||
|
bugprone-unused-return-value,
|
||||||
|
bugprone-use-after-move,
|
||||||
|
bugprone-virtual-near-miss,
|
||||||
|
cppcoreguidelines-init-variables,
|
||||||
|
cppcoreguidelines-misleading-capture-default-by-value,
|
||||||
|
cppcoreguidelines-no-suspend-with-lock,
|
||||||
|
cppcoreguidelines-pro-type-member-init,
|
||||||
|
cppcoreguidelines-pro-type-static-cast-downcast,
|
||||||
|
cppcoreguidelines-rvalue-reference-param-not-moved,
|
||||||
|
cppcoreguidelines-use-default-member-init,
|
||||||
|
cppcoreguidelines-virtual-class-destructor,
|
||||||
|
hicpp-ignored-remove-result,
|
||||||
|
llvm-namespace-comment,
|
||||||
|
misc-const-correctness,
|
||||||
|
misc-definitions-in-headers,
|
||||||
|
misc-header-include-cycle,
|
||||||
|
misc-include-cleaner,
|
||||||
|
misc-misplaced-const,
|
||||||
|
misc-redundant-expression,
|
||||||
|
misc-static-assert,
|
||||||
|
misc-throw-by-value-catch-by-reference,
|
||||||
|
misc-unused-alias-decls,
|
||||||
|
misc-unused-using-decls,
|
||||||
|
modernize-concat-nested-namespaces,
|
||||||
|
modernize-deprecated-headers,
|
||||||
|
modernize-make-shared,
|
||||||
|
modernize-make-unique,
|
||||||
|
modernize-pass-by-value,
|
||||||
|
modernize-type-traits,
|
||||||
|
modernize-use-emplace,
|
||||||
|
modernize-use-equals-default,
|
||||||
|
modernize-use-equals-delete,
|
||||||
|
modernize-use-override,
|
||||||
|
modernize-use-starts-ends-with,
|
||||||
|
modernize-use-std-numbers,
|
||||||
|
modernize-use-using,
|
||||||
|
performance-faster-string-find,
|
||||||
|
performance-for-range-copy,
|
||||||
|
performance-implicit-conversion-in-loop,
|
||||||
|
performance-inefficient-vector-operation,
|
||||||
|
performance-move-const-arg,
|
||||||
|
performance-move-constructor-init,
|
||||||
|
performance-no-automatic-move,
|
||||||
|
performance-trivially-destructible,
|
||||||
|
readability-avoid-nested-conditional-operator,
|
||||||
|
readability-avoid-return-with-void-value,
|
||||||
|
readability-braces-around-statements,
|
||||||
|
readability-const-return-type,
|
||||||
|
readability-container-contains,
|
||||||
|
readability-container-size-empty,
|
||||||
|
readability-convert-member-functions-to-static,
|
||||||
|
readability-duplicate-include,
|
||||||
|
readability-else-after-return,
|
||||||
|
readability-implicit-bool-conversion,
|
||||||
|
readability-inconsistent-declaration-parameter-name,
|
||||||
|
readability-make-member-function-const,
|
||||||
|
readability-misleading-indentation,
|
||||||
|
readability-non-const-parameter,
|
||||||
|
readability-redundant-casting,
|
||||||
|
readability-redundant-declaration,
|
||||||
|
readability-redundant-inline-specifier,
|
||||||
|
readability-redundant-member-init,
|
||||||
|
readability-redundant-string-init,
|
||||||
|
readability-reference-to-constructed-temporary,
|
||||||
|
readability-simplify-boolean-expr,
|
||||||
|
readability-static-accessed-through-instance,
|
||||||
|
readability-static-definition-in-anonymous-namespace,
|
||||||
|
readability-suspicious-call-argument
|
||||||
|
'
|
||||||
|
|
||||||
|
CheckOptions:
|
||||||
|
readability-braces-around-statements.ShortStatementLines: 2
|
||||||
|
bugprone-unsafe-functions.ReportMoreUnsafeFunctions: true
|
||||||
|
bugprone-unused-return-value.CheckedReturnTypes: ::std::error_code;::std::error_condition;::std::errc
|
||||||
|
misc-include-cleaner.IgnoreHeaders: '.*/(detail|impl)/.*;.*(expected|unexpected).*'
|
||||||
|
|
||||||
|
HeaderFilterRegex: '^.*/(src|tests)/.*\.(h|hpp)$'
|
||||||
|
WarningsAsErrors: '*'
|
||||||
10
.clangd
Normal file
10
.clangd
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
CompileFlags:
|
||||||
|
Add: [-D__cpp_concepts=202002]
|
||||||
|
|
||||||
|
Diagnostics:
|
||||||
|
UnusedIncludes: Strict
|
||||||
|
MissingIncludes: Strict
|
||||||
|
Includes:
|
||||||
|
IgnoreHeader:
|
||||||
|
- ".*/(detail|impl)/.*"
|
||||||
|
- ".*expected.*"
|
||||||
245
.cmake-format.yaml
Normal file
245
.cmake-format.yaml
Normal file
@@ -0,0 +1,245 @@
|
|||||||
|
_help_parse: Options affecting listfile parsing
|
||||||
|
parse:
|
||||||
|
_help_additional_commands:
|
||||||
|
- Specify structure for custom cmake functions
|
||||||
|
additional_commands:
|
||||||
|
foo:
|
||||||
|
flags:
|
||||||
|
- BAR
|
||||||
|
- BAZ
|
||||||
|
kwargs:
|
||||||
|
HEADERS: '*'
|
||||||
|
SOURCES: '*'
|
||||||
|
DEPENDS: '*'
|
||||||
|
_help_override_spec:
|
||||||
|
- Override configurations per-command where available
|
||||||
|
override_spec: {}
|
||||||
|
_help_vartags:
|
||||||
|
- Specify variable tags.
|
||||||
|
vartags: []
|
||||||
|
_help_proptags:
|
||||||
|
- Specify property tags.
|
||||||
|
proptags: []
|
||||||
|
_help_format: Options affecting formatting.
|
||||||
|
format:
|
||||||
|
_help_disable:
|
||||||
|
- Disable formatting entirely, making cmake-format a no-op
|
||||||
|
disable: false
|
||||||
|
_help_line_width:
|
||||||
|
- How wide to allow formatted cmake files
|
||||||
|
line_width: 120
|
||||||
|
_help_tab_size:
|
||||||
|
- How many spaces to tab for indent
|
||||||
|
tab_size: 2
|
||||||
|
_help_use_tabchars:
|
||||||
|
- If true, lines are indented using tab characters (utf-8
|
||||||
|
- 0x09) instead of <tab_size> space characters (utf-8 0x20).
|
||||||
|
- In cases where the layout would require a fractional tab
|
||||||
|
- character, the behavior of the fractional indentation is
|
||||||
|
- governed by <fractional_tab_policy>
|
||||||
|
use_tabchars: false
|
||||||
|
_help_fractional_tab_policy:
|
||||||
|
- If <use_tabchars> is True, then the value of this variable
|
||||||
|
- indicates how fractional indentions are handled during
|
||||||
|
- whitespace replacement. If set to 'use-space', fractional
|
||||||
|
- indentation is left as spaces (utf-8 0x20). If set to
|
||||||
|
- '`round-up` fractional indentation is replaced with a single'
|
||||||
|
- tab character (utf-8 0x09) effectively shifting the column
|
||||||
|
- to the next tabstop
|
||||||
|
fractional_tab_policy: use-space
|
||||||
|
_help_max_subgroups_hwrap:
|
||||||
|
- If an argument group contains more than this many sub-groups
|
||||||
|
- (parg or kwarg groups) then force it to a vertical layout.
|
||||||
|
max_subgroups_hwrap: 4
|
||||||
|
_help_max_pargs_hwrap:
|
||||||
|
- If a positional argument group contains more than this many
|
||||||
|
- arguments, then force it to a vertical layout.
|
||||||
|
max_pargs_hwrap: 6
|
||||||
|
_help_max_rows_cmdline:
|
||||||
|
- If a cmdline positional group consumes more than this many
|
||||||
|
- lines without nesting, then invalidate the layout (and nest)
|
||||||
|
max_rows_cmdline: 2
|
||||||
|
_help_separate_ctrl_name_with_space:
|
||||||
|
- If true, separate flow control names from their parentheses
|
||||||
|
- with a space
|
||||||
|
separate_ctrl_name_with_space: true
|
||||||
|
_help_separate_fn_name_with_space:
|
||||||
|
- If true, separate function names from parentheses with a
|
||||||
|
- space
|
||||||
|
separate_fn_name_with_space: false
|
||||||
|
_help_dangle_parens:
|
||||||
|
- If a statement is wrapped to more than one line, than dangle
|
||||||
|
- the closing parenthesis on its own line.
|
||||||
|
dangle_parens: true
|
||||||
|
_help_dangle_align:
|
||||||
|
- If the trailing parenthesis must be 'dangled' on its on
|
||||||
|
- 'line, then align it to this reference: `prefix`: the start'
|
||||||
|
- 'of the statement, `prefix-indent`: the start of the'
|
||||||
|
- 'statement, plus one indentation level, `child`: align to'
|
||||||
|
- the column of the arguments
|
||||||
|
dangle_align: prefix
|
||||||
|
_help_min_prefix_chars:
|
||||||
|
- If the statement spelling length (including space and
|
||||||
|
- parenthesis) is smaller than this amount, then force reject
|
||||||
|
- nested layouts.
|
||||||
|
min_prefix_chars: 4
|
||||||
|
_help_max_prefix_chars:
|
||||||
|
- If the statement spelling length (including space and
|
||||||
|
- parenthesis) is larger than the tab width by more than this
|
||||||
|
- amount, then force reject un-nested layouts.
|
||||||
|
max_prefix_chars: 10
|
||||||
|
_help_max_lines_hwrap:
|
||||||
|
- If a candidate layout is wrapped horizontally but it exceeds
|
||||||
|
- this many lines, then reject the layout.
|
||||||
|
max_lines_hwrap: 2
|
||||||
|
_help_line_ending:
|
||||||
|
- What style line endings to use in the output.
|
||||||
|
line_ending: unix
|
||||||
|
_help_command_case:
|
||||||
|
- Format command names consistently as 'lower' or 'upper' case
|
||||||
|
command_case: canonical
|
||||||
|
_help_keyword_case:
|
||||||
|
- Format keywords consistently as 'lower' or 'upper' case
|
||||||
|
keyword_case: unchanged
|
||||||
|
_help_always_wrap:
|
||||||
|
- A list of command names which should always be wrapped
|
||||||
|
always_wrap: []
|
||||||
|
_help_enable_sort:
|
||||||
|
- If true, the argument lists which are known to be sortable
|
||||||
|
- will be sorted lexicographicall
|
||||||
|
enable_sort: true
|
||||||
|
_help_autosort:
|
||||||
|
- If true, the parsers may infer whether or not an argument
|
||||||
|
- list is sortable (without annotation).
|
||||||
|
autosort: true
|
||||||
|
_help_require_valid_layout:
|
||||||
|
- By default, if cmake-format cannot successfully fit
|
||||||
|
- everything into the desired linewidth it will apply the
|
||||||
|
- last, most agressive attempt that it made. If this flag is
|
||||||
|
- True, however, cmake-format will print error, exit with non-
|
||||||
|
- zero status code, and write-out nothing
|
||||||
|
require_valid_layout: false
|
||||||
|
_help_layout_passes:
|
||||||
|
- A dictionary mapping layout nodes to a list of wrap
|
||||||
|
- decisions. See the documentation for more information.
|
||||||
|
layout_passes: {}
|
||||||
|
_help_markup: Options affecting comment reflow and formatting.
|
||||||
|
markup:
|
||||||
|
_help_bullet_char:
|
||||||
|
- What character to use for bulleted lists
|
||||||
|
bullet_char: '*'
|
||||||
|
_help_enum_char:
|
||||||
|
- What character to use as punctuation after numerals in an
|
||||||
|
- enumerated list
|
||||||
|
enum_char: .
|
||||||
|
_help_first_comment_is_literal:
|
||||||
|
- If comment markup is enabled, don't reflow the first comment
|
||||||
|
- block in each listfile. Use this to preserve formatting of
|
||||||
|
- your copyright/license statements.
|
||||||
|
first_comment_is_literal: false
|
||||||
|
_help_literal_comment_pattern:
|
||||||
|
- If comment markup is enabled, don't reflow any comment block
|
||||||
|
- which matches this (regex) pattern. Default is `None`
|
||||||
|
- (disabled).
|
||||||
|
literal_comment_pattern: null
|
||||||
|
_help_fence_pattern:
|
||||||
|
- Regular expression to match preformat fences in comments
|
||||||
|
- default= ``r'^\s*([`~]{3}[`~]*)(.*)$'``
|
||||||
|
fence_pattern: ^\s*([`~]{3}[`~]*)(.*)$
|
||||||
|
_help_ruler_pattern:
|
||||||
|
- Regular expression to match rulers in comments default=
|
||||||
|
- '``r''^\s*[^\w\s]{3}.*[^\w\s]{3}$''``'
|
||||||
|
ruler_pattern: ^\s*[^\w\s]{3}.*[^\w\s]{3}$
|
||||||
|
_help_explicit_trailing_pattern:
|
||||||
|
- If a comment line matches starts with this pattern then it
|
||||||
|
- is explicitly a trailing comment for the preceeding
|
||||||
|
- argument. Default is '#<'
|
||||||
|
explicit_trailing_pattern: '#<'
|
||||||
|
_help_hashruler_min_length:
|
||||||
|
- If a comment line starts with at least this many consecutive
|
||||||
|
- hash characters, then don't lstrip() them off. This allows
|
||||||
|
- for lazy hash rulers where the first hash char is not
|
||||||
|
- separated by space
|
||||||
|
hashruler_min_length: 10
|
||||||
|
_help_canonicalize_hashrulers:
|
||||||
|
- If true, then insert a space between the first hash char and
|
||||||
|
- remaining hash chars in a hash ruler, and normalize its
|
||||||
|
- length to fill the column
|
||||||
|
canonicalize_hashrulers: true
|
||||||
|
_help_enable_markup:
|
||||||
|
- enable comment markup parsing and reflow
|
||||||
|
enable_markup: true
|
||||||
|
_help_lint: Options affecting the linter
|
||||||
|
lint:
|
||||||
|
_help_disabled_codes:
|
||||||
|
- a list of lint codes to disable
|
||||||
|
disabled_codes: []
|
||||||
|
_help_function_pattern:
|
||||||
|
- regular expression pattern describing valid function names
|
||||||
|
function_pattern: '[0-9a-z_]+'
|
||||||
|
_help_macro_pattern:
|
||||||
|
- regular expression pattern describing valid macro names
|
||||||
|
macro_pattern: '[0-9A-Z_]+'
|
||||||
|
_help_global_var_pattern:
|
||||||
|
- regular expression pattern describing valid names for
|
||||||
|
- variables with global (cache) scope
|
||||||
|
global_var_pattern: '[A-Z][0-9A-Z_]+'
|
||||||
|
_help_internal_var_pattern:
|
||||||
|
- regular expression pattern describing valid names for
|
||||||
|
- variables with global scope (but internal semantic)
|
||||||
|
internal_var_pattern: _[A-Z][0-9A-Z_]+
|
||||||
|
_help_local_var_pattern:
|
||||||
|
- regular expression pattern describing valid names for
|
||||||
|
- variables with local scope
|
||||||
|
local_var_pattern: '[a-z][a-z0-9_]+'
|
||||||
|
_help_private_var_pattern:
|
||||||
|
- regular expression pattern describing valid names for
|
||||||
|
- privatedirectory variables
|
||||||
|
private_var_pattern: _[0-9a-z_]+
|
||||||
|
_help_public_var_pattern:
|
||||||
|
- regular expression pattern describing valid names for public
|
||||||
|
- directory variables
|
||||||
|
public_var_pattern: '[A-Z][0-9A-Z_]+'
|
||||||
|
_help_argument_var_pattern:
|
||||||
|
- regular expression pattern describing valid names for
|
||||||
|
- function/macro arguments and loop variables.
|
||||||
|
argument_var_pattern: '[a-z][a-z0-9_]+'
|
||||||
|
_help_keyword_pattern:
|
||||||
|
- regular expression pattern describing valid names for
|
||||||
|
- keywords used in functions or macros
|
||||||
|
keyword_pattern: '[A-Z][0-9A-Z_]+'
|
||||||
|
_help_max_conditionals_custom_parser:
|
||||||
|
- In the heuristic for C0201, how many conditionals to match
|
||||||
|
- within a loop in before considering the loop a parser.
|
||||||
|
max_conditionals_custom_parser: 2
|
||||||
|
_help_min_statement_spacing:
|
||||||
|
- Require at least this many newlines between statements
|
||||||
|
min_statement_spacing: 1
|
||||||
|
_help_max_statement_spacing:
|
||||||
|
- Require no more than this many newlines between statements
|
||||||
|
max_statement_spacing: 2
|
||||||
|
max_returns: 6
|
||||||
|
max_branches: 12
|
||||||
|
max_arguments: 5
|
||||||
|
max_localvars: 15
|
||||||
|
max_statements: 50
|
||||||
|
_help_encode: Options affecting file encoding
|
||||||
|
encode:
|
||||||
|
_help_emit_byteorder_mark:
|
||||||
|
- If true, emit the unicode byte-order mark (BOM) at the start
|
||||||
|
- of the file
|
||||||
|
emit_byteorder_mark: false
|
||||||
|
_help_input_encoding:
|
||||||
|
- Specify the encoding of the input file. Defaults to utf-8
|
||||||
|
input_encoding: utf-8
|
||||||
|
_help_output_encoding:
|
||||||
|
- Specify the encoding of the output file. Defaults to utf-8.
|
||||||
|
- Note that cmake only claims to support utf-8 so be careful
|
||||||
|
- when using anything else
|
||||||
|
output_encoding: utf-8
|
||||||
|
_help_misc: Miscellaneous configurations options.
|
||||||
|
misc:
|
||||||
|
_help_per_command:
|
||||||
|
- A dictionary containing any per-command configuration
|
||||||
|
- overrides. Currently only `command_case` is supported.
|
||||||
|
per_command: {}
|
||||||
11
.codecov.yml
Normal file
11
.codecov.yml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
coverage:
|
||||||
|
status:
|
||||||
|
project:
|
||||||
|
default:
|
||||||
|
target: 50%
|
||||||
|
threshold: 2%
|
||||||
|
|
||||||
|
patch:
|
||||||
|
default:
|
||||||
|
target: 20% # Need to bump this number https://docs.codecov.com/docs/commit-status#patch-status
|
||||||
|
threshold: 2%
|
||||||
1
.dockerignore
Normal file
1
.dockerignore
Normal file
@@ -0,0 +1 @@
|
|||||||
|
build/
|
||||||
@@ -7,3 +7,4 @@
|
|||||||
# clang-format
|
# clang-format
|
||||||
e41150248a97e4bdc1cf21b54650c4bb7c63928e
|
e41150248a97e4bdc1cf21b54650c4bb7c63928e
|
||||||
2e542e7b0d94451a933c88778461cc8d3d7e6417
|
2e542e7b0d94451a933c88778461cc8d3d7e6417
|
||||||
|
d816ef54abd8e8e979b9c795bdb657a8d18f5e95
|
||||||
|
|||||||
2
.gitattributes
vendored
Normal file
2
.gitattributes
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
*.png filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.svg filter=lfs diff=lfs merge=lfs -text
|
||||||
62
.githooks/check-docs
Executable file
62
.githooks/check-docs
Executable file
@@ -0,0 +1,62 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Note: This script is intended to be run from the root of the repository.
|
||||||
|
#
|
||||||
|
# Not really a hook but should be used to check the completness of documentation for added code, otherwise CI will come for you.
|
||||||
|
# It's good to have /tmp as the output so that consecutive runs are fast but no clutter in the repository.
|
||||||
|
|
||||||
|
echo "+ Checking documentation..."
|
||||||
|
|
||||||
|
ROOT=$(pwd)
|
||||||
|
DOXYGEN=$(command -v doxygen)
|
||||||
|
TMPDIR=${ROOT}/.cache/doxygen
|
||||||
|
TMPFILE=${TMPDIR}/docs.log
|
||||||
|
DOCDIR=${TMPDIR}/out
|
||||||
|
|
||||||
|
if [ -z "$DOXYGEN" ]; then
|
||||||
|
# No hard error if doxygen is not installed yet
|
||||||
|
cat <<EOF
|
||||||
|
|
||||||
|
WARNING
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
'doxygen' is required to check documentation.
|
||||||
|
Please install it for next time. For the time being it's on CI.
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
EOF
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p ${DOCDIR} > /dev/null 2>&1
|
||||||
|
pushd ${DOCDIR} > /dev/null 2>&1
|
||||||
|
|
||||||
|
cat ${ROOT}/docs/Doxyfile | \
|
||||||
|
sed \
|
||||||
|
-e "s/\${LINT}/YES/" \
|
||||||
|
-e "s!\${SOURCE}!${ROOT}!" \
|
||||||
|
-e "s/\${USE_DOT}/NO/" \
|
||||||
|
-e "s/\${EXCLUDES}/impl/" \
|
||||||
|
| ${DOXYGEN} - 2> ${TMPFILE} 1> /dev/null
|
||||||
|
|
||||||
|
# We don't want to check for default values and typedefs as well as for member variables
|
||||||
|
OUT=$(cat ${TMPFILE} \
|
||||||
|
| grep -v "=default" \
|
||||||
|
| grep -v "\(variable\)" \
|
||||||
|
| grep -v "\(typedef\)")
|
||||||
|
|
||||||
|
rm -rf ${TMPFILE} > /dev/null 2>&1
|
||||||
|
popd > /dev/null 2>&1
|
||||||
|
|
||||||
|
if [[ ! -z "$OUT" ]]; then
|
||||||
|
cat <<EOF
|
||||||
|
|
||||||
|
ERROR
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
Found issues with documentation:
|
||||||
|
|
||||||
|
$OUT
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
EOF
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
119
.githooks/check-format
Executable file
119
.githooks/check-format
Executable file
@@ -0,0 +1,119 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Note: This script is intended to be run from the root of the repository.
|
||||||
|
#
|
||||||
|
# This script checks the format of the code and cmake files.
|
||||||
|
# In many cases it will automatically fix the issues and abort the commit.
|
||||||
|
|
||||||
|
no_formatted_directories_staged() {
|
||||||
|
staged_directories=$(git diff-index --cached --name-only HEAD | awk -F/ '{print $1}')
|
||||||
|
for sd in $staged_directories; do
|
||||||
|
if [[ "$sd" =~ ^(benchmark|cmake|src|tests)$ ]]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if no_formatted_directories_staged ; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "+ Checking code format..."
|
||||||
|
|
||||||
|
# paths to check and re-format
|
||||||
|
sources="src tests"
|
||||||
|
formatter="clang-format -i"
|
||||||
|
version=$($formatter --version | grep -o '[0-9\.]*')
|
||||||
|
|
||||||
|
if [[ "18.0.0" > "$version" ]]; then
|
||||||
|
cat <<EOF
|
||||||
|
|
||||||
|
ERROR
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
A minimum of version 18 of `which clang-format` is required.
|
||||||
|
Your version is $version.
|
||||||
|
Please fix paths and run again.
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
EOF
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
|
|
||||||
|
# check there is no .h headers, only .hpp
|
||||||
|
wrong_headers=$(find $sources -name "*.h" | sed 's/^/ - /')
|
||||||
|
if [[ ! -z "$wrong_headers" ]]; then
|
||||||
|
cat <<EOF
|
||||||
|
|
||||||
|
ERROR
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
Found .h headers in the source code. Please rename them to .hpp:
|
||||||
|
|
||||||
|
$wrong_headers
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
EOF
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v cmake-format &> /dev/null; then
|
||||||
|
cat <<EOF
|
||||||
|
|
||||||
|
ERROR
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
'cmake-format' is required to run this script.
|
||||||
|
Please install it and run again.
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
EOF
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
|
|
||||||
|
function grep_code {
|
||||||
|
grep -l "${1}" ${sources} -r --include \*.hpp --include \*.cpp
|
||||||
|
}
|
||||||
|
|
||||||
|
GNU_SED=$(sed --version 2>&1 | grep -q 'GNU' && echo true || echo false)
|
||||||
|
|
||||||
|
if [[ "$GNU_SED" == "false" ]]; then # macOS sed
|
||||||
|
# make all includes to be <...> style
|
||||||
|
grep_code '#include ".*"' | xargs sed -i '' -E 's|#include "(.*)"|#include <\1>|g'
|
||||||
|
|
||||||
|
# make local includes to be "..." style
|
||||||
|
main_src_dirs=$(find ./src -maxdepth 1 -type d -exec basename {} \; | tr '\n' '|' | sed 's/|$//' | sed 's/|/\\|/g')
|
||||||
|
grep_code "#include <\($main_src_dirs\)/.*>" | xargs sed -i '' -E "s|#include <(($main_src_dirs)/.*)>|#include \"\1\"|g"
|
||||||
|
else
|
||||||
|
# make all includes to be <...> style
|
||||||
|
grep_code '#include ".*"' | xargs sed -i -E 's|#include "(.*)"|#include <\1>|g'
|
||||||
|
|
||||||
|
# make local includes to be "..." style
|
||||||
|
main_src_dirs=$(find ./src -maxdepth 1 -type d -exec basename {} \; | paste -sd '|' | sed 's/|/\\|/g')
|
||||||
|
grep_code "#include <\($main_src_dirs\)/.*>" | xargs sed -i -E "s|#include <(($main_src_dirs)/.*)>|#include \"\1\"|g"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cmake_dirs=$(echo cmake $sources)
|
||||||
|
cmake_files=$(find $cmake_dirs -type f \( -name "CMakeLists.txt" -o -name "*.cmake" \))
|
||||||
|
cmake_files=$(echo $cmake_files ./CMakeLists.txt)
|
||||||
|
|
||||||
|
first=$(git diff $sources $cmake_files)
|
||||||
|
find $sources -type f \( -name '*.cpp' -o -name '*.hpp' -o -name '*.ipp' \) -print0 | xargs -0 $formatter
|
||||||
|
cmake-format -i $cmake_files
|
||||||
|
second=$(git diff $sources $cmake_files)
|
||||||
|
changes=$(diff <(echo "$first") <(echo "$second"))
|
||||||
|
changes_number=$(echo -n "$changes" | wc -l | sed -e 's/^[[:space:]]*//')
|
||||||
|
|
||||||
|
if [ "$changes_number" != "0" ]; then
|
||||||
|
cat <<\EOF
|
||||||
|
|
||||||
|
WARNING
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
Automatically re-formatted code with 'clang-format' - commit was aborted.
|
||||||
|
Please manually add any updated files and commit again.
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
EOF
|
||||||
|
if [[ "$1" == "--diff" ]]; then
|
||||||
|
echo "$changes"
|
||||||
|
fi
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
3
.githooks/post-checkout
Executable file
3
.githooks/post-checkout
Executable file
@@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
command -v git-lfs >/dev/null 2>&1 || { echo >&2 "\nThis repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting the 'post-checkout' file in the hooks directory (set by 'core.hookspath'; usually '.git/hooks').\n"; exit 2; }
|
||||||
|
git lfs post-checkout "$@"
|
||||||
3
.githooks/post-commit
Executable file
3
.githooks/post-commit
Executable file
@@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
command -v git-lfs >/dev/null 2>&1 || { echo >&2 "\nThis repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting the 'post-commit' file in the hooks directory (set by 'core.hookspath'; usually '.git/hooks').\n"; exit 2; }
|
||||||
|
git lfs post-commit "$@"
|
||||||
3
.githooks/post-merge
Executable file
3
.githooks/post-merge
Executable file
@@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
command -v git-lfs >/dev/null 2>&1 || { echo >&2 "\nThis repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting the 'post-merge' file in the hooks directory (set by 'core.hookspath'; usually '.git/hooks').\n"; exit 2; }
|
||||||
|
git lfs post-merge "$@"
|
||||||
8
.githooks/pre-commit
Executable file
8
.githooks/pre-commit
Executable file
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# This script is intended to be run from the root of the repository.
|
||||||
|
|
||||||
|
source .githooks/check-format
|
||||||
|
#source .githooks/check-docs
|
||||||
|
|
||||||
|
# TODO: Fix Doxygen issue with reference links. See https://github.com/XRPLF/clio/issues/1431
|
||||||
58
.githooks/pre-push
Executable file
58
.githooks/pre-push
Executable file
@@ -0,0 +1,58 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
|
||||||
|
# git for-each-ref refs/tags # see which tags are annotated and which are lightweight. Annotated tags are "tag" objects.
|
||||||
|
# # Set these so your commits and tags are always signed
|
||||||
|
# git config commit.gpgsign true
|
||||||
|
# git config tag.gpgsign true
|
||||||
|
|
||||||
|
verify_commit_signed() {
|
||||||
|
if git verify-commit HEAD &> /dev/null; then
|
||||||
|
:
|
||||||
|
# echo "HEAD commit seems signed..."
|
||||||
|
else
|
||||||
|
echo "HEAD commit isn't signed!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
verify_tag() {
|
||||||
|
if git describe --exact-match --tags HEAD &> /dev/null; then
|
||||||
|
: # You might be ok to push
|
||||||
|
# echo "Tag is annotated."
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo "Tag for [$version] not an annotated tag."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
verify_tag_signed() {
|
||||||
|
if git verify-tag "$version" &> /dev/null ; then
|
||||||
|
: # ok, I guess we'll let you push
|
||||||
|
# echo "Tag appears signed"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo "$version tag isn't signed"
|
||||||
|
echo "Sign it with [git tag -ams\"$version\" $version]"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
while read local_ref local_oid remote_ref remote_oid; do
|
||||||
|
# Check some things if we're pushing a branch called "release/"
|
||||||
|
if echo "$remote_ref" | grep ^refs\/heads\/release\/ &> /dev/null ; then
|
||||||
|
version=$(echo $remote_ref | awk -F/ '{print $NF}')
|
||||||
|
echo "Looks like you're trying to push a $version release..."
|
||||||
|
echo "Making sure you've signed and tagged it."
|
||||||
|
if verify_commit_signed && verify_tag && verify_tag_signed ; then
|
||||||
|
: # Ok, I guess you can push
|
||||||
|
else
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
command -v git-lfs >/dev/null 2>&1 || { echo >&2 "\nThis repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting the 'pre-push' file in the hooks directory (set by 'core.hookspath'; usually '.git/hooks').\n"; exit 2; }
|
||||||
|
|
||||||
|
git lfs pre-push "$@"
|
||||||
31
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
31
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: "[Title with short description] (Version: [Clio version])"
|
||||||
|
labels: bug
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- Please search existing issues to avoid creating duplicates. -->
|
||||||
|
<!-- Kindly refrain from posting any credentials or sensitive information in this issue -->
|
||||||
|
|
||||||
|
## Issue Description
|
||||||
|
<!-- Provide a summary for your issue/bug. -->
|
||||||
|
|
||||||
|
## Steps to Reproduce
|
||||||
|
<!-- List in detail the exact steps to reproduce the unexpected behavior of the software. -->
|
||||||
|
|
||||||
|
## Expected Result
|
||||||
|
<!-- Explain in detail what behavior you expected to happen. -->
|
||||||
|
|
||||||
|
## Actual Result
|
||||||
|
<!-- Explain in detail what behavior actually happened. -->
|
||||||
|
|
||||||
|
## Environment
|
||||||
|
<!-- Please describe your environment setup (such as Ubuntu 20.04.2 with Boost 1.82). -->
|
||||||
|
<!-- Please use the version returned by './clio_server --version' as the version number -->
|
||||||
|
|
||||||
|
## Supporting Files
|
||||||
|
<!-- If you have supporting files such as a log, feel free to post a link here using Github Gist. -->
|
||||||
|
<!-- Consider adding configuration files with private information removed via Github Gist. -->
|
||||||
23
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
23
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
title: "[Title with short description] (Version: [Clio version])"
|
||||||
|
labels: enhancement
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- Please search existing issues to avoid creating duplicates. -->
|
||||||
|
<!-- Kindly refrain from posting any credentials or sensitive information in this issue -->
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
<!-- Provide a summary to the feature request -->
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
<!-- Why do we need this feature? -->
|
||||||
|
|
||||||
|
## Solution
|
||||||
|
<!-- What is the solution? -->
|
||||||
|
|
||||||
|
## Paths Not Taken
|
||||||
|
<!-- What other alternatives have been considered? -->
|
||||||
18
.github/ISSUE_TEMPLATE/question.md
vendored
Normal file
18
.github/ISSUE_TEMPLATE/question.md
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
name: Question
|
||||||
|
about: A question in form of an issue
|
||||||
|
title: "[Title with short description] (Version: Clio version)"
|
||||||
|
labels: question
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- Please search existing issues to avoid creating duplicates. -->
|
||||||
|
<!-- Consider starting a [discussion](https://github.com/XRPLF/clio/discussions) instead. -->
|
||||||
|
<!-- Kindly refrain from posting any credentials or sensitive information in this issue -->
|
||||||
|
|
||||||
|
## Question
|
||||||
|
<!-- Your question -->
|
||||||
|
|
||||||
|
## Paths Not Taken
|
||||||
|
<!-- If applicable, what other alternatives have been considered? -->
|
||||||
18
.github/actions/build_clio/action.yml
vendored
Normal file
18
.github/actions/build_clio/action.yml
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
name: Build clio
|
||||||
|
description: Build clio in build directory
|
||||||
|
inputs:
|
||||||
|
target:
|
||||||
|
description: Build target name
|
||||||
|
default: all
|
||||||
|
runs:
|
||||||
|
using: composite
|
||||||
|
steps:
|
||||||
|
- name: Get number of threads
|
||||||
|
uses: ./.github/actions/get_number_of_threads
|
||||||
|
id: number_of_threads
|
||||||
|
|
||||||
|
- name: Build Clio
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
cd build
|
||||||
|
cmake --build . --parallel ${{ steps.number_of_threads.outputs.threads_number }} --target ${{ inputs.target }}
|
||||||
25
.github/actions/code_coverage/action.yml
vendored
Normal file
25
.github/actions/code_coverage/action.yml
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
name: Generate code coverage report
|
||||||
|
description: Run tests, generate code coverage report and upload it to codecov.io
|
||||||
|
runs:
|
||||||
|
using: composite
|
||||||
|
steps:
|
||||||
|
- name: Run tests
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
build/clio_tests
|
||||||
|
|
||||||
|
- name: Run gcovr
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
gcovr -e tests \
|
||||||
|
-e src/data/cassandra \
|
||||||
|
-e src/data/CassandraBackend.hpp \
|
||||||
|
-e 'src/data/BackendFactory.*' \
|
||||||
|
--xml build/coverage_report.xml -j8 --exclude-throw-branches
|
||||||
|
|
||||||
|
- name: Archive coverage report
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: coverage-report.xml
|
||||||
|
path: build/coverage_report.xml
|
||||||
|
retention-days: 30
|
||||||
35
.github/actions/create_issue/action.yml
vendored
Normal file
35
.github/actions/create_issue/action.yml
vendored
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
name: Create an issue
|
||||||
|
description: Create an issue
|
||||||
|
inputs:
|
||||||
|
title:
|
||||||
|
description: Issue title
|
||||||
|
required: true
|
||||||
|
body:
|
||||||
|
description: Issue body
|
||||||
|
required: true
|
||||||
|
labels:
|
||||||
|
description: Comma-separated list of labels
|
||||||
|
required: true
|
||||||
|
default: 'bug'
|
||||||
|
assignees:
|
||||||
|
description: Comma-separated list of assignees
|
||||||
|
required: true
|
||||||
|
default: 'cindyyan317,godexsoft,kuznetsss'
|
||||||
|
outputs:
|
||||||
|
created_issue_id:
|
||||||
|
description: Created issue id
|
||||||
|
value: ${{ steps.create_issue.outputs.created_issue }}
|
||||||
|
runs:
|
||||||
|
using: composite
|
||||||
|
steps:
|
||||||
|
- name: Create an issue
|
||||||
|
id: create_issue
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo -e '${{ inputs.body }}' > issue.md
|
||||||
|
gh issue create --assignee '${{ inputs.assignees }}' --label '${{ inputs.labels }}' --title '${{ inputs.title }}' --body-file ./issue.md > create_issue.log
|
||||||
|
created_issue=$(cat create_issue.log | sed 's|.*/||')
|
||||||
|
echo "created_issue=$created_issue" >> $GITHUB_OUTPUT
|
||||||
|
rm create_issue.log issue.md
|
||||||
|
|
||||||
|
|
||||||
46
.github/actions/generate/action.yml
vendored
Normal file
46
.github/actions/generate/action.yml
vendored
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
name: Run conan and cmake
|
||||||
|
description: Run conan and cmake
|
||||||
|
inputs:
|
||||||
|
conan_profile:
|
||||||
|
description: Conan profile name
|
||||||
|
required: true
|
||||||
|
conan_cache_hit:
|
||||||
|
description: Whether conan cache has been downloaded
|
||||||
|
required: true
|
||||||
|
default: 'false'
|
||||||
|
build_type:
|
||||||
|
description: Build type for third-party libraries and clio. Could be 'Release', 'Debug'
|
||||||
|
required: true
|
||||||
|
default: 'Release'
|
||||||
|
code_coverage:
|
||||||
|
description: Whether conan's coverage option should be on or not
|
||||||
|
required: true
|
||||||
|
default: 'false'
|
||||||
|
static:
|
||||||
|
description: Whether Clio is to be statically linked
|
||||||
|
required: true
|
||||||
|
default: 'false'
|
||||||
|
runs:
|
||||||
|
using: composite
|
||||||
|
steps:
|
||||||
|
- name: Create build directory
|
||||||
|
shell: bash
|
||||||
|
run: mkdir -p build
|
||||||
|
|
||||||
|
- name: Run conan
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
BUILD_OPTION: "${{ inputs.conan_cache_hit == 'true' && 'missing' || '' }}"
|
||||||
|
CODE_COVERAGE: "${{ inputs.code_coverage == 'true' && 'True' || 'False' }}"
|
||||||
|
STATIC_OPTION: "${{ inputs.static == 'true' && 'True' || 'False' }}"
|
||||||
|
run: |
|
||||||
|
cd build
|
||||||
|
conan install .. -of . -b $BUILD_OPTION -s build_type=${{ inputs.build_type }} -o clio:static="${STATIC_OPTION}" -o clio:tests=True -o clio:integration_tests=True -o clio:lint=False -o clio:coverage="${CODE_COVERAGE}" --profile ${{ inputs.conan_profile }}
|
||||||
|
|
||||||
|
- name: Run cmake
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
BUILD_TYPE: "${{ inputs.build_type }}"
|
||||||
|
run: |
|
||||||
|
cd build
|
||||||
|
cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} ${{ inputs.extra_cmake_args }} .. -G Ninja
|
||||||
26
.github/actions/get_number_of_threads/action.yml
vendored
Normal file
26
.github/actions/get_number_of_threads/action.yml
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
name: Get number of threads
|
||||||
|
description: Determines number of threads to use on macOS and Linux
|
||||||
|
outputs:
|
||||||
|
threads_number:
|
||||||
|
description: Number of threads to use
|
||||||
|
value: ${{ steps.number_of_threads_export.outputs.num }}
|
||||||
|
runs:
|
||||||
|
using: composite
|
||||||
|
steps:
|
||||||
|
- name: Get number of threads on mac
|
||||||
|
id: mac_threads
|
||||||
|
if: ${{ runner.os == 'macOS' }}
|
||||||
|
shell: bash
|
||||||
|
run: echo "num=$(($(sysctl -n hw.logicalcpu) - 2))" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Get number of threads on Linux
|
||||||
|
id: linux_threads
|
||||||
|
if: ${{ runner.os == 'Linux' }}
|
||||||
|
shell: bash
|
||||||
|
run: echo "num=$(($(nproc) - 2))" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Export output variable
|
||||||
|
shell: bash
|
||||||
|
id: number_of_threads_export
|
||||||
|
run: |
|
||||||
|
echo "num=${{ steps.mac_threads.outputs.num || steps.linux_threads.outputs.num }}" >> $GITHUB_OUTPUT
|
||||||
14
.github/actions/git_common_ancestor/action.yml
vendored
Normal file
14
.github/actions/git_common_ancestor/action.yml
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
name: Git common ancestor
|
||||||
|
description: Find the closest common commit
|
||||||
|
outputs:
|
||||||
|
commit:
|
||||||
|
description: Hash of commit
|
||||||
|
value: ${{ steps.find_common_ancestor.outputs.commit }}
|
||||||
|
runs:
|
||||||
|
using: composite
|
||||||
|
steps:
|
||||||
|
- name: Find common git ancestor
|
||||||
|
id: find_common_ancestor
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo "commit=$(git merge-base --fork-point origin/develop)" >> $GITHUB_OUTPUT
|
||||||
48
.github/actions/prepare_runner/action.yml
vendored
Normal file
48
.github/actions/prepare_runner/action.yml
vendored
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
name: Prepare runner
|
||||||
|
description: Install packages, set environment variables, create directories
|
||||||
|
inputs:
|
||||||
|
disable_ccache:
|
||||||
|
description: Whether ccache should be disabled
|
||||||
|
required: true
|
||||||
|
runs:
|
||||||
|
using: composite
|
||||||
|
steps:
|
||||||
|
- name: Install packages on mac
|
||||||
|
if: ${{ runner.os == 'macOS' }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
brew install llvm@14 pkg-config ninja bison cmake ccache jq gh conan@1
|
||||||
|
echo "/opt/homebrew/opt/conan@1/bin" >> $GITHUB_PATH
|
||||||
|
|
||||||
|
- name: Fix git permissions on Linux
|
||||||
|
if: ${{ runner.os == 'Linux' }}
|
||||||
|
shell: bash
|
||||||
|
run: git config --global --add safe.directory $PWD
|
||||||
|
|
||||||
|
- name: Set env variables for macOS
|
||||||
|
if: ${{ runner.os == 'macOS' }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo "CCACHE_DIR=${{ github.workspace }}/.ccache" >> $GITHUB_ENV
|
||||||
|
echo "CONAN_USER_HOME=${{ github.workspace }}" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Set env variables for Linux
|
||||||
|
if: ${{ runner.os == 'Linux' }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo "CCACHE_DIR=/root/.ccache" >> $GITHUB_ENV
|
||||||
|
echo "CONAN_USER_HOME=/root/" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Set CCACHE_DISABLE=1
|
||||||
|
if: ${{ inputs.disable_ccache == 'true' }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo "CCACHE_DISABLE=1" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Create directories
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir -p $CCACHE_DIR
|
||||||
|
mkdir -p $CONAN_USER_HOME/.conan
|
||||||
|
|
||||||
|
|
||||||
62
.github/actions/restore_cache/action.yml
vendored
Normal file
62
.github/actions/restore_cache/action.yml
vendored
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
name: Restore cache
|
||||||
|
description: Find and restores conan and ccache cache
|
||||||
|
inputs:
|
||||||
|
conan_dir:
|
||||||
|
description: Path to .conan directory
|
||||||
|
required: true
|
||||||
|
conan_profile:
|
||||||
|
description: Conan profile name
|
||||||
|
required: true
|
||||||
|
ccache_dir:
|
||||||
|
description: Path to .ccache directory
|
||||||
|
required: true
|
||||||
|
build_type:
|
||||||
|
description: Current build type (e.g. Release, Debug)
|
||||||
|
required: true
|
||||||
|
default: Release
|
||||||
|
code_coverage:
|
||||||
|
description: Whether code coverage is on
|
||||||
|
required: true
|
||||||
|
default: 'false'
|
||||||
|
outputs:
|
||||||
|
conan_hash:
|
||||||
|
description: Hash to use as a part of conan cache key
|
||||||
|
value: ${{ steps.conan_hash.outputs.hash }}
|
||||||
|
conan_cache_hit:
|
||||||
|
description: True if conan cache has been downloaded
|
||||||
|
value: ${{ steps.conan_cache.outputs.cache-hit }}
|
||||||
|
ccache_cache_hit:
|
||||||
|
description: True if ccache cache has been downloaded
|
||||||
|
value: ${{ steps.ccache_cache.outputs.cache-hit }}
|
||||||
|
runs:
|
||||||
|
using: composite
|
||||||
|
steps:
|
||||||
|
- name: Find common commit
|
||||||
|
id: git_common_ancestor
|
||||||
|
uses: ./.github/actions/git_common_ancestor
|
||||||
|
|
||||||
|
- name: Calculate conan hash
|
||||||
|
id: conan_hash
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
conan info . -j info.json -o clio:tests=True
|
||||||
|
packages_info=$(cat info.json | jq '.[] | "\(.display_name): \(.id)"' | grep -v 'clio')
|
||||||
|
echo "$packages_info"
|
||||||
|
hash=$(echo "$packages_info" | shasum -a 256 | cut -d ' ' -f 1)
|
||||||
|
rm info.json
|
||||||
|
echo "hash=$hash" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Restore conan cache
|
||||||
|
uses: actions/cache/restore@v4
|
||||||
|
id: conan_cache
|
||||||
|
with:
|
||||||
|
path: ${{ inputs.conan_dir }}/data
|
||||||
|
key: clio-conan_data-${{ runner.os }}-${{ inputs.build_type }}-${{ inputs.conan_profile }}-develop-${{ steps.conan_hash.outputs.hash }}
|
||||||
|
|
||||||
|
- name: Restore ccache cache
|
||||||
|
uses: actions/cache/restore@v4
|
||||||
|
id: ccache_cache
|
||||||
|
if: ${{ env.CCACHE_DISABLE != '1' }}
|
||||||
|
with:
|
||||||
|
path: ${{ inputs.ccache_dir }}
|
||||||
|
key: clio-ccache-${{ runner.os }}-${{ inputs.build_type }}${{ inputs.code_coverage == 'true' && '-code_coverage' || '' }}-${{ inputs.conan_profile }}-develop-${{ steps.git_common_ancestor.outputs.commit }}
|
||||||
59
.github/actions/save_cache/action.yml
vendored
Normal file
59
.github/actions/save_cache/action.yml
vendored
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
name: Save cache
|
||||||
|
description: Save conan and ccache cache for develop branch
|
||||||
|
inputs:
|
||||||
|
conan_dir:
|
||||||
|
description: Path to .conan directory
|
||||||
|
required: true
|
||||||
|
conan_profile:
|
||||||
|
description: Conan profile name
|
||||||
|
required: true
|
||||||
|
conan_hash:
|
||||||
|
description: Hash to use as a part of conan cache key
|
||||||
|
required: true
|
||||||
|
conan_cache_hit:
|
||||||
|
description: Whether conan cache has been downloaded
|
||||||
|
required: true
|
||||||
|
ccache_dir:
|
||||||
|
description: Path to .ccache directory
|
||||||
|
required: true
|
||||||
|
ccache_cache_hit:
|
||||||
|
description: Whether conan cache has been downloaded
|
||||||
|
required: true
|
||||||
|
ccache_cache_miss_rate:
|
||||||
|
description: How many cache misses happened
|
||||||
|
build_type:
|
||||||
|
description: Current build type (e.g. Release, Debug)
|
||||||
|
required: true
|
||||||
|
default: Release
|
||||||
|
code_coverage:
|
||||||
|
description: Whether code coverage is on
|
||||||
|
required: true
|
||||||
|
default: 'false'
|
||||||
|
runs:
|
||||||
|
using: composite
|
||||||
|
steps:
|
||||||
|
- name: Find common commit
|
||||||
|
id: git_common_ancestor
|
||||||
|
uses: ./.github/actions/git_common_ancestor
|
||||||
|
|
||||||
|
- name: Cleanup conan directory from extra data
|
||||||
|
if: ${{ inputs.conan_cache_hit != 'true' }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
conan remove "*" -s -b -f
|
||||||
|
|
||||||
|
- name: Save conan cache
|
||||||
|
if: ${{ inputs.conan_cache_hit != 'true' }}
|
||||||
|
uses: actions/cache/save@v4
|
||||||
|
with:
|
||||||
|
path: ${{ inputs.conan_dir }}/data
|
||||||
|
key: clio-conan_data-${{ runner.os }}-${{ inputs.build_type }}-${{ inputs.conan_profile }}-develop-${{ inputs.conan_hash }}
|
||||||
|
|
||||||
|
- name: Save ccache cache
|
||||||
|
if: ${{ inputs.ccache_cache_hit != 'true' || inputs.ccache_cache_miss_rate == '100.0' }}
|
||||||
|
uses: actions/cache/save@v4
|
||||||
|
with:
|
||||||
|
path: ${{ inputs.ccache_dir }}
|
||||||
|
key: clio-ccache-${{ runner.os }}-${{ inputs.build_type }}${{ inputs.code_coverage == 'true' && '-code_coverage' || '' }}-${{ inputs.conan_profile }}-develop-${{ steps.git_common_ancestor.outputs.commit }}
|
||||||
|
|
||||||
|
|
||||||
52
.github/actions/setup_conan/action.yml
vendored
Normal file
52
.github/actions/setup_conan/action.yml
vendored
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
name: Setup conan
|
||||||
|
description: Setup conan profile and artifactory
|
||||||
|
inputs:
|
||||||
|
conan_profile:
|
||||||
|
description: Conan profile name
|
||||||
|
required: true
|
||||||
|
outputs:
|
||||||
|
conan_profile:
|
||||||
|
description: Created conan profile name
|
||||||
|
value: ${{ steps.conan_export_output.outputs.conan_profile }}
|
||||||
|
runs:
|
||||||
|
using: composite
|
||||||
|
steps:
|
||||||
|
- name: On mac
|
||||||
|
if: ${{ runner.os == 'macOS' }}
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
CONAN_PROFILE: apple_clang_15
|
||||||
|
id: conan_setup_mac
|
||||||
|
run: |
|
||||||
|
echo "Creating $CONAN_PROFILE conan profile";
|
||||||
|
conan profile new $CONAN_PROFILE --detect --force
|
||||||
|
conan profile update settings.compiler.libcxx=libc++ $CONAN_PROFILE
|
||||||
|
conan profile update settings.compiler.cppstd=20 $CONAN_PROFILE
|
||||||
|
conan profile update env.CXXFLAGS=-DBOOST_ASIO_DISABLE_CONCEPTS $CONAN_PROFILE
|
||||||
|
conan profile update "conf.tools.build:cxxflags+=[\"-DBOOST_ASIO_DISABLE_CONCEPTS\"]" $CONAN_PROFILE
|
||||||
|
echo "created_conan_profile=$CONAN_PROFILE" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: On linux
|
||||||
|
if: ${{ runner.os == 'Linux' }}
|
||||||
|
shell: bash
|
||||||
|
id: conan_setup_linux
|
||||||
|
run: |
|
||||||
|
echo "created_conan_profile=${{ inputs.conan_profile }}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Export output variable
|
||||||
|
shell: bash
|
||||||
|
id: conan_export_output
|
||||||
|
run: |
|
||||||
|
echo "conan_profile=${{ steps.conan_setup_mac.outputs.created_conan_profile || steps.conan_setup_linux.outputs.created_conan_profile }}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Add conan-non-prod artifactory
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
if [[ -z $(conan remote list | grep conan-non-prod) ]]; then
|
||||||
|
echo "Adding conan-non-prod"
|
||||||
|
conan remote add --insert 0 conan-non-prod http://18.143.149.228:8081/artifactory/api/conan/conan-non-prod
|
||||||
|
else
|
||||||
|
echo "Conan-non-prod is available"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
6
.github/actions/test/Dockerfile
vendored
Normal file
6
.github/actions/test/Dockerfile
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
FROM cassandra:4.0.4
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y postgresql
|
||||||
|
COPY entrypoint.sh /entrypoint.sh
|
||||||
|
|
||||||
|
ENTRYPOINT ["/entrypoint.sh"]
|
||||||
8
.github/actions/test/entrypoint.sh
vendored
Executable file
8
.github/actions/test/entrypoint.sh
vendored
Executable file
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
pg_ctlcluster 12 main start
|
||||||
|
su postgres -c"psql -c\"alter user postgres with password 'postgres'\""
|
||||||
|
su cassandra -c "/opt/cassandra/bin/cassandra -R"
|
||||||
|
sleep 90
|
||||||
|
chmod +x ./clio_tests
|
||||||
|
./clio_tests
|
||||||
28
.github/scripts/update-libxrpl-version
vendored
Executable file
28
.github/scripts/update-libxrpl-version
vendored
Executable file
@@ -0,0 +1,28 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Note: This script is intended to be run from the root of the repository.
|
||||||
|
#
|
||||||
|
# This script modifies conanfile.py such that the specified version of libXRPL is used.
|
||||||
|
|
||||||
|
if [[ -z "$1" ]]; then
|
||||||
|
cat <<EOF
|
||||||
|
|
||||||
|
ERROR
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
Version should be passed as first argument to the script.
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
EOF
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
VERSION=$1
|
||||||
|
GNU_SED=$(sed --version 2>&1 | grep -q 'GNU' && echo true || echo false)
|
||||||
|
|
||||||
|
echo "+ Updating required libXRPL version to $VERSION"
|
||||||
|
|
||||||
|
if [[ "$GNU_SED" == "false" ]]; then
|
||||||
|
sed -i '' -E "s|'xrpl/[a-zA-Z0-9\\.\\-]+'|'xrpl/$VERSION'|g" conanfile.py
|
||||||
|
else
|
||||||
|
sed -i -E "s|'xrpl/[a-zA-Z0-9\\.\\-]+'|'xrpl/$VERSION'|g" conanfile.py
|
||||||
|
fi
|
||||||
236
.github/workflows/build.yml
vendored
236
.github/workflows/build.yml
vendored
@@ -1,69 +1,217 @@
|
|||||||
name: Build Clio
|
name: Build
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [master, develop, develop-next]
|
branches: [master, release/*, develop]
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [master, develop, develop-next]
|
branches: [master, release/*, develop]
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
check_format:
|
||||||
name: Lint
|
name: Check format
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
|
container:
|
||||||
|
image: rippleci/clio_ci:latest
|
||||||
steps:
|
steps:
|
||||||
- name: Get source
|
- name: Fix git permissions on Linux
|
||||||
uses: actions/checkout@v3
|
shell: bash
|
||||||
|
run: git config --global --add safe.directory $PWD
|
||||||
|
|
||||||
- name: Run clang-format
|
- uses: actions/checkout@v4
|
||||||
uses: XRPLF/clio-gha/lint@main
|
- name: Run formatters
|
||||||
|
id: run_formatters
|
||||||
|
run: |
|
||||||
|
./.githooks/check-format --diff
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
check_docs:
|
||||||
|
name: Check documentation
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
container:
|
||||||
|
image: rippleci/clio_ci:latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Run linter
|
||||||
|
id: run_linter
|
||||||
|
run: |
|
||||||
|
./.githooks/check-docs
|
||||||
|
shell: bash
|
||||||
|
|
||||||
build_clio:
|
build:
|
||||||
name: Build
|
name: Build
|
||||||
runs-on: [self-hosted, Linux]
|
needs:
|
||||||
needs: lint
|
- check_format
|
||||||
|
- check_docs
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- os: heavy
|
||||||
|
container:
|
||||||
|
image: rippleci/clio_ci:latest
|
||||||
|
build_type: Release
|
||||||
|
conan_profile: gcc
|
||||||
|
code_coverage: false
|
||||||
|
static: true
|
||||||
|
- os: heavy
|
||||||
|
container:
|
||||||
|
image: rippleci/clio_ci:latest
|
||||||
|
build_type: Debug
|
||||||
|
conan_profile: gcc
|
||||||
|
code_coverage: true
|
||||||
|
static: true
|
||||||
|
- os: heavy
|
||||||
|
container:
|
||||||
|
image: rippleci/clio_ci:latest
|
||||||
|
build_type: Release
|
||||||
|
conan_profile: clang
|
||||||
|
code_coverage: false
|
||||||
|
static: true
|
||||||
|
- os: heavy
|
||||||
|
container:
|
||||||
|
image: rippleci/clio_ci:latest
|
||||||
|
build_type: Debug
|
||||||
|
conan_profile: clang
|
||||||
|
code_coverage: false
|
||||||
|
static: true
|
||||||
|
- os: macos14
|
||||||
|
build_type: Release
|
||||||
|
code_coverage: false
|
||||||
|
static: false
|
||||||
|
runs-on: [self-hosted, "${{ matrix.os }}"]
|
||||||
|
container: ${{ matrix.container }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
- name: Clean workdir
|
||||||
|
if: ${{ runner.os == 'macOS' }}
|
||||||
|
uses: kuznetsss/workspace-cleanup@1.0
|
||||||
|
|
||||||
- name: Clone Clio repo
|
- uses: actions/checkout@v4
|
||||||
uses: actions/checkout@v3
|
|
||||||
with:
|
with:
|
||||||
path: clio_src
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Clone Clio CI repo
|
- name: Prepare runner
|
||||||
uses: actions/checkout@v3
|
uses: ./.github/actions/prepare_runner
|
||||||
with:
|
with:
|
||||||
path: clio_ci
|
disable_ccache: false
|
||||||
repository: 'XRPLF/clio-ci'
|
|
||||||
|
|
||||||
- name: Clone GitHub actions repo
|
- name: Setup conan
|
||||||
uses: actions/checkout@v3
|
uses: ./.github/actions/setup_conan
|
||||||
|
id: conan
|
||||||
with:
|
with:
|
||||||
repository: XRPLF/clio-gha
|
conan_profile: ${{ matrix.conan_profile }}
|
||||||
path: gha # must be the same as defined in XRPLF/clio-gha
|
|
||||||
|
|
||||||
- name: Build
|
- name: Restore cache
|
||||||
uses: XRPLF/clio-gha/build@main
|
uses: ./.github/actions/restore_cache
|
||||||
|
id: restore_cache
|
||||||
- name: Artifact clio_tests
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
with:
|
||||||
name: clio_tests
|
conan_dir: ${{ env.CONAN_USER_HOME }}/.conan
|
||||||
path: clio_tests
|
conan_profile: ${{ steps.conan.outputs.conan_profile }}
|
||||||
|
ccache_dir: ${{ env.CCACHE_DIR }}
|
||||||
|
build_type: ${{ matrix.build_type }}
|
||||||
|
code_coverage: ${{ matrix.code_coverage }}
|
||||||
|
|
||||||
- name: Artifact Debian package
|
- name: Run conan and cmake
|
||||||
uses: actions/upload-artifact@v2
|
uses: ./.github/actions/generate
|
||||||
with:
|
with:
|
||||||
name: deb_package-${{ github.sha }}
|
conan_profile: ${{ steps.conan.outputs.conan_profile }}
|
||||||
path: clio_ci/build/*.deb
|
conan_cache_hit: ${{ steps.restore_cache.outputs.conan_cache_hit }}
|
||||||
|
build_type: ${{ matrix.build_type }}
|
||||||
|
code_coverage: ${{ matrix.code_coverage }}
|
||||||
|
static: ${{ matrix.static }}
|
||||||
|
|
||||||
|
- name: Build Clio
|
||||||
|
uses: ./.github/actions/build_clio
|
||||||
|
|
||||||
|
- name: Show ccache's statistics
|
||||||
|
shell: bash
|
||||||
|
id: ccache_stats
|
||||||
|
run: |
|
||||||
|
ccache -s > /tmp/ccache.stats
|
||||||
|
miss_rate=$(cat /tmp/ccache.stats | grep 'Misses' | head -n1 | sed 's/.*(\(.*\)%).*/\1/')
|
||||||
|
echo "miss_rate=${miss_rate}" >> $GITHUB_OUTPUT
|
||||||
|
cat /tmp/ccache.stats
|
||||||
|
|
||||||
|
- name: Strip tests
|
||||||
|
if: ${{ !matrix.code_coverage }}
|
||||||
|
run: strip build/clio_tests && strip build/clio_integration_tests
|
||||||
|
|
||||||
|
- name: Upload clio_server
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: clio_server_${{ runner.os }}_${{ matrix.build_type }}_${{ steps.conan.outputs.conan_profile }}
|
||||||
|
path: build/clio_server
|
||||||
|
|
||||||
|
- name: Upload clio_tests
|
||||||
|
if: ${{ !matrix.code_coverage }}
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: clio_tests_${{ runner.os }}_${{ matrix.build_type }}_${{ steps.conan.outputs.conan_profile }}
|
||||||
|
path: build/clio_*tests
|
||||||
|
|
||||||
|
- name: Save cache
|
||||||
|
uses: ./.github/actions/save_cache
|
||||||
|
with:
|
||||||
|
conan_dir: ${{ env.CONAN_USER_HOME }}/.conan
|
||||||
|
conan_hash: ${{ steps.restore_cache.outputs.conan_hash }}
|
||||||
|
conan_cache_hit: ${{ steps.restore_cache.outputs.conan_cache_hit }}
|
||||||
|
ccache_dir: ${{ env.CCACHE_DIR }}
|
||||||
|
ccache_cache_hit: ${{ steps.restore_cache.outputs.ccache_cache_hit }}
|
||||||
|
ccache_cache_miss_rate: ${{ steps.ccache_stats.outputs.miss_rate }}
|
||||||
|
build_type: ${{ matrix.build_type }}
|
||||||
|
code_coverage: ${{ matrix.code_coverage }}
|
||||||
|
conan_profile: ${{ steps.conan.outputs.conan_profile }}
|
||||||
|
|
||||||
|
# TODO: This is not a part of build process but it is the easiest way to do it here.
|
||||||
|
# It will be refactored in https://github.com/XRPLF/clio/issues/1075
|
||||||
|
- name: Run code coverage
|
||||||
|
if: ${{ matrix.code_coverage }}
|
||||||
|
uses: ./.github/actions/code_coverage
|
||||||
|
|
||||||
|
upload_coverage_report:
|
||||||
|
name: Codecov
|
||||||
|
needs: build
|
||||||
|
uses: ./.github/workflows/upload_coverage_report.yml
|
||||||
|
secrets:
|
||||||
|
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
|
||||||
|
test:
|
||||||
|
name: Run Tests
|
||||||
|
needs: build
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- os: heavy
|
||||||
|
container:
|
||||||
|
image: rippleci/clio_ci:latest
|
||||||
|
conan_profile: gcc
|
||||||
|
build_type: Release
|
||||||
|
- os: heavy
|
||||||
|
container:
|
||||||
|
image: rippleci/clio_ci:latest
|
||||||
|
conan_profile: clang
|
||||||
|
build_type: Release
|
||||||
|
- os: heavy
|
||||||
|
container:
|
||||||
|
image: rippleci/clio_ci:latest
|
||||||
|
conan_profile: clang
|
||||||
|
build_type: Debug
|
||||||
|
- os: macos14
|
||||||
|
conan_profile: apple_clang_15
|
||||||
|
build_type: Release
|
||||||
|
runs-on: [self-hosted, "${{ matrix.os }}"]
|
||||||
|
container: ${{ matrix.container }}
|
||||||
|
|
||||||
test_clio:
|
|
||||||
name: Test Clio
|
|
||||||
runs-on: [self-hosted, Linux]
|
|
||||||
needs: build_clio
|
|
||||||
steps:
|
steps:
|
||||||
- name: Get clio_tests artifact
|
- name: Clean workdir
|
||||||
uses: actions/download-artifact@v3
|
if: ${{ runner.os == 'macOS' }}
|
||||||
with:
|
uses: kuznetsss/workspace-cleanup@1.0
|
||||||
name: clio_tests
|
|
||||||
|
|
||||||
- name: Run tests
|
- uses: actions/download-artifact@v4
|
||||||
uses: XRPLF/clio-gha/test@main
|
with:
|
||||||
|
name: clio_tests_${{ runner.os }}_${{ matrix.build_type }}_${{ matrix.conan_profile }}
|
||||||
|
- name: Run clio_tests
|
||||||
|
run: |
|
||||||
|
chmod +x ./clio_tests
|
||||||
|
./clio_tests
|
||||||
|
|||||||
91
.github/workflows/check_libxrpl.yml
vendored
Normal file
91
.github/workflows/check_libxrpl.yml
vendored
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
name: Check new libXRPL
|
||||||
|
on:
|
||||||
|
repository_dispatch:
|
||||||
|
types: [check_libxrpl]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Build Clio / `libXRPL ${{ github.event.client_payload.version }}`
|
||||||
|
runs-on: [self-hosted, heavy]
|
||||||
|
container:
|
||||||
|
image: rippleci/clio_ci:latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Update libXRPL version requirement
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
./.github/scripts/update-libxrpl-version ${{ github.event.client_payload.version }}
|
||||||
|
|
||||||
|
- name: Prepare runner
|
||||||
|
uses: ./.github/actions/prepare_runner
|
||||||
|
with:
|
||||||
|
disable_ccache: true
|
||||||
|
|
||||||
|
- name: Setup conan
|
||||||
|
uses: ./.github/actions/setup_conan
|
||||||
|
id: conan
|
||||||
|
with:
|
||||||
|
conan_profile: gcc
|
||||||
|
|
||||||
|
- name: Run conan and cmake
|
||||||
|
uses: ./.github/actions/generate
|
||||||
|
with:
|
||||||
|
conan_profile: ${{ steps.conan.outputs.conan_profile }}
|
||||||
|
conan_cache_hit: ${{ steps.restore_cache.outputs.conan_cache_hit }}
|
||||||
|
build_type: Release
|
||||||
|
|
||||||
|
- name: Build Clio
|
||||||
|
uses: ./.github/actions/build_clio
|
||||||
|
|
||||||
|
- name: Strip tests
|
||||||
|
run: strip build/clio_tests
|
||||||
|
|
||||||
|
- name: Upload clio_tests
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: clio_tests_libxrpl-${{ github.event.client_payload.version }}
|
||||||
|
path: build/clio_tests
|
||||||
|
|
||||||
|
run_tests:
|
||||||
|
name: Run tests
|
||||||
|
needs: build
|
||||||
|
runs-on: [self-hosted, heavy]
|
||||||
|
container:
|
||||||
|
image: rippleci/clio_ci:latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: clio_tests_libxrpl-${{ github.event.client_payload.version }}
|
||||||
|
|
||||||
|
- name: Run clio_tests
|
||||||
|
run: |
|
||||||
|
chmod +x ./clio_tests
|
||||||
|
./clio_tests
|
||||||
|
|
||||||
|
create_issue_on_failure:
|
||||||
|
name: Create an issue on failure
|
||||||
|
needs: [build, run_tests]
|
||||||
|
if: ${{ always() && contains(needs.*.result, 'failure') }}
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
issues: write
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Create an issue
|
||||||
|
uses: ./.github/actions/create_issue
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
with:
|
||||||
|
labels: 'compatibility,bug'
|
||||||
|
title: 'Proposed libXRPL check failed'
|
||||||
|
body: >
|
||||||
|
Clio build or tests failed against `libXRPL ${{ github.event.client_payload.version }}`.
|
||||||
|
|
||||||
|
Workflow: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}/
|
||||||
18
.github/workflows/check_pr_title.yml
vendored
Normal file
18
.github/workflows/check_pr_title.yml
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
name: Check PR title
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, edited, reopened, synchronize]
|
||||||
|
branches: [develop]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check_title:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
# permissions:
|
||||||
|
# pull-requests: write
|
||||||
|
steps:
|
||||||
|
- uses: ytanikin/PRConventionalCommits@1.2.0
|
||||||
|
with:
|
||||||
|
task_types: '["build","feat","fix","docs","test","ci","style","refactor","perf","chore"]'
|
||||||
|
add_label: false
|
||||||
|
# Turned off labelling because it leads to an error, see https://github.com/ytanikin/PRConventionalCommits/issues/19
|
||||||
|
# custom_labels: '{"build":"build", "feat":"enhancement", "fix":"bug", "docs":"documentation", "test":"testability", "ci":"ci", "style":"refactoring", "refactor":"refactoring", "perf":"performance", "chore":"tooling"}'
|
||||||
119
.github/workflows/clang-tidy.yml
vendored
Normal file
119
.github/workflows/clang-tidy.yml
vendored
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
name: Clang-tidy check
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 6 * * 1-5"
|
||||||
|
workflow_dispatch:
|
||||||
|
pull_request:
|
||||||
|
branches: [develop]
|
||||||
|
paths:
|
||||||
|
- .clang_tidy
|
||||||
|
- .github/workflows/clang-tidy.yml
|
||||||
|
workflow_call:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
clang_tidy:
|
||||||
|
runs-on: [self-hosted, Linux]
|
||||||
|
container:
|
||||||
|
image: rippleci/clio_ci:latest
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Prepare runner
|
||||||
|
uses: ./.github/actions/prepare_runner
|
||||||
|
with:
|
||||||
|
disable_ccache: true
|
||||||
|
|
||||||
|
- name: Setup conan
|
||||||
|
uses: ./.github/actions/setup_conan
|
||||||
|
id: conan
|
||||||
|
with:
|
||||||
|
conan_profile: clang
|
||||||
|
|
||||||
|
- name: Restore cache
|
||||||
|
uses: ./.github/actions/restore_cache
|
||||||
|
id: restore_cache
|
||||||
|
with:
|
||||||
|
conan_dir: ${{ env.CONAN_USER_HOME }}/.conan
|
||||||
|
ccache_dir: ${{ env.CCACHE_DIR }}
|
||||||
|
conan_profile: ${{ steps.conan.outputs.conan_profile }}
|
||||||
|
|
||||||
|
- name: Run conan and cmake
|
||||||
|
uses: ./.github/actions/generate
|
||||||
|
with:
|
||||||
|
conan_profile: ${{ steps.conan.outputs.conan_profile }}
|
||||||
|
conan_cache_hit: ${{ steps.restore_cache.outputs.conan_cache_hit }}
|
||||||
|
build_type: Release
|
||||||
|
|
||||||
|
- name: Get number of threads
|
||||||
|
uses: ./.github/actions/get_number_of_threads
|
||||||
|
id: number_of_threads
|
||||||
|
|
||||||
|
- name: Run clang-tidy
|
||||||
|
continue-on-error: true
|
||||||
|
shell: bash
|
||||||
|
id: run_clang_tidy
|
||||||
|
run: |
|
||||||
|
run-clang-tidy-18 -p build -j ${{ steps.number_of_threads.outputs.threads_number }} -fix -quiet 1>output.txt
|
||||||
|
|
||||||
|
- name: Check format
|
||||||
|
if: ${{ steps.run_clang_tidy.outcome != 'success' }}
|
||||||
|
continue-on-error: true
|
||||||
|
shell: bash
|
||||||
|
run: ./.githooks/check-format
|
||||||
|
|
||||||
|
- name: Print issues found
|
||||||
|
if: ${{ steps.run_clang_tidy.outcome != 'success' }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
sed -i '/error\||/!d' ./output.txt
|
||||||
|
cat output.txt
|
||||||
|
rm output.txt
|
||||||
|
|
||||||
|
- name: Create an issue
|
||||||
|
if: ${{ steps.run_clang_tidy.outcome != 'success' }}
|
||||||
|
id: create_issue
|
||||||
|
uses: ./.github/actions/create_issue
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
with:
|
||||||
|
title: 'Clang-tidy found bugs in code 🐛'
|
||||||
|
body: >
|
||||||
|
Clang-tidy found issues in the code:
|
||||||
|
|
||||||
|
List of the issues found: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}/
|
||||||
|
|
||||||
|
- uses: crazy-max/ghaction-import-gpg@v5
|
||||||
|
if: ${{ steps.run_clang_tidy.outcome != 'success' }}
|
||||||
|
with:
|
||||||
|
gpg_private_key: ${{ secrets.ACTIONS_GPG_PRIVATE_KEY }}
|
||||||
|
passphrase: ${{ secrets.ACTIONS_GPG_PASSPHRASE }}
|
||||||
|
git_user_signingkey: true
|
||||||
|
git_commit_gpgsign: true
|
||||||
|
|
||||||
|
- name: Create PR with fixes
|
||||||
|
if: ${{ steps.run_clang_tidy.outcome != 'success' }}
|
||||||
|
uses: peter-evans/create-pull-request@v5
|
||||||
|
env:
|
||||||
|
GH_REPO: ${{ github.repository }}
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
with:
|
||||||
|
commit-message: "[CI] clang-tidy auto fixes"
|
||||||
|
committer: Clio CI <skuznetsov@ripple.com>
|
||||||
|
branch: "clang_tidy/autofix"
|
||||||
|
branch-suffix: timestamp
|
||||||
|
delete-branch: true
|
||||||
|
title: "style: clang-tidy auto fixes"
|
||||||
|
body: "Fixes #${{ steps.create_issue.outputs.created_issue_id }}. Please review and commit clang-tidy fixes."
|
||||||
|
reviewers: "cindyyan317,godexsoft,kuznetsss"
|
||||||
|
|
||||||
|
- name: Fail the job
|
||||||
|
if: ${{ steps.run_clang_tidy.outcome != 'success' }}
|
||||||
|
shell: bash
|
||||||
|
run: exit 1
|
||||||
29
.github/workflows/clang-tidy_on_fix_merged.yml
vendored
Normal file
29
.github/workflows/clang-tidy_on_fix_merged.yml
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
name: Restart clang-tidy workflow
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [develop]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
restart_clang_tidy:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
actions: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Check last commit matches clang-tidy auto fixes
|
||||||
|
id: check
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
passed=$(if [[ $(git log -1 --pretty=format:%s | grep 'style: clang-tidy auto fixes') ]]; then echo 'true' ; else echo 'false' ; fi)
|
||||||
|
echo "passed=$passed" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Run clang-tidy workflow
|
||||||
|
if: ${{ contains(steps.check.outputs.passed, 'true') }}
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
GH_REPO: ${{ github.repository }}
|
||||||
|
run: gh workflow run clang-tidy.yml
|
||||||
49
.github/workflows/docs.yml
vendored
Normal file
49
.github/workflows/docs.yml
vendored
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
name: Documentation
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [develop]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pages: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: "pages"
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
deploy:
|
||||||
|
environment:
|
||||||
|
name: github-pages
|
||||||
|
url: ${{ steps.deployment.outputs.page_url }}
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
continue-on-error: true
|
||||||
|
container:
|
||||||
|
image: rippleci/clio_ci:latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
lfs: true
|
||||||
|
|
||||||
|
- name: Build docs
|
||||||
|
run: |
|
||||||
|
mkdir -p build_docs && cd build_docs
|
||||||
|
cmake ../docs && cmake --build . --target docs
|
||||||
|
|
||||||
|
- name: Setup Pages
|
||||||
|
uses: actions/configure-pages@v4
|
||||||
|
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-pages-artifact@v3
|
||||||
|
with:
|
||||||
|
path: build_docs/html
|
||||||
|
name: docs-develop
|
||||||
|
|
||||||
|
- name: Deploy to GitHub Pages
|
||||||
|
id: deployment
|
||||||
|
uses: actions/deploy-pages@v4
|
||||||
|
with:
|
||||||
|
artifact_name: docs-develop
|
||||||
194
.github/workflows/nightly.yml
vendored
Normal file
194
.github/workflows/nightly.yml
vendored
Normal file
@@ -0,0 +1,194 @@
|
|||||||
|
name: Nightly release
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 5 * * 1-5'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Build clio
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- os: macos14
|
||||||
|
build_type: Release
|
||||||
|
- os: heavy
|
||||||
|
build_type: Release
|
||||||
|
container:
|
||||||
|
image: rippleci/clio_ci:latest
|
||||||
|
- os: heavy
|
||||||
|
build_type: Debug
|
||||||
|
container:
|
||||||
|
image: rippleci/clio_ci:latest
|
||||||
|
runs-on: [self-hosted, "${{ matrix.os }}"]
|
||||||
|
container: ${{ matrix.container }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Clean workdir
|
||||||
|
if: ${{ runner.os == 'macOS' }}
|
||||||
|
uses: kuznetsss/workspace-cleanup@1.0
|
||||||
|
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Prepare runner
|
||||||
|
uses: ./.github/actions/prepare_runner
|
||||||
|
with:
|
||||||
|
disable_ccache: true
|
||||||
|
|
||||||
|
- name: Setup conan
|
||||||
|
uses: ./.github/actions/setup_conan
|
||||||
|
id: conan
|
||||||
|
with:
|
||||||
|
conan_profile: gcc
|
||||||
|
|
||||||
|
- name: Run conan and cmake
|
||||||
|
uses: ./.github/actions/generate
|
||||||
|
with:
|
||||||
|
conan_profile: ${{ steps.conan.outputs.conan_profile }}
|
||||||
|
conan_cache_hit: ${{ steps.restore_cache.outputs.conan_cache_hit }}
|
||||||
|
build_type: ${{ matrix.build_type }}
|
||||||
|
|
||||||
|
- name: Build Clio
|
||||||
|
uses: ./.github/actions/build_clio
|
||||||
|
|
||||||
|
- name: Strip tests
|
||||||
|
run: strip build/clio_tests && strip build/clio_integration_tests
|
||||||
|
|
||||||
|
- name: Upload clio_tests
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: clio_tests_${{ runner.os }}_${{ matrix.build_type }}
|
||||||
|
path: build/clio_*tests
|
||||||
|
|
||||||
|
- name: Compress clio_server
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
cd build
|
||||||
|
tar czf ./clio_server_${{ runner.os }}_${{ matrix.build_type }}.tar.gz ./clio_server
|
||||||
|
|
||||||
|
- name: Upload clio_server
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: clio_server_${{ runner.os }}_${{ matrix.build_type }}
|
||||||
|
path: build/clio_server_${{ runner.os }}_${{ matrix.build_type }}.tar.gz
|
||||||
|
|
||||||
|
|
||||||
|
run_tests:
|
||||||
|
needs: build
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- os: macos14
|
||||||
|
build_type: Release
|
||||||
|
integration_tests: false
|
||||||
|
- os: heavy
|
||||||
|
build_type: Release
|
||||||
|
container:
|
||||||
|
image: rippleci/clio_ci:latest
|
||||||
|
integration_tests: true
|
||||||
|
- os: heavy
|
||||||
|
build_type: Debug
|
||||||
|
container:
|
||||||
|
image: rippleci/clio_ci:latest
|
||||||
|
integration_tests: true
|
||||||
|
runs-on: [self-hosted, "${{ matrix.os }}"]
|
||||||
|
container: ${{ matrix.container }}
|
||||||
|
|
||||||
|
services:
|
||||||
|
scylladb:
|
||||||
|
image: ${{ (matrix.integration_tests) && 'scylladb/scylla' || '' }}
|
||||||
|
options: >-
|
||||||
|
--health-cmd "cqlsh -e 'describe cluster'"
|
||||||
|
--health-interval 10s
|
||||||
|
--health-timeout 5s
|
||||||
|
--health-retries 5
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Clean workdir
|
||||||
|
if: ${{ runner.os == 'macOS' }}
|
||||||
|
uses: kuznetsss/workspace-cleanup@1.0
|
||||||
|
|
||||||
|
- uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: clio_tests_${{ runner.os }}_${{ matrix.build_type }}
|
||||||
|
|
||||||
|
- name: Run clio_tests
|
||||||
|
run: |
|
||||||
|
chmod +x ./clio_tests
|
||||||
|
./clio_tests
|
||||||
|
|
||||||
|
# To be enabled back once docker in mac runner arrives
|
||||||
|
# https://github.com/XRPLF/clio/issues/1400
|
||||||
|
- name: Run clio_integration_tests
|
||||||
|
if: matrix.integration_tests
|
||||||
|
run: |
|
||||||
|
chmod +x ./clio_integration_tests
|
||||||
|
./clio_integration_tests --backend_host=scylladb
|
||||||
|
|
||||||
|
nightly_release:
|
||||||
|
needs: run_tests
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
env:
|
||||||
|
GH_REPO: ${{ github.repository }}
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
path: nightly_release
|
||||||
|
|
||||||
|
- name: Prepare files
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
cp ${{ github.workspace }}/.github/workflows/nightly_notes.md "${RUNNER_TEMP}/nightly_notes.md"
|
||||||
|
cd nightly_release
|
||||||
|
rm -r clio_*tests*
|
||||||
|
for d in $(ls); do
|
||||||
|
archive_name=$(ls $d)
|
||||||
|
mv ${d}/${archive_name} ./
|
||||||
|
rm -r $d
|
||||||
|
sha256sum ./$archive_name > ./${archive_name}.sha256sum
|
||||||
|
cat ./$archive_name.sha256sum >> "${RUNNER_TEMP}/nightly_notes.md"
|
||||||
|
done
|
||||||
|
echo '```' >> "${RUNNER_TEMP}/nightly_notes.md"
|
||||||
|
|
||||||
|
- name: Remove current nightly release and nightly tag
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
gh release delete nightly --yes || true
|
||||||
|
git push origin :nightly || true
|
||||||
|
|
||||||
|
- name: Publish nightly release
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
gh release create nightly --prerelease --title "Clio development (nightly) build" \
|
||||||
|
--target $GITHUB_SHA --notes-file "${RUNNER_TEMP}/nightly_notes.md" \
|
||||||
|
./nightly_release/clio_server*
|
||||||
|
|
||||||
|
create_issue_on_failure:
|
||||||
|
needs: [build, run_tests, nightly_release]
|
||||||
|
if: ${{ always() && contains(needs.*.result, 'failure') }}
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
issues: write
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Create an issue
|
||||||
|
uses: ./.github/actions/create_issue
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
with:
|
||||||
|
title: 'Nightly release failed 🌙'
|
||||||
|
body: >
|
||||||
|
Nightly release failed:
|
||||||
|
|
||||||
|
Workflow: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}/
|
||||||
6
.github/workflows/nightly_notes.md
vendored
Normal file
6
.github/workflows/nightly_notes.md
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
> **Note:** Please remember that this is a development release and it is not recommended for production use.
|
||||||
|
|
||||||
|
Changelog (including previous releases): https://github.com/XRPLF/clio/commits/nightly
|
||||||
|
|
||||||
|
## SHA256 checksums
|
||||||
|
```
|
||||||
47
.github/workflows/update_docker_ci.yml
vendored
Normal file
47
.github/workflows/update_docker_ci.yml
vendored
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
name: Update CI docker image
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- 'docker/ci/**'
|
||||||
|
- 'docker/compilers/**'
|
||||||
|
- .github/workflows/update_docker_ci.yml
|
||||||
|
push:
|
||||||
|
branches: [develop]
|
||||||
|
paths:
|
||||||
|
- 'docker/ci/**' # CI image must update when either its dockerfile changes
|
||||||
|
- 'docker/compilers/**' # or any compilers changed and were pushed by hand
|
||||||
|
- .github/workflows/update_docker_ci.yml
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build_and_push:
|
||||||
|
name: Build and push docker image
|
||||||
|
runs-on: [self-hosted, heavy]
|
||||||
|
steps:
|
||||||
|
- name: Login to DockerHub
|
||||||
|
if: ${{ github.event_name != 'pull_request' }}
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USER }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_PW }}
|
||||||
|
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: docker/setup-qemu-action@v3
|
||||||
|
- uses: docker/setup-buildx-action@v3
|
||||||
|
- uses: docker/metadata-action@v5
|
||||||
|
id: meta
|
||||||
|
with:
|
||||||
|
images: rippleci/clio_ci
|
||||||
|
tags: |
|
||||||
|
type=raw,value=latest
|
||||||
|
type=raw,value=gcc_12_clang_16
|
||||||
|
type=raw,value=${{ env.GITHUB_SHA }}
|
||||||
|
|
||||||
|
- name: Build and push
|
||||||
|
uses: docker/build-push-action@v5
|
||||||
|
with:
|
||||||
|
context: ${{ github.workspace }}/docker/ci
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
|
||||||
35
.github/workflows/upload_coverage_report.yml
vendored
Normal file
35
.github/workflows/upload_coverage_report.yml
vendored
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
name: Upload report
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
workflow_call:
|
||||||
|
secrets:
|
||||||
|
CODECOV_TOKEN:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
upload_report:
|
||||||
|
name: Upload report
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Download report artifact
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: coverage-report.xml
|
||||||
|
path: build
|
||||||
|
|
||||||
|
- name: Upload coverage report
|
||||||
|
if: ${{ hashFiles('build/coverage_report.xml') != '' }}
|
||||||
|
uses: wandalen/wretry.action@v1.4.10
|
||||||
|
with:
|
||||||
|
action: codecov/codecov-action@v4
|
||||||
|
with: |
|
||||||
|
files: build/coverage_report.xml
|
||||||
|
fail_ci_if_error: false
|
||||||
|
verbose: true
|
||||||
|
token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
attempt_limit: 5
|
||||||
|
attempt_delay: 10000
|
||||||
10
.gitignore
vendored
10
.gitignore
vendored
@@ -1,3 +1,11 @@
|
|||||||
*clio*.log
|
*clio*.log
|
||||||
build/
|
/build*/
|
||||||
|
.devcontainer
|
||||||
|
.build
|
||||||
|
.cache
|
||||||
|
.vscode
|
||||||
.python-version
|
.python-version
|
||||||
|
.DS_Store
|
||||||
|
CMakeUserPresets.json
|
||||||
|
config.json
|
||||||
|
src/main/impl/Build.cpp
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
#[===================================================================[
|
|
||||||
read version from source
|
|
||||||
#]===================================================================]
|
|
||||||
|
|
||||||
file (STRINGS src/main/impl/Build.cpp BUILD_INFO)
|
|
||||||
foreach (line_ ${BUILD_INFO})
|
|
||||||
if (line_ MATCHES "versionString[ ]*=[ ]*\"(.+)\"")
|
|
||||||
set (clio_version ${CMAKE_MATCH_1})
|
|
||||||
endif ()
|
|
||||||
endforeach ()
|
|
||||||
if (clio_version)
|
|
||||||
message (STATUS "clio version: ${clio_version}")
|
|
||||||
else ()
|
|
||||||
message (FATAL_ERROR "unable to determine clio version")
|
|
||||||
endif ()
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
set(Boost_USE_STATIC_LIBS ON)
|
|
||||||
set(Boost_USE_STATIC_RUNTIME ON)
|
|
||||||
|
|
||||||
find_package(Boost 1.75 COMPONENTS filesystem log_setup log thread system REQUIRED)
|
|
||||||
|
|
||||||
target_link_libraries(clio PUBLIC ${Boost_LIBRARIES})
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
set(POSTGRES_INSTALL_DIR ${CMAKE_BINARY_DIR}/postgres)
|
|
||||||
set(POSTGRES_LIBS pq pgcommon pgport)
|
|
||||||
ExternalProject_Add(postgres
|
|
||||||
GIT_REPOSITORY https://github.com/postgres/postgres.git
|
|
||||||
GIT_TAG REL_14_1
|
|
||||||
GIT_SHALLOW 1
|
|
||||||
LOG_CONFIGURE 1
|
|
||||||
LOG_BUILD 1
|
|
||||||
CONFIGURE_COMMAND ./configure --prefix ${POSTGRES_INSTALL_DIR} --without-readline --verbose
|
|
||||||
BUILD_COMMAND ${CMAKE_COMMAND} -E env --unset=MAKELEVEL make VERBOSE=${CMAKE_VERBOSE_MAKEFILE} -j32
|
|
||||||
BUILD_IN_SOURCE 1
|
|
||||||
INSTALL_COMMAND ${CMAKE_COMMAND} -E env make -s --no-print-directory install
|
|
||||||
UPDATE_COMMAND ""
|
|
||||||
BUILD_BYPRODUCTS
|
|
||||||
${POSTGRES_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}pq${CMAKE_STATIC_LIBRARY_SUFFIX}}
|
|
||||||
${POSTGRES_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}pgcommon${CMAKE_STATIC_LIBRARY_SUFFIX}}
|
|
||||||
${POSTGRES_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}pgport${CMAKE_STATIC_LIBRARY_SUFFIX}}
|
|
||||||
)
|
|
||||||
ExternalProject_Get_Property (postgres BINARY_DIR)
|
|
||||||
|
|
||||||
foreach(_lib ${POSTGRES_LIBS})
|
|
||||||
add_library(${_lib} STATIC IMPORTED GLOBAL)
|
|
||||||
add_dependencies(${_lib} postgres)
|
|
||||||
set_target_properties(${_lib} PROPERTIES
|
|
||||||
IMPORTED_LOCATION ${POSTGRES_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}${_lib}.a)
|
|
||||||
set_target_properties(${_lib} PROPERTIES
|
|
||||||
INTERFACE_INCLUDE_DIRECTORIES ${POSTGRES_INSTALL_DIR}/include)
|
|
||||||
target_link_libraries(clio PUBLIC ${POSTGRES_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}${_lib}${CMAKE_STATIC_LIBRARY_SUFFIX})
|
|
||||||
endforeach()
|
|
||||||
add_dependencies(clio postgres)
|
|
||||||
target_include_directories(clio PUBLIC ${POSTGRES_INSTALL_DIR}/include)
|
|
||||||
@@ -1,151 +0,0 @@
|
|||||||
find_package(ZLIB REQUIRED)
|
|
||||||
|
|
||||||
find_library(cassandra NAMES cassandra)
|
|
||||||
if(NOT cassandra)
|
|
||||||
message("System installed Cassandra cpp driver not found. Will build")
|
|
||||||
find_library(zlib NAMES zlib1g-dev zlib-devel zlib z)
|
|
||||||
if(NOT zlib)
|
|
||||||
message("zlib not found. will build")
|
|
||||||
add_library(zlib STATIC IMPORTED GLOBAL)
|
|
||||||
ExternalProject_Add(zlib_src
|
|
||||||
PREFIX ${nih_cache_path}
|
|
||||||
GIT_REPOSITORY https://github.com/madler/zlib.git
|
|
||||||
GIT_TAG v1.2.12
|
|
||||||
INSTALL_COMMAND ""
|
|
||||||
BUILD_BYPRODUCTS <BINARY_DIR>/${CMAKE_STATIC_LIBRARY_PREFIX}z.a
|
|
||||||
)
|
|
||||||
ExternalProject_Get_Property (zlib_src SOURCE_DIR)
|
|
||||||
ExternalProject_Get_Property (zlib_src BINARY_DIR)
|
|
||||||
set (zlib_src_SOURCE_DIR "${SOURCE_DIR}")
|
|
||||||
file (MAKE_DIRECTORY ${zlib_src_SOURCE_DIR}/include)
|
|
||||||
set_target_properties (zlib PROPERTIES
|
|
||||||
IMPORTED_LOCATION
|
|
||||||
${BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}z.a
|
|
||||||
INTERFACE_INCLUDE_DIRECTORIES
|
|
||||||
${SOURCE_DIR}/include)
|
|
||||||
add_dependencies(zlib zlib_src)
|
|
||||||
file(TO_CMAKE_PATH "${zlib_src_SOURCE_DIR}" zlib_src_SOURCE_DIR)
|
|
||||||
endif()
|
|
||||||
find_library(krb5 NAMES krb5-dev libkrb5-dev)
|
|
||||||
if(NOT krb5)
|
|
||||||
message("krb5 not found. will build")
|
|
||||||
add_library(krb5 STATIC IMPORTED GLOBAL)
|
|
||||||
ExternalProject_Add(krb5_src
|
|
||||||
PREFIX ${nih_cache_path}
|
|
||||||
GIT_REPOSITORY https://github.com/krb5/krb5.git
|
|
||||||
GIT_TAG krb5-1.20
|
|
||||||
UPDATE_COMMAND ""
|
|
||||||
CONFIGURE_COMMAND autoreconf src && CFLAGS=-fcommon ./src/configure --enable-static --disable-shared
|
|
||||||
BUILD_IN_SOURCE 1
|
|
||||||
BUILD_COMMAND make
|
|
||||||
INSTALL_COMMAND ""
|
|
||||||
BUILD_BYPRODUCTS <SOURCE_DIR>/lib/${CMAKE_STATIC_LIBRARY_PREFIX}krb5.a
|
|
||||||
)
|
|
||||||
message(${ep_lib_prefix}/krb5.a)
|
|
||||||
message(${CMAKE_STATIC_LIBRARY_PREFIX}krb5.a)
|
|
||||||
ExternalProject_Get_Property (krb5_src SOURCE_DIR)
|
|
||||||
ExternalProject_Get_Property (krb5_src BINARY_DIR)
|
|
||||||
set (krb5_src_SOURCE_DIR "${SOURCE_DIR}")
|
|
||||||
file (MAKE_DIRECTORY ${krb5_src_SOURCE_DIR}/include)
|
|
||||||
set_target_properties (krb5 PROPERTIES
|
|
||||||
IMPORTED_LOCATION
|
|
||||||
${SOURCE_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}krb5.a
|
|
||||||
INTERFACE_INCLUDE_DIRECTORIES
|
|
||||||
${SOURCE_DIR}/include)
|
|
||||||
add_dependencies(krb5 krb5_src)
|
|
||||||
file(TO_CMAKE_PATH "${krb5_src_SOURCE_DIR}" krb5_src_SOURCE_DIR)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
find_library(libuv1 NAMES uv1 libuv1 liubuv1-dev libuv1:amd64)
|
|
||||||
|
|
||||||
|
|
||||||
if(NOT libuv1)
|
|
||||||
message("libuv1 not found, will build")
|
|
||||||
add_library(libuv1 STATIC IMPORTED GLOBAL)
|
|
||||||
ExternalProject_Add(libuv_src
|
|
||||||
PREFIX ${nih_cache_path}
|
|
||||||
GIT_REPOSITORY https://github.com/libuv/libuv.git
|
|
||||||
GIT_TAG v1.44.1
|
|
||||||
INSTALL_COMMAND ""
|
|
||||||
BUILD_BYPRODUCTS <BINARY_DIR>/${CMAKE_STATIC_LIBRARY_PREFIX}uv_a.a
|
|
||||||
)
|
|
||||||
|
|
||||||
ExternalProject_Get_Property (libuv_src SOURCE_DIR)
|
|
||||||
ExternalProject_Get_Property (libuv_src BINARY_DIR)
|
|
||||||
set (libuv_src_SOURCE_DIR "${SOURCE_DIR}")
|
|
||||||
file (MAKE_DIRECTORY ${libuv_src_SOURCE_DIR}/include)
|
|
||||||
|
|
||||||
set_target_properties (libuv1 PROPERTIES
|
|
||||||
IMPORTED_LOCATION
|
|
||||||
${BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}uv_a.a
|
|
||||||
INTERFACE_INCLUDE_DIRECTORIES
|
|
||||||
${SOURCE_DIR}/include)
|
|
||||||
add_dependencies(libuv1 libuv_src)
|
|
||||||
|
|
||||||
file(TO_CMAKE_PATH "${libuv_src_SOURCE_DIR}" libuv_src_SOURCE_DIR)
|
|
||||||
endif()
|
|
||||||
add_library (cassandra STATIC IMPORTED GLOBAL)
|
|
||||||
ExternalProject_Add(cassandra_src
|
|
||||||
PREFIX ${nih_cache_path}
|
|
||||||
GIT_REPOSITORY https://github.com/datastax/cpp-driver.git
|
|
||||||
GIT_TAG 2.16.2
|
|
||||||
CMAKE_ARGS
|
|
||||||
-DLIBUV_ROOT_DIR=${BINARY_DIR}
|
|
||||||
-DLIBUV_INCLUDE_DIR=${SOURCE_DIR}/include
|
|
||||||
-DCASS_BUILD_STATIC=ON
|
|
||||||
-DCASS_BUILD_SHARED=OFF
|
|
||||||
INSTALL_COMMAND ""
|
|
||||||
BUILD_BYPRODUCTS <BINARY_DIR>/${CMAKE_STATIC_LIBRARY_PREFIX}cassandra_static.a
|
|
||||||
)
|
|
||||||
|
|
||||||
ExternalProject_Get_Property (cassandra_src SOURCE_DIR)
|
|
||||||
ExternalProject_Get_Property (cassandra_src BINARY_DIR)
|
|
||||||
set (cassandra_src_SOURCE_DIR "${SOURCE_DIR}")
|
|
||||||
file (MAKE_DIRECTORY ${cassandra_src_SOURCE_DIR}/include)
|
|
||||||
|
|
||||||
set_target_properties (cassandra PROPERTIES
|
|
||||||
IMPORTED_LOCATION
|
|
||||||
${BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}cassandra_static.a
|
|
||||||
INTERFACE_INCLUDE_DIRECTORIES
|
|
||||||
${SOURCE_DIR}/include)
|
|
||||||
message("cass dirs")
|
|
||||||
message(${BINARY_DIR})
|
|
||||||
message(${SOURCE_DIR})
|
|
||||||
message(${BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}cassandra_static.a)
|
|
||||||
add_dependencies(cassandra cassandra_src)
|
|
||||||
|
|
||||||
if(NOT libuv1)
|
|
||||||
ExternalProject_Add_StepDependencies(cassandra_src build libuv1)
|
|
||||||
target_link_libraries(cassandra INTERFACE libuv1)
|
|
||||||
else()
|
|
||||||
target_link_libraries(cassandra INTERFACE ${libuv1})
|
|
||||||
endif()
|
|
||||||
if(NOT krb5)
|
|
||||||
|
|
||||||
ExternalProject_Add_StepDependencies(cassandra_src build krb5)
|
|
||||||
target_link_libraries(cassandra INTERFACE krb5)
|
|
||||||
else()
|
|
||||||
target_link_libraries(cassandra INTERFACE ${krb5})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT zlib)
|
|
||||||
ExternalProject_Add_StepDependencies(cassandra_src build zlib)
|
|
||||||
target_link_libraries(cassandra INTERFACE zlib)
|
|
||||||
else()
|
|
||||||
target_link_libraries(cassandra INTERFACE ${zlib})
|
|
||||||
endif()
|
|
||||||
set(OPENSSL_USE_STATIC_LIBS TRUE)
|
|
||||||
find_package(OpenSSL REQUIRED)
|
|
||||||
target_link_libraries(cassandra INTERFACE OpenSSL::SSL)
|
|
||||||
|
|
||||||
file(TO_CMAKE_PATH "${cassandra_src_SOURCE_DIR}" cassandra_src_SOURCE_DIR)
|
|
||||||
target_link_libraries(clio PUBLIC cassandra)
|
|
||||||
else()
|
|
||||||
message("Found system installed cassandra cpp driver")
|
|
||||||
message(${cassandra})
|
|
||||||
|
|
||||||
find_path(cassandra_includes NAMES cassandra.h REQUIRED)
|
|
||||||
target_link_libraries (clio PUBLIC ${cassandra})
|
|
||||||
target_include_directories(clio INTERFACE ${cassandra_includes})
|
|
||||||
endif()
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
FetchContent_Declare(
|
|
||||||
googletest
|
|
||||||
URL https://github.com/google/googletest/archive/609281088cfefc76f9d0ce82e1ff6c30cc3591e5.zip
|
|
||||||
)
|
|
||||||
|
|
||||||
FetchContent_GetProperties(googletest)
|
|
||||||
|
|
||||||
if(NOT googletest_POPULATED)
|
|
||||||
FetchContent_Populate(googletest)
|
|
||||||
add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR} EXCLUDE_FROM_ALL)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
target_link_libraries(clio_tests PUBLIC clio gtest_main)
|
|
||||||
|
|
||||||
enable_testing()
|
|
||||||
|
|
||||||
include(GoogleTest)
|
|
||||||
|
|
||||||
gtest_discover_tests(clio_tests)
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
set(RIPPLED_REPO "https://github.com/ripple/rippled.git")
|
|
||||||
set(RIPPLED_BRANCH "1.9.0")
|
|
||||||
set(NIH_CACHE_ROOT "${CMAKE_CURRENT_BINARY_DIR}" CACHE INTERNAL "")
|
|
||||||
message(STATUS "Cloning ${RIPPLED_REPO} branch ${RIPPLED_BRANCH}")
|
|
||||||
FetchContent_Declare(rippled
|
|
||||||
GIT_REPOSITORY "${RIPPLED_REPO}"
|
|
||||||
GIT_TAG "${RIPPLED_BRANCH}"
|
|
||||||
GIT_SHALLOW ON
|
|
||||||
)
|
|
||||||
|
|
||||||
FetchContent_GetProperties(rippled)
|
|
||||||
if(NOT rippled_POPULATED)
|
|
||||||
FetchContent_Populate(rippled)
|
|
||||||
add_subdirectory(${rippled_SOURCE_DIR} ${rippled_BINARY_DIR} EXCLUDE_FROM_ALL)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
target_link_libraries(clio PUBLIC xrpl_core grpc_pbufs)
|
|
||||||
target_include_directories(clio PUBLIC ${rippled_SOURCE_DIR}/src ) # TODO: Seems like this shouldn't be needed?
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-narrowing -Wall -Werror -Wno-dangling-else")
|
|
||||||
170
CMakeLists.txt
170
CMakeLists.txt
@@ -1,105 +1,87 @@
|
|||||||
cmake_minimum_required(VERSION 3.16.3)
|
cmake_minimum_required(VERSION 3.20)
|
||||||
|
|
||||||
project(clio)
|
set(CMAKE_PROJECT_INCLUDE_BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/cmake/ClioVersion.cmake)
|
||||||
|
|
||||||
option(BUILD_TESTS "Build tests" TRUE)
|
project(clio VERSION ${CLIO_VERSION} HOMEPAGE_URL "https://github.com/XRPLF/clio"
|
||||||
|
DESCRIPTION "An XRP Ledger API Server"
|
||||||
|
)
|
||||||
|
|
||||||
option(VERBOSE "Verbose build" TRUE)
|
# =========================== Options ====================================== #
|
||||||
if(VERBOSE)
|
option(verbose "Verbose build" FALSE)
|
||||||
|
option(tests "Build unit tests" FALSE)
|
||||||
|
option(integration_tests "Build integration tests" FALSE)
|
||||||
|
option(benchmark "Build benchmarks" FALSE)
|
||||||
|
option(docs "Generate doxygen docs" FALSE)
|
||||||
|
option(coverage "Build test coverage report" FALSE)
|
||||||
|
option(packaging "Create distribution packages" FALSE)
|
||||||
|
option(lint "Run clang-tidy checks during compilation" FALSE)
|
||||||
|
option(static "Statically linked Clio" FALSE)
|
||||||
|
# ========================================================================== #
|
||||||
|
set(san "" CACHE STRING "Add sanitizer instrumentation")
|
||||||
|
set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)
|
||||||
|
set_property(CACHE san PROPERTY STRINGS ";undefined;memory;address;thread")
|
||||||
|
# ========================================================================== #
|
||||||
|
|
||||||
|
set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
|
||||||
|
|
||||||
|
# Include required modules
|
||||||
|
include(Ccache)
|
||||||
|
include(CheckCXXCompilerFlag)
|
||||||
|
include(ClangTidy)
|
||||||
|
|
||||||
|
add_library(clio_options INTERFACE)
|
||||||
|
target_compile_features(clio_options INTERFACE cxx_std_23) # Clio needs c++23 but deps can remain c++20 for now
|
||||||
|
target_include_directories(clio_options INTERFACE ${CMAKE_SOURCE_DIR}/src)
|
||||||
|
|
||||||
|
if (verbose)
|
||||||
set(CMAKE_VERBOSE_MAKEFILE TRUE)
|
set(CMAKE_VERBOSE_MAKEFILE TRUE)
|
||||||
set(FETCHCONTENT_QUIET FALSE CACHE STRING "Verbose FetchContent()")
|
endif ()
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT GIT_COMMIT_HASH)
|
if (packaging)
|
||||||
if(VERBOSE)
|
add_definitions(-DPKG=1)
|
||||||
message(WARNING "GIT_COMMIT_HASH not provided...looking for git")
|
target_compile_definitions(clio_options INTERFACE PKG=1)
|
||||||
endif()
|
endif ()
|
||||||
find_package(Git)
|
|
||||||
if(Git_FOUND)
|
|
||||||
execute_process(COMMAND ${GIT_EXECUTABLE} describe --always --abbrev=8
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE gch)
|
|
||||||
if(gch)
|
|
||||||
set(GIT_COMMIT_HASH "${gch}")
|
|
||||||
message(STATUS "Git commit: ${GIT_COMMIT_HASH}")
|
|
||||||
add_definitions(-DCLIO_GIT_COMMIT_HASH="${GIT_COMMIT_HASH}")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif() #git
|
|
||||||
|
|
||||||
add_library(clio)
|
# Clio tweaks and checks
|
||||||
target_compile_features(clio PUBLIC cxx_std_20)
|
include(CheckCompiler)
|
||||||
target_include_directories(clio PUBLIC src)
|
include(Settings)
|
||||||
|
include(SourceLocation)
|
||||||
|
|
||||||
include(FetchContent)
|
# Clio deps
|
||||||
include(ExternalProject)
|
include(deps/libxrpl)
|
||||||
include(CMake/settings.cmake)
|
include(deps/Boost)
|
||||||
include(CMake/ClioVersion.cmake)
|
include(deps/OpenSSL)
|
||||||
include(CMake/deps/rippled.cmake)
|
include(deps/Threads)
|
||||||
include(CMake/deps/Boost.cmake)
|
include(deps/libfmt)
|
||||||
include(CMake/deps/cassandra.cmake)
|
include(deps/cassandra)
|
||||||
include(CMake/deps/Postgres.cmake)
|
include(deps/libbacktrace)
|
||||||
|
|
||||||
target_sources(clio PRIVATE
|
add_subdirectory(src)
|
||||||
## Main
|
add_subdirectory(tests)
|
||||||
src/main/impl/Build.cpp
|
|
||||||
## Backend
|
|
||||||
src/backend/BackendInterface.cpp
|
|
||||||
src/backend/CassandraBackend.cpp
|
|
||||||
src/backend/Pg.cpp
|
|
||||||
src/backend/PostgresBackend.cpp
|
|
||||||
src/backend/SimpleCache.cpp
|
|
||||||
## ETL
|
|
||||||
src/etl/ETLSource.cpp
|
|
||||||
src/etl/ReportingETL.cpp
|
|
||||||
## Subscriptions
|
|
||||||
src/subscriptions/SubscriptionManager.cpp
|
|
||||||
## RPC
|
|
||||||
src/rpc/RPC.cpp
|
|
||||||
src/rpc/RPCHelpers.cpp
|
|
||||||
src/rpc/Counters.cpp
|
|
||||||
src/rpc/WorkQueue.cpp
|
|
||||||
## RPC Methods
|
|
||||||
# Account
|
|
||||||
src/rpc/handlers/AccountChannels.cpp
|
|
||||||
src/rpc/handlers/AccountCurrencies.cpp
|
|
||||||
src/rpc/handlers/AccountInfo.cpp
|
|
||||||
src/rpc/handlers/AccountLines.cpp
|
|
||||||
src/rpc/handlers/AccountOffers.cpp
|
|
||||||
src/rpc/handlers/AccountObjects.cpp
|
|
||||||
src/rpc/handlers/GatewayBalances.cpp
|
|
||||||
src/rpc/handlers/NoRippleCheck.cpp
|
|
||||||
# Ledger
|
|
||||||
src/rpc/handlers/Ledger.cpp
|
|
||||||
src/rpc/handlers/LedgerData.cpp
|
|
||||||
src/rpc/handlers/LedgerEntry.cpp
|
|
||||||
src/rpc/handlers/LedgerRange.cpp
|
|
||||||
# Transaction
|
|
||||||
src/rpc/handlers/Tx.cpp
|
|
||||||
src/rpc/handlers/TransactionEntry.cpp
|
|
||||||
src/rpc/handlers/AccountTx.cpp
|
|
||||||
# Dex
|
|
||||||
src/rpc/handlers/BookOffers.cpp
|
|
||||||
# NFT
|
|
||||||
src/rpc/handlers/NFTOffers.cpp
|
|
||||||
# Payment Channel
|
|
||||||
src/rpc/handlers/ChannelAuthorize.cpp
|
|
||||||
src/rpc/handlers/ChannelVerify.cpp
|
|
||||||
# Subscribe
|
|
||||||
src/rpc/handlers/Subscribe.cpp
|
|
||||||
# Server
|
|
||||||
src/rpc/handlers/ServerInfo.cpp
|
|
||||||
# Utility
|
|
||||||
src/rpc/handlers/Random.cpp)
|
|
||||||
|
|
||||||
add_executable(clio_server src/main/main.cpp)
|
if (benchmark)
|
||||||
target_link_libraries(clio_server PUBLIC clio)
|
add_subdirectory(benchmarks)
|
||||||
|
endif ()
|
||||||
|
|
||||||
if(BUILD_TESTS)
|
# Enable selected sanitizer if enabled via `san`
|
||||||
add_executable(clio_tests unittests/main.cpp)
|
if (san)
|
||||||
include(CMake/deps/gtest.cmake)
|
target_compile_options(
|
||||||
endif()
|
clio PUBLIC # Sanitizers recommend minimum of -O1 for reasonable performance
|
||||||
|
$<$<CONFIG:Debug>:-O1> ${SAN_FLAG} -fno-omit-frame-pointer
|
||||||
|
)
|
||||||
|
target_compile_definitions(
|
||||||
|
clio PUBLIC $<$<STREQUAL:${san},address>:SANITIZER=ASAN> $<$<STREQUAL:${san},thread>:SANITIZER=TSAN>
|
||||||
|
$<$<STREQUAL:${san},memory>:SANITIZER=MSAN> $<$<STREQUAL:${san},undefined>:SANITIZER=UBSAN>
|
||||||
|
)
|
||||||
|
target_link_libraries(clio INTERFACE ${SAN_FLAG} ${SAN_LIB})
|
||||||
|
endif ()
|
||||||
|
|
||||||
include(CMake/install/install.cmake)
|
# Generate `docs` target for doxygen documentation if enabled Note: use `make docs` to generate the documentation
|
||||||
if(PACKAGING)
|
if (docs)
|
||||||
include(CMake/packaging.cmake)
|
add_subdirectory(docs)
|
||||||
endif()
|
endif ()
|
||||||
|
|
||||||
|
include(install/install)
|
||||||
|
if (packaging)
|
||||||
|
include(cmake/packaging.cmake) # This file exists only in build runner
|
||||||
|
endif ()
|
||||||
|
|||||||
155
CONTRIBUTING.md
Normal file
155
CONTRIBUTING.md
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
# Contributing
|
||||||
|
Thank you for your interest in contributing to the `clio` project 🙏
|
||||||
|
|
||||||
|
To contribute, please:
|
||||||
|
1. Fork the repository under your own user.
|
||||||
|
2. Create a new branch on which to commit/push your changes.
|
||||||
|
3. Write and test your code.
|
||||||
|
4. Ensure that your code compiles with the provided build engine and update the provided build engine as part of your PR where needed and where appropriate.
|
||||||
|
5. Where applicable, write test cases for your code and include those in the relevant subfolder under `tests`.
|
||||||
|
6. Ensure your code passes automated checks (e.g. clang-format)
|
||||||
|
7. Squash your commits (i.e. rebase) into as few commits as is reasonable to describe your changes at a high level (typically a single commit for a small change). See below for more details.
|
||||||
|
8. Open a PR to the main repository onto the _develop_ branch, and follow the provided template.
|
||||||
|
|
||||||
|
> **Note:** Please read the [Style guide](#style-guide).
|
||||||
|
|
||||||
|
## Install git hooks
|
||||||
|
Please run the following command in order to use git hooks that are helpful for `clio` development.
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
git config --local core.hooksPath .githooks
|
||||||
|
```
|
||||||
|
|
||||||
|
## Git hooks dependencies
|
||||||
|
The pre-commit hook requires `clang-format >= 18.0.0` and `cmake-format` to be installed on your machine.
|
||||||
|
`clang-format` can be installed using `brew` on macOS and default package manager on Linux.
|
||||||
|
`cmake-format` can be installed using `pip`.
|
||||||
|
The hook will also attempt to automatically use `doxygen` to verify that everything public in the codebase is covered by doc comments. If `doxygen` is not installed, the hook will raise a warning suggesting to install `doxygen` for future commits.
|
||||||
|
|
||||||
|
## Git commands
|
||||||
|
This sections offers a detailed look at the git commands you will need to use to get your PR submitted.
|
||||||
|
Please note that there are more than one way to do this and these commands are provided for your convenience.
|
||||||
|
At this point it's assumed that you have already finished working on your feature/bug.
|
||||||
|
|
||||||
|
> **Important:** Before you issue any of the commands below, please hit the `Sync fork` button and make sure your fork's `develop` branch is up-to-date with the main `clio` repository.
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
# Create a backup of your branch
|
||||||
|
git branch <your feature branch>_bk
|
||||||
|
|
||||||
|
# Rebase and squash commits into one
|
||||||
|
git checkout develop
|
||||||
|
git pull origin develop
|
||||||
|
git checkout <your feature branch>
|
||||||
|
git rebase -i develop
|
||||||
|
```
|
||||||
|
For each commit in the list other than the first one, enter `s` to squash.
|
||||||
|
After this is done, you will have the opportunity to write a message for the squashed commit.
|
||||||
|
|
||||||
|
> **Hint:** Please use **imperative mood** in the commit message, and capitalize the first word.
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
# You should now have a single commit on top of a commit in `develop`
|
||||||
|
git log
|
||||||
|
```
|
||||||
|
> **Note:** If there are merge conflicts, please resolve them now.
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
# Use the same commit message as you did above
|
||||||
|
git commit -m 'Your message'
|
||||||
|
git rebase --continue
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Important:** If you have no GPG keys set up, please follow [this tutorial](https://docs.github.com/en/authentication/managing-commit-signature-verification/adding-a-gpg-key-to-your-github-account)
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
# Sign the commit with your GPG key, and push your changes
|
||||||
|
git commit --amend -S
|
||||||
|
git push --force
|
||||||
|
```
|
||||||
|
|
||||||
|
## Use ccache (optional)
|
||||||
|
Clio uses `ccache` to speed up compilation. If you want to use it, please make sure it is installed on your machine.
|
||||||
|
CMake will automatically detect it and use it if it is available.
|
||||||
|
|
||||||
|
## Opening a pull request
|
||||||
|
When a pull request is open CI will perform checks on the new code.
|
||||||
|
Title of the pull request and squashed commit should follow [conventional commits specification](https://www.conventionalcommits.org/en/v1.0.0/).
|
||||||
|
|
||||||
|
## Fixing issues found during code review
|
||||||
|
While your code is in review, it's possible that some changes will be requested by reviewer(s).
|
||||||
|
This section describes the process of adding your fixes.
|
||||||
|
|
||||||
|
We assume that you already made the required changes on your feature branch.
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
# Add the changed code
|
||||||
|
git add <paths to add>
|
||||||
|
|
||||||
|
# Add a [FOLD] commit message (so you remember to squash it later)
|
||||||
|
# while also signing it with your GPG key
|
||||||
|
git commit -S -m "[FOLD] Your commit message"
|
||||||
|
|
||||||
|
# And finally push your changes
|
||||||
|
git push
|
||||||
|
```
|
||||||
|
|
||||||
|
## After code review
|
||||||
|
When your PR is approved and ready to merge, use `Squash and merge`.
|
||||||
|
The button for that is near the bottom of the PR's page on GitHub.
|
||||||
|
|
||||||
|
> **Important:** Please leave the automatically-generated mention/link to the PR in the subject line **and** in the description field add `"Fix #ISSUE_ID"` (replacing `ISSUE_ID` with yours) if the PR fixes an issue.
|
||||||
|
> **Note:** See [issues](https://github.com/XRPLF/clio/issues) to find the `ISSUE_ID` for the feature/bug you were working on.
|
||||||
|
|
||||||
|
# Style guide
|
||||||
|
This is a non-exhaustive list of recommended style guidelines. These are not always strictly enforced and serve as a way to keep the codebase coherent.
|
||||||
|
|
||||||
|
## Formatting
|
||||||
|
Code must conform to `clang-format` version 18, unless the result would be unreasonably difficult to read or maintain.
|
||||||
|
In most cases the pre-commit hook will take care of formatting and will fix any issues automatically.
|
||||||
|
To manually format your code, use `clang-format -i <your changed files>` for C++ files and `cmake-format -i <your changed files>` for CMake files.
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
All public namespaces, classes and functions must be covered by doc (`doxygen`) comments. Everything that is not within a nested `impl` namespace is considered public.
|
||||||
|
|
||||||
|
> **Note:** Keep in mind that this is enforced by Clio's CI and your build will fail if newly added public code lacks documentation.
|
||||||
|
|
||||||
|
## Avoid
|
||||||
|
* Proliferation of nearly identical code.
|
||||||
|
* Proliferation of new files and classes unless it improves readability or/and compilation time.
|
||||||
|
* Unmanaged memory allocation and raw pointers.
|
||||||
|
* Macros (unless they add significant value.)
|
||||||
|
* Lambda patterns (unless these add significant value.)
|
||||||
|
* CPU or architecture-specific code unless there is a good reason to include it, and where it is used guard it with macros and provide explanatory comments.
|
||||||
|
* Importing new libraries unless there is a very good reason to do so.
|
||||||
|
|
||||||
|
## Seek to
|
||||||
|
* Extend functionality of existing code rather than creating new code.
|
||||||
|
* Prefer readability over terseness where important logic is concerned.
|
||||||
|
* Inline functions that are not used or are not likely to be used elsewhere in the codebase.
|
||||||
|
* Use clear and self-explanatory names for functions, variables, structs and classes.
|
||||||
|
* Use TitleCase for classes, structs and filenames, camelCase for function and variable names, lower case for namespaces and folders.
|
||||||
|
* Provide as many comments as you feel that a competent programmer would need to understand what your code does.
|
||||||
|
|
||||||
|
# Maintainers
|
||||||
|
Maintainers are ecosystem participants with elevated access to the repository. They are able to push new code, make decisions on when a release should be made, etc.
|
||||||
|
|
||||||
|
## Code Review
|
||||||
|
A PR must be reviewed and approved by at least one of the maintainers before it can be merged.
|
||||||
|
|
||||||
|
## Adding and Removing
|
||||||
|
New maintainers can be proposed by two existing maintainers, subject to a vote by a quorum of the existing maintainers. A minimum of 50% support and a 50% participation is required. In the event of a tie vote, the addition of the new maintainer will be rejected.
|
||||||
|
|
||||||
|
Existing maintainers can resign, or be subject to a vote for removal at the behest of two existing maintainers. A minimum of 60% agreement and 50% participation are required. The XRP Ledger Foundation will have the ability, for cause, to remove an existing maintainer without a vote.
|
||||||
|
|
||||||
|
## Existing Maintainers
|
||||||
|
|
||||||
|
* [cindyyan317](https://github.com/cindyyan317) (Ripple)
|
||||||
|
* [godexsoft](https://github.com/godexsoft) (Ripple)
|
||||||
|
* [kuznetsss](https://github.com/kuznetsss) (Ripple)
|
||||||
|
* [legleux](https://github.com/legleux) (Ripple)
|
||||||
|
|
||||||
|
## Honorable ex-Maintainers
|
||||||
|
|
||||||
|
* [cjcobb23](https://github.com/cjcobb23) (ex-Ripple)
|
||||||
|
* [natenichols](https://github.com/natenichols) (ex-Ripple)
|
||||||
180
README.md
180
README.md
@@ -1,164 +1,50 @@
|
|||||||
# Clio
|
# <img src='./docs/img/xrpl-logo.svg' width='40' valign="top" /> Clio
|
||||||
Clio is an XRP Ledger API server. Clio is optimized for RPC calls, over WebSocket or JSON-RPC. Validated
|
|
||||||
historical ledger and transaction data are stored in a more space-efficient format,
|
|
||||||
using up to 4 times less space than rippled. Clio can be configured to store data in Apache Cassandra or ScyllaDB,
|
|
||||||
allowing for scalable read throughput. Multiple Clio nodes can share
|
|
||||||
access to the same dataset, allowing for a highly available cluster of Clio nodes,
|
|
||||||
without the need for redundant data storage or computation.
|
|
||||||
|
|
||||||
Clio offers the full rippled API, with the caveat that Clio by default only returns validated data.
|
[](https://github.com/XRPLF/clio/actions/workflows/build.yml?query=branch%3Adevelop)
|
||||||
This means that `ledger_index` defaults to `validated` instead of `current` for all requests.
|
[](https://github.com/XRPLF/clio/actions/workflows/nightly.yml?query=branch%3Adevelop)
|
||||||
Other non-validated data is also not returned, such as information about queued transactions.
|
[](https://github.com/XRPLF/clio/actions/workflows/clang-tidy.yml?query=branch%3Adevelop)
|
||||||
For requests that require access to the p2p network, such as `fee` or `submit`, Clio automatically forwards the request to a rippled node and propagates the response back to the client. To access non-validated data for *any* request, simply add `ledger_index: "current"` to the request, and Clio will forward the request to rippled.
|
[](https://app.codecov.io/gh/XRPLF/clio)
|
||||||
|
|
||||||
Clio does not connect to the peer-to-peer network. Instead, Clio extracts data from a group of specified rippled nodes. Running Clio requires access to at least one rippled node
|
Clio is an XRP Ledger API server optimized for RPC calls over WebSocket or JSON-RPC.
|
||||||
from which data can be extracted. The rippled node does not need to be running on the same machine as Clio.
|
It stores validated historical ledger and transaction data in a more space efficient format, and uses up to 4 times less space than [rippled](https://github.com/XRPLF/rippled).
|
||||||
|
|
||||||
|
Clio can be configured to store data in [Apache Cassandra](https://cassandra.apache.org/_/index.html) or [ScyllaDB](https://www.scylladb.com/), enabling scalable read throughput.
|
||||||
|
Multiple Clio nodes can share access to the same dataset, which allows for a highly available cluster of Clio nodes without the need for redundant data storage or computation.
|
||||||
|
|
||||||
## Requirements
|
## 📡 Clio and `rippled`
|
||||||
1. Access to a Cassandra cluster or ScyllaDB cluster. Can be local or remote.
|
|
||||||
|
|
||||||
2. Access to one or more rippled nodes. Can be local or remote.
|
Clio offers the full `rippled` API, with the caveat that Clio by default only returns validated data. This means that `ledger_index` defaults to `validated` instead of `current` for all requests. Other non-validated data, such as information about queued transactions, is also not returned.
|
||||||
|
|
||||||
## Building
|
Clio retrieves data from a designated group of `rippled` nodes instead of connecting to the peer-to-peer network.
|
||||||
|
For requests that require access to the peer-to-peer network, such as `fee` or `submit`, Clio automatically forwards the request to a `rippled` node and propagates the response back to the client. To access non-validated data for *any* request, simply add `ledger_index: "current"` to the request, and Clio will forward the request to `rippled`.
|
||||||
|
|
||||||
Clio is built with CMake. Clio requires c++20, and boost 1.75.0 or later.
|
> [!NOTE]
|
||||||
|
> Clio requires access to at least one `rippled` node, which can run on the same machine as Clio or separately.
|
||||||
|
|
||||||
Use these instructions to build a Clio executable from the source. These instructions were tested on Ubuntu 20.04 LTS.
|
## 📚 Learn more about Clio
|
||||||
|
|
||||||
```sh
|
Below are some useful docs to learn more about Clio.
|
||||||
# Install dependencies
|
|
||||||
sudo apt-get -y install git pkg-config protobuf-compiler libprotobuf-dev libssl-dev wget build-essential bison flex autoconf cmake
|
|
||||||
|
|
||||||
# Compile Boost
|
**For Developers**:
|
||||||
wget -O $HOME/boost_1_75_0.tar.gz https://boostorg.jfrog.io/artifactory/main/release/1.75.0/source/boost_1_75_0.tar.gz
|
|
||||||
tar xvzf $HOME/boost_1_75_0.tar.gz
|
|
||||||
cd $HOME/boost_1_75_0
|
|
||||||
./bootstrap.sh
|
|
||||||
./b2 -j$(nproc)
|
|
||||||
echo "export BOOST_ROOT=$HOME/boost_1_75_0" >> $HOME/.profile && source $HOME/.profile
|
|
||||||
|
|
||||||
# Clone the Clio Git repository & build Clio
|
- [How to build Clio](./docs/build-clio.md)
|
||||||
cd $HOME
|
- [Metrics and static analysis](./docs/metrics-and-static-analysis.md)
|
||||||
git clone https://github.com/XRPLF/clio.git
|
- [Coverage report](./docs/coverage-report.md)
|
||||||
cd $HOME/clio
|
|
||||||
cmake -B build && cmake --build build --parallel $(nproc)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Running
|
**For Operators**:
|
||||||
```sh
|
|
||||||
./clio_server config.json
|
|
||||||
```
|
|
||||||
|
|
||||||
Clio needs access to a rippled server. The config files of rippled and Clio need
|
- [How to configure Clio and rippled](./docs/configure-clio.md)
|
||||||
to match in a certain sense.
|
- [How to run Clio](./docs/run-clio.md)
|
||||||
Clio needs to know:
|
- [Logging](./docs/logging.md)
|
||||||
- the IP of rippled
|
- [Troubleshooting guide](./docs/trouble_shooting.md)
|
||||||
- the port on which rippled is accepting unencrypted WebSocket connections
|
|
||||||
- the port on which rippled is handling gRPC requests
|
|
||||||
|
|
||||||
rippled needs to open:
|
**General reference material:**
|
||||||
- a port to accept unencrypted websocket connections
|
|
||||||
- a port to handle gRPC requests, with the IP(s) of Clio specified in the `secure_gateway` entry
|
|
||||||
|
|
||||||
The example configs of rippled and Clio are setups such that minimal changes are
|
- [API reference](https://xrpl.org/http-websocket-apis.html)
|
||||||
required. When running locally, the only change needed is to uncomment the `port_grpc`
|
- [Developer docs](https://xrplf.github.io/clio)
|
||||||
section of the rippled config. When running Clio and rippled on separate machines,
|
- [Clio documentation](https://xrpl.org/the-clio-server.html#the-clio-server)
|
||||||
in addition to uncommenting the `port_grpc` section, a few other steps must be taken:
|
|
||||||
1. change the `ip` of the first entry of `etl_sources` to the IP where your rippled
|
|
||||||
server is running
|
|
||||||
2. open a public, unencrypted WebSocket port on your rippled server
|
|
||||||
3. change the IP specified in `secure_gateway` of `port_grpc` section of the rippled config
|
|
||||||
to the IP of your Clio server. This entry can take the form of a comma-separated list if
|
|
||||||
you are running multiple Clio nodes.
|
|
||||||
|
|
||||||
Once your config files are ready, start rippled and Clio. It doesn't matter which you
|
## 🆘 Help
|
||||||
start first, and it's fine to stop one or the other and restart at any given time.
|
|
||||||
|
|
||||||
Clio will wait for rippled to sync before extracting any ledgers. If there is already
|
Feel free to open an [issue](https://github.com/XRPLF/clio/issues) if you have a feature request or something doesn't work as expected.
|
||||||
data in Clio's database, Clio will begin extraction with the ledger whose sequence
|
If you have any questions about building, running, contributing, using Clio or any other, you could always start a new [discussion](https://github.com/XRPLF/clio/discussions).
|
||||||
is one greater than the greatest sequence currently in the database. Clio will wait
|
|
||||||
for this ledger to be available. Be aware that the behavior of rippled is to sync to
|
|
||||||
the most recent ledger on the network, and then backfill. If Clio is extracting ledgers
|
|
||||||
from rippled, and then rippled is stopped for a significant amount of time and then restarted, rippled
|
|
||||||
will take time to backfill to the next ledger that Clio wants. The time it takes is proportional
|
|
||||||
to the amount of time rippled was offline for. Also be aware that the amount rippled backfills
|
|
||||||
are dependent on the online_delete and ledger_history config values; if these values
|
|
||||||
are small, and rippled is stopped for a significant amount of time, rippled may never backfill
|
|
||||||
to the ledger that Clio wants. To avoid this situation, it is advised to keep history
|
|
||||||
proportional to the amount of time that you expect rippled to be offline. For example, if you
|
|
||||||
expect rippled to be offline for a few days from time to time, you should keep at least
|
|
||||||
a few days of history. If you expect rippled to never be offline, then you can keep a very small
|
|
||||||
amount of history.
|
|
||||||
|
|
||||||
Clio can use multiple rippled servers as a data source. Simply add more entries to
|
|
||||||
the `etl_sources` section. Clio will load balance requests across the servers specified
|
|
||||||
in this list. As long as one rippled server is up and synced, Clio will continue
|
|
||||||
extracting ledgers.
|
|
||||||
|
|
||||||
In contrast to rippled, Clio will answer RPC requests for the data already in the
|
|
||||||
database as soon as the server starts. Clio doesn't wait to sync to the network, or
|
|
||||||
for rippled to sync.
|
|
||||||
|
|
||||||
When starting Clio with a fresh database, Clio needs to download a ledger in full.
|
|
||||||
This can take some time, and depends on database throughput. With a moderately fast
|
|
||||||
database, this should take less than 10 minutes. If you did not properly set `secure_gateway`
|
|
||||||
in the `port_grpc` section of rippled, this step will fail. Once the first ledger
|
|
||||||
is fully downloaded, Clio only needs to extract the changed data for each ledger,
|
|
||||||
so extraction is much faster and Clio can keep up with rippled in real-time. Even under
|
|
||||||
intense load, Clio should not lag behind the network, as Clio is not processing the data,
|
|
||||||
and is simply writing to a database. The throughput of Clio is dependent on the throughput
|
|
||||||
of your database, but a standard Cassandra or Scylla deployment can handle
|
|
||||||
the write load of the XRP Ledger without any trouble. Generally the performance considerations
|
|
||||||
come on the read side, and depends on the number of RPC requests your Clio nodes
|
|
||||||
are serving. Be aware that very heavy read traffic can impact write throughput. Again, this
|
|
||||||
is on the database side, so if you are seeing this, upgrade your database.
|
|
||||||
|
|
||||||
It is possible to run multiple Clio nodes that share access to the same database.
|
|
||||||
The Clio nodes don't need to know about each other. You can simply spin up more Clio
|
|
||||||
nodes pointing to the same database as you wish, and shut them down as you wish.
|
|
||||||
On startup, each Clio node queries the database for the latest ledger. If this latest
|
|
||||||
ledger does not change for some time, the Clio node begins extracting ledgers
|
|
||||||
and writing to the database. If the Clio node detects a ledger that it is trying to
|
|
||||||
write has already been written, the Clio node will backoff and stop writing. If later
|
|
||||||
the Clio node sees no ledger written for some time, it will start writing again.
|
|
||||||
This algorithm ensures that at any given time, one and only one Clio node is writing
|
|
||||||
to the database.
|
|
||||||
|
|
||||||
It is possible to force Clio to only read data, and to never become a writer.
|
|
||||||
To do this, set `read_only: true` in the config. One common setup is to have a
|
|
||||||
small number of writer nodes that are inaccessible to clients, with several
|
|
||||||
read only nodes handling client requests. The number of read only nodes can be scaled
|
|
||||||
up or down in response to request volume.
|
|
||||||
|
|
||||||
When using multiple rippled servers as data sources and multiple Clio nodes,
|
|
||||||
each Clio node should use the same set of rippled servers as sources. The order doesn't matter.
|
|
||||||
The only reason not to do this is if you are running servers in different regions, and
|
|
||||||
you want the Clio nodes to extract from servers in their region. However, if you
|
|
||||||
are doing this, be aware that database traffic will be flowing across regions,
|
|
||||||
which can cause high latencies. A possible alternative to this is to just deploy
|
|
||||||
a database in each region, and the Clio nodes in each region use their region's database.
|
|
||||||
This is effectively two systems.
|
|
||||||
|
|
||||||
## Logging
|
|
||||||
Clio provides several logging options, all are configurable via the config file and are detailed below.
|
|
||||||
|
|
||||||
`log_level`: The minimum level of severity at which the log message will be outputted.
|
|
||||||
Severity options are `trace`, `debug`, `info`, `warning`, `error`, `fatal`.
|
|
||||||
|
|
||||||
`log_to_console`: Enable/disable log output to console. Options are `true`/`false`.
|
|
||||||
|
|
||||||
`log_to_file`: Enable/disable log saving to files in persistent local storage. Options are `true`/`false`.
|
|
||||||
|
|
||||||
`log_directory`: Path to the directory where log files are stored. If such directory doesn't exist, Clio will create it.
|
|
||||||
|
|
||||||
`log_rotation_size`: The max size of the log file in **megabytes** before it will rotate into a smaller file.
|
|
||||||
|
|
||||||
`log_directory_max_size`: The max size of the log directory in **megabytes** before old log files will be
|
|
||||||
deleted to free up space.
|
|
||||||
|
|
||||||
`log_rotation_hour_interval`: The time interval in **hours** after the last log rotation to automatically
|
|
||||||
rotate the current log file.
|
|
||||||
|
|
||||||
Note, time-based log rotation occurs dependently on size-based log rotation, where if a
|
|
||||||
size-based log rotation occurs, the timer for the time-based rotation will reset.
|
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
# Release Notes
|
|
||||||
|
|
||||||
This document contains the release notes for `clio_server`, an XRP Ledger API Server.
|
|
||||||
|
|
||||||
To build and run `clio_server`, follow the instructions in [README.md](https://github.com/XRPLF/clio).
|
|
||||||
|
|
||||||
If you find issues or have a new idea, please open [an issue](https://github.com/XRPLF/clio/issues).
|
|
||||||
|
|
||||||
# Releases
|
|
||||||
|
|
||||||
## 0.1.0
|
|
||||||
|
|
||||||
Clio is an XRP Ledger API server. Clio is optimized for RPC calls, over websocket or JSON-RPC. Validated historical ledger and transaction data is stored in a more space efficient format, using up to 4 times less space than rippled.
|
|
||||||
|
|
||||||
Clio uses Cassandra or ScyllaDB, allowing for scalable read throughput. Multiple clio nodes can share access to the same dataset, allowing for a highly available cluster of clio nodes, without the need for redundant data storage or computation.
|
|
||||||
|
|
||||||
**0.1.0** is the first beta of Project Clio. It contains:
|
|
||||||
- `./src/backend` is the BackendInterface. This provides an abstraction for reading and writing information to a database.
|
|
||||||
- `./src/etl` is the ReportingETL. The classes in this folder are used to extract information from the P2P network and write it to a database, either locally or over the network.
|
|
||||||
- `./src/rpc` contains RPC handlers that are called by clients. These handlers should expose the same API as rippled.
|
|
||||||
- `./src/subscriptions` contains the SubscriptionManager. This manages publishing to clients subscribing to streams or accounts.
|
|
||||||
- `./src/webserver` contains a flex server that handles both http/s and ws/s traffic on a single port.
|
|
||||||
- `./unittests` simple unit tests that write to and read from a database to verify that the ETL works.
|
|
||||||
121
REVIEW.md
121
REVIEW.md
@@ -1,121 +0,0 @@
|
|||||||
# How to review clio
|
|
||||||
Clio is a massive project, and thus I don't expect the code to be reviewed the
|
|
||||||
way a normal PR would. So I put this guide together to help reviewers look at
|
|
||||||
the relevant pieces of code without getting lost in the weeds.
|
|
||||||
|
|
||||||
One thing reviewers should keep in mind is that most of clio is designed to be
|
|
||||||
lightweight and simple. We try not to introduce any uneccessary complexity and
|
|
||||||
keep the code as simple and straightforward as possible. Sometimes complexity is
|
|
||||||
unavoidable, but simplicity is the goal.
|
|
||||||
|
|
||||||
## Order of review
|
|
||||||
The code is organized into 4 main components, each with their own folder. The
|
|
||||||
code in each folder is as self contained as possible. A good way to approach
|
|
||||||
the review would be to review one folder at a time.
|
|
||||||
|
|
||||||
### backend
|
|
||||||
The code in the backend folder is the heart of the project, and reviewers should
|
|
||||||
start here. This is the most complex part of the code, as well as the most
|
|
||||||
performance sensitive. clio does not keep any data in memory, so performance
|
|
||||||
generally depends on the data model and the way we talk to the database.
|
|
||||||
|
|
||||||
Reviewers should start with the README in this folder to get a high level idea
|
|
||||||
of the data model and to review the data model itself. Then, reviewers should
|
|
||||||
dive into the implementation. The table schemas and queries for Cassandra are
|
|
||||||
defined in `CassandraBackend::open()`. The table schemas for Postgres are defined
|
|
||||||
in Pg.cpp. The queries for Postgres are defined in each of the functions of `PostgresBackend`.
|
|
||||||
A good way to approach the implementation would be to look at the table schemas,
|
|
||||||
and then go through the functions declared in `BackendInterface`. Reviewers could
|
|
||||||
also branch out to the rest of the code by looking at where these functions are
|
|
||||||
called from.
|
|
||||||
|
|
||||||
### webserver
|
|
||||||
The code in the webserver folder implements the web server for handling RPC requests.
|
|
||||||
This code was mostly copied and pasted from boost beast example code, so I would
|
|
||||||
really appreciate review here.
|
|
||||||
|
|
||||||
### rpc
|
|
||||||
The rpc folder contains all of the handlers and any helper functions they need.
|
|
||||||
This code is not too complicated, so reviewers don't need to dwell long here.
|
|
||||||
|
|
||||||
### etl
|
|
||||||
The etl folder contains all of the code for extracting data from rippled. This
|
|
||||||
code is complex and important, but most of this code was just copied from rippled
|
|
||||||
reporting mode, and thus has already been reviewed and is being used in prod.
|
|
||||||
|
|
||||||
## Design decisions that should be reviewed
|
|
||||||
|
|
||||||
### Data model
|
|
||||||
Reviewers should review the general data model. The data model itself is described
|
|
||||||
at a high level in the README in the backend folder. The table schemas and queries
|
|
||||||
for Cassandra are defined in the `open()` function of `CassandraBackend`. The table
|
|
||||||
schemas for Postgres are defined in Pg.cpp.
|
|
||||||
|
|
||||||
Particular attention should be paid to the keys table, and the problem that solves
|
|
||||||
(successor/upper bound). I originally was going to have a special table for book_offers,
|
|
||||||
but then I decided that we could use the keys table itself for that and save space.
|
|
||||||
This makes book_offers somewhat slow compared to rippled, though still very usable.
|
|
||||||
|
|
||||||
### Large rows
|
|
||||||
I did some tricks with Cassandra to deal with very large rows in the keys and account_tx
|
|
||||||
tables. For each of these, the partition key (the first component of the primary
|
|
||||||
key) is a compound key. This is meant to break large rows into smaller rows. This
|
|
||||||
is done to avoid hotspots. Data is sharded in Cassandra, and if some rows get very
|
|
||||||
large, some nodes can have a lot more data than others.
|
|
||||||
|
|
||||||
For account_tx, this has performance implications when iterating very far back
|
|
||||||
in time. Refer to the `fetchAccountTransactions()` function in `CassandraBackend`.
|
|
||||||
|
|
||||||
It is unclear if this needs to be done for other tables.
|
|
||||||
|
|
||||||
### Postgres table partitioning
|
|
||||||
Originally, Postgres exhibited performance problems when the dataset approach 1
|
|
||||||
TB. This was solved by table partitioning.
|
|
||||||
|
|
||||||
### Threading
|
|
||||||
I used asio for multithreading. There are a lot of different io_contexts lying
|
|
||||||
around the code. This needs to be cleaned up a bit. Most of these are really
|
|
||||||
just ways to submit an async job to a single thread. I don't think it makes
|
|
||||||
sense to have one io_context for the whole application, but some of the threading
|
|
||||||
is a bit opaque and could be cleaned up.
|
|
||||||
|
|
||||||
### Boost Json
|
|
||||||
I used boost json for serializing data to json.
|
|
||||||
|
|
||||||
### No cache
|
|
||||||
As of now, there is no cache. I am not sure if a cache is even worth it. A
|
|
||||||
transaction cache would not be hard, but a cache for ledger data will be hard.
|
|
||||||
While a cache would improve performance, it would increase memory usage. clio
|
|
||||||
is designed to be lightweight. Also, I've reached thousands of requests per
|
|
||||||
second with a single clio node, so I'm not sure performance is even an issue.
|
|
||||||
|
|
||||||
## Things I'm less than happy about
|
|
||||||
|
|
||||||
#### BackendIndexer
|
|
||||||
This is a particularly hairy piece of code that handles writing to the keys table.
|
|
||||||
I am not too happy with this code. Parts of it need to execute in real time as
|
|
||||||
part of ETL, and other parts are allowed to run in the background. There is also
|
|
||||||
code that detects if a previous background job failed to complete before the
|
|
||||||
server shutdown, and thus tries to rerun that job. The code feels tacked on, and
|
|
||||||
I would like it to be more cleanly integrated with the rest of the code.
|
|
||||||
|
|
||||||
#### Shifting
|
|
||||||
There is some bit shifting going on with the keys table and the account_tx table.
|
|
||||||
The keys table is written to every 2^20 ledgers. Maybe it would be better to just
|
|
||||||
write every 1 million ledgers.
|
|
||||||
|
|
||||||
#### performance of book_offers
|
|
||||||
book_offers is a bit slow. It could be sped up in a variety of ways. One is to
|
|
||||||
keep a separate book_offers table. However, this is not straightforward and will
|
|
||||||
use more space. Another is to keep a cache of book_offers for the most recent ledger
|
|
||||||
(or few ledgers). I am not sure if this is worth it
|
|
||||||
|
|
||||||
#### account_tx in Cassandra
|
|
||||||
After the fix to deal with large rows, account_tx can be slow at times when using
|
|
||||||
Cassandra. Specifically, if there are large gaps in time where the account was
|
|
||||||
not affected by any transactions, the code will be reading empty records. I would
|
|
||||||
like to sidestep this issue if possible.
|
|
||||||
|
|
||||||
#### Implementation of fetchLedgerPage
|
|
||||||
`fetchLedgerPage()` is rather complex. Part of this seems unavoidable, since this
|
|
||||||
code is dealing with the keys table.
|
|
||||||
16
benchmarks/CMakeLists.txt
Normal file
16
benchmarks/CMakeLists.txt
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
add_executable(clio_benchmark)
|
||||||
|
|
||||||
|
target_sources(
|
||||||
|
clio_benchmark
|
||||||
|
PRIVATE # Common
|
||||||
|
Main.cpp
|
||||||
|
Playground.cpp
|
||||||
|
# ExecutionContext
|
||||||
|
util/async/ExecutionContextBenchmarks.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
include(deps/gbench)
|
||||||
|
|
||||||
|
target_include_directories(clio_benchmark PRIVATE .)
|
||||||
|
target_link_libraries(clio_benchmark PUBLIC clio benchmark::benchmark_main)
|
||||||
|
set_target_properties(clio_benchmark PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
|
||||||
22
benchmarks/Main.cpp
Normal file
22
benchmarks/Main.cpp
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
This file is part of clio: https://github.com/XRPLF/clio
|
||||||
|
Copyright (c) 2023, the clio developers.
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
#include <benchmark/benchmark.h>
|
||||||
|
|
||||||
|
BENCHMARK_MAIN();
|
||||||
45
benchmarks/Playground.cpp
Normal file
45
benchmarks/Playground.cpp
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
This file is part of clio: https://github.com/XRPLF/clio
|
||||||
|
Copyright (c) 2023, the clio developers.
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Use this file for temporary benchmarks and implementations.
|
||||||
|
* Usage example:
|
||||||
|
* ```
|
||||||
|
* ./clio_benchmarks
|
||||||
|
* --benchmark_time_unit=ms
|
||||||
|
* --benchmark_repetitions=10
|
||||||
|
* --benchmark_display_aggregates_only=true
|
||||||
|
* --benchmark_min_time=1x
|
||||||
|
* --benchmark_filter="Playground"
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* Note: Please don't push your temporary work to the repo.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// #include <benchmark/benchmark.h>
|
||||||
|
|
||||||
|
// static void
|
||||||
|
// benchmarkPlaygroundTest1(benchmark::State& state)
|
||||||
|
// {
|
||||||
|
// for (auto _ : state) {
|
||||||
|
// // ...
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// BENCHMARK(benchmarkPlaygroundTest1);
|
||||||
268
benchmarks/util/async/ExecutionContextBenchmarks.cpp
Normal file
268
benchmarks/util/async/ExecutionContextBenchmarks.cpp
Normal file
@@ -0,0 +1,268 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
This file is part of clio: https://github.com/XRPLF/clio
|
||||||
|
Copyright (c) 2024, the clio developers.
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
#include "etl/ETLHelpers.hpp"
|
||||||
|
#include "util/Random.hpp"
|
||||||
|
#include "util/async/AnyExecutionContext.hpp"
|
||||||
|
#include "util/async/AnyOperation.hpp"
|
||||||
|
#include "util/async/context/BasicExecutionContext.hpp"
|
||||||
|
#include "util/async/context/SyncExecutionContext.hpp"
|
||||||
|
|
||||||
|
#include <benchmark/benchmark.h>
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
#include <cstddef>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <latch>
|
||||||
|
#include <optional>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <thread>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
using namespace util;
|
||||||
|
using namespace util::async;
|
||||||
|
|
||||||
|
class TestThread {
|
||||||
|
std::vector<std::thread> threads_;
|
||||||
|
etl::ThreadSafeQueue<std::optional<uint64_t>> q_;
|
||||||
|
etl::ThreadSafeQueue<uint64_t> res_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
TestThread(std::vector<uint64_t> const& data) : q_(data.size()), res_(data.size())
|
||||||
|
{
|
||||||
|
for (auto el : data)
|
||||||
|
q_.push(el);
|
||||||
|
}
|
||||||
|
|
||||||
|
~TestThread()
|
||||||
|
{
|
||||||
|
for (auto& t : threads_) {
|
||||||
|
if (t.joinable())
|
||||||
|
t.join();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
run(std::size_t numThreads)
|
||||||
|
{
|
||||||
|
std::latch completion{numThreads};
|
||||||
|
for (std::size_t i = 0; i < numThreads; ++i) {
|
||||||
|
q_.push(std::nullopt);
|
||||||
|
threads_.emplace_back([this, &completion]() { process(completion); });
|
||||||
|
}
|
||||||
|
|
||||||
|
completion.wait();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void
|
||||||
|
process(std::latch& completion)
|
||||||
|
{
|
||||||
|
while (auto v = q_.pop()) {
|
||||||
|
if (not v.has_value())
|
||||||
|
break;
|
||||||
|
|
||||||
|
res_.push(v.value() * v.value());
|
||||||
|
}
|
||||||
|
|
||||||
|
completion.count_down(1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename CtxType>
|
||||||
|
class TestExecutionContextBatched {
|
||||||
|
etl::ThreadSafeQueue<std::optional<uint64_t>> q_;
|
||||||
|
etl::ThreadSafeQueue<uint64_t> res_;
|
||||||
|
std::size_t batchSize_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
TestExecutionContextBatched(std::vector<uint64_t> const& data, std::size_t batchSize = 5000u)
|
||||||
|
: q_(data.size()), res_(data.size()), batchSize_(batchSize)
|
||||||
|
{
|
||||||
|
for (auto el : data)
|
||||||
|
q_.push(el);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
run(std::size_t numThreads)
|
||||||
|
{
|
||||||
|
using OpType = typename CtxType::template StoppableOperation<void>;
|
||||||
|
|
||||||
|
CtxType ctx{numThreads};
|
||||||
|
std::vector<OpType> operations;
|
||||||
|
|
||||||
|
for (std::size_t i = 0; i < numThreads; ++i) {
|
||||||
|
q_.push(std::nullopt);
|
||||||
|
|
||||||
|
operations.push_back(ctx.execute(
|
||||||
|
[this](auto stopRequested) {
|
||||||
|
bool hasMore = true;
|
||||||
|
auto doOne = [this] {
|
||||||
|
auto v = q_.pop();
|
||||||
|
if (not v.has_value())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
res_.push(v.value() * v.value());
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
while (not stopRequested and hasMore) {
|
||||||
|
for (std::size_t i = 0; i < batchSize_ and hasMore; ++i)
|
||||||
|
hasMore = doOne();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
std::chrono::seconds{5}
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto& op : operations)
|
||||||
|
op.wait();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename CtxType>
|
||||||
|
class TestAnyExecutionContextBatched {
|
||||||
|
etl::ThreadSafeQueue<std::optional<uint64_t>> q_;
|
||||||
|
etl::ThreadSafeQueue<uint64_t> res_;
|
||||||
|
std::size_t batchSize_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
TestAnyExecutionContextBatched(std::vector<uint64_t> const& data, std::size_t batchSize = 5000u)
|
||||||
|
: q_(data.size()), res_(data.size()), batchSize_(batchSize)
|
||||||
|
{
|
||||||
|
for (auto el : data)
|
||||||
|
q_.push(el);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
run(std::size_t numThreads)
|
||||||
|
{
|
||||||
|
CtxType ctx{numThreads};
|
||||||
|
AnyExecutionContext anyCtx{ctx};
|
||||||
|
std::vector<AnyOperation<void>> operations;
|
||||||
|
|
||||||
|
for (std::size_t i = 0; i < numThreads; ++i) {
|
||||||
|
q_.push(std::nullopt);
|
||||||
|
|
||||||
|
operations.push_back(anyCtx.execute(
|
||||||
|
[this](auto stopRequested) {
|
||||||
|
bool hasMore = true;
|
||||||
|
auto doOne = [this] {
|
||||||
|
auto v = q_.pop();
|
||||||
|
if (not v.has_value())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
res_.push(v.value() * v.value());
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
while (not stopRequested and hasMore) {
|
||||||
|
for (std::size_t i = 0; i < batchSize_ and hasMore; ++i)
|
||||||
|
hasMore = doOne();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
std::chrono::seconds{5}
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto& op : operations)
|
||||||
|
op.wait();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static auto
|
||||||
|
generateData()
|
||||||
|
{
|
||||||
|
constexpr auto TOTAL = 10'000;
|
||||||
|
std::vector<uint64_t> data;
|
||||||
|
data.reserve(TOTAL);
|
||||||
|
for (auto i = 0; i < TOTAL; ++i)
|
||||||
|
data.push_back(util::Random::uniform(1, 100'000'000));
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
benchmarkThreads(benchmark::State& state)
|
||||||
|
{
|
||||||
|
auto data = generateData();
|
||||||
|
for (auto _ : state) {
|
||||||
|
TestThread t{data};
|
||||||
|
t.run(state.range(0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename CtxType>
|
||||||
|
void
|
||||||
|
benchmarkExecutionContextBatched(benchmark::State& state)
|
||||||
|
{
|
||||||
|
auto data = generateData();
|
||||||
|
for (auto _ : state) {
|
||||||
|
TestExecutionContextBatched<CtxType> t{data, state.range(1)};
|
||||||
|
t.run(state.range(0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename CtxType>
|
||||||
|
void
|
||||||
|
benchmarkAnyExecutionContextBatched(benchmark::State& state)
|
||||||
|
{
|
||||||
|
auto data = generateData();
|
||||||
|
for (auto _ : state) {
|
||||||
|
TestAnyExecutionContextBatched<CtxType> t{data, state.range(1)};
|
||||||
|
t.run(state.range(0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Simplest implementation using async queues and std::thread
|
||||||
|
BENCHMARK(benchmarkThreads)->Arg(1)->Arg(2)->Arg(4)->Arg(8);
|
||||||
|
|
||||||
|
// Same implementation using each of the available execution contexts
|
||||||
|
BENCHMARK(benchmarkExecutionContextBatched<PoolExecutionContext>)
|
||||||
|
->ArgsProduct({
|
||||||
|
{1, 2, 4, 8}, // threads
|
||||||
|
{500, 1000, 5000, 10000} // batch size
|
||||||
|
});
|
||||||
|
BENCHMARK(benchmarkExecutionContextBatched<CoroExecutionContext>)
|
||||||
|
->ArgsProduct({
|
||||||
|
{1, 2, 4, 8}, // threads
|
||||||
|
{500, 1000, 5000, 10000} // batch size
|
||||||
|
});
|
||||||
|
BENCHMARK(benchmarkExecutionContextBatched<SyncExecutionContext>)
|
||||||
|
->ArgsProduct({
|
||||||
|
{1, 2, 4, 8}, // threads
|
||||||
|
{500, 1000, 5000, 10000} // batch size
|
||||||
|
});
|
||||||
|
|
||||||
|
// Same implementations going thru AnyExecutionContext
|
||||||
|
BENCHMARK(benchmarkAnyExecutionContextBatched<PoolExecutionContext>)
|
||||||
|
->ArgsProduct({
|
||||||
|
{1, 2, 4, 8}, // threads
|
||||||
|
{500, 1000, 5000, 10000} // batch size
|
||||||
|
});
|
||||||
|
BENCHMARK(benchmarkAnyExecutionContextBatched<CoroExecutionContext>)
|
||||||
|
->ArgsProduct({
|
||||||
|
{1, 2, 4, 8}, // threads
|
||||||
|
{500, 1000, 5000, 10000} // batch size
|
||||||
|
});
|
||||||
|
BENCHMARK(benchmarkAnyExecutionContextBatched<SyncExecutionContext>)
|
||||||
|
->ArgsProduct({
|
||||||
|
{1, 2, 4, 8}, // threads
|
||||||
|
{500, 1000, 5000, 10000} // batch size
|
||||||
|
});
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
{
|
|
||||||
"database":
|
|
||||||
{
|
|
||||||
"type":"cassandra",
|
|
||||||
"cassandra":
|
|
||||||
{
|
|
||||||
"secure_connect_bundle":"[path/to/zip. ignore if using contact_points]",
|
|
||||||
"contact_points":"[ip. ignore if using secure_connect_bundle]",
|
|
||||||
"port":"[port. ignore if using_secure_connect_bundle]",
|
|
||||||
"keyspace":"clio",
|
|
||||||
"username":"[username, if any]",
|
|
||||||
"password":"[password, if any]",
|
|
||||||
"max_requests_outstanding":25000,
|
|
||||||
"threads":8
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"etl_sources":
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"ip":"[rippled ip]",
|
|
||||||
"ws_port":"6006",
|
|
||||||
"grpc_port":"50051"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"dos_guard":
|
|
||||||
{
|
|
||||||
"whitelist":["127.0.0.1"]
|
|
||||||
},
|
|
||||||
"server":{
|
|
||||||
"ip":"0.0.0.0",
|
|
||||||
"port":8080
|
|
||||||
},
|
|
||||||
"log_level":"debug",
|
|
||||||
"log_file":"./clio.log",
|
|
||||||
"online_delete":0,
|
|
||||||
"extractor_threads":8,
|
|
||||||
"read_only":false
|
|
||||||
}
|
|
||||||
41
cmake/Build.cpp.in
Normal file
41
cmake/Build.cpp.in
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
This file is part of clio: https://github.com/XRPLF/clio
|
||||||
|
Copyright (c) 2022, the clio developers.
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
#include "main/Build.hpp"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace Build {
|
||||||
|
static constexpr char versionString[] = "@CLIO_VERSION@";
|
||||||
|
|
||||||
|
std::string const&
|
||||||
|
getClioVersionString()
|
||||||
|
{
|
||||||
|
static std::string const value = versionString;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string const&
|
||||||
|
getClioFullVersionString()
|
||||||
|
{
|
||||||
|
static std::string const value = "clio-" + getClioVersionString();
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Build
|
||||||
5
cmake/Ccache.cmake
Normal file
5
cmake/Ccache.cmake
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
find_program(CCACHE_PATH "ccache")
|
||||||
|
if (CCACHE_PATH)
|
||||||
|
set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PATH}")
|
||||||
|
message(STATUS "Using ccache: ${CCACHE_PATH}")
|
||||||
|
endif ()
|
||||||
42
cmake/CheckCompiler.cmake
Normal file
42
cmake/CheckCompiler.cmake
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||||
|
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 16)
|
||||||
|
message(FATAL_ERROR "Clang 16+ required for building clio")
|
||||||
|
endif ()
|
||||||
|
set(is_clang TRUE)
|
||||||
|
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
|
||||||
|
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 15)
|
||||||
|
message(FATAL_ERROR "AppleClang 15+ required for building clio")
|
||||||
|
endif ()
|
||||||
|
set(is_appleclang TRUE)
|
||||||
|
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||||
|
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12)
|
||||||
|
message(FATAL_ERROR "GCC 12+ required for building clio")
|
||||||
|
endif ()
|
||||||
|
set(is_gcc TRUE)
|
||||||
|
else ()
|
||||||
|
message(FATAL_ERROR "Supported compilers: AppleClang 15+, Clang 16+, GCC 12+")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (san)
|
||||||
|
string(TOLOWER ${san} san)
|
||||||
|
set(SAN_FLAG "-fsanitize=${san}")
|
||||||
|
set(SAN_LIB "")
|
||||||
|
if (is_gcc)
|
||||||
|
if (san STREQUAL "address")
|
||||||
|
set(SAN_LIB "asan")
|
||||||
|
elseif (san STREQUAL "thread")
|
||||||
|
set(SAN_LIB "tsan")
|
||||||
|
elseif (san STREQUAL "memory")
|
||||||
|
set(SAN_LIB "msan")
|
||||||
|
elseif (san STREQUAL "undefined")
|
||||||
|
set(SAN_LIB "ubsan")
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
set(_saved_CRL ${CMAKE_REQUIRED_LIBRARIES})
|
||||||
|
set(CMAKE_REQUIRED_LIBRARIES "${SAN_FLAG};${SAN_LIB}")
|
||||||
|
check_cxx_compiler_flag(${SAN_FLAG} COMPILER_SUPPORTS_SAN)
|
||||||
|
set(CMAKE_REQUIRED_LIBRARIES ${_saved_CRL})
|
||||||
|
if (NOT COMPILER_SUPPORTS_SAN)
|
||||||
|
message(FATAL_ERROR "${san} sanitizer does not seem to be supported by your compiler")
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
33
cmake/ClangTidy.cmake
Normal file
33
cmake/ClangTidy.cmake
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
if (lint)
|
||||||
|
|
||||||
|
# Find clang-tidy binary
|
||||||
|
if (DEFINED ENV{CLIO_CLANG_TIDY_BIN})
|
||||||
|
set(_CLANG_TIDY_BIN $ENV{CLIO_CLANG_TIDY_BIN})
|
||||||
|
if ((NOT EXISTS ${_CLANG_TIDY_BIN}) OR IS_DIRECTORY ${_CLANG_TIDY_BIN})
|
||||||
|
message(FATAL_ERROR "$ENV{CLIO_CLANG_TIDY_BIN} no such file. Check CLIO_CLANG_TIDY_BIN env variable")
|
||||||
|
endif ()
|
||||||
|
message(STATUS "Using clang-tidy from CLIO_CLANG_TIDY_BIN")
|
||||||
|
else ()
|
||||||
|
find_program(_CLANG_TIDY_BIN NAMES "clang-tidy-18" "clang-tidy" REQUIRED)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (NOT _CLANG_TIDY_BIN)
|
||||||
|
message(
|
||||||
|
FATAL_ERROR
|
||||||
|
"clang-tidy binary not found. Please set the CLIO_CLANG_TIDY_BIN environment variable or install clang-tidy."
|
||||||
|
)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# Support for https://github.com/matus-chochlik/ctcache
|
||||||
|
find_program(CLANG_TIDY_CACHE_PATH NAMES "clang-tidy-cache")
|
||||||
|
if (CLANG_TIDY_CACHE_PATH)
|
||||||
|
set(_CLANG_TIDY_CMD "${CLANG_TIDY_CACHE_PATH};${_CLANG_TIDY_BIN}"
|
||||||
|
CACHE STRING "A combined command to run clang-tidy with caching wrapper"
|
||||||
|
)
|
||||||
|
else ()
|
||||||
|
set(_CLANG_TIDY_CMD "${_CLANG_TIDY_BIN}")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
set(CMAKE_CXX_CLANG_TIDY "${_CLANG_TIDY_CMD};--quiet")
|
||||||
|
message(STATUS "Using clang-tidy: ${CMAKE_CXX_CLANG_TIDY}")
|
||||||
|
endif ()
|
||||||
48
cmake/ClioVersion.cmake
Normal file
48
cmake/ClioVersion.cmake
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
#[===================================================================[
|
||||||
|
write version to source
|
||||||
|
#]===================================================================]
|
||||||
|
|
||||||
|
find_package(Git REQUIRED)
|
||||||
|
|
||||||
|
set(GIT_COMMAND rev-parse --short HEAD)
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${GIT_EXECUTABLE} ${GIT_COMMAND} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE REV
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
|
||||||
|
set(GIT_COMMAND branch --show-current)
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${GIT_EXECUTABLE} ${GIT_COMMAND} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE BRANCH
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
|
||||||
|
if (BRANCH STREQUAL "")
|
||||||
|
set(BRANCH "dev")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (NOT (BRANCH MATCHES master OR BRANCH MATCHES release/*)) # for develop and any other branch name
|
||||||
|
# YYYYMMDDHMS-<branch>-<git-rev>
|
||||||
|
set(GIT_COMMAND show -s --date=format:%Y%m%d%H%M%S --format=%cd)
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${GIT_EXECUTABLE} ${GIT_COMMAND} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} OUTPUT_VARIABLE DATE
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
set(CLIO_VERSION "${DATE}-${BRANCH}-${REV}")
|
||||||
|
set(DOC_CLIO_VERSION "develop")
|
||||||
|
else ()
|
||||||
|
set(GIT_COMMAND describe --tags)
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${GIT_EXECUTABLE} ${GIT_COMMAND} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE CLIO_TAG_VERSION
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
set(CLIO_VERSION "${CLIO_TAG_VERSION}")
|
||||||
|
set(DOC_CLIO_VERSION "${CLIO_TAG_VERSION}")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (CMAKE_BUILD_TYPE MATCHES Debug)
|
||||||
|
set(CLIO_VERSION "${CLIO_VERSION}+DEBUG")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
message(STATUS "Build version: ${CLIO_VERSION}")
|
||||||
|
|
||||||
|
configure_file(${CMAKE_CURRENT_LIST_DIR}/Build.cpp.in ${CMAKE_CURRENT_LIST_DIR}/../src/main/impl/Build.cpp)
|
||||||
361
cmake/CodeCoverage.cmake
Normal file
361
cmake/CodeCoverage.cmake
Normal file
@@ -0,0 +1,361 @@
|
|||||||
|
# Copyright (c) 2012 - 2017, Lars Bilke All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
|
||||||
|
# following conditions are met:
|
||||||
|
#
|
||||||
|
# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following
|
||||||
|
# disclaimer.
|
||||||
|
#
|
||||||
|
# 1. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
|
||||||
|
# disclaimer in the documentation and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# 1. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote
|
||||||
|
# products derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
# CHANGES:
|
||||||
|
#
|
||||||
|
# 2012-01-31, Lars Bilke - Enable Code Coverage
|
||||||
|
#
|
||||||
|
# 2013-09-17, Joakim Söderberg - Added support for Clang. - Some additional usage instructions.
|
||||||
|
#
|
||||||
|
# 2016-02-03, Lars Bilke - Refactored functions to use named parameters
|
||||||
|
#
|
||||||
|
# 2017-06-02, Lars Bilke - Merged with modified version from github.com/ufz/ogs
|
||||||
|
#
|
||||||
|
# 2019-05-06, Anatolii Kurotych - Remove unnecessary --coverage flag
|
||||||
|
#
|
||||||
|
# 2019-12-13, FeRD (Frank Dana) - Deprecate COVERAGE_LCOVR_EXCLUDES and COVERAGE_GCOVR_EXCLUDES lists in favor of
|
||||||
|
# tool-agnostic COVERAGE_EXCLUDES variable, or EXCLUDE setup arguments. - CMake 3.4+: All excludes can be specified
|
||||||
|
# relative to BASE_DIRECTORY - All setup functions: accept BASE_DIRECTORY, EXCLUDE list - Set lcov basedir with -b
|
||||||
|
# argument - Add automatic --demangle-cpp in lcovr, if 'c++filt' is available (can be overridden with NO_DEMANGLE option
|
||||||
|
# in setup_target_for_coverage_lcovr().) - Delete output dir, .info file on 'make clean' - Remove Python detection,
|
||||||
|
# since version mismatches will break gcovr - Minor cleanup (lowercase function names, update examples...)
|
||||||
|
#
|
||||||
|
# 2019-12-19, FeRD (Frank Dana) - Rename Lcov outputs, make filtered file canonical, fix cleanup for targets
|
||||||
|
#
|
||||||
|
# 2020-01-19, Bob Apthorpe - Added gfortran support
|
||||||
|
#
|
||||||
|
# 2020-02-17, FeRD (Frank Dana) - Make all add_custom_target()s VERBATIM to auto-escape wildcard characters in EXCLUDEs,
|
||||||
|
# and remove manual escaping from gcovr targets
|
||||||
|
#
|
||||||
|
# 2021-01-19, Robin Mueller - Add CODE_COVERAGE_VERBOSE option which will allow to print out commands which are run -
|
||||||
|
# Added the option for users to set the GCOVR_ADDITIONAL_ARGS variable to supply additional flags to the gcovr command
|
||||||
|
#
|
||||||
|
# 2020-05-04, Mihchael Davis - Add -fprofile-abs-path to make gcno files contain absolute paths - Fix BASE_DIRECTORY not
|
||||||
|
# working when defined - Change BYPRODUCT from folder to index.html to stop ninja from complaining about double defines
|
||||||
|
#
|
||||||
|
# 2021-05-10, Martin Stump - Check if the generator is multi-config before warning about non-Debug builds
|
||||||
|
#
|
||||||
|
# 2022-02-22, Marko Wehle - Change gcovr output from -o <filename> for --xml <filename> and --html <filename> output
|
||||||
|
# respectively. This will allow for Multiple Output Formats at the same time by making use of GCOVR_ADDITIONAL_ARGS,
|
||||||
|
# e.g. GCOVR_ADDITIONAL_ARGS "--txt".
|
||||||
|
#
|
||||||
|
# 2022-09-28, Sebastian Mueller - fix append_coverage_compiler_flags_to_target to correctly add flags - replace
|
||||||
|
# "-fprofile-arcs -ftest-coverage" with "--coverage" (equivalent)
|
||||||
|
#
|
||||||
|
# 2023-12-15, Bronek Kozicki - remove setup_target_for_coverage_lcov (slow) and setup_target_for_coverage_fastcov (no
|
||||||
|
# support for Clang) - fix Clang support by adding find_program( ... llvm-cov ) - add Apple Clang support by adding
|
||||||
|
# execute_process( COMMAND xcrun -f llvm-cov ... ) - add CODE_COVERAGE_GCOV_TOOL to explicitly select gcov tool and
|
||||||
|
# disable find_program - replace both functions setup_target_for_coverage_gcovr_* with single
|
||||||
|
# setup_target_for_coverage_gcovr - add support for all gcovr output formats
|
||||||
|
#
|
||||||
|
# USAGE:
|
||||||
|
#
|
||||||
|
# 1. Copy this file into your cmake modules path.
|
||||||
|
#
|
||||||
|
# 1. Add the following line to your CMakeLists.txt (best inside an if-condition using a CMake option() to enable it just
|
||||||
|
# optionally): include(CodeCoverage)
|
||||||
|
#
|
||||||
|
# 1. Append necessary compiler flags for all supported source files: append_coverage_compiler_flags() Or for specific
|
||||||
|
# target: append_coverage_compiler_flags_to_target(YOUR_TARGET_NAME)
|
||||||
|
#
|
||||||
|
# 3.a (OPTIONAL) Set appropriate optimization flags, e.g. -O0, -O1 or -Og
|
||||||
|
#
|
||||||
|
# 1. If you need to exclude additional directories from the report, specify them using full paths in the
|
||||||
|
# COVERAGE_EXCLUDES variable before calling setup_target_for_coverage_*(). Example: set(COVERAGE_EXCLUDES
|
||||||
|
# '${PROJECT_SOURCE_DIR}/src/dir1/*'
|
||||||
|
# '/path/to/my/src/dir2/*') Or, use the EXCLUDE argument to setup_target_for_coverage_*(). Example:
|
||||||
|
# setup_target_for_coverage_gcovr( NAME coverage EXECUTABLE testrunner EXCLUDE "${PROJECT_SOURCE_DIR}/src/dir1/*"
|
||||||
|
# "/path/to/my/src/dir2/*")
|
||||||
|
#
|
||||||
|
# 4.a NOTE: With CMake 3.4+, COVERAGE_EXCLUDES or EXCLUDE can also be set relative to the BASE_DIRECTORY (default:
|
||||||
|
# PROJECT_SOURCE_DIR) Example: set(COVERAGE_EXCLUDES "dir1/*") setup_target_for_coverage_gcovr( NAME coverage EXECUTABLE
|
||||||
|
# testrunner FORMAT html-details BASE_DIRECTORY "${PROJECT_SOURCE_DIR}/src" EXCLUDE "dir2/*")
|
||||||
|
#
|
||||||
|
# 4.b If you need to pass specific options to gcovr, specify them in GCOVR_ADDITIONAL_ARGS variable. Example: set
|
||||||
|
# (GCOVR_ADDITIONAL_ARGS --exclude-throw-branches --exclude-noncode-lines -s) setup_target_for_coverage_gcovr( NAME
|
||||||
|
# coverage EXECUTABLE testrunner EXCLUDE "src/dir1" "src/dir2")
|
||||||
|
#
|
||||||
|
# 1. Use the functions described below to create a custom make target which runs your test executable and produces a code
|
||||||
|
# coverage report.
|
||||||
|
#
|
||||||
|
# 1. Build a Debug build: cmake -DCMAKE_BUILD_TYPE=Debug .. make make my_coverage_target
|
||||||
|
|
||||||
|
include(CMakeParseArguments)
|
||||||
|
|
||||||
|
option(CODE_COVERAGE_VERBOSE "Verbose information" FALSE)
|
||||||
|
|
||||||
|
# Check prereqs
|
||||||
|
find_program(GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/scripts/test)
|
||||||
|
|
||||||
|
if (DEFINED CODE_COVERAGE_GCOV_TOOL)
|
||||||
|
set(GCOV_TOOL "${CODE_COVERAGE_GCOV_TOOL}")
|
||||||
|
elseif (DEFINED ENV{CODE_COVERAGE_GCOV_TOOL})
|
||||||
|
set(GCOV_TOOL "$ENV{CODE_COVERAGE_GCOV_TOOL}")
|
||||||
|
elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang")
|
||||||
|
if (APPLE)
|
||||||
|
execute_process(COMMAND xcrun -f llvm-cov OUTPUT_VARIABLE LLVMCOV_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
else ()
|
||||||
|
find_program(LLVMCOV_PATH llvm-cov)
|
||||||
|
endif ()
|
||||||
|
if (LLVMCOV_PATH)
|
||||||
|
set(GCOV_TOOL "${LLVMCOV_PATH} gcov")
|
||||||
|
endif ()
|
||||||
|
elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
|
||||||
|
find_program(GCOV_PATH gcov)
|
||||||
|
set(GCOV_TOOL "${GCOV_PATH}")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# Check supported compiler (Clang, GNU and Flang)
|
||||||
|
get_property(LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES)
|
||||||
|
foreach (LANG ${LANGUAGES})
|
||||||
|
if ("${CMAKE_${LANG}_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang")
|
||||||
|
if ("${CMAKE_${LANG}_COMPILER_VERSION}" VERSION_LESS 3)
|
||||||
|
message(FATAL_ERROR "Clang version must be 3.0.0 or greater! Aborting...")
|
||||||
|
endif ()
|
||||||
|
elseif (NOT "${CMAKE_${LANG}_COMPILER_ID}" MATCHES "GNU" AND NOT "${CMAKE_${LANG}_COMPILER_ID}" MATCHES
|
||||||
|
"(LLVM)?[Ff]lang"
|
||||||
|
)
|
||||||
|
message(FATAL_ERROR "Compiler is not GNU or Flang! Aborting...")
|
||||||
|
endif ()
|
||||||
|
endforeach ()
|
||||||
|
|
||||||
|
set(COVERAGE_COMPILER_FLAGS "-g --coverage" CACHE INTERNAL "")
|
||||||
|
if (CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Clang)")
|
||||||
|
include(CheckCXXCompilerFlag)
|
||||||
|
check_cxx_compiler_flag(-fprofile-abs-path HAVE_cxx_fprofile_abs_path)
|
||||||
|
if (HAVE_cxx_fprofile_abs_path)
|
||||||
|
set(COVERAGE_CXX_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-abs-path")
|
||||||
|
endif ()
|
||||||
|
include(CheckCCompilerFlag)
|
||||||
|
check_c_compiler_flag(-fprofile-abs-path HAVE_c_fprofile_abs_path)
|
||||||
|
if (HAVE_c_fprofile_abs_path)
|
||||||
|
set(COVERAGE_C_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-abs-path")
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
set(CMAKE_Fortran_FLAGS_COVERAGE ${COVERAGE_COMPILER_FLAGS}
|
||||||
|
CACHE STRING "Flags used by the Fortran compiler during coverage builds." FORCE
|
||||||
|
)
|
||||||
|
set(CMAKE_CXX_FLAGS_COVERAGE ${COVERAGE_COMPILER_FLAGS}
|
||||||
|
CACHE STRING "Flags used by the C++ compiler during coverage builds." FORCE
|
||||||
|
)
|
||||||
|
set(CMAKE_C_FLAGS_COVERAGE ${COVERAGE_COMPILER_FLAGS}
|
||||||
|
CACHE STRING "Flags used by the C compiler during coverage builds." FORCE
|
||||||
|
)
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS_COVERAGE "" CACHE STRING "Flags used for linking binaries during coverage builds." FORCE)
|
||||||
|
set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE ""
|
||||||
|
CACHE STRING "Flags used by the shared libraries linker during coverage builds." FORCE
|
||||||
|
)
|
||||||
|
mark_as_advanced(
|
||||||
|
CMAKE_Fortran_FLAGS_COVERAGE CMAKE_CXX_FLAGS_COVERAGE CMAKE_C_FLAGS_COVERAGE CMAKE_EXE_LINKER_FLAGS_COVERAGE
|
||||||
|
CMAKE_SHARED_LINKER_FLAGS_COVERAGE
|
||||||
|
)
|
||||||
|
|
||||||
|
get_property(GENERATOR_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||||
|
if (NOT (CMAKE_BUILD_TYPE STREQUAL "Debug" OR GENERATOR_IS_MULTI_CONFIG))
|
||||||
|
message(WARNING "Code coverage results with an optimised (non-Debug) build may be misleading")
|
||||||
|
endif () # NOT (CMAKE_BUILD_TYPE STREQUAL "Debug" OR GENERATOR_IS_MULTI_CONFIG)
|
||||||
|
|
||||||
|
if (CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
|
||||||
|
link_libraries(gcov)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# Defines a target for running and collection code coverage information Builds dependencies, runs the given executable
|
||||||
|
# and outputs reports. NOTE! The executable should always have a ZERO as exit code otherwise the coverage generation
|
||||||
|
# will not complete.
|
||||||
|
#
|
||||||
|
# setup_target_for_coverage_gcovr( NAME ctest_coverage # New target name EXECUTABLE ctest -j
|
||||||
|
# ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR DEPENDENCIES executable_target # Dependencies to build
|
||||||
|
# first BASE_DIRECTORY "../" # Base directory for report # (defaults to PROJECT_SOURCE_DIR) FORMAT
|
||||||
|
# "cobertura" # Output format, one of: # xml cobertura sonarqube json-summary # json-details
|
||||||
|
# coveralls csv txt # html-single html-nested html-details # (xml is an alias to cobertura; # if no format is set,
|
||||||
|
# defaults to xml) EXCLUDE "src/dir1/*" "src/dir2/*" # Patterns to exclude (can be relative # to BASE_DIRECTORY,
|
||||||
|
# with CMake 3.4+) ) The user can set the variable GCOVR_ADDITIONAL_ARGS to supply additional flags to the GCVOR
|
||||||
|
# command.
|
||||||
|
function (setup_target_for_coverage_gcovr)
|
||||||
|
set(options NONE)
|
||||||
|
set(oneValueArgs BASE_DIRECTORY NAME FORMAT)
|
||||||
|
set(multiValueArgs EXCLUDE EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
|
||||||
|
cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
||||||
|
|
||||||
|
if (NOT GCOV_TOOL)
|
||||||
|
message(FATAL_ERROR "Could not find gcov or llvm-cov tool! Aborting...")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (NOT GCOVR_PATH)
|
||||||
|
message(FATAL_ERROR "Could not find gcovr tool! Aborting...")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# Set base directory (as absolute path), or default to PROJECT_SOURCE_DIR
|
||||||
|
if (DEFINED Coverage_BASE_DIRECTORY)
|
||||||
|
get_filename_component(BASEDIR ${Coverage_BASE_DIRECTORY} ABSOLUTE)
|
||||||
|
else ()
|
||||||
|
set(BASEDIR ${PROJECT_SOURCE_DIR})
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (NOT DEFINED Coverage_FORMAT)
|
||||||
|
set(Coverage_FORMAT xml)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if ("--output" IN_LIST GCOVR_ADDITIONAL_ARGS)
|
||||||
|
message(FATAL_ERROR "Unsupported --output option detected in GCOVR_ADDITIONAL_ARGS! Aborting...")
|
||||||
|
else ()
|
||||||
|
if ((Coverage_FORMAT STREQUAL "html-details") OR (Coverage_FORMAT STREQUAL "html-nested"))
|
||||||
|
set(GCOVR_OUTPUT_FILE ${PROJECT_BINARY_DIR}/${Coverage_NAME}/index.html)
|
||||||
|
set(GCOVR_CREATE_FOLDER ${PROJECT_BINARY_DIR}/${Coverage_NAME})
|
||||||
|
elseif (Coverage_FORMAT STREQUAL "html-single")
|
||||||
|
set(GCOVR_OUTPUT_FILE ${Coverage_NAME}.html)
|
||||||
|
elseif ((Coverage_FORMAT STREQUAL "json-summary") OR (Coverage_FORMAT STREQUAL "json-details")
|
||||||
|
OR (Coverage_FORMAT STREQUAL "coveralls")
|
||||||
|
)
|
||||||
|
set(GCOVR_OUTPUT_FILE ${Coverage_NAME}.json)
|
||||||
|
elseif (Coverage_FORMAT STREQUAL "txt")
|
||||||
|
set(GCOVR_OUTPUT_FILE ${Coverage_NAME}.txt)
|
||||||
|
elseif (Coverage_FORMAT STREQUAL "csv")
|
||||||
|
set(GCOVR_OUTPUT_FILE ${Coverage_NAME}.csv)
|
||||||
|
else ()
|
||||||
|
set(GCOVR_OUTPUT_FILE ${Coverage_NAME}.xml)
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if ((Coverage_FORMAT STREQUAL "cobertura") OR (Coverage_FORMAT STREQUAL "xml"))
|
||||||
|
list(APPEND GCOVR_ADDITIONAL_ARGS --cobertura "${GCOVR_OUTPUT_FILE}")
|
||||||
|
list(APPEND GCOVR_ADDITIONAL_ARGS --cobertura-pretty)
|
||||||
|
set(Coverage_FORMAT cobertura) # overwrite xml
|
||||||
|
elseif (Coverage_FORMAT STREQUAL "sonarqube")
|
||||||
|
list(APPEND GCOVR_ADDITIONAL_ARGS --sonarqube "${GCOVR_OUTPUT_FILE}")
|
||||||
|
elseif (Coverage_FORMAT STREQUAL "json-summary")
|
||||||
|
list(APPEND GCOVR_ADDITIONAL_ARGS --json-summary "${GCOVR_OUTPUT_FILE}")
|
||||||
|
list(APPEND GCOVR_ADDITIONAL_ARGS --json-summary-pretty)
|
||||||
|
elseif (Coverage_FORMAT STREQUAL "json-details")
|
||||||
|
list(APPEND GCOVR_ADDITIONAL_ARGS --json "${GCOVR_OUTPUT_FILE}")
|
||||||
|
list(APPEND GCOVR_ADDITIONAL_ARGS --json-pretty)
|
||||||
|
elseif (Coverage_FORMAT STREQUAL "coveralls")
|
||||||
|
list(APPEND GCOVR_ADDITIONAL_ARGS --coveralls "${GCOVR_OUTPUT_FILE}")
|
||||||
|
list(APPEND GCOVR_ADDITIONAL_ARGS --coveralls-pretty)
|
||||||
|
elseif (Coverage_FORMAT STREQUAL "csv")
|
||||||
|
list(APPEND GCOVR_ADDITIONAL_ARGS --csv "${GCOVR_OUTPUT_FILE}")
|
||||||
|
elseif (Coverage_FORMAT STREQUAL "txt")
|
||||||
|
list(APPEND GCOVR_ADDITIONAL_ARGS --txt "${GCOVR_OUTPUT_FILE}")
|
||||||
|
elseif (Coverage_FORMAT STREQUAL "html-single")
|
||||||
|
list(APPEND GCOVR_ADDITIONAL_ARGS --html "${GCOVR_OUTPUT_FILE}")
|
||||||
|
list(APPEND GCOVR_ADDITIONAL_ARGS --html-self-contained)
|
||||||
|
elseif (Coverage_FORMAT STREQUAL "html-nested")
|
||||||
|
list(APPEND GCOVR_ADDITIONAL_ARGS --html-nested "${GCOVR_OUTPUT_FILE}")
|
||||||
|
elseif (Coverage_FORMAT STREQUAL "html-details")
|
||||||
|
list(APPEND GCOVR_ADDITIONAL_ARGS --html-details "${GCOVR_OUTPUT_FILE}")
|
||||||
|
else ()
|
||||||
|
message(FATAL_ERROR "Unsupported output style ${Coverage_FORMAT}! Aborting...")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# Collect excludes (CMake 3.4+: Also compute absolute paths)
|
||||||
|
set(GCOVR_EXCLUDES "")
|
||||||
|
foreach (EXCLUDE ${Coverage_EXCLUDE} ${COVERAGE_EXCLUDES} ${COVERAGE_GCOVR_EXCLUDES})
|
||||||
|
if (CMAKE_VERSION VERSION_GREATER 3.4)
|
||||||
|
get_filename_component(EXCLUDE ${EXCLUDE} ABSOLUTE BASE_DIR ${BASEDIR})
|
||||||
|
endif ()
|
||||||
|
list(APPEND GCOVR_EXCLUDES "${EXCLUDE}")
|
||||||
|
endforeach ()
|
||||||
|
list(REMOVE_DUPLICATES GCOVR_EXCLUDES)
|
||||||
|
|
||||||
|
# Combine excludes to several -e arguments
|
||||||
|
set(GCOVR_EXCLUDE_ARGS "")
|
||||||
|
foreach (EXCLUDE ${GCOVR_EXCLUDES})
|
||||||
|
list(APPEND GCOVR_EXCLUDE_ARGS "-e")
|
||||||
|
list(APPEND GCOVR_EXCLUDE_ARGS "${EXCLUDE}")
|
||||||
|
endforeach ()
|
||||||
|
|
||||||
|
# Set up commands which will be run to generate coverage data Run tests
|
||||||
|
set(GCOVR_EXEC_TESTS_CMD ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS})
|
||||||
|
|
||||||
|
# Create folder
|
||||||
|
if (DEFINED GCOVR_CREATE_FOLDER)
|
||||||
|
set(GCOVR_FOLDER_CMD ${CMAKE_COMMAND} -E make_directory ${GCOVR_CREATE_FOLDER})
|
||||||
|
else ()
|
||||||
|
set(GCOVR_FOLDER_CMD echo) # dummy
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# Running gcovr
|
||||||
|
set(GCOVR_CMD
|
||||||
|
${GCOVR_PATH}
|
||||||
|
--gcov-executable
|
||||||
|
${GCOV_TOOL}
|
||||||
|
--gcov-ignore-parse-errors=negative_hits.warn_once_per_file
|
||||||
|
-r
|
||||||
|
${BASEDIR}
|
||||||
|
${GCOVR_ADDITIONAL_ARGS}
|
||||||
|
${GCOVR_EXCLUDE_ARGS}
|
||||||
|
--object-directory=${PROJECT_BINARY_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
if (CODE_COVERAGE_VERBOSE)
|
||||||
|
message(STATUS "Executed command report")
|
||||||
|
|
||||||
|
message(STATUS "Command to run tests: ")
|
||||||
|
string(REPLACE ";" " " GCOVR_EXEC_TESTS_CMD_SPACED "${GCOVR_EXEC_TESTS_CMD}")
|
||||||
|
message(STATUS "${GCOVR_EXEC_TESTS_CMD_SPACED}")
|
||||||
|
|
||||||
|
if (NOT GCOVR_FOLDER_CMD STREQUAL "echo")
|
||||||
|
message(STATUS "Command to create a folder: ")
|
||||||
|
string(REPLACE ";" " " GCOVR_FOLDER_CMD_SPACED "${GCOVR_FOLDER_CMD}")
|
||||||
|
message(STATUS "${GCOVR_FOLDER_CMD_SPACED}")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
message(STATUS "Command to generate gcovr coverage data: ")
|
||||||
|
string(REPLACE ";" " " GCOVR_CMD_SPACED "${GCOVR_CMD}")
|
||||||
|
message(STATUS "${GCOVR_CMD_SPACED}")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
add_custom_target(
|
||||||
|
${Coverage_NAME}
|
||||||
|
COMMAND ${GCOVR_EXEC_TESTS_CMD}
|
||||||
|
COMMAND ${GCOVR_FOLDER_CMD}
|
||||||
|
COMMAND ${GCOVR_CMD}
|
||||||
|
BYPRODUCTS ${GCOVR_OUTPUT_FILE}
|
||||||
|
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
|
||||||
|
DEPENDS ${Coverage_DEPENDENCIES}
|
||||||
|
VERBATIM # Protect arguments to commands
|
||||||
|
COMMENT "Running gcovr to produce code coverage report."
|
||||||
|
)
|
||||||
|
|
||||||
|
# Show info where to find the report
|
||||||
|
add_custom_command(
|
||||||
|
TARGET ${Coverage_NAME} POST_BUILD COMMAND ;
|
||||||
|
COMMENT "Code coverage report saved in ${GCOVR_OUTPUT_FILE} formatted as ${Coverage_FORMAT}"
|
||||||
|
)
|
||||||
|
endfunction () # setup_target_for_coverage_gcovr
|
||||||
|
|
||||||
|
function (append_coverage_compiler_flags)
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
|
||||||
|
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
|
||||||
|
message(STATUS "Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}")
|
||||||
|
endfunction () # append_coverage_compiler_flags
|
||||||
|
|
||||||
|
# Setup coverage for specific library
|
||||||
|
function (append_coverage_compiler_flags_to_target name mode)
|
||||||
|
separate_arguments(_flag_list NATIVE_COMMAND "${COVERAGE_COMPILER_FLAGS}")
|
||||||
|
target_compile_options(${name} ${mode} ${_flag_list})
|
||||||
|
if (CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
|
||||||
|
target_link_libraries(${name} ${mode} gcov)
|
||||||
|
endif ()
|
||||||
|
endfunction ()
|
||||||
20
cmake/Docs.cmake
Normal file
20
cmake/Docs.cmake
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
find_package(Doxygen REQUIRED)
|
||||||
|
|
||||||
|
# See Doxyfile for these settings:
|
||||||
|
set(SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/..)
|
||||||
|
set(USE_DOT "YES")
|
||||||
|
set(LINT "NO")
|
||||||
|
set(EXCLUDES "")
|
||||||
|
# ---
|
||||||
|
|
||||||
|
set(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile)
|
||||||
|
set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
|
||||||
|
|
||||||
|
configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT})
|
||||||
|
add_custom_target(
|
||||||
|
docs
|
||||||
|
COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT}
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||||
|
COMMENT "Generating API documentation with Doxygen"
|
||||||
|
VERBATIM
|
||||||
|
)
|
||||||
45
cmake/Settings.cmake
Normal file
45
cmake/Settings.cmake
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
set(COMPILER_FLAGS
|
||||||
|
-Wall
|
||||||
|
-Wcast-align
|
||||||
|
-Wdouble-promotion
|
||||||
|
-Wextra
|
||||||
|
-Werror
|
||||||
|
-Wformat=2
|
||||||
|
-Wimplicit-fallthrough
|
||||||
|
-Wmisleading-indentation
|
||||||
|
-Wno-narrowing
|
||||||
|
-Wno-deprecated-declarations
|
||||||
|
-Wno-dangling-else
|
||||||
|
-Wno-unused-but-set-variable
|
||||||
|
-Wnon-virtual-dtor
|
||||||
|
-Wnull-dereference
|
||||||
|
-Wold-style-cast
|
||||||
|
-pedantic
|
||||||
|
-Wpedantic
|
||||||
|
-Wunused
|
||||||
|
# FIXME: The following bunch are needed for gcc12 atm.
|
||||||
|
-Wno-missing-requires
|
||||||
|
-Wno-restrict
|
||||||
|
-Wno-null-dereference
|
||||||
|
-Wno-maybe-uninitialized
|
||||||
|
-Wno-unknown-warning-option # and this to work with clang
|
||||||
|
# TODO: Address these and others in https://github.com/XRPLF/clio/issues/1273
|
||||||
|
)
|
||||||
|
|
||||||
|
# TODO: reenable when we change CI #884 if (is_gcc AND NOT lint) list(APPEND COMPILER_FLAGS -Wduplicated-branches
|
||||||
|
# -Wduplicated-cond -Wlogical-op -Wuseless-cast ) endif ()
|
||||||
|
|
||||||
|
if (is_clang)
|
||||||
|
list(APPEND COMPILER_FLAGS -Wshadow # gcc is to aggressive with shadowing
|
||||||
|
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78147
|
||||||
|
)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (is_appleclang)
|
||||||
|
list(APPEND COMPILER_FLAGS -Wreorder-init-list)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# See https://github.com/cpp-best-practices/cppbestpractices/blob/master/02-Use_the_Tools_Available.md#gcc--clang for
|
||||||
|
# the flags description
|
||||||
|
|
||||||
|
target_compile_options(clio_options INTERFACE ${COMPILER_FLAGS})
|
||||||
11
cmake/SourceLocation.cmake
Normal file
11
cmake/SourceLocation.cmake
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
include(CheckIncludeFileCXX)
|
||||||
|
|
||||||
|
check_include_file_cxx("source_location" SOURCE_LOCATION_AVAILABLE)
|
||||||
|
if (SOURCE_LOCATION_AVAILABLE)
|
||||||
|
target_compile_definitions(clio_options INTERFACE "HAS_SOURCE_LOCATION")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
check_include_file_cxx("experimental/source_location" EXPERIMENTAL_SOURCE_LOCATION_AVAILABLE)
|
||||||
|
if (EXPERIMENTAL_SOURCE_LOCATION_AVAILABLE)
|
||||||
|
target_compile_definitions(clio_options INTERFACE "HAS_EXPERIMENTAL_SOURCE_LOCATION")
|
||||||
|
endif ()
|
||||||
4
cmake/deps/Boost.cmake
Normal file
4
cmake/deps/Boost.cmake
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
set(Boost_USE_STATIC_LIBS ON)
|
||||||
|
set(Boost_USE_STATIC_RUNTIME ON)
|
||||||
|
|
||||||
|
find_package(Boost 1.82 REQUIRED CONFIG COMPONENTS program_options coroutine system log log_setup)
|
||||||
3
cmake/deps/OpenSSL.cmake
Normal file
3
cmake/deps/OpenSSL.cmake
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
find_package(OpenSSL 1.1.1 REQUIRED CONFIG)
|
||||||
|
|
||||||
|
set_target_properties(OpenSSL::SSL PROPERTIES INTERFACE_COMPILE_DEFINITIONS OPENSSL_NO_SSL2)
|
||||||
2
cmake/deps/Threads.cmake
Normal file
2
cmake/deps/Threads.cmake
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||||
|
find_package(Threads REQUIRED)
|
||||||
1
cmake/deps/cassandra.cmake
Normal file
1
cmake/deps/cassandra.cmake
Normal file
@@ -0,0 +1 @@
|
|||||||
|
find_package(cassandra-cpp-driver REQUIRED CONFIG)
|
||||||
1
cmake/deps/gbench.cmake
Normal file
1
cmake/deps/gbench.cmake
Normal file
@@ -0,0 +1 @@
|
|||||||
|
find_package(benchmark REQUIRED CONFIG)
|
||||||
4
cmake/deps/gtest.cmake
Normal file
4
cmake/deps/gtest.cmake
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
find_package(GTest REQUIRED)
|
||||||
|
|
||||||
|
enable_testing()
|
||||||
|
include(GoogleTest)
|
||||||
3
cmake/deps/libbacktrace.cmake
Normal file
3
cmake/deps/libbacktrace.cmake
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
target_compile_definitions(clio_options INTERFACE BOOST_STACKTRACE_LINK)
|
||||||
|
target_compile_definitions(clio_options INTERFACE BOOST_STACKTRACE_USE_BACKTRACE)
|
||||||
|
find_package(libbacktrace REQUIRED CONFIG)
|
||||||
1
cmake/deps/libfmt.cmake
Normal file
1
cmake/deps/libfmt.cmake
Normal file
@@ -0,0 +1 @@
|
|||||||
|
find_package(fmt REQUIRED CONFIG)
|
||||||
1
cmake/deps/libxrpl.cmake
Normal file
1
cmake/deps/libxrpl.cmake
Normal file
@@ -0,0 +1 @@
|
|||||||
|
find_package(xrpl REQUIRED CONFIG)
|
||||||
@@ -11,6 +11,7 @@ ExecStart=@CLIO_INSTALL_DIR@/bin/clio_server @CLIO_INSTALL_DIR@/etc/config.json
|
|||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
User=clio
|
User=clio
|
||||||
Group=clio
|
Group=clio
|
||||||
|
LimitNOFILE=65536
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
@@ -2,15 +2,12 @@ set(CLIO_INSTALL_DIR "/opt/clio")
|
|||||||
set(CMAKE_INSTALL_PREFIX ${CLIO_INSTALL_DIR})
|
set(CMAKE_INSTALL_PREFIX ${CLIO_INSTALL_DIR})
|
||||||
|
|
||||||
install(TARGETS clio_server DESTINATION bin)
|
install(TARGETS clio_server DESTINATION bin)
|
||||||
# install(TARGETS clio_tests DESTINATION bin) # NOTE: Do we want to install the tests?
|
|
||||||
|
|
||||||
#install(FILES example-config.json DESTINATION etc RENAME config.json)
|
file(READ docs/examples/config/example-config.json config)
|
||||||
file(READ example-config.json config)
|
|
||||||
string(REGEX REPLACE "./clio_log" "/var/log/clio/" config "${config}")
|
string(REGEX REPLACE "./clio_log" "/var/log/clio/" config "${config}")
|
||||||
file(WRITE ${CMAKE_BINARY_DIR}/install-config.json "${config}")
|
file(WRITE ${CMAKE_BINARY_DIR}/install-config.json "${config}")
|
||||||
install(FILES ${CMAKE_BINARY_DIR}/install-config.json DESTINATION etc RENAME config.json)
|
install(FILES ${CMAKE_BINARY_DIR}/install-config.json DESTINATION etc RENAME config.json)
|
||||||
|
|
||||||
configure_file("${CMAKE_SOURCE_DIR}/CMake/install/clio.service.in" "${CMAKE_BINARY_DIR}/clio.service")
|
configure_file("${CMAKE_SOURCE_DIR}/cmake/install/clio.service.in" "${CMAKE_BINARY_DIR}/clio.service")
|
||||||
|
|
||||||
install(FILES "${CMAKE_BINARY_DIR}/clio.service" DESTINATION /lib/systemd/system)
|
install(FILES "${CMAKE_BINARY_DIR}/clio.service" DESTINATION /lib/systemd/system)
|
||||||
|
|
||||||
103
conanfile.py
Normal file
103
conanfile.py
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
from conan import ConanFile
|
||||||
|
from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout
|
||||||
|
|
||||||
|
class Clio(ConanFile):
|
||||||
|
name = 'clio'
|
||||||
|
license = 'ISC'
|
||||||
|
author = 'Alex Kremer <akremer@ripple.com>, John Freeman <jfreeman@ripple.com>'
|
||||||
|
url = 'https://github.com/xrplf/clio'
|
||||||
|
description = 'Clio RPC server'
|
||||||
|
settings = 'os', 'compiler', 'build_type', 'arch'
|
||||||
|
options = {
|
||||||
|
'static': [True, False], # static linkage
|
||||||
|
'fPIC': [True, False], # unused?
|
||||||
|
'verbose': [True, False],
|
||||||
|
'tests': [True, False], # build unit tests; create `clio_tests` binary
|
||||||
|
'integration_tests': [True, False], # build integration tests; create `clio_integration_tests` binary
|
||||||
|
'benchmark': [True, False], # build benchmarks; create `clio_benchmarks` binary
|
||||||
|
'docs': [True, False], # doxygen API docs; create custom target 'docs'
|
||||||
|
'packaging': [True, False], # create distribution packages
|
||||||
|
'coverage': [True, False], # build for test coverage report; create custom target `clio_tests-ccov`
|
||||||
|
'lint': [True, False], # run clang-tidy checks during compilation
|
||||||
|
}
|
||||||
|
|
||||||
|
requires = [
|
||||||
|
'boost/1.82.0',
|
||||||
|
'cassandra-cpp-driver/2.17.0',
|
||||||
|
'fmt/10.1.1',
|
||||||
|
'protobuf/3.21.9',
|
||||||
|
'grpc/1.50.1',
|
||||||
|
'openssl/1.1.1u',
|
||||||
|
'xrpl/2.3.0-b1',
|
||||||
|
'libbacktrace/cci.20210118'
|
||||||
|
]
|
||||||
|
|
||||||
|
default_options = {
|
||||||
|
'static': False,
|
||||||
|
'fPIC': True,
|
||||||
|
'verbose': False,
|
||||||
|
'tests': False,
|
||||||
|
'integration_tests': False,
|
||||||
|
'benchmark': False,
|
||||||
|
'packaging': False,
|
||||||
|
'coverage': False,
|
||||||
|
'lint': False,
|
||||||
|
'docs': False,
|
||||||
|
|
||||||
|
'xrpl/*:tests': False,
|
||||||
|
'xrpl/*:rocksdb': False,
|
||||||
|
'cassandra-cpp-driver/*:shared': False,
|
||||||
|
'date/*:header_only': True,
|
||||||
|
'grpc/*:shared': False,
|
||||||
|
'grpc/*:secure': True,
|
||||||
|
'libpq/*:shared': False,
|
||||||
|
'lz4/*:shared': False,
|
||||||
|
'openssl/*:shared': False,
|
||||||
|
'protobuf/*:shared': False,
|
||||||
|
'protobuf/*:with_zlib': True,
|
||||||
|
'snappy/*:shared': False,
|
||||||
|
'gtest/*:no_main': True,
|
||||||
|
}
|
||||||
|
|
||||||
|
exports_sources = (
|
||||||
|
'CMakeLists.txt', 'cmake/*', 'src/*'
|
||||||
|
)
|
||||||
|
|
||||||
|
def requirements(self):
|
||||||
|
if self.options.tests or self.options.integration_tests:
|
||||||
|
self.requires('gtest/1.14.0')
|
||||||
|
if self.options.benchmark:
|
||||||
|
self.requires('benchmark/1.8.3')
|
||||||
|
|
||||||
|
def configure(self):
|
||||||
|
if self.settings.compiler == 'apple-clang':
|
||||||
|
self.options['boost'].visibility = 'global'
|
||||||
|
|
||||||
|
def layout(self):
|
||||||
|
cmake_layout(self)
|
||||||
|
# Fix this setting to follow the default introduced in Conan 1.48
|
||||||
|
# to align with our build instructions.
|
||||||
|
self.folders.generators = 'build/generators'
|
||||||
|
|
||||||
|
generators = 'CMakeDeps'
|
||||||
|
def generate(self):
|
||||||
|
tc = CMakeToolchain(self)
|
||||||
|
tc.variables['verbose'] = self.options.verbose
|
||||||
|
tc.variables['static'] = self.options.static
|
||||||
|
tc.variables['tests'] = self.options.tests
|
||||||
|
tc.variables['integration_tests'] = self.options.integration_tests
|
||||||
|
tc.variables['coverage'] = self.options.coverage
|
||||||
|
tc.variables['lint'] = self.options.lint
|
||||||
|
tc.variables['docs'] = self.options.docs
|
||||||
|
tc.variables['packaging'] = self.options.packaging
|
||||||
|
tc.variables['benchmark'] = self.options.benchmark
|
||||||
|
tc.generate()
|
||||||
|
|
||||||
|
def build(self):
|
||||||
|
cmake = CMake(self)
|
||||||
|
cmake.configure()
|
||||||
|
cmake.build()
|
||||||
|
|
||||||
|
def package(self):
|
||||||
|
cmake = CMake(self)
|
||||||
|
cmake.install()
|
||||||
100
docker/ci/dockerfile
Normal file
100
docker/ci/dockerfile
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
FROM rippleci/clio_clang:16
|
||||||
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
|
ARG TARGETARCH
|
||||||
|
|
||||||
|
SHELL ["/bin/bash", "-c"]
|
||||||
|
USER root
|
||||||
|
WORKDIR /root
|
||||||
|
|
||||||
|
ENV CCACHE_VERSION=4.8.3 \
|
||||||
|
LLVM_TOOLS_VERSION=18 \
|
||||||
|
GH_VERSION=2.40.0 \
|
||||||
|
DOXYGEN_VERSION=1.10.0
|
||||||
|
|
||||||
|
# Add repositories
|
||||||
|
RUN apt-get -qq update \
|
||||||
|
&& apt-get -qq install -y --no-install-recommends --no-install-suggests gnupg wget curl software-properties-common \
|
||||||
|
&& echo "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-${LLVM_TOOLS_VERSION} main" >> /etc/apt/sources.list \
|
||||||
|
&& wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add -
|
||||||
|
|
||||||
|
# Install packages
|
||||||
|
RUN apt update -qq \
|
||||||
|
&& apt install -y --no-install-recommends --no-install-suggests python3 python3-pip git git-lfs make ninja-build flex bison jq graphviz \
|
||||||
|
clang-format-${LLVM_TOOLS_VERSION} clang-tidy-${LLVM_TOOLS_VERSION} clang-tools-${LLVM_TOOLS_VERSION} \
|
||||||
|
&& update-alternatives --install /usr/bin/clang-format clang-format /usr/bin/clang-format-${LLVM_TOOLS_VERSION} 100 \
|
||||||
|
&& pip3 install -q --upgrade --no-cache-dir pip && pip3 install -q --no-cache-dir conan==1.62 gcovr cmake cmake-format \
|
||||||
|
&& apt-get clean && apt remove -y software-properties-common
|
||||||
|
|
||||||
|
# Install gcc-12 and make ldconfig aware of the new libstdc++ location (for gcc)
|
||||||
|
# Note: Clang is using libc++ instead
|
||||||
|
COPY --from=rippleci/clio_gcc:12.3.0 /gcc12.deb /
|
||||||
|
RUN apt update && apt-get install -y binutils libc6-dev \
|
||||||
|
&& dpkg -i /gcc12.deb \
|
||||||
|
&& rm -rf /gcc12.deb \
|
||||||
|
&& ldconfig
|
||||||
|
|
||||||
|
# Rewire to use gcc-12 as default compiler
|
||||||
|
RUN update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 100 \
|
||||||
|
&& update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++-12 100 \
|
||||||
|
&& update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100 \
|
||||||
|
&& update-alternatives --install /usr/bin/cc cc /usr/bin/gcc-12 100 \
|
||||||
|
&& update-alternatives --install /usr/bin/gcov gcov /usr/bin/gcov-12 100 \
|
||||||
|
&& update-alternatives --install /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-12 100 \
|
||||||
|
&& update-alternatives --install /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-12 100
|
||||||
|
|
||||||
|
WORKDIR /tmp
|
||||||
|
|
||||||
|
# Install ccache from source
|
||||||
|
RUN wget "https://github.com/ccache/ccache/releases/download/v${CCACHE_VERSION}/ccache-${CCACHE_VERSION}.tar.gz" \
|
||||||
|
&& tar xf "ccache-${CCACHE_VERSION}.tar.gz" \
|
||||||
|
&& cd "ccache-${CCACHE_VERSION}" \
|
||||||
|
&& mkdir build && cd build \
|
||||||
|
&& cmake -GNinja -DCMAKE_BUILD_TYPE=Release .. \
|
||||||
|
&& cmake --build . --target install \
|
||||||
|
&& rm -rf /tmp/* /var/tmp/*
|
||||||
|
|
||||||
|
# Install doxygen from source
|
||||||
|
RUN wget "https://github.com/doxygen/doxygen/releases/download/Release_${DOXYGEN_VERSION//./_}/doxygen-${DOXYGEN_VERSION}.src.tar.gz" \
|
||||||
|
&& tar xf "doxygen-${DOXYGEN_VERSION}.src.tar.gz" \
|
||||||
|
&& cd "doxygen-${DOXYGEN_VERSION}" \
|
||||||
|
&& mkdir build && cd build \
|
||||||
|
&& cmake -GNinja -DCMAKE_BUILD_TYPE=Release .. \
|
||||||
|
&& cmake --build . --target install \
|
||||||
|
&& rm -rf /tmp/* /var/tmp/*
|
||||||
|
|
||||||
|
# Install gh
|
||||||
|
RUN wget https://github.com/cli/cli/releases/download/v${GH_VERSION}/gh_${GH_VERSION}_linux_${TARGETARCH}.tar.gz \
|
||||||
|
&& tar xf gh_${GH_VERSION}_linux_${TARGETARCH}.tar.gz \
|
||||||
|
&& mv gh_${GH_VERSION}_linux_${TARGETARCH}/bin/gh /usr/bin/gh \
|
||||||
|
&& rm -rf /tmp/* /var/tmp/*
|
||||||
|
|
||||||
|
WORKDIR /root
|
||||||
|
# Using root by default is not very secure but github checkout action doesn't work with any other user
|
||||||
|
# https://github.com/actions/checkout/issues/956
|
||||||
|
# And Github Actions doc recommends using root
|
||||||
|
# https://docs.github.com/en/actions/creating-actions/dockerfile-support-for-github-actions#user
|
||||||
|
|
||||||
|
# Setup conan
|
||||||
|
RUN conan remote add --insert 0 conan-non-prod http://18.143.149.228:8081/artifactory/api/conan/conan-non-prod
|
||||||
|
|
||||||
|
# Note: intentionally leaving cppstd=20
|
||||||
|
RUN conan profile new gcc --detect \
|
||||||
|
&& conan profile update settings.compiler=gcc gcc \
|
||||||
|
&& conan profile update settings.compiler.version=12 gcc \
|
||||||
|
&& conan profile update settings.compiler.cppstd=20 gcc \
|
||||||
|
&& conan profile update settings.compiler.libcxx=libstdc++11 gcc \
|
||||||
|
&& conan profile update env.CC=/usr/bin/gcc-12 gcc \
|
||||||
|
&& conan profile update env.CXX=/usr/bin/g++-12 gcc \
|
||||||
|
&& conan profile update "conf.tools.build:compiler_executables={\"c\": \"/usr/bin/gcc-12\", \"cpp\": \"/usr/bin/g++-12\"}" gcc
|
||||||
|
|
||||||
|
RUN conan profile new clang --detect \
|
||||||
|
&& conan profile update settings.compiler=clang clang \
|
||||||
|
&& conan profile update settings.compiler.version=16 clang \
|
||||||
|
&& conan profile update settings.compiler.cppstd=20 clang \
|
||||||
|
&& conan profile update settings.compiler.libcxx=libc++ clang \
|
||||||
|
&& conan profile update env.CC=/usr/bin/clang-16 clang \
|
||||||
|
&& conan profile update env.CXX=/usr/bin/clang++-16 clang \
|
||||||
|
&& conan profile update env.CXXFLAGS="-DBOOST_ASIO_DISABLE_CONCEPTS" clang \
|
||||||
|
&& conan profile update "conf.tools.build:compiler_executables={\"c\": \"/usr/bin/clang-16\", \"cpp\": \"/usr/bin/clang++-16\"}" clang
|
||||||
|
|
||||||
|
RUN echo "include(gcc)" >> .conan/profiles/default
|
||||||
19
docker/compilers/clang-16/dockerfile
Normal file
19
docker/compilers/clang-16/dockerfile
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
FROM ubuntu:focal
|
||||||
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
|
ARG TARGETARCH
|
||||||
|
|
||||||
|
SHELL ["/bin/bash", "-c"]
|
||||||
|
USER root
|
||||||
|
WORKDIR /root
|
||||||
|
|
||||||
|
ENV CLANG_VERSION=16
|
||||||
|
|
||||||
|
RUN apt update -qq \
|
||||||
|
&& apt install -qq -y --no-install-recommends --no-install-suggests \
|
||||||
|
wget software-properties-common gnupg
|
||||||
|
|
||||||
|
RUN wget https://apt.llvm.org/llvm.sh \
|
||||||
|
&& chmod +x llvm.sh \
|
||||||
|
&& ./llvm.sh ${CLANG_VERSION} \
|
||||||
|
&& rm -rf llvm.sh \
|
||||||
|
&& apt-get install -y libc++-16-dev libc++abi-16-dev
|
||||||
6
docker/compilers/gcc-12/control.m4
Normal file
6
docker/compilers/gcc-12/control.m4
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Package: gcc-12-ubuntu-UBUNTUVERSION
|
||||||
|
Version: VERSION
|
||||||
|
Architecture: TARGETARCH
|
||||||
|
Maintainer: Alex Kremer <akremer@ripple.com>
|
||||||
|
Description: Gcc VERSION build for ubuntu UBUNTUVERSION
|
||||||
|
Depends: binutils, libc6-dev
|
||||||
74
docker/compilers/gcc-12/dockerfile
Normal file
74
docker/compilers/gcc-12/dockerfile
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
FROM ubuntu:focal as build
|
||||||
|
|
||||||
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
|
ARG TARGETARCH
|
||||||
|
ARG UBUNTU_VERSION=20.04
|
||||||
|
ARG GCC_VERSION=12.3.0
|
||||||
|
ARG BUILD_VERSION=1
|
||||||
|
|
||||||
|
RUN apt update && apt install -y wget build-essential file flex libz-dev libzstd-dev
|
||||||
|
RUN wget https://gcc.gnu.org/pub/gcc/releases/gcc-$GCC_VERSION/gcc-$GCC_VERSION.tar.gz \
|
||||||
|
&& tar xf gcc-$GCC_VERSION.tar.gz \
|
||||||
|
&& cd /gcc-$GCC_VERSION && ./contrib/download_prerequisites
|
||||||
|
|
||||||
|
RUN mkdir /${TARGETARCH}-gcc-12
|
||||||
|
WORKDIR /${TARGETARCH}-gcc-12
|
||||||
|
RUN /gcc-$GCC_VERSION/configure \
|
||||||
|
--with-pkgversion="clio-build-$BUILD_VERSION https://github.com/XRPLF/clio" \
|
||||||
|
--enable-languages=c,c++ \
|
||||||
|
--prefix=/usr \
|
||||||
|
--with-gcc-major-version-only \
|
||||||
|
--program-suffix=-12 \
|
||||||
|
--enable-shared \
|
||||||
|
--enable-linker-build-id \
|
||||||
|
--libexecdir=/usr/lib \
|
||||||
|
--without-included-gettext \
|
||||||
|
--enable-threads=posix \
|
||||||
|
--libdir=/usr/lib \
|
||||||
|
--disable-nls \
|
||||||
|
--enable-clocale=gnu \
|
||||||
|
--enable-libstdcxx-backtrace=yes \
|
||||||
|
--enable-libstdcxx-debug \
|
||||||
|
--enable-libstdcxx-time=yes \
|
||||||
|
--with-default-libstdcxx-abi=new \
|
||||||
|
--enable-gnu-unique-object \
|
||||||
|
--disable-vtable-verify \
|
||||||
|
--enable-plugin \
|
||||||
|
--enable-default-pie \
|
||||||
|
--with-system-zlib \
|
||||||
|
--enable-libphobos-checking=release \
|
||||||
|
--with-target-system-zlib=auto \
|
||||||
|
--disable-werror \
|
||||||
|
--enable-cet \
|
||||||
|
--disable-multilib \
|
||||||
|
--without-cuda-driver \
|
||||||
|
--enable-checking=release \
|
||||||
|
&& make -j`nproc` \
|
||||||
|
&& make install-strip DESTDIR=/gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION \
|
||||||
|
&& mkdir -p /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/usr/share/gdb/auto-load/usr/lib64 \
|
||||||
|
&& mv /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/usr/lib64/libstdc++.so.6.0.30-gdb.py /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.30-gdb.py
|
||||||
|
|
||||||
|
# Generate deb
|
||||||
|
WORKDIR /
|
||||||
|
COPY control.m4 /
|
||||||
|
COPY ld.so.conf /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/etc/ld.so.conf.d/1-gcc-12.conf
|
||||||
|
|
||||||
|
RUN mkdir /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/DEBIAN \
|
||||||
|
&& m4 -P -DUBUNTU_VERSION=$UBUNTU_VERSION -DVERSION=$GCC_VERSION-$BUILD_VERSION -DTARGETARCH=$TARGETARCH control.m4 > /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/DEBIAN/control \
|
||||||
|
&& dpkg-deb --build --root-owner-group /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION /gcc12.deb
|
||||||
|
|
||||||
|
# Create final image
|
||||||
|
FROM ubuntu:focal as gcc
|
||||||
|
COPY --from=build /gcc12.deb /
|
||||||
|
|
||||||
|
# Make gcc-12 available but also leave gcc12.deb for others to copy if needed
|
||||||
|
RUN apt update && apt-get install -y binutils libc6-dev \
|
||||||
|
&& dpkg -i /gcc12.deb
|
||||||
|
|
||||||
|
RUN update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 100 \
|
||||||
|
&& update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++-12 100 \
|
||||||
|
&& update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100 \
|
||||||
|
&& update-alternatives --install /usr/bin/cc cc /usr/bin/gcc-12 100 \
|
||||||
|
&& update-alternatives --install /usr/bin/gcov gcov /usr/bin/gcov-12 100 \
|
||||||
|
&& update-alternatives --install /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-12 100 \
|
||||||
|
&& update-alternatives --install /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-12 100
|
||||||
2
docker/compilers/gcc-12/ld.so.conf
Normal file
2
docker/compilers/gcc-12/ld.so.conf
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
# Path to the directory containing libstdc++.so.6
|
||||||
|
/usr/lib64
|
||||||
16
docker/develop/compose.yaml
Normal file
16
docker/develop/compose.yaml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
version: '3.7'
|
||||||
|
services:
|
||||||
|
clio_develop:
|
||||||
|
image: rippleci/clio_ci:latest
|
||||||
|
volumes:
|
||||||
|
- clio_develop_conan_data:/root/.conan/data
|
||||||
|
- clio_develop_ccache:/root/.ccache
|
||||||
|
- ../../:/root/clio
|
||||||
|
- clio_develop_build:/root/clio/build_docker
|
||||||
|
working_dir: /root/clio/build_docker
|
||||||
|
tty: true
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
clio_develop_conan_data:
|
||||||
|
clio_develop_ccache:
|
||||||
|
clio_develop_build:
|
||||||
62
docker/develop/run
Executable file
62
docker/develop/run
Executable file
@@ -0,0 +1,62 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
script_dir=$(dirname $0)
|
||||||
|
|
||||||
|
pushd $script_dir > /dev/null
|
||||||
|
|
||||||
|
function start_container {
|
||||||
|
if [ -z "$(docker ps -q -f name=clio_develop)" ]; then
|
||||||
|
docker compose up -d
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function run {
|
||||||
|
start_container
|
||||||
|
docker compose exec clio_develop "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
function stop_container {
|
||||||
|
docker compose down
|
||||||
|
}
|
||||||
|
|
||||||
|
function open_terminal {
|
||||||
|
start_container
|
||||||
|
docker compose exec clio_develop /bin/bash
|
||||||
|
}
|
||||||
|
|
||||||
|
function print_help {
|
||||||
|
cat <<EOF
|
||||||
|
run: Run a command inside the development container.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
run [options or command]
|
||||||
|
|
||||||
|
If no options are provided, the command will be executed inside the container.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-h, --help Show this help message and exit.
|
||||||
|
-t, --terminal Open a terminal inside the container.
|
||||||
|
-s, --stop Stop the container.
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
-h|--help)
|
||||||
|
print_help ;;
|
||||||
|
|
||||||
|
-t|--terminal)
|
||||||
|
open_terminal ;;
|
||||||
|
|
||||||
|
-s|--stop)
|
||||||
|
stop_container ;;
|
||||||
|
|
||||||
|
-*)
|
||||||
|
echo "Unknown option: $1"
|
||||||
|
print_help ;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
run "$@" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
popd > /dev/null
|
||||||
|
|
||||||
8
docs/CMakeLists.txt
Normal file
8
docs/CMakeLists.txt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.20)
|
||||||
|
project(docs)
|
||||||
|
|
||||||
|
include(${CMAKE_CURRENT_SOURCE_DIR}/../cmake/ClioVersion.cmake)
|
||||||
|
|
||||||
|
# Generate `docs` target for doxygen documentation
|
||||||
|
# Note: use `cmake --build . --target docs` from your `build` directory to generate the documentation
|
||||||
|
include(${CMAKE_CURRENT_SOURCE_DIR}/../cmake/Docs.cmake)
|
||||||
44
docs/Doxyfile
Normal file
44
docs/Doxyfile
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
PROJECT_NAME = "Clio"
|
||||||
|
PROJECT_LOGO = ${SOURCE}/docs/img/xrpl-logo.svg
|
||||||
|
PROJECT_NUMBER = ${DOC_CLIO_VERSION}
|
||||||
|
PROJECT_BRIEF = The XRP Ledger API server.
|
||||||
|
|
||||||
|
EXTRACT_ALL = NO
|
||||||
|
EXTRACT_PRIVATE = NO
|
||||||
|
EXTRACT_PACKAGE = YES
|
||||||
|
EXTRACT_STATIC = YES
|
||||||
|
EXTRACT_LOCAL_CLASSES = NO
|
||||||
|
EXTRACT_ANON_NSPACES = NO
|
||||||
|
|
||||||
|
SORT_MEMBERS_CTORS_1ST = YES
|
||||||
|
|
||||||
|
INPUT = ${SOURCE}/src
|
||||||
|
EXCLUDE_SYMBOLS = ${EXCLUDES}
|
||||||
|
RECURSIVE = YES
|
||||||
|
HAVE_DOT = ${USE_DOT}
|
||||||
|
|
||||||
|
QUIET = YES
|
||||||
|
WARNINGS = ${LINT}
|
||||||
|
WARN_NO_PARAMDOC = ${LINT}
|
||||||
|
WARN_IF_INCOMPLETE_DOC = ${LINT}
|
||||||
|
WARN_IF_UNDOCUMENTED = ${LINT}
|
||||||
|
|
||||||
|
GENERATE_LATEX = NO
|
||||||
|
GENERATE_HTML = YES
|
||||||
|
|
||||||
|
SORT_MEMBERS_CTORS_1ST = YES
|
||||||
|
|
||||||
|
GENERATE_TREEVIEW = YES
|
||||||
|
DISABLE_INDEX = NO
|
||||||
|
FULL_SIDEBAR = NO
|
||||||
|
HTML_HEADER = ${SOURCE}/docs/doxygen-awesome-theme/header.html
|
||||||
|
HTML_EXTRA_STYLESHEET = ${SOURCE}/docs/doxygen-awesome-theme/doxygen-awesome.css \
|
||||||
|
${SOURCE}/docs/doxygen-awesome-theme/doxygen-awesome-sidebar-only.css \
|
||||||
|
${SOURCE}/docs/doxygen-awesome-theme/doxygen-awesome-sidebar-only-darkmode-toggle.css
|
||||||
|
HTML_EXTRA_FILES = ${SOURCE}/docs/doxygen-awesome-theme/doxygen-awesome-darkmode-toggle.js \
|
||||||
|
${SOURCE}/docs/doxygen-awesome-theme/doxygen-awesome-interactive-toc.js
|
||||||
|
|
||||||
|
HTML_COLORSTYLE = LIGHT
|
||||||
|
HTML_COLORSTYLE_HUE = 209
|
||||||
|
HTML_COLORSTYLE_SAT = 255
|
||||||
|
HTML_COLORSTYLE_GAMMA = 113
|
||||||
143
docs/build-clio.md
Normal file
143
docs/build-clio.md
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
# How to build Clio
|
||||||
|
|
||||||
|
Clio is built with [CMake](https://cmake.org/) and uses [Conan](https://conan.io/) for managing dependencies. It is written in C++20 and therefore requires a modern compiler.
|
||||||
|
|
||||||
|
## Minimum Requirements
|
||||||
|
|
||||||
|
- [Python 3.7](https://www.python.org/downloads/)
|
||||||
|
- [Conan 1.55](https://conan.io/downloads.html)
|
||||||
|
- [CMake 3.20](https://cmake.org/download/)
|
||||||
|
- [**Optional**] [GCovr](https://gcc.gnu.org/onlinedocs/gcc/Gcov.html): needed for code coverage generation
|
||||||
|
- [**Optional**] [CCache](https://ccache.dev/): speeds up compilation if you are going to compile Clio often
|
||||||
|
|
||||||
|
| Compiler | Version |
|
||||||
|
|-------------|---------|
|
||||||
|
| GCC | 12.3 |
|
||||||
|
| Clang | 16 |
|
||||||
|
| Apple Clang | 15 |
|
||||||
|
|
||||||
|
### Conan Configuration
|
||||||
|
|
||||||
|
Clio does not require anything other than `compiler.cppstd=20` in your (`~/.conan/profiles/default`) Conan profile.
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> Although Clio is built using C++23, it's required to set `compiler.cppstd=20` for the time being as some of Clio's dependencies are not yet capable of building under C++23.
|
||||||
|
|
||||||
|
> Mac example:
|
||||||
|
|
||||||
|
```
|
||||||
|
[settings]
|
||||||
|
os=Macos
|
||||||
|
os_build=Macos
|
||||||
|
arch=armv8
|
||||||
|
arch_build=armv8
|
||||||
|
compiler=apple-clang
|
||||||
|
compiler.version=15
|
||||||
|
compiler.libcxx=libc++
|
||||||
|
build_type=Release
|
||||||
|
compiler.cppstd=20
|
||||||
|
[conf]
|
||||||
|
tools.build:cxxflags+=["-DBOOST_ASIO_DISABLE_CONCEPTS"]
|
||||||
|
```
|
||||||
|
|
||||||
|
> Linux example:
|
||||||
|
|
||||||
|
```
|
||||||
|
[settings]
|
||||||
|
os=Linux
|
||||||
|
os_build=Linux
|
||||||
|
arch=x86_64
|
||||||
|
arch_build=x86_64
|
||||||
|
compiler=gcc
|
||||||
|
compiler.version=12
|
||||||
|
compiler.libcxx=libstdc++11
|
||||||
|
build_type=Release
|
||||||
|
compiler.cppstd=20
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Artifactory
|
||||||
|
|
||||||
|
Make sure artifactory is setup with Conan.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
conan remote add --insert 0 conan-non-prod http://18.143.149.228:8081/artifactory/api/conan/conan-non-prod
|
||||||
|
```
|
||||||
|
|
||||||
|
Now you should be able to download the prebuilt `xrpl` package on some platforms.
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> You may need to edit the `~/.conan/remotes.json` file to ensure that this newly added artifactory is listed last. Otherwise, you could see compilation errors when building the project with gcc version 13 (or newer).
|
||||||
|
|
||||||
|
Remove old packages you may have cached.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
conan remove -f xrpl
|
||||||
|
```
|
||||||
|
|
||||||
|
## Building Clio
|
||||||
|
|
||||||
|
Navigate to Clio's root directory and run:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
mkdir build && cd build
|
||||||
|
conan install .. --output-folder . --build missing --settings build_type=Release -o tests=True -o lint=False
|
||||||
|
cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release ..
|
||||||
|
cmake --build . --parallel 8 # or without the number if you feel extra adventurous
|
||||||
|
```
|
||||||
|
|
||||||
|
> [!TIP]
|
||||||
|
> You can omit the `-o tests=True` if you don't want to build `clio_tests`.
|
||||||
|
|
||||||
|
If successful, `conan install` will find the required packages and `cmake` will do the rest. You should see `clio_server` and `clio_tests` in the `build` directory (the current directory).
|
||||||
|
|
||||||
|
> [!TIP]
|
||||||
|
> To generate a Code Coverage report, include `-o coverage=True` in the `conan install` command above, along with `-o tests=True` to enable tests. After running the `cmake` commands, execute `make clio_tests-ccov`. The coverage report will be found at `clio_tests-llvm-cov/index.html`.
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> If you've built Clio before and the build is now failing, it's likely due to updated dependencies. Try deleting the build folder and then rerunning the Conan and CMake commands mentioned above.
|
||||||
|
|
||||||
|
### Generating API docs for Clio
|
||||||
|
|
||||||
|
The API documentation for Clio is generated by [Doxygen](https://www.doxygen.nl/index.html). If you want to generate the API documentation when building Clio, make sure to install Doxygen on your system.
|
||||||
|
|
||||||
|
To generate the API docs:
|
||||||
|
|
||||||
|
1. First, include `-o docs=True` in the conan install command. For example:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
mkdir build && cd build
|
||||||
|
conan install .. --output-folder . --build missing --settings build_type=Release -o tests=True -o lint=False -o docs=True
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Once that has completed successfully, run the `cmake` command and add the `--target docs` option:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release ..
|
||||||
|
cmake --build . --parallel 8 --target docs
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Go to `build/docs/html` to view the generated files.
|
||||||
|
|
||||||
|
Open the `index.html` file in your browser to see the documentation pages.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Building Clio with Docker
|
||||||
|
|
||||||
|
It is also possible to build Clio using [Docker](https://www.docker.com/) if you don't want to install all the dependencies on your machine.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker run -it rippleci/clio_ci:latest
|
||||||
|
git clone https://github.com/XRPLF/clio
|
||||||
|
mkdir build && cd build
|
||||||
|
conan install .. --output-folder . --build missing --settings build_type=Release -o tests=True -o lint=False
|
||||||
|
cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release ..
|
||||||
|
cmake --build . --parallel 8 # or without the number if you feel extra adventurous
|
||||||
|
```
|
||||||
|
|
||||||
|
## Developing against `rippled` in standalone mode
|
||||||
|
|
||||||
|
If you wish to develop against a `rippled` instance running in standalone mode there are a few quirks of both Clio and `rippled` that you need to keep in mind. You must:
|
||||||
|
|
||||||
|
1. Advance the `rippled` ledger to at least ledger 256.
|
||||||
|
2. Wait 10 minutes before first starting Clio against this standalone node.
|
||||||
107
docs/configure-clio.md
Normal file
107
docs/configure-clio.md
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
# How to configure Clio and `rippled`
|
||||||
|
|
||||||
|
## Ports
|
||||||
|
|
||||||
|
Clio needs access to a `rippled` server in order to work. The following configurations are required for Clio and `rippled` to communicate:
|
||||||
|
|
||||||
|
1. In the Clio config file, provide the following:
|
||||||
|
|
||||||
|
- The IP of the `rippled` server
|
||||||
|
|
||||||
|
- The port on which `rippled` is accepting unencrypted WebSocket connections
|
||||||
|
|
||||||
|
- The port on which `rippled` is handling gRPC requests
|
||||||
|
|
||||||
|
2. In the `rippled` config file, you need to open:
|
||||||
|
|
||||||
|
- A port to accept unencrypted WebSocket connections
|
||||||
|
|
||||||
|
- A port to handle gRPC requests, with the IP(s) of Clio specified in the `secure_gateway` entry
|
||||||
|
|
||||||
|
The example configs of [rippled](https://github.com/XRPLF/rippled/blob/develop/cfg/rippled-example.cfg) and [Clio](../docs/examples/config/example-config.json) are set up in a way that minimal changes are required.
|
||||||
|
When running locally, the only change needed is to uncomment the `port_grpc` section of the `rippled` config.
|
||||||
|
|
||||||
|
If you're running Clio and `rippled` on separate machines, in addition to uncommenting the `port_grpc` section, a few other steps must be taken:
|
||||||
|
|
||||||
|
1. Change the `ip` in `etl_sources` to the IP where your `rippled` server is running.
|
||||||
|
|
||||||
|
2. Open a public, unencrypted WebSocket port on your `rippled` server.
|
||||||
|
|
||||||
|
3. In the `rippled` config, change the IP specified for `secure_gateway`, under the `port_grpc` and websocket server sections, to the IP of your Clio server. This entry can take the form of a comma-separated list if you are running multiple Clio nodes.
|
||||||
|
|
||||||
|
## Ledger sequence
|
||||||
|
|
||||||
|
The parameter `start_sequence` can be included and configured within the top level of the config file. This parameter specifies the sequence of the first ledger to extract if the database is empty.
|
||||||
|
|
||||||
|
Note that ETL extracts ledgers in order, and backfilling functionality currently doesn't exist. This means Clio does not retroactively learn ledgers older than the one you specify. Choosing to specify this or not will yield the following behavior:
|
||||||
|
|
||||||
|
- If this setting is absent and the database is empty, ETL will start with the next ledger validated by the network.
|
||||||
|
|
||||||
|
- If this setting is present and the database is not empty, an exception is thrown.
|
||||||
|
|
||||||
|
In addition, the optional parameter `finish_sequence` can be added to the json file as well, specifying where the ledger can stop.
|
||||||
|
|
||||||
|
To add `start_sequence` and/or `finish_sequence` to the `config.json` file appropriately, they must be on the same top level of precedence as other parameters (i.e., `database`, `etl_sources`, `read_only`) and be specified with an integer.
|
||||||
|
|
||||||
|
Here is an example snippet from the config file:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"start_sequence": 12345,
|
||||||
|
"finish_sequence": 54321
|
||||||
|
```
|
||||||
|
|
||||||
|
## SSL
|
||||||
|
|
||||||
|
The parameters `ssl_cert_file` and `ssl_key_file` can also be added to the top level of precedence of our Clio config. The `ssl_cert_file` field specifies the filepath for your SSL cert, while `ssl_key_file` specifies the filepath for your SSL key. It is up to you how to change ownership of these folders for your designated Clio user.
|
||||||
|
|
||||||
|
Your options include:
|
||||||
|
|
||||||
|
- Copying the two files as root somewhere that's accessible by the Clio user, then running `sudo chown` to your user
|
||||||
|
- Changing the permissions directly so it's readable by your Clio user
|
||||||
|
- Running Clio as root (strongly discouraged)
|
||||||
|
|
||||||
|
Here is an example of how to specify `ssl_cert_file` and `ssl_key_file` in the config:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"server": {
|
||||||
|
"ip": "0.0.0.0",
|
||||||
|
"port": 51233
|
||||||
|
},
|
||||||
|
"ssl_cert_file": "/full/path/to/cert.file",
|
||||||
|
"ssl_key_file": "/full/path/to/key.file"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Admin rights for requests
|
||||||
|
|
||||||
|
By default Clio checks admin privileges by IP address from requests (only `127.0.0.1` is considered to be an admin). This is not very secure because the IP could be spoofed. For better security, an `admin_password` can be provided in the `server` section of Clio's config:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"server": {
|
||||||
|
"admin_password": "secret"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
If the password is presented in the config, Clio will check the Authorization header (if any) in each request for the password. The Authorization header should contain the type `Password`, and the password from the config (e.g. `Password secret`).
|
||||||
|
Exactly equal password gains admin rights for the request or a websocket connection.
|
||||||
|
|
||||||
|
## ETL sources forwarding cache
|
||||||
|
|
||||||
|
Clio can cache requests to ETL sources to reduce the load on the ETL source.
|
||||||
|
Only following commands are cached: `server_info`, `server_state`, `server_definitions`, `fee`, `ledger_closed`.
|
||||||
|
By default the forwarding cache is off.
|
||||||
|
To enable the caching for a source, `forwarding_cache_timeout` value should be added to the configuration file, e.g.:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"forwarding_cache_timeout": 0.250,
|
||||||
|
```
|
||||||
|
|
||||||
|
`forwarding_cache_timeout` defines for how long (in seconds) a cache entry will be valid after being placed into the cache.
|
||||||
|
Zero value turns off the cache feature.
|
||||||
|
|
||||||
|
## Graceful shutdown (not fully implemented yet)
|
||||||
|
|
||||||
|
Clio can be gracefully shut down by sending a `SIGINT` (Ctrl+C) or `SIGTERM` signal.
|
||||||
|
The process will stop accepting new connections and will wait for the time specified in `graceful_period` config value (or 10 seconds by default).
|
||||||
|
If Clio finishes all the scheduled operations before the end of the period, it will stop immediately.
|
||||||
|
Otherwise, it will wait for the period to finish and then exit without finishing operations.
|
||||||
|
If Clio receives a second signal during the period, it will stop immediately.
|
||||||
33
docs/coverage-report.md
Normal file
33
docs/coverage-report.md
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
# Coverage report
|
||||||
|
|
||||||
|
Coverage report is intended for developers using compilers GCC or Clang (including Apple Clang). It is generated by the build target `coverage_report`, which is only enabled when both `tests` and `coverage` options are set (e.g., with `-o coverage=True -o tests=True` in `conan`).
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
To generate the coverage report you need:
|
||||||
|
|
||||||
|
- [gcovr tool](https://gcovr.com/en/stable/getting-started.html) (can be installed e.g. with `pip install gcovr`)
|
||||||
|
- `gcov` for GCC (installed with the compiler by default)
|
||||||
|
- `llvm-cov` for Clang (installed with the compiler by default, also on Apple)
|
||||||
|
- `Debug` build type
|
||||||
|
|
||||||
|
## Creating the coverage report
|
||||||
|
|
||||||
|
The coverage report is created when the following steps are completed, in order:
|
||||||
|
|
||||||
|
1. `clio_tests` binary built with the instrumentation data, enabled by the `coverage`
|
||||||
|
option mentioned above.
|
||||||
|
2. Completed run of unit tests, which populates coverage capture data.
|
||||||
|
3. Completed run of `gcovr` tool, which internally invokes either `gcov` or `llvm-cov`
|
||||||
|
to assemble both instrumentation data and coverage capture data into a coverage report.
|
||||||
|
|
||||||
|
The above steps are automated into a single target `coverage_report`. The instrumented `clio_tests` binary can also be used for running regular unit tests.
|
||||||
|
|
||||||
|
In case of a spurious failure of unit tests, it is possible to re-run the `coverage_report` target without rebuilding the `clio_tests` binary (since it is simply a dependency of the coverage report target).
|
||||||
|
|
||||||
|
The default coverage report format is `html-details`, but developers can override it to any of the formats listed in `cmake/CodeCoverage.cmake` by setting `CODE_COVERAGE_REPORT_FORMAT` variable in `cmake`. For example, CI is setting this parameter to `xml` for the [codecov](https://codecov.io) integration.
|
||||||
|
|
||||||
|
After the `coverage_report` target is completed, the generated coverage report will be stored inside the build directory as either:
|
||||||
|
|
||||||
|
- A File named `coverage_report.*`, with a suitable extension for the report format.
|
||||||
|
- A Directory named `coverage_report`, with `index.html` and other files inside, for `html-details` or `html-nested` report formats.
|
||||||
21
docs/doxygen-awesome-theme/LICENSE
Normal file
21
docs/doxygen-awesome-theme/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2021 - 2023 jothepro
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
157
docs/doxygen-awesome-theme/doxygen-awesome-darkmode-toggle.js
Normal file
157
docs/doxygen-awesome-theme/doxygen-awesome-darkmode-toggle.js
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
/**
|
||||||
|
|
||||||
|
Doxygen Awesome
|
||||||
|
https://github.com/jothepro/doxygen-awesome-css
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2021 - 2023 jothepro
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
class DoxygenAwesomeDarkModeToggle extends HTMLElement {
|
||||||
|
// SVG icons from https://fonts.google.com/icons
|
||||||
|
// Licensed under the Apache 2.0 license:
|
||||||
|
// https://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
static lightModeIcon = `<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#FCBF00"><rect fill="none" height="24" width="24"/><circle cx="12" cy="12" opacity=".3" r="3"/><path d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"/></svg>`
|
||||||
|
static darkModeIcon = `<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#FE9700"><rect fill="none" height="24" width="24"/><path d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27 C17.45,17.19,14.93,19,12,19c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z" opacity=".3"/><path d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"/></svg>`
|
||||||
|
static title = "Toggle Light/Dark Mode"
|
||||||
|
|
||||||
|
static prefersLightModeInDarkModeKey = "prefers-light-mode-in-dark-mode"
|
||||||
|
static prefersDarkModeInLightModeKey = "prefers-dark-mode-in-light-mode"
|
||||||
|
|
||||||
|
static _staticConstructor = function() {
|
||||||
|
DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.userPreference)
|
||||||
|
// Update the color scheme when the browsers preference changes
|
||||||
|
// without user interaction on the website.
|
||||||
|
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
|
||||||
|
DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged()
|
||||||
|
})
|
||||||
|
// Update the color scheme when the tab is made visible again.
|
||||||
|
// It is possible that the appearance was changed in another tab
|
||||||
|
// while this tab was in the background.
|
||||||
|
document.addEventListener("visibilitychange", visibilityState => {
|
||||||
|
if (document.visibilityState === 'visible') {
|
||||||
|
DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged()
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}()
|
||||||
|
|
||||||
|
static init() {
|
||||||
|
$(function() {
|
||||||
|
$(document).ready(function() {
|
||||||
|
const toggleButton = document.createElement('doxygen-awesome-dark-mode-toggle')
|
||||||
|
toggleButton.title = DoxygenAwesomeDarkModeToggle.title
|
||||||
|
toggleButton.updateIcon()
|
||||||
|
|
||||||
|
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
|
||||||
|
toggleButton.updateIcon()
|
||||||
|
})
|
||||||
|
document.addEventListener("visibilitychange", visibilityState => {
|
||||||
|
if (document.visibilityState === 'visible') {
|
||||||
|
toggleButton.updateIcon()
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$(document).ready(function(){
|
||||||
|
document.getElementById("MSearchBox").parentNode.appendChild(toggleButton)
|
||||||
|
})
|
||||||
|
$(window).resize(function(){
|
||||||
|
document.getElementById("MSearchBox").parentNode.appendChild(toggleButton)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.onclick=this.toggleDarkMode
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns `true` for dark-mode, `false` for light-mode system preference
|
||||||
|
*/
|
||||||
|
static get systemPreference() {
|
||||||
|
return window.matchMedia('(prefers-color-scheme: dark)').matches
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns `true` for dark-mode, `false` for light-mode user preference
|
||||||
|
*/
|
||||||
|
static get userPreference() {
|
||||||
|
return (!DoxygenAwesomeDarkModeToggle.systemPreference && localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)) ||
|
||||||
|
(DoxygenAwesomeDarkModeToggle.systemPreference && !localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey))
|
||||||
|
}
|
||||||
|
|
||||||
|
static set userPreference(userPreference) {
|
||||||
|
DoxygenAwesomeDarkModeToggle.darkModeEnabled = userPreference
|
||||||
|
if(!userPreference) {
|
||||||
|
if(DoxygenAwesomeDarkModeToggle.systemPreference) {
|
||||||
|
localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey, true)
|
||||||
|
} else {
|
||||||
|
localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(!DoxygenAwesomeDarkModeToggle.systemPreference) {
|
||||||
|
localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey, true)
|
||||||
|
} else {
|
||||||
|
localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DoxygenAwesomeDarkModeToggle.onUserPreferenceChanged()
|
||||||
|
}
|
||||||
|
|
||||||
|
static enableDarkMode(enable) {
|
||||||
|
if(enable) {
|
||||||
|
DoxygenAwesomeDarkModeToggle.darkModeEnabled = true
|
||||||
|
document.documentElement.classList.add("dark-mode")
|
||||||
|
document.documentElement.classList.remove("light-mode")
|
||||||
|
} else {
|
||||||
|
DoxygenAwesomeDarkModeToggle.darkModeEnabled = false
|
||||||
|
document.documentElement.classList.remove("dark-mode")
|
||||||
|
document.documentElement.classList.add("light-mode")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static onSystemPreferenceChanged() {
|
||||||
|
DoxygenAwesomeDarkModeToggle.darkModeEnabled = DoxygenAwesomeDarkModeToggle.userPreference
|
||||||
|
DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled)
|
||||||
|
}
|
||||||
|
|
||||||
|
static onUserPreferenceChanged() {
|
||||||
|
DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled)
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleDarkMode() {
|
||||||
|
DoxygenAwesomeDarkModeToggle.userPreference = !DoxygenAwesomeDarkModeToggle.userPreference
|
||||||
|
this.updateIcon()
|
||||||
|
}
|
||||||
|
|
||||||
|
updateIcon() {
|
||||||
|
if(DoxygenAwesomeDarkModeToggle.darkModeEnabled) {
|
||||||
|
this.innerHTML = DoxygenAwesomeDarkModeToggle.darkModeIcon
|
||||||
|
} else {
|
||||||
|
this.innerHTML = DoxygenAwesomeDarkModeToggle.lightModeIcon
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
customElements.define("doxygen-awesome-dark-mode-toggle", DoxygenAwesomeDarkModeToggle);
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
/**
|
||||||
|
|
||||||
|
Doxygen Awesome
|
||||||
|
https://github.com/jothepro/doxygen-awesome-css
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2022 - 2023 jothepro
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
class DoxygenAwesomeInteractiveToc {
|
||||||
|
static topOffset = 38
|
||||||
|
static hideMobileMenu = true
|
||||||
|
static headers = []
|
||||||
|
|
||||||
|
static init() {
|
||||||
|
window.addEventListener("load", () => {
|
||||||
|
let toc = document.querySelector(".contents > .toc")
|
||||||
|
if(toc) {
|
||||||
|
toc.classList.add("interactive")
|
||||||
|
if(!DoxygenAwesomeInteractiveToc.hideMobileMenu) {
|
||||||
|
toc.classList.add("open")
|
||||||
|
}
|
||||||
|
document.querySelector(".contents > .toc > h3")?.addEventListener("click", () => {
|
||||||
|
if(toc.classList.contains("open")) {
|
||||||
|
toc.classList.remove("open")
|
||||||
|
} else {
|
||||||
|
toc.classList.add("open")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
document.querySelectorAll(".contents > .toc > ul a").forEach((node) => {
|
||||||
|
let id = node.getAttribute("href").substring(1)
|
||||||
|
DoxygenAwesomeInteractiveToc.headers.push({
|
||||||
|
node: node,
|
||||||
|
headerNode: document.getElementById(id)
|
||||||
|
})
|
||||||
|
|
||||||
|
document.getElementById("doc-content")?.addEventListener("scroll", () => {
|
||||||
|
DoxygenAwesomeInteractiveToc.update()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
DoxygenAwesomeInteractiveToc.update()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
static update() {
|
||||||
|
let active = DoxygenAwesomeInteractiveToc.headers[0]?.node
|
||||||
|
DoxygenAwesomeInteractiveToc.headers.forEach((header) => {
|
||||||
|
let position = header.headerNode.getBoundingClientRect().top
|
||||||
|
header.node.classList.remove("active")
|
||||||
|
header.node.classList.remove("aboveActive")
|
||||||
|
if(position < DoxygenAwesomeInteractiveToc.topOffset) {
|
||||||
|
active = header.node
|
||||||
|
active?.classList.add("aboveActive")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
active?.classList.add("active")
|
||||||
|
active?.classList.remove("aboveActive")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
|
||||||
|
Doxygen Awesome
|
||||||
|
https://github.com/jothepro/doxygen-awesome-css
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2021 - 2023 jothepro
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
@media screen and (min-width: 768px) {
|
||||||
|
|
||||||
|
#MSearchBox {
|
||||||
|
width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - var(--searchbar-height) - 1px);
|
||||||
|
}
|
||||||
|
|
||||||
|
#MSearchField {
|
||||||
|
width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 66px - var(--searchbar-height));
|
||||||
|
}
|
||||||
|
}
|
||||||
116
docs/doxygen-awesome-theme/doxygen-awesome-sidebar-only.css
Normal file
116
docs/doxygen-awesome-theme/doxygen-awesome-sidebar-only.css
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
/**
|
||||||
|
|
||||||
|
Doxygen Awesome
|
||||||
|
https://github.com/jothepro/doxygen-awesome-css
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2021 - 2023 jothepro
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
html {
|
||||||
|
/* side nav width. MUST be = `TREEVIEW_WIDTH`.
|
||||||
|
* Make sure it is wide enough to contain the page title (logo + title + version)
|
||||||
|
*/
|
||||||
|
--side-nav-fixed-width: 335px;
|
||||||
|
--menu-display: none;
|
||||||
|
|
||||||
|
--top-height: 120px;
|
||||||
|
--toc-sticky-top: -25px;
|
||||||
|
--toc-max-height: calc(100vh - 2 * var(--spacing-medium) - 25px);
|
||||||
|
}
|
||||||
|
|
||||||
|
#projectname {
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@media screen and (min-width: 768px) {
|
||||||
|
html {
|
||||||
|
--searchbar-background: var(--page-background-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
#side-nav {
|
||||||
|
min-width: var(--side-nav-fixed-width);
|
||||||
|
max-width: var(--side-nav-fixed-width);
|
||||||
|
top: var(--top-height);
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav-tree, #side-nav {
|
||||||
|
height: calc(100vh - var(--top-height)) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav-tree {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#top {
|
||||||
|
display: block;
|
||||||
|
border-bottom: none;
|
||||||
|
height: var(--top-height);
|
||||||
|
margin-bottom: calc(0px - var(--top-height));
|
||||||
|
max-width: var(--side-nav-fixed-width);
|
||||||
|
overflow: hidden;
|
||||||
|
background: var(--side-nav-background);
|
||||||
|
}
|
||||||
|
#main-nav {
|
||||||
|
float: left;
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui-resizable-handle {
|
||||||
|
cursor: default;
|
||||||
|
width: 1px !important;
|
||||||
|
background: var(--separator-color);
|
||||||
|
box-shadow: 0 calc(-2 * var(--top-height)) 0 0 var(--separator-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
#nav-path {
|
||||||
|
position: fixed;
|
||||||
|
right: 0;
|
||||||
|
left: var(--side-nav-fixed-width);
|
||||||
|
bottom: 0;
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
#doc-content {
|
||||||
|
height: calc(100vh - 31px) !important;
|
||||||
|
padding-bottom: calc(3 * var(--spacing-large));
|
||||||
|
padding-top: calc(var(--top-height) - 80px);
|
||||||
|
box-sizing: border-box;
|
||||||
|
margin-left: var(--side-nav-fixed-width) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#MSearchBox {
|
||||||
|
width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#MSearchField {
|
||||||
|
width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 65px);
|
||||||
|
}
|
||||||
|
|
||||||
|
#MSearchResultsWindow {
|
||||||
|
left: var(--spacing-medium) !important;
|
||||||
|
right: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
2669
docs/doxygen-awesome-theme/doxygen-awesome.css
Normal file
2669
docs/doxygen-awesome-theme/doxygen-awesome.css
Normal file
File diff suppressed because it is too large
Load Diff
82
docs/doxygen-awesome-theme/header.html
Normal file
82
docs/doxygen-awesome-theme/header.html
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
<!-- HTML header for doxygen 1.9.7-->
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="$langISO">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
|
||||||
|
<meta name="generator" content="Doxygen $doxygenversion"/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||||
|
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
|
||||||
|
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
|
||||||
|
<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>
|
||||||
|
<!--BEGIN DISABLE_INDEX-->
|
||||||
|
<!--BEGIN FULL_SIDEBAR-->
|
||||||
|
<script type="text/javascript">var page_layout=1;</script>
|
||||||
|
<!--END FULL_SIDEBAR-->
|
||||||
|
<!--END DISABLE_INDEX-->
|
||||||
|
<script type="text/javascript" src="$relpath^jquery.js"></script>
|
||||||
|
<script type="text/javascript" src="$relpath^dynsections.js"></script>
|
||||||
|
$treeview
|
||||||
|
$search
|
||||||
|
$mathjax
|
||||||
|
$darkmode
|
||||||
|
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
|
||||||
|
$extrastylesheet
|
||||||
|
<script type="text/javascript" src="$relpath^doxygen-awesome-darkmode-toggle.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
DoxygenAwesomeDarkModeToggle.init()
|
||||||
|
</script>
|
||||||
|
<script type="text/javascript" src="$relpath^doxygen-awesome-interactive-toc.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
DoxygenAwesomeInteractiveToc.init()
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!--BEGIN DISABLE_INDEX-->
|
||||||
|
<!--BEGIN FULL_SIDEBAR-->
|
||||||
|
<div id="side-nav" class="ui-resizable side-nav-resizable"><!-- do not remove this div, it is closed by doxygen! -->
|
||||||
|
<!--END FULL_SIDEBAR-->
|
||||||
|
<!--END DISABLE_INDEX-->
|
||||||
|
|
||||||
|
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
||||||
|
|
||||||
|
<!--BEGIN TITLEAREA-->
|
||||||
|
<div id="titlearea">
|
||||||
|
<table cellspacing="0" cellpadding="0">
|
||||||
|
<tbody>
|
||||||
|
<tr id="projectrow">
|
||||||
|
<!--BEGIN PROJECT_LOGO-->
|
||||||
|
<td id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"/></td>
|
||||||
|
<!--END PROJECT_LOGO-->
|
||||||
|
<!--BEGIN PROJECT_NAME-->
|
||||||
|
<td id="projectalign">
|
||||||
|
<div id="projectname">$projectname<!--BEGIN PROJECT_NUMBER--><span id="projectnumber"> $projectnumber</span><!--END PROJECT_NUMBER-->
|
||||||
|
</div>
|
||||||
|
<!--BEGIN PROJECT_BRIEF--><div id="projectbrief">$projectbrief</div><!--END PROJECT_BRIEF-->
|
||||||
|
</td>
|
||||||
|
<!--END PROJECT_NAME-->
|
||||||
|
<!--BEGIN !PROJECT_NAME-->
|
||||||
|
<!--BEGIN PROJECT_BRIEF-->
|
||||||
|
<td>
|
||||||
|
<div id="projectbrief">$projectbrief</div>
|
||||||
|
</td>
|
||||||
|
<!--END PROJECT_BRIEF-->
|
||||||
|
<!--END !PROJECT_NAME-->
|
||||||
|
<!--BEGIN DISABLE_INDEX-->
|
||||||
|
<!--BEGIN SEARCHENGINE-->
|
||||||
|
<!--BEGIN !FULL_SIDEBAR-->
|
||||||
|
<td>$searchbox</td>
|
||||||
|
<!--END !FULL_SIDEBAR-->
|
||||||
|
<!--END SEARCHENGINE-->
|
||||||
|
<!--END DISABLE_INDEX-->
|
||||||
|
</tr>
|
||||||
|
<!--BEGIN SEARCHENGINE-->
|
||||||
|
<!--BEGIN FULL_SIDEBAR-->
|
||||||
|
<tr><td colspan="2">$searchbox</td></tr>
|
||||||
|
<!--END FULL_SIDEBAR-->
|
||||||
|
<!--END SEARCHENGINE-->
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--END TITLEAREA-->
|
||||||
|
<!-- end header part -->
|
||||||
43
docs/examples/config/cloud-example-config.json
Normal file
43
docs/examples/config/cloud-example-config.json
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* This is an example configuration file. Please do not use without modifying to suit your needs.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
"database": {
|
||||||
|
"type": "cassandra",
|
||||||
|
"cassandra": {
|
||||||
|
// This option can be used to setup a secure connect bundle connection
|
||||||
|
"secure_connect_bundle": "[path/to/zip. ignore if using contact_points]",
|
||||||
|
// The following options are used only if using contact_points
|
||||||
|
"contact_points": "[ip. ignore if using secure_connect_bundle]",
|
||||||
|
"port": "[port. ignore if using_secure_connect_bundle]",
|
||||||
|
// Authentication settings
|
||||||
|
"username": "[username, if any]",
|
||||||
|
"password": "[password, if any]",
|
||||||
|
// Other common settings
|
||||||
|
"keyspace": "clio",
|
||||||
|
"max_write_requests_outstanding": 25000,
|
||||||
|
"max_read_requests_outstanding": 30000,
|
||||||
|
"threads": 8
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"etl_sources": [
|
||||||
|
{
|
||||||
|
"ip": "[rippled ip]",
|
||||||
|
"ws_port": "6006",
|
||||||
|
"grpc_port": "50051"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dos_guard": {
|
||||||
|
"whitelist": [
|
||||||
|
"127.0.0.1"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"server": {
|
||||||
|
"ip": "0.0.0.0",
|
||||||
|
"port": 8080
|
||||||
|
},
|
||||||
|
"log_level": "debug",
|
||||||
|
"log_file": "./clio.log",
|
||||||
|
"extractor_threads": 8,
|
||||||
|
"read_only": false
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user