mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
Compare commits
6955 Commits
v0.1.9
...
weekly.202
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d60f148b0c | ||
|
|
50a3009113 | ||
|
|
9345d489f8 | ||
|
|
52ccdd747f | ||
|
|
d0a2992335 | ||
|
|
02ba923ba7 | ||
|
|
34049f7135 | ||
|
|
951d0ace89 | ||
|
|
b64945a6c0 | ||
|
|
b578e60dd5 | ||
|
|
da1c361cfe | ||
|
|
cf7b45b074 | ||
|
|
0c18b3bea6 | ||
|
|
d12f5f7ba0 | ||
|
|
cae3bd7f32 | ||
|
|
e160f6e7d2 | ||
|
|
b37550c279 | ||
|
|
9b6a1552e9 | ||
|
|
d590ce7675 | ||
|
|
6c100a0bc3 | ||
|
|
15ffce1317 | ||
|
|
793f9ae9e3 | ||
|
|
06eaded6ea | ||
|
|
b8bb034f91 | ||
|
|
110c7e6f90 | ||
|
|
eefdf4baa6 | ||
|
|
2f6757b315 | ||
|
|
b1e3db712e | ||
|
|
558a756431 | ||
|
|
97ed2bf211 | ||
|
|
c5a7c51dfd | ||
|
|
30da85a4d5 | ||
|
|
c1b25dd61d | ||
|
|
1037d3a383 | ||
|
|
4b94c29c91 | ||
|
|
ce1fa1194d | ||
|
|
93fe2ce22d | ||
|
|
1356ac63b4 | ||
|
|
2691163a7e | ||
|
|
f8af866f76 | ||
|
|
cd46eb42d7 | ||
|
|
ca7692c839 | ||
|
|
d8b8aca51e | ||
|
|
ff26f0539c | ||
|
|
dedb8f7e41 | ||
|
|
7c394b9d58 | ||
|
|
953a51bec8 | ||
|
|
8adc8ed103 | ||
|
|
394e9c4c56 | ||
|
|
c5cd53ca79 | ||
|
|
0ff541375d | ||
|
|
3612bd58ef | ||
|
|
cc1d313d68 | ||
|
|
0ddf0a4b92 | ||
|
|
d3deaa1f59 | ||
|
|
4f540e6ac3 | ||
|
|
5b6eb7b2c9 | ||
|
|
54e03f60b9 | ||
|
|
6a1e0322bd | ||
|
|
f1965c0510 | ||
|
|
88835a0456 | ||
|
|
9b583f51f1 | ||
|
|
34e124d5f7 | ||
|
|
fe0ded9a91 | ||
|
|
a7d917474d | ||
|
|
0e54b9acb5 | ||
|
|
4f658ec292 | ||
|
|
f4bd953771 | ||
|
|
9b7d717a9c | ||
|
|
971031d8cc | ||
|
|
f26f7ebc9d | ||
|
|
ab225ff154 | ||
|
|
552de94da6 | ||
|
|
879d238887 | ||
|
|
6af082e70e | ||
|
|
83137cbe84 | ||
|
|
be7c88ec35 | ||
|
|
0248e4955d | ||
|
|
7511d6e4e8 | ||
|
|
5bca6a4bfe | ||
|
|
14f45bb8ef | ||
|
|
ff42572e93 | ||
|
|
ed08d96932 | ||
|
|
0c72c9d2f1 | ||
|
|
b11d285680 | ||
|
|
376833aea7 | ||
|
|
434fa70584 | ||
|
|
a98162118b | ||
|
|
a128ab4313 | ||
|
|
e3fab7e076 | ||
|
|
39b46e95a0 | ||
|
|
f7cc3d3718 | ||
|
|
9487578c0c | ||
|
|
aae5812337 | ||
|
|
05eeb8aa53 | ||
|
|
ff63fb74d9 | ||
|
|
b1bff3f319 | ||
|
|
9367dcda10 | ||
|
|
5eb7660608 | ||
|
|
4e6bc27b30 | ||
|
|
c7cefa9ce6 | ||
|
|
adeebad2a6 | ||
|
|
0b96cd50e1 | ||
|
|
008ce8fc65 | ||
|
|
6c634086b0 | ||
|
|
8f15af6adc | ||
|
|
9772306ae9 | ||
|
|
91eca539d0 | ||
|
|
3afa606154 | ||
|
|
49a083fe79 | ||
|
|
1192dfdc8a | ||
|
|
80c4b8a17a | ||
|
|
a6f1667bce | ||
|
|
f336c2c5cc | ||
|
|
32c027a0bf | ||
|
|
6da6a082c7 | ||
|
|
159abd4727 | ||
|
|
91007e87d2 | ||
|
|
cb3367d734 | ||
|
|
321daede1d | ||
|
|
0114333d34 | ||
|
|
aadeb62bbf | ||
|
|
6e4dad9acf | ||
|
|
ea04d23e1d | ||
|
|
57ad943b92 | ||
|
|
ed39d151b7 | ||
|
|
86b5f7ef5d | ||
|
|
c3ed8bb5da | ||
|
|
a2fedb4285 | ||
|
|
2095d4d955 | ||
|
|
ac27a3ccee | ||
|
|
18cf36a22c | ||
|
|
04ecc4737c | ||
|
|
64fa5e6383 | ||
|
|
22c173c1dc | ||
|
|
36240b2284 | ||
|
|
fcd127ed87 | ||
|
|
f135a9949c | ||
|
|
13948152b6 | ||
|
|
1891f55c72 | ||
|
|
2473f65278 | ||
|
|
bbea7fb91f | ||
|
|
5ba5a53b77 | ||
|
|
7cd9530006 | ||
|
|
e6116c47be | ||
|
|
413d14f53e | ||
|
|
636efb3c20 | ||
|
|
ee2a5727fb | ||
|
|
cbe607baf2 | ||
|
|
9b0c96d792 | ||
|
|
c27818e247 | ||
|
|
966b95ca4e | ||
|
|
62ee436944 | ||
|
|
d71d9ad7c0 | ||
|
|
6563535a3d | ||
|
|
ea8adfdbf9 | ||
|
|
5e59718970 | ||
|
|
5efd393af2 | ||
|
|
c6a8c3cad5 | ||
|
|
52b627feb3 | ||
|
|
e03ae19372 | ||
|
|
258f8f6af9 | ||
|
|
2957541e48 | ||
|
|
96b6a03d01 | ||
|
|
8e2b7fe3d6 | ||
|
|
fa126b950a | ||
|
|
4e9967a5f1 | ||
|
|
8446433bcf | ||
|
|
35a0fe79f9 | ||
|
|
a46eda7c44 | ||
|
|
7d6f97259f | ||
|
|
96b73acad7 | ||
|
|
23c9563600 | ||
|
|
98034e5504 | ||
|
|
a042966082 | ||
|
|
aa6303f0b2 | ||
|
|
8be9bdacd1 | ||
|
|
aa90625819 | ||
|
|
789912238f | ||
|
|
9fbf38c798 | ||
|
|
e0d64903f8 | ||
|
|
07fae5adf6 | ||
|
|
380e3640e3 | ||
|
|
96539e43b5 | ||
|
|
c7ca1e7e13 | ||
|
|
2f9b7fe0f7 | ||
|
|
51c737669d | ||
|
|
a1827d7f98 | ||
|
|
67d5dfb315 | ||
|
|
e403c38d7b | ||
|
|
311b5e8188 | ||
|
|
65005fdae8 | ||
|
|
f8827c3fe5 | ||
|
|
ed7413ee51 | ||
|
|
22fdf76db5 | ||
|
|
2f50a9ea1f | ||
|
|
9a51f4e3c2 | ||
|
|
8cef4e0433 | ||
|
|
2afb9b30e9 | ||
|
|
ad940ff40e | ||
|
|
2228d75657 | ||
|
|
018bd6aac3 | ||
|
|
fa55c247a2 | ||
|
|
4b19a6e00d | ||
|
|
54df7d1daf | ||
|
|
f2d59fbc0f | ||
|
|
155aa6dac5 | ||
|
|
b6099cd978 | ||
|
|
6b89249c6d | ||
|
|
92d3cff957 | ||
|
|
650cdef8b4 | ||
|
|
838ad16296 | ||
|
|
ff1752dfff | ||
|
|
c1486925d5 | ||
|
|
99bdb87a01 | ||
|
|
e53b451d60 | ||
|
|
de0cfdd323 | ||
|
|
9673d40bb9 | ||
|
|
f47c2468bb | ||
|
|
82b16cbf45 | ||
|
|
93d460f8fc | ||
|
|
5d76e85a23 | ||
|
|
30ddb89e3c | ||
|
|
3c4b87bfec | ||
|
|
9871d24929 | ||
|
|
09090bd29f | ||
|
|
d5242e0bf5 | ||
|
|
412e2a43e9 | ||
|
|
7c2c187743 | ||
|
|
ef3e8d2c84 | ||
|
|
d382db77ee | ||
|
|
b957c64905 | ||
|
|
159932d59b | ||
|
|
55a7c907ad | ||
|
|
4328233504 | ||
|
|
1b8609c318 | ||
|
|
a67873f6cf | ||
|
|
d50c919879 | ||
|
|
925b40e2c0 | ||
|
|
e798326a1a | ||
|
|
41ba942369 | ||
|
|
2e57a1e1a6 | ||
|
|
9feb010355 | ||
|
|
48b117618d | ||
|
|
f807fd973e | ||
|
|
268e3b5d15 | ||
|
|
69bb0891c7 | ||
|
|
92a75c80db | ||
|
|
40770f1697 | ||
|
|
e06756ef58 | ||
|
|
df4165c7ee | ||
|
|
d8f64f516b | ||
|
|
6d99f0af50 | ||
|
|
b4ae332e0c | ||
|
|
ed874ffc5b | ||
|
|
ee5ad2a653 | ||
|
|
4415feb2df | ||
|
|
9f5a3b52a7 | ||
|
|
4a31b5702e | ||
|
|
f44853a87f | ||
|
|
ba2c5f68fc | ||
|
|
fdc0cd4c03 | ||
|
|
e542df549c | ||
|
|
ed2d62b8e7 | ||
|
|
dbdcef5166 | ||
|
|
d633261a99 | ||
|
|
8e473181ed | ||
|
|
68077b7dbf | ||
|
|
fdfe2a4e68 | ||
|
|
0c54ebdf41 | ||
|
|
ac8a2ff12d | ||
|
|
b3e19c7247 | ||
|
|
05933e783d | ||
|
|
4882d338f0 | ||
|
|
cd2a2cef25 | ||
|
|
20bec81678 | ||
|
|
4559b4138f | ||
|
|
9cf5a31faf | ||
|
|
5fb4d77764 | ||
|
|
05c56d4577 | ||
|
|
ad1510afa0 | ||
|
|
26785668c0 | ||
|
|
40e7b0eeb3 | ||
|
|
fe3d2a9aba | ||
|
|
c8b7cfc297 | ||
|
|
dcbb285ae4 | ||
|
|
f995aa35ea | ||
|
|
1ead130eed | ||
|
|
b96a0246b5 | ||
|
|
01a5b263e5 | ||
|
|
00464ad988 | ||
|
|
827fb62c29 | ||
|
|
50163508f8 | ||
|
|
2dc9a45e06 | ||
|
|
ba8cdb2977 | ||
|
|
d6d202341a | ||
|
|
df385799a2 | ||
|
|
023cddb160 | ||
|
|
ec3b96924f | ||
|
|
6b47c61fe4 | ||
|
|
5069be04a2 | ||
|
|
01579957b8 | ||
|
|
8cb1714255 | ||
|
|
eacd6b5d54 | ||
|
|
b02f03e20a | ||
|
|
c315218ed1 | ||
|
|
7feb1742d3 | ||
|
|
a3404a38c6 | ||
|
|
862cae5b02 | ||
|
|
f6e54dc027 | ||
|
|
680ac411d7 | ||
|
|
c9997fb919 | ||
|
|
21af7004ff | ||
|
|
9c569246ef | ||
|
|
24f743ee12 | ||
|
|
4ddfff287c | ||
|
|
ee86d0e483 | ||
|
|
a525397022 | ||
|
|
f42a44abec | ||
|
|
e6cc967ac8 | ||
|
|
8197463b08 | ||
|
|
43ce098043 | ||
|
|
a4acb70c64 | ||
|
|
2759b80514 | ||
|
|
dd1717af34 | ||
|
|
ebfd259333 | ||
|
|
7d472d887e | ||
|
|
8c241cb745 | ||
|
|
6271798ce3 | ||
|
|
bb91dc90a5 | ||
|
|
baf2ff1a91 | ||
|
|
2254f41722 | ||
|
|
c76e486765 | ||
|
|
1c257abc23 | ||
|
|
507d724ee6 | ||
|
|
7108f89b69 | ||
|
|
b0053d8910 | ||
|
|
ba366b126f | ||
|
|
3c83551dfe | ||
|
|
68cfbd6d66 | ||
|
|
af5836202c | ||
|
|
2994e7150f | ||
|
|
6da8454b3b | ||
|
|
4b35495fbe | ||
|
|
0ba5544446 | ||
|
|
931882d720 | ||
|
|
b47c23b73e | ||
|
|
56817ea137 | ||
|
|
6354fa031c | ||
|
|
125650c986 | ||
|
|
0d8114e14d | ||
|
|
0e8c7ca2e3 | ||
|
|
62cae1ba00 | ||
|
|
1d706674f2 | ||
|
|
6d8a7ced24 | ||
|
|
e6828560d1 | ||
|
|
a9e9554b11 | ||
|
|
98e8894d90 | ||
|
|
2258ab17a4 | ||
|
|
3e5871ffb3 | ||
|
|
212e6fe52c | ||
|
|
b14f779853 | ||
|
|
d34c5b767b | ||
|
|
26c2654632 | ||
|
|
953d102996 | ||
|
|
3f9b05a876 | ||
|
|
e80487b35c | ||
|
|
4bf1c2fdcc | ||
|
|
35096cda3f | ||
|
|
4051ce869c | ||
|
|
785bf40f67 | ||
|
|
1b1d17cfb5 | ||
|
|
8157f3c6ab | ||
|
|
ca8d23acab | ||
|
|
a2fc19880a | ||
|
|
fff70368b7 | ||
|
|
9eb655e65c | ||
|
|
25912673a9 | ||
|
|
cc4bb71f29 | ||
|
|
cd399b7e6e | ||
|
|
518da92a7e | ||
|
|
9d5be12517 | ||
|
|
18f5ed671d | ||
|
|
aecdfb06e7 | ||
|
|
204fd8be03 | ||
|
|
2c3f695469 | ||
|
|
6229965569 | ||
|
|
6cd0ff2b52 | ||
|
|
a76460f5d6 | ||
|
|
f32c6784e7 | ||
|
|
ae241785bf | ||
|
|
4ccb219079 | ||
|
|
788de9938a | ||
|
|
2202ee5d66 | ||
|
|
4e760c703e | ||
|
|
d040af4939 | ||
|
|
613d6c043b | ||
|
|
06e4c45350 | ||
|
|
d5a421e3f5 | ||
|
|
3c0f4c46fa | ||
|
|
a0bf796926 | ||
|
|
f0c98fb5c2 | ||
|
|
f934ca37c9 | ||
|
|
e2505479ee | ||
|
|
e72d9c0f88 | ||
|
|
9fdf04b7ff | ||
|
|
db59585a51 | ||
|
|
a2a0765eff | ||
|
|
b59c5fd82b | ||
|
|
70cbf56655 | ||
|
|
60659f1407 | ||
|
|
ff93e8afee | ||
|
|
fee56b1902 | ||
|
|
791fda16d3 | ||
|
|
2c75b1397c | ||
|
|
dca3d13606 | ||
|
|
ccc0cb23ed | ||
|
|
7b5a580c0c | ||
|
|
be02ee97fb | ||
|
|
367067dfff | ||
|
|
423044d4d6 | ||
|
|
71dfec3c4d | ||
|
|
fbd193b27c | ||
|
|
ce7da85166 | ||
|
|
21002bf2de | ||
|
|
f19ca6b411 | ||
|
|
b0ccc0784e | ||
|
|
b7121786a5 | ||
|
|
7fb739ebcf | ||
|
|
0c987f433d | ||
|
|
36c5eab799 | ||
|
|
cf21c63183 | ||
|
|
0c192cfd64 | ||
|
|
9772eb7c96 | ||
|
|
a7e3092165 | ||
|
|
535c4ed0d6 | ||
|
|
3f5be0f4fc | ||
|
|
8e478e8909 | ||
|
|
60cc8ac39c | ||
|
|
5cb31c2c8f | ||
|
|
4653ed3fa5 | ||
|
|
5f6259dde6 | ||
|
|
89daec4e93 | ||
|
|
6c267f1c74 | ||
|
|
8b01146b90 | ||
|
|
42da37e900 | ||
|
|
a52314d70a | ||
|
|
23ee3018c3 | ||
|
|
296a6095a4 | ||
|
|
8f85396a31 | ||
|
|
ac6fad6a63 | ||
|
|
e97d3af4b1 | ||
|
|
c2e9be5a45 | ||
|
|
334497fdc0 | ||
|
|
3b3501cf09 | ||
|
|
8ffbcdc553 | ||
|
|
66787b05d6 | ||
|
|
f7698ea160 | ||
|
|
66b8462d7a | ||
|
|
ab137e4164 | ||
|
|
6d11caf784 | ||
|
|
019e3b2f4a | ||
|
|
d67e177733 | ||
|
|
9322e91d1b | ||
|
|
87f659a0dc | ||
|
|
5e523fd03a | ||
|
|
e1478d02b1 | ||
|
|
8bc2f8ccda | ||
|
|
1aa6c125d9 | ||
|
|
7b552eb590 | ||
|
|
28d7532fe8 | ||
|
|
02db94c4bc | ||
|
|
dab66593fc | ||
|
|
5b1ab3b0bb | ||
|
|
0e56b96bda | ||
|
|
09128accff | ||
|
|
c4fa1dbc0b | ||
|
|
f09698894a | ||
|
|
f3732b730a | ||
|
|
61611159c7 | ||
|
|
00e9daf790 | ||
|
|
f3de2cea7d | ||
|
|
21db4b338b | ||
|
|
d881185d79 | ||
|
|
5c93f942be | ||
|
|
0e55534c6e | ||
|
|
74ebce6b1f | ||
|
|
3ae3196d42 | ||
|
|
f37e936321 | ||
|
|
37d6503437 | ||
|
|
0d31b39f11 | ||
|
|
d89986dd5e | ||
|
|
4bc38a2f6c | ||
|
|
2d446aa2ce | ||
|
|
92d9569d5d | ||
|
|
9f620ab23b | ||
|
|
396dca7f48 | ||
|
|
30214a7700 | ||
|
|
958577b98b | ||
|
|
9cf5c9ac43 | ||
|
|
2440413310 | ||
|
|
16ce316695 | ||
|
|
d75b9c704c | ||
|
|
7bc94fff9a | ||
|
|
a9659beabe | ||
|
|
cc477c50ed | ||
|
|
8a68714095 | ||
|
|
941f138934 | ||
|
|
2f149e6984 | ||
|
|
44753e62ab | ||
|
|
8b2e704741 | ||
|
|
67ecc04580 | ||
|
|
b7233a23d7 | ||
|
|
dd96ba0d24 | ||
|
|
5c4ba3474b | ||
|
|
55536bb364 | ||
|
|
acc85be5ae | ||
|
|
9309a07438 | ||
|
|
dea8662d6b | ||
|
|
3c2202572b | ||
|
|
aad122334b | ||
|
|
8d88b73512 | ||
|
|
140166e1cd | ||
|
|
11ee68e799 | ||
|
|
3af700d950 | ||
|
|
7471e1fd05 | ||
|
|
eab0974e7d | ||
|
|
6cea20e427 | ||
|
|
b083f4014b | ||
|
|
23644d92a9 | ||
|
|
d261844da0 | ||
|
|
3c336b566d | ||
|
|
0dfd51408e | ||
|
|
df82ef6bc7 | ||
|
|
31ef921ef2 | ||
|
|
50a2b033b7 | ||
|
|
5d4cce3e95 | ||
|
|
8b13f3b53f | ||
|
|
3d4ab7de1e | ||
|
|
7da1afa140 | ||
|
|
982056894e | ||
|
|
314fae7446 | ||
|
|
60296c8900 | ||
|
|
44a42b7273 | ||
|
|
effa93d4b8 | ||
|
|
6326b6d58e | ||
|
|
a4cc1ab7e3 | ||
|
|
3795aaab5c | ||
|
|
e36f11750b | ||
|
|
5dd34c3a8a | ||
|
|
5a11b87097 | ||
|
|
9e16576380 | ||
|
|
067c8b39ba | ||
|
|
46c5a2c8fc | ||
|
|
c33a748344 | ||
|
|
6ad5ecf569 | ||
|
|
a45481baa3 | ||
|
|
988221d87b | ||
|
|
3c48a6e4ce | ||
|
|
e02f25a108 | ||
|
|
d1e52620c7 | ||
|
|
9355c60b4d | ||
|
|
25947a7b23 | ||
|
|
ea09bd5e45 | ||
|
|
ed7e306adc | ||
|
|
a2fba05218 | ||
|
|
ee0baf62ad | ||
|
|
194c2c926e | ||
|
|
a07f31feae | ||
|
|
d316f78f94 | ||
|
|
1123f4fcc9 | ||
|
|
78bcda14c4 | ||
|
|
05ec32c331 | ||
|
|
28dea17065 | ||
|
|
57d705e265 | ||
|
|
da7d531f8f | ||
|
|
93bb7564dc | ||
|
|
230e9868d1 | ||
|
|
5e86b40469 | ||
|
|
d76b55a9c6 | ||
|
|
62f6e65509 | ||
|
|
c7e0a27e0d | ||
|
|
604b28b1c5 | ||
|
|
77c29c6b6f | ||
|
|
86816b1aad | ||
|
|
b677ad9ca5 | ||
|
|
6038264a4c | ||
|
|
d8d80fbf42 | ||
|
|
1332bba7af | ||
|
|
b2fdd7fbaf | ||
|
|
d56072eb53 | ||
|
|
e862fad917 | ||
|
|
04d3ca7dbe | ||
|
|
36706126fd | ||
|
|
fc375a40f8 | ||
|
|
f734f8167b | ||
|
|
a6f7f0ac8a | ||
|
|
0edcd5efb0 | ||
|
|
6d1f85a04b | ||
|
|
c463c26983 | ||
|
|
92630a2821 | ||
|
|
7d65e4cb10 | ||
|
|
1123b8259a | ||
|
|
c3626bf2e6 | ||
|
|
aea52af9ae | ||
|
|
393889afa2 | ||
|
|
efce448b23 | ||
|
|
d46d607334 | ||
|
|
317a9bae5f | ||
|
|
3d0f4fd756 | ||
|
|
b940dc4f8a | ||
|
|
ce302c29e4 | ||
|
|
f7decfe399 | ||
|
|
580fefe63b | ||
|
|
8e5067421f | ||
|
|
70826914a7 | ||
|
|
f943bf2aaf | ||
|
|
256a572cbe | ||
|
|
ed15b40529 | ||
|
|
63c9b88e7f | ||
|
|
a51c445df8 | ||
|
|
d2d3289a2a | ||
|
|
06a02c41c3 | ||
|
|
d77669da80 | ||
|
|
4b410534dd | ||
|
|
5f07b255bd | ||
|
|
2b1a5d7a56 | ||
|
|
7a29240b00 | ||
|
|
35a83464d0 | ||
|
|
2622070f14 | ||
|
|
0c174104fc | ||
|
|
628b136e85 | ||
|
|
aa81ebb600 | ||
|
|
9ea7369b05 | ||
|
|
fd88bfbac8 | ||
|
|
51987e17df | ||
|
|
c84848c417 | ||
|
|
c5e46c9e55 | ||
|
|
d93b0f047a | ||
|
|
c324169af0 | ||
|
|
7e13518cc2 | ||
|
|
a9da4dd437 | ||
|
|
5aea0d024f | ||
|
|
a6071da33b | ||
|
|
de77f0ba0f | ||
|
|
677b0ba2d2 | ||
|
|
7b034a54e3 | ||
|
|
c9574ae7d7 | ||
|
|
8ac0bd44bd | ||
|
|
c8a884f57f | ||
|
|
eefe067c27 | ||
|
|
259f6ea42c | ||
|
|
8d2f22affe | ||
|
|
a0aedfbe5c | ||
|
|
2204bad7cf | ||
|
|
c53ebd89b1 | ||
|
|
032a3e6b3a | ||
|
|
70c87137a9 | ||
|
|
c747ba1c3f | ||
|
|
7c86b03505 | ||
|
|
8e8e808fc9 | ||
|
|
1ddf46f3c6 | ||
|
|
94cf8ef1d8 | ||
|
|
1a7ac5e382 | ||
|
|
c825275f7f | ||
|
|
8152b86652 | ||
|
|
417b1450b5 | ||
|
|
7e720a1253 | ||
|
|
a57e01fee7 | ||
|
|
f55f2fb9d1 | ||
|
|
d595e03928 | ||
|
|
d96f1bf26d | ||
|
|
9dc75f5cd9 | ||
|
|
0402179603 | ||
|
|
04cd585183 | ||
|
|
ac384db71f | ||
|
|
a0e4be04be | ||
|
|
d9aa6919d8 | ||
|
|
0f1ed1ca09 | ||
|
|
11b16a63cf | ||
|
|
f534edc371 | ||
|
|
4879661f5a | ||
|
|
324d547cdb | ||
|
|
18be7b115a | ||
|
|
3a8be4d8d9 | ||
|
|
76e373a5f4 | ||
|
|
763ddf78f3 | ||
|
|
4cd5153b32 | ||
|
|
ae7689f739 | ||
|
|
c38a050125 | ||
|
|
96102613f3 | ||
|
|
dc954bbb03 | ||
|
|
2fd6c05445 | ||
|
|
defa9c1d00 | ||
|
|
1aec041371 | ||
|
|
05dcdfd267 | ||
|
|
9f33b33803 | ||
|
|
9e31335744 | ||
|
|
6981f2afeb | ||
|
|
0e2f267805 | ||
|
|
06cade6c31 | ||
|
|
71e1ca72ec | ||
|
|
f9ce7f3542 | ||
|
|
cbd7c7d8c6 | ||
|
|
cfdf66c129 | ||
|
|
7305b2c401 | ||
|
|
220f3cc2b9 | ||
|
|
a6d525eb92 | ||
|
|
3a869c726b | ||
|
|
03258db26d | ||
|
|
aa889b0edc | ||
|
|
7c6695317c | ||
|
|
b3f503e0ce | ||
|
|
c5dc792c5d | ||
|
|
3d5292b63f | ||
|
|
fca344d1fb | ||
|
|
e2c7126d11 | ||
|
|
914c1a527d | ||
|
|
1fb127ba79 | ||
|
|
faca9e2f06 | ||
|
|
af37c7ac6b | ||
|
|
d782de5b00 | ||
|
|
b999d01de7 | ||
|
|
acbfc11eef | ||
|
|
fbae0a7274 | ||
|
|
ffee3791e8 | ||
|
|
d79bb0db24 | ||
|
|
b44620d065 | ||
|
|
aa1d5fcbdd | ||
|
|
ae48b709ed | ||
|
|
abc98c273c | ||
|
|
2ea94d621f | ||
|
|
bf8592fe93 | ||
|
|
0b95d72354 | ||
|
|
90d1a689db | ||
|
|
e384dea8ac | ||
|
|
47a62b12d4 | ||
|
|
403cd0d915 | ||
|
|
60fbcc37fc | ||
|
|
be2ac0ba89 | ||
|
|
dbce01792c | ||
|
|
1f21bc4b49 | ||
|
|
d91594dc6b | ||
|
|
48d8711b80 | ||
|
|
3925c3fa20 | ||
|
|
fb45e2e046 | ||
|
|
72ecc222ee | ||
|
|
4f09ddccb4 | ||
|
|
b0a2c28c19 | ||
|
|
0cdeaaff6b | ||
|
|
2886b1c67d | ||
|
|
99e607d3ac | ||
|
|
9c0758639b | ||
|
|
4774c89381 | ||
|
|
d44eabe247 | ||
|
|
46be0710ac | ||
|
|
624f22e27e | ||
|
|
1ee0939f69 | ||
|
|
fe8cf19a8f | ||
|
|
f66dcbe6e5 | ||
|
|
61330c60b5 | ||
|
|
a9ef7d173f | ||
|
|
744f685973 | ||
|
|
8c0b8c5ef7 | ||
|
|
077b597bd8 | ||
|
|
f159163856 | ||
|
|
0f1c484ad1 | ||
|
|
27f91faae5 | ||
|
|
8c8fe02000 | ||
|
|
21c5ff681b | ||
|
|
e429a77de2 | ||
|
|
6bf1865678 | ||
|
|
5086fd537c | ||
|
|
34884c1631 | ||
|
|
3454677eb9 | ||
|
|
d7fee91655 | ||
|
|
fc1956573e | ||
|
|
b39b195043 | ||
|
|
6e5d507b95 | ||
|
|
79ac431e9e | ||
|
|
d4fbf422b3 | ||
|
|
4ae88c69ac | ||
|
|
c781a5f245 | ||
|
|
44deb43252 | ||
|
|
9958881cbe | ||
|
|
1c886ad067 | ||
|
|
4b0e7fc979 | ||
|
|
4121ba9ea9 | ||
|
|
31a52cdf21 | ||
|
|
5782f562ae | ||
|
|
3126ae305c | ||
|
|
bc28801993 | ||
|
|
78e6ddee75 | ||
|
|
b4535acbac | ||
|
|
a97716de33 | ||
|
|
1b9711edde | ||
|
|
46dc6cc24b | ||
|
|
d2badcdedf | ||
|
|
c1f04d8c72 | ||
|
|
ffc8cf3925 | ||
|
|
f7aa9cb0c5 | ||
|
|
4dda06f9bb | ||
|
|
c02a0f90df | ||
|
|
4038ac463c | ||
|
|
14743458e5 | ||
|
|
f59b771c76 | ||
|
|
69c592e0d6 | ||
|
|
99574e465d | ||
|
|
a1e127ae46 | ||
|
|
ff92c3409d | ||
|
|
98e6d25b42 | ||
|
|
11f10fdce2 | ||
|
|
a984f9cf97 | ||
|
|
6f7bb30b0a | ||
|
|
80b150d3ad | ||
|
|
bb20586a5e | ||
|
|
2464deec82 | ||
|
|
608df40058 | ||
|
|
e2e683199d | ||
|
|
96b7cce810 | ||
|
|
c960b5979e | ||
|
|
1bc9063573 | ||
|
|
3a795e6d9b | ||
|
|
5da698b4bf | ||
|
|
8b25c29323 | ||
|
|
4b1e330219 | ||
|
|
01b28ef1a5 | ||
|
|
f7a77f4041 | ||
|
|
b552c29bef | ||
|
|
5c8e1c7eeb | ||
|
|
a9bd6acd52 | ||
|
|
bbf4983524 | ||
|
|
bffa100aa6 | ||
|
|
2bd4355a4c | ||
|
|
8c71ba8912 | ||
|
|
68948c7947 | ||
|
|
a160038e1a | ||
|
|
a99986041f | ||
|
|
43942057a4 | ||
|
|
168daebccf | ||
|
|
fc88f43e50 | ||
|
|
f337980e52 | ||
|
|
3b589115f0 | ||
|
|
9149d8ecb5 | ||
|
|
f074d766e5 | ||
|
|
db51ee08ea | ||
|
|
e77c4c182d | ||
|
|
b74c1805d7 | ||
|
|
f162e61748 | ||
|
|
37311883c1 | ||
|
|
0801f88d0a | ||
|
|
e8909cced0 | ||
|
|
99a46c8657 | ||
|
|
60ecb7e4b6 | ||
|
|
332f3a924c | ||
|
|
b10d79c4d9 | ||
|
|
07b5d6b1b6 | ||
|
|
96c22a26b9 | ||
|
|
40ed2e1b3d | ||
|
|
d46c1f0f20 | ||
|
|
ce62f997f3 | ||
|
|
62a692b29c | ||
|
|
53bed596e7 | ||
|
|
e0d20eadff | ||
|
|
4aaeaa4331 | ||
|
|
17882db635 | ||
|
|
ce6d2759f5 | ||
|
|
67cc515e74 | ||
|
|
03327e5161 | ||
|
|
368c2a6bf0 | ||
|
|
bc8aab4775 | ||
|
|
3956ea4665 | ||
|
|
818220de45 | ||
|
|
5d484bf022 | ||
|
|
3a146a6dbe | ||
|
|
78e28a72ed | ||
|
|
cb43084e26 | ||
|
|
ea31f75098 | ||
|
|
925f1781b3 | ||
|
|
e018509ba6 | ||
|
|
eb95a4333a | ||
|
|
ea2b2ebc07 | ||
|
|
3f7970db52 | ||
|
|
49c322f120 | ||
|
|
90128ed4ee | ||
|
|
1c5b9db63f | ||
|
|
26971da510 | ||
|
|
18034bb95c | ||
|
|
5258f52497 | ||
|
|
9a5b86e454 | ||
|
|
5c656899e5 | ||
|
|
497bf226e2 | ||
|
|
2cb711ee15 | ||
|
|
601d098b48 | ||
|
|
51d7d7cfae | ||
|
|
9fbea31f47 | ||
|
|
047bf02985 | ||
|
|
b4b898b769 | ||
|
|
4d2c8a40d6 | ||
|
|
3410705974 | ||
|
|
b015033c53 | ||
|
|
246fe3bfb7 | ||
|
|
8ef55bd8c9 | ||
|
|
81778e507f | ||
|
|
efa49bfbb7 | ||
|
|
333f355e23 | ||
|
|
b8617ace53 | ||
|
|
cc714ca5cc | ||
|
|
a3ee217537 | ||
|
|
35cbca96e1 | ||
|
|
bd304f1141 | ||
|
|
60a9d49382 | ||
|
|
39da5eca89 | ||
|
|
cbcba2e4cf | ||
|
|
b1a8e1e5b2 | ||
|
|
ea31c2a643 | ||
|
|
d33f68ff54 | ||
|
|
a1dcc3bb9f | ||
|
|
5d3d14da53 | ||
|
|
95ce9f33a9 | ||
|
|
c351f8fa47 | ||
|
|
d88e8bb9ea | ||
|
|
2b545f6b90 | ||
|
|
93294d4a97 | ||
|
|
718a4692dd | ||
|
|
fe8286c53c | ||
|
|
7bd2804ce9 | ||
|
|
4d425b0e6d | ||
|
|
1bf7e1596b | ||
|
|
30fc374fc5 | ||
|
|
02bece54a6 | ||
|
|
7dbae14e19 | ||
|
|
5d18ece661 | ||
|
|
68864d0703 | ||
|
|
317d15dbe9 | ||
|
|
3d8a35ced6 | ||
|
|
dde1b89c5e | ||
|
|
2ce5797ec2 | ||
|
|
789674bd5a | ||
|
|
0890562663 | ||
|
|
39bf02ea68 | ||
|
|
88f75fc1d6 | ||
|
|
d663f57d43 | ||
|
|
5526954fdc | ||
|
|
d80843bf53 | ||
|
|
0975f3bd4c | ||
|
|
8f5ca29fcd | ||
|
|
1d39116a6e | ||
|
|
27702b5a5d | ||
|
|
a14c6c1ffe | ||
|
|
d982aa54e8 | ||
|
|
b4f03e1c32 | ||
|
|
eff319f869 | ||
|
|
7476428def | ||
|
|
f5c245ceb8 | ||
|
|
8f5cefb116 | ||
|
|
c01d17fcc4 | ||
|
|
15bdb8f7cd | ||
|
|
3b03edd7cb | ||
|
|
8b3990225a | ||
|
|
f73506be49 | ||
|
|
fa3e95222e | ||
|
|
3e9dc578de | ||
|
|
8dcc73993e | ||
|
|
6921d46185 | ||
|
|
99dd72efea | ||
|
|
47f59d3fb6 | ||
|
|
84b8e0a7e4 | ||
|
|
393b46a6dd | ||
|
|
7879510ef5 | ||
|
|
9b0ef781dc | ||
|
|
b9e408c499 | ||
|
|
a55bea44da | ||
|
|
45505a8423 | ||
|
|
cc82ed28f8 | ||
|
|
e3f79df3ac | ||
|
|
55fdae77d5 | ||
|
|
86dfd3902f | ||
|
|
f259d275fc | ||
|
|
7b7ab580ab | ||
|
|
1619beda91 | ||
|
|
ceca1547fb | ||
|
|
c8b3cd2957 | ||
|
|
33b4ff75d0 | ||
|
|
818db91a9e | ||
|
|
479bfa28de | ||
|
|
8e4ee54070 | ||
|
|
995a5fed1f | ||
|
|
3efa670d6a | ||
|
|
32a894719e | ||
|
|
acc5c95f0d | ||
|
|
60eedc2fc3 | ||
|
|
35aeb308c6 | ||
|
|
55e75d57ae | ||
|
|
d547f74cb0 | ||
|
|
912bc8bca1 | ||
|
|
b609836f79 | ||
|
|
990da2ee6d | ||
|
|
e8e0d9fa42 | ||
|
|
6a0cb3e552 | ||
|
|
702a80fc5a | ||
|
|
fa8f5df817 | ||
|
|
2e589a5b0b | ||
|
|
e71aff71ce | ||
|
|
dad2c6608e | ||
|
|
bb60b4227e | ||
|
|
1c9e02094c | ||
|
|
542b149290 | ||
|
|
94c3a912ba | ||
|
|
da452c9c7e | ||
|
|
5407d9b062 | ||
|
|
c5eec881c1 | ||
|
|
b2e79dbebd | ||
|
|
61df70fdf5 | ||
|
|
7dfae2384b | ||
|
|
9e12095111 | ||
|
|
0bdb096bfa | ||
|
|
94ced907d2 | ||
|
|
7dde82322a | ||
|
|
fcc61a981d | ||
|
|
b5ca114a96 | ||
|
|
e9e2a586ce | ||
|
|
98c39a37c0 | ||
|
|
f320be690c | ||
|
|
793d2ce6dc | ||
|
|
fb148e0b61 | ||
|
|
1b914d217e | ||
|
|
06967d9297 | ||
|
|
93e6c3df6a | ||
|
|
b88569c845 | ||
|
|
9b171b76e0 | ||
|
|
0c183da116 | ||
|
|
e8ff94fb8b | ||
|
|
dfc4298125 | ||
|
|
8c7bcad6b1 | ||
|
|
6eea13ecc2 | ||
|
|
d8d707b4fe | ||
|
|
b1c042b3ea | ||
|
|
9da7349f63 | ||
|
|
eabc2daf86 | ||
|
|
88bca9d17a | ||
|
|
e6e1011e47 | ||
|
|
217f04e311 | ||
|
|
55b025413d | ||
|
|
d9aae023b1 | ||
|
|
c1651bd271 | ||
|
|
c42ca84850 | ||
|
|
e69f091bbd | ||
|
|
51bd69cdd8 | ||
|
|
7727aad90f | ||
|
|
2f6757a56a | ||
|
|
937a3e14c5 | ||
|
|
ed156838e6 | ||
|
|
b5b53a5311 | ||
|
|
fe5575f384 | ||
|
|
40d91cc23b | ||
|
|
c599a4c7de | ||
|
|
0d7cc8829a | ||
|
|
5c98c0760b | ||
|
|
b5c1ea44dc | ||
|
|
36c98b3e5d | ||
|
|
46b4e2a0cd | ||
|
|
dab639662f | ||
|
|
fa11e124dd | ||
|
|
9a5f040f72 | ||
|
|
c01fd4ac58 | ||
|
|
6ba6a22a77 | ||
|
|
0c7d73c8b0 | ||
|
|
2aedece23d | ||
|
|
b2059c481a | ||
|
|
f965ddae49 | ||
|
|
191c908f3a | ||
|
|
fbe02c5ae1 | ||
|
|
fc7a108366 | ||
|
|
29528196f2 | ||
|
|
bab5c21224 | ||
|
|
a02593204f | ||
|
|
bf065674cc | ||
|
|
e7b2aefd36 | ||
|
|
c2b4c645a1 | ||
|
|
0f0a91fc9e | ||
|
|
5f3ced7213 | ||
|
|
9602a25a0b | ||
|
|
75212f9fab | ||
|
|
b2fee21ef3 | ||
|
|
6016f28171 | ||
|
|
078ab47a9a | ||
|
|
2ad2b4c5ba | ||
|
|
3640bd2fda | ||
|
|
712f4bd7f8 | ||
|
|
fc1f41fc84 | ||
|
|
88cde776e7 | ||
|
|
8580a0bcd7 | ||
|
|
a62307f711 | ||
|
|
64e8125807 | ||
|
|
34b28cb68a | ||
|
|
1135dffe2d | ||
|
|
2353814821 | ||
|
|
da7adb5b1b | ||
|
|
fd5a76a8ad | ||
|
|
1a96bcf405 | ||
|
|
9478ff472f | ||
|
|
3b5d56278f | ||
|
|
f8be2110ec | ||
|
|
e5e31f7210 | ||
|
|
4bc0dde413 | ||
|
|
9800cf1e7b | ||
|
|
bb93bf34ec | ||
|
|
ca7a64a451 | ||
|
|
6a8a589adb | ||
|
|
433610b5c0 | ||
|
|
bc3b411b12 | ||
|
|
9fdb1701e0 | ||
|
|
99798b83b4 | ||
|
|
c5aa2bfa51 | ||
|
|
12d66208b8 | ||
|
|
1a9dba0005 | ||
|
|
2dd82748e0 | ||
|
|
6d72209363 | ||
|
|
11113e43e7 | ||
|
|
d8d82a0be4 | ||
|
|
88988817d0 | ||
|
|
c3cdfa1c96 | ||
|
|
36eae1c175 | ||
|
|
eba413853f | ||
|
|
5e2824e2f2 | ||
|
|
bd32f0969f | ||
|
|
20a65cf9c8 | ||
|
|
fce106cf83 | ||
|
|
c7fae4dd6f | ||
|
|
2dd90de993 | ||
|
|
200f8dacb7 | ||
|
|
94f4dfe85b | ||
|
|
f6a85d5305 | ||
|
|
97fec78b40 | ||
|
|
4e8fe9b1a8 | ||
|
|
64f218e943 | ||
|
|
c65dbe51d6 | ||
|
|
0692164333 | ||
|
|
6cc8815931 | ||
|
|
2a4ef2acbd | ||
|
|
664c26ab4b | ||
|
|
55b8cc1bb2 | ||
|
|
34d03801de | ||
|
|
ce4ee2b247 | ||
|
|
4568ce8f00 | ||
|
|
3a461e7cee | ||
|
|
d63daa0798 | ||
|
|
ea76a33b43 | ||
|
|
863cf8af60 | ||
|
|
09f1362305 | ||
|
|
b22711ef33 | ||
|
|
d1257f5590 | ||
|
|
6c27ce58ed | ||
|
|
1152bbd243 | ||
|
|
ecaccafd31 | ||
|
|
67aafd03c6 | ||
|
|
bf20d6d3db | ||
|
|
f331f63f53 | ||
|
|
5874d7c5ab | ||
|
|
7b1944c2da | ||
|
|
221a777a80 | ||
|
|
ab7936f514 | ||
|
|
c261408f54 | ||
|
|
449c98e861 | ||
|
|
f3ebd3a6e7 | ||
|
|
8d9f38f670 | ||
|
|
df332f85b7 | ||
|
|
f238890fe9 | ||
|
|
3ce6dd6cbc | ||
|
|
3dfe242dbb | ||
|
|
cd9bb51af2 | ||
|
|
f9d241ae27 | ||
|
|
216b6bf285 | ||
|
|
9ce75e10d5 | ||
|
|
f3817c47f9 | ||
|
|
f7a0d0a02f | ||
|
|
9511d086bd | ||
|
|
60c642f42d | ||
|
|
7a7572e478 | ||
|
|
c33dbbc216 | ||
|
|
e291c38119 | ||
|
|
c547e8b191 | ||
|
|
f605022481 | ||
|
|
df5625bf68 | ||
|
|
8dede3b535 | ||
|
|
3e4df7f140 | ||
|
|
66b3fabeef | ||
|
|
0ac30a8d9c | ||
|
|
a7ca1682c4 | ||
|
|
0b6b0aca09 | ||
|
|
79b70006e6 | ||
|
|
c6ae322f85 | ||
|
|
8dcc3cda97 | ||
|
|
7f447bb82f | ||
|
|
cc57b52773 | ||
|
|
149de958f3 | ||
|
|
a1593e7db8 | ||
|
|
fb4550e582 | ||
|
|
d56d622a43 | ||
|
|
4b8652755d | ||
|
|
d71c11577a | ||
|
|
055117dc5f | ||
|
|
4f37202b72 | ||
|
|
1feca22e28 | ||
|
|
adafd24819 | ||
|
|
2c6286b381 | ||
|
|
0fb8074353 | ||
|
|
fbb260159b | ||
|
|
1ea511b530 | ||
|
|
eb47ce1e83 | ||
|
|
1fd499ed4a | ||
|
|
91c9c0c917 | ||
|
|
65891f54ed | ||
|
|
f300f787f3 | ||
|
|
2c45e601ef | ||
|
|
3883c34b8c | ||
|
|
f2c639c869 | ||
|
|
f269cbdc94 | ||
|
|
9c9533dad9 | ||
|
|
81f8e910e6 | ||
|
|
b5de19dc03 | ||
|
|
4500e7131e | ||
|
|
7b630f0350 | ||
|
|
2f2463a04c | ||
|
|
280afb2282 | ||
|
|
7ac457f1db | ||
|
|
51c9b49d3f | ||
|
|
1d59d35129 | ||
|
|
3df0ef249c | ||
|
|
e06448b616 | ||
|
|
0539b2a7ea | ||
|
|
9c028bb299 | ||
|
|
228486555c | ||
|
|
5bf3b6eda3 | ||
|
|
fa0477d558 | ||
|
|
49a7a835c7 | ||
|
|
19c226fcf8 | ||
|
|
d7ed3cd8b7 | ||
|
|
28657fe7cb | ||
|
|
8b66816bdc | ||
|
|
5d49034c31 | ||
|
|
395e886b2e | ||
|
|
fec9920b1a | ||
|
|
65159b8070 | ||
|
|
f33d9f4f68 | ||
|
|
61c1c4a690 | ||
|
|
2de1437a1e | ||
|
|
1086150ab9 | ||
|
|
3d19167628 | ||
|
|
9f6e4a86e9 | ||
|
|
cf4235ab65 | ||
|
|
88345d759a | ||
|
|
7027b2354b | ||
|
|
dfa01d8877 | ||
|
|
7d52d612ce | ||
|
|
9e652c4f40 | ||
|
|
9d056168ae | ||
|
|
a7f484d9a7 | ||
|
|
1f8ae5d12c | ||
|
|
6796b93abd | ||
|
|
6fcc6cdc75 | ||
|
|
ee3ebed23c | ||
|
|
3d2fd471b6 | ||
|
|
7c86156be5 | ||
|
|
34907f7605 | ||
|
|
a552674254 | ||
|
|
d5b837e808 | ||
|
|
c1e14b451e | ||
|
|
3c1427a4e8 | ||
|
|
b58b15993c | ||
|
|
2ccb28a93e | ||
|
|
289974dd15 | ||
|
|
c429fa7e27 | ||
|
|
bba0edf9a3 | ||
|
|
bfca55b87a | ||
|
|
5acc437367 | ||
|
|
2cf8a53eac | ||
|
|
8c4429c875 | ||
|
|
d204c926a8 | ||
|
|
04ef2a2671 | ||
|
|
921b5cddd0 | ||
|
|
d31142ac3e | ||
|
|
d83e2ee330 | ||
|
|
346cc5ca2c | ||
|
|
c2083203b3 | ||
|
|
ec443c65a8 | ||
|
|
d2675b89c0 | ||
|
|
632e27a4a9 | ||
|
|
fb41c6659a | ||
|
|
2eee274d6d | ||
|
|
32c1042ac6 | ||
|
|
653d40bfe8 | ||
|
|
75aa92b907 | ||
|
|
582338ab79 | ||
|
|
b7bdb97f7d | ||
|
|
b537d8e23e | ||
|
|
7a4c27bd08 | ||
|
|
36352085ae | ||
|
|
0f98445f7f | ||
|
|
76c8e28e86 | ||
|
|
95b7fcadca | ||
|
|
b64ccb153a | ||
|
|
05ea34b561 | ||
|
|
ae4a9aca18 | ||
|
|
6586a9a657 | ||
|
|
37c6f6ab1b | ||
|
|
276c1de190 | ||
|
|
949ed90b51 | ||
|
|
4096432a1d | ||
|
|
d820a97c83 | ||
|
|
938e71b468 | ||
|
|
ee349691f9 | ||
|
|
d46a89b90d | ||
|
|
ebbc7bd471 | ||
|
|
b0d76c59f7 | ||
|
|
38aa5d6930 | ||
|
|
635c99e2ed | ||
|
|
0d8ebf5845 | ||
|
|
44c280e522 | ||
|
|
0f72328d1f | ||
|
|
f09e14a2b9 | ||
|
|
1476602f99 | ||
|
|
6d09842852 | ||
|
|
a370dd2867 | ||
|
|
c3a2e9b5c4 | ||
|
|
0cc8d840a3 | ||
|
|
f4251dded0 | ||
|
|
8b930b4888 | ||
|
|
14fd7d93ca | ||
|
|
6dd1494008 | ||
|
|
4cb9e651a6 | ||
|
|
e1eb9c4ff1 | ||
|
|
35df792c05 | ||
|
|
8f23accc4e | ||
|
|
0af415fa28 | ||
|
|
6dbc143d67 | ||
|
|
303b65c0b9 | ||
|
|
059722f211 | ||
|
|
3c90da6afa | ||
|
|
15ca64d81d | ||
|
|
53e7cb124d | ||
|
|
a74cbf55c7 | ||
|
|
1a5236e53d | ||
|
|
88c8e194d0 | ||
|
|
e6fc8eb015 | ||
|
|
8653605b0a | ||
|
|
fb76e02c59 | ||
|
|
c93467bca5 | ||
|
|
c60948e52e | ||
|
|
fb4c3ff31a | ||
|
|
60997b3052 | ||
|
|
c858978348 | ||
|
|
587b9dd8aa | ||
|
|
9f6aacb739 | ||
|
|
bb60fe2ccf | ||
|
|
8a855ccae1 | ||
|
|
0b0f9c9c06 | ||
|
|
9c3aa8bfc3 | ||
|
|
1114fd28d0 | ||
|
|
b3011b4f19 | ||
|
|
de0fc53d62 | ||
|
|
ca8344460a | ||
|
|
e5a508c0d7 | ||
|
|
74d70b8719 | ||
|
|
3a4f2dfe8b | ||
|
|
7ab6899538 | ||
|
|
38e5569503 | ||
|
|
411eaadc15 | ||
|
|
105a0e015e | ||
|
|
90d9040e6e | ||
|
|
39f90e25f3 | ||
|
|
ea322bdd97 | ||
|
|
e804ba5294 | ||
|
|
f6947d111b | ||
|
|
3583302ad4 | ||
|
|
fa03f390b3 | ||
|
|
82e2b1ec33 | ||
|
|
69ef43ba00 | ||
|
|
cb1009d91b | ||
|
|
f1b4af33ac | ||
|
|
9b2cbdacc6 | ||
|
|
a989e017fe | ||
|
|
e4fac6ff97 | ||
|
|
dc89a914ea | ||
|
|
f66967a88c | ||
|
|
f3a505b558 | ||
|
|
b900577dae | ||
|
|
612fe1b8fb | ||
|
|
6245876806 | ||
|
|
2492066041 | ||
|
|
f5e6a83a05 | ||
|
|
cc7c8009a1 | ||
|
|
c563168d69 | ||
|
|
4b0ded0475 | ||
|
|
1873a0cb6d | ||
|
|
2ee8f93d60 | ||
|
|
8df6e59678 | ||
|
|
6a260ad974 | ||
|
|
f5579525c4 | ||
|
|
cf7d03bda6 | ||
|
|
de0b96f52c | ||
|
|
d301611de7 | ||
|
|
60ce938149 | ||
|
|
5ad957f270 | ||
|
|
e23925f2be | ||
|
|
06f5279f77 | ||
|
|
899c69caf1 | ||
|
|
880c8e4dc9 | ||
|
|
d33fbe4547 | ||
|
|
c3bdacbf04 | ||
|
|
c3ec5323f0 | ||
|
|
7231b467a6 | ||
|
|
1338e7fce2 | ||
|
|
c363c11e20 | ||
|
|
3703ade9f1 | ||
|
|
361d12bf43 | ||
|
|
df45488e09 | ||
|
|
042add0e7f | ||
|
|
dd06d90466 | ||
|
|
1c682d7b89 | ||
|
|
e5a5e76a30 | ||
|
|
e3f7681e89 | ||
|
|
97d01a5487 | ||
|
|
ee46c8075f | ||
|
|
e9c144bf98 | ||
|
|
a565848dfa | ||
|
|
6e6010d198 | ||
|
|
b04fff272e | ||
|
|
aa364ddaca | ||
|
|
1baa7ef806 | ||
|
|
db2346069a | ||
|
|
f1fdafcdff | ||
|
|
b5b5176f9b | ||
|
|
8674991bac | ||
|
|
8273e021db | ||
|
|
87a0765ce4 | ||
|
|
f61a7bf3df | ||
|
|
d28a1042a0 | ||
|
|
53ee5eb043 | ||
|
|
53023c1ca9 | ||
|
|
cad816a19d | ||
|
|
9c43d36513 | ||
|
|
23c8e1f06d | ||
|
|
40da32a141 | ||
|
|
e747dfd50f | ||
|
|
25c397f921 | ||
|
|
549c4f54cd | ||
|
|
c891014c77 | ||
|
|
022cc72740 | ||
|
|
a2cb01e16a | ||
|
|
d4dd5645fe | ||
|
|
498c8cfc8e | ||
|
|
9b4c81e85f | ||
|
|
37d739684c | ||
|
|
839bd0e150 | ||
|
|
ae349ca6ba | ||
|
|
59df2db4e0 | ||
|
|
26768e8514 | ||
|
|
b55f84c0a8 | ||
|
|
7c0a298701 | ||
|
|
3aeca70970 | ||
|
|
ab3c1f2a08 | ||
|
|
fae601fe39 | ||
|
|
b92ce38593 | ||
|
|
2e275731a3 | ||
|
|
649821be4c | ||
|
|
867929e0b4 | ||
|
|
2a696cb837 | ||
|
|
54da8371ac | ||
|
|
d94a02ba79 | ||
|
|
549d7a487d | ||
|
|
d4d552fb00 | ||
|
|
a1073105e1 | ||
|
|
2ea187fb85 | ||
|
|
d44fe50953 | ||
|
|
006d260d20 | ||
|
|
646df49c74 | ||
|
|
7248d8422e | ||
|
|
3c3a91697e | ||
|
|
8df8866c5a | ||
|
|
7d6ba2d07d | ||
|
|
2fb5c91f4d | ||
|
|
10e0c39115 | ||
|
|
bf14e666ea | ||
|
|
0c9c66dd6b | ||
|
|
9fd0bc93f0 | ||
|
|
49a4ced79c | ||
|
|
0cfa90828c | ||
|
|
7488dd829d | ||
|
|
88946a34bb | ||
|
|
e85c1fb762 | ||
|
|
9839b0eb7f | ||
|
|
1a9690cc62 | ||
|
|
75b7b9564a | ||
|
|
203bec634c | ||
|
|
ca9790a71f | ||
|
|
beb90435b5 | ||
|
|
d3e676bdc1 | ||
|
|
581603f2bd | ||
|
|
fb927dab60 | ||
|
|
194ecda829 | ||
|
|
14d83c8457 | ||
|
|
e47ad33af6 | ||
|
|
31ac20876c | ||
|
|
3792e17885 | ||
|
|
c5dc1a33b6 | ||
|
|
9511b7d0a1 | ||
|
|
8c338a7c3b | ||
|
|
dfa29b6e4d | ||
|
|
73a259496e | ||
|
|
ce31c4c03e | ||
|
|
c0a0949932 | ||
|
|
373aa3dbc8 | ||
|
|
e3581c5cf6 | ||
|
|
b8d762df97 | ||
|
|
2790890bc2 | ||
|
|
c0fa31e75a | ||
|
|
03b76d19f1 | ||
|
|
e7cd496c31 | ||
|
|
f834276803 | ||
|
|
64e9bdc213 | ||
|
|
ec82fa77c5 | ||
|
|
5ea17ad2d4 | ||
|
|
7ad03e9d6a | ||
|
|
b62bf59c21 | ||
|
|
3b0dfd9ae1 | ||
|
|
1d24fecc1b | ||
|
|
69d3c3f596 | ||
|
|
2425c05c42 | ||
|
|
88248b1b66 | ||
|
|
38000f8622 | ||
|
|
97ef860acb | ||
|
|
6c48fc1ff9 | ||
|
|
9c87ace153 | ||
|
|
3bb1d24dad | ||
|
|
bd16dd9fdf | ||
|
|
d77a78d945 | ||
|
|
b0ce66d141 | ||
|
|
317b2dc579 | ||
|
|
246e7e8464 | ||
|
|
cdfb578565 | ||
|
|
c99200918e | ||
|
|
2480cce1ed | ||
|
|
e0fcd565d5 | ||
|
|
5fd5e558ae | ||
|
|
f8a89e3f8f | ||
|
|
b3ed2a4dcc | ||
|
|
2a7a6fa1eb | ||
|
|
4d7d1eb0c4 | ||
|
|
dc24327b1e | ||
|
|
68e01d87be | ||
|
|
d2d4ea42ce | ||
|
|
4490cd2e8a | ||
|
|
a6450e8e98 | ||
|
|
1307cfc97c | ||
|
|
ef02373061 | ||
|
|
013c0e6e16 | ||
|
|
48f1f814d2 | ||
|
|
0ed8199da2 | ||
|
|
43c8726c37 | ||
|
|
ebb4935703 | ||
|
|
1f3d7d393e | ||
|
|
cfa8e0a81a | ||
|
|
9e7ba5f138 | ||
|
|
9a4d989188 | ||
|
|
659aa8db3c | ||
|
|
6b2777e681 | ||
|
|
d82e6c9cd9 | ||
|
|
25771a1afe | ||
|
|
c94038af89 | ||
|
|
fc7237be7b | ||
|
|
f41edef4c6 | ||
|
|
1d10b150c5 | ||
|
|
c3614c0e38 | ||
|
|
3cd9e2cab7 | ||
|
|
d0e321c8a3 | ||
|
|
8d035a446a | ||
|
|
f6ab63f3a0 | ||
|
|
1416c70e73 | ||
|
|
271786b186 | ||
|
|
4e66728477 | ||
|
|
1505f3e22c | ||
|
|
36183660e6 | ||
|
|
96bd4e8794 | ||
|
|
9d7f1a236a | ||
|
|
34a24eaa4e | ||
|
|
cda9240632 | ||
|
|
0fb28eb42e | ||
|
|
b525553b53 | ||
|
|
770ffa1ebd | ||
|
|
188bad4f38 | ||
|
|
7778cbe9f5 | ||
|
|
11866fb017 | ||
|
|
f374e37b61 | ||
|
|
5d0ea97823 | ||
|
|
108913c69e | ||
|
|
0637feb382 | ||
|
|
db4a9d6b59 | ||
|
|
bb6ab185c3 | ||
|
|
fbfd92a899 | ||
|
|
0626ac2901 | ||
|
|
be04de98bb | ||
|
|
b018381f10 | ||
|
|
fe50bdc164 | ||
|
|
d2a2db7bff | ||
|
|
5b93b4f37d | ||
|
|
68af46402e | ||
|
|
dc3101384f | ||
|
|
48029fa9ad | ||
|
|
b4dc968db5 | ||
|
|
35431d457b | ||
|
|
4403c76406 | ||
|
|
73771b741c | ||
|
|
bae9ed0350 | ||
|
|
3b067f5f85 | ||
|
|
27149ba8bc | ||
|
|
56ad6cef54 | ||
|
|
765ffa37eb | ||
|
|
da98c3c135 | ||
|
|
cdd4a7c880 | ||
|
|
95696559b7 | ||
|
|
37f31da6c9 | ||
|
|
3d3549d65a | ||
|
|
e9e437ce05 | ||
|
|
244d61f8d0 | ||
|
|
67e85fa9dd | ||
|
|
61213263cd | ||
|
|
0b49e4db1c | ||
|
|
a2395ff3e8 | ||
|
|
9e949622d3 | ||
|
|
2281163efd | ||
|
|
51410fdb6d | ||
|
|
8adaf4efd4 | ||
|
|
652380c5fd | ||
|
|
dff385cb37 | ||
|
|
df2749dd50 | ||
|
|
b7175b54eb | ||
|
|
f03688e443 | ||
|
|
1efbb83060 | ||
|
|
31104d73b9 | ||
|
|
3c432f5e07 | ||
|
|
7004f74b71 | ||
|
|
421b6d4a80 | ||
|
|
5813d2bf72 | ||
|
|
b89cbf3224 | ||
|
|
6d788654e1 | ||
|
|
68ac8fde26 | ||
|
|
5b900056f3 | ||
|
|
d809bbb715 | ||
|
|
132170f54c | ||
|
|
6ec86fa344 | ||
|
|
05e11f6336 | ||
|
|
37d51e8d74 | ||
|
|
29943d7a91 | ||
|
|
aa270263c9 | ||
|
|
703b060d09 | ||
|
|
6cbc0e84f0 | ||
|
|
c21527d3c6 | ||
|
|
e904732554 | ||
|
|
6c022db786 | ||
|
|
4e34edfa81 | ||
|
|
03ffe49aa3 | ||
|
|
2716a37916 | ||
|
|
66f36f6dcc | ||
|
|
625ed030ef | ||
|
|
dbcb23ddc8 | ||
|
|
da99868a28 | ||
|
|
40a393926d | ||
|
|
56ae814cbc | ||
|
|
5de0f944bd | ||
|
|
e78dc4d682 | ||
|
|
d43722fa85 | ||
|
|
2f614ad79f | ||
|
|
013a4fc0f6 | ||
|
|
6dad3cc018 | ||
|
|
e7339fec15 | ||
|
|
5eb76606ae | ||
|
|
92eea7f95a | ||
|
|
673fe98cf5 | ||
|
|
aec3ea5d32 | ||
|
|
6c5b638202 | ||
|
|
7386adfc99 | ||
|
|
ca1f47a742 | ||
|
|
77bde09c13 | ||
|
|
cfd71560fa | ||
|
|
78e1127d99 | ||
|
|
81e4d3fd09 | ||
|
|
d40334fe9d | ||
|
|
34ddc9240e | ||
|
|
7df6984261 | ||
|
|
a11e242bb2 | ||
|
|
ba38c94a40 | ||
|
|
7ea77a0047 | ||
|
|
3fed6ca050 | ||
|
|
2fd960f12c | ||
|
|
f10d2bb75f | ||
|
|
af56b01a41 | ||
|
|
55989b3c2c | ||
|
|
f3010cbfb2 | ||
|
|
d091f4e5b2 | ||
|
|
8a46911725 | ||
|
|
8d7eccb8e1 | ||
|
|
61b8c0b699 | ||
|
|
628f13f1c8 | ||
|
|
a45ad47841 | ||
|
|
a3086a2ef3 | ||
|
|
73da3c9e4c | ||
|
|
616b07204d | ||
|
|
7565fe595b | ||
|
|
3436ae99fc | ||
|
|
77e56aa3f9 | ||
|
|
ab37dcaa9c | ||
|
|
76176eddab | ||
|
|
b17ed79773 | ||
|
|
5b98cde811 | ||
|
|
9d845262b7 | ||
|
|
c69ef876c5 | ||
|
|
4a1ce3e1f5 | ||
|
|
025652bb78 | ||
|
|
c588bdee5a | ||
|
|
1ba5996404 | ||
|
|
b6e6cde3e8 | ||
|
|
1b0b4be287 | ||
|
|
8f1e8a9dde | ||
|
|
3f59f23427 | ||
|
|
d2c508e9a9 | ||
|
|
219ecd18b5 | ||
|
|
3dea698c93 | ||
|
|
9cbf572561 | ||
|
|
9feaff3464 | ||
|
|
bc9f8babaa | ||
|
|
0138f46797 | ||
|
|
b04e509830 | ||
|
|
05de780219 | ||
|
|
9814497b91 | ||
|
|
fa867578bc | ||
|
|
0661273aad | ||
|
|
b924c6c4a9 | ||
|
|
13783aea70 | ||
|
|
f5fca00d37 | ||
|
|
d9409006fa | ||
|
|
03829d9935 | ||
|
|
bbaf6e3a1c | ||
|
|
e666209fe2 | ||
|
|
c84bafbdae | ||
|
|
2669610be9 | ||
|
|
07cea76e63 | ||
|
|
e9a2f86dcf | ||
|
|
1e5a53abb3 | ||
|
|
8e2a8cc7f3 | ||
|
|
1848eb0973 | ||
|
|
190f970544 | ||
|
|
3672cfad0b | ||
|
|
f990a0b3d3 | ||
|
|
f073ffa4ad | ||
|
|
f8f2fa246e | ||
|
|
6a335c4416 | ||
|
|
2bfe8e5153 | ||
|
|
58763ff299 | ||
|
|
02b846aa72 | ||
|
|
288ea182a8 | ||
|
|
8fe70a24a8 | ||
|
|
993cd1467b | ||
|
|
d52f1da7a2 | ||
|
|
d2a4762c6a | ||
|
|
def99bed02 | ||
|
|
195f4d0911 | ||
|
|
b8d2208c7a | ||
|
|
6b1b5e001d | ||
|
|
09236a438b | ||
|
|
c83c5e7c61 | ||
|
|
2440ffd013 | ||
|
|
951f30853a | ||
|
|
8903f6e0c0 | ||
|
|
692ca8ac83 | ||
|
|
f703ddfb66 | ||
|
|
20884c9576 | ||
|
|
202d479bad | ||
|
|
5bd6d3acb5 | ||
|
|
9a713ff9b0 | ||
|
|
aec7f2f6c4 | ||
|
|
46379d92f4 | ||
|
|
328cb7ed7e | ||
|
|
450c6e843c | ||
|
|
b280e08ee0 | ||
|
|
a8b0dfb38a | ||
|
|
ce6f687f65 | ||
|
|
afa5a134b7 | ||
|
|
f1e17f30f6 | ||
|
|
5e9c154376 | ||
|
|
786be1d1c3 | ||
|
|
a1bad50b2f | ||
|
|
bdecbc1945 | ||
|
|
3bb6b6c8b2 | ||
|
|
bb5793d485 | ||
|
|
83b300435a | ||
|
|
67d9d94fb3 | ||
|
|
955c0b1576 | ||
|
|
eb68c222fe | ||
|
|
9a77c0ab81 | ||
|
|
8ac00b8711 | ||
|
|
4b0e606ae8 | ||
|
|
9df29d0dd2 | ||
|
|
0ea2e687d1 | ||
|
|
0018e44102 | ||
|
|
9d0cc7912a | ||
|
|
e918f8faf2 | ||
|
|
11871d9544 | ||
|
|
090e6e936a | ||
|
|
13faf864cb | ||
|
|
30169f86c1 | ||
|
|
7665114ded | ||
|
|
8652f422d4 | ||
|
|
852fca2151 | ||
|
|
cf7ac7be7f | ||
|
|
5f36874c9b | ||
|
|
514ee9d396 | ||
|
|
d4f0fe12ab | ||
|
|
56749877ea | ||
|
|
11ad18cd28 | ||
|
|
fcd73bcb63 | ||
|
|
74af88bc92 | ||
|
|
6b2808a3f9 | ||
|
|
4e447db883 | ||
|
|
000eaca6be | ||
|
|
7efb3ecb34 | ||
|
|
db28796b5f | ||
|
|
16dd889922 | ||
|
|
076d0208cd | ||
|
|
63ef04e03e | ||
|
|
3774ae0d91 | ||
|
|
e2b5debc6b | ||
|
|
ed393896f5 | ||
|
|
cff2874608 | ||
|
|
837df7c074 | ||
|
|
d19a33c420 | ||
|
|
a4b159a80f | ||
|
|
e3f00ff28b | ||
|
|
deb09d95b0 | ||
|
|
73296e486a | ||
|
|
504fd01f57 | ||
|
|
b930a11203 | ||
|
|
d232833573 | ||
|
|
cf4dc93e02 | ||
|
|
640bbbae85 | ||
|
|
e65879d076 | ||
|
|
011e26ca9a | ||
|
|
9c6b772395 | ||
|
|
81c19517d1 | ||
|
|
7f225f2eaa | ||
|
|
fbe5599526 | ||
|
|
0d6233cd45 | ||
|
|
81d17a63e3 | ||
|
|
9d7afa4e30 | ||
|
|
db05e5b66c | ||
|
|
8a6beac692 | ||
|
|
37927235cd | ||
|
|
76dc7eea50 | ||
|
|
a02aff9126 | ||
|
|
ddd83f1fc6 | ||
|
|
1d8d19c977 | ||
|
|
e41ddab3b0 | ||
|
|
e484fe15d3 | ||
|
|
4dc703af2d | ||
|
|
bbd6d0b4e5 | ||
|
|
0338d4153a | ||
|
|
a609ff4659 | ||
|
|
72b09d4794 | ||
|
|
3cfeb92a4e | ||
|
|
cd8392e42d | ||
|
|
c78cfa43bc | ||
|
|
d76e94bba8 | ||
|
|
7bc9e234a3 | ||
|
|
dc8b82e9a4 | ||
|
|
8a5ca4cbdc | ||
|
|
624005bbd0 | ||
|
|
e8b21b4242 | ||
|
|
5f5228f0f3 | ||
|
|
d04554f0b7 | ||
|
|
274ecb71fa | ||
|
|
d9dd9679e7 | ||
|
|
ef36520509 | ||
|
|
5a6d440f68 | ||
|
|
5ff7d07138 | ||
|
|
770132ff37 | ||
|
|
1c68417918 | ||
|
|
68967e833d | ||
|
|
5ddb129bc2 | ||
|
|
78b32892ac | ||
|
|
d4b17fb0c3 | ||
|
|
3b6e66db0d | ||
|
|
f526754535 | ||
|
|
98a48ecfb9 | ||
|
|
812a9d646a | ||
|
|
198fdcf1c6 | ||
|
|
3533335804 | ||
|
|
45239cbd62 | ||
|
|
68143b7b22 | ||
|
|
7be952605b | ||
|
|
1d28d45c5c | ||
|
|
947e8922f2 | ||
|
|
930c3d73c1 | ||
|
|
b806fff90a | ||
|
|
3f01e2b796 | ||
|
|
7056f875db | ||
|
|
60bbad4d86 | ||
|
|
a602673adb | ||
|
|
9c9f6415da | ||
|
|
325a7c7ec5 | ||
|
|
6066414afa | ||
|
|
effa0061e8 | ||
|
|
0052ab71e9 | ||
|
|
5749add670 | ||
|
|
fb5cae7376 | ||
|
|
ddb1770af2 | ||
|
|
02f9b5d0e4 | ||
|
|
88654ad81b | ||
|
|
ed58192e4c | ||
|
|
23993d2264 | ||
|
|
d478b44915 | ||
|
|
651a203ecb | ||
|
|
9d6b402df0 | ||
|
|
e8f8defc3e | ||
|
|
2daf915371 | ||
|
|
f2d9fa3815 | ||
|
|
015d0c5e33 | ||
|
|
a69d8c6744 | ||
|
|
0273933960 | ||
|
|
730f485591 | ||
|
|
49d7a151b7 | ||
|
|
41e0561b05 | ||
|
|
62a872b8b5 | ||
|
|
0cd9066f44 | ||
|
|
91df872c36 | ||
|
|
cadde3e9f0 | ||
|
|
5af6a685b8 | ||
|
|
b0138e021e | ||
|
|
e73ed56231 | ||
|
|
2785a5bf65 | ||
|
|
b93177c1a8 | ||
|
|
5f21b152a7 | ||
|
|
c874a22b3b | ||
|
|
4e1a09c9f5 | ||
|
|
90279a7108 | ||
|
|
a3a91f54a9 | ||
|
|
206e64d72c | ||
|
|
2ef0f15b34 | ||
|
|
7e0197c1b8 | ||
|
|
471c931ada | ||
|
|
45a3d8474e | ||
|
|
50cd0ed785 | ||
|
|
0115c5e76c | ||
|
|
6113c4fe63 | ||
|
|
6ce7bb4581 | ||
|
|
f2a75d5223 | ||
|
|
183924e2a8 | ||
|
|
b3fc462a78 | ||
|
|
af27963938 | ||
|
|
ca63b92d4f | ||
|
|
90f07eb64a | ||
|
|
0d1e5abc41 | ||
|
|
7750ce5f60 | ||
|
|
0838080fcd | ||
|
|
b13c95ea48 | ||
|
|
6b06184ef4 | ||
|
|
56ae3797dd | ||
|
|
b4ad174b7f | ||
|
|
827a9e221f | ||
|
|
0a07dc5762 | ||
|
|
b306c04e99 | ||
|
|
0845a9b7c3 | ||
|
|
438adfc2be | ||
|
|
47ffedc5de | ||
|
|
ff1437fc5a | ||
|
|
c9cfe9d40b | ||
|
|
72fdb09e46 | ||
|
|
3bf9b28773 | ||
|
|
5ef9569098 | ||
|
|
05177b9dcb | ||
|
|
b2428290f9 | ||
|
|
a66753871d | ||
|
|
8f3f27f286 | ||
|
|
39c5c9b966 | ||
|
|
b01709e502 | ||
|
|
6c087de837 | ||
|
|
dc72d2591e | ||
|
|
19c3ba2f8f | ||
|
|
684a443b08 | ||
|
|
e50706f25c | ||
|
|
6f886dccca | ||
|
|
123d788d0d | ||
|
|
a2d7bc6e6f | ||
|
|
972f60d785 | ||
|
|
b6e2495aa2 | ||
|
|
1254d7a302 | ||
|
|
bf7f84d16f | ||
|
|
a43b8b5c96 | ||
|
|
3a369f513c | ||
|
|
acf0b84523 | ||
|
|
12faf9fcfa | ||
|
|
a130d3cd14 | ||
|
|
deddc71720 | ||
|
|
b904d7d1ba | ||
|
|
931bba1d7d | ||
|
|
c261ac4f46 | ||
|
|
2ed4457c5f | ||
|
|
2dc547a45c | ||
|
|
8f9f426479 | ||
|
|
e3c40f1df8 | ||
|
|
e38a221dc3 | ||
|
|
4a7ec90bef | ||
|
|
e5aba94ae4 | ||
|
|
4fdb33bb0a | ||
|
|
66696e1329 | ||
|
|
3f6c3edd19 | ||
|
|
b9bd296adc | ||
|
|
3664bea912 | ||
|
|
e8e205284c | ||
|
|
b3e0827f58 | ||
|
|
4fc41c4bc4 | ||
|
|
c7d4360931 | ||
|
|
6663e94780 | ||
|
|
e649cf84e3 | ||
|
|
67fcce2d46 | ||
|
|
85c741519b | ||
|
|
b3e416fb52 | ||
|
|
1396dc1c89 | ||
|
|
3b8f01b4fb | ||
|
|
62c80bc2c5 | ||
|
|
82e6628659 | ||
|
|
5dcd2303c9 | ||
|
|
d472a27489 | ||
|
|
895c7624e4 | ||
|
|
2799a6f065 | ||
|
|
c6573f9005 | ||
|
|
99f311cc5f | ||
|
|
30f1c6bad5 | ||
|
|
564545d20a | ||
|
|
b4dbf9cacf | ||
|
|
0c1d3ffbfe | ||
|
|
586a886975 | ||
|
|
09fa0f1540 | ||
|
|
d3839b5d68 | ||
|
|
b6dc2d9106 | ||
|
|
1bbfc271c5 | ||
|
|
808975fc86 | ||
|
|
344e9b440a | ||
|
|
dabfc4ebd0 | ||
|
|
288a6ee468 | ||
|
|
6f8e91e3a5 | ||
|
|
d4ddfa7e86 | ||
|
|
721a3a24ae | ||
|
|
6c9b2b8303 | ||
|
|
8a16086084 | ||
|
|
08814d6de4 | ||
|
|
0058b8253d | ||
|
|
11b7b97311 | ||
|
|
36edd6295f | ||
|
|
a530c52b2d | ||
|
|
2cad6db9f7 | ||
|
|
8c8df66986 | ||
|
|
3bbda7103f | ||
|
|
30ade1d6ea | ||
|
|
d7c63922d5 | ||
|
|
add4d391cb | ||
|
|
2b6ba63a55 | ||
|
|
e029044b13 | ||
|
|
931cf86cc3 | ||
|
|
8277c976a8 | ||
|
|
9c8769503f | ||
|
|
eec5cf1eb1 | ||
|
|
70c18fc7b2 | ||
|
|
cbcdc8434f | ||
|
|
1c2bf7b244 | ||
|
|
013bfc7ebc | ||
|
|
caa25a3150 | ||
|
|
eb42d2220f | ||
|
|
442030a7c8 | ||
|
|
d62d0c40d2 | ||
|
|
4d5ac1e16d | ||
|
|
16bf300934 | ||
|
|
e534f8507b | ||
|
|
8d3f680d07 | ||
|
|
3aecdeab63 | ||
|
|
32463e94f5 | ||
|
|
fb6be080fb | ||
|
|
7a5f008042 | ||
|
|
2770077cb0 | ||
|
|
e5f12ad74a | ||
|
|
40bd1be85f | ||
|
|
100b3986b8 | ||
|
|
34af7ccba9 | ||
|
|
a19aaf2b90 | ||
|
|
7815c5b108 | ||
|
|
0a3486b4c5 | ||
|
|
c1ccd56119 | ||
|
|
c2fe4ffa85 | ||
|
|
31d03bb113 | ||
|
|
de76ac583f | ||
|
|
11908410f3 | ||
|
|
e3917d98c2 | ||
|
|
073d9f3179 | ||
|
|
5c74e86ec4 | ||
|
|
ec984bcc0c | ||
|
|
3478430762 | ||
|
|
44442223a2 | ||
|
|
0aadde2673 | ||
|
|
c1fc61200c | ||
|
|
3c4e4d4825 | ||
|
|
30e0bda434 | ||
|
|
c9b395f9cf | ||
|
|
ef46fbb96f | ||
|
|
24b263cf87 | ||
|
|
2237968ec1 | ||
|
|
e7f52ebed6 | ||
|
|
d0f9bdf85e | ||
|
|
6118875ee3 | ||
|
|
13a7ce9e69 | ||
|
|
926ffc8aa9 | ||
|
|
fb7ca56d87 | ||
|
|
cf9498ef6b | ||
|
|
42e314d281 | ||
|
|
c4a6ba76a1 | ||
|
|
1c43204224 | ||
|
|
e2976b70dc | ||
|
|
6b6c9d6738 | ||
|
|
dd7ebf7fac | ||
|
|
edd56bc080 | ||
|
|
2230cbae01 | ||
|
|
6081e0d602 | ||
|
|
277b7b35d0 | ||
|
|
41dca3ef58 | ||
|
|
8a24d7d723 | ||
|
|
5ae8853648 | ||
|
|
0b7fe0a9d0 | ||
|
|
576e80b3a9 | ||
|
|
e91642e615 | ||
|
|
d286f67220 | ||
|
|
962bbf1c60 | ||
|
|
ffafeac0f8 | ||
|
|
5e2a6ffe65 | ||
|
|
8a23cfc0d6 | ||
|
|
e9bcd36d5e | ||
|
|
13e09c61ef | ||
|
|
439973004a | ||
|
|
1060de88af | ||
|
|
dbef9f9c0b | ||
|
|
4b7c70caca | ||
|
|
d182059ba6 | ||
|
|
00978da2c4 | ||
|
|
888a43a684 | ||
|
|
199f4f006b | ||
|
|
6a0a2da05c | ||
|
|
99c70cf9c6 | ||
|
|
ac0fee8e64 | ||
|
|
d0ff9a7c4a | ||
|
|
845084c89d | ||
|
|
2596b0c612 | ||
|
|
63b8cdea7a | ||
|
|
0a84f0feb5 | ||
|
|
69df472adc | ||
|
|
7496c1be2a | ||
|
|
9aa9ea7e2e | ||
|
|
93c44a2199 | ||
|
|
f1f4e380a2 | ||
|
|
1386c5df13 | ||
|
|
b0f66a4e05 | ||
|
|
640688d8cf | ||
|
|
fb3e52ca63 | ||
|
|
4e51867612 | ||
|
|
78f8a8aee6 | ||
|
|
1139d3b458 | ||
|
|
653a27005b | ||
|
|
3521c9045b | ||
|
|
b99ba21ddd | ||
|
|
46dbbd0ed0 | ||
|
|
63b2d4be99 | ||
|
|
ad8ed851d0 | ||
|
|
138d730dfa | ||
|
|
9fcb8536e8 | ||
|
|
13c68eb81e | ||
|
|
076089d3c5 | ||
|
|
a7c84834f4 | ||
|
|
4fcabb71c4 | ||
|
|
a24bf80228 | ||
|
|
4956ca62e3 | ||
|
|
328a235f94 | ||
|
|
0c7bac4ba7 | ||
|
|
776c57a478 | ||
|
|
16cddbf097 | ||
|
|
6161392648 | ||
|
|
c6a7d0a3a0 | ||
|
|
ae8f7cf569 | ||
|
|
86862d6a94 | ||
|
|
3d83934caf | ||
|
|
945439dab6 | ||
|
|
39bd058acf | ||
|
|
9bcbb3868f | ||
|
|
37e3cc0e72 | ||
|
|
97b9ce04a4 | ||
|
|
11e6734912 | ||
|
|
d7bb887c2a | ||
|
|
304258162c | ||
|
|
411868a43a | ||
|
|
a5ddb613fb | ||
|
|
f1f6fb1a9f | ||
|
|
faf3248e98 | ||
|
|
75eac291ac | ||
|
|
3a36ed3802 | ||
|
|
bfb926a544 | ||
|
|
f87e872fa2 | ||
|
|
c4241f90e6 | ||
|
|
b17e10c72e | ||
|
|
bb9d268bd9 | ||
|
|
905f844b16 | ||
|
|
1ca7a607d3 | ||
|
|
b74e1bb05d | ||
|
|
a4de507c6d | ||
|
|
dd34e65398 | ||
|
|
f9cb0d443b | ||
|
|
d148920b54 | ||
|
|
b7dc5b2f7b | ||
|
|
077e06b44e | ||
|
|
1e504fb388 | ||
|
|
f3c5f36317 | ||
|
|
b52c98ac43 | ||
|
|
0970e61350 | ||
|
|
1c11ac9fdf | ||
|
|
4b362862ad | ||
|
|
3a340cbffc | ||
|
|
bec3e07635 | ||
|
|
b3f2c629c6 | ||
|
|
104c278216 | ||
|
|
39925b8dac | ||
|
|
96fb7901b3 | ||
|
|
81b44dc2c9 | ||
|
|
f0a9b88ac4 | ||
|
|
a849d46e3f | ||
|
|
7e538d7401 | ||
|
|
28ffe2a6ee | ||
|
|
60716bba29 | ||
|
|
1d78914a8f | ||
|
|
75b8822f06 | ||
|
|
d70cd81875 | ||
|
|
da9b3d82d2 | ||
|
|
9609b3a9c8 | ||
|
|
01dbb25a37 | ||
|
|
1d0ebfb691 | ||
|
|
2943bdc1f6 | ||
|
|
d688d356a7 | ||
|
|
977eb895e8 | ||
|
|
6da1d3aff8 | ||
|
|
c7501e2d3d | ||
|
|
a3bd8d3e4c | ||
|
|
55ef117531 | ||
|
|
94f23d96e9 | ||
|
|
d6037cbcf2 | ||
|
|
ae8cc2f433 | ||
|
|
9cbd9db4e7 | ||
|
|
cecb7d29c7 | ||
|
|
4988d340b1 | ||
|
|
e89ae7e194 | ||
|
|
04ca7efc0c | ||
|
|
f6bdb3ae81 | ||
|
|
2046ae78df | ||
|
|
0292666ac1 | ||
|
|
48cc8dd86b | ||
|
|
84edbd83da | ||
|
|
670820cc59 | ||
|
|
5423a15f46 | ||
|
|
8c753ddf8d | ||
|
|
e0db880791 | ||
|
|
a4af4f9fe7 | ||
|
|
0b64e2190f | ||
|
|
72ed673566 | ||
|
|
6ca53d7b39 | ||
|
|
481f103dc9 | ||
|
|
ebbf42dadb | ||
|
|
59711d9c55 | ||
|
|
013fdb8a4b | ||
|
|
fc67046bac | ||
|
|
7c9279c447 | ||
|
|
23c0bb600c | ||
|
|
6f7628cb67 | ||
|
|
b02ec8cbf9 | ||
|
|
3cfdd2a4cd | ||
|
|
bb48851092 | ||
|
|
64173c792f | ||
|
|
31ba64b409 | ||
|
|
285e04393e | ||
|
|
ca19cec9a5 | ||
|
|
8d10adf886 | ||
|
|
2b27072fac | ||
|
|
748b1d3381 | ||
|
|
145b125155 | ||
|
|
e79adc0ba1 | ||
|
|
7585483c69 | ||
|
|
b4eadb9030 | ||
|
|
b1bbb17254 | ||
|
|
b4d88ee4af | ||
|
|
8ea0c812a2 | ||
|
|
d4fac6add8 | ||
|
|
0f92800921 | ||
|
|
b0cfd3fa67 | ||
|
|
5825e467b8 | ||
|
|
f8b237433f | ||
|
|
09dc2eed82 | ||
|
|
bf92a8b80e | ||
|
|
2eac2a5c0c | ||
|
|
bc3e29e77b | ||
|
|
53a10eb312 | ||
|
|
fe249cd1f8 | ||
|
|
d22609051a | ||
|
|
30ca08aaa3 | ||
|
|
3aeaa24df6 | ||
|
|
96808a0e2a | ||
|
|
ae03aab03e | ||
|
|
6683f98eba | ||
|
|
656bc6b6c8 | ||
|
|
f41e2c0a4b | ||
|
|
1b36d7a037 | ||
|
|
99ce3d456b | ||
|
|
1ef8eacd6e | ||
|
|
ec7863d174 | ||
|
|
4189190bb8 | ||
|
|
fd4d28b7b6 | ||
|
|
4e66c12557 | ||
|
|
9315589f85 | ||
|
|
a0f8005352 | ||
|
|
23e8c8ecda | ||
|
|
641fe5c864 | ||
|
|
1754ba19d8 | ||
|
|
d16485c29e | ||
|
|
7c4f2b535b | ||
|
|
ed7ed6262f | ||
|
|
ddcb5f7da3 | ||
|
|
465dc685cc | ||
|
|
c4fbae3edc | ||
|
|
c95a1138ba | ||
|
|
2adfbfc830 | ||
|
|
7963e48ca1 | ||
|
|
494f4fe986 | ||
|
|
06540f0e91 | ||
|
|
85d19dd253 | ||
|
|
67750c91d7 | ||
|
|
4608898bcd | ||
|
|
4271eb477c | ||
|
|
43eaec325d | ||
|
|
c690c2f984 | ||
|
|
70f0115e27 | ||
|
|
801bca1ef2 | ||
|
|
5037d9de37 | ||
|
|
4af4a8f2ff | ||
|
|
104359365f | ||
|
|
acb58a1f98 | ||
|
|
de09e38d6b | ||
|
|
dda875a9c8 | ||
|
|
aef751861d | ||
|
|
b5af6d44c2 | ||
|
|
88fa935376 | ||
|
|
fe0b587b1f | ||
|
|
1cc52b0fae | ||
|
|
7a4f26ac4f | ||
|
|
27644333a8 | ||
|
|
8bf290acf0 | ||
|
|
edabd57e8a | ||
|
|
1e853072dc | ||
|
|
2f171bf5d9 | ||
|
|
f2ea8ca62c | ||
|
|
1633675c11 | ||
|
|
d3ce6fd2e7 | ||
|
|
b2b0461218 | ||
|
|
227f039652 | ||
|
|
87d8e70d6d | ||
|
|
7e55261c17 | ||
|
|
bf7ab19d09 | ||
|
|
cb82ff618b | ||
|
|
26cb9e4b9f | ||
|
|
aba09a7e4d | ||
|
|
9888bacad5 | ||
|
|
a9999ee10d | ||
|
|
047e982318 | ||
|
|
0de70e8b2c | ||
|
|
abb15275f5 | ||
|
|
45c9ccfc03 | ||
|
|
ce1a181699 | ||
|
|
b8c028c727 | ||
|
|
cd07429cc1 | ||
|
|
ca81442fac | ||
|
|
82cedbaf62 | ||
|
|
e3a162db77 | ||
|
|
d4c1ea4bba | ||
|
|
10ad5332e8 | ||
|
|
9d4fe88d09 | ||
|
|
80070516fd | ||
|
|
5d08c9d5a8 | ||
|
|
e49ca2a799 | ||
|
|
0d3f133436 | ||
|
|
dd534fde57 | ||
|
|
a0ed1e2878 | ||
|
|
c9f3a05ef6 | ||
|
|
bf94b8a1ab | ||
|
|
6eee69f7bc | ||
|
|
ebb3f4e402 | ||
|
|
ac396ea02f | ||
|
|
1c2376741b | ||
|
|
0a6d709ce2 | ||
|
|
e137fbb1ea | ||
|
|
b3b86ea6d7 | ||
|
|
b10df252dc | ||
|
|
74686d0ec4 | ||
|
|
bd85d2fd2a | ||
|
|
e07869af91 | ||
|
|
96a8eaabc5 | ||
|
|
931c846602 | ||
|
|
03525843a0 | ||
|
|
2a62f1a312 | ||
|
|
2635be511f | ||
|
|
895cefe351 | ||
|
|
57ea9bec30 | ||
|
|
2344c1a435 | ||
|
|
66506673f8 | ||
|
|
edec0b9d95 | ||
|
|
803143c6bd | ||
|
|
b1bf5f0edc | ||
|
|
e7e0da7984 | ||
|
|
5c0c418818 | ||
|
|
07a78b2843 | ||
|
|
fc900baf9e | ||
|
|
90270d8791 | ||
|
|
9a237c3e82 | ||
|
|
857276e81f | ||
|
|
905cf326cd | ||
|
|
7c923ce338 | ||
|
|
d325cdba0d | ||
|
|
d94d436273 | ||
|
|
ebdfe9a9c5 | ||
|
|
ae3df002a2 | ||
|
|
53ffee1e02 | ||
|
|
59c080be97 | ||
|
|
4f307c1a78 | ||
|
|
88e6d987d6 | ||
|
|
1a990407c7 | ||
|
|
d697b2848a | ||
|
|
0def084932 | ||
|
|
a66eebc651 | ||
|
|
89d7d937ae | ||
|
|
2de127f045 | ||
|
|
627400723c | ||
|
|
4a70d2fe51 | ||
|
|
7f4cf08516 | ||
|
|
b138cadbcb | ||
|
|
02fb393747 | ||
|
|
81148fa2bd | ||
|
|
fb27fe5379 | ||
|
|
8cbb9e1c1f | ||
|
|
5b15b8ccc9 | ||
|
|
6e4ae5a5e6 | ||
|
|
e245e22875 | ||
|
|
0845b2cfbe | ||
|
|
3e4d99a0e3 | ||
|
|
62cb48d252 | ||
|
|
a3a19e899d | ||
|
|
6855996cca | ||
|
|
48659f4145 | ||
|
|
57dd26650c | ||
|
|
655d9bda94 | ||
|
|
f44a40eee0 | ||
|
|
3bd88a3cc2 | ||
|
|
37cf46d67a | ||
|
|
9b6ee8e77d | ||
|
|
5767576deb | ||
|
|
cd43258f41 | ||
|
|
789b75df92 | ||
|
|
aa30549337 | ||
|
|
7a404af097 | ||
|
|
034bf46e4d | ||
|
|
44502a3fb2 | ||
|
|
7caebc5781 | ||
|
|
2dbb4c2ca7 | ||
|
|
7c9bb44784 | ||
|
|
04744a5390 | ||
|
|
5d0cc0944e | ||
|
|
c4ca6a9113 | ||
|
|
465f0ddf60 | ||
|
|
8de6da01d6 | ||
|
|
8500c8885c | ||
|
|
d73bedc1fb | ||
|
|
66cb61c242 | ||
|
|
e18268e2f4 | ||
|
|
2c93deb884 | ||
|
|
0701c9f204 | ||
|
|
74d2ae518a | ||
|
|
f7605c397a | ||
|
|
d60233b618 | ||
|
|
0f251e9ede | ||
|
|
f49ef39708 | ||
|
|
e5d4786371 | ||
|
|
ab8264f8be | ||
|
|
fd0d833e33 | ||
|
|
2a9cbbe157 | ||
|
|
6d0b791ac8 | ||
|
|
c3fe2135a4 | ||
|
|
2369a5c8c6 | ||
|
|
b233c24d19 | ||
|
|
70b76a8e31 | ||
|
|
74005b4362 | ||
|
|
d830620651 | ||
|
|
1cb4aa7642 | ||
|
|
c86e367b74 | ||
|
|
e60e8f3b34 | ||
|
|
1bf26a35fa | ||
|
|
ab7bc760c6 | ||
|
|
9895cab51c | ||
|
|
b2e5ae9cd8 | ||
|
|
1ca04e6113 | ||
|
|
3270545953 | ||
|
|
2e0b9de31c | ||
|
|
172e4ff853 | ||
|
|
33a9822548 | ||
|
|
478ebed069 | ||
|
|
c92b09d3e7 | ||
|
|
f866a8a8e2 | ||
|
|
c7e4f5eefb | ||
|
|
db5036686b | ||
|
|
b1511ce995 | ||
|
|
60dd7a7471 | ||
|
|
3fd852deee | ||
|
|
5f7a8df885 | ||
|
|
af334e320c | ||
|
|
3e6f7d3eb6 | ||
|
|
7a5a4df4c6 | ||
|
|
b5b8fdaeda | ||
|
|
7837abf6b0 | ||
|
|
f33de1bc64 | ||
|
|
99b31d8241 | ||
|
|
712fd384ee | ||
|
|
27d3800cc3 | ||
|
|
1c8e14c77c | ||
|
|
b74f4ee3ec | ||
|
|
daca6df41a | ||
|
|
dea2658a80 | ||
|
|
d359a7aefb | ||
|
|
e6bc18b21b | ||
|
|
fd71093a28 | ||
|
|
0a89aa0044 | ||
|
|
649a0140fd | ||
|
|
e638d12654 | ||
|
|
e9177faf17 | ||
|
|
2618b4fbd3 | ||
|
|
aacc35db19 | ||
|
|
538662d99a | ||
|
|
ea8fcb3981 | ||
|
|
6f2dcd819f | ||
|
|
828f9af64c | ||
|
|
8a6820d1b7 | ||
|
|
ce03761375 | ||
|
|
2a40665919 | ||
|
|
8488f7d82b | ||
|
|
8bc0c31f29 | ||
|
|
3a3d00ac72 | ||
|
|
38277d1dac | ||
|
|
1b3cd7abe0 | ||
|
|
64ba59590e | ||
|
|
74cc2b2a68 | ||
|
|
e52d35bf16 | ||
|
|
14bba54ddc | ||
|
|
8f6d69b763 | ||
|
|
c9c956fc8a | ||
|
|
71c2b26103 | ||
|
|
b09fd66aa2 | ||
|
|
40aad27a67 | ||
|
|
7c5905164e | ||
|
|
1bf13f8a09 | ||
|
|
d33082dffe | ||
|
|
a2d120b583 | ||
|
|
1722171adc | ||
|
|
dae3907c5f | ||
|
|
3ec2608d6b | ||
|
|
72dfe11fa5 | ||
|
|
f396f70ae7 | ||
|
|
8dc0c5a699 | ||
|
|
8aba3eaa07 | ||
|
|
43ec01b23d | ||
|
|
a73660a4c3 | ||
|
|
0af939c30d | ||
|
|
0606d26ba7 | ||
|
|
eabc72d4fe | ||
|
|
5f0ad0f562 | ||
|
|
01de1b6375 | ||
|
|
edb921f463 | ||
|
|
7f69c2fbf5 | ||
|
|
76eec7b6ea | ||
|
|
ba3a631954 | ||
|
|
85723e3799 | ||
|
|
10da871743 | ||
|
|
09f6cd6a75 | ||
|
|
3052266a40 | ||
|
|
d7c4630d33 | ||
|
|
53989daf9a | ||
|
|
3eeef6203e | ||
|
|
dea9ca2491 | ||
|
|
c64f8b0d1f | ||
|
|
809676a856 | ||
|
|
5f435fa1cc | ||
|
|
85763d0539 | ||
|
|
1c8d2c21b5 | ||
|
|
7815a5495c | ||
|
|
b5bf0eeac5 | ||
|
|
910a8934cb | ||
|
|
4b347ff148 | ||
|
|
6ea741e26e | ||
|
|
1ea13ac7f3 | ||
|
|
5b47ec49af | ||
|
|
c29f76454e | ||
|
|
ef505e21ee | ||
|
|
2f4fc86d58 | ||
|
|
dbb3c2a4cd | ||
|
|
e08566d571 | ||
|
|
4c320e1512 | ||
|
|
847a1035a5 | ||
|
|
13b11a4155 | ||
|
|
fec7f0f0b9 | ||
|
|
8866773f97 | ||
|
|
621429561c | ||
|
|
722a2c71c3 | ||
|
|
673acdbd00 | ||
|
|
7207a4970b | ||
|
|
8cfb2ad6c9 | ||
|
|
1991220797 | ||
|
|
ef387779bf | ||
|
|
3c6e090ae3 | ||
|
|
be063d740b | ||
|
|
d096763f62 | ||
|
|
ab30e81ab5 | ||
|
|
d0afa748ff | ||
|
|
12221fb999 | ||
|
|
6ff93f270c | ||
|
|
78efe72c4c | ||
|
|
9b0b6ec2db | ||
|
|
78c292b448 | ||
|
|
0a930f9862 | ||
|
|
0f8ed84333 | ||
|
|
7d32476841 | ||
|
|
2f52106253 | ||
|
|
59aa31cee5 | ||
|
|
19390871e9 | ||
|
|
98a1b2782b | ||
|
|
e3366281ee | ||
|
|
6005b7fdb6 | ||
|
|
4b982890e2 | ||
|
|
e33805b2b3 | ||
|
|
b5a1544bf8 | ||
|
|
b0deac6756 | ||
|
|
f638caef39 | ||
|
|
2b0f2be18b | ||
|
|
88ef0a75e2 | ||
|
|
8d2a4d2436 | ||
|
|
a4f931ef65 | ||
|
|
207324d15b | ||
|
|
25db5e96a3 | ||
|
|
e87289f24d | ||
|
|
f80876497e | ||
|
|
b4c93349e8 | ||
|
|
cc66eb1194 | ||
|
|
99cf520bd4 | ||
|
|
61e00e6796 | ||
|
|
51f3f31a4e | ||
|
|
5bd3045498 | ||
|
|
215657e16a | ||
|
|
b627bb933c | ||
|
|
c653977c15 | ||
|
|
24aff9e511 | ||
|
|
67351c74c8 | ||
|
|
fe4c7b082b | ||
|
|
67a50b5b34 | ||
|
|
c1f224640f | ||
|
|
25b536d03f | ||
|
|
8fbbf488ab | ||
|
|
473ffb5489 | ||
|
|
50351eded8 | ||
|
|
fd0f8d06f8 | ||
|
|
9e715b8701 | ||
|
|
ff88906e9a | ||
|
|
ddb5a8e6e4 | ||
|
|
dd2a1455dc | ||
|
|
36760f0982 | ||
|
|
b16281d6e4 | ||
|
|
4de48e86d2 | ||
|
|
7e71799980 | ||
|
|
a0ca68ce3f | ||
|
|
c5d295c378 | ||
|
|
148661ead6 | ||
|
|
b3d7b0205a | ||
|
|
a3bc32f3e0 | ||
|
|
ee92060d4d | ||
|
|
ef6c418eb6 | ||
|
|
869444cec6 | ||
|
|
84fc587ec2 | ||
|
|
6aca3be474 | ||
|
|
8a7aa1eb3b | ||
|
|
507e457c0a | ||
|
|
5a9a102491 | ||
|
|
f9fe5b60a7 | ||
|
|
74c2a3c6e6 | ||
|
|
621cb7b914 | ||
|
|
a4b6c3fa5d | ||
|
|
081338b8bf | ||
|
|
1c945faa15 | ||
|
|
b5fda6e410 | ||
|
|
32a7bd3a48 | ||
|
|
9aa1a65489 | ||
|
|
9823d80e0c | ||
|
|
6e1825b417 | ||
|
|
c9798d3918 | ||
|
|
2bb995274e | ||
|
|
d7e7113047 | ||
|
|
b2157388d9 | ||
|
|
36bf99ed5a | ||
|
|
d30eefc3be | ||
|
|
fd8a194df0 | ||
|
|
5eb71c4a13 | ||
|
|
23df9b052e | ||
|
|
f27fd63f8c | ||
|
|
4794c6a0e7 | ||
|
|
8fd69e845f | ||
|
|
0e241162d9 | ||
|
|
cdf70c070b | ||
|
|
57903247e3 | ||
|
|
90fc23ccfb | ||
|
|
f831910c5c | ||
|
|
a72f3ed0c7 | ||
|
|
d75f286230 | ||
|
|
0f0b6a0ccd | ||
|
|
4571a5eb83 | ||
|
|
c112b3aec5 | ||
|
|
068da2ea0f | ||
|
|
eca24c5d11 | ||
|
|
acd80f052b | ||
|
|
e0e064ff08 | ||
|
|
cd5dccd855 | ||
|
|
4b3ce79e84 | ||
|
|
71a92eb87b | ||
|
|
242670a33d | ||
|
|
0b750a234f | ||
|
|
845ffb59a6 | ||
|
|
b4e4e6bb21 | ||
|
|
4a096bd133 | ||
|
|
de749e9d3b | ||
|
|
2a016d03ac | ||
|
|
2a5421133d | ||
|
|
361fad9231 | ||
|
|
16fe8103ba | ||
|
|
8df7637853 | ||
|
|
7e4e3abc2c | ||
|
|
dbbfb04e7c | ||
|
|
02807aab43 | ||
|
|
b0018ed594 | ||
|
|
fca11dd441 | ||
|
|
483f0f408c | ||
|
|
68ca8ab8a4 | ||
|
|
44c00199b6 | ||
|
|
a9a8539e41 | ||
|
|
fd925fbd05 | ||
|
|
06d533b0c1 | ||
|
|
716d867f25 | ||
|
|
06173834c0 | ||
|
|
aa9bb6f71a | ||
|
|
7a51d4d796 | ||
|
|
7dc98120c0 | ||
|
|
170ee4312f | ||
|
|
2f64594ce0 | ||
|
|
7038f59ca5 | ||
|
|
d6c1ee0202 | ||
|
|
130324df76 | ||
|
|
b21be7f670 | ||
|
|
de272654f1 | ||
|
|
4d04e88679 | ||
|
|
73468b4030 | ||
|
|
13e0e63514 | ||
|
|
6b08cbcb7a | ||
|
|
0106eb1cf6 | ||
|
|
0b8a0d1640 | ||
|
|
fb1c60c53d | ||
|
|
c1ee14cc3e | ||
|
|
a0e662bef9 | ||
|
|
03904085c4 | ||
|
|
35f56bc4f0 | ||
|
|
59525c8c93 | ||
|
|
84785bbb59 | ||
|
|
51da324465 | ||
|
|
666801f9f9 | ||
|
|
66f4c881ec | ||
|
|
3608c81cb9 | ||
|
|
182e7071bf | ||
|
|
87813e84e9 | ||
|
|
b0c710c985 | ||
|
|
a6dfc6d46b | ||
|
|
250dea7bd1 | ||
|
|
f1903f3c1f | ||
|
|
9971c58ca3 | ||
|
|
20013e4b4b | ||
|
|
473617f061 | ||
|
|
5481c0fc84 | ||
|
|
81ed6ad2a1 | ||
|
|
4d415e56d6 | ||
|
|
50491670af | ||
|
|
c4f672454f | ||
|
|
f6d74c8a37 | ||
|
|
54d1a29267 | ||
|
|
e5ae4b6454 | ||
|
|
b2a076e8b8 | ||
|
|
3e4cd12fd0 | ||
|
|
03cee3fee0 | ||
|
|
be0e848ae8 | ||
|
|
1fabb7d5a6 | ||
|
|
390d88f933 | ||
|
|
98cd013908 | ||
|
|
51d0ce0222 | ||
|
|
c500044bae | ||
|
|
2fc05b814c | ||
|
|
3d8853af2b | ||
|
|
1e910c6afe | ||
|
|
bf8ed1815c | ||
|
|
ad46e1b832 | ||
|
|
0e765e34be | ||
|
|
dd3434598c | ||
|
|
117649f40d | ||
|
|
2b48ce21df | ||
|
|
a9e33e712a | ||
|
|
0dc7a57e1f | ||
|
|
8c526ad05b | ||
|
|
0afaef5818 | ||
|
|
8a81aa5c93 | ||
|
|
7924b4d77c | ||
|
|
8ea087f957 | ||
|
|
eb9448e59e | ||
|
|
c6a15dba50 | ||
|
|
210b6e36b6 | ||
|
|
1e4e882bc2 | ||
|
|
761fb930ce | ||
|
|
7bf8731778 | ||
|
|
54b71242fe | ||
|
|
f2060d431e | ||
|
|
ef4f4825ac | ||
|
|
28f5920bb0 | ||
|
|
b20777df59 | ||
|
|
9edbcb823c | ||
|
|
682838a0cf | ||
|
|
ce1215f507 | ||
|
|
5d073dcce5 | ||
|
|
9f76a7b250 | ||
|
|
e67bf674e3 | ||
|
|
e9f764db4f | ||
|
|
eb8973c362 | ||
|
|
f005079e0b | ||
|
|
18faaefe82 | ||
|
|
73106b5f5e | ||
|
|
fde929ee30 | ||
|
|
dd1ee39271 | ||
|
|
99a7b69578 | ||
|
|
c84dee5968 | ||
|
|
95754f211f | ||
|
|
3256d060f7 | ||
|
|
ef26f27753 | ||
|
|
e523540f3a | ||
|
|
50a83736ff | ||
|
|
8223efe9df | ||
|
|
83552a0d58 | ||
|
|
f23948010a | ||
|
|
cd45e9ea48 | ||
|
|
d16474442a | ||
|
|
2574dce174 | ||
|
|
9f4d498ff1 | ||
|
|
7b39ab6d06 | ||
|
|
0f2f97e3e5 | ||
|
|
41eb4453e3 | ||
|
|
153ac230ec | ||
|
|
0641a31fe0 | ||
|
|
b495dac780 | ||
|
|
270566055f | ||
|
|
3c08f655af | ||
|
|
a56121c329 | ||
|
|
ee31339dfd | ||
|
|
d844ff1381 | ||
|
|
20bcb6b8bb | ||
|
|
b67698888c | ||
|
|
7955181c6c | ||
|
|
3ab8dc0092 | ||
|
|
b898970031 | ||
|
|
3a59f5727c | ||
|
|
a48080afec | ||
|
|
48f9cc1ed7 | ||
|
|
f7153ca4fa | ||
|
|
620fc962d7 | ||
|
|
3166833471 | ||
|
|
9cfb1e3bf7 | ||
|
|
0b3412cdb5 | ||
|
|
541b058e90 | ||
|
|
2b4ac0e63a | ||
|
|
8000eb3656 | ||
|
|
60a0ba5eaa | ||
|
|
a77640165e | ||
|
|
08799792a7 | ||
|
|
cd27300d75 | ||
|
|
19d7553d67 | ||
|
|
3e68e429b6 | ||
|
|
e0f9c042c1 | ||
|
|
86ba1645b0 | ||
|
|
c73d91a8fe | ||
|
|
d86539c4f5 | ||
|
|
d72e401378 | ||
|
|
b7e5be41f5 | ||
|
|
c26e83f58a | ||
|
|
ec9566988a | ||
|
|
fb54a2635c | ||
|
|
7c080c5d4a | ||
|
|
6a834c0528 | ||
|
|
a20bef65ba | ||
|
|
9a19531909 | ||
|
|
945f964c0c | ||
|
|
aacc3c6f7e | ||
|
|
4bcdf11743 | ||
|
|
eecf92cdb0 | ||
|
|
41cc96aaec | ||
|
|
4675656786 | ||
|
|
1863dda8e5 | ||
|
|
e0ab318f56 | ||
|
|
900d96c638 | ||
|
|
7177e71444 | ||
|
|
f92cf69e60 | ||
|
|
9fff8733a0 | ||
|
|
6696e1a6e2 | ||
|
|
d54b48b300 | ||
|
|
9229a963ed | ||
|
|
fbcdffbbc8 | ||
|
|
6248899d25 | ||
|
|
1c46dabc84 | ||
|
|
48857090fc | ||
|
|
2d187fb951 | ||
|
|
f1f9e423c3 | ||
|
|
5600fd8613 | ||
|
|
a924defb94 | ||
|
|
fa4739794f | ||
|
|
cc4090cc74 | ||
|
|
8be10ffbd6 | ||
|
|
f6f204387d | ||
|
|
c6a829ce82 | ||
|
|
323ca2b3bb | ||
|
|
aa15dec660 | ||
|
|
d6899788dd | ||
|
|
afa9d42ff0 | ||
|
|
288db055ec | ||
|
|
a3382a5319 | ||
|
|
6bd34a069d | ||
|
|
117ec722a2 | ||
|
|
20637ae54c | ||
|
|
863fab0268 | ||
|
|
7a132e5c79 | ||
|
|
25f2b171fc | ||
|
|
f3e3d7e0c5 | ||
|
|
998fc8fc07 | ||
|
|
c30c76c285 | ||
|
|
d455606037 | ||
|
|
6b31ebe456 | ||
|
|
1d9d9757cf | ||
|
|
ba85b8d024 | ||
|
|
6180b843a1 | ||
|
|
8cb88d5c9a | ||
|
|
ebc41375f1 | ||
|
|
1247718cbd | ||
|
|
0f4c5fb1c9 | ||
|
|
878be4d886 | ||
|
|
7bcca827b6 | ||
|
|
4f4567513e | ||
|
|
adb8fb1dc6 | ||
|
|
1a79e5419f | ||
|
|
2b4f72ef64 | ||
|
|
f2e505d962 | ||
|
|
8b5573a6f3 | ||
|
|
bea918bb87 | ||
|
|
7e400124e8 | ||
|
|
fb97c2e01e | ||
|
|
d5eafe79bd | ||
|
|
7f5e3b36bc | ||
|
|
5664cbd3d0 | ||
|
|
45e21085c7 | ||
|
|
9fe0ca5323 | ||
|
|
d871595437 | ||
|
|
4e1abc8503 | ||
|
|
d7ee4755c2 | ||
|
|
faed178cb1 | ||
|
|
fecf4ddf65 | ||
|
|
54c382f6f1 | ||
|
|
de182d5809 | ||
|
|
80a4fbf0be | ||
|
|
830b1807c1 | ||
|
|
3ca4f5fada | ||
|
|
4b8ed3f831 | ||
|
|
b228bd267f | ||
|
|
aef756a3fd | ||
|
|
50436a0e4a | ||
|
|
c35e0e49ce | ||
|
|
c1e8612624 | ||
|
|
b288ecb795 | ||
|
|
5c3742fbd2 | ||
|
|
155891a4e0 | ||
|
|
08fac28c52 | ||
|
|
34fd148f2f | ||
|
|
b9c0d2d362 | ||
|
|
bc4a576c54 | ||
|
|
a8dc0ccbcd | ||
|
|
7c1d6b60c2 | ||
|
|
baf3bf6778 | ||
|
|
071059e8f2 | ||
|
|
777c4bd57b | ||
|
|
4471314291 | ||
|
|
9d107007a1 | ||
|
|
2597816ed6 | ||
|
|
ab38605802 | ||
|
|
77679d9650 | ||
|
|
9278a0cfba | ||
|
|
be40de331d | ||
|
|
abf5942433 | ||
|
|
ee2e83fef0 | ||
|
|
1bf094fbca | ||
|
|
cc0e0ed281 | ||
|
|
4ea4d1c8c4 | ||
|
|
67a76cee1e | ||
|
|
10677c2b0c | ||
|
|
871c29ea5d | ||
|
|
b1459ade69 | ||
|
|
f725b93019 | ||
|
|
9c0d97335e | ||
|
|
cdb1b0344c | ||
|
|
dbbb27ef8f | ||
|
|
7a03b18bfe | ||
|
|
dc8199709f | ||
|
|
717e26b45e | ||
|
|
07f69fab19 | ||
|
|
2805f8d0cc | ||
|
|
78cbb7746f | ||
|
|
2642f6a0da | ||
|
|
e006da7259 | ||
|
|
4b329cb89d | ||
|
|
ee2f1652b5 | ||
|
|
639dc02cc8 | ||
|
|
c1fc768c1b | ||
|
|
efff96d622 | ||
|
|
19a5436118 | ||
|
|
be3bd520f6 | ||
|
|
5edd9cdc3a | ||
|
|
dbb81b89fd | ||
|
|
b62bb22fa6 | ||
|
|
6c59b306c7 | ||
|
|
3b00132e14 | ||
|
|
4de16e9f0f | ||
|
|
57859db07c | ||
|
|
95ae915c0c | ||
|
|
583b61f883 | ||
|
|
27e04748ed | ||
|
|
3ee858cd79 | ||
|
|
be0a8794c2 | ||
|
|
57c142b993 | ||
|
|
de9f302412 | ||
|
|
85c5103ba3 | ||
|
|
3d6142064d | ||
|
|
85dbd38ada | ||
|
|
a18201faa7 | ||
|
|
4fe4709b56 | ||
|
|
2ab2a58bc5 | ||
|
|
b0e498bf0b | ||
|
|
86df486988 | ||
|
|
392986b763 | ||
|
|
3cc7009440 | ||
|
|
eb923b4995 | ||
|
|
5374899f29 | ||
|
|
0f9322bf36 | ||
|
|
f2be3d7ffb | ||
|
|
73073cd954 | ||
|
|
fe249ab0c3 | ||
|
|
3e324befd0 | ||
|
|
515da900e4 | ||
|
|
2c778c8849 | ||
|
|
67cd90de6e | ||
|
|
84ac634c31 | ||
|
|
c4b7d7cab3 | ||
|
|
c27a10b956 | ||
|
|
405e1ecf88 | ||
|
|
a4161feaaa | ||
|
|
a358a6b0c6 | ||
|
|
59baef89a0 | ||
|
|
b53fb365a6 | ||
|
|
16931fd23f | ||
|
|
ed8855c4cd | ||
|
|
4a556f72bb | ||
|
|
06c1b9e95e | ||
|
|
af30bf939e | ||
|
|
c1d9e22ca6 | ||
|
|
420ecaf31d | ||
|
|
402e55d115 | ||
|
|
8bb11d9035 | ||
|
|
7bfc3ef767 | ||
|
|
051cc732bb | ||
|
|
dee64347e0 | ||
|
|
4c8510dfaf | ||
|
|
663c69305a | ||
|
|
aed8370d87 | ||
|
|
182108faca | ||
|
|
54226e74cf | ||
|
|
714ff50322 | ||
|
|
4b5acfd960 | ||
|
|
8760313ce5 | ||
|
|
af224b4933 | ||
|
|
cc9828b481 | ||
|
|
e05f103c41 | ||
|
|
1318c27699 | ||
|
|
19723c927b | ||
|
|
554d87f5b0 | ||
|
|
8a1248b2e7 | ||
|
|
04db2d02b8 | ||
|
|
54a02996f2 | ||
|
|
332d52f459 | ||
|
|
c3ddaf16ec | ||
|
|
a680db44ed | ||
|
|
b15780ae51 | ||
|
|
5e4c5f189f | ||
|
|
e1a2a4f362 | ||
|
|
8e8f543013 | ||
|
|
4b3c44cfd7 | ||
|
|
d42725aafe | ||
|
|
92129d760d | ||
|
|
6a186e8f11 | ||
|
|
a3ab5df2ed | ||
|
|
27b6f30305 | ||
|
|
93b942de46 | ||
|
|
caed4aad58 | ||
|
|
c0491285f8 | ||
|
|
fde83aff0b | ||
|
|
da28bc7026 | ||
|
|
4b110756e0 | ||
|
|
4dd8796dba | ||
|
|
f34352faf9 | ||
|
|
efaec8be8e | ||
|
|
4068cbc6eb | ||
|
|
e1739549b2 | ||
|
|
14e1b963f2 | ||
|
|
91de4e1ece | ||
|
|
86402204a7 | ||
|
|
0c63f5c80d | ||
|
|
50871d1a92 | ||
|
|
deab448d93 | ||
|
|
233ae3f772 | ||
|
|
2251634743 | ||
|
|
f91d527154 | ||
|
|
211275ab49 | ||
|
|
ec10831318 | ||
|
|
893d14ef8f | ||
|
|
b33a9fc9e7 | ||
|
|
2b3204603a | ||
|
|
e947d5e8c8 | ||
|
|
449575a122 | ||
|
|
75603beeea | ||
|
|
c04c973f84 | ||
|
|
2df4998acc | ||
|
|
956651384c | ||
|
|
682c619456 | ||
|
|
5f1b88c2c4 | ||
|
|
bbc35b1179 | ||
|
|
885612afea | ||
|
|
df37597f00 | ||
|
|
c6c2fccb23 | ||
|
|
080f550625 | ||
|
|
8bef97fce6 | ||
|
|
12e48c6fe2 | ||
|
|
1185f04868 | ||
|
|
a9a8f8c804 | ||
|
|
8c0b25a2ab | ||
|
|
7aacf77262 | ||
|
|
24958df565 | ||
|
|
fb4cfa72cd | ||
|
|
a6100be8df | ||
|
|
ac67b1ea1b | ||
|
|
c36984cc94 | ||
|
|
2bd22aa4a4 | ||
|
|
77fcd572dc | ||
|
|
8cbdb75dd6 | ||
|
|
d691f46f1e | ||
|
|
99db5f53f7 | ||
|
|
48de1077ec | ||
|
|
74ba8f5cc9 | ||
|
|
78f9f25a00 | ||
|
|
a0d6651e0e | ||
|
|
1a4113d245 | ||
|
|
da5a1e458b | ||
|
|
5deb86de4f | ||
|
|
6ada43df61 | ||
|
|
810a0725ec | ||
|
|
0db0c642c3 | ||
|
|
d55f4ab097 | ||
|
|
5818956cdc | ||
|
|
4449468ca4 | ||
|
|
e247690fe1 | ||
|
|
79dad0bca9 | ||
|
|
0ced7116b6 | ||
|
|
db2c656da8 | ||
|
|
c3e78b8c8f | ||
|
|
0a03797694 | ||
|
|
1abdf2d68f | ||
|
|
0f19f9dd51 | ||
|
|
4b029567e5 | ||
|
|
39245f088a | ||
|
|
449d839684 | ||
|
|
581d836de6 | ||
|
|
1b6ae00966 | ||
|
|
dc4db87be3 | ||
|
|
e64db44bb5 | ||
|
|
f91e3a5d3c | ||
|
|
d078e6bb08 | ||
|
|
1fde205f97 | ||
|
|
0050c1915b | ||
|
|
d0ac69d12e | ||
|
|
ea960b2ce2 | ||
|
|
df825506fd | ||
|
|
e8afd7a1b7 | ||
|
|
2bd20180e9 | ||
|
|
63d747042e | ||
|
|
61c1535199 | ||
|
|
30714d16d9 | ||
|
|
c1aba95d7d | ||
|
|
be16c5b21d | ||
|
|
5a1af94452 | ||
|
|
6ecb6cfe8e | ||
|
|
c408223bb5 | ||
|
|
001e0b828a | ||
|
|
15f4594e44 | ||
|
|
b10fcc79ba | ||
|
|
93d2ab200f | ||
|
|
6433c23a34 | ||
|
|
c64e447749 | ||
|
|
95709811e0 | ||
|
|
75c6545857 | ||
|
|
ba799b3f85 | ||
|
|
053de0b8e3 | ||
|
|
9422cd1009 | ||
|
|
8fbae86bb3 | ||
|
|
b95a47b5a7 | ||
|
|
fdac3a1f2e | ||
|
|
4f74410125 | ||
|
|
217e6f3b8e | ||
|
|
514d989a27 | ||
|
|
fc4a05741c | ||
|
|
f76931c01e | ||
|
|
c815f84722 | ||
|
|
42b3b19af4 | ||
|
|
adb379dd63 | ||
|
|
83dfc6b9b9 | ||
|
|
3573030b9b | ||
|
|
3ea563291c | ||
|
|
60d6543733 | ||
|
|
917b9b5124 | ||
|
|
7f87ac996d | ||
|
|
0f11d883fa | ||
|
|
74ac9ef195 | ||
|
|
7d564e9791 | ||
|
|
d5fb68e3d6 | ||
|
|
9b2511133d | ||
|
|
32550c6d69 | ||
|
|
320fad49c5 | ||
|
|
6ac64c8586 | ||
|
|
2b685fc80a | ||
|
|
c0d86eb651 | ||
|
|
f508955b64 | ||
|
|
f3c917e0aa | ||
|
|
d7ae9d7279 | ||
|
|
9e201e1f93 | ||
|
|
87df587f5a | ||
|
|
384d401af0 | ||
|
|
3fbf91a044 | ||
|
|
806f86e4e2 | ||
|
|
56c3a8b9a2 | ||
|
|
89b83400f5 | ||
|
|
bf20b01586 | ||
|
|
8f8f8c418e | ||
|
|
71190c27a9 | ||
|
|
77d41d03f5 | ||
|
|
3f480a358e | ||
|
|
1c340174b7 | ||
|
|
a08e64f37f | ||
|
|
3521b7ff89 | ||
|
|
6f8f8d7b1b | ||
|
|
b40fdd9089 | ||
|
|
b28ab2511c | ||
|
|
fa6aaad6df | ||
|
|
03c307a8c0 | ||
|
|
78fc9bd12b | ||
|
|
d38acb5487 | ||
|
|
3fd547f2e5 | ||
|
|
292b165abe | ||
|
|
e10290eb8e | ||
|
|
7a218286b3 | ||
|
|
3abbdd4a39 | ||
|
|
10c4c44d03 | ||
|
|
a61654009f | ||
|
|
bcb9d90abb | ||
|
|
5247d5924e | ||
|
|
6bba7d4e3a | ||
|
|
1388532bd4 | ||
|
|
4f7bfaf5d0 | ||
|
|
a8fe3a59b0 | ||
|
|
80888b9518 | ||
|
|
8426db7fe5 | ||
|
|
5ef5712e91 | ||
|
|
2e78051933 | ||
|
|
eb78396307 | ||
|
|
c00ec77737 | ||
|
|
ef19aa1de6 | ||
|
|
3bad02abdd | ||
|
|
f93445a022 | ||
|
|
8e06f4e519 | ||
|
|
b9ec1479e4 | ||
|
|
a6daf2f78e | ||
|
|
7ff0c3aaa9 | ||
|
|
cdcb8b6c06 | ||
|
|
9984691eaf | ||
|
|
d54150cd22 | ||
|
|
2fbed2f880 | ||
|
|
7406abe3b6 | ||
|
|
59ac0bd46b | ||
|
|
582ee9e643 | ||
|
|
cb52dd85e7 | ||
|
|
589b932f19 | ||
|
|
900a18f955 | ||
|
|
efeea40520 | ||
|
|
6bbd1943dd | ||
|
|
4aedef367c | ||
|
|
50d5e23694 | ||
|
|
300e75c0f3 | ||
|
|
7cf9b32742 | ||
|
|
0024ff848d | ||
|
|
275b20a184 | ||
|
|
8f9a8e1e7f | ||
|
|
3c6a4dedd6 | ||
|
|
890940292b | ||
|
|
78440be2b2 | ||
|
|
7bd98ecddb | ||
|
|
08d90afb8c | ||
|
|
426eb46166 | ||
|
|
fe0942043c | ||
|
|
fd75cce0f3 | ||
|
|
887f1a73f7 | ||
|
|
b0dacef32b | ||
|
|
605cad3411 | ||
|
|
a8c92e6dff | ||
|
|
fa5fcee584 | ||
|
|
fa4fb3b847 | ||
|
|
33644a4f91 | ||
|
|
b7560fe4bf | ||
|
|
8d150d427a | ||
|
|
8da12eb8a7 | ||
|
|
7b41eaf136 | ||
|
|
333e725380 | ||
|
|
bc2ea2f3d4 | ||
|
|
3b3d248637 | ||
|
|
5be892c635 | ||
|
|
7f516dbae2 | ||
|
|
d74eb99066 | ||
|
|
7a99949f0e | ||
|
|
d865fc26eb | ||
|
|
e8b26b1b8d | ||
|
|
4d5fe14968 | ||
|
|
2006995020 | ||
|
|
87c00a61da | ||
|
|
35fbac8d56 | ||
|
|
f099f90f50 | ||
|
|
f59c9133da | ||
|
|
1275241133 | ||
|
|
be014fcdd6 | ||
|
|
a30d292385 | ||
|
|
edb93914bb | ||
|
|
852ec61b34 | ||
|
|
307daacf67 | ||
|
|
ffe8452f02 | ||
|
|
08bbc251ff | ||
|
|
8260236331 | ||
|
|
e464c4acc5 | ||
|
|
df45932c03 | ||
|
|
fe05f310fb | ||
|
|
781c20a6ae | ||
|
|
206c1f4ca1 | ||
|
|
f139e98745 | ||
|
|
901f69e122 | ||
|
|
48dfa6edc3 | ||
|
|
44a271d9e9 | ||
|
|
35fab2bb7b | ||
|
|
9c1eaaeb49 | ||
|
|
de701ccfac | ||
|
|
0869b230fb | ||
|
|
86a649e017 | ||
|
|
77fcac027e | ||
|
|
75518e5bb9 | ||
|
|
fde88a2c51 | ||
|
|
5e76d53fcd | ||
|
|
05fbe5ab7a | ||
|
|
2a06263a5b | ||
|
|
97db4c0e9a | ||
|
|
45fdbc4df7 | ||
|
|
e077cce103 | ||
|
|
ef59bac511 | ||
|
|
98086d7259 | ||
|
|
774fb7e850 | ||
|
|
45401954fa | ||
|
|
b0567543c9 | ||
|
|
abd0686043 | ||
|
|
bb587c27a8 | ||
|
|
8f06d60084 | ||
|
|
33b03449d5 | ||
|
|
e600feda98 | ||
|
|
b8f1152408 | ||
|
|
6455e57e82 | ||
|
|
1960c6f4cb | ||
|
|
4c8703416e | ||
|
|
f748390172 | ||
|
|
95a1bd8470 | ||
|
|
440f1cf4c6 | ||
|
|
46aed151ab | ||
|
|
4c6db7a64e | ||
|
|
133842bf95 | ||
|
|
b4e5e36d4a | ||
|
|
d1f653f9bd | ||
|
|
c0d4503f25 | ||
|
|
d56276017c | ||
|
|
8ba6e45d83 | ||
|
|
4bade9bcea | ||
|
|
c6fabea49d | ||
|
|
0796eb4149 | ||
|
|
5313a1401f | ||
|
|
72df30050d | ||
|
|
97d8633557 | ||
|
|
c9e290b36f | ||
|
|
bf59828897 | ||
|
|
bb5ed66bb4 | ||
|
|
f8b4a6f168 | ||
|
|
1d2de44e19 | ||
|
|
436ef12730 | ||
|
|
b411d29577 | ||
|
|
c32ed8af51 | ||
|
|
31c4b1cda6 | ||
|
|
52f096f5d9 | ||
|
|
6a5cc0fa19 | ||
|
|
6c4de001b8 | ||
|
|
50b9faf347 | ||
|
|
4cde6c0865 | ||
|
|
87a185ea9c | ||
|
|
0dad1a89e6 | ||
|
|
1d52847924 | ||
|
|
a25f47124d | ||
|
|
ef339a4896 | ||
|
|
5e6aa5371a | ||
|
|
6b9bf8cbf7 | ||
|
|
07c53b1b70 | ||
|
|
5b6ec8996a | ||
|
|
0e6fe0a4f2 | ||
|
|
6309e699e5 | ||
|
|
16acc5f312 | ||
|
|
1eeb5a29ff | ||
|
|
b541117184 | ||
|
|
804d303487 | ||
|
|
50dabc8a49 | ||
|
|
abf15e863c | ||
|
|
fd12e4e826 | ||
|
|
914e9df6ba | ||
|
|
61f79270a8 | ||
|
|
d41b7bc813 | ||
|
|
e305757d07 | ||
|
|
d228b3916b | ||
|
|
83289d74a7 | ||
|
|
8c050eff07 | ||
|
|
40fd924b15 | ||
|
|
f087e819d7 | ||
|
|
d5b2eb3c23 | ||
|
|
ad9848d983 | ||
|
|
4ada412a05 | ||
|
|
01aa2b86f5 | ||
|
|
d4df916581 | ||
|
|
ed05dc8984 | ||
|
|
be327962d3 | ||
|
|
5b53b3d7e3 | ||
|
|
6e380b8897 | ||
|
|
5b835d294c | ||
|
|
1178bfa578 | ||
|
|
084f853a2a | ||
|
|
d9c7253836 | ||
|
|
1fe2933dd9 | ||
|
|
4981c5a870 | ||
|
|
86ea886ad7 | ||
|
|
12b8dc2613 | ||
|
|
d57b1ca962 | ||
|
|
ce771c7a5a | ||
|
|
2fc70900d3 | ||
|
|
ddb182c988 | ||
|
|
461a5b2c18 | ||
|
|
1e99968607 | ||
|
|
fcea7f6c9d | ||
|
|
683aa75b8d | ||
|
|
7b83a3332b | ||
|
|
24499aa6de | ||
|
|
dac304195e | ||
|
|
3eff266eb9 | ||
|
|
561b7a0ea5 | ||
|
|
97fbc3dd61 | ||
|
|
07ea1eff81 | ||
|
|
507f4ce87a | ||
|
|
88d15c6611 | ||
|
|
1cfe44d9c6 | ||
|
|
74bdc57fad | ||
|
|
fb4b93dfc0 | ||
|
|
91ffeeb73b | ||
|
|
c6cf8ace22 | ||
|
|
24fc4a4c04 | ||
|
|
39434155f8 | ||
|
|
d9af06f2ad | ||
|
|
8dfb14b1c4 | ||
|
|
30f306dc1a | ||
|
|
f657c4b514 | ||
|
|
3ef6436bef | ||
|
|
e3713de41d | ||
|
|
0de853a2ab | ||
|
|
6764c7dd5c | ||
|
|
bd8d51fc95 | ||
|
|
5a0bfa03b3 | ||
|
|
3dae1cc131 | ||
|
|
7fd81d3abb | ||
|
|
3e129cef8f | ||
|
|
7bbcc484fb | ||
|
|
b1b811b5ed | ||
|
|
48832200bb | ||
|
|
56a9196be8 | ||
|
|
b28e372106 | ||
|
|
9bb1b5d1bb | ||
|
|
5b990078f9 | ||
|
|
2ac074655f | ||
|
|
050ec5d9e3 | ||
|
|
a3bd19ce73 | ||
|
|
2b563bc69f | ||
|
|
50143ad9bf | ||
|
|
2fe0e80569 | ||
|
|
43f72246aa | ||
|
|
f98cc9c017 | ||
|
|
9d630dff30 | ||
|
|
d048bf66b0 | ||
|
|
956bf23390 | ||
|
|
9b9c1cc834 | ||
|
|
b62035e3d0 | ||
|
|
21e4f2422d | ||
|
|
f8169fee48 | ||
|
|
f58875a202 | ||
|
|
3b621c0ce6 | ||
|
|
602bc06bee | ||
|
|
71ca553190 | ||
|
|
07de351546 | ||
|
|
3440d7edd8 | ||
|
|
7785583b34 | ||
|
|
ec025f2020 | ||
|
|
bf9f3057da | ||
|
|
c9eed0b89b | ||
|
|
a333ac1888 | ||
|
|
e09447d011 | ||
|
|
715d4f6601 | ||
|
|
fa02130359 | ||
|
|
a9724fd38d | ||
|
|
837bffd03a | ||
|
|
831be43740 | ||
|
|
718819eb7a | ||
|
|
9fb218d379 | ||
|
|
784d27f41b | ||
|
|
cedf185b41 | ||
|
|
4541f29019 | ||
|
|
479d5d676e | ||
|
|
f627710870 | ||
|
|
98a0beab03 | ||
|
|
eed7c91e87 | ||
|
|
95e67c9502 | ||
|
|
f6db36d7f0 | ||
|
|
7369cb7b86 | ||
|
|
473d9fef55 | ||
|
|
1a751208ca | ||
|
|
3a691dcc6d | ||
|
|
cb747316ed | ||
|
|
7fdce50718 | ||
|
|
fd8bb2c95c | ||
|
|
ed42b864c1 | ||
|
|
bee8972632 | ||
|
|
db59c621e8 | ||
|
|
883a105aca | ||
|
|
7ce7151ad2 | ||
|
|
8de027c4b4 | ||
|
|
9185de3fb7 | ||
|
|
f0334b2e12 | ||
|
|
f489c89987 | ||
|
|
6892a3e0a8 | ||
|
|
eb57f192d4 | ||
|
|
75c2ef7947 | ||
|
|
ed3e0c43bc | ||
|
|
c71d36356b | ||
|
|
b288bf2e7c | ||
|
|
9c5de77f12 | ||
|
|
a6347118cd | ||
|
|
1d0f3abadf | ||
|
|
b1d15afe61 | ||
|
|
fc86269bc9 | ||
|
|
f452518a63 | ||
|
|
9c6ac7cb71 | ||
|
|
f2c9592b86 | ||
|
|
1f3428f282 | ||
|
|
ec4be80bcc | ||
|
|
cd6d175180 | ||
|
|
fb4f7b6827 | ||
|
|
d8bcd13e86 | ||
|
|
d54843275f | ||
|
|
aa34d3a4c4 | ||
|
|
25ee30d8cb | ||
|
|
89a05a474f | ||
|
|
3b4e0147cd | ||
|
|
7070b1cda9 | ||
|
|
26fab9b274 | ||
|
|
41a089e513 | ||
|
|
456750ac19 | ||
|
|
aa0643f785 | ||
|
|
60fbceea43 | ||
|
|
bb76e5da91 | ||
|
|
8ba46965b6 | ||
|
|
b495e78f0e | ||
|
|
a3046b68da | ||
|
|
7f345e310b | ||
|
|
cc9537dd8a | ||
|
|
437bba5566 | ||
|
|
2a7bc63919 | ||
|
|
0e240458d3 | ||
|
|
5d976d841b | ||
|
|
4d3362358f | ||
|
|
32c8eb6490 | ||
|
|
e012966291 | ||
|
|
7aff0cb84f | ||
|
|
d98bb44490 | ||
|
|
9a8bd3f7fa | ||
|
|
f101e9b9e2 | ||
|
|
3d2fafa580 | ||
|
|
309a905409 | ||
|
|
e5a111396c | ||
|
|
0433e24b7f | ||
|
|
efe21fed66 | ||
|
|
9c536f2233 | ||
|
|
1cb45e9916 | ||
|
|
ae2d001261 | ||
|
|
67ba56c65c | ||
|
|
5c9cbae10d | ||
|
|
2e29e09b1b | ||
|
|
80676cf44f | ||
|
|
e13bbd8c40 | ||
|
|
c808430643 | ||
|
|
4867803f6b | ||
|
|
a5bd98610f | ||
|
|
89af7e7a5b | ||
|
|
2efc37947d | ||
|
|
e78b97652b | ||
|
|
b69ebd73b2 | ||
|
|
99de98ffc7 | ||
|
|
076bc2b773 | ||
|
|
c0df54b7d3 | ||
|
|
ce73ced932 | ||
|
|
2738a0c776 | ||
|
|
0609756d36 | ||
|
|
c2ce06eba7 | ||
|
|
8d8907b61e | ||
|
|
043ea80fa9 | ||
|
|
cf8776ac71 | ||
|
|
3f328a0242 | ||
|
|
4cbba8c45d | ||
|
|
3a938972df | ||
|
|
7b689d8c52 | ||
|
|
ab3f6d9202 | ||
|
|
53a9329ab6 | ||
|
|
1ad417734e | ||
|
|
c50c6812ce | ||
|
|
a02395fe2d | ||
|
|
85e411bd7c | ||
|
|
3e80e22f5d | ||
|
|
e5f6a0949f | ||
|
|
efbf114a2f | ||
|
|
421f5b6fdf | ||
|
|
fc43294efc | ||
|
|
9d80d261b9 | ||
|
|
f7042e9038 | ||
|
|
0f1371e1c9 | ||
|
|
bf97afb9ed | ||
|
|
f962d92623 | ||
|
|
eb8d64999f | ||
|
|
cc75fe4fe5 | ||
|
|
7b1b647832 | ||
|
|
7ad1441c81 | ||
|
|
b2d1f55702 | ||
|
|
c12985d1d7 | ||
|
|
ba088056ed | ||
|
|
a5c0d89c71 | ||
|
|
e57804e6c2 | ||
|
|
c93f515a54 | ||
|
|
5f61fbcbe3 | ||
|
|
5072320803 | ||
|
|
c21e976cad | ||
|
|
7e139b5384 | ||
|
|
b4561fa814 | ||
|
|
0f1f724a91 | ||
|
|
ec003ff897 | ||
|
|
4b36098e07 | ||
|
|
8077a7534e | ||
|
|
e6a679b019 | ||
|
|
f89f83deb6 | ||
|
|
9c668072b9 | ||
|
|
5a7f683f61 | ||
|
|
6b571155f4 | ||
|
|
078f498b17 | ||
|
|
4fac09bcb4 | ||
|
|
2f27758a4b | ||
|
|
5f32663714 | ||
|
|
15d4b5fcdb | ||
|
|
a331abf675 | ||
|
|
c993489fe9 | ||
|
|
ed50fef1c0 | ||
|
|
1fb2c3f5b4 | ||
|
|
525639b42f | ||
|
|
f37b9d99fe | ||
|
|
b7a036945d | ||
|
|
010f3efcf0 | ||
|
|
216c7a16d8 | ||
|
|
0fbb056ac7 | ||
|
|
dd96421a9f | ||
|
|
0f08a92302 | ||
|
|
b290efa394 | ||
|
|
79077b0025 | ||
|
|
97fbbac973 | ||
|
|
74616d2900 | ||
|
|
b2f05e56b8 | ||
|
|
e457bedaa7 | ||
|
|
408553e967 | ||
|
|
be01a32f0b | ||
|
|
b5cb1b1fe2 | ||
|
|
6c56528cd7 | ||
|
|
a456c21249 | ||
|
|
6e5b58413a | ||
|
|
013fd5abfe | ||
|
|
3e70e5f2f1 | ||
|
|
28309da1f1 | ||
|
|
3dc3b11435 | ||
|
|
f798a0937a | ||
|
|
969765435e | ||
|
|
5824d28a03 | ||
|
|
cc847f83a8 | ||
|
|
9ef8499183 | ||
|
|
66639924a4 | ||
|
|
bd0548548a | ||
|
|
c3d7c57096 | ||
|
|
ca0bae0fcd | ||
|
|
f41cf7465b | ||
|
|
fe6707b26d | ||
|
|
c514f0b672 | ||
|
|
d81d804cb6 | ||
|
|
04184f1715 | ||
|
|
c4f6125a31 | ||
|
|
96af21ff68 | ||
|
|
5fb90e12b1 | ||
|
|
4262ff76c3 | ||
|
|
e37fed437d | ||
|
|
91378583cc | ||
|
|
af289da844 | ||
|
|
256a93e6e6 | ||
|
|
5fc057d8ac | ||
|
|
54c38e3e3a | ||
|
|
126ef0f5c2 | ||
|
|
a011b8951a | ||
|
|
3fecf154aa | ||
|
|
6ca47aeb4b | ||
|
|
330745da30 | ||
|
|
91e47caf38 | ||
|
|
f965a7d0e6 | ||
|
|
f5e44fbef2 | ||
|
|
e2eb0f17d7 | ||
|
|
f73b38a0d8 | ||
|
|
cff6f4abd6 | ||
|
|
456c0250b0 | ||
|
|
d39dd53998 | ||
|
|
5ae04dca84 | ||
|
|
93920a4bb0 | ||
|
|
c2e453fbb9 | ||
|
|
e03050014d | ||
|
|
db9323e7bd | ||
|
|
d456cc479c | ||
|
|
3b328a2847 | ||
|
|
5581b2bd3c | ||
|
|
900ada1112 | ||
|
|
cf094c6265 | ||
|
|
0f160707a4 | ||
|
|
c947e6ebe6 | ||
|
|
66adf7a6b9 | ||
|
|
ac0b235d3a | ||
|
|
37504c487a | ||
|
|
98fc9ab65b | ||
|
|
c546e88577 | ||
|
|
d10c1c36a9 | ||
|
|
a0e97e0e6e | ||
|
|
8a8f50a6a0 | ||
|
|
8d19ba9195 | ||
|
|
8e2537a366 | ||
|
|
2d5c7c8e93 | ||
|
|
3e05939b65 | ||
|
|
cfeafb9ab4 | ||
|
|
28fc9d332c | ||
|
|
a121dfd23a | ||
|
|
843bb6dac1 | ||
|
|
50ed4004f4 | ||
|
|
395bb61cf3 | ||
|
|
8bfa7f0d82 | ||
|
|
217bbdfd66 | ||
|
|
9dc79bae5f | ||
|
|
cc338df77f | ||
|
|
6752fed9f2 | ||
|
|
e8c9f609a4 | ||
|
|
424bd1c465 | ||
|
|
19f9c18305 | ||
|
|
c2ffd027d0 | ||
|
|
920ab79665 | ||
|
|
973b5c226a | ||
|
|
e667e72685 | ||
|
|
b173cea177 | ||
|
|
9bcb7d115f | ||
|
|
0e68ca120e | ||
|
|
4b4c47461b | ||
|
|
b43ac2783d | ||
|
|
35dd7855a0 | ||
|
|
26b9987880 | ||
|
|
0df6eaa927 | ||
|
|
07921194f2 | ||
|
|
597811093c | ||
|
|
b750f1d1bb | ||
|
|
99398ba652 | ||
|
|
bb5034f3fe | ||
|
|
d2cf6894fe | ||
|
|
92d6eec09a | ||
|
|
853bb4c41e | ||
|
|
dfaba54376 | ||
|
|
bcdb897f07 | ||
|
|
a182b5c531 | ||
|
|
e0c85f87ae | ||
|
|
aada19f574 | ||
|
|
4470252913 | ||
|
|
de7fed45dc | ||
|
|
dff17ee0d7 | ||
|
|
01004bc5d8 | ||
|
|
a1314bd199 | ||
|
|
1cea85df0c | ||
|
|
7309be55a0 | ||
|
|
7513dab185 | ||
|
|
0ad9eb5e16 | ||
|
|
cd0b81fc5f | ||
|
|
a2ff24c912 | ||
|
|
75db3e4416 | ||
|
|
9e14850bbf | ||
|
|
b9955aee84 | ||
|
|
7342dfdc6e | ||
|
|
22e558aecb | ||
|
|
0d45d21069 | ||
|
|
083964522b | ||
|
|
630913d872 | ||
|
|
de55a26cfe | ||
|
|
1143320b8b | ||
|
|
568d859fc0 | ||
|
|
f1274e34c2 | ||
|
|
f724a4d820 | ||
|
|
8ff86dbee6 | ||
|
|
324a48bc64 | ||
|
|
bc184a9f02 | ||
|
|
333dac4977 | ||
|
|
57b1b12ab6 | ||
|
|
7e1870be3e | ||
|
|
ddd5a9443d | ||
|
|
2f0bb11a96 | ||
|
|
7036ca55e6 | ||
|
|
877b474fe1 | ||
|
|
baf25fe649 | ||
|
|
c9d30f78b7 | ||
|
|
ee72474971 | ||
|
|
f7a93a69f6 | ||
|
|
876b73f92c | ||
|
|
e3687dc257 | ||
|
|
754a6cc93e | ||
|
|
a58be3af0c | ||
|
|
f6480be3aa | ||
|
|
a569959fb8 | ||
|
|
83b6292105 | ||
|
|
5f08253f36 | ||
|
|
23b11c84b1 | ||
|
|
2bed0d1bb5 | ||
|
|
c731615dbb | ||
|
|
8df265a581 | ||
|
|
ee6f2f84bb | ||
|
|
514b94ac69 | ||
|
|
d9854f2abd | ||
|
|
783dee1f48 | ||
|
|
5e541e1f11 | ||
|
|
fbf80dc315 | ||
|
|
63032c4bb7 | ||
|
|
24bcc7a93b | ||
|
|
750f37fde7 | ||
|
|
88c1ff91ac | ||
|
|
5827ff0a01 | ||
|
|
d2ab9d3e77 | ||
|
|
09d9dd2607 | ||
|
|
e26907f079 | ||
|
|
150994a933 | ||
|
|
260f708bb2 | ||
|
|
c14c81ace6 | ||
|
|
f5a8d883d2 | ||
|
|
58fb055763 | ||
|
|
968e310793 | ||
|
|
9846fecd84 | ||
|
|
f699dcac94 | ||
|
|
180b9b971a | ||
|
|
3c7b0d6d05 | ||
|
|
124f754443 | ||
|
|
1a8b7d0447 | ||
|
|
81ce524705 | ||
|
|
06df6d25a2 | ||
|
|
8a711a8376 | ||
|
|
a277f7d6ab | ||
|
|
aab31f4b35 | ||
|
|
522de0871a | ||
|
|
5142747ceb | ||
|
|
5c8617ec68 | ||
|
|
ea2a79ec20 | ||
|
|
be2480c320 | ||
|
|
ed9075b937 | ||
|
|
db22bc579a | ||
|
|
89cbe76193 | ||
|
|
6b6031a3d9 | ||
|
|
3de3b38dc1 | ||
|
|
fb785b8adf | ||
|
|
91269961d0 | ||
|
|
7f6b98669e | ||
|
|
24dbfbcccf | ||
|
|
49f3ce0571 | ||
|
|
7a92a47eb3 | ||
|
|
efb45579aa | ||
|
|
7008b1a92c | ||
|
|
04d5dd8997 | ||
|
|
a8e45251c4 | ||
|
|
9c1e50b1aa | ||
|
|
6659f1751e | ||
|
|
8ad8d03bc8 | ||
|
|
272eaaa704 | ||
|
|
38a54b08e3 | ||
|
|
9921897aa6 | ||
|
|
6de44db4eb | ||
|
|
ee6a8a41f5 | ||
|
|
4d55a4c097 | ||
|
|
bcaf72eccb | ||
|
|
484320ed08 | ||
|
|
b32a94627c | ||
|
|
4161cfcdb8 | ||
|
|
b7e2af8151 | ||
|
|
b0ece3a9d8 | ||
|
|
136aa763a3 | ||
|
|
cd8a5d1f2e | ||
|
|
237ce6ff84 | ||
|
|
59a65d757b | ||
|
|
c203a744fe | ||
|
|
f27f832ede | ||
|
|
37453945d0 | ||
|
|
8458ea40f0 | ||
|
|
7daf8f8fd0 | ||
|
|
5872961124 | ||
|
|
e71948461e | ||
|
|
ed763df42e | ||
|
|
d501ea0afb | ||
|
|
bac6fc6ee2 | ||
|
|
ea26b5f30c | ||
|
|
823b8ad244 | ||
|
|
2a99422386 | ||
|
|
0c67b3cff4 | ||
|
|
c633dd09c6 | ||
|
|
063ca3b644 | ||
|
|
147ecc5e17 | ||
|
|
448ed41562 | ||
|
|
3f67ba08b1 | ||
|
|
69f256b900 | ||
|
|
af3159791f | ||
|
|
90996269fd | ||
|
|
ea10f44fe6 | ||
|
|
895a1711cb | ||
|
|
8ac0739858 | ||
|
|
22ffe336cb | ||
|
|
156e36c082 | ||
|
|
07a2233220 | ||
|
|
baaa55f196 | ||
|
|
8373ece209 | ||
|
|
78c885d657 | ||
|
|
c6107276df | ||
|
|
8fafaf38a3 | ||
|
|
cca5c5537f | ||
|
|
8497d637d9 | ||
|
|
5b08f307c8 | ||
|
|
16528b12fa | ||
|
|
f57a651e3b | ||
|
|
a8f07157dd | ||
|
|
b65fad9ca8 | ||
|
|
a118c72423 | ||
|
|
b333d02e3b | ||
|
|
d05bdad638 | ||
|
|
f921ea2fb7 | ||
|
|
38de6c98fc | ||
|
|
a707ffc04a | ||
|
|
7eee5cf116 | ||
|
|
1066ec5cd9 | ||
|
|
615a4b3452 | ||
|
|
2700fd712b | ||
|
|
1ab830da4b | ||
|
|
82b0024758 | ||
|
|
d7a8b1b4f2 | ||
|
|
becd87141c | ||
|
|
7a499b3cd3 | ||
|
|
9978fb3e2c | ||
|
|
00dcaf0e04 | ||
|
|
cbffbf3438 | ||
|
|
c1e095e587 | ||
|
|
4e88c2286e | ||
|
|
ee05b51f47 | ||
|
|
a15dcbfb2d | ||
|
|
27ce38937c | ||
|
|
85f67a3f73 | ||
|
|
d5faf36aa9 | ||
|
|
5a5f4ce99a | ||
|
|
a678be7195 | ||
|
|
99cbc58db8 | ||
|
|
632a538eb3 | ||
|
|
a485533dc9 | ||
|
|
6c85e285e7 | ||
|
|
ee0a0afb25 | ||
|
|
efff66ada7 | ||
|
|
d4b0de2dce | ||
|
|
f9d5c0110f | ||
|
|
f67fca826e | ||
|
|
48f912c2e9 | ||
|
|
71b5b0d955 | ||
|
|
236b7b15bb | ||
|
|
8e013d2174 | ||
|
|
eb80accfee | ||
|
|
6855c746bb | ||
|
|
ee9cfe22ec | ||
|
|
10e15e5de7 | ||
|
|
ccf4f61521 | ||
|
|
6a198df3af | ||
|
|
7f5a15372f | ||
|
|
c4b9ef388f | ||
|
|
8c43644301 | ||
|
|
f5fdbfd004 | ||
|
|
b8f6284daf | ||
|
|
87205367d1 | ||
|
|
3204f036da | ||
|
|
d619944cf5 | ||
|
|
4f0d505c65 | ||
|
|
3bde876097 | ||
|
|
09b7a7c872 | ||
|
|
b1357d9641 | ||
|
|
b580a497fe | ||
|
|
1c915c3bd1 | ||
|
|
aba0bb5e01 | ||
|
|
237d83b2ee | ||
|
|
cfbd8ab7e7 | ||
|
|
06fc8a830b | ||
|
|
a5db9c3519 | ||
|
|
bb6098e2d3 | ||
|
|
c51f464446 | ||
|
|
59d6a675dd | ||
|
|
c72e505fe4 | ||
|
|
394d64bfd0 | ||
|
|
ca9fa6407f | ||
|
|
46ec400cb3 | ||
|
|
70f085be18 | ||
|
|
b1ea908b3b | ||
|
|
9d61f4fad1 | ||
|
|
857cbfb0d2 | ||
|
|
c26016b132 | ||
|
|
30f905999a | ||
|
|
7a72167eb7 | ||
|
|
39429f7ac9 | ||
|
|
c4e83faa57 | ||
|
|
bc3d1eaf6e | ||
|
|
0f8b2399ee | ||
|
|
28ee0f4ebe | ||
|
|
05ed6c57b6 | ||
|
|
f6c2b3a54b | ||
|
|
7e930c2a75 | ||
|
|
d4ffed89c0 | ||
|
|
200f25a38f | ||
|
|
b17e49ad25 | ||
|
|
f859c7f93e | ||
|
|
b17ade1257 | ||
|
|
794ee6fc9d | ||
|
|
3c0b73c2d6 | ||
|
|
96da5b33c0 | ||
|
|
aae14f4eb4 | ||
|
|
ef8c1203b4 | ||
|
|
5918946feb | ||
|
|
a3a7e0531a | ||
|
|
87ad5a96b9 | ||
|
|
2bbb8526a3 | ||
|
|
7d2eb4f604 | ||
|
|
9d2a60bb11 | ||
|
|
adb1d3f8c9 | ||
|
|
26fa833984 | ||
|
|
2eb4f663d6 | ||
|
|
dd29bfe4d2 | ||
|
|
d510cd1e0d | ||
|
|
5fef8390a1 | ||
|
|
cd41967aa1 | ||
|
|
b250ded3fa | ||
|
|
30c8a5a010 | ||
|
|
6f577321f1 | ||
|
|
e459e6d24a | ||
|
|
72f80461de | ||
|
|
1a1aa267b7 | ||
|
|
3c3ca1e61f | ||
|
|
15c288b444 | ||
|
|
b325320f29 | ||
|
|
7acf8efde3 | ||
|
|
9be87d03f5 | ||
|
|
e0c6766a79 | ||
|
|
1d90c1cbbf | ||
|
|
4c95e59d5c | ||
|
|
9e6773cba8 | ||
|
|
d075be73e8 | ||
|
|
15a2927f09 | ||
|
|
e9931e6f84 | ||
|
|
728aeb8092 | ||
|
|
b309e7d0e5 | ||
|
|
6d0a599d0c | ||
|
|
6dac2edeef | ||
|
|
527377dc86 | ||
|
|
d90a291c5e | ||
|
|
6b706a0c99 | ||
|
|
8bb8b7d76e | ||
|
|
8677a5981c | ||
|
|
88b402fcf8 | ||
|
|
e56bf42270 | ||
|
|
c85ccad0a6 | ||
|
|
e4de1e1e89 | ||
|
|
7705281459 | ||
|
|
ab8d883fee | ||
|
|
5d5373764e | ||
|
|
f413b2fa49 | ||
|
|
f267a88ddf | ||
|
|
34d926350b | ||
|
|
e35f8e9e23 | ||
|
|
296e736f5b | ||
|
|
72bbec89a9 | ||
|
|
20d900a21d | ||
|
|
6f7c103e50 | ||
|
|
e7e2c68d09 | ||
|
|
c099cd8bf6 | ||
|
|
0074976636 | ||
|
|
8be07194c7 | ||
|
|
d51019dd77 | ||
|
|
fcd97f513a | ||
|
|
05329d6731 | ||
|
|
aab1045045 | ||
|
|
d2cb5ad725 | ||
|
|
92e3e48bce | ||
|
|
e30bd04579 | ||
|
|
ec3d67c19f | ||
|
|
d91945cc99 | ||
|
|
31b74f02b6 | ||
|
|
092c09d81f | ||
|
|
391da0ba07 | ||
|
|
e4179c0008 | ||
|
|
478c48cd6f | ||
|
|
69634c60b3 | ||
|
|
42399d24d9 | ||
|
|
082acfad49 | ||
|
|
bc11419ff9 | ||
|
|
042bce4b6c | ||
|
|
83bfd0805e | ||
|
|
9b271d1728 | ||
|
|
f91bded9b3 | ||
|
|
b62a90a212 | ||
|
|
83faa8b59b | ||
|
|
200d3e6446 | ||
|
|
aaf3ced750 | ||
|
|
19520ccf4e | ||
|
|
39c4842bf9 | ||
|
|
c314ab7b60 | ||
|
|
31c1483b9d | ||
|
|
480af3f381 | ||
|
|
290feaac51 | ||
|
|
b991ca4ebc | ||
|
|
4e9bfa95ec | ||
|
|
4de8d3ae8c | ||
|
|
67756c53dc | ||
|
|
392eb1fb55 | ||
|
|
ed01ab763c | ||
|
|
ecb0af36b3 | ||
|
|
2e1dbd9f5a | ||
|
|
2ea2fed8a5 | ||
|
|
59beec8fae | ||
|
|
a2838ae6f3 | ||
|
|
6849a4e770 | ||
|
|
6079025985 | ||
|
|
44e8770b73 | ||
|
|
28c83f3f43 | ||
|
|
53f8ae6517 | ||
|
|
1dd6491a2f | ||
|
|
457035c7ec | ||
|
|
503a624cc9 | ||
|
|
bc977f8d4a | ||
|
|
c4faa284ed | ||
|
|
d7f74ecf52 | ||
|
|
41808f80fd | ||
|
|
80861f2219 | ||
|
|
1007dd8f23 | ||
|
|
195f3f465b | ||
|
|
277c55fe5b | ||
|
|
e272a10bda | ||
|
|
9eeb3dfe7e | ||
|
|
6d8ad58515 | ||
|
|
d4991164cf | ||
|
|
87e28e6b49 | ||
|
|
14a29823c0 | ||
|
|
dc90f4f4a6 | ||
|
|
c2c6260ba2 | ||
|
|
5a6f4aa61d | ||
|
|
20257d2a5c | ||
|
|
ce6ee1505f | ||
|
|
869e16c340 | ||
|
|
8dd905a14d | ||
|
|
f00ab076d1 | ||
|
|
8d76f7d195 | ||
|
|
9d46fb9f90 | ||
|
|
ab7a79cb90 | ||
|
|
0ad5d53423 | ||
|
|
67e7ad13de | ||
|
|
d9cf98f772 | ||
|
|
0ec5680156 | ||
|
|
17212f816c | ||
|
|
2838d12227 | ||
|
|
d25a0e30dc | ||
|
|
9610821884 | ||
|
|
f7b80c3c62 | ||
|
|
2d7c80bbc3 | ||
|
|
a21e3d77e9 | ||
|
|
747f6829ab | ||
|
|
26cfaa150e | ||
|
|
d51c159160 | ||
|
|
c1c2b648ab | ||
|
|
d5f90ef64b | ||
|
|
bf5ed5e451 | ||
|
|
c9f619dc72 | ||
|
|
3f6ccd3120 | ||
|
|
211d35d647 | ||
|
|
7dc040b01c | ||
|
|
e274c5c485 | ||
|
|
9845fd1cf5 | ||
|
|
f76651604d | ||
|
|
984fd8c05e | ||
|
|
94537c5901 | ||
|
|
179fb13a17 | ||
|
|
11ded170ee | ||
|
|
9332a83ce6 | ||
|
|
3f5e4c55b2 | ||
|
|
7583c350b8 | ||
|
|
1eeee40278 | ||
|
|
4bb5d7de8b | ||
|
|
9d8116f895 | ||
|
|
a02e1e0af2 | ||
|
|
a2d2586331 | ||
|
|
c2f22a4bf3 | ||
|
|
e01c76c895 | ||
|
|
9e9bdc32ea | ||
|
|
ea9961a8fb | ||
|
|
e9827f5a34 | ||
|
|
8f9979eb8d | ||
|
|
18c440c990 | ||
|
|
d66bc24e7f | ||
|
|
f782388148 | ||
|
|
99217da6ca | ||
|
|
35bef514b0 | ||
|
|
36e636743b | ||
|
|
0510bc7744 | ||
|
|
c8dcbcb649 | ||
|
|
9034b1fd08 | ||
|
|
27719ded9b | ||
|
|
18a3961992 | ||
|
|
b23854b2ab | ||
|
|
f241945d70 | ||
|
|
bb60b3081f | ||
|
|
2ce6b190dd | ||
|
|
67a13fc916 | ||
|
|
65744207fc | ||
|
|
d9e92a08cb | ||
|
|
6c3613407d | ||
|
|
91e181b14a | ||
|
|
1618596218 | ||
|
|
06b5f43e48 | ||
|
|
efaca5974c | ||
|
|
1db07f52d1 | ||
|
|
2b433cdf64 | ||
|
|
a61c9c617d | ||
|
|
9d4c943d64 | ||
|
|
c595c9eee1 | ||
|
|
f1a0c2f1af | ||
|
|
ac5c4e3203 | ||
|
|
80daaff874 | ||
|
|
9b60a50d07 | ||
|
|
21b54723e4 | ||
|
|
85e4e4cb40 | ||
|
|
83f0c228e9 | ||
|
|
432ee93916 | ||
|
|
c7f07cd0b6 | ||
|
|
4d6958381d | ||
|
|
75eebb516f | ||
|
|
b6a62cf20e | ||
|
|
da8c7eb0fc | ||
|
|
1e21e76788 | ||
|
|
21b6dace8f | ||
|
|
f1f8a2e4dd | ||
|
|
b1bf2e0371 | ||
|
|
64bfae0a0e | ||
|
|
54605823f9 | ||
|
|
01f45f063e | ||
|
|
40fd918b58 | ||
|
|
6489b48c9c | ||
|
|
e5f5117a7e | ||
|
|
60a4f668b7 | ||
|
|
2af3c0ede4 | ||
|
|
1ac7a95f9b | ||
|
|
50b704c5dd | ||
|
|
34e9eb32bb | ||
|
|
d918903252 | ||
|
|
2d5c70832c | ||
|
|
d87cb3f672 | ||
|
|
7808f4c272 | ||
|
|
7f709c3285 | ||
|
|
da21b50750 | ||
|
|
71653273f6 | ||
|
|
4fc52948b3 | ||
|
|
377d8dc42c | ||
|
|
9f4661391d | ||
|
|
932392a7fd | ||
|
|
0ef1ba9ad2 | ||
|
|
4ca283380a | ||
|
|
554d1dd7c6 | ||
|
|
f0efb42a30 | ||
|
|
8bd17c8016 | ||
|
|
05374e162e | ||
|
|
696926a557 | ||
|
|
bf9eefa694 | ||
|
|
2fbfbf45c7 | ||
|
|
5f76bd04f9 | ||
|
|
aa625bc22c | ||
|
|
c90b53b89d | ||
|
|
de832375b7 | ||
|
|
23dd6e2294 | ||
|
|
80d936adc1 | ||
|
|
6c5879add9 | ||
|
|
ed55778d2a | ||
|
|
5c598a3085 | ||
|
|
a14a5fbf95 | ||
|
|
5c29e7b257 | ||
|
|
0f1b0f7ed4 | ||
|
|
5c00851b44 | ||
|
|
007baa2305 | ||
|
|
5a2534122e | ||
|
|
9ac0c54eb0 | ||
|
|
78c96fe989 | ||
|
|
08d3401092 | ||
|
|
8986633624 | ||
|
|
cce0b2425e | ||
|
|
c617cf8e05 | ||
|
|
7a79c94a9e | ||
|
|
31899eac2a | ||
|
|
bf6b206fca | ||
|
|
11aa5343b2 | ||
|
|
e9d3134814 | ||
|
|
869c8e331e | ||
|
|
edc44993d1 | ||
|
|
15a63b5bcb | ||
|
|
222fc4b04f | ||
|
|
71b50ae7fd | ||
|
|
7d797090ff | ||
|
|
6fd175d9be | ||
|
|
219239eadc | ||
|
|
df2d3a268d | ||
|
|
f55646746c | ||
|
|
2897bac549 | ||
|
|
dd61a22367 | ||
|
|
7b18e5d198 | ||
|
|
6d6b2fdda8 | ||
|
|
20f6cdc53a | ||
|
|
0a93d3b714 | ||
|
|
f3f50349b2 | ||
|
|
c8c43a2475 | ||
|
|
9cff1e454c | ||
|
|
82da001faf | ||
|
|
543e8dc78a | ||
|
|
da9b6394e8 | ||
|
|
c3d0814517 | ||
|
|
7b345e207d | ||
|
|
5c6032d272 | ||
|
|
a6e1a74f1d | ||
|
|
325691b3ef | ||
|
|
59b3fc75d0 | ||
|
|
0502a54a36 | ||
|
|
43ba6766ba | ||
|
|
136c469ef7 | ||
|
|
dd5751df0c | ||
|
|
f4834bd85d | ||
|
|
ae3d84df6b | ||
|
|
5deb29a7c9 | ||
|
|
d92291dd76 | ||
|
|
64a9f43405 | ||
|
|
84438c0139 | ||
|
|
9b3ac7efa4 | ||
|
|
d1664dc511 | ||
|
|
53b06048d2 | ||
|
|
2f27eb42ed | ||
|
|
ab368bdc53 | ||
|
|
0d52cc97e4 | ||
|
|
bc64263dd8 | ||
|
|
bfaf2a4a62 | ||
|
|
990e44cd14 | ||
|
|
3a8b437b8d | ||
|
|
cf1fd6e950 | ||
|
|
6e9822929f | ||
|
|
b1602c72ad | ||
|
|
09d1eb7c55 | ||
|
|
8c1b03c731 | ||
|
|
09e390eac5 | ||
|
|
a9127bedf7 | ||
|
|
36660ce749 | ||
|
|
ad7bc37672 | ||
|
|
b2be36d92e | ||
|
|
24d34a4f2c | ||
|
|
3d57d3bb7b | ||
|
|
2cd24ea722 | ||
|
|
436603aa44 | ||
|
|
ddc04979a4 | ||
|
|
ccf6134beb | ||
|
|
62481e88f3 | ||
|
|
cc606623bb | ||
|
|
e1132156f5 | ||
|
|
84a6c019e8 | ||
|
|
756c6d2858 | ||
|
|
1e98a227cc | ||
|
|
57f72f6cd8 | ||
|
|
d6448ee5d6 | ||
|
|
25fabac059 | ||
|
|
d5f6e37c65 | ||
|
|
663a8c9c79 | ||
|
|
de3ad2b04f | ||
|
|
4f8848f658 | ||
|
|
502ee8a56c | ||
|
|
9f31390ff1 | ||
|
|
4838dda59a | ||
|
|
26374971ab | ||
|
|
2741c0b211 | ||
|
|
2c8848f1bc | ||
|
|
dc55ce4764 | ||
|
|
6b3f54692a | ||
|
|
0b235cc893 | ||
|
|
25e7ceeef0 | ||
|
|
e87e5e33a7 | ||
|
|
fcc10d6358 | ||
|
|
74713ffb62 | ||
|
|
cb3ac33e18 | ||
|
|
4a82770f16 | ||
|
|
4c55d3677d | ||
|
|
8ea0c08a38 | ||
|
|
6733b12ec3 | ||
|
|
9b5e9984bf | ||
|
|
e72dfc3212 | ||
|
|
4c7df98ac9 | ||
|
|
e159347c10 | ||
|
|
2678f9289e | ||
|
|
f317b65808 | ||
|
|
607656d616 | ||
|
|
b6c0b22742 | ||
|
|
938f27e391 | ||
|
|
ba699d8b4f | ||
|
|
f7f5f43c48 | ||
|
|
0a33c9ebf5 | ||
|
|
e3db628d0c | ||
|
|
06f581e146 | ||
|
|
5537b09492 | ||
|
|
66a6fa163e | ||
|
|
8412c6f03f | ||
|
|
7bf49aba54 | ||
|
|
7882312697 | ||
|
|
760448afa4 | ||
|
|
8a7f2a2696 | ||
|
|
29564ed63d | ||
|
|
c1cc203c17 | ||
|
|
0d93eeb3fe | ||
|
|
56421beb8a | ||
|
|
2a98cacecd | ||
|
|
38e5f0d1cf | ||
|
|
526f12feff | ||
|
|
ae266f56e2 | ||
|
|
3d31b21df9 | ||
|
|
c668d0569c | ||
|
|
0b0e90dc53 | ||
|
|
93b6089522 | ||
|
|
e70ef5334a | ||
|
|
e3275f6083 | ||
|
|
3c0fca9258 | ||
|
|
3425934c39 | ||
|
|
9861b24bc3 | ||
|
|
2ab7b40f2f | ||
|
|
fb0817277f | ||
|
|
d823d82207 | ||
|
|
6d30697d9b | ||
|
|
a0c8ad7398 | ||
|
|
706c6066d5 | ||
|
|
b7509577b5 | ||
|
|
8c5923297e | ||
|
|
69f3c42b99 | ||
|
|
48ea1153a5 | ||
|
|
1e28c1d4fd | ||
|
|
b815878d60 | ||
|
|
025efcb731 | ||
|
|
126289c19b | ||
|
|
4c3df963fa | ||
|
|
8053175ead | ||
|
|
c24a1b3786 | ||
|
|
868d6c808b | ||
|
|
15415b2aae | ||
|
|
5a6f9024d3 | ||
|
|
2061394ad7 | ||
|
|
778a1cc34a | ||
|
|
7bc5cfc53a | ||
|
|
3344111a03 | ||
|
|
aeda48d94e | ||
|
|
ddd83c2108 | ||
|
|
67f397f888 | ||
|
|
43895269ff | ||
|
|
520ec0f53a | ||
|
|
7c47f345be | ||
|
|
343ded18fd | ||
|
|
60eec9fd4d | ||
|
|
492dfebd15 | ||
|
|
3c65af8b9a | ||
|
|
7a031d5e23 | ||
|
|
166dc28480 | ||
|
|
3a9a13fc28 | ||
|
|
a6a9958cfc | ||
|
|
460b35137a | ||
|
|
c949e9e636 | ||
|
|
e7e07be38c | ||
|
|
0bd84e8060 | ||
|
|
b1d6021875 | ||
|
|
807c16dd1b | ||
|
|
e8bbb00bde | ||
|
|
e53bb6a9d4 | ||
|
|
327314c2c3 | ||
|
|
f87177d34d | ||
|
|
b7663848ef | ||
|
|
47908c22df | ||
|
|
78c706ab71 | ||
|
|
d226fa7b17 | ||
|
|
2f8969c604 | ||
|
|
79b4a757c4 | ||
|
|
4794598d06 | ||
|
|
96d02849aa | ||
|
|
87cff0386c | ||
|
|
3c17851200 | ||
|
|
a99f214a0f | ||
|
|
abe4898b4a | ||
|
|
51222bad99 | ||
|
|
25f77462e1 | ||
|
|
c75cb86203 | ||
|
|
4d31d5882d | ||
|
|
222f2f08f6 | ||
|
|
286a0a1371 | ||
|
|
67912c692b | ||
|
|
da5fb5dcbd | ||
|
|
81ae54d9bd | ||
|
|
907254b9e8 | ||
|
|
4424f83470 | ||
|
|
f9cc419dba | ||
|
|
80da2341aa | ||
|
|
3a2491e97f | ||
|
|
3a7f1db947 | ||
|
|
093a025ebf | ||
|
|
d2f2ac523f | ||
|
|
d07953b0f0 | ||
|
|
26ee09c9bb | ||
|
|
ca62b66665 | ||
|
|
25beb7b3f4 | ||
|
|
cba6a6fdea | ||
|
|
2d597d7804 | ||
|
|
1d9916f93e | ||
|
|
f725aa2e8d | ||
|
|
edf8a2cd08 | ||
|
|
806691c1db | ||
|
|
8a4bce667c | ||
|
|
2d2e0307b8 | ||
|
|
63b70ddb06 | ||
|
|
6cee50afda | ||
|
|
89d3075f88 | ||
|
|
a0f32f5c29 | ||
|
|
4f173c8900 | ||
|
|
2d5f5a0c25 | ||
|
|
49430a5c31 | ||
|
|
482f4c1b6c | ||
|
|
349576b5cd | ||
|
|
c915c58d12 | ||
|
|
c81fbee4ab | ||
|
|
5a6428f1ff | ||
|
|
b5fe40624c | ||
|
|
68e1d8e8eb | ||
|
|
48585e54df | ||
|
|
59c784ae57 | ||
|
|
651c7e8de1 | ||
|
|
379c79025b | ||
|
|
e02d6a3b04 | ||
|
|
72acbad3f0 | ||
|
|
ec6a8cc9fd | ||
|
|
a986321b6d | ||
|
|
f40f023487 | ||
|
|
c09ce9cb42 | ||
|
|
4925aa594b | ||
|
|
a214778b74 | ||
|
|
0bdf9bbf4f | ||
|
|
e71b99c528 | ||
|
|
06fba73ab9 | ||
|
|
7518d2d0dc | ||
|
|
2f23ee4818 | ||
|
|
796c376408 | ||
|
|
66a07d7fe0 | ||
|
|
6c16bac908 | ||
|
|
84fbd5b3d0 | ||
|
|
c9be519990 | ||
|
|
4da21d80e3 | ||
|
|
fc5f4ff326 | ||
|
|
d27c5eb345 | ||
|
|
1af274a714 | ||
|
|
3f0f8bac49 | ||
|
|
55dbb8b81c | ||
|
|
69e9b0f250 | ||
|
|
14e9c3c7bb | ||
|
|
98b81252b7 | ||
|
|
e20ca28d5c | ||
|
|
0a3adb5de8 | ||
|
|
320174bd5b | ||
|
|
1277ce22f8 | ||
|
|
a5b43e1f4d | ||
|
|
6363118aa9 | ||
|
|
9b37fc7310 | ||
|
|
d9835c1ecf | ||
|
|
8d9f89e728 | ||
|
|
fe8a6abb41 | ||
|
|
c1f4fc3f0f | ||
|
|
ae4c8af674 | ||
|
|
1d86f4b5d1 | ||
|
|
ccb041c831 | ||
|
|
f2bab4ab9a | ||
|
|
de1be1dc66 | ||
|
|
ca284482cb | ||
|
|
803ded3dec | ||
|
|
9dd05474b0 | ||
|
|
96fa15c125 | ||
|
|
411a83e283 | ||
|
|
4498dc6a47 | ||
|
|
137a473bb7 | ||
|
|
d03f0ec294 | ||
|
|
b1013697d1 | ||
|
|
cf37028a52 | ||
|
|
6c4ef368d7 | ||
|
|
dced76d1a4 | ||
|
|
6e130cd446 | ||
|
|
42b1660c7e | ||
|
|
28594a65a8 | ||
|
|
7ab993c218 | ||
|
|
d2c3c66ba4 | ||
|
|
dacc129fd8 | ||
|
|
a251db068f | ||
|
|
9198285688 | ||
|
|
b88cb1ca69 | ||
|
|
848cd3cb3e | ||
|
|
28ecfb231d | ||
|
|
b76227b781 | ||
|
|
749d3ec14d | ||
|
|
5cfbc7bab5 | ||
|
|
ef28a6b872 | ||
|
|
2b9392c46c | ||
|
|
4fc8842edb | ||
|
|
8512c9fc9d | ||
|
|
31b7991a93 | ||
|
|
faca61c50a | ||
|
|
24739c9f5a | ||
|
|
4dc4f12ccd | ||
|
|
6763a92834 | ||
|
|
f7c1b78ec2 | ||
|
|
ecd46d381c | ||
|
|
61bfecfa09 | ||
|
|
fbd9fedbfb | ||
|
|
b3a402eb82 | ||
|
|
d5fdbe9e5d | ||
|
|
090f444d8f | ||
|
|
6e9493887d | ||
|
|
39899b07d9 | ||
|
|
b62e28dba5 | ||
|
|
00b8a5d3e4 | ||
|
|
6af54d0207 | ||
|
|
6210984c97 | ||
|
|
b6fe2ebc0b | ||
|
|
d082b3f4b9 | ||
|
|
76c800ffb6 | ||
|
|
d38687f893 | ||
|
|
ce86626ec2 | ||
|
|
1679457f6b | ||
|
|
a38a0f4fb7 | ||
|
|
2096018b00 | ||
|
|
26f5d34e64 | ||
|
|
519f2990f2 | ||
|
|
aa0ad9d922 | ||
|
|
929e7c1193 | ||
|
|
df2f98e276 | ||
|
|
1cef83aea4 | ||
|
|
9e11de4a8c | ||
|
|
0ebe86fbd5 | ||
|
|
2f218b878b | ||
|
|
4b7aa4ec09 | ||
|
|
67bdc2c7a9 | ||
|
|
569b32bd1e | ||
|
|
81045023c4 | ||
|
|
20e73ff69a | ||
|
|
489ec05b23 | ||
|
|
02939d776b | ||
|
|
3d1db3519d | ||
|
|
7456d556e1 | ||
|
|
a46a2e4715 | ||
|
|
ad211a86a6 | ||
|
|
53b334145b | ||
|
|
67cf7f18e6 | ||
|
|
f00f9fbf5a | ||
|
|
e68200538a | ||
|
|
09be75f6ae | ||
|
|
d405cfbcf7 | ||
|
|
ba519f105a | ||
|
|
37add98043 | ||
|
|
84f535d242 | ||
|
|
ea781a557f | ||
|
|
562f24336d | ||
|
|
6008fa44c6 | ||
|
|
3dbf7a4039 | ||
|
|
5a56ca0892 | ||
|
|
560d1383d1 | ||
|
|
54707ff81d | ||
|
|
e7856a1afc | ||
|
|
10718557a2 | ||
|
|
bcde155da7 | ||
|
|
8c0e0f8ab7 | ||
|
|
b7c477cc18 | ||
|
|
dadf147382 | ||
|
|
d1714c4a2a | ||
|
|
7e0a9fb83a | ||
|
|
b30f989f44 | ||
|
|
8271d239b2 | ||
|
|
9dd86a2de6 | ||
|
|
faa04c586f | ||
|
|
f2c40bf49d | ||
|
|
717740cfcf | ||
|
|
be60193588 | ||
|
|
54b0097cee | ||
|
|
68357876ca | ||
|
|
12ebed0589 | ||
|
|
5971aa7fef | ||
|
|
48ea136a9a | ||
|
|
fc33f9d49c | ||
|
|
2e23592264 | ||
|
|
be2b5698c5 | ||
|
|
45695543ba | ||
|
|
94de493b37 | ||
|
|
1cd5fab21d | ||
|
|
3a2c46a1ce | ||
|
|
d49927937b | ||
|
|
cb9e9286ef | ||
|
|
29fc3fc82f | ||
|
|
a81c6f44c5 | ||
|
|
7cec5f853c | ||
|
|
e99547cd7f | ||
|
|
75c01dec30 | ||
|
|
8581c11900 | ||
|
|
962109e855 | ||
|
|
ef562413cd | ||
|
|
88cde6e4e6 | ||
|
|
797d4364e7 | ||
|
|
fb3da327d6 | ||
|
|
83b8d642b4 | ||
|
|
c72bf0e1b1 | ||
|
|
dc83e30a44 | ||
|
|
78131e78bc | ||
|
|
fc64238a39 | ||
|
|
ec36755407 | ||
|
|
056454dff5 | ||
|
|
569a64068a | ||
|
|
cddfbf7395 | ||
|
|
b8f728590b | ||
|
|
8e1c27d129 | ||
|
|
0eeb607ffd | ||
|
|
bd833deef3 | ||
|
|
6982f4a5a2 | ||
|
|
02c29624d8 | ||
|
|
f86ddcf496 | ||
|
|
8ba29f968a | ||
|
|
88ec9c235d | ||
|
|
576618d8cc | ||
|
|
e182274fe7 | ||
|
|
ad250523cd | ||
|
|
6ffed854cc | ||
|
|
47f9c02331 | ||
|
|
507c71ad80 | ||
|
|
28f76f10db | ||
|
|
7dcd47369b | ||
|
|
13769f440f | ||
|
|
cfeec92826 | ||
|
|
3486118ab7 | ||
|
|
f286387647 | ||
|
|
cdfbb2978d | ||
|
|
4e69c40e12 | ||
|
|
9726e18c0a | ||
|
|
6d5e9f88f8 | ||
|
|
0650d58818 | ||
|
|
cd54b2878e | ||
|
|
51051cdf92 | ||
|
|
6f49d4c1d2 | ||
|
|
32b0225079 | ||
|
|
8082a5e7f4 | ||
|
|
75280bb54c | ||
|
|
f68d9d1a16 | ||
|
|
7ffa315566 | ||
|
|
ed5c9a20e5 | ||
|
|
b2207c3d28 | ||
|
|
4ebf53c6e9 | ||
|
|
faedebbb4e | ||
|
|
9730164613 | ||
|
|
8f9b6ac248 | ||
|
|
ef821379da | ||
|
|
874ff42687 | ||
|
|
e31bf63626 | ||
|
|
1bb38a38bb | ||
|
|
4d1f721558 | ||
|
|
d58982a6f6 | ||
|
|
1c6f7180b2 | ||
|
|
02eee49d25 | ||
|
|
c9886e6f42 | ||
|
|
cc682eafe1 | ||
|
|
8bc94947e5 | ||
|
|
8178e1f7da | ||
|
|
6ec626c5e9 | ||
|
|
8b0de95c0a | ||
|
|
6ae51b2cbf | ||
|
|
7adda3b71a | ||
|
|
5330859034 | ||
|
|
b1174428a5 | ||
|
|
30fc29fa6d | ||
|
|
7069cd6ab5 | ||
|
|
b26a0bde38 | ||
|
|
06a0f39f7b | ||
|
|
dc2da1de98 | ||
|
|
8ebc2fe601 | ||
|
|
b79588dc69 | ||
|
|
49f960aea5 | ||
|
|
c019dd6f98 | ||
|
|
751ba48bf5 | ||
|
|
d73586743b | ||
|
|
b9a24e3b51 | ||
|
|
93529031de | ||
|
|
7d58dc2350 | ||
|
|
63ec3c0486 | ||
|
|
7b0e378947 | ||
|
|
e1ad1794e3 | ||
|
|
9cba3bdf78 | ||
|
|
ad6adf327e | ||
|
|
2fb7fba856 | ||
|
|
a594e009f2 | ||
|
|
f51784ee01 | ||
|
|
d7ccbba2c9 | ||
|
|
a854d396ff | ||
|
|
c2814c1ada | ||
|
|
329485d4b6 | ||
|
|
cc834dd7a7 | ||
|
|
5a8c07dcf5 | ||
|
|
55f32fc413 | ||
|
|
e3b5d7fd7c | ||
|
|
bf1b751f47 | ||
|
|
c8d111924d | ||
|
|
bdaa421e8a | ||
|
|
353805e170 | ||
|
|
b8ab85ebe9 | ||
|
|
aed22a57e3 | ||
|
|
be323e2fb6 | ||
|
|
71c0c4803f | ||
|
|
79b26b1654 | ||
|
|
cca650c655 | ||
|
|
cb46bf314e | ||
|
|
0a38b307cd | ||
|
|
98374ea6fe | ||
|
|
4ca453b6de | ||
|
|
4888d27b71 | ||
|
|
2a1b0a8cae | ||
|
|
0ff2754677 | ||
|
|
2e30e1453d | ||
|
|
90e3ab8c1e | ||
|
|
9d854c5df0 | ||
|
|
6dd1270539 | ||
|
|
867f952d6b | ||
|
|
fb546f376e | ||
|
|
e707ac4f28 | ||
|
|
2144c162c4 | ||
|
|
a57e29dfc5 | ||
|
|
fb237b9e53 | ||
|
|
f0f62f6217 | ||
|
|
d9248e8d52 | ||
|
|
9a6711fa1b | ||
|
|
d8bf0df7e9 | ||
|
|
40df0644ca | ||
|
|
e32cbfcca7 | ||
|
|
b2b34e18e4 | ||
|
|
2bafd41183 | ||
|
|
a9aaa13a09 | ||
|
|
39655a7d9b | ||
|
|
47f5e1178f | ||
|
|
a7054b68fd | ||
|
|
eb20dd39b1 | ||
|
|
590566f8c4 | ||
|
|
c4a43633da | ||
|
|
66f271f100 | ||
|
|
89d40566f4 | ||
|
|
f192429c8a | ||
|
|
ff80e3a5fa | ||
|
|
b907cf2179 | ||
|
|
0a8d2d5dc7 | ||
|
|
d308fef0c2 | ||
|
|
b31ec4ca9a | ||
|
|
6d28a80bf8 | ||
|
|
f806e0f9e5 | ||
|
|
33793a869f | ||
|
|
c0bb88dfb0 | ||
|
|
753e926356 | ||
|
|
c724c17a56 | ||
|
|
254afcb2d0 | ||
|
|
dcbb196e21 | ||
|
|
2c424c1aa6 | ||
|
|
322733d59a | ||
|
|
ee1edab2a9 | ||
|
|
5ff387bbe4 | ||
|
|
ec15bfb7d1 | ||
|
|
854309a7d8 | ||
|
|
3fea8f3de5 | ||
|
|
698c3823ee | ||
|
|
0999273d32 | ||
|
|
d323b48179 | ||
|
|
a9f54de64e | ||
|
|
15aeaf279d | ||
|
|
a23a4ed98a | ||
|
|
2651b8957a | ||
|
|
81d4f66fbb | ||
|
|
cc2bd0bb68 | ||
|
|
1a0b78ae2f | ||
|
|
7e4799334f | ||
|
|
b38283dcf1 | ||
|
|
b92a3544f5 | ||
|
|
ff216e7d50 | ||
|
|
68b4dab582 | ||
|
|
c00a7f3a5e | ||
|
|
d71532b64e | ||
|
|
c7f8f2175b | ||
|
|
661ddf3d1e | ||
|
|
850788c4bb | ||
|
|
4c11eb5ddc | ||
|
|
f724a956b3 | ||
|
|
e957fd6f30 | ||
|
|
cca19b6ec4 | ||
|
|
881584d04c | ||
|
|
43d0199604 | ||
|
|
ae171ec28e | ||
|
|
cb2db3170e | ||
|
|
baaf57e396 | ||
|
|
d807a01d6b | ||
|
|
1bfcdaa2cc | ||
|
|
71378b8041 | ||
|
|
11aaee685a | ||
|
|
82d4a731f3 | ||
|
|
431568faad | ||
|
|
39bc38233a | ||
|
|
9e19472c33 | ||
|
|
e31d892598 | ||
|
|
729f9c3391 | ||
|
|
52d25336db | ||
|
|
208f67132d | ||
|
|
7545ea709a | ||
|
|
3b7466a13d | ||
|
|
f6ec1b29f9 | ||
|
|
9374168b26 | ||
|
|
e63300e286 | ||
|
|
dbaa37ea46 | ||
|
|
584786d87c | ||
|
|
38aba37fe9 | ||
|
|
a3b14e00a2 | ||
|
|
53307597b3 | ||
|
|
eb5df5c03d | ||
|
|
173eacce3f | ||
|
|
db21438648 | ||
|
|
cb8a19efaf | ||
|
|
3107618732 | ||
|
|
6349bd33d3 | ||
|
|
79a02a4c09 | ||
|
|
385c045e5a | ||
|
|
8d241cc164 | ||
|
|
bac3c0a63e | ||
|
|
81d552038c | ||
|
|
5c217b9e61 | ||
|
|
92f920b2b8 | ||
|
|
edd4706480 | ||
|
|
837af9b230 | ||
|
|
30042ab54b | ||
|
|
7158a012c3 | ||
|
|
475807566d | ||
|
|
f7c103d5d2 | ||
|
|
ee52b4166f | ||
|
|
9bfea5e60b | ||
|
|
feacc2441f | ||
|
|
a4ab7b14c1 | ||
|
|
268a6dc6d9 | ||
|
|
5794594e19 | ||
|
|
f496c1b27b | ||
|
|
19b4cf66ac | ||
|
|
748e8b7ce4 | ||
|
|
b44cbc9b13 | ||
|
|
558024696c | ||
|
|
d4ae39348f | ||
|
|
a74f4a661d | ||
|
|
24b40be548 | ||
|
|
7cc21be7de | ||
|
|
81c17e55a6 | ||
|
|
f4fe90ea6d | ||
|
|
e9e931fe4a | ||
|
|
1f93bb5a9a | ||
|
|
cfd4f0c69c | ||
|
|
ccb261f00d | ||
|
|
0aa2196eec | ||
|
|
1bd8c465d3 | ||
|
|
3a6ccf7f31 | ||
|
|
0fb0c43c0a | ||
|
|
e724792a67 | ||
|
|
666509623e | ||
|
|
f42be0622e | ||
|
|
3d235169c8 | ||
|
|
0382331499 | ||
|
|
9b4bc0189b | ||
|
|
9c1107f723 | ||
|
|
57fbf0b8a9 | ||
|
|
39adc984a8 | ||
|
|
19fb46b5b1 | ||
|
|
94318b1287 | ||
|
|
c11025f01f | ||
|
|
956c605934 | ||
|
|
9712213f50 | ||
|
|
ab91733a28 | ||
|
|
4edade5067 | ||
|
|
8fbfceed30 | ||
|
|
7c802f31d3 | ||
|
|
d569f23e1c | ||
|
|
53a79ff934 | ||
|
|
76cd70c232 | ||
|
|
00365b082f | ||
|
|
597a6fead2 | ||
|
|
8c7f5d5cd8 | ||
|
|
65a8db8525 | ||
|
|
dcea76ff41 | ||
|
|
8e32ef382a | ||
|
|
3e564a2506 | ||
|
|
28117353a9 | ||
|
|
0e852e9c81 | ||
|
|
01dc267e20 | ||
|
|
759644ab36 | ||
|
|
26fb7e0821 | ||
|
|
5536eb581c | ||
|
|
787f49b7a0 | ||
|
|
4bbed4f910 | ||
|
|
ddcff7e9c5 | ||
|
|
a620e66af5 | ||
|
|
0cf232d692 | ||
|
|
fe81ccab20 | ||
|
|
94b36250a1 | ||
|
|
20d6492775 | ||
|
|
52e3586be3 | ||
|
|
c98db8c437 | ||
|
|
c73f34cc5f | ||
|
|
1ccd1979a4 | ||
|
|
439bb0c5de | ||
|
|
4c0269597d | ||
|
|
f7c7ffecb3 | ||
|
|
e081791eaf | ||
|
|
32fbc2bdf3 | ||
|
|
78c2f8cab3 | ||
|
|
4fb0b49806 | ||
|
|
ffb72e855a | ||
|
|
6d7fe1f83c | ||
|
|
43863edc4f | ||
|
|
6ae8457f35 | ||
|
|
be7cf3e812 | ||
|
|
200fcd41ce | ||
|
|
3c03051bcf | ||
|
|
2391c72e4b | ||
|
|
6c51d0bb78 | ||
|
|
2964bf9e23 | ||
|
|
5a1de13e10 | ||
|
|
0c5854e371 | ||
|
|
5d5268a53d | ||
|
|
8d1eb759f7 | ||
|
|
328ccebf06 | ||
|
|
dc50ed69cf | ||
|
|
a545ccb740 | ||
|
|
56fee6835a | ||
|
|
791cee8a8e | ||
|
|
d1b8d34dd5 | ||
|
|
1dadf9d966 | ||
|
|
e577b40743 | ||
|
|
751a89ccc8 | ||
|
|
96cde10696 | ||
|
|
0b3b241258 | ||
|
|
bd97dc0134 | ||
|
|
bf669012e7 | ||
|
|
a04c3bac83 | ||
|
|
9499275180 | ||
|
|
2545e1c22c | ||
|
|
2dcb8b3bb0 | ||
|
|
a8b5c00939 | ||
|
|
a329104dcb | ||
|
|
34c4565f7c | ||
|
|
6eaa2db533 | ||
|
|
7d924679a6 | ||
|
|
96b530cf85 | ||
|
|
4a833d8151 | ||
|
|
5df5f97daf | ||
|
|
8d4ef822b6 | ||
|
|
1d460c4d49 | ||
|
|
b1fa0d25f0 | ||
|
|
72249ce889 | ||
|
|
861f2d4bc0 | ||
|
|
3b929cdd03 | ||
|
|
65426821c4 | ||
|
|
f30b0f1017 | ||
|
|
ffa6bcfff5 | ||
|
|
51663520c8 | ||
|
|
714d61aed7 | ||
|
|
10b0432eca | ||
|
|
19c9e226a3 | ||
|
|
d732be64f6 | ||
|
|
3643dcbf4b | ||
|
|
32473eeafe | ||
|
|
35741b46bd | ||
|
|
99169ae4ff | ||
|
|
bd34524a1c | ||
|
|
79599b7564 | ||
|
|
cc81e9adfa | ||
|
|
0ab09a57f7 | ||
|
|
de5b4f0497 | ||
|
|
e6775913aa | ||
|
|
d9b29bfb4e | ||
|
|
1cda5c1bc8 | ||
|
|
f2b1a8cb16 | ||
|
|
8947717e3e | ||
|
|
0ad0a61db2 | ||
|
|
730ef96398 | ||
|
|
bf98eb55ee | ||
|
|
b3143bb559 | ||
|
|
91896af877 | ||
|
|
887c94d9ba | ||
|
|
00b3557ce1 | ||
|
|
f30d0ce667 | ||
|
|
76c27c0b03 | ||
|
|
703202cc08 | ||
|
|
3c4bb16ce9 | ||
|
|
aea5b2e3b6 | ||
|
|
ffa9646749 | ||
|
|
fdf6682254 | ||
|
|
c7f3413d70 | ||
|
|
b9728c7af0 | ||
|
|
d1e7a54f3a | ||
|
|
f8ab629986 | ||
|
|
73bd82e706 | ||
|
|
3d4f85069f | ||
|
|
30481a36dc | ||
|
|
e6c9c7d571 | ||
|
|
b1d2c6c730 | ||
|
|
aef02f61e1 | ||
|
|
c607246218 | ||
|
|
ab37081f02 | ||
|
|
da574640e7 | ||
|
|
f33d8bd596 | ||
|
|
be4eaa680a | ||
|
|
fad0cc2ce5 | ||
|
|
32fec2c26c | ||
|
|
cac719c078 | ||
|
|
6f95be60a1 | ||
|
|
c4ff0d565b | ||
|
|
bc826173cc | ||
|
|
06a7954298 | ||
|
|
7a8e7b4db8 | ||
|
|
985fb91ee8 | ||
|
|
f5438477df | ||
|
|
db4a7edf3a | ||
|
|
5a8c3daba3 | ||
|
|
27f6b2dd73 | ||
|
|
f579376638 | ||
|
|
2f5de11c22 | ||
|
|
3a99217592 | ||
|
|
0ca75f7782 | ||
|
|
6c1b0785de | ||
|
|
a44ba0b8a2 | ||
|
|
7a29d959ce | ||
|
|
13ee2ad670 | ||
|
|
c93e51e92d | ||
|
|
f9e79cd73c | ||
|
|
b9e7d02462 | ||
|
|
6bcd0fd9cc | ||
|
|
6d98203572 | ||
|
|
ad7b39d763 | ||
|
|
df6bdf59e6 | ||
|
|
fbd71e1539 | ||
|
|
2d3944250f | ||
|
|
86447c1301 | ||
|
|
d57c0cfde0 | ||
|
|
c8de2c0bd4 | ||
|
|
ef71867bb0 | ||
|
|
c9d0bd7404 | ||
|
|
fdd4afa392 | ||
|
|
bd18f50c8a | ||
|
|
8dbeab9a7b | ||
|
|
e266c8a750 | ||
|
|
c4e9f09f0f | ||
|
|
7c70f3df93 | ||
|
|
0f0bef2d33 | ||
|
|
75510e2ea1 | ||
|
|
73134035a9 | ||
|
|
6a812f7293 | ||
|
|
6afd7d50a6 | ||
|
|
ca259331e4 | ||
|
|
e3ad367b80 | ||
|
|
f6d06fcda2 | ||
|
|
b720bb2e77 | ||
|
|
8dd335295e | ||
|
|
4d876d1980 | ||
|
|
855a736a2c | ||
|
|
91bb969ed1 | ||
|
|
af81b02ef0 | ||
|
|
3080959084 | ||
|
|
1b5f724df0 | ||
|
|
7fc7c05e9d | ||
|
|
b91a537c35 | ||
|
|
75f382c903 | ||
|
|
1687afba9f | ||
|
|
b929543782 | ||
|
|
62f54d9d65 | ||
|
|
dc1ca31071 | ||
|
|
eb069833a8 | ||
|
|
c5d868c928 | ||
|
|
5306c14d78 | ||
|
|
07e3699700 | ||
|
|
883041fbcc | ||
|
|
67f68df8a8 | ||
|
|
b2f8944b1f | ||
|
|
425c9ce401 | ||
|
|
d279cedd28 | ||
|
|
53981c8747 | ||
|
|
f60d44eda9 | ||
|
|
f8d14a216b | ||
|
|
0a6840b6a6 | ||
|
|
ee4db9f96d | ||
|
|
b8b72580a7 | ||
|
|
5d16f30a3d | ||
|
|
b4e8989bd1 | ||
|
|
b5d457b5ce | ||
|
|
5f1e634d82 | ||
|
|
a6a233df6b | ||
|
|
e3d8ab5849 | ||
|
|
df5faf35e5 | ||
|
|
4e64a58ac1 | ||
|
|
3449a8bc4d | ||
|
|
104fab7466 | ||
|
|
8de2f00294 | ||
|
|
56e1dac03a | ||
|
|
3b3f0eb507 | ||
|
|
3097ba93d7 | ||
|
|
4120982da1 | ||
|
|
7b1993b1e4 | ||
|
|
fe9d884d90 | ||
|
|
de8297c983 | ||
|
|
80ba8f07b8 | ||
|
|
59efd42483 | ||
|
|
a83e233dea | ||
|
|
15d4f68af6 | ||
|
|
e15abb3de0 | ||
|
|
15f971ece7 | ||
|
|
bfe039fcba | ||
|
|
a691cc857e | ||
|
|
f8f7881f89 | ||
|
|
71450828bd | ||
|
|
e07d3c7827 | ||
|
|
91df08f56d | ||
|
|
987f5fd2a1 | ||
|
|
01dba479a4 | ||
|
|
ae696e7ccb | ||
|
|
4c96ca4e62 | ||
|
|
128d37c671 | ||
|
|
5be8b47e1c | ||
|
|
b1eb9d6b15 | ||
|
|
55f6e810cf | ||
|
|
114953f28d | ||
|
|
7fa33fc250 | ||
|
|
07ad60b89b | ||
|
|
0c229aacdd | ||
|
|
5acdf425ab | ||
|
|
b1730b768d | ||
|
|
d5cf4d6fd5 | ||
|
|
e8d34002e1 | ||
|
|
5da3c49497 | ||
|
|
6b4dcb916b | ||
|
|
316cf025ae | ||
|
|
a9ca9f45af | ||
|
|
9044f1437c | ||
|
|
08c1f408d3 | ||
|
|
2bd2501dc0 | ||
|
|
aa39451c8b | ||
|
|
96f7620628 | ||
|
|
9abbfa7862 | ||
|
|
ba6cc5df2a | ||
|
|
ee6ec3faf3 | ||
|
|
79279e01f5 | ||
|
|
d42c53346d | ||
|
|
2798e59e7f | ||
|
|
f161ff9db5 | ||
|
|
6a609cb046 | ||
|
|
ed445860eb | ||
|
|
3950b10d2a | ||
|
|
9e9935acbc | ||
|
|
ddcd1d2cec | ||
|
|
33b5afa893 | ||
|
|
15deaa7eb6 | ||
|
|
44b99bc299 | ||
|
|
a7568ea54b | ||
|
|
373873d71f | ||
|
|
a2bafaa254 | ||
|
|
c5fa99c66c | ||
|
|
d54bbc8737 | ||
|
|
1ac1626357 | ||
|
|
16c4415d4c | ||
|
|
1390a39053 | ||
|
|
8358528888 | ||
|
|
384e81fe28 | ||
|
|
07d37fbfc0 | ||
|
|
9cddf22fff | ||
|
|
9c5abd575f | ||
|
|
e890f682e2 | ||
|
|
5946f67328 | ||
|
|
acaf66ac80 | ||
|
|
293cf18266 | ||
|
|
d00fdca38f | ||
|
|
d81b0675f0 | ||
|
|
6e0a789b6d | ||
|
|
efdadc3758 | ||
|
|
59378dce46 | ||
|
|
ed55826686 | ||
|
|
7ba5248e56 | ||
|
|
a075ce160e | ||
|
|
e80cf185b9 | ||
|
|
ef022c2326 | ||
|
|
ee51313e2c | ||
|
|
dd12a85429 | ||
|
|
570a7aaaf3 | ||
|
|
678ce54e70 | ||
|
|
2d05c906d5 | ||
|
|
272b0aec82 | ||
|
|
6944161b15 | ||
|
|
70c9565607 | ||
|
|
f40d672a12 | ||
|
|
4ef10c92f4 | ||
|
|
f6f5b8cfb1 | ||
|
|
fbd41eacba | ||
|
|
ef45a87882 | ||
|
|
58f0503f6d | ||
|
|
cba12d0106 | ||
|
|
203f967677 | ||
|
|
7de95a642e | ||
|
|
dc2c62807a | ||
|
|
5510327d70 | ||
|
|
8d2111169a | ||
|
|
b6fa252fc9 | ||
|
|
8364130a1f | ||
|
|
9c5a359de3 | ||
|
|
280c7d396c | ||
|
|
7d02eccbce | ||
|
|
c30f16a038 | ||
|
|
090e1a87b7 | ||
|
|
be0830b24f | ||
|
|
c7e6d379da | ||
|
|
ef9cae6dc0 | ||
|
|
a83aa28a67 | ||
|
|
d0cbb4041b | ||
|
|
32b3611026 | ||
|
|
e04c4ad852 | ||
|
|
7d418e9105 | ||
|
|
784847cf18 | ||
|
|
ea3f9b5b9a | ||
|
|
4e21e9ed44 | ||
|
|
97096e4e6c | ||
|
|
c456ba6bde | ||
|
|
4443fef6c3 | ||
|
|
d4c1bba856 | ||
|
|
892d1c6aab | ||
|
|
2032da7fe2 | ||
|
|
36eb1b77d0 | ||
|
|
753fe32793 | ||
|
|
695245d307 | ||
|
|
bac690bbc8 | ||
|
|
3a929faf26 | ||
|
|
560ae9352c | ||
|
|
dca49e43d9 | ||
|
|
98c016b41d | ||
|
|
580abe0de4 | ||
|
|
fe17dd9a7e | ||
|
|
75a6c759c7 | ||
|
|
3d6bdc2dc3 | ||
|
|
1a2db54bc1 | ||
|
|
4a88a28a3b | ||
|
|
dce3275df4 | ||
|
|
1c564bc118 | ||
|
|
71d965b6a2 | ||
|
|
1ce2acb4ef | ||
|
|
baf49b2523 | ||
|
|
f14425ec18 | ||
|
|
c58c03167d | ||
|
|
2f5a742f3e | ||
|
|
0cf3e2e677 | ||
|
|
374133086d | ||
|
|
054dd237a4 | ||
|
|
1db1e0f4b7 | ||
|
|
6174dfb424 | ||
|
|
e69117a8f3 | ||
|
|
27e254c738 | ||
|
|
95321f5b33 | ||
|
|
1752f6879c | ||
|
|
8021a01365 | ||
|
|
b298b397dc | ||
|
|
92185a1a6f | ||
|
|
2e28691254 | ||
|
|
5ef4b2064f | ||
|
|
a6aad880f7 | ||
|
|
8b74c711c6 | ||
|
|
fcead2f79e | ||
|
|
0806aa353c | ||
|
|
d8edc27805 | ||
|
|
9743b04fe6 | ||
|
|
4574039e4d | ||
|
|
14c273f273 | ||
|
|
8bfb5425e3 | ||
|
|
7696a600f6 | ||
|
|
eeea257467 | ||
|
|
d289a90cc7 | ||
|
|
fb89c12d90 | ||
|
|
03cd34fb54 | ||
|
|
fdfa564865 | ||
|
|
a29c80ca3d | ||
|
|
7680d9a23c | ||
|
|
eef73eea22 | ||
|
|
cd8b0d04bb | ||
|
|
a52cb315cb | ||
|
|
dfc654f84e | ||
|
|
2829298de7 | ||
|
|
333f0ab89f | ||
|
|
3d6b936f38 | ||
|
|
c23155790a | ||
|
|
81b1b882fd | ||
|
|
c13b58e6db | ||
|
|
1b518c158b | ||
|
|
f7c00b8180 | ||
|
|
8a31ee4b53 | ||
|
|
f63e24e51d | ||
|
|
6d8548d7a5 | ||
|
|
b73387647c | ||
|
|
5977fc0644 | ||
|
|
c24d94f87f | ||
|
|
b51b8858d6 | ||
|
|
22c7438795 | ||
|
|
28b24eeef6 | ||
|
|
c18578af6f | ||
|
|
1795d34a1f | ||
|
|
5c5cdea4f2 | ||
|
|
bb9d95e9aa | ||
|
|
689003454b | ||
|
|
368e8e85a8 | ||
|
|
6dea2359ab | ||
|
|
c355e967ad | ||
|
|
d501dc4c11 | ||
|
|
80e79a3966 | ||
|
|
eda0c73bef | ||
|
|
8d16762f03 | ||
|
|
270934441c | ||
|
|
4932a32d91 | ||
|
|
22e7e807f3 | ||
|
|
f46b58b09d | ||
|
|
b32a462b2e | ||
|
|
5cd38ec91b | ||
|
|
96152510e5 | ||
|
|
5481f226dd | ||
|
|
5faa7e7861 | ||
|
|
83732642ac | ||
|
|
99e07718da | ||
|
|
280ccfa177 | ||
|
|
66f36be7d0 | ||
|
|
00fd1abf82 | ||
|
|
526f1a3172 | ||
|
|
9b38f59184 | ||
|
|
c3e1ada405 | ||
|
|
1956c6f906 | ||
|
|
0e0f0ae5ea | ||
|
|
69b4594bb3 | ||
|
|
a5d61f6da0 | ||
|
|
49d6c26da4 | ||
|
|
bb1eca3564 | ||
|
|
195da8ef3f | ||
|
|
8ebb3a0fb8 | ||
|
|
75e2a29cb5 | ||
|
|
f9593bd857 | ||
|
|
4b176ba855 | ||
|
|
10ed65bc12 | ||
|
|
91690a1b54 | ||
|
|
ae3ec380f8 | ||
|
|
83b18af69e | ||
|
|
eb031b6800 | ||
|
|
2d127cb694 | ||
|
|
a68222b55b | ||
|
|
60e7c12e92 | ||
|
|
9a2b8a0814 | ||
|
|
093d8a2b00 | ||
|
|
7dc740d084 | ||
|
|
de10a529b0 | ||
|
|
e2bca190a9 | ||
|
|
387e56e215 | ||
|
|
e5b0478e19 | ||
|
|
6a951751f7 | ||
|
|
b237ffcf09 | ||
|
|
5a80bf27f4 | ||
|
|
4229892e29 | ||
|
|
3748de8736 | ||
|
|
47115fd579 | ||
|
|
61af044316 | ||
|
|
b1806b57d8 | ||
|
|
5dfdd87707 | ||
|
|
a90427a663 | ||
|
|
53c64abdeb | ||
|
|
59d4535f84 | ||
|
|
6e62d9709f | ||
|
|
d3a206d6db | ||
|
|
12eba4d311 | ||
|
|
8e90724684 | ||
|
|
039dafb30f | ||
|
|
9845fade89 | ||
|
|
efe03a39cc | ||
|
|
ae2af4c36d | ||
|
|
343dced36d | ||
|
|
bf21108fdb | ||
|
|
1292163637 | ||
|
|
432e074b4e | ||
|
|
208f17a73a | ||
|
|
a76165828b | ||
|
|
81f8b26127 | ||
|
|
9850193348 | ||
|
|
ae6a426689 | ||
|
|
6860501994 | ||
|
|
5d606000b9 | ||
|
|
85c05b6822 | ||
|
|
336e82d162 | ||
|
|
a06e2298f0 | ||
|
|
065ce39577 | ||
|
|
342e6a14a2 | ||
|
|
5ef2c947f7 | ||
|
|
1e121d36a4 | ||
|
|
40156392f8 | ||
|
|
dd053d79b0 | ||
|
|
b107b4f1e5 | ||
|
|
acbca7584b | ||
|
|
baeb2e3c0e | ||
|
|
114fce4242 | ||
|
|
155d692959 | ||
|
|
4c91a5c94b | ||
|
|
4cd9099f74 | ||
|
|
6db7518189 | ||
|
|
9faefe85e1 | ||
|
|
f461a21a50 | ||
|
|
51388fea75 | ||
|
|
c7e47e6884 | ||
|
|
2b087dbf95 | ||
|
|
c254c9842b | ||
|
|
9193242a76 | ||
|
|
af46bf515f | ||
|
|
52c2fa44b8 | ||
|
|
a280e98d7f | ||
|
|
726aaecc46 | ||
|
|
c3787e17fd | ||
|
|
942c56ca95 | ||
|
|
67ae167013 | ||
|
|
25ef0ee593 | ||
|
|
e7e0514379 | ||
|
|
e1dd4c19b5 | ||
|
|
a5ccc4673b | ||
|
|
4f4ac45670 | ||
|
|
f86a52aae6 | ||
|
|
e61dce6441 | ||
|
|
e64609387d | ||
|
|
de36b61931 | ||
|
|
f8fefd5a60 | ||
|
|
f3abb9e682 | ||
|
|
1b79964827 | ||
|
|
7423b21429 | ||
|
|
48e13a3362 | ||
|
|
4d941b5fdb | ||
|
|
2ee252be5f | ||
|
|
9385ed27ae | ||
|
|
1f6535afb0 | ||
|
|
cdfb7428c8 | ||
|
|
52168d0781 | ||
|
|
2411b8d1e7 | ||
|
|
0796e1dd69 | ||
|
|
febd532c4a | ||
|
|
236b34c009 | ||
|
|
b1da59845e | ||
|
|
2403abe1ee | ||
|
|
909d3eed0a | ||
|
|
80a6d78595 | ||
|
|
3f1d7e1260 | ||
|
|
d8622dd3e5 | ||
|
|
29f578d172 | ||
|
|
7690b58691 | ||
|
|
a9a73d9315 | ||
|
|
dbd72ee828 | ||
|
|
f570cbfca8 | ||
|
|
c620da9089 | ||
|
|
89ea8a0275 | ||
|
|
c1eb714a7f | ||
|
|
6edc25f512 | ||
|
|
fecf3f19c3 | ||
|
|
e10848e0d5 | ||
|
|
b4bf12378e | ||
|
|
0963328aed | ||
|
|
60d4f47f7a | ||
|
|
9defbf989d | ||
|
|
64349b5006 | ||
|
|
8fea5170be | ||
|
|
ac5241b5bd | ||
|
|
f1923d454c | ||
|
|
fdef2b0f8b | ||
|
|
30e7cd8ed5 | ||
|
|
03bc5ab3d5 | ||
|
|
5acadbab32 | ||
|
|
aaf286ec5e | ||
|
|
b0573bd4e4 | ||
|
|
cd5431575a | ||
|
|
b242e8d7ff | ||
|
|
62133c6ffa | ||
|
|
883be6ae88 | ||
|
|
65aafb3cf1 | ||
|
|
6a0599b5f4 | ||
|
|
ebc50432c7 | ||
|
|
22f162c3cd | ||
|
|
735336e569 | ||
|
|
136ede989f | ||
|
|
9a0a8e89fb | ||
|
|
72ae12877e | ||
|
|
a62dec2053 | ||
|
|
e14861694c | ||
|
|
ed99fc2d42 | ||
|
|
24136ab88b | ||
|
|
68bcf6830c | ||
|
|
19c7b95d00 | ||
|
|
ce5ee57ef8 | ||
|
|
0525e6f76a | ||
|
|
433e69e560 | ||
|
|
549413b48b | ||
|
|
f43c4fd81c | ||
|
|
d2c5b6d964 | ||
|
|
52f4f4026b | ||
|
|
f45d3f07ed | ||
|
|
ac7824b669 | ||
|
|
745413331b | ||
|
|
7eaf289e33 | ||
|
|
9d57599b33 | ||
|
|
b3805140ec | ||
|
|
fce4199412 | ||
|
|
7d763e0776 | ||
|
|
08fd62339e | ||
|
|
96c3f10a0e | ||
|
|
5ba354fa2c | ||
|
|
56e4ed1e6b | ||
|
|
f35f6083cd | ||
|
|
30ca149be7 | ||
|
|
7fd2ef975b | ||
|
|
b7d1a175a8 | ||
|
|
9e7ee40477 | ||
|
|
8fe0e88c05 | ||
|
|
282cd44cec | ||
|
|
ceee2923dd | ||
|
|
f332e858d1 | ||
|
|
2ac80485c0 | ||
|
|
243626c7c1 | ||
|
|
841d824216 | ||
|
|
d535e78c98 | ||
|
|
061da15d0b | ||
|
|
aaba7fdb29 | ||
|
|
2aa6ab71db | ||
|
|
39cfb1d6a6 | ||
|
|
223032f0ce | ||
|
|
fa7e0ce58a | ||
|
|
21f39f3e7f | ||
|
|
7311db60a0 | ||
|
|
5ac62bbb75 | ||
|
|
f7c8e923c0 | ||
|
|
5fb3c0e3a8 | ||
|
|
a5b4ed2909 | ||
|
|
e72fe25224 | ||
|
|
6d483c0a56 | ||
|
|
21f9dc6b7c | ||
|
|
83022a2478 | ||
|
|
918edad525 | ||
|
|
a1f0e940b7 | ||
|
|
ee8ff39454 | ||
|
|
8b8cd13929 | ||
|
|
cbf5de7c8f | ||
|
|
d68e31a863 | ||
|
|
a52662fca0 | ||
|
|
d482b1f824 | ||
|
|
ed93185cb7 | ||
|
|
9eac16b976 | ||
|
|
a4cbe78d97 | ||
|
|
0160c7a89d | ||
|
|
ed3a4961d0 | ||
|
|
7952d591b9 | ||
|
|
d59d921e84 | ||
|
|
e19b630ab1 | ||
|
|
0bfb88e2e6 | ||
|
|
dc28c787d1 | ||
|
|
46ac22f3e5 | ||
|
|
4b03abdaff | ||
|
|
366c50674c | ||
|
|
5c79c0e743 | ||
|
|
fd2d9c214c | ||
|
|
fbd414fd2f | ||
|
|
0fc9ada0aa | ||
|
|
6bba4b1be0 | ||
|
|
60eb73adb4 | ||
|
|
5348c667cc | ||
|
|
a4d2633a33 | ||
|
|
802da8f31d | ||
|
|
a5391c8882 | ||
|
|
1821dac795 | ||
|
|
7c83c0569f | ||
|
|
dd58298500 | ||
|
|
14a8d4ae3c | ||
|
|
931b71c428 | ||
|
|
ad99b82930 | ||
|
|
8cbfd7a9da | ||
|
|
8f9c0b621e | ||
|
|
da43267e09 | ||
|
|
a45255337d | ||
|
|
a1e45e3247 | ||
|
|
367f8d6130 | ||
|
|
74bbf592d1 | ||
|
|
fcf8f7fc93 | ||
|
|
107e9107c8 | ||
|
|
fb4f14ba76 | ||
|
|
9834ccfcd9 | ||
|
|
22d91148ca | ||
|
|
47da52b85b | ||
|
|
c069525e8c | ||
|
|
f1f720cc78 | ||
|
|
896f978b94 | ||
|
|
a5ea7e4304 | ||
|
|
157ef46d5a | ||
|
|
0fcdd7db35 | ||
|
|
8992707fbb | ||
|
|
04e4018228 | ||
|
|
b1f0df0fd1 | ||
|
|
33df5edc08 | ||
|
|
ab291902d8 | ||
|
|
4c898ab6b3 | ||
|
|
3fbfc5fbd4 | ||
|
|
d4bae356ba | ||
|
|
a124d1f0eb | ||
|
|
8974aa4513 | ||
|
|
746655c1d5 | ||
|
|
ab52b453cb | ||
|
|
55d09d23b4 | ||
|
|
3317d7fd7c | ||
|
|
a44a03f9a5 | ||
|
|
f7d8fb0cf4 | ||
|
|
d74c91616f | ||
|
|
d2d75f3824 | ||
|
|
f27f3515ae | ||
|
|
8d52d877fb | ||
|
|
0e39df24d4 | ||
|
|
bf1ee28194 | ||
|
|
fbc19311b5 | ||
|
|
422ba3a3ce | ||
|
|
69b498d85d | ||
|
|
db44004d51 | ||
|
|
23c84516e2 | ||
|
|
71484e89d6 | ||
|
|
090ca27b15 | ||
|
|
23e30962b9 | ||
|
|
60d932e57d | ||
|
|
a0c5113611 | ||
|
|
b10886bc21 | ||
|
|
b4207e1be7 | ||
|
|
a585c8c22c | ||
|
|
7aaf4012e4 | ||
|
|
1b91b31698 | ||
|
|
ab528bb043 | ||
|
|
7421781150 | ||
|
|
049e228003 | ||
|
|
cec2173381 | ||
|
|
45e9a8fd66 | ||
|
|
9d1814ab81 | ||
|
|
6a788bb364 | ||
|
|
104e4c9fc7 | ||
|
|
f1d5f8e2bf | ||
|
|
c01edc650d | ||
|
|
a232b215a7 | ||
|
|
b1e1536d56 | ||
|
|
9b7ca248f0 | ||
|
|
15bf3f2eb8 | ||
|
|
0d88e122be | ||
|
|
111007470e | ||
|
|
56e880117e | ||
|
|
90e26a34c5 | ||
|
|
6ebd62020a | ||
|
|
ecc8728643 | ||
|
|
79abc0c16f | ||
|
|
d51622d721 | ||
|
|
ffcff9ebd4 | ||
|
|
fd68c44dfa | ||
|
|
55720e7f98 | ||
|
|
d80a3365c4 | ||
|
|
5a03eaca89 | ||
|
|
a42b4e219c | ||
|
|
f1bb25bfaf | ||
|
|
f042dfb861 | ||
|
|
f657d70a67 | ||
|
|
ba4ea351c7 | ||
|
|
9a7fface7d | ||
|
|
b6bb6a5a60 | ||
|
|
c8a781bf77 | ||
|
|
afb372bbdf | ||
|
|
ad6ab39287 | ||
|
|
f629069572 | ||
|
|
486b3d2f92 | ||
|
|
153c6d5416 | ||
|
|
a94c1556ce | ||
|
|
cb31eeec55 | ||
|
|
13e4c79f58 | ||
|
|
059cb9cb74 | ||
|
|
377956e969 | ||
|
|
74b82b688c | ||
|
|
b0092235fc | ||
|
|
b9cc6535f6 | ||
|
|
f187c35fb2 | ||
|
|
695d4018ea | ||
|
|
040d03912b | ||
|
|
1c6cbdace5 | ||
|
|
d180324413 | ||
|
|
d1500511e6 | ||
|
|
e40ab547ba | ||
|
|
b94636bf77 | ||
|
|
ecffa8e1d9 | ||
|
|
32ad33558d | ||
|
|
1796869da7 | ||
|
|
3c0fce4928 | ||
|
|
52c5f0172e | ||
|
|
79a98d7bcf | ||
|
|
0a2f7a6ba7 | ||
|
|
1397d532c6 | ||
|
|
9c9e6290a6 | ||
|
|
19b04d5427 | ||
|
|
ff009f1c4e | ||
|
|
083d747302 | ||
|
|
ca239fcf98 | ||
|
|
f7a0fefe27 | ||
|
|
4462404151 | ||
|
|
a81656568b | ||
|
|
c76d09f9a5 | ||
|
|
3e52984e88 | ||
|
|
7cf7215557 | ||
|
|
9158ba4640 | ||
|
|
a45895a3af | ||
|
|
3325775944 | ||
|
|
155fecadb7 | ||
|
|
74ec57e0e1 | ||
|
|
57cfdeeaf0 | ||
|
|
615fa91675 | ||
|
|
279f7d57cb | ||
|
|
cbd4478b5e | ||
|
|
5f43a61e0d | ||
|
|
854de4e7e0 | ||
|
|
ff4ef337da | ||
|
|
5db25352e5 | ||
|
|
075a8e5ccb | ||
|
|
52fc16bc8a | ||
|
|
0b81c5a3cb | ||
|
|
3db4d66824 | ||
|
|
48c05b5a45 | ||
|
|
35f927e64e | ||
|
|
d4a30d022b | ||
|
|
849bef987c | ||
|
|
e3bd72e8e2 | ||
|
|
3e923871cf | ||
|
|
897db23203 | ||
|
|
bcf3dbf974 | ||
|
|
b71bb95f7d | ||
|
|
f077fbd32d | ||
|
|
602e472b8a | ||
|
|
04ff9ede9f | ||
|
|
1d7b9a3b0b | ||
|
|
2eeb4c6153 | ||
|
|
b5833a0826 | ||
|
|
4a43c2fa1a | ||
|
|
5cc81b91cb | ||
|
|
982a162fbf | ||
|
|
1a099c9284 | ||
|
|
3d2c266980 | ||
|
|
079dcd1fff | ||
|
|
f4fa81735d | ||
|
|
05d4e8e2e8 | ||
|
|
682eedce59 | ||
|
|
c604a5c02f | ||
|
|
d340dd79b8 | ||
|
|
b96cbe2177 | ||
|
|
81bf67ba4f | ||
|
|
3dc4abddec | ||
|
|
c614639e7b | ||
|
|
21f3b9eccc | ||
|
|
7f3cfea02b | ||
|
|
5aaa794519 | ||
|
|
9dd86f6fb8 | ||
|
|
f3a74e7d80 | ||
|
|
41734affb3 | ||
|
|
5055ac4b23 | ||
|
|
8fe46d5db5 | ||
|
|
2880baa1bc | ||
|
|
92b634de7c | ||
|
|
b6ebe0828d | ||
|
|
a555b1fcff | ||
|
|
c66fbd9bff | ||
|
|
26edb7d797 | ||
|
|
f8d4d6cdc7 | ||
|
|
af60f9ead4 | ||
|
|
949dfc59fd | ||
|
|
9853323157 | ||
|
|
63f2f2b294 | ||
|
|
e6354567e5 | ||
|
|
3588c3363d | ||
|
|
25af013896 | ||
|
|
797b35cdcb | ||
|
|
bc606415c3 | ||
|
|
a53c69de38 | ||
|
|
08262b5c43 | ||
|
|
03b3278369 | ||
|
|
edd8528049 | ||
|
|
cd47f09f86 | ||
|
|
0ade45db08 | ||
|
|
7fc678c961 | ||
|
|
00687de43b | ||
|
|
2f9caf49d3 | ||
|
|
735c78fc6d | ||
|
|
a6ec6e23bc | ||
|
|
f70d206881 | ||
|
|
31c9a2a744 | ||
|
|
ae866260c8 | ||
|
|
71224ad17c | ||
|
|
6dcdb224a1 | ||
|
|
dcc42c858b | ||
|
|
2644b9a5e0 | ||
|
|
a6f927a6e9 | ||
|
|
cb6fadf917 | ||
|
|
e78e284380 | ||
|
|
570e5f968d | ||
|
|
0dd47b1771 | ||
|
|
4ce31348c2 | ||
|
|
d5665997e0 | ||
|
|
76a89c832e | ||
|
|
794cd561cd | ||
|
|
c1f76aec3a | ||
|
|
b7361d00aa | ||
|
|
6de1f14a56 | ||
|
|
bfdab586e3 | ||
|
|
8ac0a2b2dd | ||
|
|
e8068b5e1d | ||
|
|
3de99d365e | ||
|
|
79d4d56fe5 | ||
|
|
8a77d4482c | ||
|
|
f83bc9528d | ||
|
|
c12d4d1bd2 | ||
|
|
7cf058feac | ||
|
|
726fcb5eec | ||
|
|
818bea34a4 | ||
|
|
96e959342a | ||
|
|
cc5470d068 | ||
|
|
ec61821bf7 | ||
|
|
d1210b9e9f | ||
|
|
a0b3d0809d | ||
|
|
2ae2ede06a | ||
|
|
c6f7479a72 | ||
|
|
5c43bfbf13 | ||
|
|
dd670fb4a3 | ||
|
|
540602fab6 | ||
|
|
3b4703e3b5 | ||
|
|
86d95fcd22 | ||
|
|
afde6f582d | ||
|
|
2c8c6e6636 | ||
|
|
8e25019634 | ||
|
|
a206667b4d | ||
|
|
38d26c8080 | ||
|
|
b4d033ff54 | ||
|
|
db110759ab | ||
|
|
6921c15b7b | ||
|
|
5dcfda0600 | ||
|
|
c9a39dfdb5 | ||
|
|
fcc6dd1d4d | ||
|
|
216f343f09 | ||
|
|
7dd754ae74 | ||
|
|
1f67d9edd8 | ||
|
|
ecb661f719 | ||
|
|
83d724fb70 | ||
|
|
d681e1cae3 | ||
|
|
510fb2a981 | ||
|
|
93716ee944 | ||
|
|
bb9eec8696 | ||
|
|
9b8de9b59c | ||
|
|
892c948a44 | ||
|
|
1c6d51f271 | ||
|
|
0db1eaa55a | ||
|
|
718041194f | ||
|
|
b667940c68 | ||
|
|
33ae7520e7 | ||
|
|
738c90c51b | ||
|
|
89924c2703 | ||
|
|
89acf68f08 | ||
|
|
0e2c41e0f9 | ||
|
|
aaab24dcf8 | ||
|
|
59ba551d3b | ||
|
|
3bd7bcfac3 | ||
|
|
d078aa360b | ||
|
|
4edccce9a3 | ||
|
|
fe3639d547 | ||
|
|
847b43f6e4 | ||
|
|
24fdefe152 | ||
|
|
011afeb2ea | ||
|
|
bfa6505636 | ||
|
|
961e778ed1 | ||
|
|
af5b2e1b3c | ||
|
|
c04cca1ae4 | ||
|
|
4abfb686ec | ||
|
|
95b107cbc6 | ||
|
|
e1dd8716fb | ||
|
|
b737eb1a87 | ||
|
|
0a4a1ca36c | ||
|
|
b6ecbd8bc3 | ||
|
|
c3f9b90911 | ||
|
|
72363ada84 | ||
|
|
29b4114bc0 | ||
|
|
04a200d3d8 | ||
|
|
a9a4032a11 | ||
|
|
e38ee80c98 | ||
|
|
4f0f99e663 | ||
|
|
dae4c4b83f | ||
|
|
e3389e8ec1 | ||
|
|
13f3f79eb8 | ||
|
|
6d35f68242 | ||
|
|
3bb559b4c8 | ||
|
|
d5d1b74f90 | ||
|
|
3c5087902d | ||
|
|
87ed442d9e | ||
|
|
0c31172fb0 | ||
|
|
7fc899dfd6 | ||
|
|
b17bf5843c | ||
|
|
2fe20cd092 | ||
|
|
c6b79dfd24 | ||
|
|
2507735596 | ||
|
|
29e0396eca | ||
|
|
519028e263 | ||
|
|
52c2763ee3 | ||
|
|
4b9cc1246e | ||
|
|
cd625b04eb | ||
|
|
4f62e8235f | ||
|
|
83954acfd4 | ||
|
|
32683ad6fd | ||
|
|
4a506b0566 | ||
|
|
beef793e83 | ||
|
|
92a1eb958a | ||
|
|
91ece782af | ||
|
|
5b1700e52a | ||
|
|
f29079daac | ||
|
|
c92654a044 | ||
|
|
fed9f01b2d | ||
|
|
5124eae47d | ||
|
|
287a53ee39 | ||
|
|
0f9f8f6aa9 | ||
|
|
73c6bae480 | ||
|
|
02fc7e14cd | ||
|
|
3db50f724b | ||
|
|
2d87fea074 | ||
|
|
96747187b4 | ||
|
|
0a37200fda | ||
|
|
e2c7d3b2d9 | ||
|
|
57ab8546fe | ||
|
|
f6147b7ac7 | ||
|
|
b48b076dac | ||
|
|
a5b44b3bc5 | ||
|
|
631e6a0d09 | ||
|
|
cca85566d3 | ||
|
|
a43b831965 | ||
|
|
ab0a78a498 | ||
|
|
7edcbeca1a | ||
|
|
b6336f730b | ||
|
|
d4b6b6c833 | ||
|
|
99c9410cc2 | ||
|
|
d88315d789 | ||
|
|
5df31c16f7 | ||
|
|
f34d14d901 | ||
|
|
857cf00caf | ||
|
|
aa438c7c3f | ||
|
|
fe50aeb130 | ||
|
|
db525524ee | ||
|
|
754b8082fb | ||
|
|
d945e9c72e | ||
|
|
836cc32d78 | ||
|
|
ec4ff6e811 | ||
|
|
ad32a3770b | ||
|
|
0a0d6536c2 | ||
|
|
f22d5c5624 | ||
|
|
a62e6b127a | ||
|
|
57880aed18 | ||
|
|
dfc7c9c00f | ||
|
|
cd10890258 | ||
|
|
4c07df6a21 | ||
|
|
c00be49d91 | ||
|
|
031e7fe113 | ||
|
|
7fd9827318 | ||
|
|
2be0777c98 | ||
|
|
421b6ce4ac | ||
|
|
d98c20466e | ||
|
|
1b3a21f197 | ||
|
|
0589decc43 | ||
|
|
624a932420 | ||
|
|
817f5bf0a6 | ||
|
|
d362f73af8 | ||
|
|
df593870ae | ||
|
|
8f1bf6033e | ||
|
|
e39cb41d6b | ||
|
|
7086547471 | ||
|
|
6c6cbe0821 | ||
|
|
f61b14584a | ||
|
|
dcfc9eb1a1 | ||
|
|
2eb9440095 | ||
|
|
75b632baad | ||
|
|
abe61e28fe | ||
|
|
eb5fcafa77 | ||
|
|
c8da79d785 | ||
|
|
780ddaf22b | ||
|
|
232532ba3b | ||
|
|
be99a65f2b | ||
|
|
fe8145c697 | ||
|
|
77b31de117 | ||
|
|
9b3b22d6b3 | ||
|
|
ffb6c6f5b4 | ||
|
|
51818346df | ||
|
|
e35ef3b83e | ||
|
|
453f3020c3 | ||
|
|
838e84fed9 | ||
|
|
1ddc9dc604 | ||
|
|
caa6eacf39 | ||
|
|
cf06faf09b | ||
|
|
900df8ecf9 | ||
|
|
49899c649c | ||
|
|
151686501d | ||
|
|
9ff8793666 | ||
|
|
cf23c289ec | ||
|
|
dee411149e | ||
|
|
33e730b3fa | ||
|
|
707ddba143 | ||
|
|
01586d6d67 | ||
|
|
ac6c6e36c3 | ||
|
|
7465ff97b3 | ||
|
|
41efe545f2 | ||
|
|
e1d2c83ff6 | ||
|
|
ecc8059a9e | ||
|
|
14c2319dcc | ||
|
|
38db845378 | ||
|
|
14f13ff55a | ||
|
|
aae063b9ad | ||
|
|
f654c4af7a | ||
|
|
ac8a6d180c | ||
|
|
18d0a08ace | ||
|
|
f013359a44 | ||
|
|
d373b331fa | ||
|
|
0066afe7fc | ||
|
|
bbc5c14d99 | ||
|
|
89b5a0fc25 | ||
|
|
56fbafe03a | ||
|
|
f9fb6f0be4 | ||
|
|
22348f2245 | ||
|
|
4a27b8f43d | ||
|
|
329e7bd2c8 | ||
|
|
8e1c31e860 | ||
|
|
fe2d2bd2a3 | ||
|
|
8a1324c141 | ||
|
|
60bf668281 | ||
|
|
d984f2ccec | ||
|
|
e5ebb83bd9 | ||
|
|
547241c13c | ||
|
|
1274cdf0af | ||
|
|
4f8acca153 | ||
|
|
79c727f014 | ||
|
|
100bb7c54c | ||
|
|
7ed0438b04 | ||
|
|
845ae8cf5a | ||
|
|
1ba701e036 | ||
|
|
56566ba3d0 | ||
|
|
a4e648627e | ||
|
|
90d15215af | ||
|
|
88d775e78e | ||
|
|
20dd538b65 | ||
|
|
4760fea489 | ||
|
|
49205dcce3 | ||
|
|
be141d9c5f | ||
|
|
37a607dce5 | ||
|
|
1c1c3925fc | ||
|
|
c6e7838a44 | ||
|
|
a336775ae6 | ||
|
|
94b900bd0a | ||
|
|
54b3c4d2c5 | ||
|
|
d3812a73d3 | ||
|
|
d6d17fe3f2 | ||
|
|
1372d04b43 | ||
|
|
b188ecf680 | ||
|
|
5ea4b463bb | ||
|
|
c156cef972 | ||
|
|
09340d48a0 | ||
|
|
40e788552c | ||
|
|
dc9cebe26c | ||
|
|
a5af903362 | ||
|
|
c0cc4701af | ||
|
|
87216cff63 | ||
|
|
5eee980499 | ||
|
|
772c0c3f93 | ||
|
|
437ba14521 | ||
|
|
7b48f7ac9e | ||
|
|
f52c68a510 | ||
|
|
a0c8fa5bbc | ||
|
|
89d0b75311 | ||
|
|
287ab1ffb0 | ||
|
|
a11961b0d3 | ||
|
|
bc563930f7 | ||
|
|
ef2ab31e88 | ||
|
|
cba4d59712 | ||
|
|
6002511052 | ||
|
|
baa537bfd5 | ||
|
|
2ba1edaa80 | ||
|
|
decdd8be9f | ||
|
|
15a42f1f35 | ||
|
|
32754e3b4c | ||
|
|
8a2714b35a | ||
|
|
e03162bf4b | ||
|
|
02971a7eb3 | ||
|
|
98b108a45c | ||
|
|
872aa536d8 | ||
|
|
92cb199e8c | ||
|
|
e96f0b5409 | ||
|
|
3c6a11eb0b | ||
|
|
4d44de7685 | ||
|
|
8c3475b902 | ||
|
|
f628d6d35d | ||
|
|
ea30ba4555 | ||
|
|
7957ec3186 | ||
|
|
d526cfc205 | ||
|
|
72a7eb6e35 | ||
|
|
02ea168f71 | ||
|
|
891913e182 | ||
|
|
2197c210e7 | ||
|
|
5a84a4e507 | ||
|
|
68a4c125c5 | ||
|
|
8f8e0dfad7 | ||
|
|
c67783bcd1 | ||
|
|
a0b583d8c8 | ||
|
|
cb1c177d49 | ||
|
|
2e4e9dbc6f | ||
|
|
5a76255297 | ||
|
|
1864e92ff4 | ||
|
|
58b52aa9fb | ||
|
|
cb7e87589c | ||
|
|
25d97ebbe4 | ||
|
|
a0b59783a2 | ||
|
|
2ebfc8ab73 | ||
|
|
5a80d587d5 | ||
|
|
45766dcb2e | ||
|
|
d4441e4353 | ||
|
|
11c2f634f3 | ||
|
|
7879bde8bb | ||
|
|
fdb1433c24 | ||
|
|
a81875b24b | ||
|
|
7d8b296943 | ||
|
|
6f03ed0b13 | ||
|
|
146a9507c6 | ||
|
|
81cdda842c | ||
|
|
5c29a7ef7d | ||
|
|
efa540e883 | ||
|
|
796b9dab74 | ||
|
|
d9a83481a5 | ||
|
|
181a39d752 | ||
|
|
ae0e3efb8e | ||
|
|
6a9bda806f | ||
|
|
fbc480fbed | ||
|
|
865eee2f6b | ||
|
|
5ea1c538b6 | ||
|
|
5e7d3c6aa9 | ||
|
|
2f29246c3f | ||
|
|
66ffa764dd | ||
|
|
b8d37e0d53 | ||
|
|
27fad0f19b | ||
|
|
61983a6799 | ||
|
|
28147c0930 | ||
|
|
1470b3da11 | ||
|
|
1c38661ff7 | ||
|
|
802ff1d012 | ||
|
|
c924a6cf00 | ||
|
|
1270e8a9f2 | ||
|
|
4b69d43f9f | ||
|
|
b5d67f226f | ||
|
|
25d84f72a9 | ||
|
|
78c20e02ee | ||
|
|
4b86ba6f6a | ||
|
|
cebb6cd537 | ||
|
|
ff6e0df0a5 | ||
|
|
511a3d3901 | ||
|
|
818c4a14e5 | ||
|
|
0bcc53c366 | ||
|
|
34e0b164eb | ||
|
|
06b8bd9382 | ||
|
|
d072178cef | ||
|
|
c7312d9d1c | ||
|
|
52f473d1c7 | ||
|
|
76def48f01 | ||
|
|
fa99402314 | ||
|
|
8d35649d90 | ||
|
|
7607b00952 | ||
|
|
6bde860043 | ||
|
|
0851848080 | ||
|
|
9642d03e2b | ||
|
|
ac335269b3 | ||
|
|
0a0bd4014c | ||
|
|
b7a6c761b3 | ||
|
|
67d6702c1f | ||
|
|
60d206c29d | ||
|
|
1b2e49be1c | ||
|
|
3316968266 | ||
|
|
8b75f2125a | ||
|
|
eece058f18 | ||
|
|
e7fcc33597 | ||
|
|
a3f7459963 | ||
|
|
e6d4708b5a | ||
|
|
bea8f6d7e5 | ||
|
|
69932758db | ||
|
|
347e59d604 | ||
|
|
7a7b5040e2 | ||
|
|
ff730b4eb0 | ||
|
|
43b81688f6 | ||
|
|
3f3b7665ca | ||
|
|
aff8d05040 | ||
|
|
3e31e116f3 | ||
|
|
afac2bf4de | ||
|
|
22eaceb17c | ||
|
|
01c2d25ae5 | ||
|
|
5939238655 | ||
|
|
2fab73983b | ||
|
|
5ed338dc2e | ||
|
|
8d3617b3de | ||
|
|
350e13679c | ||
|
|
58117f1312 | ||
|
|
0379b9cc69 | ||
|
|
59a4c923c4 | ||
|
|
12dfd5f016 | ||
|
|
9a3570a5b3 | ||
|
|
4bc1f73fd0 | ||
|
|
ee437de8d3 | ||
|
|
8bce5cb810 | ||
|
|
576192949d | ||
|
|
f306fbb2f0 | ||
|
|
43fb954234 | ||
|
|
01531369f7 | ||
|
|
9eb385d9ee | ||
|
|
331d6f98ee | ||
|
|
93d27b0b9f | ||
|
|
45e76609b0 | ||
|
|
e446f988f7 | ||
|
|
a5f5b52204 | ||
|
|
bfddb9a80f | ||
|
|
15c5f671f0 | ||
|
|
bfdce806c4 | ||
|
|
d4c07d9b66 | ||
|
|
34a98e3df0 | ||
|
|
9e380e2886 | ||
|
|
b2874f1200 | ||
|
|
faf2f9920e | ||
|
|
9e76d8a638 | ||
|
|
69084b0c57 | ||
|
|
910f350a26 | ||
|
|
ed3f1d315b | ||
|
|
8990eb06ec | ||
|
|
7bf1c7f005 | ||
|
|
2bdbc327d9 | ||
|
|
a27165f07e | ||
|
|
be0796ce14 | ||
|
|
81da1f1ab2 | ||
|
|
8ecd62e56f | ||
|
|
f81562ee7e | ||
|
|
c145a5cd7d | ||
|
|
8369525d8a | ||
|
|
0e798b4c51 | ||
|
|
b57752e67e | ||
|
|
3580179602 | ||
|
|
3cd88cbb6f | ||
|
|
cdfc4c8372 | ||
|
|
a7e464fee9 | ||
|
|
d3c89273e8 | ||
|
|
0197f20d47 | ||
|
|
eb313ebb5b | ||
|
|
cd49c2103b | ||
|
|
b124539507 | ||
|
|
0243f9b0e9 | ||
|
|
2c7e0c0257 | ||
|
|
8058bf3750 | ||
|
|
448aaa36f2 | ||
|
|
46154c25b5 | ||
|
|
54d2f9921f | ||
|
|
aac8503d83 | ||
|
|
15f1169102 | ||
|
|
d3d4ee6b39 | ||
|
|
550e8cd0cb | ||
|
|
12ecd0f3dc | ||
|
|
715bd21118 | ||
|
|
37a0e6ebef | ||
|
|
7918a790b4 | ||
|
|
2e1da4b4bc | ||
|
|
8c04b5fe9c | ||
|
|
9b45b9ce66 | ||
|
|
ddb4f45b02 | ||
|
|
fa24a0cec5 | ||
|
|
68b46bb943 | ||
|
|
f3d6bc9146 | ||
|
|
e592485395 | ||
|
|
a80f32254e | ||
|
|
375bc1352c | ||
|
|
e0b45e33ea | ||
|
|
a4882f1955 | ||
|
|
6294c7878e | ||
|
|
031f13ad11 | ||
|
|
5c9a08ce81 | ||
|
|
f6e717a5fd | ||
|
|
27d09ed514 | ||
|
|
8a7ddd102e | ||
|
|
95d76993c9 | ||
|
|
8bb41d2de5 | ||
|
|
1202631fa6 | ||
|
|
17e8c1d628 | ||
|
|
ad8b105b2c | ||
|
|
5b68e2ff50 | ||
|
|
79be98d2fb | ||
|
|
3e458a8801 | ||
|
|
9bcb5aaa55 | ||
|
|
acd28fa495 | ||
|
|
3794129c91 | ||
|
|
548611bedc | ||
|
|
5e57d099d7 | ||
|
|
07ed320110 | ||
|
|
a6df3e51d2 | ||
|
|
74b3ef3a3f | ||
|
|
468aac9750 | ||
|
|
a2d4d38e8a | ||
|
|
cfe581e2ab | ||
|
|
69b6e682cb | ||
|
|
5bb8416baf | ||
|
|
626da27ad6 | ||
|
|
4a1970a322 | ||
|
|
ba6bcdb469 | ||
|
|
460b4ee39f | ||
|
|
319094c7f8 | ||
|
|
54f847a85b | ||
|
|
ce1288e946 | ||
|
|
207bab5f79 | ||
|
|
f1373874ef | ||
|
|
ff72d9104d | ||
|
|
d87030972e | ||
|
|
6701c3b263 | ||
|
|
4100cca613 | ||
|
|
8484de86c7 | ||
|
|
45029f8c86 | ||
|
|
1a22482c09 | ||
|
|
df06eee5e8 | ||
|
|
c7edeb00a8 | ||
|
|
2a30564ed1 | ||
|
|
dbb64ec149 | ||
|
|
d38940ad57 | ||
|
|
9cd2d68505 | ||
|
|
b0913dc5a8 | ||
|
|
720648703b | ||
|
|
26a1762156 | ||
|
|
80ec11edcb | ||
|
|
3850227b46 | ||
|
|
7b95f09f86 | ||
|
|
979917144f | ||
|
|
920ac3f92e | ||
|
|
90bb48db5d | ||
|
|
8b195ba32a | ||
|
|
ebf858b9ae | ||
|
|
655cad58b2 | ||
|
|
20a885ff1d | ||
|
|
d8b83bdd00 | ||
|
|
61f3982ee8 | ||
|
|
f7530234c7 | ||
|
|
2ac579ca0a | ||
|
|
ceb0139329 | ||
|
|
2ad0d0200d | ||
|
|
9ccd3bde01 | ||
|
|
dbf027acb8 | ||
|
|
61fea2d82a | ||
|
|
082098ab67 | ||
|
|
094f097e26 | ||
|
|
3a8cdadcf5 | ||
|
|
d1b732cbcc | ||
|
|
9837d6cf69 | ||
|
|
299d41e3b9 | ||
|
|
d2b33397cc | ||
|
|
a3e9a36553 | ||
|
|
ca70d1f8a3 | ||
|
|
f8bc893972 | ||
|
|
99355ae8b2 | ||
|
|
505f784047 | ||
|
|
94a599d630 | ||
|
|
049d78a78d | ||
|
|
41f4ec5a3b | ||
|
|
aea6a8075b | ||
|
|
2306901e6e | ||
|
|
58577f57c6 | ||
|
|
09c447e2b8 | ||
|
|
6b2063a2ea | ||
|
|
7ea688aa43 | ||
|
|
32aae80a64 | ||
|
|
0bbefca875 | ||
|
|
93a3521a67 | ||
|
|
7f29928aec | ||
|
|
fcb1f211e3 | ||
|
|
c28a490c17 | ||
|
|
facf55cbc0 | ||
|
|
4f11185231 | ||
|
|
13e1b4edb1 | ||
|
|
6eb8766e59 | ||
|
|
d72c859bf9 | ||
|
|
2291e9fcfe | ||
|
|
b48e23757f | ||
|
|
be7f89f664 | ||
|
|
88758082d2 | ||
|
|
8462e99bc5 | ||
|
|
e25ea7f9dd | ||
|
|
3cf8e18cf6 | ||
|
|
b06cfd702d | ||
|
|
527b9e13fa | ||
|
|
bd95f5bf8f | ||
|
|
732099fa08 | ||
|
|
d69bac5565 | ||
|
|
7b4c3ec618 | ||
|
|
04bd8d7f7d | ||
|
|
e25664dfbf | ||
|
|
89042b0f97 | ||
|
|
083ee6c3c2 | ||
|
|
2c31469ec2 | ||
|
|
981185e42f | ||
|
|
a2a0b149b2 | ||
|
|
5375038d88 | ||
|
|
dd070e616d | ||
|
|
a307a51b46 | ||
|
|
390394b56b | ||
|
|
59eac5686f | ||
|
|
11199b9635 | ||
|
|
01caee5b53 | ||
|
|
5933f2107a | ||
|
|
64e9d9e2c3 | ||
|
|
0ed240e123 | ||
|
|
a65ae726ee | ||
|
|
913cd2ede4 | ||
|
|
4430b9475d | ||
|
|
d15261ac2a | ||
|
|
9cad88bdb8 | ||
|
|
20dbe0f3a7 | ||
|
|
0875e93716 | ||
|
|
e11c23a817 | ||
|
|
18d95114e0 | ||
|
|
135f200ea2 | ||
|
|
23c5f88f3e | ||
|
|
9c9fe7029e | ||
|
|
4d5336897e | ||
|
|
ac238a5362 | ||
|
|
5d188130e5 | ||
|
|
e2364f6285 | ||
|
|
40c31f701f | ||
|
|
385f1c856e | ||
|
|
a6e4720a4d | ||
|
|
3e005074a3 | ||
|
|
6e6f6bc387 | ||
|
|
975286302c | ||
|
|
3245377683 | ||
|
|
1b4656a4dc | ||
|
|
c3c6648c57 | ||
|
|
7f512eaf72 | ||
|
|
5c12d13b19 | ||
|
|
72159d4169 | ||
|
|
769cda1d1f | ||
|
|
876dee6435 | ||
|
|
26ed3fb372 | ||
|
|
760034b6b1 | ||
|
|
d6ddfa124d | ||
|
|
67c2932f34 | ||
|
|
38c58f9f1b | ||
|
|
97e97222ee | ||
|
|
b3bdcfda42 | ||
|
|
382f85fa39 | ||
|
|
53b6c91d18 | ||
|
|
1ef0f3b549 | ||
|
|
ea2412297d | ||
|
|
53ac6d352f | ||
|
|
43070412f7 | ||
|
|
c0911ea74b | ||
|
|
f5c8ee4742 | ||
|
|
92fbe56276 | ||
|
|
6f99876b6e | ||
|
|
810e85541c | ||
|
|
c35adbea91 | ||
|
|
7bbaf432e6 | ||
|
|
8cd1f962d3 | ||
|
|
7dc7502fe2 | ||
|
|
9d4b4df54f | ||
|
|
0ca58aba5e | ||
|
|
b17df207f2 | ||
|
|
09fb000e67 | ||
|
|
251e32948e | ||
|
|
b9f3f2d622 | ||
|
|
55b8a9acb9 | ||
|
|
bdf1717703 | ||
|
|
9782d85709 | ||
|
|
14ad70d3a0 | ||
|
|
76d6e9fd1a | ||
|
|
a9463a180d | ||
|
|
3f506714ec | ||
|
|
982496ffce | ||
|
|
a743ecaff9 | ||
|
|
8ef3313d63 | ||
|
|
91a712fdf0 | ||
|
|
5d0cb1437c | ||
|
|
17580f3013 | ||
|
|
47b0221b82 | ||
|
|
36442976c3 | ||
|
|
1748632144 | ||
|
|
e638e47af5 | ||
|
|
f5fa43d2fa | ||
|
|
674969665e | ||
|
|
6fabd36732 | ||
|
|
c3ad75191d | ||
|
|
8aa7da1be1 | ||
|
|
54b069f9ad | ||
|
|
9c586e7e92 | ||
|
|
8c516bec4f | ||
|
|
31032d3a62 | ||
|
|
830f63e86a | ||
|
|
0a4a9a35c3 | ||
|
|
961ffb1868 | ||
|
|
48d5650765 | ||
|
|
eb7aee5ae0 | ||
|
|
9c63cac54d | ||
|
|
090cdcf3b9 | ||
|
|
cc06fe7ae6 | ||
|
|
9177256726 | ||
|
|
8902256592 | ||
|
|
edbcefb811 | ||
|
|
24a1e0e24a | ||
|
|
b20d7ad086 | ||
|
|
840e496a51 | ||
|
|
100bcc2034 | ||
|
|
17c6ba04a2 | ||
|
|
d58174e77f | ||
|
|
62e6e03492 | ||
|
|
9b5383341d | ||
|
|
9b020fad53 | ||
|
|
374781da1a | ||
|
|
ecda895003 | ||
|
|
449fd372f9 | ||
|
|
b36a9f7e55 | ||
|
|
f27777af56 | ||
|
|
a7529b7b05 | ||
|
|
37aff9b107 | ||
|
|
7c6f59afa6 | ||
|
|
92fb9c8b94 | ||
|
|
4020a3ab8c | ||
|
|
40ad868f22 | ||
|
|
5a9116b697 | ||
|
|
d8df8474bc | ||
|
|
7058333f17 | ||
|
|
4af58e0925 | ||
|
|
48c06df5f5 | ||
|
|
916b13b286 | ||
|
|
0556f5fd4e | ||
|
|
60ad97c4fb | ||
|
|
3b1964e9df | ||
|
|
f7dbbf5810 | ||
|
|
9a3baf5609 | ||
|
|
7fa1f423e2 | ||
|
|
6c2e313155 | ||
|
|
441281dd4f | ||
|
|
6995cc0234 | ||
|
|
1ce295b683 | ||
|
|
82ed0156c5 | ||
|
|
436d7592c7 | ||
|
|
48f841bb26 | ||
|
|
5dfd5fa3e7 | ||
|
|
2cb12b4f4e | ||
|
|
af7d49103b | ||
|
|
b4afa964fc | ||
|
|
cec3ea5b4d | ||
|
|
90c8da2254 | ||
|
|
5d7bac2016 | ||
|
|
3281e44e84 | ||
|
|
2811145437 | ||
|
|
298ca8676f | ||
|
|
163cd8576b | ||
|
|
14a8f3dae3 | ||
|
|
14bbf766b0 | ||
|
|
ef899b7c09 | ||
|
|
2538a7e752 | ||
|
|
4c4e0c690c | ||
|
|
d0e7d0070d | ||
|
|
5baff9beda | ||
|
|
7d5f29dbd1 | ||
|
|
635516fbd4 | ||
|
|
c9b1027ef6 | ||
|
|
cb9fb66ccf | ||
|
|
2a0d8072c1 | ||
|
|
846d4e2210 | ||
|
|
7f4c3cda4d | ||
|
|
08866f1331 | ||
|
|
9a957ccc18 | ||
|
|
56b7c9e35f | ||
|
|
e246833daa | ||
|
|
b039538a27 | ||
|
|
5b3295db94 | ||
|
|
e15c2da1f4 | ||
|
|
22b41c7873 | ||
|
|
28d379dc7b | ||
|
|
560ba55572 | ||
|
|
f834644db4 | ||
|
|
06e7354d18 | ||
|
|
7701be2242 | ||
|
|
da51fea605 | ||
|
|
4a8ba9756f | ||
|
|
892d2b58ac | ||
|
|
9efe305093 | ||
|
|
e1a6453302 | ||
|
|
3d4cd0bbc0 | ||
|
|
69d2db0f1e | ||
|
|
1b09e37a80 | ||
|
|
c8fc262da3 | ||
|
|
fba8443f30 | ||
|
|
00ea112b66 | ||
|
|
9907f07602 | ||
|
|
28843a12c7 | ||
|
|
2ab1ad8b30 | ||
|
|
0b108908ed | ||
|
|
1b24253d8c | ||
|
|
e1ddac1590 | ||
|
|
68228f9977 | ||
|
|
87762d6cf3 | ||
|
|
c44d54fb4c | ||
|
|
26ef99293d | ||
|
|
385f47c0cd | ||
|
|
c4fcfcec88 | ||
|
|
26af513e1b | ||
|
|
932f6d1bef | ||
|
|
3f916efb64 | ||
|
|
7b1be8a2bd | ||
|
|
f767218107 | ||
|
|
ccf733ac95 | ||
|
|
b40ad7c83f | ||
|
|
045d480c8c | ||
|
|
7fed451226 | ||
|
|
de8dc4cddb | ||
|
|
af19aa5096 | ||
|
|
8a2d25247f | ||
|
|
36908fa304 | ||
|
|
144d7ca362 | ||
|
|
8c3e47c9de | ||
|
|
818f8252f6 | ||
|
|
758267254d | ||
|
|
59796a4168 | ||
|
|
f630d3f342 | ||
|
|
0f8682d2f0 | ||
|
|
28c2a949b2 | ||
|
|
204bcee951 | ||
|
|
68b7ae26b3 | ||
|
|
8d407cec90 | ||
|
|
871fb3831a | ||
|
|
d47e2f113f | ||
|
|
0f0ed8d716 | ||
|
|
74dbb1bce3 | ||
|
|
60c4d99407 | ||
|
|
9afa9ad15a | ||
|
|
ebbea9f560 | ||
|
|
92528205c1 | ||
|
|
adef37f0f4 | ||
|
|
504c0d6077 | ||
|
|
cc77d8cdd2 | ||
|
|
9b0bb2f72c | ||
|
|
9e4ae929a4 | ||
|
|
4e1afc148a | ||
|
|
b745234a52 | ||
|
|
300ed59598 | ||
|
|
8f10e37370 | ||
|
|
fcf8909c75 | ||
|
|
fbe8f6c774 | ||
|
|
6b0e4a1d7b | ||
|
|
801e06318f | ||
|
|
ebbd63811d | ||
|
|
fcf071b630 | ||
|
|
d117c0a742 | ||
|
|
cbd78a9bc0 | ||
|
|
04d7b08444 | ||
|
|
68ed555e91 | ||
|
|
4d9c6197fd | ||
|
|
155e1fa961 | ||
|
|
7fdd94fcbb | ||
|
|
1e32a4cec4 | ||
|
|
5d4d3b838b | ||
|
|
e35ff0533b | ||
|
|
8c36b9499d | ||
|
|
dec0d961f5 | ||
|
|
ffb4da791d | ||
|
|
290e1df893 | ||
|
|
b3e5c89ba9 | ||
|
|
d9753ee2c6 | ||
|
|
05ef1e0681 | ||
|
|
5e0ae9a429 | ||
|
|
015467778d | ||
|
|
a25c4bb59f | ||
|
|
4037019bb7 | ||
|
|
7a3b5c20dd | ||
|
|
5c42a31b9b | ||
|
|
ab20db8e6e | ||
|
|
75da1e4240 | ||
|
|
53e439bc99 | ||
|
|
1bbf3a3a0c | ||
|
|
a9b8bc067f | ||
|
|
859c8ffdb8 | ||
|
|
cd4fe63355 | ||
|
|
4ed67fbe7e | ||
|
|
b9586a4017 | ||
|
|
b57d227aa0 | ||
|
|
30633ff14f | ||
|
|
1cd95091f2 | ||
|
|
dc8c84a2a8 | ||
|
|
01d5f4d744 | ||
|
|
2ca9866f86 | ||
|
|
e27a3b65f1 | ||
|
|
1ca20196d0 | ||
|
|
95841a31d4 | ||
|
|
ae1313a35c | ||
|
|
668646f8f9 | ||
|
|
571410dd48 | ||
|
|
d09758f723 | ||
|
|
235a7ecd7f | ||
|
|
6ddc57c190 | ||
|
|
24b0fd5097 | ||
|
|
32e32cee5c | ||
|
|
61c7fa073b | ||
|
|
4c3f1386ef | ||
|
|
99a9a6572a | ||
|
|
e71213ba4f | ||
|
|
00174cdb83 | ||
|
|
9fcc3ed0e6 | ||
|
|
52f93ae45f | ||
|
|
36d343e931 | ||
|
|
87fb898864 | ||
|
|
ff0401a3c3 | ||
|
|
5936ab16c8 | ||
|
|
8e6cb1e1c2 | ||
|
|
bf09916496 | ||
|
|
74d234f8cd | ||
|
|
42a622c10f | ||
|
|
ef5a91a87a | ||
|
|
fde0e39abf | ||
|
|
6a1b16c72c | ||
|
|
9062338cb4 | ||
|
|
61b51f6149 | ||
|
|
386367c3d5 | ||
|
|
5bd188edad | ||
|
|
e2a535c3ce | ||
|
|
392b49c661 | ||
|
|
4885a68b9a | ||
|
|
0f33ca1249 | ||
|
|
820aa3d3b3 | ||
|
|
b0c844415d | ||
|
|
b79defd7a9 | ||
|
|
388eb36ecb | ||
|
|
c5a0b3734a | ||
|
|
437b32fe78 | ||
|
|
8d13880cab | ||
|
|
067f131b53 | ||
|
|
d0c47f3f2a | ||
|
|
159990132f | ||
|
|
a2b80d5b3d | ||
|
|
f4f1622528 | ||
|
|
2dccdd347f | ||
|
|
90f33fc7b3 | ||
|
|
acaa19054b | ||
|
|
1bcf94f7f4 | ||
|
|
18525922fd | ||
|
|
18082274ca | ||
|
|
7eab373922 | ||
|
|
0afcadcfd1 | ||
|
|
0bb3acef87 | ||
|
|
4b3b69ab15 |
44
.ctags.d/v.ctags
Normal file
44
.ctags.d/v.ctags
Normal file
@@ -0,0 +1,44 @@
|
||||
## TODO: support more precise struct/const/enum fields
|
||||
|
||||
--langdef=V
|
||||
--map-V=+.v
|
||||
--map-V=+.vv
|
||||
--map-V=+.vsh
|
||||
--kinddef-V=m,imodule,imported modules
|
||||
--kinddef-V=M,module,modules
|
||||
--kinddef-V=C,cfunction,cfunctions
|
||||
--kinddef-V=f,function,functions
|
||||
--kinddef-V=h,method,functions
|
||||
--kinddef-V=c,const,constants
|
||||
--kinddef-V=v,variable,variables
|
||||
--kinddef-V=s,struct,structs
|
||||
--kinddef-V=e,enum,enums
|
||||
--kinddef-V=i,interface,interfaces
|
||||
--kinddef-V=S,sfield,struct field
|
||||
--kinddef-V=E,efield,enum field
|
||||
--_roledef-V.m=imported,imported module
|
||||
--_roledef-V.M=declared,module declaration
|
||||
--regex-V=/^module[[:blank:]]+([0-9a-zA-Z]+)[[:blank:]]*$/\1/M/{_role=declared}{scope=push}
|
||||
--regex-V=/^import[[:blank:]]+(([0-9a-zA-Z]+)?|.*\.([a-zA-Z_][0-9a-zA-Z]+))[[:blank:]]*$/\2\3/m/{_role=imported}{scope=ref}
|
||||
--regex-V=/^[[:blank:]]*fn[[:blank:]]+C\.([a-zA-Z_][0-9a-zA-Z_]*)\(/C.\1/C/
|
||||
--regex-V=/^(pub)?[[:blank:]]*fn[[:blank:]]+([a-zA-Z_][0-9a-zA-Z_]*)\(/\2/f/
|
||||
--regex-V=/^(pub)?[[:blank:]]*fn[[:blank:]]+\(.*\)[[:blank:]]*([a-zA-Z_][0-9a-zA-Z_]*)\(/\2/h/
|
||||
--regex-V=/^(pub)?[[:blank:]]*struct[[:blank:]]+([a-zA-Z_][0-9a-zA-Z_]*)[[:blank:]]*\{/\2/s/{scope=push}
|
||||
--regex-V=/^(pub)?[[:blank:]]*enum[[:blank:]]+([a-zA-Z_][0-9a-zA-Z_]*)[[:blank:]]*\{/\2/e/{scope=push}
|
||||
--regex-V=/^(pub)?[[:blank:]]*interface[[:blank:]]+([a-zA-Z_][0-9a-zA-Z_]*)[[:blank:]]*\{/\2/i/{scope=push}
|
||||
--regex-V=/^[[:blank:]]*([a-zA-Z_][0-9a-zA-Z_]+)[[:blank:]]*(,)?[[:blank:]]*(\/\/.*)?$/\1/E/{scope=ref}
|
||||
--regex-V=/^[[:blank:]]*([a-zA-Z_][0-9a-zA-Z_]+)[[:blank:]]+\??\&?(\[[0-9]*\])?([a-zA-Z_][0-9a-zA-Z_.]+)[[:blank:]]*(\/\/.*)?$/\1/S/{scope=ref}
|
||||
--regex-V=/^[[:blank:]]*\}[[:blank:]]*$//{scope=pop}{placeholder}
|
||||
|
||||
## Variables:
|
||||
--regex-V=/^[[:blank:]]*(mut[[:blank:]]+)?([a-zA-Z_][0-9a-zA-Z_]+)[[:blank:]]*:=/\2/v/
|
||||
|
||||
## Consts:
|
||||
--regex-V=/^(pub)?[[:blank:]]*const[[:blank:]]+\([[:blank:]]*/const/c/{scope=push}
|
||||
##NB: the next variable regexp should work only inside const ( ), but currently works for ordinary assignments too:
|
||||
--regex-V=/^[[:blank:]]*([a-zA-Z_][0-9a-zA-Z_]+)[[:blank:]]*=/\1/v/{scope=ref}
|
||||
--regex-V=/^[[:blank:]]*\)[[:blank:]]*$//{scope=pop}{placeholder}
|
||||
|
||||
--extras=+q
|
||||
--extras=+r
|
||||
--fields=+r
|
||||
24
.editorconfig
Normal file
24
.editorconfig
Normal file
@@ -0,0 +1,24 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.v]
|
||||
indent_style = tab
|
||||
indent_size = 4
|
||||
|
||||
[*.{yml,yaml}]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.{txt,out}]
|
||||
insert_final_newline = false
|
||||
|
||||
[Makefile]
|
||||
indent_style = tab
|
||||
6
.gitattributes
vendored
6
.gitattributes
vendored
@@ -1,2 +1,4 @@
|
||||
*.v linguist-language=Go
|
||||
website/* linguist-vendored
|
||||
*.v linguist-language=V text=auto eol=lf
|
||||
*.vv linguist-language=V text=auto eol=lf
|
||||
*.bat text=auto eol=crlf
|
||||
Dockerfile.* linguist-language=Dockerfile
|
||||
|
||||
1
.github/FUNDING.yml
vendored
1
.github/FUNDING.yml
vendored
@@ -1,3 +1,4 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
patreon: vlang
|
||||
github: [medvednikov]
|
||||
|
||||
6
.github/ISSUE_TEMPLATE/bug-report-for-v.md
vendored
6
.github/ISSUE_TEMPLATE/bug-report-for-v.md
vendored
@@ -1,18 +1,18 @@
|
||||
---
|
||||
name: Bug report for V
|
||||
about: Please use the apropriate label when submitting an issue: bug/feature request/question.
|
||||
about: Please use the appropriate label when submitting an issue: bug/feature request/question.
|
||||
title: "New issue"
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
<!-- You can use `v doctor` to fill up the next fields -->
|
||||
|
||||
#### V version:
|
||||
|
||||
|
||||
#### OS:
|
||||
|
||||
|
||||
#### C Compiler:
|
||||
|
||||
|
||||
|
||||
6
.github/ISSUE_TEMPLATE/bug_report.md
vendored
6
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -2,11 +2,15 @@
|
||||
name: Bug report
|
||||
about: Bug report
|
||||
title: ''
|
||||
labels: bug
|
||||
labels: 'Bug'
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
<!-- Please make sure to run `v up` before reporting any issues as it may have already been fixed.
|
||||
It's also advisable to update all relvant modules using `v outdated` and `v install` -->
|
||||
|
||||
<!-- You can use `v doctor` to fill up the next fields -->
|
||||
**V version:**
|
||||
**OS:**
|
||||
|
||||
|
||||
2
.github/ISSUE_TEMPLATE/feature_request.md
vendored
2
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -2,7 +2,7 @@
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: feature request
|
||||
labels: 'Feature Request'
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
34
.github/PULL_REQUEST_TEMPLATE
vendored
34
.github/PULL_REQUEST_TEMPLATE
vendored
@@ -1,15 +1,41 @@
|
||||
Please title your PR as follows: `time: fix foo bar`. Always start with the thing you are fixing, then describe the fix.
|
||||
|
||||
|
||||
<!--
|
||||
|
||||
Please title your PR as follows: `time: fix foo bar`.
|
||||
Always start with the thing you are fixing, then describe the fix.
|
||||
Don't use past tense (e.g. "fixed foo bar").
|
||||
|
||||
Explain what your PR does and why.
|
||||
|
||||
Before submitting a PR, please run the tests with `make test`, and make sure V can still compile itself. Run this twice:
|
||||
If you are adding a new function, please document it and add tests:
|
||||
|
||||
./v -o v
|
||||
./v -o v
|
||||
```
|
||||
// foo does foo and bar
|
||||
fn foo() {
|
||||
|
||||
// file_test.v
|
||||
fn test_foo() {
|
||||
assert foo() == ...
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
If you are fixing a bug, please add a test that covers it.
|
||||
|
||||
Before submitting a PR, please:
|
||||
A) run the tests with `v test-compiler` .
|
||||
B) make sure, that V can still compile itself:
|
||||
```shell
|
||||
./v -o v cmd/v
|
||||
./v -o v cmd/v
|
||||
```
|
||||
See also `TESTS.md`.
|
||||
|
||||
I try to process PRs as soon as possible. They should be handled within 24 hours.
|
||||
|
||||
Applying labels to PRs is not needed.
|
||||
|
||||
Thanks a lot for your contribution!
|
||||
|
||||
-->
|
||||
|
||||
15
.github/workflows/alpine.build.sh
vendored
Executable file
15
.github/workflows/alpine.build.sh
vendored
Executable file
@@ -0,0 +1,15 @@
|
||||
#!/bin/sh -l
|
||||
|
||||
set -e
|
||||
|
||||
pwd
|
||||
|
||||
uname -a
|
||||
|
||||
make -j4
|
||||
|
||||
./v version
|
||||
|
||||
du -s .
|
||||
|
||||
echo "DONE"
|
||||
22
.github/workflows/alpine.test.sh
vendored
Executable file
22
.github/workflows/alpine.test.sh
vendored
Executable file
@@ -0,0 +1,22 @@
|
||||
#!/bin/sh -l
|
||||
|
||||
set -e
|
||||
|
||||
pwd
|
||||
|
||||
uname -a
|
||||
|
||||
du -s .
|
||||
|
||||
ls -lat
|
||||
|
||||
##./v test-compiler
|
||||
|
||||
## try running the known failing tests first to get faster feedback
|
||||
./v test vlib/builtin/string_test.v vlib/strings/builder_test.v
|
||||
|
||||
./v test-fixed
|
||||
|
||||
./v build-vbinaries
|
||||
|
||||
echo "DONE"
|
||||
153
.github/workflows/binary_artifact.yml
vendored
Normal file
153
.github/workflows/binary_artifact.yml
vendored
Normal file
@@ -0,0 +1,153 @@
|
||||
name: Build binary artifacts
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- weekly.**
|
||||
- 0.**
|
||||
|
||||
jobs:
|
||||
build-linux:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
compiler: [gcc]
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- name: Compile
|
||||
env:
|
||||
CC: ${{ matrix.compiler }}
|
||||
run: make && ./v -cc $CC -o v -prod cmd/v
|
||||
- name: Create artifact
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: linux
|
||||
path: |
|
||||
.
|
||||
!./.git
|
||||
!./vc
|
||||
!./v_old
|
||||
- name: Create binary only artifact
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: linux-binary
|
||||
path: ./v
|
||||
|
||||
build-macos:
|
||||
runs-on: macos-latest
|
||||
strategy:
|
||||
matrix:
|
||||
compiler: [clang]
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- name: Compile
|
||||
env:
|
||||
CC: ${{ matrix.compiler }}
|
||||
run: make && ./v -cc $CC -o v -prod cmd/v
|
||||
- name: Create artifact
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: macos
|
||||
path: |
|
||||
.
|
||||
!./.git
|
||||
!./vc
|
||||
!./v_old
|
||||
- name: Create binary only artifact
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: macos-binary
|
||||
path: ./v
|
||||
|
||||
build-windows:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: msys2/setup-msys2@v2
|
||||
- name: Compile
|
||||
run: ./make.bat
|
||||
- name: Create artifact
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: windows
|
||||
path: |
|
||||
.
|
||||
!./.git
|
||||
!./vc
|
||||
!./v_old
|
||||
- name: Create binary only artifact
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: windows-binary
|
||||
path: ./v.exe
|
||||
|
||||
release:
|
||||
name: Create Github Release
|
||||
needs: [build-linux, build-windows, build-macos]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Get short tag name
|
||||
uses: jungwinter/split@v1
|
||||
id: split
|
||||
with:
|
||||
msg: ${{ github.ref }}
|
||||
seperator: /
|
||||
- name: Create Release
|
||||
id: create_release
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
tag: ${{ steps.split.outputs._2 }}
|
||||
name: ${{ steps.split.outputs._2 }}
|
||||
commit: ${{ github.sha }}
|
||||
draft: false
|
||||
prerelease: false
|
||||
|
||||
publish:
|
||||
needs: [release]
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
version: [linux, macos, windows]
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- name: Fetch artifacts
|
||||
uses: actions/download-artifact@v1
|
||||
with:
|
||||
name: ${{ matrix.version }}
|
||||
path: ./${{ matrix.version }}
|
||||
- name: Build Zip Archives
|
||||
run: |
|
||||
mkdir -p workdir/
|
||||
mv ${{ matrix.version }}/ workdir/v/
|
||||
cd workdir/v/
|
||||
chmod 755 v || true
|
||||
chmod 755 v.exe || true
|
||||
chmod 755 thirdparty/tcc/tcc.exe || true
|
||||
cd ..
|
||||
zip -r9 --symlinks ../v_${{ matrix.version }}.zip v/*
|
||||
cd ..
|
||||
rm -rf workdir/
|
||||
- name: Get short tag name
|
||||
uses: jungwinter/split@v1
|
||||
id: split
|
||||
with:
|
||||
msg: ${{ github.ref }}
|
||||
seperator: /
|
||||
- name: Get release
|
||||
id: get_release_info
|
||||
uses: leahlundqvist/get-release@v1.3.1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
with:
|
||||
tag_name: ${{ steps.split.outputs._2 }}
|
||||
- name: Upload Release Asset
|
||||
id: upload-release-asset
|
||||
uses: actions/upload-release-asset@v1.0.1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ steps.get_release_info.outputs.upload_url }}
|
||||
asset_path: ./v_${{ matrix.version }}.zip
|
||||
asset_name: v_${{ matrix.version }}.zip
|
||||
asset_content_type: application/zip
|
||||
596
.github/workflows/ci.yml
vendored
Normal file
596
.github/workflows/ci.yml
vendored
Normal file
@@ -0,0 +1,596 @@
|
||||
name: CI
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- "**.md"
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- "**.md"
|
||||
|
||||
jobs:
|
||||
code-formatting:
|
||||
runs-on: ubuntu-18.04
|
||||
timeout-minutes: 30
|
||||
env:
|
||||
VFLAGS: -cc tcc
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Environment info
|
||||
run: echo $VFLAGS $GITHUB_SHA $GITHUB_REF
|
||||
- name: Build local v
|
||||
run: make -j4
|
||||
- name: v test-cleancode
|
||||
run: ./v -silent test-cleancode
|
||||
- name: v test-fmt
|
||||
run: ./v -silent test-fmt
|
||||
|
||||
# v-fmt:
|
||||
# runs-on: ubuntu-18.04
|
||||
# timeout-minutes: 30
|
||||
# steps:
|
||||
# - uses: actions/checkout@v2
|
||||
# - name: getting all branch metainfo from github
|
||||
# run: |
|
||||
# git fetch --no-tags --prune --depth=1 origin +refs/heads/*:refs/remotes/origin/*
|
||||
# echo "Changed files compared to origin/master are:" && git diff --name-status origin/master HEAD -- '*.v'
|
||||
# - name: Build v (there is no need for dependencies for fmt)
|
||||
# run: make -j4
|
||||
# - name: Build a production cmd/tools/vfmt
|
||||
# run: ./v -prod -d vfmt cmd/tools/vfmt.v
|
||||
# - name: Run v fmt -diff on only the changed files. Does NOT fail for now.
|
||||
# run: git diff --name-status origin/master HEAD -- '*.v' |grep -v '^D'|rev|cut -f1|rev| xargs ./v fmt -noerror -diff
|
||||
# - name: Run v test-fmt
|
||||
# run: echo "TODO" #./v test-fmt
|
||||
|
||||
performance-regressions:
|
||||
runs-on: ubuntu-18.04
|
||||
timeout-minutes: 30
|
||||
env:
|
||||
VFLAGS: -cc gcc
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Environment info
|
||||
run: echo $VFLAGS $GITHUB_SHA $GITHUB_REF
|
||||
- name: Build local v
|
||||
run: (make -j4)
|
||||
- name: Clone & Build vmaster/v
|
||||
run: |
|
||||
git clone --depth=1 https://github.com/vlang/v vmaster/
|
||||
(cd vmaster; make -j4)
|
||||
- name: V versions
|
||||
run: ./v version && ./vmaster/v version
|
||||
- name: Build the repeat tool
|
||||
run: ./v cmd/tools/repeat.v
|
||||
- name: Repeat -o hw.c examples/hello_world.v
|
||||
run: cmd/tools/repeat --max_time 150 --series 3 --count 15 --warmup 3 --fail_percent 10 './v -show-timings -o hw.c examples/hello_world.v' './vmaster/v -show-timings -o hw.c examples/hello_world.v'
|
||||
- name: Repeat -o v.c cmd/v
|
||||
run: cmd/tools/repeat --max_time 750 --series 3 --count 15 --warmup 3 --fail_percent 10 './v -show-timings -o v.c cmd/v' './vmaster/v -show-timings -o v.c cmd/v'
|
||||
|
||||
ubuntu-tcc:
|
||||
runs-on: ubuntu-18.04
|
||||
timeout-minutes: 30
|
||||
env:
|
||||
VFLAGS: -cc tcc -cflags -bt10
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo rm -f /etc/apt/sources.list.d/dotnetdev.list /etc/apt/sources.list.d/microsoft-prod.list; sudo apt-get update;
|
||||
sudo apt-get install --quiet -y libssl-dev sqlite3 libsqlite3-dev valgrind
|
||||
sudo apt-get install --quiet -y libglfw3 libglfw3-dev libfreetype6-dev libxi-dev libxcursor-dev libasound2-dev
|
||||
## sudo apt-get install --quiet -y libsdl2-dev libsdl2-ttf-dev libsdl2-mixer-dev libsdl2-image-dev
|
||||
- name: Build v
|
||||
run: |
|
||||
echo $VFLAGS
|
||||
sudo ln -s $PWD/thirdparty/tcc/tcc.exe /usr/local/bin/tcc ## TODO: remove
|
||||
make -j4
|
||||
./v -cg -cflags -Werror -o v cmd/v
|
||||
- name: Test v->c
|
||||
run: |
|
||||
thirdparty/tcc/tcc.exe -version
|
||||
./v -cg -o v cmd/v # Make sure vtcc can build itself twice
|
||||
# ./v -silent test-compiler
|
||||
- name: v self compilation
|
||||
run: ./v -o v2 cmd/v && ./v2 -o v3 cmd/v && ./v3 -o v4 cmd/v
|
||||
- name: Fixed tests
|
||||
run: ./v -silent test-fixed
|
||||
- name: Test building v tools
|
||||
run: ./v -silent build-tools
|
||||
- name: v doctor
|
||||
run: |
|
||||
./v doctor
|
||||
- name: Test v binaries
|
||||
run: ./v -silent build-vbinaries
|
||||
|
||||
# Alpine docker pre-built container
|
||||
alpine-docker-musl-gcc:
|
||||
name: alpine-musl
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 30
|
||||
container:
|
||||
image: thevlang/vlang:alpine-build
|
||||
env:
|
||||
V_CI_MUSL: 1
|
||||
VFLAGS: -cc gcc
|
||||
volumes:
|
||||
- ${{github.workspace}}:/opt/vlang
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Build V
|
||||
run: |
|
||||
make CC=clang
|
||||
- name: Test V fixed tests
|
||||
run: |
|
||||
v -silent test-fixed
|
||||
|
||||
macos:
|
||||
runs-on: macOS-latest
|
||||
timeout-minutes: 30
|
||||
env:
|
||||
VFLAGS: -cc clang
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: 12.x
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
##brew install libpq openssl freetype ### these are *already installed* on Catalina ...
|
||||
brew uninstall --ignore-dependencies libpq ## libpq is a dependency of PHP
|
||||
brew install postgresql
|
||||
brew install glfw
|
||||
## brew install sdl2 sdl2_ttf sdl2_mixer sdl2_image
|
||||
export LIBRARY_PATH="$LIBRARY_PATH:/usr/local/opt/openssl/lib/"
|
||||
- name: Build V
|
||||
run: make -j4 && ./v -cg -cflags -Werror -o v cmd/v
|
||||
- name: Build V using V
|
||||
run: ./v -o v2 cmd/v && ./v2 -o v3 cmd/v
|
||||
- name: v self with -usecache
|
||||
run: ./v -o v2 -usecache cmd/v
|
||||
- name: Test symlink
|
||||
run: ./v symlink
|
||||
# - name: Set up pg database
|
||||
# run: |
|
||||
# pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start
|
||||
# psql -d postgres -c 'select rolname from pg_roles'
|
||||
# psql -d postgres -c 'create database customerdb;'
|
||||
# psql -d customerdb -f examples/database/pg/mydb.sql
|
||||
# - name: Test v->c
|
||||
# run: ./v -silent test-compiler
|
||||
# - name: Test v binaries
|
||||
# run: ./v -silent build-vbinaries
|
||||
## - name: Test v->js
|
||||
## run: ./v -o hi.js examples/hello_v_js.v && node hi.js
|
||||
- name: Fixed tests
|
||||
run: VJOBS=1 ./v -silent test-fixed
|
||||
- name: Build examples
|
||||
run: ./v -silent build-examples
|
||||
- name: Build examples with -autofree
|
||||
run: |
|
||||
./v -autofree -experimental -o tetris examples/tetris/tetris.v
|
||||
- name: v doctor
|
||||
run: |
|
||||
./v doctor
|
||||
- name: Cross-compilation to Linux
|
||||
run: ./v -os linux cmd/v
|
||||
# - name: Test vsh
|
||||
# run: ./v examples/v_script.vsh
|
||||
- name: Test ved
|
||||
run: |
|
||||
git clone --depth 1 https://github.com/vlang/ved
|
||||
cd ved && ../v -o ved .
|
||||
# ../v -autofree .
|
||||
- name: Build V UI examples
|
||||
run: |
|
||||
git clone --depth 1 https://github.com/vlang/ui
|
||||
cd ui
|
||||
mkdir -p ~/.vmodules
|
||||
ln -s $(pwd) ~/.vmodules/ui
|
||||
../v examples/rectangles.v
|
||||
../v run examples/build_examples.vsh
|
||||
|
||||
ubuntu:
|
||||
runs-on: ubuntu-18.04
|
||||
timeout-minutes: 30
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: 12.x
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo rm -f /etc/apt/sources.list.d/dotnetdev.list /etc/apt/sources.list.d/microsoft-prod.list;
|
||||
sudo apt-get update;
|
||||
sudo apt-get install --quiet -y postgresql libpq-dev libssl-dev sqlite3 libsqlite3-dev valgrind
|
||||
sudo apt-get install --quiet -y libglfw3 libglfw3-dev libfreetype6-dev libxi-dev libxcursor-dev libasound2-dev
|
||||
## sudo apt-get install --quiet -y libsdl2-dev libsdl2-ttf-dev libsdl2-mixer-dev libsdl2-image-dev
|
||||
- name: Build V
|
||||
run: make -j4 && ./v -cc gcc -cg -cflags -Werror -o v cmd/v
|
||||
# - name: Test V
|
||||
# run: ./v -silent test-compiler
|
||||
# - name: Test v binaries
|
||||
# run: ./v -silent build-vbinaries
|
||||
## - name: Test v->js
|
||||
## run: ./v -o hi.js examples/hello_v_js.v && node hi.js
|
||||
# - name: Build Vorum
|
||||
# run: git clone --depth 1 https://github.com/vlang/vorum && cd vorum && ../v . && cd ..
|
||||
# - name: Build vpm
|
||||
# run: git clone --depth 1 https://github.com/vlang/vpm && cd vpm && ../v . && cd ..
|
||||
# - name: Freestanding
|
||||
# run: ./v -freestanding -o bare vlib/os/bare/bare_example_linux.v
|
||||
- name: v self compilation
|
||||
run: ./v -o v2 cmd/v && ./v2 -o v3 cmd/v && ./v3 -o v4 cmd/v
|
||||
- name: v self with -usecache
|
||||
run: ./v -o v2 -usecache cmd/v
|
||||
- name: Fixed tests
|
||||
run: |
|
||||
./v -silent test-fixed
|
||||
- name: Fixed tests (-prod)
|
||||
run: ./v -o vprod -prod cmd/v && ./vprod -silent test-fixed
|
||||
- name: Build examples
|
||||
run: ./v -silent build-examples
|
||||
- name: Build examples with -autofree
|
||||
run: |
|
||||
./v -autofree -experimental -o tetris examples/tetris/tetris.v
|
||||
- name: Build modules
|
||||
run: |
|
||||
./v build-module vlib/os
|
||||
./v build-module vlib/builtin
|
||||
./v build-module vlib/strconv
|
||||
./v build-module vlib/time
|
||||
./v build-module vlib/term
|
||||
./v build-module vlib/math
|
||||
./v build-module vlib/strings
|
||||
./v build-module vlib/v/token
|
||||
./v build-module vlib/v/ast
|
||||
./v build-module vlib/v/parser
|
||||
./v build-module vlib/v/gen
|
||||
./v build-module vlib/v/depgraph
|
||||
./v build-module vlib/os/cmdline
|
||||
- name: x64 machine code generation
|
||||
run: |
|
||||
exit
|
||||
./v -o vprod -prod cmd/v
|
||||
cd cmd/tools
|
||||
echo "Generating a 1m line V file..."
|
||||
../../vprod gen1m.v
|
||||
./gen1m > 1m.v
|
||||
echo "Building it..."
|
||||
../../vprod -backend x64 -o 1m 1m.v
|
||||
echo "Running it..."
|
||||
ls
|
||||
# - name: SDL examples
|
||||
# run: git clone --depth 1 https://github.com/vlang/sdl && cd sdl
|
||||
|
||||
# ./1m
|
||||
#run: echo "TODO" #cd examples/x64 && ../../v -x64 hello_world.v && ./hello_world
|
||||
# - name: Coveralls GitHub Action
|
||||
# uses: coverallsapp/github-action@v1.0.1
|
||||
# with:
|
||||
# github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
|
||||
# ubuntu-autofree-selfcompile:
|
||||
# runs-on: ubuntu-18.04
|
||||
# timeout-minutes: 30
|
||||
# env:
|
||||
# VFLAGS: -cc gcc
|
||||
# steps:
|
||||
# - uses: actions/checkout@v2
|
||||
# - name: Build V
|
||||
# run: make -j4
|
||||
# - name: V self compilation with -autofree
|
||||
# run: ./v -o v2 -autofree cmd/v && ./v2 -o v3 -autofree cmd/v && ./v3 -o v4 -autofree cmd/v
|
||||
|
||||
|
||||
# Ubuntu docker pre-built container
|
||||
ubuntu-musl:
|
||||
name: ubuntu-musl
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 30
|
||||
container:
|
||||
image: thevlang/vlang:ubuntu-build
|
||||
env:
|
||||
V_CI_MUSL: 1
|
||||
V_CI_UBUNTU_MUSL: 1
|
||||
VFLAGS: -cc musl-gcc
|
||||
volumes:
|
||||
- ${{github.workspace}}:/opt/vlang
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Build V
|
||||
run: |
|
||||
echo $VFLAGS && make -j4 && ./v -cg -o v cmd/v
|
||||
- name: Test V fixed tests
|
||||
run: |
|
||||
./v -silent test-fixed
|
||||
|
||||
# ubuntu-musl:
|
||||
# runs-on: ubuntu-18.04
|
||||
# timeout-minutes: 30
|
||||
# env:
|
||||
# VFLAGS: -cc musl-gcc
|
||||
# V_CI_MUSL: 1
|
||||
# steps:
|
||||
# - uses: actions/checkout@v2
|
||||
# - uses: actions/setup-node@v1
|
||||
# with:
|
||||
# node-version: 12.x
|
||||
# - name: Install dependencies
|
||||
# run: |
|
||||
# sudo rm -f /etc/apt/sources.list.d/dotnetdev.list /etc/apt/sources.list.d/microsoft-prod.list;
|
||||
# sudo apt-get update;
|
||||
# sudo apt-get install --quiet -y musl musl-tools libssl-dev sqlite3 libsqlite3-dev valgrind
|
||||
# sudo apt-get install --quiet -y libsdl2-dev libsdl2-ttf-dev libsdl2-mixer-dev libsdl2-image-dev
|
||||
# - name: Build v
|
||||
# run: echo $VFLAGS && make -j4 && ./v -cg -o v cmd/v
|
||||
# # - name: Test v binaries
|
||||
# # run: ./v -silent build-vbinaries
|
||||
# ## - name: Test v->js
|
||||
# ## run: ./v -o hi.js examples/hello_v_js.v && node hi.js
|
||||
# - name: quick debug
|
||||
# run: ./v -stats vlib/strconv/format_test.v
|
||||
# - name: Fixed tests
|
||||
# run: ./v -silent test-fixed
|
||||
|
||||
ubuntu-llvm-mingw:
|
||||
runs-on: ubuntu-18.04
|
||||
timeout-minutes: 30
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
# - name: Cross-compile V
|
||||
# run: docker build . -f Dockerfile.cross
|
||||
|
||||
windows-gcc:
|
||||
runs-on: windows-2019
|
||||
timeout-minutes: 30
|
||||
env:
|
||||
VFLAGS: -cc gcc
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
#- uses: actions/setup-node@v1
|
||||
# with:
|
||||
# node-version: 12.x
|
||||
- name: Build
|
||||
run: |
|
||||
gcc --version
|
||||
.\make.bat -gcc
|
||||
- name: Test new v.c
|
||||
run: .\v.exe -o v.c cmd/v && gcc -Werror -municode -w v.c
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
.\v.exe setup-freetype
|
||||
.\.github\workflows\windows-install-sqlite.bat
|
||||
## .\.github\workflows\windows-install-sdl.bat
|
||||
- name: Fixed tests
|
||||
run: |
|
||||
.\v.exe -silent test-fixed
|
||||
# - name: Test
|
||||
# run: |
|
||||
# .\v.exe -silent test-compiler
|
||||
## v.js dosent work on windows
|
||||
#.\v.exe -o hi.js examples/hello_v_js.v
|
||||
#node hi.js
|
||||
# - name: Test v binaries
|
||||
# run: ./v -silent build-vbinaries
|
||||
# - name: v2 self compilation
|
||||
# run: .\v.exe -o v2.exe cmd/v && .\v2.exe -o v3.exe cmd/v
|
||||
|
||||
windows-msvc:
|
||||
runs-on: windows-2019
|
||||
timeout-minutes: 30
|
||||
env:
|
||||
VFLAGS: -cc msvc
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
#- uses: actions/setup-node@v1
|
||||
# with:
|
||||
# node-version: 12.x
|
||||
- name: Build
|
||||
run: |
|
||||
echo %VFLAGS%
|
||||
echo $VFLAGS
|
||||
.\make.bat -msvc
|
||||
.\v.exe -cflags /WX self
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
.\v.exe setup-freetype
|
||||
.\.github\workflows\windows-install-sqlite.bat
|
||||
## .\.github\workflows\windows-install-sdl.bat
|
||||
- name: Fixed tests
|
||||
run: |
|
||||
./v -cg cmd\tools\vtest-fixed.v
|
||||
./v -silent test-fixed
|
||||
- name: v doctor
|
||||
run: |
|
||||
./v doctor
|
||||
# - name: Test
|
||||
# run: |
|
||||
# .\v.exe -silent test-compiler
|
||||
# ## v.js dosent work on windows
|
||||
#.\v.exe -o hi.js examples/hello_v_js.v
|
||||
#node hi.js
|
||||
# - name: Test v binaries
|
||||
# run: ./v -silent build-vbinaries
|
||||
|
||||
windows-tcc:
|
||||
runs-on: windows-2019
|
||||
timeout-minutes: 30
|
||||
# We are simulating a user with no cc installed.
|
||||
# This way, v's cc detection on Windows is also tested.
|
||||
# env:
|
||||
# VFLAGS: -cc tcc
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
#- uses: actions/setup-node@v1
|
||||
# with:
|
||||
# node-version: 12.x
|
||||
- name: Build
|
||||
# We need to move gcc and msvc, so that V can't find an existing C compiler and downloads tcc
|
||||
run: |
|
||||
'for /f "usebackq tokens=*" %i in (`where gcc.exe`) do move /Y "%i" "%i.old"' | cmd
|
||||
'for /f "usebackq tokens=*" %i in (`where vswhere.exe`) do move /Y "%i" "%i.old"' | cmd
|
||||
move "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe.old"
|
||||
.\make.bat
|
||||
- name: Test new v.c
|
||||
run: .\v.exe -o v.c cmd/v && .\thirdparty\tcc\tcc.exe -Werror -w -ladvapi32 -bt10 v.c
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
.\v.exe setup-freetype
|
||||
.\.github\workflows\windows-install-sqlite.bat
|
||||
## .\.github\workflows\windows-install-sdl.bat
|
||||
- name: Fixed tests
|
||||
run: |
|
||||
.\v.exe -silent test-fixed
|
||||
# - name: Test
|
||||
# run: |
|
||||
# .\v.exe -silent test-compiler
|
||||
## v.js dosent work on windows
|
||||
#.\v.exe -o hi.js examples/hello_v_js.v
|
||||
#node hi.js
|
||||
# - name: Test v binaries
|
||||
# run: ./v -silent build-vbinaries
|
||||
# - name: v2 self compilation
|
||||
# run: .\v.exe -o v2.exe cmd/v && .\v2.exe -o v3.exe cmd/v
|
||||
|
||||
|
||||
compilable-v-c-and-v-win-c:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 30
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo rm -f /etc/apt/sources.list.d/dotnetdev.list /etc/apt/sources.list.d/microsoft-prod.list
|
||||
sudo apt-get update
|
||||
sudo apt install --quiet -y mingw-w64 wine-stable winetricks
|
||||
- name: Build V
|
||||
run: make -j4
|
||||
- name: v.c can be compiled and run
|
||||
run: |
|
||||
./v -os cross -o /tmp/v.c cmd/v
|
||||
gcc -g -std=gnu11 -w -o v_from_vc /tmp/v.c -lm -lpthread
|
||||
ls -lart v_from_vc
|
||||
./v_from_vc version
|
||||
- name: v_win.c can be compiled and run
|
||||
run: |
|
||||
./v -os windows -o /tmp/v_win.c cmd/v
|
||||
x86_64-w64-mingw32-gcc /tmp/v_win.c -std=c99 -w -municode -o v_from_vc.exe
|
||||
ls -lart v_from_vc.exe
|
||||
winetricks nocrashdialog
|
||||
wine v_from_vc.exe version
|
||||
|
||||
|
||||
ubuntu-c-plus-plus:
|
||||
runs-on: ubuntu-18.04
|
||||
timeout-minutes: 30
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo rm -f /etc/apt/sources.list.d/dotnetdev.list /etc/apt/sources.list.d/microsoft-prod.list;
|
||||
sudo apt-get update;
|
||||
sudo apt-get install --quiet -y postgresql libpq-dev libssl-dev sqlite3 libsqlite3-dev
|
||||
sudo apt-get install --quiet -y libglfw3 libglfw3-dev libfreetype6-dev libxi-dev libxcursor-dev libasound2-dev
|
||||
sudo apt-get install --quiet -y valgrind g++-9
|
||||
## sudo apt-get install --quiet -y libsdl2-dev libsdl2-ttf-dev libsdl2-mixer-dev libsdl2-image-dev
|
||||
- name: Build V
|
||||
run: make -j4
|
||||
- name: g++ version
|
||||
run: g++-9 --version
|
||||
- name: V self compilation with g++
|
||||
run: ./v -cc g++-9 -o v2 cmd/v && ./v2 -cc g++-9 -o v3 cmd/v
|
||||
## - name: Running tests with g++
|
||||
## run: ./v -cc g++-9 -silent test-fixed
|
||||
|
||||
install-modules:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 30
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Install dependencies
|
||||
run: sudo apt-get install --quiet -y libssl-dev
|
||||
- name: Build V
|
||||
run: make -j4
|
||||
- name: Installing V modules
|
||||
run: |
|
||||
./v install ui
|
||||
./v install nedpals.args
|
||||
|
||||
gitly-compiles:
|
||||
runs-on: ubuntu-18.04
|
||||
timeout-minutes: 30
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Install dependencies
|
||||
run: sudo apt-get install --quiet -y libssl-dev sqlite3 libsqlite3-dev
|
||||
- name: Build V
|
||||
run: make -j2 && ./v -cc gcc -o v cmd/v
|
||||
- name: Install markdown
|
||||
run: ./v install markdown
|
||||
- name: Build Gitly
|
||||
run: |
|
||||
git clone --depth 1 https://github.com/vlang/gitly
|
||||
cd gitly
|
||||
../v .
|
||||
cd ..
|
||||
|
||||
websocket_autobahn:
|
||||
name: Autobahn integrations tests
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 30
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Run autobahn services
|
||||
run: docker-compose -f ${{github.workspace}}/vlib/x/websocket/tests/autobahn/docker-compose.yml up -d
|
||||
- name: Build client test
|
||||
run: docker exec autobahn_client "/src/v" "/src/vlib/x/websocket/tests/autobahn/autobahn_client.v"
|
||||
- name: Run client test
|
||||
run: docker exec autobahn_client "/src/vlib/x/websocket/tests/autobahn/autobahn_client"
|
||||
- name: Build client wss test
|
||||
run: docker exec autobahn_client "/src/v" "/src/vlib/x/websocket/tests/autobahn/autobahn_client_wss.v"
|
||||
- name: Run client wss test
|
||||
run: docker exec autobahn_client "/src/vlib/x/websocket/tests/autobahn/autobahn_client_wss"
|
||||
- name: Run server test
|
||||
run: docker exec autobahn_server "wstest" "-m" "fuzzingclient" "-s" "/config/fuzzingclient.json"
|
||||
- name: Copy reports
|
||||
run: docker cp autobahn_server:/reports ${{github.workspace}}/reports
|
||||
- name: Copy reports wss
|
||||
run: docker cp autobahn_server_wss:/reports ${{github.workspace}}/reports_wss
|
||||
- name: Test success
|
||||
run: docker exec autobahn_server "python" "/check_results.py"
|
||||
- name: Test success WSS
|
||||
run: docker exec autobahn_server_wss "python" "/check_results.py"
|
||||
|
||||
- name: Publish all reports
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: full report
|
||||
path: ${{github.workspace}}/reports
|
||||
- name: Publish report client
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: client
|
||||
path: ${{github.workspace}}/reports/clients/index.html
|
||||
- name: Publish report server
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: server
|
||||
path: ${{github.workspace}}/reports/servers/index.html
|
||||
- name: Publish all reports WSS
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: full report wss
|
||||
path: ${{github.workspace}}/reports_wss
|
||||
- name: Publish report client wss
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: client wss
|
||||
path: ${{github.workspace}}/reports_wss/clients/index.html
|
||||
16
.github/workflows/docs_ci.yml
vendored
Normal file
16
.github/workflows/docs_ci.yml
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
name: Docs CI
|
||||
|
||||
### Run on *EVERY* commit. The documentation *SHOULD* stay valid, and
|
||||
### the developers should receive early warning if they break it.
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
check-markdown:
|
||||
runs-on: ubuntu-18.04
|
||||
timeout-minutes: 5
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Build V
|
||||
run: make
|
||||
- name: Check markdown line length & code examples
|
||||
run: ./v run cmd/tools/check-md.v -all
|
||||
58
.github/workflows/periodic.yml
vendored
Normal file
58
.github/workflows/periodic.yml
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
name: Periodic
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '31 1,12 * * *'
|
||||
|
||||
jobs:
|
||||
network-tests-ubuntu:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 30
|
||||
env:
|
||||
V_CI_PERIODIC: 1
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Install dependencies
|
||||
run: sudo apt-get install --quiet -y libssl-dev sqlite3 libsqlite3-dev valgrind
|
||||
- name: Build v
|
||||
run: make -j4
|
||||
- name: Symlink V
|
||||
run: sudo ./v symlink
|
||||
- name: Run network tests
|
||||
run: ./v -d network -silent test-fixed
|
||||
|
||||
|
||||
network-tests-macos:
|
||||
runs-on: macOS-latest
|
||||
timeout-minutes: 30
|
||||
env:
|
||||
V_CI_PERIODIC: 1
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Setup openssl library path
|
||||
run: export LIBRARY_PATH="$LIBRARY_PATH:/usr/local/opt/openssl/lib/"
|
||||
- name: Build V
|
||||
run: make -j4
|
||||
- name: Symlink V
|
||||
run: sudo ./v symlink
|
||||
- name: Ensure thirdparty/cJSON/cJSON.o is compiled, before running tests.
|
||||
run: ./v examples/json.v
|
||||
- name: Run network tests
|
||||
run: ./v -d network -silent test-fixed
|
||||
|
||||
|
||||
network-windows-msvc:
|
||||
runs-on: windows-2019
|
||||
timeout-minutes: 30
|
||||
env:
|
||||
V_CI_PERIODIC: 1
|
||||
VFLAGS: -cc msvc
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Build
|
||||
run: |
|
||||
echo %VFLAGS%
|
||||
echo $VFLAGS
|
||||
.\make.bat -msvc
|
||||
- name: Run network tests
|
||||
run: .\v.exe -d network -silent test-fixed
|
||||
56
.github/workflows/prebuilt.yml
vendored
Normal file
56
.github/workflows/prebuilt.yml
vendored
Normal file
@@ -0,0 +1,56 @@
|
||||
name: Test prebuilt binaries
|
||||
on:
|
||||
release:
|
||||
types: [edited, published]
|
||||
jobs:
|
||||
ubuntu:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
steps:
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install --quiet -y postgresql libpq-dev libglfw3 libglfw3-dev libfreetype6-dev libssl-dev sqlite3 libsqlite3-dev valgrind
|
||||
## sudo apt-get install --quiet -y libsdl2-dev libsdl2-ttf-dev libsdl2-mixer-dev libsdl2-image-dev
|
||||
- name: Download V
|
||||
run: |
|
||||
tag=${GITHUB_REF##*/}
|
||||
wget https://github.com/vlang/v/releases/download/$tag/v_linux.zip
|
||||
unzip v_linux.zip
|
||||
./v -version
|
||||
- name: Test V
|
||||
run: |
|
||||
./v run examples/hello_world.v
|
||||
|
||||
macos:
|
||||
runs-on: macOS-latest
|
||||
timeout-minutes: 5
|
||||
steps:
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
brew install freetype glfw openssl
|
||||
# brew install sdl2 sdl2_ttf sdl2_mixer sdl2_image
|
||||
export LIBRARY_PATH="$LIBRARY_PATH:/usr/local/opt/openssl/lib/"
|
||||
- name: Download V
|
||||
run: |
|
||||
tag=${GITHUB_REF##*/}
|
||||
wget https://github.com/vlang/v/releases/download/$tag/v_macos.zip
|
||||
unzip v_macos.zip
|
||||
./v -version
|
||||
- name: Test V
|
||||
run: |
|
||||
./v run examples/hello_world.v
|
||||
|
||||
windows:
|
||||
runs-on: windows-latest
|
||||
timeout-minutes: 5
|
||||
steps:
|
||||
- name: Download V
|
||||
run: |
|
||||
Set-Variable -Name "tag" -Value $env:GITHUB_REF.split("/", 3)[-1]
|
||||
& curl -L https://github.com/vlang/v/releases/download/$tag/v_windows.zip -o v_windows.zip
|
||||
& unzip .\v_windows.zip
|
||||
& .\v.exe -version
|
||||
- name: Test V
|
||||
run: |
|
||||
& .\v.exe run .\examples\hello_world.v
|
||||
16
.github/workflows/windows-install-sdl.bat
vendored
Normal file
16
.github/workflows/windows-install-sdl.bat
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
@echo off
|
||||
|
||||
curl -L https://www.libsdl.org/release/SDL2-devel-2.0.10-VC.zip -o SDL2.zip
|
||||
curl -L https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-devel-2.0.15-VC.zip -o SDL2_ttf.zip
|
||||
curl -L https://www.libsdl.org/projects/SDL_image/release/SDL2_image-devel-2.0.5-VC.zip -o SDL2_image.zip
|
||||
curl -L https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-devel-2.0.4-VC.zip -o SDL2_mixer.zip
|
||||
|
||||
unzip SDL2.zip -d thirdparty/
|
||||
unzip SDL2_ttf.zip -d thirdparty/
|
||||
unzip SDL2_image.zip -d thirdparty/
|
||||
unzip SDL2_mixer.zip -d thirdparty/
|
||||
|
||||
move /y thirdparty/SDL2-2.0.10 thirdparty/SDL2
|
||||
move /y thirdparty/SDL2_ttf-2.0.15 thirdparty/SDL2_ttf
|
||||
move /y thirdparty/SDL2_image-2.0.5 thirdparty/SDL2_image
|
||||
move /y thirdparty/SDL2_mixer-2.0.4 thirdparty/SDL2_mixer
|
||||
12
.github/workflows/windows-install-sqlite.bat
vendored
Normal file
12
.github/workflows/windows-install-sqlite.bat
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
@echo off
|
||||
|
||||
curl -L https://www.sqlite.org/2020/sqlite-amalgamation-3320300.zip -o sqlite-amalgamation-3320300.zip
|
||||
|
||||
unzip sqlite-amalgamation-3320300.zip -d thirdparty\
|
||||
|
||||
del thirdparty\sqlite-amalgamation-3320300\shell.c
|
||||
|
||||
move /y thirdparty\sqlite-amalgamation-3320300 thirdparty\sqlite
|
||||
|
||||
dir thirdparty\sqlite
|
||||
|
||||
78
.gitignore
vendored
78
.gitignore
vendored
@@ -1,2 +1,78 @@
|
||||
# ignore all build binaries
|
||||
*
|
||||
!*/
|
||||
!*.*
|
||||
*.exe
|
||||
*.o
|
||||
*.so
|
||||
.*.c
|
||||
*.tmp.c
|
||||
*.obj
|
||||
*.exp
|
||||
*.ilk
|
||||
*.pdb
|
||||
*.dll
|
||||
*.lib
|
||||
*.bak
|
||||
a.out
|
||||
.noprefix.vrepl_temp
|
||||
|
||||
# ignore v build files
|
||||
/vc
|
||||
/v.c
|
||||
/v.*.c
|
||||
/v.c.out
|
||||
.vrepl_temp.v
|
||||
fns.txt
|
||||
.noprefix.vrepl_temp.v
|
||||
|
||||
# ignore temp directories
|
||||
/temp
|
||||
/tmp
|
||||
|
||||
# unignore special files without extension
|
||||
!.github/PULL_REQUEST_TEMPLATE
|
||||
!.editorconfig
|
||||
!.gitattributes
|
||||
!.gitignore
|
||||
!BSDmakefile
|
||||
!Dockerfile
|
||||
!Dockerfile.alpine
|
||||
!Dockerfile.cross
|
||||
!LICENSE
|
||||
!Makefile
|
||||
|
||||
# ignore editor files
|
||||
.idea
|
||||
.project
|
||||
.classpath
|
||||
.c9
|
||||
*.launch
|
||||
.settings/
|
||||
*.sublime-workspace
|
||||
.vscode/
|
||||
*.code-workspace
|
||||
*~
|
||||
*.swp
|
||||
*.swo
|
||||
*.swn
|
||||
.env
|
||||
|
||||
# ignore debugger files
|
||||
cachegrind.out.*
|
||||
.gdb_history
|
||||
*.dSYM
|
||||
*_test
|
||||
*.def
|
||||
|
||||
# ignore system files
|
||||
.DS_Store
|
||||
._*
|
||||
thumbs.db
|
||||
/.symlink
|
||||
/.bin
|
||||
|
||||
_docs
|
||||
|
||||
# ignore vs databases
|
||||
*.suo
|
||||
*.VC.db
|
||||
|
||||
44
.travis.yml
44
.travis.yml
@@ -1,44 +0,0 @@
|
||||
language: c
|
||||
matrix:
|
||||
include:
|
||||
- os: linux
|
||||
dist: xenial
|
||||
sudo: required
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- gcc-5
|
||||
- g++-5
|
||||
- make
|
||||
- libglfw3
|
||||
- libglfw3-dev
|
||||
- libfreetype6-dev
|
||||
- libcurl3-dev
|
||||
- os: windows
|
||||
language: sh
|
||||
filter_secrets: false
|
||||
- os: osx
|
||||
osx_image: xcode10.2
|
||||
addons:
|
||||
homebrew:
|
||||
packages:
|
||||
- freetype
|
||||
- glfw
|
||||
#env:
|
||||
# - MATRIX_EVAL="brew install freetype glfw"
|
||||
script:
|
||||
- |
|
||||
if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then
|
||||
sudo unlink /usr/bin/gcc && sudo ln -s /usr/bin/gcc-5 /usr/bin/gcc
|
||||
fi
|
||||
- |
|
||||
if [[ "${TRAVIS_OS_NAME}" == "windows" ]]; then
|
||||
choco install make
|
||||
cp "C:\\ProgramData\\chocolatey\\bin\\gcc.exe" "C:\\ProgramData\\chocolatey\\bin\\cc.exe"
|
||||
fi
|
||||
- export VROOT=$(pwd)
|
||||
- make
|
||||
- make test
|
||||
|
||||
27
0.3_roadmap.txt
Normal file
27
0.3_roadmap.txt
Normal file
@@ -0,0 +1,27 @@
|
||||
- = TODO
|
||||
+ = done
|
||||
|
||||
- make `-autofree` the default
|
||||
- coroutines
|
||||
+ channels
|
||||
+ lock{}
|
||||
+ thread safe arrays
|
||||
- thread safe maps
|
||||
- C2V translator
|
||||
- doom.v
|
||||
- rune type, replace `ustring` with `[]rune`, fix `byte.str()`
|
||||
- maps with non-string keys
|
||||
+ iOS/Android support
|
||||
- parallel parser (and maybe checker/gen?)
|
||||
- `recover()` from panics
|
||||
+ IO streams
|
||||
+ struct embedding
|
||||
- interface embedding
|
||||
- interfaces: allow struct fields (not just methods)
|
||||
- vfmt: fix common errors automatically to save time (make vars mutable and vice versa, add missing imports etc)
|
||||
- method expressions with an explicit receiver as the first argument
|
||||
+ short generics syntax (`foo(5)` instead of `foo<int>(5)`)
|
||||
- fix all remaining generics issues
|
||||
- merge v.c and v_win.c
|
||||
- more advanced errors, not just `error('message')`
|
||||
- VLS for autocomplete, refactoring, go to definition etc
|
||||
8
BSDmakefile
Normal file
8
BSDmakefile
Normal file
@@ -0,0 +1,8 @@
|
||||
CC ?= cc
|
||||
|
||||
all:
|
||||
rm -rf vc/
|
||||
git clone --depth 1 --quiet https://github.com/vlang/vc
|
||||
$(CC) -std=gnu11 -w -o v vc/v.c -lm -lexecinfo
|
||||
rm -rf vc/
|
||||
@echo "V has been successfully built"
|
||||
376
CHANGELOG.md
376
CHANGELOG.md
@@ -1,10 +1,380 @@
|
||||
## V 0.1.30
|
||||
*28 Nov 2020*
|
||||
(V 0.2 RC)
|
||||
TODO
|
||||
|
||||
# 0.1.8
|
||||
## V 0.1.27
|
||||
*5 May 2020*
|
||||
|
||||
- vfmt has been re-written from scratch using the new AST parser.
|
||||
It's much faster, cleaner, and can format
|
||||
files with compilation errors.
|
||||
- `strconv`, `sprintf`, and `printf` in native V, without any libc calls.
|
||||
- Interfaces are now a lot more stable and have all expected features.
|
||||
- Lots of x64 backend improvements: function calls, if expressions, for loops, local variables.
|
||||
- `map()` and `filter()` methods can now be chained.
|
||||
- New `[]int{cap:cap, len:len}` syntax for initializing array length and capacity.
|
||||
- New `is` keyword for checking the type of sum types and interfaces.
|
||||
- `as` can now be used to cast interfaces and sum types.
|
||||
- Profiling with `-profile`. Prints a nice table with details about every single function call:
|
||||
number of calls, average time per call, total time per function
|
||||
- `import(xxx)` syntax has been removed in favor of `import xxx` for simplicity and greppability.
|
||||
- Lots of fixes and improvements in the type checker.
|
||||
- `time.StopWatch`
|
||||
- `dl` module for dynamic loading.
|
||||
- Automatic `str()` method generation for every single type, including all arrays.
|
||||
- Short struct initialization syntax for imitating named function args: `foo(bar:0, baz:1)`.
|
||||
- New operator `!in`.
|
||||
- Performance improvements in critical parts of the builtin data structures (array, map).
|
||||
- High order functions improvements (functions can now be returned etc).
|
||||
- Anonymous functions that can be defined inside other functions.
|
||||
- Built-in JSON module is back.
|
||||
- Closures.
|
||||
- Lots and lots of new tests added, including output tests that test error messages.
|
||||
- Multiple errors are now printed, the compiler no longer stops after the first error.
|
||||
- The new JS backend using the AST parser (almost complete).
|
||||
- Variadic functions.
|
||||
- `net.websocket` module (early stage).
|
||||
- `vlib` is now memory leak free, lots of `autofree` improvements.
|
||||
- Simplified and cleaned up `cmd/v`, `v.builder`.
|
||||
- V UI was updated to work with the new backend.
|
||||
|
||||
|
||||
## V 0.1.25
|
||||
*1 Apr 2020*
|
||||
|
||||
- The entire compiler has been re-written with an AST parser.
|
||||
The code is now a lot cleaner and more maintainable.
|
||||
~15k lines of old compiler code were removed.
|
||||
|
||||
## V 0.1.24
|
||||
*31 Dec 2019*
|
||||
|
||||
- A new parser/generator built on top of an AST that simplifies code greatly
|
||||
and allows to implement new backends much faster.
|
||||
- Sum types (`type Expr = IfExpr | MatchExpr | IntegerLiteral`).
|
||||
- B-tree map (sped up the V compiler by ~10%).
|
||||
- `v fmt -w`.
|
||||
- The entire code base has been formatted with vfmt.
|
||||
- Generic structs.
|
||||
- SDL module.
|
||||
- Arrays of pointers.
|
||||
- os: `is_link()`, `is_dir()`, `exists()`.
|
||||
- Ranging through fixed size arrays.
|
||||
- Lots of fixes in ORM and vweb.
|
||||
- The first tutorial: [building a simple web application with vweb](https://github.com/vlang/v/blob/master/tutorials/building-a-simple-web-blog-with-vweb.md)
|
||||
- Match expressions now must be exhaustive.
|
||||
- freestanding: `malloc()`/`free()`.
|
||||
- `++` is now required instead of `+= 1` for consistency.
|
||||
- Interpolated strings now allow function calls: `println('val = $get_val()')`.
|
||||
- `string.replace_each([])` for an efficient replacement of multiple values.
|
||||
- More utf8 helper functions.
|
||||
- `-prealloc` option for block allocations.
|
||||
- `type` aliases.
|
||||
- Running `v` with an unknown command will result in an error.
|
||||
- `atof` implementation in pure V.
|
||||
- Enums can now have negative values.
|
||||
- New `filepath` module.
|
||||
- `math.factorial`.
|
||||
- `ftp` module.
|
||||
- New syntax for casting: `val as Type`.
|
||||
- Fewer libc functions used (soon V will have no dependency on libc).
|
||||
|
||||
|
||||
## V 0.1.23
|
||||
*30 Nov 2019*
|
||||
|
||||
- [Direct x64 machine code generation](https://github.com/vlang/v/issues/2849).
|
||||
Hello world being built in 3 milliseconds.
|
||||
- Bare metal support via the `-freestanding` flag, to build programs without linking to libc.
|
||||
- Prebuilt V packages for Linux, macOS, and Windows.
|
||||
- `string.index()` now returns `?int` instead of `int/-1`.
|
||||
- Lots of fixes in Generics.
|
||||
- vweb framework for developing web applications is back.
|
||||
- Vorum, the forum/blogging software written in vweb, can now be compiled and has been added to CI.
|
||||
- REPL, `v up` have been split up into separate applications to keep the core V compiler small.
|
||||
- V now enforces short enum syntax (`.green` instead of `Color.green`) when it's enough.
|
||||
- V UI for macOS.
|
||||
- Interfaces have been rewritten. `[]interface` support.
|
||||
- `os.cp()` for copying files and directores.
|
||||
- Additional compile-time flags: `$if clang, msvc, mingw, x32, x64, big_endian, little_endian {`.
|
||||
- All C functions now have to be declared, all missing C functions have been defined.
|
||||
- Global variables (only with the `--enable-globals` flag)
|
||||
for low level applications like kernels and drivers.
|
||||
- Nothing can be cast to bool (previously code like `if bool(1) {` worked).
|
||||
- `<<` and `>>` now work with all integer types.
|
||||
- V detects Cygwin and shows an error (V supports Windows natively).
|
||||
- Improved type checking of some operators (`%, |, &` etc).
|
||||
- Windows 7 support.
|
||||
- `println(true)` now prints `true` instead of `1`.
|
||||
- `os.exec()` now uses `CreateProcess` on Windows.
|
||||
- fast.vlang.io website for monitoring the performance of V after every commit.
|
||||
- On Windows Visual Studio is now used automatically if GCC is not installed.
|
||||
- vfmt!
|
||||
- Lots of cleaning up in the compiler code.
|
||||
- Multi-level pointers in unsafe code (`****int`).
|
||||
- MSVC backtrace.
|
||||
- `$if os {` blocks are now skipped on a different OS.
|
||||
- C string literals (`c'hello'`).
|
||||
- AlpineLinux/musl fixes + added to CI.
|
||||
- Inline assembly.
|
||||
- Clipboard module (Windows, macOS, X).
|
||||
- `foo()?` syntax for error propagation.
|
||||
- Docs have been migrated from HTML to `doc/docs.md`.
|
||||
- `eventbus` module.
|
||||
- Haiku OS support.
|
||||
- `malloc/free` on bare metal.
|
||||
- `utf8` helper functions (`to_lower()`, `to_upper()`, etc).
|
||||
- Optimization of `for c in str {`.
|
||||
- `string/array.left/right/slice/substr` were removed (use `[a..b]` slicing syntax instead).
|
||||
|
||||
|
||||
|
||||
## V 0.1.22
|
||||
*28 Oct 2019*
|
||||
|
||||
- Generic functions (`fn foo<T>(bar T) T {`) with varargs support.
|
||||
- `array[start..end]` and `string[start..end]` slicing syntax.
|
||||
- Optimized `array.filter()` and `array.map()`.
|
||||
- `sqlite` module.
|
||||
- Cached modules for faster compilation.
|
||||
- Dramatic compilation optimizations: [V now compiles itself in 0.10 - 0.30 seconds](https://github.com/vlang/v/wiki/The-V-language-now-compiles-itself-in-0.09-seconds)
|
||||
- V scripts (simpler and cross-platform alternative to Bash).
|
||||
- Infinite multi-dimensional arrays (`[][][]int`).
|
||||
- `unsafe`.
|
||||
- `[deprecated]` attribute.
|
||||
- `[if]` function attributes for compile time function exclusion for performance.
|
||||
- `switch` has been completely removed from the language and replaced by
|
||||
`match` everywhere.
|
||||
- `pub struct` and `pub const`, previously all structs and consts were public
|
||||
by default.
|
||||
- `musl` support (V can now run on, for example, Alpine Linux).
|
||||
- Module header generation. V now supports closed source modules, which are still
|
||||
used in some industries.
|
||||
- Constants were added to typo suggestions.
|
||||
- `color in [.green, .red, .blue]` now works without specifying `Color.green`.
|
||||
- V compiler is now a module that can be used by other programs.
|
||||
- Backtraces now have source lines on Linux.
|
||||
- `runtime.nr_cpus()`.
|
||||
- `fn init()` for module initialization.
|
||||
- `a in [1, 2, 3]` optimization: no array gets allocated.
|
||||
- Raw strings: `s := r'hello\nworld'`.
|
||||
- `if a := func() { }` syntax for handling optionals.
|
||||
- f32/f64 comparison now uses machine epsilon by default.
|
||||
|
||||
|
||||
## V 0.1.21
|
||||
*30 Sep 2019*
|
||||
|
||||
- `none` keyword for optionals.
|
||||
- Solaris support.
|
||||
- All table lookup functions now use `none`.
|
||||
- varargs: `fn foo(bar int, params ...string) {`.
|
||||
- Double quotes (`"`) can now also be used to denote strings.
|
||||
- GitHub Actions CI in addition to Travis.
|
||||
- `-compress` option. The V binary built with `-compress` is only ~90 KB!
|
||||
- More memory management.
|
||||
- Unused modules result in an error.
|
||||
- "Unused variable/module" errors are now warnings in non-production builds.
|
||||
- Duplicate methods with the same name can no longer be defined.
|
||||
- Struct names must be capitalized, variable/function names must use snake_case.
|
||||
- Error messages are now even nicer!
|
||||
- Lots of fixes in automatic `.str()` method generation for structs and arrays.
|
||||
- ~30% faster parser (files are no longer parsed separately for each pass).
|
||||
- `_` is no longer a variable, but an actual syntax construct to skip unused values, like in Go.
|
||||
- Multiple returns (`fn foo() (int, string) {`).
|
||||
- `!` can now only be used with booleans.
|
||||
|
||||
|
||||
## V 0.1.20
|
||||
*17 Sep 2019*
|
||||
|
||||
- JavaScript backend!
|
||||
- Hundreds of C warnings were fixed. `gcc v.c` now builds without
|
||||
any warnings.
|
||||
- The mutability check now applies to function args (mutable
|
||||
receivers that are not modified result in a compilation error).
|
||||
- V tests now show how long each test took.
|
||||
- Official Android support (only console applications via Termux for now).
|
||||
- Typo check. If a variable/function/module etc is misspelled,
|
||||
V will suggest the correct name.
|
||||
- Lots of Microsoft C fixes, and a separate Travis instance for
|
||||
this backend.
|
||||
- Bitwise operators `|`, `^`, `&` no longer work with booleans.
|
||||
|
||||
|
||||
## V 0.1.19
|
||||
*12 Sep 2019*
|
||||
|
||||
- Lots of refactoring, simplifications, and optimizations in the compiler.
|
||||
- Experimental memory management at compilation (only for the V compiler itself for now).
|
||||
- Lots of ORM fixes.
|
||||
- Functions can now be inlined via the `[inline]` attribute.
|
||||
- New `mysql` module.
|
||||
- Better error format that is supported by all major editors (go to error).
|
||||
- Error messages now point to the actual place where the error happened.
|
||||
- Custom json field names: `struct User { last_name string [json:lastName] }`.
|
||||
- Raw json fields via the `[raw]` attribute.
|
||||
- All C code was removed from the `freetype` module.
|
||||
- `gg` module can now render all Unicode characters.
|
||||
- `[typedef]` attribute for imported C struct typedefs.
|
||||
- Support of Objective C interfaces (primarily for using Cocoa).
|
||||
- REPL: clear command and custom functions.
|
||||
- REPL tests (which are also used for testing certain compiler errors).
|
||||
- Syntax bug fixed: `foo[0] += 10` is now possible.
|
||||
- http: support plain HTTP protocol and follow redirects.
|
||||
- http: header data is now processed correctly.
|
||||
- net: basic UDP support.
|
||||
- `import const` was removed from the language.
|
||||
- `array.contains()` was removed from the language (`in` should be used instead).
|
||||
- `[0; len]` syntax was removed (replaced with a simpler `[0].repeat(len)`)
|
||||
- Primitive aliases were removed to simplify the language.
|
||||
- GitHub supports V now!
|
||||
- Backtraces are now printed on panics.
|
||||
- A new awesome `readline` module.
|
||||
- V.c is now regenerated automatically after every commit.
|
||||
- A bug with struct ordering was fixed, now structs can be declared in any order.
|
||||
- V modules can now be built with `v build module`.
|
||||
- `@FILE, @LINE, @FN, @COLUMN` for debugging.
|
||||
|
||||
|
||||
## V 0.1.18
|
||||
*16 Aug 2019*
|
||||
|
||||
- Built-in ORM (`uk_customers = db.select from Customer where country == 'uk' && nr_orders > 0`).
|
||||
- Map initialization syntax: `m := { ‘foo’: ‘bar’, ‘baz’: ‘foo’ }`.
|
||||
- `map.delete(key)`.
|
||||
- `libcurl` dependency was removed from the `http` module.
|
||||
- All function arguments are now immutable by default (previously they could be
|
||||
modifed inside the function).
|
||||
- `http` functions now return optionals.
|
||||
- `sync.WaitGroup`.
|
||||
- `vweb` static files serving.
|
||||
- `crypto.rand` module.
|
||||
- `v up` to update V.
|
||||
- SChannel support on Windows.
|
||||
- `net.urllib` module.
|
||||
- vpm package manager, `v install`.
|
||||
- `()` are now required in complex bool expressions: `(a && b) || c` instead of `a && b || c`.
|
||||
- All arrays now have a default `.str()` method.
|
||||
- Bootstrapping V with MSVC.
|
||||
- Experimental `≠` etc support.
|
||||
- `encoding.csv` module.
|
||||
- `$if debug {` for running code in debug mode only.
|
||||
- Map struct fields are now initialized automatically, just like arrays.
|
||||
- Maps now support array values.
|
||||
- `json` functions can no longer be used if the `json` module is not imported.
|
||||
|
||||
|
||||
## V 0.1.17
|
||||
*29 Jul 2019*
|
||||
- `vweb` module for developing web apps in V.
|
||||
- vtalk, open source V forum software.
|
||||
- Generics (very limited right now, but they will be gradually improved).
|
||||
- Comptime codegen (`foo.$method()` where `method` is a string).
|
||||
- @ for escaping keywords (e.g. `struct Foo { @type string }`).
|
||||
- Windows Unicode fixes (V can now work with non-ASCII paths etc on Windows).
|
||||
- Fix mutable args bugs + don't allow primitive arguments to be modified.
|
||||
- Declaring a mutable variable and never modifying it results in a compilation error.
|
||||
- Interactive debugging support.
|
||||
- `sync` module for Windows.
|
||||
- `#!` support on Unix systems (V scripts).
|
||||
- Lots of Visual Studio fixes.
|
||||
- `crypto.aes` and `crypto.rc4` modules.
|
||||
- Internal modules.
|
||||
|
||||
|
||||
## V 0.1.16
|
||||
*23 Jul 2019*
|
||||
- V can now be used with Visual Studio!
|
||||
- Hot code reloading now works with graphical applications (e.g. graph.v, bounce.v).
|
||||
- Compile time memory management for arrays.
|
||||
- High order functions.
|
||||
- `match` expression (replacing `switch`).
|
||||
- Import cycle detection.
|
||||
- `crypto/md5`, `crypto/sha256`, and `crypro/sha512` modules.
|
||||
- `os.executable()` - a cross platform function that returns full path to current executable.
|
||||
- `~/.vlang` and `VROOT` were removed entirely. The installation is a lot cleaner now.
|
||||
- V can now be packaged for all Linux distros.
|
||||
- Arch Linux package.
|
||||
- `string(bytes_buffer, len)`, `string(bytes_array)` casts.
|
||||
- Multiple `defer`s.
|
||||
- `key in map` syntax (replacing `map.exists(key)`).
|
||||
|
||||
|
||||
## V 0.1.15
|
||||
*15 Jul 2019*
|
||||
- FreeBSD, OpenBSD, NetBSD, DragonFly support.
|
||||
- Hot reloading now works with graphical applications: [bounce.v](examples/hot_reload/bounce.v)
|
||||
- VROOT was removed, the installation process is now much simpler.
|
||||
- `defer` statement.
|
||||
- map.v was re-written. It's now much faster.
|
||||
- `for key, val in map` syntax.
|
||||
- `flag` module for parsing command line arguments.
|
||||
- `zip` module.
|
||||
- `crypto/sha1` module.
|
||||
- Submodules and module aliases (`import encoding.base64 as b64`).
|
||||
|
||||
|
||||
## V 0.1.14
|
||||
*12 Jul 2019*
|
||||
- `gg` module Windows support, V Tetris runs on Windows.
|
||||
- Compile `glad` and `cJSON` only once. Programs using `gg` or `json` compile a bit faster.
|
||||
- `v.c` has been cleaned up and minimized (~16k => ~10k lines of code).
|
||||
- `type` aliases can now have methods.
|
||||
- Const overflow check during compilation (`byte(1000)` will no longer compile).
|
||||
|
||||
|
||||
## V 0.1.13
|
||||
*10 Jul 2019*
|
||||
- New enum syntax (`token == .name`), enum values are no longer global consts.
|
||||
- Submodules (`import encoding.base64`).
|
||||
- Hot code reloading.
|
||||
- Special `err` variable for getting error values.
|
||||
- Complex numbers.
|
||||
- `<<` can now append arrays (`numbers << [1, 2, 3]`).
|
||||
- Lots of Windows fixes (Windows still needs some work).
|
||||
- Lots of REPL improvements (e.g. `>> 2 + 3` works now, no `println` required).
|
||||
- The website was made easily translatable, it's now partially available in several languages.
|
||||
|
||||
|
||||
## V 0.1.12
|
||||
*4 Jul 2019*
|
||||
- V can finally compile itself on Windows (https://github.com/vlang/v#mingw-w64).
|
||||
- `os` module now uses optionals in all functions that return `File`.
|
||||
- Lots of bugs with optionals were fixed.
|
||||
- `println` was optimized. It no longer results in allocations.
|
||||
Now it also works correctly with all integer types.
|
||||
- Lots of `vfmt` fixes, it will be enabled tomorrow.
|
||||
- New `strings` module.
|
||||
- Lots of other fixes and improvements, thanks to all the contributors.
|
||||
|
||||
|
||||
## V 0.1.11
|
||||
*1 Jul 2019*
|
||||
- Cross compilation for Windows!
|
||||
- Lots of Windows fixes.
|
||||
- socket.v.
|
||||
- maps fixed.
|
||||
|
||||
|
||||
## V 0.1.9 - 0.1.10
|
||||
*29 Jun 2019*
|
||||
- Windows support via MinGW-w64. Pre-built Windows binary.
|
||||
- File structure has been simplified: all vlib modules were moved to the vlib/ directory,
|
||||
makefile was moved to the root.
|
||||
- One single archive with pre-built binaries for all operating systems.
|
||||
- `mut var := val` was fixed (previously `mut var = val` was allowed as well).
|
||||
|
||||
|
||||
## V 0.1.8
|
||||
*28 Jun 2019*
|
||||
- Single file programs without `fn main` now work as expected.
|
||||
- REPL has been fixed: it now supports imports, consts, function definitions, etc.
|
||||
- REPL has been fixed: it now supports imports, consts, function definitions, etc.
|
||||
|
||||
# 0.1.7
|
||||
|
||||
## V 0.1.7
|
||||
*27 Jun 2019*
|
||||
- All C code in the compiler and vlib has been replaced with V.
|
||||
- `#` syntax for embedding C code has been removed.
|
||||
- Exported functions now need to be marked with `pub`, all public vlib functions have been updated.
|
||||
|
||||
@@ -1 +1,4 @@
|
||||
# Code of Conduct
|
||||
|
||||
Be nice and respectful.
|
||||
|
||||
167
CONTRIBUTING.md
Normal file
167
CONTRIBUTING.md
Normal file
@@ -0,0 +1,167 @@
|
||||
## Code Structure
|
||||
|
||||
I tried to make the code of the compiler and vlib as simple and readable as
|
||||
possible. One of V's goals is to be open to developers with different levels
|
||||
of experience in compiler development. Compilers don't need to be black boxes
|
||||
full of magic that only few people understand.
|
||||
|
||||
The V compiler is modular, and can be used by other applications. It is located
|
||||
in `cmd/v/` and `vlib/v/`.
|
||||
|
||||
The most important and useful command to remember when working on the V compiler
|
||||
is `v self`.
|
||||
It rebuilds the V compiler.
|
||||
|
||||
Be careful, if you introduce a breaking change and rebuild V, you will no longer
|
||||
be able to use V to build itself. So it's a good idea to make a backup copy of a
|
||||
working compiler executable.
|
||||
|
||||
But don't worry, you can always simply run `make` (or `make.bat`), it will
|
||||
download the C version of the compiler and rebuild it from scratch.
|
||||
|
||||
The architecture of the compiler is very simple and has three distinct steps:
|
||||
|
||||
Parse/generate AST (`v.parser`) => Check types (`v.checker`)
|
||||
=> Generate C/JavaScript/machine code (`v.gen`)
|
||||
|
||||
|
||||
The main files are:
|
||||
|
||||
1. `cmd/v/v.v` The entry point.
|
||||
|
||||
- V figures out the build mode.
|
||||
- Constructs the compiler object (`struct V`).
|
||||
- Creates a list of .v files that need to be parsed.
|
||||
- Creates a parser object for each file and runs `parse()` on them.
|
||||
- The correct backend is called (C, JS, x64), and a binary is compiled.
|
||||
|
||||
2. `v/scanner` The scanner's job is to parse a list of characters and convert
|
||||
them to tokens.
|
||||
|
||||
3. `v/token` This is simply a list of all tokens, their string values, and a
|
||||
couple of helper functions.
|
||||
|
||||
4. `v/parser` The parser. It converts a list of tokens into an AST.
|
||||
In V, objects can be used before declaration, so unknown types are marked as
|
||||
unresolved. They are resolved later in the type checker.
|
||||
|
||||
5. `v/table` V creates one table object that is shared by all parsers. It
|
||||
contains all types, consts, and functions, as well as several helpers to search
|
||||
for objects by name, register new objects, modify types' fields, etc.
|
||||
|
||||
6. `v/checker` Type checker and resolver. It processes the AST and makes sure
|
||||
the types are correct. Unresolved types are resolved, type information is added
|
||||
to the AST.
|
||||
|
||||
7. `v/gen` C backend. It simply walks the AST and generates C code that can be
|
||||
compiled with Clang, GCC, Visual Studio, and TCC.
|
||||
|
||||
8. `json.v` defines the json code generation. This file will be removed once V
|
||||
supports comptime code generation, and it will be possible to do this using the
|
||||
language's tools.
|
||||
|
||||
9. `v/gen/x64` is the directory with all the machine code generation logic. It
|
||||
defines a set of functions that translate assembly instructions to machine code
|
||||
and build the binary from scratch byte by byte. It manually builds all headers,
|
||||
segments, sections, symtable, relocations, etc. Right now it only has basic
|
||||
support of the x64 platform/ELF format.
|
||||
|
||||
The rest of the directories are vlib modules: `builtin/` (strings, arrays,
|
||||
maps), `time/`, `os/`, etc. Their documentation is pretty clear.
|
||||
|
||||
## Example Workflow for Contributing
|
||||
(provided by [@spytheman](https://github.com/spytheman))
|
||||
|
||||
(If you don't already have a GitHub account, please create one. Your GitHub
|
||||
username will be referred to later as 'YOUR_GITHUB_USERNAME'. Change it
|
||||
accordingly in the steps below.)
|
||||
|
||||
1. Fork https://github.com/vlang/v using GitHub's interface to your own account.
|
||||
Let's say that the forked repository is at
|
||||
`https://github.com/YOUR_GITHUB_USERNAME/v` .
|
||||
2. Clone the main v repository https://github.com/vlang/v to a local folder on
|
||||
your computer, say named nv/ (`git clone https://github.com/vlang/v nv`)
|
||||
3. `cd nv`
|
||||
4. `git remote add pullrequest https://github.com/YOUR_GITHUB_USERNAME/v`
|
||||
NB: the remote named `pullrequest` should point to YOUR own forked repo, not the
|
||||
main v repository! After this, your local cloned repository is prepared for
|
||||
making pullrequests, and you can just do normal git operations such as:
|
||||
`git pull` `git status` and so on.
|
||||
|
||||
5. When finished with a feature/bugfix/change, you can:
|
||||
`git checkout -b fix_alabala`
|
||||
6. `git push pullrequest` # (NOTE: the `pullrequest` remote was setup on step 4)
|
||||
7. On GitHub's web interface, go to: https://github.com/vlang/v/pulls
|
||||
|
||||
Here the UI shows a dialog with a button to make a new pull request based on
|
||||
the new pushed branch.
|
||||
(Example dialog: https://url4e.com/gyazo/images/364edc04.png)
|
||||
|
||||
8. After making your pullrequest (aka, PR), you can continue to work on the
|
||||
branch `fix_alabala` ... just do again `git push pullrequest` when you have more
|
||||
commits.
|
||||
|
||||
9. If there are merge conflicts, or a branch lags too much behind V's master,
|
||||
you can do the following:
|
||||
|
||||
1. `git pull --rebase origin master` # solve conflicts and do
|
||||
`git rebase --continue`
|
||||
2. `git push pullrequest -f` # this will overwrite your current remote branch
|
||||
with the updated version of your changes.
|
||||
|
||||
The point of doing the above steps, is to never directly push to the main V
|
||||
repository, *only to your own fork*. Since your local `master` branch tracks the
|
||||
main V repository's master, then `git checkout master`, as well as
|
||||
`git pull --rebase origin master` will continue to work as expected
|
||||
(these are actually used by `v up`) and git can always do it cleanly.
|
||||
|
||||
Git is very flexible, so there are other ways to accomplish the same thing.
|
||||
See the [GitHub flow](https://guides.github.com/introduction/git-handbook/#github), for more information.
|
||||
|
||||
## Using Github's hub CLI tool
|
||||
|
||||
You can download the `hub` tool from https://hub.github.com/ . Using
|
||||
`hub`, you will not need to go through the (sometimes) slow website
|
||||
to make PRs. Most remote operations can be done through the `hub` CLI
|
||||
command.
|
||||
|
||||
NB: You still need to have a GitHub account.
|
||||
|
||||
### Preparation:
|
||||
(steps 1..3 need to be done just *once*):
|
||||
|
||||
1. `hub clone vlang/v my_v`
|
||||
2. `cd my_v`
|
||||
3. `hub fork --remote-name pullrequest`
|
||||
|
||||
4. `git checkout -b my_cool_feature` # Step 4 is better done *once per each new
|
||||
feature/bugfix* that you make.
|
||||
|
||||
### Improve V by making commits:
|
||||
|
||||
5. `git commit -am "math: add a new function copysign"`
|
||||
|
||||
### Testing your commits locally:
|
||||
You can test locally whether your changes have not broken something by
|
||||
running: `v test-compiler`. See `TESTS.md` for more details.
|
||||
|
||||
### Publishing your commits to GitHub:
|
||||
|
||||
6. `git push pullrequest`
|
||||
|
||||
### Making a PR with `hub`:
|
||||
(so that your changes can be merged to the main V repository)
|
||||
|
||||
7. `hub pull-request`
|
||||
|
||||
Optionally, you can track the status of your PR CI tests with:
|
||||
|
||||
8. `hub ci-status --verbose`
|
||||
|
||||
### Fixing failing tests:
|
||||
If everything is OK, after 5-10 minutes, the CI tests should pass for
|
||||
all platforms. If not, visit the URLs for the failing CI jobs, see
|
||||
which tests have failed and then fix them by making more changes. Just use
|
||||
`git push pullrequest` to publish your changes. The CI tests will
|
||||
run with your updated code. Use `hub ci-status --verbose` to monitor
|
||||
their status.
|
||||
@@ -1,39 +0,0 @@
|
||||
## Code Structure
|
||||
|
||||
I tried making the code of the compiler and vlib as simple and readable as possible. One of V's goals is to be open to developers with different levels of experience in compiler development. Compilers don't need to be black boxes full of magic that only few people understand.
|
||||
|
||||
The compiler itself is located in `compiler/`
|
||||
|
||||
It has only 8 files (soon to be 7):
|
||||
|
||||
1. `main.v` The entry point.
|
||||
- V figures out the build mode.
|
||||
- Constructs the compiler object (`struct V`).
|
||||
- Creates a list of .v files that need to be parsed.
|
||||
- Creates a parser object for each file and runs `parse()` on them (this should work concurrently in the future). The parser emits C or x64 code directly. For performance reasons, there are no intermediate steps (no AST or Assembly code generation).
|
||||
- If the parsing is successful, a single C file is generated by merging the output from the parsers and carefully arranging all definitions (C is a single pass language).
|
||||
- Finally, a C compiler is called to compile this C file and generate an executable or a library.
|
||||
|
||||
2. `parser.v` The core of the compiler. This is the largest file (~3.5k loc). `parse()` method asks the scanner to generate a list of tokens for the file it needs to parse. Then it simply goes through all the tokens one by one.
|
||||
|
||||
In V objects can be used before declaration, so there are 2 passes. During the first pass it only looks at declarations and skips function bodies. It memorizes all function signatures, types, consts, etc. During the second pass it looks at function bodies and generates C (e.g. `cgen('if ($expr) {'`) or machine code (e.g. `gen.mov(EDI, 1)`).
|
||||
|
||||
The formatter is embedded in the parser. Correctly formatted tokens are emitted as they are parsed. This allowed to simplify the compiler and avoid duplication, but slowed it down a bit. In the future this will be fixed with build flags and separate binaries for C generation, machine code generation, and formatting. This way there will be no unnecessary branching and function calls.
|
||||
|
||||
3. `scanner.v` The scanner's job is to parse a list of characters and convert them to tokens. It also takes care of string interpolation, which is a mess at the moment.
|
||||
|
||||
4. `token.v` This is simply a list of all tokens, their string values, and a couple of helper functions.
|
||||
|
||||
5. `table.v` V creates one table object that is shared by all parsers. It contains all types, consts, and functions, as well as several helpers to search for objects by name, register new objects, modify types' fields, etc.
|
||||
|
||||
6. `cgen.v` The small `Cgen` struct helps generate C code. It's also shared by all parsers. It has a couple of functions that allow to go back and set something that was previously unknown (like with `a := 0` => `int a = 0;`). Some of these functions are hacky and need improvements and simplifications.
|
||||
|
||||
7. `fn.v` Handles declaring and calling normal and async functions and methods. This file is about 1000 lines of code, and has some complex logic. It needs to be cleaned up and simplified a bit.
|
||||
|
||||
8. `json.v` defines the json code generation. This file will be removed once V supports comptime code generation, and it will be possible to do this using the language's tools.
|
||||
|
||||
9. `x64/` is the directory with all the machine code generation logic. It will be available in early July. Obviously this is the most complex part of the compiler. It defines a set of functions that translate assembly instructions to machine code, it builds complicated binaries from scratch byte by byte. It manually builds all headers, segments, sections, symtable, relocations, etc. Right now it only has basic support of the x64 platform/Mach-O format, and it can only generate `.o` files, which then have to be linked with `lld`.
|
||||
|
||||
The rest of the directories are vlib modules: `builtin/` (strings, arrays, maps), `time/`, `os/`, etc. Their documentation is pretty clear.
|
||||
|
||||
|
||||
14
Dockerfile
Normal file
14
Dockerfile
Normal file
@@ -0,0 +1,14 @@
|
||||
#same container that golang use
|
||||
FROM buildpack-deps:buster-curl
|
||||
|
||||
LABEL maintainer="ANAGO Ronnel <anagoandy@gmail.com>"
|
||||
WORKDIR /opt/vlang
|
||||
RUN apt-get update && \
|
||||
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends gcc clang make git && \
|
||||
apt-get clean && rm -rf /var/cache/apt/archives/* && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
COPY . .
|
||||
RUN make && \
|
||||
ln -s /opt/vlang/v /usr/local/bin/v
|
||||
|
||||
CMD [ "bash" ]
|
||||
20
Dockerfile.alpine
Normal file
20
Dockerfile.alpine
Normal file
@@ -0,0 +1,20 @@
|
||||
FROM alpine:3.11
|
||||
|
||||
LABEL maintainer="spytheman <spytheman@bulsynt.org>"
|
||||
|
||||
WORKDIR /opt/vlang
|
||||
|
||||
ENV VVV /opt/vlang
|
||||
ENV PATH /opt/vlang:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
|
||||
RUN mkdir -p /opt/vlang && ln -s /opt/vlang/v /usr/bin/v
|
||||
|
||||
RUN apk --no-cache add \
|
||||
git make upx gcc \
|
||||
musl-dev \
|
||||
openssl-dev sqlite-dev \
|
||||
libx11-dev glfw-dev freetype-dev
|
||||
|
||||
## RUN apk --no-cache add --virtual sdl2deps sdl2-dev sdl2_ttf-dev sdl2_mixer-dev sdl2_image-dev
|
||||
|
||||
RUN git clone https://github.com/vlang/v /opt/vlang && make && v -version
|
||||
10
Dockerfile.cross
Normal file
10
Dockerfile.cross
Normal file
@@ -0,0 +1,10 @@
|
||||
FROM mstorsjo/llvm-mingw
|
||||
|
||||
LABEL maintainer="Vitaly Takmazov <vitalyster@gmail.com>"
|
||||
COPY . .
|
||||
RUN make
|
||||
RUN ./v -os windows -o v.c cmd/v
|
||||
RUN x86_64-w64-mingw32-gcc v.c -std=c99 -w -municode -o v.exe
|
||||
RUN file v.exe
|
||||
|
||||
CMD [ "bash" ]
|
||||
2
LICENSE
2
LICENSE
@@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2019 Alexander Medvednikov
|
||||
Copyright (c) 2019-2020 Alexander Medvednikov
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
140
Makefile
140
Makefile
@@ -1,20 +1,130 @@
|
||||
all: clean v
|
||||
$(info V has been successfully built)
|
||||
CC ?= cc
|
||||
CFLAGS ?=
|
||||
LDFLAGS ?=
|
||||
TMPDIR ?= /tmp
|
||||
VROOT ?= .
|
||||
VC ?= ./vc
|
||||
V ?= ./v
|
||||
VCREPO ?= https://github.com/vlang/vc
|
||||
TCCREPO ?= https://github.com/vlang/tccbin
|
||||
|
||||
v: v.c
|
||||
cc -std=gnu11 -w -o v v.c
|
||||
./v -o v compiler
|
||||
rm v.c
|
||||
VCFILE := v.c
|
||||
TMPTCC := $(VROOT)/thirdparty/tcc
|
||||
TCCBRANCH := thirdparty-unknown-unknown
|
||||
GITCLEANPULL := git clean -xf && git pull --quiet
|
||||
GITFASTCLONE := git clone --depth 1 --quiet --single-branch
|
||||
|
||||
v.c:
|
||||
curl -Os https://raw.githubusercontent.com/vlang/vc/master/v.c
|
||||
#### Platform detections and overrides:
|
||||
_SYS := $(shell uname 2>/dev/null || echo Unknown)
|
||||
_SYS := $(patsubst MSYS%,MSYS,$(_SYS))
|
||||
_SYS := $(patsubst MINGW%,MinGW,$(_SYS))
|
||||
|
||||
test: v
|
||||
./v -prod -o vprod compiler # Test prod build
|
||||
echo "Running V tests..."
|
||||
find . -name '*_test.v' -print0 | xargs -0 -n1 ./v
|
||||
echo "Building V examples..."
|
||||
find examples -name '*.v' -print0 | xargs -0 -n1 ./v
|
||||
ifneq ($(filter $(_SYS),MSYS MinGW),)
|
||||
WIN32 := 1
|
||||
V:=./v.exe
|
||||
endif
|
||||
|
||||
ifeq ($(_SYS),Linux)
|
||||
LINUX := 1
|
||||
TCCBRANCH := thirdparty-linux-amd64
|
||||
endif
|
||||
|
||||
ifeq ($(_SYS),Darwin)
|
||||
MAC := 1
|
||||
TCCBRANCH := thirdparty-macos-amd64
|
||||
endif
|
||||
|
||||
ifeq ($(_SYS),FreeBSD)
|
||||
LDFLAGS += -lexecinfo
|
||||
endif
|
||||
|
||||
ifdef ANDROID_ROOT
|
||||
ANDROID := 1
|
||||
undefine LINUX
|
||||
TCCBRANCH := thirdparty-linux-arm64
|
||||
endif
|
||||
#####
|
||||
|
||||
ifdef WIN32
|
||||
TCCBRANCH := thirdparty-windows-amd64
|
||||
VCFILE := v_win.c
|
||||
endif
|
||||
|
||||
all: latest_vc latest_tcc
|
||||
ifdef WIN32
|
||||
$(CC) $(CFLAGS) -g -std=c99 -municode -w -o $(V) $(VC)/$(VCFILE) $(LDFLAGS)
|
||||
ifdef prod
|
||||
$(V) -prod self
|
||||
else
|
||||
$(V) self
|
||||
endif
|
||||
else
|
||||
$(CC) $(CFLAGS) -g -std=gnu99 -w -o $(V) $(VC)/$(VCFILE) -lm -lpthread $(LDFLAGS)
|
||||
ifdef ANDROID
|
||||
chmod 755 v
|
||||
endif
|
||||
|
||||
ifdef prod
|
||||
$(V) -prod self
|
||||
else
|
||||
$(V) self
|
||||
endif
|
||||
|
||||
ifndef ANDROID
|
||||
$(MAKE) modules
|
||||
endif
|
||||
endif
|
||||
@echo "V has been successfully built"
|
||||
@$(V) -version
|
||||
|
||||
#clean: clean_tmp
|
||||
#git clean -xf
|
||||
|
||||
clean:
|
||||
-rm -f v.c v vprod
|
||||
rm -rf $(TMPTCC)
|
||||
rm -rf $(VC)
|
||||
|
||||
latest_vc: $(VC)/.git/config
|
||||
ifndef local
|
||||
cd $(VC) && $(GITCLEANPULL)
|
||||
else
|
||||
@echo "Using local vc"
|
||||
endif
|
||||
|
||||
fresh_vc:
|
||||
$(GITFASTCLONE) $(VCREPO) $(VC)
|
||||
|
||||
latest_tcc: $(TMPTCC)/.git/config
|
||||
ifndef ANDROID
|
||||
ifndef local
|
||||
cd $(TMPTCC) && $(GITCLEANPULL)
|
||||
else
|
||||
@echo "Using local tcc"
|
||||
endif
|
||||
endif
|
||||
|
||||
fresh_tcc:
|
||||
ifndef ANDROID
|
||||
rm -rf $(TMPTCC)
|
||||
$(GITFASTCLONE) --branch $(TCCBRANCH) $(TCCREPO) $(TMPTCC)
|
||||
endif
|
||||
|
||||
$(TMPTCC)/.git/config:
|
||||
$(MAKE) fresh_tcc
|
||||
|
||||
$(VC)/.git/config:
|
||||
$(MAKE) fresh_vc
|
||||
|
||||
selfcompile:
|
||||
$(V) -cg -o v cmd/v
|
||||
|
||||
selfcompile-static:
|
||||
$(V) -cg -cflags '--static' -o v-static cmd/v
|
||||
|
||||
modules: module_builtin module_strings module_strconv
|
||||
module_builtin:
|
||||
#$(V) build module vlib/builtin > /dev/null
|
||||
module_strings:
|
||||
#$(V) build module vlib/strings > /dev/null
|
||||
module_strconv:
|
||||
#$(V) build module vlib/strconv > /dev/null
|
||||
|
||||
282
README.md
282
README.md
@@ -1,155 +1,253 @@
|
||||
# The V Programming Language 0.1.x
|
||||
<div align="center">
|
||||
<p>
|
||||
<img width="80" src="https://raw.githubusercontent.com/donnisnoni95/v-logo/master/dist/v-logo.svg?sanitize=true">
|
||||
</p>
|
||||
<h1>The V Programming Language</h1>
|
||||
|
||||
[](https://dev.azure.com/alexander0785/vlang/_build/latest?definitionId=1&branchName=master) [](https://travis-ci.org/vlang/v)
|
||||
[vlang.io](https://vlang.io) |
|
||||
[Docs](https://github.com/vlang/v/blob/master/doc/docs.md) |
|
||||
[Changelog](https://github.com/vlang/v/blob/master/CHANGELOG.md) |
|
||||
[Speed](https://fast.vlang.io/) |
|
||||
[Contributing & compiler design](https://github.com/vlang/v/blob/master/CONTRIBUTING.md)
|
||||
|
||||
https://vlang.io
|
||||
</div>
|
||||
<div align="center">
|
||||
|
||||
Documentation: https://vlang.io/docs
|
||||
|
||||
Twitter: https://twitter.com/v_language
|
||||
|
||||
Discord (primary community): https://discord.gg/n7c74HM
|
||||
|
||||
Installing V: https://github.com/vlang/v#installing-v-from-source
|
||||
[![Build Status][WorkflowBadge]][WorkflowUrl]
|
||||
[![Sponsor][SponsorBadge]][SponsorUrl]
|
||||
[![Patreon][PatreonBadge]][PatreonUrl]
|
||||
[![Discord][DiscordBadge]][DiscordUrl]
|
||||
[![Twitter][TwitterUrl]][TwitterBadge]
|
||||
|
||||
</div>
|
||||
|
||||
## Key Features of V
|
||||
|
||||
- Simplicity: the language can be learned in half an hour, less if you already know Go
|
||||
- Fast compilation: ~100k loc/s right now, ~1.2 million loc/s once x64 generation is mature enough
|
||||
- Simplicity: the language can be learned in less than an hour
|
||||
- Fast compilation: ≈80k loc/s with a Clang backend,
|
||||
≈1 million loc/s with x64 and tcc backends *(Intel i5-7500, SSD, no optimization)*
|
||||
- Easy to develop: V compiles itself in less than a second
|
||||
- Performance: within 5% of C
|
||||
- Performance: as fast as C (V's main backend compiles to human readable C)
|
||||
- Safety: no null, no globals, no undefined behavior, immutability by default
|
||||
- C to V translation
|
||||
- Hot code reloading
|
||||
- Powerful UI and graphics libraries
|
||||
- [Cross-platform UI library](https://github.com/vlang/ui)
|
||||
- Built-in graphics library
|
||||
- Easy cross compilation
|
||||
- REPL
|
||||
- [Built-in ORM](https://github.com/vlang/v/blob/master/doc/docs.md#orm)
|
||||
- [Built-in web framework](https://github.com/vlang/v/blob/master/vlib/vweb/README.md)
|
||||
- C and JavaScript backends
|
||||
|
||||
V 1.0 release is planned for December 2019.
|
||||
## Stability guarantee and future changes
|
||||
|
||||
## Notes
|
||||
Despite being at an early development stage, the V language is relatively stable and has
|
||||
backwards compatibility guarantee, meaning that the code you write today is guaranteed
|
||||
to work a month, a year, or five years from now.
|
||||
|
||||
GitHub marks V's code as written in Go. It's actually written in V, GitHub doesn't support the language yet.
|
||||
There still may be minor syntax changes before the 1.0 release, but they will be handled
|
||||
automatically via `vfmt`, as has been done in the past.
|
||||
|
||||
The compilation is temporarily slower for this release:
|
||||
The V core APIs (primarily the `os` module) will still have minor changes until
|
||||
they are stabilized in 2020. Of course the APIs will grow after that, but without breaking
|
||||
existing code.
|
||||
|
||||
- Debug builds are used (use `./v -prod -o v .` to get faster compilation).
|
||||
- vlib is recompiled with every program you build.
|
||||
- The new formatter runs on every single token and slows the compiler down by ~20%. This will be taken care of.
|
||||
- There are a lot of known issues that are quick to fix (like function lookups being O(n)).
|
||||
|
||||
There's some old hacky code written when V was 2 months old. All of it will be quickly cleaned up. There are ~500 lines of C code, which will be removed by the end of June.
|
||||
|
||||
## Code structure
|
||||
|
||||
https://github.com/vlang/v/blob/master/CodeStructure.md
|
||||
Unlike many other languages, V is not going to be always changing, with new features
|
||||
being introduced and old features modified. It is always going to be a small and simple
|
||||
language, very similar to the way it is right now.
|
||||
|
||||
## Installing V from source
|
||||
|
||||
### Linux and macOS
|
||||
|
||||
You'll need Clang or GCC. On macOS run `xcode-select --install` if you don't have XCode or XCode tools installed.
|
||||
### Linux, macOS, Windows, *BSD, Solaris, WSL, Android, Raspbian
|
||||
|
||||
```bash
|
||||
# You can clone V anywhere
|
||||
git clone https://github.com/vlang/v
|
||||
cd v
|
||||
make
|
||||
```
|
||||
Or build without make:
|
||||
```bash
|
||||
# Download the V compiler's source translated to C
|
||||
curl -sO https://raw.githubusercontent.com/vlang/vc/master/v.c
|
||||
cc -std=gnu11 -w -o v v.c # Build it with Clang or GCC
|
||||
./v -o v . # Use the resulting V binary to build V from V source
|
||||
./v -o v . # Build the compiler again to make sure it works
|
||||
```
|
||||
|
||||
That's it! Now you have a V executable at `[path to V repo]/v`.
|
||||
`[path to V repo]` can be anywhere.
|
||||
|
||||
You can create a symlink so that it's globally available:
|
||||
(On Windows `make` means running `make.bat`, so make sure you use `cmd.exe`)
|
||||
|
||||
```
|
||||
sudo ln -s [path to V repo]/v /usr/local/bin/v
|
||||
```
|
||||
Now you can try `./v run examples/hello_world.v` (`v.exe` on Windows).
|
||||
|
||||
V is being constantly updated. To update V, simply run
|
||||
|
||||
```
|
||||
git pull origin master
|
||||
make
|
||||
```
|
||||
|
||||
|
||||
### Windows
|
||||
|
||||
V works great on Windows Subsystem for Linux. The instructions are the same as above.
|
||||
|
||||
If you want to build v.exe on Windows without WSL, you can use MinGW-w64 or Visual Studio.
|
||||
|
||||
#### MinGW-w64
|
||||
|
||||
[Download](https://downloads.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/installer/mingw-w64-install.exe?r=&ts=1561736169&use_mirror=gigenet) and install MinGW-w64.
|
||||
|
||||
Make sure the `C:/mingw-w64/bin` directory is in system's PATH.
|
||||
V is being constantly updated. To update V, simply run:
|
||||
|
||||
```bash
|
||||
v up
|
||||
```
|
||||
|
||||
### C compiler
|
||||
|
||||
It's recommended to use Clang or GCC or Visual Studio.
|
||||
If you are doing development, you most likely already have one of those installed.
|
||||
|
||||
Otherwise, follow these instructions:
|
||||
|
||||
- [Installing a C compiler on Linux and macOS](https://github.com/vlang/v/wiki/Installing-a-C-compiler-on-Linux-and-macOS)
|
||||
|
||||
- [Installing a C compiler on Windows](https://github.com/vlang/v/wiki/Installing-a-C-compiler-on-Windows)
|
||||
|
||||
However, if none is found when running `make` on Linux or Windows,
|
||||
TCC would be downloaded and set as an alternative C backend.
|
||||
It's very lightweight (several MB) so this shouldn't take too long.
|
||||
|
||||
### Symlinking
|
||||
|
||||
NB: it is *highly recommended*, that you put V on your PATH. That saves
|
||||
you the effort to type in the full path to your v executable every time.
|
||||
V provides a convenience `v symlink` command to do that more easily.
|
||||
|
||||
On Unix systems, it creates a `/usr/local/bin/v` symlink to your
|
||||
executable. To do that, run:
|
||||
|
||||
```bash
|
||||
sudo ./v symlink
|
||||
```
|
||||
|
||||
On Windows, start a new shell with administrative privileges, for
|
||||
example by <kbd>Windows Key</kbd>, then type `cmd.exe`, right click on its menu
|
||||
entry, and choose `Run as administrator`. In the new administrative
|
||||
shell, cd to the path, where you have compiled v.exe, then type:
|
||||
|
||||
```bat
|
||||
.\v.exe symlink
|
||||
```
|
||||
|
||||
That will make v available everywhere, by adding it to your PATH.
|
||||
Please restart your shell/editor after that, so that it can pick
|
||||
the new PATH variable.
|
||||
|
||||
NB: there is no need to run `v symlink` more than once - v will
|
||||
continue to be available, even after `v up`, restarts and so on.
|
||||
You only need to run it again, if you decide to move the V repo
|
||||
folder somewhere else.
|
||||
|
||||
### Docker
|
||||
|
||||
<details><summary>Expand Docker instructions</summary>
|
||||
|
||||
```bash
|
||||
# You can clone V anywhere
|
||||
git clone https://github.com/vlang/v
|
||||
cd v/compiler
|
||||
# Download the V compiler's source translated to C
|
||||
curl -sO https://raw.githubusercontent.com/vlang/vc/master/v.c
|
||||
gcc -std=gnu11 -w -o v.exe v.c # Build it with GCC
|
||||
cd v
|
||||
docker build -t vlang .
|
||||
docker run --rm -it vlang:latest
|
||||
v
|
||||
```
|
||||
|
||||
### Docker with Alpine/musl
|
||||
|
||||
### Testing
|
||||
|
||||
```bash
|
||||
git clone https://github.com/vlang/v
|
||||
cd v
|
||||
docker build -t vlang --file=Dockerfile.alpine .
|
||||
docker run --rm -it vlang:latest
|
||||
/usr/local/v/v
|
||||
```
|
||||
$ cd examples
|
||||
$ v run hello_world.v
|
||||
hello world
|
||||
|
||||
</details>
|
||||
|
||||
### Testing and running the examples
|
||||
|
||||
Make sure V can compile itself:
|
||||
|
||||
```bash
|
||||
v self
|
||||
```
|
||||
|
||||
```bash
|
||||
$ v
|
||||
V 0.1.2
|
||||
Use Ctrl-D to exit
|
||||
V 0.1.x
|
||||
Use Ctrl-C or `exit` to exit
|
||||
|
||||
>>> println('hello world')
|
||||
hello world
|
||||
>>>
|
||||
```
|
||||
|
||||
Now if you want, you can start tinkering with the compiler. If you introduce a breaking change and rebuild V, you will no longer be able to use V to build itself. So it's a good idea to make a backup copy of a working compiler executable.
|
||||
|
||||
|
||||
### Running the examples
|
||||
|
||||
```
|
||||
```bash
|
||||
cd examples
|
||||
v hello_world.v && ./hello_world # or simply
|
||||
v run hello_world.v # this builds the program and runs it right away
|
||||
|
||||
v word_counter.v && ./word_counter cinderella.txt
|
||||
v run news_fetcher.v
|
||||
v run tetris.v
|
||||
v run tetris/tetris.v
|
||||
```
|
||||
|
||||
<img src='https://raw.githubusercontent.com/vlang/v/master/examples/tetris/screenshot.png' width=300>
|
||||
|
||||
NB: In order to build Tetris or 2048 (or anything else using `sokol` or `gg` graphics modules)
|
||||
on some Linux systems, you need to install `libxi-dev` and `libxcursor-dev` .
|
||||
|
||||
In order to build Tetris and anything else using the graphics module, you will need to install glfw and freetype.
|
||||
If you plan to use the http package, you also need to install OpenSSL on non-Windows systems.
|
||||
|
||||
If you plan to use the http package, you also need to install libcurl.
|
||||
|
||||
```
|
||||
```bash
|
||||
macOS:
|
||||
brew install glfw freetype curl
|
||||
brew install openssl
|
||||
|
||||
Ubuntu:
|
||||
sudo apt install libglfw3 libglfw3-dev libfreetype6-dev libcurl3-dev
|
||||
Debian/Ubuntu:
|
||||
sudo apt install libssl-dev
|
||||
|
||||
Arch:
|
||||
sudo pacman -S glfw-x11 curl freetype2
|
||||
Arch/Manjaro:
|
||||
openssl is installed by default
|
||||
|
||||
Fedora:
|
||||
sudo dnf install openssl-devel
|
||||
```
|
||||
|
||||
glfw and libcurl dependencies will be removed soon.
|
||||
## V UI
|
||||
|
||||
<a href="https://github.com/vlang/ui">
|
||||
<img src='https://raw.githubusercontent.com/vlang/ui/master/examples/screenshot.png' width=712>
|
||||
</a>
|
||||
|
||||
https://github.com/vlang/ui
|
||||
|
||||
<!---
|
||||
## JavaScript backend
|
||||
|
||||
[examples/hello_v_js.v](examples/hello_v_js.v):
|
||||
|
||||
```v
|
||||
fn main() {
|
||||
for i in 0..3 {
|
||||
println('Hello from V.js')
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```bash
|
||||
v -o hi.js examples/hello_v_js.v && node hi.js
|
||||
Hello from V.js
|
||||
Hello from V.js
|
||||
Hello from V.js
|
||||
```
|
||||
-->
|
||||
|
||||
## Developing web applications
|
||||
|
||||
Check out the [Building a simple web blog](https://github.com/vlang/v/blob/master/tutorials/building-a-simple-web-blog-with-vweb.md)
|
||||
tutorial and Gitly, a light and fast alternative to GitHub/GitLab:
|
||||
|
||||
https://github.com/vlang/gitly
|
||||
|
||||
<img src="https://user-images.githubusercontent.com/687996/85933714-b195fe80-b8da-11ea-9ddd-09cadc2103e4.png">
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
Please see the [Troubleshooting](https://github.com/vlang/v/wiki/Troubleshooting) section on our [wiki page](https://github.com/vlang/v/wiki)
|
||||
|
||||
[WorkflowBadge]: https://github.com/vlang/v/workflows/CI/badge.svg
|
||||
[DiscordBadge]: https://img.shields.io/discord/592103645835821068?label=Discord&logo=discord&logoColor=white
|
||||
[PatreonBadge]: https://img.shields.io/endpoint.svg?url=https%3A%2F%2Fshieldsio-patreon.vercel.app%2Fapi%3Fusername%3Dvlang%26type%3Dpledges
|
||||
[SponsorBadge]: https://camo.githubusercontent.com/da8bc40db5ed31e4b12660245535b5db67aa03ce/68747470733a2f2f696d672e736869656c64732e696f2f7374617469632f76313f6c6162656c3d53706f6e736f72266d6573736167653d254532253944254134266c6f676f3d476974487562
|
||||
[TwitterBadge]: https://twitter.com/v_language
|
||||
|
||||
[WorkflowUrl]: https://github.com/vlang/v/commits/master
|
||||
[DiscordUrl]: https://discord.gg/vlang
|
||||
[PatreonUrl]: https://patreon.com/vlang
|
||||
[SponsorUrl]: https://github.com/sponsors/medvednikov
|
||||
[TwitterUrl]: https://img.shields.io/twitter/follow/v_language.svg?style=flatl&label=Follow&logo=twitter&logoColor=white&color=1da1f2
|
||||
|
||||
69
TESTS.md
Normal file
69
TESTS.md
Normal file
@@ -0,0 +1,69 @@
|
||||
# Automated tests
|
||||
|
||||
In the `v` repo there are several different tests. The main types are:
|
||||
|
||||
* `_test.v` tests - check that `test_` functions succeed. These can be
|
||||
run per directory or individually.
|
||||
* `.out` tests - run a `.vv` file and check the output matches the
|
||||
contents of the `.out` file with the same base name. This is
|
||||
particularly useful for checking that errors are printed.
|
||||
|
||||
Tip: use `v -cc tcc` when compiling tests for speed.
|
||||
|
||||
## `v test-compiler`
|
||||
|
||||
This builds and tests:
|
||||
|
||||
* `vc` repo
|
||||
* `_test.v` files
|
||||
* examples
|
||||
* `v install` a module
|
||||
|
||||
Some of these can be invoked separately.
|
||||
|
||||
## `vlib/v/compiler_errors_test.v`
|
||||
|
||||
This runs tests for:
|
||||
* `checker/tests/*.vv`
|
||||
* `parser/tests/*.vv`
|
||||
|
||||
## `vlib/v/tests`
|
||||
|
||||
General runnable program tests.
|
||||
|
||||
## Actual code
|
||||
|
||||
* `v build-examples`
|
||||
* `v build-tools`
|
||||
|
||||
## `v test-fixed`
|
||||
|
||||
Test `vlib`.
|
||||
|
||||
## vfmt tests
|
||||
|
||||
In `vlib/v/fmt/` there's:
|
||||
|
||||
* `fmt_test.v`
|
||||
|
||||
This checks `.out` tests.
|
||||
|
||||
* `fmt_keep_test.v`
|
||||
|
||||
This verifies that `_keep.v` files would be unchanged by `vfmt -w`.
|
||||
|
||||
* `fmt_vlib_test.v`
|
||||
|
||||
This checks all source files are formatted and prints a summary. This
|
||||
is not required.
|
||||
|
||||
* `v test-fmt`
|
||||
|
||||
Test all files in the current directory are formatted.
|
||||
|
||||
## `.github/workflows/ci.yml`
|
||||
|
||||
This runs various CI tests, e.g.:
|
||||
|
||||
* `v vet vlib/v` - style checker
|
||||
* `v fmt -verify` on certain source files
|
||||
@@ -1,39 +0,0 @@
|
||||
jobs:
|
||||
- job: LinuxBuild
|
||||
pool:
|
||||
vmImage: 'ubuntu-16.04'
|
||||
displayName: "V Linux Build"
|
||||
steps:
|
||||
- script: |
|
||||
sudo apt install -y libglfw3 libglfw3-dev libfreetype6-dev libcurl3-dev
|
||||
displayName: 'Install Dependencies'
|
||||
- script: |
|
||||
make
|
||||
displayName: 'Build V'
|
||||
- script: |
|
||||
make test
|
||||
displayName: 'Run Tests'
|
||||
- job: WindowsBuild
|
||||
pool:
|
||||
vmImage: 'vs2017-win2016'
|
||||
displayName: "V Windows Build"
|
||||
- job: OSXBuild
|
||||
pool:
|
||||
vmImage: 'macOS-10.13'
|
||||
displayName: "V MacOSX Build"
|
||||
steps:
|
||||
- script: |
|
||||
brew install glfw freetype curl
|
||||
displayName: 'Install Dependencies'
|
||||
- script: |
|
||||
make && make test
|
||||
displayName: 'Build V'
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- '*'
|
||||
pr:
|
||||
autoCancel: false
|
||||
branches:
|
||||
include:
|
||||
- '*'
|
||||
55
cmd/tools/bench/wyhash.v
Normal file
55
cmd/tools/bench/wyhash.v
Normal file
@@ -0,0 +1,55 @@
|
||||
module main
|
||||
|
||||
import hash.fnv1a
|
||||
import hash as wyhash
|
||||
import rand
|
||||
import benchmark
|
||||
|
||||
fn main() {
|
||||
rand.seed([u32(42), 0])
|
||||
sample_size := 10000000
|
||||
min_str_len := 20
|
||||
max_str_len := 40
|
||||
println('Generating $sample_size strings between $min_str_len - $max_str_len chars long...')
|
||||
mut checksum := u64(0)
|
||||
mut start_pos := 0
|
||||
mut bgenerating := benchmark.start()
|
||||
mut bytepile := []byte{}
|
||||
for _ in 0 .. sample_size * max_str_len {
|
||||
bytepile << byte(rand.int_in_range(40, 125))
|
||||
}
|
||||
mut str_lens := []int{}
|
||||
for _ in 0 .. sample_size {
|
||||
str_lens << rand.int_in_range(min_str_len, max_str_len)
|
||||
}
|
||||
bgenerating.measure('generating strings')
|
||||
println('Hashing each of the generated strings...')
|
||||
//
|
||||
mut bhashing_1 := benchmark.start()
|
||||
start_pos = 0
|
||||
checksum = 0
|
||||
for len in str_lens {
|
||||
end_pos := start_pos + len
|
||||
checksum ^= wyhash.wyhash_c(unsafe { bytepile.data + start_pos }, u64(len), 1)
|
||||
start_pos = end_pos
|
||||
}
|
||||
bhashing_1.measure('wyhash.wyhash_c | checksum: ${checksum:22}')
|
||||
mut bhashing_2 := benchmark.start()
|
||||
start_pos = 0
|
||||
checksum = 0
|
||||
for len in str_lens {
|
||||
end_pos := start_pos + len
|
||||
checksum ^= wyhash.sum64(bytepile[start_pos..end_pos], 1)
|
||||
start_pos = end_pos
|
||||
}
|
||||
bhashing_2.measure('wyhash.sum64 | checksum: ${checksum:22}')
|
||||
mut bhashing_3 := benchmark.start()
|
||||
start_pos = 0
|
||||
checksum = 0
|
||||
for len in str_lens {
|
||||
end_pos := start_pos + len
|
||||
checksum ^= fnv1a.sum64(bytepile[start_pos..end_pos])
|
||||
start_pos = end_pos
|
||||
}
|
||||
bhashing_3.measure('fnv1a.sum64 | checksum: ${checksum:22}')
|
||||
}
|
||||
271
cmd/tools/check-md.v
Normal file
271
cmd/tools/check-md.v
Normal file
@@ -0,0 +1,271 @@
|
||||
module main
|
||||
|
||||
import os
|
||||
import rand
|
||||
import term
|
||||
import v.pref
|
||||
|
||||
const (
|
||||
too_long_line_length = 100
|
||||
term_colors = term.can_show_color_on_stderr()
|
||||
)
|
||||
|
||||
fn main() {
|
||||
files_paths := if '-all' in os.args { md_file_paths() } else { os.args[1..] }
|
||||
mut warnings := 0
|
||||
mut errors := 0
|
||||
mut oks := 0
|
||||
mut all_md_files := []MDFile{}
|
||||
for file_path in files_paths {
|
||||
real_path := os.real_path(file_path)
|
||||
lines := os.read_lines(real_path) or {
|
||||
println('"$file_path" does not exist')
|
||||
warnings++
|
||||
continue
|
||||
}
|
||||
mut mdfile := MDFile{
|
||||
path: file_path
|
||||
}
|
||||
for i, line in lines {
|
||||
if line.len > too_long_line_length {
|
||||
if mdfile.state == .vexample {
|
||||
println(wline(file_path, i, line.len, 'long V example line'))
|
||||
warnings++
|
||||
} else if mdfile.state == .codeblock {
|
||||
println(wline(file_path, i, line.len, 'long code block line'))
|
||||
warnings++
|
||||
} else if line.starts_with('|') {
|
||||
println(wline(file_path, i, line.len, 'long table'))
|
||||
warnings++
|
||||
} else if line.contains('https') {
|
||||
println(wline(file_path, i, line.len, 'long link'))
|
||||
warnings++
|
||||
} else {
|
||||
eprintln(eline(file_path, i, line.len, 'line too long'))
|
||||
errors++
|
||||
}
|
||||
}
|
||||
mdfile.parse_line(i, line)
|
||||
}
|
||||
all_md_files << mdfile
|
||||
}
|
||||
for mut mdfile in all_md_files {
|
||||
new_errors, new_oks := mdfile.check_examples()
|
||||
errors += new_errors
|
||||
oks += new_oks
|
||||
}
|
||||
// println('all_md_files: $all_md_files')
|
||||
if warnings > 0 || errors > 0 || oks > 0 {
|
||||
println('\nWarnings: $warnings | Errors: $errors | OKs: $oks')
|
||||
}
|
||||
if errors > 0 {
|
||||
exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
fn md_file_paths() []string {
|
||||
mut files_to_check := []string{}
|
||||
md_files := os.walk_ext('.', '.md')
|
||||
for file in md_files {
|
||||
if file.starts_with('./thirdparty') {
|
||||
continue
|
||||
}
|
||||
files_to_check << file
|
||||
}
|
||||
return files_to_check
|
||||
}
|
||||
|
||||
fn ftext(s string, cb fn (string) string) string {
|
||||
if term_colors {
|
||||
return cb(s)
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
fn btext(s string) string {
|
||||
return ftext(s, term.bold)
|
||||
}
|
||||
|
||||
fn mtext(s string) string {
|
||||
return ftext(s, term.magenta)
|
||||
}
|
||||
|
||||
fn rtext(s string) string {
|
||||
return ftext(s, term.red)
|
||||
}
|
||||
|
||||
fn wline(file_path string, lnumber int, column int, message string) string {
|
||||
return btext('$file_path:${lnumber + 1}:${column + 1}:') + btext(mtext(' warn:')) + rtext(' $message')
|
||||
}
|
||||
|
||||
fn eline(file_path string, lnumber int, column int, message string) string {
|
||||
return btext('$file_path:${lnumber + 1}:${column + 1}:') + btext(rtext(' error: $message'))
|
||||
}
|
||||
|
||||
//
|
||||
const (
|
||||
default_command = 'compile'
|
||||
)
|
||||
|
||||
struct VCodeExample {
|
||||
mut:
|
||||
text []string
|
||||
command string
|
||||
sline int
|
||||
eline int
|
||||
}
|
||||
|
||||
enum MDFileParserState {
|
||||
markdown
|
||||
vexample
|
||||
codeblock
|
||||
}
|
||||
|
||||
struct MDFile {
|
||||
path string
|
||||
mut:
|
||||
examples []VCodeExample
|
||||
current VCodeExample
|
||||
state MDFileParserState = .markdown
|
||||
}
|
||||
|
||||
fn (mut f MDFile) parse_line(lnumber int, line string) {
|
||||
if line.starts_with('```v') {
|
||||
if f.state == .markdown {
|
||||
f.state = .vexample
|
||||
mut command := line.replace('```v', '').trim_space()
|
||||
if command == '' {
|
||||
command = default_command
|
||||
}
|
||||
f.current = VCodeExample{
|
||||
sline: lnumber
|
||||
command: command
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
if line.starts_with('```') {
|
||||
match f.state {
|
||||
.vexample {
|
||||
f.state = .markdown
|
||||
f.current.eline = lnumber
|
||||
f.examples << f.current
|
||||
f.current = VCodeExample{}
|
||||
return
|
||||
}
|
||||
.codeblock {
|
||||
f.state = .markdown
|
||||
return
|
||||
}
|
||||
.markdown {
|
||||
f.state = .codeblock
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
if f.state == .vexample {
|
||||
f.current.text << line
|
||||
}
|
||||
}
|
||||
|
||||
fn (mut f MDFile) dump() {
|
||||
for e in f.examples {
|
||||
eprintln('f.path: $f.path | example: $e')
|
||||
}
|
||||
}
|
||||
|
||||
fn (mut f MDFile) check_examples() (int, int) {
|
||||
mut errors := 0
|
||||
mut oks := 0
|
||||
vexe := pref.vexe_path()
|
||||
for e in f.examples {
|
||||
if e.command == 'ignore' {
|
||||
continue
|
||||
}
|
||||
if e.command == 'wip' {
|
||||
continue
|
||||
}
|
||||
fname := os.base(f.path).replace('.md', '_md')
|
||||
uid := rand.ulid()
|
||||
vfile := os.join_path(os.temp_dir(), 'check_${fname}_example_${e.sline}__${e.eline}__${uid}.v')
|
||||
mut should_cleanup_vfile := true
|
||||
// eprintln('>>> checking example $vfile ...')
|
||||
vcontent := e.text.join('\n')
|
||||
os.write_file(vfile, vcontent) or {
|
||||
panic(err)
|
||||
}
|
||||
mut acommands := e.command.split(' ')
|
||||
for command in acommands {
|
||||
match command {
|
||||
'compile' {
|
||||
res := os.system('"$vexe" -silent -o x.c $vfile')
|
||||
os.rm('x.c') or { }
|
||||
if res != 0 {
|
||||
eprintln(eline(f.path, e.sline, 0, 'example failed to compile'))
|
||||
eprintln(vcontent)
|
||||
should_cleanup_vfile = false
|
||||
errors++
|
||||
continue
|
||||
}
|
||||
oks++
|
||||
}
|
||||
'live' {
|
||||
res := os.system('"$vexe" -silent -live -o x.c $vfile')
|
||||
if res != 0 {
|
||||
eprintln(eline(f.path, e.sline, 0, 'example failed to compile with -live'))
|
||||
eprintln(vcontent)
|
||||
should_cleanup_vfile = false
|
||||
errors++
|
||||
continue
|
||||
}
|
||||
oks++
|
||||
}
|
||||
'failcompile' {
|
||||
res := os.system('"$vexe" -silent -o x.c $vfile')
|
||||
os.rm('x.c') or { }
|
||||
if res == 0 {
|
||||
eprintln(eline(f.path, e.sline, 0, '`failcompile` example compiled'))
|
||||
eprintln(vcontent)
|
||||
should_cleanup_vfile = false
|
||||
errors++
|
||||
continue
|
||||
}
|
||||
oks++
|
||||
}
|
||||
'oksyntax' {
|
||||
res := os.system('"$vexe" -silent -check-syntax $vfile')
|
||||
if res != 0 {
|
||||
eprintln(eline(f.path, e.sline, 0, '`oksyntax` example with invalid syntax'))
|
||||
eprintln(vcontent)
|
||||
should_cleanup_vfile = false
|
||||
errors++
|
||||
continue
|
||||
}
|
||||
oks++
|
||||
}
|
||||
'badsyntax' {
|
||||
res := os.system('"$vexe" -silent -check-syntax $vfile')
|
||||
if res == 0 {
|
||||
eprintln(eline(f.path, e.sline, 0, '`badsyntax` example can be parsed fine'))
|
||||
eprintln(vcontent)
|
||||
should_cleanup_vfile = false
|
||||
errors++
|
||||
continue
|
||||
}
|
||||
oks++
|
||||
}
|
||||
else {
|
||||
eprintln(eline(f.path, e.sline, 0, 'unrecognized command: "$command", use one of: wip/ignore/compile/failcompile/oksyntax/badsyntax'))
|
||||
should_cleanup_vfile = false
|
||||
errors++
|
||||
}
|
||||
}
|
||||
}
|
||||
if should_cleanup_vfile {
|
||||
os.rm(vfile) or {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
return errors, oks
|
||||
}
|
||||
131
cmd/tools/check_os_api_parity.v
Normal file
131
cmd/tools/check_os_api_parity.v
Normal file
@@ -0,0 +1,131 @@
|
||||
module main
|
||||
|
||||
import os
|
||||
import v.util
|
||||
import v.pref
|
||||
import v.builder
|
||||
import v.ast
|
||||
import term
|
||||
|
||||
const (
|
||||
base_os = 'linux'
|
||||
os_names = ['linux', 'macos', 'windows']
|
||||
skip_modules = [
|
||||
'builtin.bare',
|
||||
'builtin.js',
|
||||
'strconv',
|
||||
'strconv.ftoa',
|
||||
'hash',
|
||||
'strings',
|
||||
'crypto.rand',
|
||||
'os.bare',
|
||||
'os2',
|
||||
'picohttpparser',
|
||||
'picoev',
|
||||
'szip',
|
||||
'v.eval',
|
||||
]
|
||||
)
|
||||
|
||||
struct App {
|
||||
diff_cmd string
|
||||
is_verbose bool
|
||||
modules []string
|
||||
mut:
|
||||
api_differences map[string]int
|
||||
}
|
||||
|
||||
fn main() {
|
||||
vexe := pref.vexe_path()
|
||||
vroot := os.dir(vexe)
|
||||
util.set_vroot_folder(vroot)
|
||||
os.chdir(vroot)
|
||||
cmd := util.find_working_diff_command() or {
|
||||
''
|
||||
}
|
||||
mut app := App{
|
||||
diff_cmd: cmd
|
||||
is_verbose: os.getenv('VERBOSE').len > 0
|
||||
modules: if os.args.len > 1 { os.args[1..] } else { all_vlib_modules() }
|
||||
}
|
||||
for mname in app.modules {
|
||||
if !app.is_verbose {
|
||||
eprintln('Checking module: $mname ...')
|
||||
}
|
||||
api_base := app.gen_api_for_module_in_os(mname, base_os)
|
||||
for oname in os_names {
|
||||
if oname == base_os {
|
||||
continue
|
||||
}
|
||||
api_os := app.gen_api_for_module_in_os(mname, oname)
|
||||
app.compare_api(api_base, api_os, mname, base_os, oname)
|
||||
}
|
||||
}
|
||||
howmany := app.api_differences.len
|
||||
eprintln('NB: please, do run `git clean -xf` after this tool, or at least `find thirdparty/ |grep .o$|xargs rm`')
|
||||
eprintln('otherwise, `./v test-fixed` may show false positives, due to .o files compiled with a cross compiler.')
|
||||
if howmany > 0 {
|
||||
eprintln(term.header('Found $howmany modules with different APIs', '='))
|
||||
for m in app.api_differences.keys() {
|
||||
eprintln('Module: $m')
|
||||
}
|
||||
exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
fn all_vlib_modules() []string {
|
||||
mut vlib_v_files := os.walk_ext('vlib', '.v')
|
||||
mut vmodulesmap := map[string]int{}
|
||||
for f in vlib_v_files {
|
||||
if f.contains('/tests/') || f.ends_with('_test.v') {
|
||||
continue
|
||||
}
|
||||
vmodulename := os.dir(f).replace('/', '.').replace('vlib.', '')
|
||||
if vmodulename in skip_modules {
|
||||
continue
|
||||
}
|
||||
vmodulesmap[vmodulename] = vmodulesmap[vmodulename] + 1
|
||||
}
|
||||
mut modules := vmodulesmap.keys()
|
||||
modules.sort()
|
||||
return modules
|
||||
}
|
||||
|
||||
fn (app App) gen_api_for_module_in_os(mod_name string, os_name string) string {
|
||||
if app.is_verbose {
|
||||
eprintln('Checking module: ${mod_name:-30} for OS: ${os_name:-10} ...')
|
||||
}
|
||||
mpath := os.join_path('vlib', mod_name.replace('.', '/'))
|
||||
tmpname := '/tmp/${mod_name}_${os_name}.c'
|
||||
prefs, _ := pref.parse_args(['-os', os_name, '-o', tmpname, '-shared', mpath])
|
||||
mut b := builder.new_builder(prefs)
|
||||
b.compile_c()
|
||||
mut res := []string{}
|
||||
for f in b.parsed_files {
|
||||
for s in f.stmts {
|
||||
if s is ast.FnDecl {
|
||||
if s.is_pub {
|
||||
fn_signature := s.stringify(b.table, mod_name)
|
||||
fn_mod := s.modname()
|
||||
if fn_mod == mod_name {
|
||||
fline := '$fn_mod: $fn_signature'
|
||||
res << fline
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
res.sort()
|
||||
return res.join('\n')
|
||||
}
|
||||
|
||||
fn (mut app App) compare_api(api_base string, api_os string, mod_name string, os_base string, os_target string) {
|
||||
res := util.color_compare_strings(app.diff_cmd, api_base, api_os)
|
||||
if res.len > 0 {
|
||||
summary := 'Different APIs found for module: `$mod_name`, between OS base: `$os_base` and OS: `$os_target`'
|
||||
eprintln(term.header(summary, '-'))
|
||||
eprintln(res)
|
||||
eprintln(term.h_divider('-'))
|
||||
app.api_differences[mod_name] = 1
|
||||
}
|
||||
}
|
||||
5
cmd/tools/fast/.gitignore
vendored
Normal file
5
cmd/tools/fast/.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
fast
|
||||
index.html
|
||||
table.html
|
||||
v.c
|
||||
v2
|
||||
128
cmd/tools/fast/fast.v
Normal file
128
cmd/tools/fast/fast.v
Normal file
@@ -0,0 +1,128 @@
|
||||
// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved.
|
||||
// Use of this source code is governed by an MIT license
|
||||
// that can be found in the LICENSE file.
|
||||
import os
|
||||
import time
|
||||
|
||||
fn main() {
|
||||
exe := os.executable()
|
||||
dir := os.dir(exe)
|
||||
vdir := os.dir(os.dir(os.dir(dir)))
|
||||
if !os.exists('$vdir/v') && !os.is_dir('$vdir/vlib') {
|
||||
println('fast.html generator needs to be located in `v/cmd/tools/fast`')
|
||||
}
|
||||
println('fast.html generator\n')
|
||||
// Fetch the last commit's hash
|
||||
println('Fetching updates...')
|
||||
ret := os.system('$vdir/v up')
|
||||
if ret != 0 {
|
||||
println('failed to update V')
|
||||
return
|
||||
}
|
||||
mut commit_hash := exec('git rev-parse HEAD')
|
||||
commit_hash = commit_hash[..8]
|
||||
if os.exists('last_commit.txt') {
|
||||
last_commit := os.read_file('last_commit.txt') ?
|
||||
if last_commit.trim_space() == commit_hash.trim_space() {
|
||||
println('No new commits to benchmark. Commit $commit_hash has already been processed.')
|
||||
return
|
||||
}
|
||||
commit_hash = last_commit.trim_space()
|
||||
}
|
||||
if !os.exists('table.html') {
|
||||
os.create('table.html') ?
|
||||
}
|
||||
mut table := os.read_file('table.html') ?
|
||||
/*
|
||||
// Do nothing if it's already been processed.
|
||||
if table.contains(commit_hash) {
|
||||
println('Commit $commit_hash has already been processed')
|
||||
return
|
||||
}
|
||||
*/
|
||||
last_commits := exec('git log --pretty=format:"%h" -n 50').split('\n')
|
||||
// Fetch all unprocessed commits (commits after the last processed commit)
|
||||
mut commits := []string{}
|
||||
println('!last_commit="$commit_hash"')
|
||||
for i, c in last_commits {
|
||||
if c == commit_hash {
|
||||
commits = last_commits[..i].reverse()
|
||||
break
|
||||
}
|
||||
}
|
||||
println(last_commits)
|
||||
println('Commits to benchmark:')
|
||||
println(commits)
|
||||
for i, commit in commits {
|
||||
message := exec('git log --pretty=format:"%s" -n1 $commit')
|
||||
println('\n${i + 1}/$commits.len Benchmarking commit $commit "$message"')
|
||||
// Build an optimized V
|
||||
println('Checking out ${commit}...')
|
||||
exec('git checkout $commit')
|
||||
println(' Building vprod...')
|
||||
exec('v -o $vdir/vprod -prod $vdir/cmd/v')
|
||||
diff1 := measure('$vdir/vprod -cc clang -o v.c $vdir/cmd/v', 'v.c')
|
||||
diff2 := measure('$vdir/vprod -cc clang -o v2 $vdir/cmd/v', 'v2')
|
||||
diff3 := measure('$vdir/vprod -x64 $vdir/cmd/tools/1mil.v', 'x64 1mil')
|
||||
diff4 := measure('$vdir/vprod -cc clang $vdir/examples/hello_world.v', 'hello.v')
|
||||
// println('Building V took ${diff}ms')
|
||||
commit_date := exec('git log -n1 --pretty="format:%at" $commit')
|
||||
date := time.unix(commit_date.int())
|
||||
mut out := os.create('table.html') ?
|
||||
// Place the new row on top
|
||||
table = '<tr>
|
||||
<td>$date.format()</td>
|
||||
<td><a target=_blank href="https://github.com/vlang/v/commit/$commit">$commit</a></td>
|
||||
<td>$message</td>
|
||||
<td>${diff1}ms</td>
|
||||
<td>${diff2}ms</td>
|
||||
<td>${diff3}ms</td>
|
||||
<td>${diff4}ms</td>
|
||||
</tr>\n' +
|
||||
table.trim_space()
|
||||
out.writeln(table)
|
||||
out.close()
|
||||
// Regenerate index.html
|
||||
header := os.read_file('header.html') ?
|
||||
footer := os.read_file('footer.html') ?
|
||||
mut res := os.create('index.html') ?
|
||||
res.writeln(header)
|
||||
res.writeln(table)
|
||||
res.writeln(footer)
|
||||
res.close()
|
||||
}
|
||||
exec('git checkout master')
|
||||
os.write_file('last_commit.txt', commits[commits.len - 1]) ?
|
||||
}
|
||||
|
||||
fn exec(s string) string {
|
||||
e := os.exec(s) or {
|
||||
panic(err)
|
||||
}
|
||||
return e.output.trim_right('\r\n')
|
||||
}
|
||||
|
||||
// returns milliseconds
|
||||
fn measure(cmd string, description string) int {
|
||||
println(' Measuring $description')
|
||||
println(' Warming up...')
|
||||
for _ in 0 .. 3 {
|
||||
exec(cmd)
|
||||
}
|
||||
println(' Building...')
|
||||
mut runs := []int{}
|
||||
for r in 0 .. 5 {
|
||||
println(' Sample ${r+1}/5')
|
||||
sw := time.new_stopwatch({})
|
||||
exec(cmd)
|
||||
runs << int(sw.elapsed().milliseconds())
|
||||
}
|
||||
// discard lowest and highest time
|
||||
runs.sort()
|
||||
runs = runs[1..4]
|
||||
mut sum := 0
|
||||
for run in runs {
|
||||
sum += run
|
||||
}
|
||||
return int(sum / 3)
|
||||
}
|
||||
67
cmd/tools/fast/fast_main.js
Normal file
67
cmd/tools/fast/fast_main.js
Normal file
@@ -0,0 +1,67 @@
|
||||
const delta = 20;
|
||||
|
||||
(function () {
|
||||
var table = document.querySelector("table");
|
||||
var isTbody = table.children[0].nodeName == "TBODY";
|
||||
var trs = isTbody
|
||||
? table.children[0].querySelectorAll("tr")
|
||||
: table.querySelectorAll("tr");
|
||||
trs.forEach(function (tr, idx) {
|
||||
if (idx != 0 && idx + 1 < trs.length) {
|
||||
var vc = 3, vv = 4, vf = 5, vh = 6;
|
||||
var textContent = {
|
||||
vc: tr.children[vc].textContent,
|
||||
vv: tr.children[vv].textContent,
|
||||
vf: tr.children[vf].textContent,
|
||||
vh: tr.children[vh].textContent
|
||||
};
|
||||
var currentData = {
|
||||
vc: int(textContent.vc.slice(0, -2)),
|
||||
vv: int(textContent.vv.slice(0, -2)),
|
||||
vf: int(textContent.vf.slice(0, -2)),
|
||||
vh: int(textContent.vh.slice(0, -2))
|
||||
};
|
||||
var prevData = {
|
||||
vc: int(trs[idx + 1].children[vc].textContent.slice(0, -2)),
|
||||
vv: int(trs[idx + 1].children[vv].textContent.slice(0, -2)),
|
||||
vf: int(trs[idx + 1].children[vf].textContent.slice(0, -2)),
|
||||
vh: int(trs[idx + 1].children[vh].textContent.slice(0, -2))
|
||||
};
|
||||
var result = {
|
||||
vc: currentData.vc - prevData.vc,
|
||||
vv: currentData.vv - prevData.vv,
|
||||
vf: currentData.vf - prevData.vf,
|
||||
vh: currentData.vh - prevData.vh
|
||||
};
|
||||
if (Math.abs(result.vc) > delta)
|
||||
tr.children[vc].appendChild(createElement(result.vc));
|
||||
if (Math.abs(result.vv) > delta * 2)
|
||||
tr.children[vv].appendChild(createElement(result.vv));
|
||||
if (Math.abs(result.vf) > delta * 2)
|
||||
tr.children[vf].appendChild(createElement(result.vf));
|
||||
if (Math.abs(result.vh) > delta * 2)
|
||||
tr.children[vh].appendChild(createElement(result.vh));
|
||||
}
|
||||
});
|
||||
function int(src) {
|
||||
return src - 0;
|
||||
}
|
||||
function getClassName(x) {
|
||||
if (x == 0)
|
||||
return "equal";
|
||||
return x < 0 ? "plus" : "minus";
|
||||
}
|
||||
function createElement(result) {
|
||||
var el = document.createElement("span");
|
||||
var parsedResult = parseResult(result);
|
||||
el.classList.add("diff");
|
||||
el.classList.add(getClassName(result));
|
||||
el.textContent = parsedResult;
|
||||
return el;
|
||||
}
|
||||
function parseResult(x) {
|
||||
if (x == 0)
|
||||
return "0";
|
||||
return x > 0 ? "+" + x : x;
|
||||
}
|
||||
})();
|
||||
4
cmd/tools/fast/footer.html
Normal file
4
cmd/tools/fast/footer.html
Normal file
@@ -0,0 +1,4 @@
|
||||
</table>
|
||||
<script src="main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
55
cmd/tools/fast/header.html
Normal file
55
cmd/tools/fast/header.html
Normal file
@@ -0,0 +1,55 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Is V still fast?</title>
|
||||
<style>
|
||||
*, body {
|
||||
font-family: Menlo, Monospace, 'Courier New';
|
||||
}
|
||||
table, td {
|
||||
border-collapse: collapse;
|
||||
border: 1px solid #dfdfdf;
|
||||
}
|
||||
td {
|
||||
padding: 5px;
|
||||
position: relative;
|
||||
}
|
||||
.diff {
|
||||
border-radius: 2.5px;
|
||||
color: #ffffff;
|
||||
padding: 0 5px 0 5px;
|
||||
position: absolute;
|
||||
right: 5px;
|
||||
}
|
||||
.minus {
|
||||
background-color: rgb(195, 74, 104);
|
||||
}
|
||||
.plus {
|
||||
background-color: #8BC34A;
|
||||
}
|
||||
.equal {
|
||||
background-color: rgb(113, 68, 172);
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h2>Is V still fast?</h2>
|
||||
|
||||
Monitoring compilation speed for each commit. <br><br>
|
||||
Running on an AWS t2.micro instance (1 vCPU). <br><br>
|
||||
Source code: <a target=blank href='https://github.com/vlang/v/blob/master/cmd/tools/fast/fast.v'>fast.v</a> <br><br>
|
||||
|
||||
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td style='width:400px'></td>
|
||||
<td style='width:120px'>v -o v.c</td>
|
||||
<td style='width:120px'>v -o v</td>
|
||||
<td style='width:130px'>v -x64 1mil.v</td>
|
||||
<td style='width:120px'>v hello.v</td>
|
||||
</tr>
|
||||
18
cmd/tools/gen1m.v
Normal file
18
cmd/tools/gen1m.v
Normal file
@@ -0,0 +1,18 @@
|
||||
fn main() {
|
||||
println('fn print(a int) {}')
|
||||
// println('fn println(a string) {}')
|
||||
for i in 0 .. 100000 {
|
||||
println('
|
||||
fn foo${i}() {
|
||||
x := $i
|
||||
mut a := 1
|
||||
a += 2
|
||||
print(a)
|
||||
a = 0
|
||||
a = 1
|
||||
}
|
||||
')
|
||||
}
|
||||
// println('fn main() {foo1()} ')
|
||||
println('fn main() { println("1m DONE") } ')
|
||||
}
|
||||
379
cmd/tools/gen_vc.v
Normal file
379
cmd/tools/gen_vc.v
Normal file
@@ -0,0 +1,379 @@
|
||||
module main
|
||||
|
||||
// This tool regenerates V's bootstrap .c files
|
||||
// every time the V master branch is updated.
|
||||
// if run with the --serve flag it will run in webhook
|
||||
// server mode awaiting a request to http://host:port/genhook
|
||||
// available command line flags:
|
||||
// --work-dir gen_vc's working directory
|
||||
// --purge force purge the local repositories
|
||||
// --serve run in webhook server mode
|
||||
// --port port for http server to listen on
|
||||
// --log-to either 'file' or 'terminal'
|
||||
// --log-file path to log file used when --log-to is 'file'
|
||||
// --dry-run dont push anything to remote repo
|
||||
// --force force update even if already up to date
|
||||
import os
|
||||
import log
|
||||
import flag
|
||||
import time
|
||||
import vweb
|
||||
import net.urllib
|
||||
|
||||
// git credentials
|
||||
const (
|
||||
git_username = os.getenv('GITUSER')
|
||||
git_password = os.getenv('GITPASS')
|
||||
)
|
||||
|
||||
// repository
|
||||
const (
|
||||
// git repo
|
||||
git_repo_v = 'github.com/vlang/v'
|
||||
git_repo_vc = 'github.com/vlang/vc'
|
||||
// local repo directories
|
||||
git_repo_dir_v = 'v'
|
||||
git_repo_dir_vc = 'vc'
|
||||
)
|
||||
|
||||
// gen_vc
|
||||
const (
|
||||
// name
|
||||
app_name = 'gen_vc'
|
||||
// version
|
||||
app_version = '0.1.2'
|
||||
// description
|
||||
app_description = "This tool regenerates V\'s bootstrap .c files every time the V master branch is updated."
|
||||
// assume something went wrong if file size less than this
|
||||
too_short_file_limit = 5000
|
||||
// create a .c file for these os's
|
||||
vc_build_oses = [
|
||||
'nix', // all nix based os
|
||||
'windows',
|
||||
]
|
||||
)
|
||||
|
||||
// default options (overridden by flags)
|
||||
const (
|
||||
// gen_vc working directory
|
||||
work_dir = '/tmp/gen_vc'
|
||||
// dont push anything to remote repo
|
||||
dry_run = false
|
||||
// server port
|
||||
server_port = 7171
|
||||
// log file
|
||||
log_file = '$work_dir/log.txt'
|
||||
// log_to is either 'file' or 'terminal'
|
||||
log_to = 'terminal'
|
||||
)
|
||||
|
||||
// errors
|
||||
const (
|
||||
err_msg_build = 'error building'
|
||||
err_msg_make = 'make failed'
|
||||
err_msg_gen_c = 'failed to generate .c file'
|
||||
err_msg_cmd_x = 'error running cmd'
|
||||
)
|
||||
|
||||
struct GenVC {
|
||||
// logger
|
||||
// flag options
|
||||
options FlagOptions
|
||||
mut:
|
||||
logger &log.Log
|
||||
// true if error was experienced running generate
|
||||
gen_error bool
|
||||
}
|
||||
|
||||
// webhook server
|
||||
struct WebhookServer {
|
||||
pub mut:
|
||||
vweb vweb.Context
|
||||
gen_vc &GenVC
|
||||
}
|
||||
|
||||
// storage for flag options
|
||||
struct FlagOptions {
|
||||
work_dir string
|
||||
purge bool
|
||||
serve bool
|
||||
port int
|
||||
log_to string
|
||||
log_file string
|
||||
dry_run bool
|
||||
force bool
|
||||
}
|
||||
|
||||
fn main() {
|
||||
mut fp := flag.new_flag_parser(os.args.clone())
|
||||
fp.application(app_name)
|
||||
fp.version(app_version)
|
||||
fp.description(app_description)
|
||||
fp.skip_executable()
|
||||
show_help := fp.bool('help', 0, false, 'Show this help screen\n')
|
||||
flag_options := parse_flags(mut fp)
|
||||
if show_help {
|
||||
println(fp.usage())
|
||||
exit(0)
|
||||
}
|
||||
fp.finalize() or {
|
||||
eprintln(err)
|
||||
println(fp.usage())
|
||||
return
|
||||
}
|
||||
// webhook server mode
|
||||
if flag_options.serve {
|
||||
vweb.run<WebhookServer>(flag_options.port)
|
||||
} else {
|
||||
// cmd mode
|
||||
mut gen_vc := new_gen_vc(flag_options)
|
||||
gen_vc.init()
|
||||
gen_vc.generate()
|
||||
}
|
||||
}
|
||||
|
||||
// new GenVC
|
||||
fn new_gen_vc(flag_options FlagOptions) &GenVC {
|
||||
mut logger := &log.Log{}
|
||||
logger.set_level(.debug)
|
||||
if flag_options.log_to == 'file' {
|
||||
logger.set_full_logpath(flag_options.log_file)
|
||||
}
|
||||
return &GenVC{
|
||||
options: flag_options
|
||||
logger: logger
|
||||
}
|
||||
}
|
||||
|
||||
// WebhookServer init
|
||||
pub fn (mut ws WebhookServer) init_once() {
|
||||
mut fp := flag.new_flag_parser(os.args.clone())
|
||||
flag_options := parse_flags(mut fp)
|
||||
ws.gen_vc = new_gen_vc(flag_options)
|
||||
ws.gen_vc.init()
|
||||
// ws.gen_vc = new_gen_vc(flag_options)
|
||||
}
|
||||
|
||||
pub fn (mut ws WebhookServer) init() {
|
||||
// ws.init_once()
|
||||
}
|
||||
|
||||
pub fn (mut ws WebhookServer) index() {
|
||||
eprintln('WebhookServer.index() called')
|
||||
}
|
||||
|
||||
// gen webhook
|
||||
pub fn (mut ws WebhookServer) genhook() {
|
||||
// request data
|
||||
// println(ws.vweb.req.data)
|
||||
// TODO: parse request. json or urlencoded
|
||||
// json.decode or net.urllib.parse
|
||||
ws.gen_vc.generate()
|
||||
// error in generate
|
||||
if ws.gen_vc.gen_error {
|
||||
ws.vweb.json('{status: "failed"}')
|
||||
return
|
||||
}
|
||||
ws.vweb.json('{status: "ok"}')
|
||||
}
|
||||
|
||||
pub fn (ws &WebhookServer) reset() {
|
||||
}
|
||||
|
||||
// parse flags to FlagOptions struct
|
||||
fn parse_flags(mut fp flag.FlagParser) FlagOptions {
|
||||
return FlagOptions{
|
||||
serve: fp.bool('serve', 0, false, 'run in webhook server mode')
|
||||
work_dir: fp.string('work-dir', 0, work_dir, 'gen_vc working directory')
|
||||
purge: fp.bool('purge', 0, false, 'force purge the local repositories')
|
||||
port: fp.int('port', 0, server_port, 'port for web server to listen on')
|
||||
log_to: fp.string('log-to', 0, log_to, "log to is \'file\' or \'terminal\'")
|
||||
log_file: fp.string('log-file', 0, log_file, "log file to use when log-to is \'file\'")
|
||||
dry_run: fp.bool('dry-run', 0, dry_run, 'when specified dont push anything to remote repo')
|
||||
force: fp.bool('force', 0, false, 'force update even if already up to date')
|
||||
}
|
||||
}
|
||||
|
||||
// init
|
||||
fn (mut gen_vc GenVC) init() {
|
||||
// purge repos if flag is passed
|
||||
if gen_vc.options.purge {
|
||||
gen_vc.purge_repos()
|
||||
}
|
||||
}
|
||||
|
||||
// regenerate
|
||||
fn (mut gen_vc GenVC) generate() {
|
||||
// set errors to false
|
||||
gen_vc.gen_error = false
|
||||
// check if gen_vc dir exists
|
||||
if !os.is_dir(gen_vc.options.work_dir) {
|
||||
// try create
|
||||
os.mkdir(gen_vc.options.work_dir) or {
|
||||
panic(err)
|
||||
}
|
||||
// still dosen't exist... we have a problem
|
||||
if !os.is_dir(gen_vc.options.work_dir) {
|
||||
gen_vc.logger.error('error creating directory: $gen_vc.options.work_dir')
|
||||
gen_vc.gen_error = true
|
||||
return
|
||||
}
|
||||
}
|
||||
// cd to gen_vc dir
|
||||
os.chdir(gen_vc.options.work_dir)
|
||||
// if we are not running with the --serve flag (webhook server)
|
||||
// rather than deleting and re-downloading the repo each time
|
||||
// first check to see if the local v repo is behind master
|
||||
// if it isn't behind theres no point continuing further
|
||||
if !gen_vc.options.serve && os.is_dir(git_repo_dir_v) {
|
||||
gen_vc.cmd_exec('git -C $git_repo_dir_v checkout master')
|
||||
// fetch the remote repo just in case there are newer commits there
|
||||
gen_vc.cmd_exec('git -C $git_repo_dir_v fetch')
|
||||
git_status := gen_vc.cmd_exec('git -C $git_repo_dir_v status')
|
||||
if !git_status.contains('behind') && !gen_vc.options.force {
|
||||
gen_vc.logger.warn('v repository is already up to date.')
|
||||
return
|
||||
}
|
||||
}
|
||||
// delete repos
|
||||
gen_vc.purge_repos()
|
||||
// clone repos
|
||||
gen_vc.cmd_exec('git clone --depth 1 https://$git_repo_v $git_repo_dir_v')
|
||||
gen_vc.cmd_exec('git clone --depth 1 https://$git_repo_vc $git_repo_dir_vc')
|
||||
// get output of git log -1 (last commit)
|
||||
git_log_v := gen_vc.cmd_exec('git -C $git_repo_dir_v log -1 --format="commit %H%nDate: %ci%nDate Unix: %ct%nSubject: %s"')
|
||||
git_log_vc := gen_vc.cmd_exec('git -C $git_repo_dir_vc log -1 --format="Commit %H%nDate: %ci%nDate Unix: %ct%nSubject: %s"')
|
||||
// date of last commit in each repo
|
||||
ts_v := git_log_v.find_between('Date:', '\n').trim_space()
|
||||
ts_vc := git_log_vc.find_between('Date:', '\n').trim_space()
|
||||
// parse time as string to time.Time
|
||||
last_commit_time_v := time.parse(ts_v) or {
|
||||
panic(err)
|
||||
}
|
||||
last_commit_time_vc := time.parse(ts_vc) or {
|
||||
panic(err)
|
||||
}
|
||||
// git dates are in users local timezone and v time.parse does not parse
|
||||
// timezones at the moment, so for now get unix timestamp from output also
|
||||
t_unix_v := git_log_v.find_between('Date Unix:', '\n').trim_space().int()
|
||||
t_unix_vc := git_log_vc.find_between('Date Unix:', '\n').trim_space().int()
|
||||
// last commit hash in v repo
|
||||
last_commit_hash_v := git_log_v.find_between('commit', '\n').trim_space()
|
||||
last_commit_hash_v_short := last_commit_hash_v[..7]
|
||||
// subject
|
||||
last_commit_subject := git_log_v.find_between('Subject:', '\n').trim_space().replace('"',
|
||||
'\\"')
|
||||
// log some info
|
||||
gen_vc.logger.debug('last commit time ($git_repo_v): ' + last_commit_time_v.format_ss())
|
||||
gen_vc.logger.debug('last commit time ($git_repo_vc): ' + last_commit_time_vc.format_ss())
|
||||
gen_vc.logger.debug('last commit hash ($git_repo_v): $last_commit_hash_v')
|
||||
gen_vc.logger.debug('last commit subject ($git_repo_v): $last_commit_subject')
|
||||
// if vc repo already has a newer commit than the v repo, assume it's up to date
|
||||
if t_unix_vc >= t_unix_v && !gen_vc.options.force {
|
||||
gen_vc.logger.warn('vc repository is already up to date.')
|
||||
return
|
||||
}
|
||||
// try build v for current os (linux in this case)
|
||||
gen_vc.cmd_exec('make -C $git_repo_dir_v')
|
||||
v_exec := '$git_repo_dir_v/v'
|
||||
// check if make was successful
|
||||
gen_vc.assert_file_exists_and_is_not_too_short(v_exec, err_msg_make)
|
||||
// build v.c for each os
|
||||
for os_name in vc_build_oses {
|
||||
vc_suffix := if os_name == 'nix' { '' } else { '_${os_name[..3]}' }
|
||||
v_flags := if os_name == 'nix' { '-os cross' } else { '-os $os_name' }
|
||||
c_file := 'v${vc_suffix}.c'
|
||||
// try generate .c file
|
||||
gen_vc.cmd_exec('$v_exec $v_flags -o $c_file $git_repo_dir_v/cmd/v')
|
||||
// check if the c file seems ok
|
||||
gen_vc.assert_file_exists_and_is_not_too_short(c_file, err_msg_gen_c)
|
||||
// embed the latest v commit hash into the c file
|
||||
gen_vc.cmd_exec('sed -i \'1s/^/#define V_COMMIT_HASH "$last_commit_hash_v_short"\\n/\' $c_file')
|
||||
// move to vc repo
|
||||
gen_vc.cmd_exec('mv $c_file $git_repo_dir_vc/$c_file')
|
||||
// add new .c file to local vc repo
|
||||
gen_vc.cmd_exec('git -C $git_repo_dir_vc add $c_file')
|
||||
}
|
||||
// check if the vc repo actually changed
|
||||
git_status := gen_vc.cmd_exec('git -C $git_repo_dir_vc status')
|
||||
if git_status.contains('nothing to commit') {
|
||||
gen_vc.logger.error('no changes to vc repo: something went wrong.')
|
||||
gen_vc.gen_error = true
|
||||
}
|
||||
// commit changes to local vc repo
|
||||
gen_vc.cmd_exec_safe('git -C $git_repo_dir_vc commit -m "[v:master] $last_commit_hash_v_short - $last_commit_subject"')
|
||||
// push changes to remote vc repo
|
||||
gen_vc.cmd_exec_safe('git -C $git_repo_dir_vc push https://${urllib.query_escape(git_username)}:${urllib.query_escape(git_password)}@$git_repo_vc master')
|
||||
}
|
||||
|
||||
// only execute when dry_run option is false, otherwise just log
|
||||
fn (mut gen_vc GenVC) cmd_exec_safe(cmd string) string {
|
||||
return gen_vc.command_execute(cmd, gen_vc.options.dry_run)
|
||||
}
|
||||
|
||||
// always execute command
|
||||
fn (mut gen_vc GenVC) cmd_exec(cmd string) string {
|
||||
return gen_vc.command_execute(cmd, false)
|
||||
}
|
||||
|
||||
// execute command
|
||||
fn (mut gen_vc GenVC) command_execute(cmd string, dry bool) string {
|
||||
// if dry is true then dont execute, just log
|
||||
if dry {
|
||||
return gen_vc.command_execute_dry(cmd)
|
||||
}
|
||||
gen_vc.logger.info('cmd: $cmd')
|
||||
r := os.exec(cmd) or {
|
||||
gen_vc.logger.error('$err_msg_cmd_x: "$cmd" could not start.')
|
||||
gen_vc.logger.error(err)
|
||||
// something went wrong, better start fresh next time
|
||||
gen_vc.purge_repos()
|
||||
gen_vc.gen_error = true
|
||||
return ''
|
||||
}
|
||||
if r.exit_code != 0 {
|
||||
gen_vc.logger.error('$err_msg_cmd_x: "$cmd" failed.')
|
||||
gen_vc.logger.error(r.output)
|
||||
// something went wrong, better start fresh next time
|
||||
gen_vc.purge_repos()
|
||||
gen_vc.gen_error = true
|
||||
return ''
|
||||
}
|
||||
return r.output
|
||||
}
|
||||
|
||||
// just log cmd, dont execute
|
||||
fn (mut gen_vc GenVC) command_execute_dry(cmd string) string {
|
||||
gen_vc.logger.info('cmd (dry): "$cmd"')
|
||||
return ''
|
||||
}
|
||||
|
||||
// delete repo directories
|
||||
fn (mut gen_vc GenVC) purge_repos() {
|
||||
// delete old repos (better to be fully explicit here, since these are destructive operations)
|
||||
mut repo_dir := '$gen_vc.options.work_dir/$git_repo_dir_v'
|
||||
if os.is_dir(repo_dir) {
|
||||
gen_vc.logger.info('purging local repo: "$repo_dir"')
|
||||
gen_vc.cmd_exec('rm -rf $repo_dir')
|
||||
}
|
||||
repo_dir = '$gen_vc.options.work_dir/$git_repo_dir_vc'
|
||||
if os.is_dir(repo_dir) {
|
||||
gen_vc.logger.info('purging local repo: "$repo_dir"')
|
||||
gen_vc.cmd_exec('rm -rf $repo_dir')
|
||||
}
|
||||
}
|
||||
|
||||
// check if file size is too short
|
||||
fn (mut gen_vc GenVC) assert_file_exists_and_is_not_too_short(f string, emsg string) {
|
||||
if !os.exists(f) {
|
||||
gen_vc.logger.error('$err_msg_build: $emsg .')
|
||||
gen_vc.gen_error = true
|
||||
return
|
||||
}
|
||||
fsize := os.file_size(f)
|
||||
if fsize < too_short_file_limit {
|
||||
gen_vc.logger.error('$err_msg_build: $f exists, but is too short: only $fsize bytes.')
|
||||
gen_vc.gen_error = true
|
||||
return
|
||||
}
|
||||
}
|
||||
121
cmd/tools/modules/scripting/scripting.v
Normal file
121
cmd/tools/modules/scripting/scripting.v
Normal file
@@ -0,0 +1,121 @@
|
||||
module scripting
|
||||
|
||||
import os
|
||||
import term
|
||||
|
||||
const (
|
||||
term_colors = term.can_show_color_on_stdout()
|
||||
)
|
||||
|
||||
pub fn set_verbose(on bool) {
|
||||
// setting a global here would be the obvious solution,
|
||||
// but V does not have globals normally.
|
||||
if on {
|
||||
os.setenv('VERBOSE', '1', true)
|
||||
}
|
||||
else {
|
||||
os.unsetenv('VERBOSE')
|
||||
}
|
||||
}
|
||||
|
||||
pub fn cprintln(message string) {
|
||||
mut omessage := message
|
||||
omessage = if term_colors { term.green(omessage) } else { omessage }
|
||||
println(omessage)
|
||||
}
|
||||
|
||||
pub fn verbose_trace(label string, message string) {
|
||||
if os.getenv('VERBOSE').len > 0 {
|
||||
slabel := 'scripting.${label}'
|
||||
cprintln('# ${slabel:-25s} : $message')
|
||||
}
|
||||
}
|
||||
|
||||
pub fn verbose_trace_exec_result(x os.Result) {
|
||||
if os.getenv('VERBOSE').len > 0 {
|
||||
cprintln('# cmd.exit_code : ${x.exit_code.str():-4s} cmd.output:')
|
||||
cprintln('# ----------------------------------- #')
|
||||
mut lnum := 1
|
||||
lines := x.output.split_into_lines()
|
||||
for line in lines {
|
||||
cprintln('# ${lnum:3d}: $line')
|
||||
lnum++
|
||||
}
|
||||
cprintln('# ----------------------------------- #')
|
||||
}
|
||||
}
|
||||
|
||||
pub fn chdir(path string) {
|
||||
verbose_trace(@FN, 'cd $path')
|
||||
os.chdir(path)
|
||||
}
|
||||
|
||||
pub fn rmrf(path string) {
|
||||
verbose_trace(@FN, 'rm -rf $path')
|
||||
if os.exists(path) {
|
||||
if os.is_dir(path) {
|
||||
os.rmdir_all(path)
|
||||
}else{
|
||||
os.rm(path)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn exec(cmd string) ?os.Result {
|
||||
verbose_trace(@FN, cmd)
|
||||
x := os.exec(cmd) or {
|
||||
verbose_trace(@FN, '## failed.')
|
||||
return error(err)
|
||||
}
|
||||
verbose_trace_exec_result(x)
|
||||
return x
|
||||
}
|
||||
|
||||
pub fn run(cmd string) string {
|
||||
verbose_trace(@FN, cmd)
|
||||
x := os.exec(cmd) or {
|
||||
verbose_trace(@FN, '## failed.')
|
||||
return ''
|
||||
}
|
||||
verbose_trace_exec_result(x)
|
||||
if x.exit_code == 0 {
|
||||
return x.output.trim_right('\r\n')
|
||||
}
|
||||
return ''
|
||||
}
|
||||
|
||||
pub fn exit_0_status(cmd string) bool {
|
||||
verbose_trace(@FN, cmd)
|
||||
x := os.exec(cmd) or {
|
||||
verbose_trace(@FN, '## failed.')
|
||||
return false
|
||||
}
|
||||
verbose_trace_exec_result(x)
|
||||
if x.exit_code == 0 {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
pub fn tool_must_exist (toolcmd string) {
|
||||
verbose_trace(@FN, toolcmd)
|
||||
if exit_0_status('type $toolcmd') {
|
||||
return
|
||||
}
|
||||
eprintln('Missing tool: $toolcmd')
|
||||
eprintln('Please try again after you install it.')
|
||||
exit(1)
|
||||
}
|
||||
|
||||
pub fn used_tools_must_exist(tools []string) {
|
||||
for t in tools {
|
||||
tool_must_exist(t)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn show_sizes_of_files(files []string) {
|
||||
for f in files {
|
||||
size := os.file_size(f)
|
||||
println('${size:10d} $f')
|
||||
}
|
||||
}
|
||||
398
cmd/tools/modules/testing/common.v
Normal file
398
cmd/tools/modules/testing/common.v
Normal file
@@ -0,0 +1,398 @@
|
||||
module testing
|
||||
|
||||
import os
|
||||
import time
|
||||
import term
|
||||
import benchmark
|
||||
import sync
|
||||
import v.pref
|
||||
import v.util.vtest
|
||||
|
||||
pub struct TestSession {
|
||||
pub mut:
|
||||
files []string
|
||||
skip_files []string
|
||||
vexe string
|
||||
vroot string
|
||||
vtmp_dir string
|
||||
vargs string
|
||||
failed bool
|
||||
benchmark benchmark.Benchmark
|
||||
rm_binaries bool = true
|
||||
silent_mode bool
|
||||
progress_mode bool
|
||||
root_relative bool // used by CI runs, so that the output is stable everywhere
|
||||
nmessages chan LogMessage // many publishers, single consumer/printer
|
||||
nmessage_idx int // currently printed message index
|
||||
nprint_ended chan int // read to block till printing ends, 1:1
|
||||
}
|
||||
|
||||
enum MessageKind {
|
||||
ok
|
||||
fail
|
||||
skip
|
||||
sentinel
|
||||
}
|
||||
|
||||
struct LogMessage {
|
||||
message string
|
||||
kind MessageKind
|
||||
}
|
||||
|
||||
pub fn (mut ts TestSession) append_message(kind MessageKind, msg string) {
|
||||
ts.nmessages <- LogMessage{
|
||||
message: msg
|
||||
kind: kind
|
||||
}
|
||||
}
|
||||
|
||||
pub fn (mut ts TestSession) print_messages() {
|
||||
empty := term.header(' ', ' ')
|
||||
mut print_msg_time := time.new_stopwatch({})
|
||||
for {
|
||||
// get a message from the channel of messages to be printed:
|
||||
mut rmessage := <-ts.nmessages
|
||||
if rmessage.kind == .sentinel {
|
||||
// a sentinel for stopping the printing thread
|
||||
if !ts.silent_mode && ts.progress_mode {
|
||||
eprintln('')
|
||||
}
|
||||
ts.nprint_ended <- 0
|
||||
return
|
||||
}
|
||||
ts.nmessage_idx++
|
||||
msg := rmessage.message.replace_each([
|
||||
'TMP1',
|
||||
'${ts.nmessage_idx:1d}',
|
||||
'TMP2',
|
||||
'${ts.nmessage_idx:2d}',
|
||||
'TMP3',
|
||||
'${ts.nmessage_idx:3d}',
|
||||
'TMP4',
|
||||
'${ts.nmessage_idx:4d}',
|
||||
])
|
||||
is_ok := rmessage.kind == .ok
|
||||
//
|
||||
time_passed := print_msg_time.elapsed().seconds()
|
||||
if time_passed > 10 && ts.silent_mode && is_ok {
|
||||
// Even if OK tests are suppressed,
|
||||
// show *at least* 1 result every 10 seconds,
|
||||
// otherwise the CI can seem stuck ...
|
||||
eprintln(msg)
|
||||
print_msg_time.restart()
|
||||
continue
|
||||
}
|
||||
if ts.progress_mode {
|
||||
// progress mode, the last line is rewritten many times:
|
||||
if is_ok && !ts.silent_mode {
|
||||
print('\r$empty\r$msg')
|
||||
} else {
|
||||
// the last \n is needed, so SKIP/FAIL messages
|
||||
// will not get overwritten by the OK ones
|
||||
eprint('\r$empty\r$msg\n')
|
||||
}
|
||||
continue
|
||||
}
|
||||
if !ts.silent_mode || !is_ok {
|
||||
// normal expanded mode, or failures in -silent mode
|
||||
eprintln(msg)
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn new_test_session(_vargs string) TestSession {
|
||||
mut skip_files := []string{}
|
||||
skip_files << '_non_existing_'
|
||||
$if solaris {
|
||||
skip_files << 'examples/gg/gg2.v'
|
||||
skip_files << 'examples/pico/pico.v'
|
||||
skip_files << 'examples/sokol/fonts.v'
|
||||
skip_files << 'examples/sokol/drawing.v'
|
||||
}
|
||||
vargs := _vargs.replace('-progress', '').replace('-progress', '')
|
||||
vexe := pref.vexe_path()
|
||||
new_vtmp_dir := setup_new_vtmp_folder()
|
||||
return TestSession{
|
||||
vexe: vexe
|
||||
vroot: os.dir(vexe)
|
||||
skip_files: skip_files
|
||||
vargs: vargs
|
||||
vtmp_dir: new_vtmp_dir
|
||||
silent_mode: _vargs.contains('-silent')
|
||||
progress_mode: _vargs.contains('-progress')
|
||||
}
|
||||
}
|
||||
|
||||
pub fn (mut ts TestSession) init() {
|
||||
ts.files.sort()
|
||||
ts.benchmark = benchmark.new_benchmark_no_cstep()
|
||||
}
|
||||
|
||||
pub fn (mut ts TestSession) test() {
|
||||
// Ensure that .tmp.c files generated from compiling _test.v files,
|
||||
// are easy to delete at the end, *without* affecting the existing ones.
|
||||
current_wd := os.getwd()
|
||||
if current_wd == os.wd_at_startup && current_wd == ts.vroot {
|
||||
ts.root_relative = true
|
||||
}
|
||||
//
|
||||
ts.init()
|
||||
mut remaining_files := []string{}
|
||||
for dot_relative_file in ts.files {
|
||||
relative_file := dot_relative_file.replace('./', '')
|
||||
file := os.real_path(relative_file)
|
||||
$if windows {
|
||||
if file.contains('sqlite') || file.contains('httpbin') {
|
||||
continue
|
||||
}
|
||||
}
|
||||
$if !macos {
|
||||
if file.contains('customer') {
|
||||
continue
|
||||
}
|
||||
}
|
||||
$if msvc {
|
||||
if file.contains('asm') {
|
||||
continue
|
||||
}
|
||||
}
|
||||
$if tinyc {
|
||||
if file.contains('asm') {
|
||||
continue
|
||||
}
|
||||
}
|
||||
remaining_files << dot_relative_file
|
||||
}
|
||||
remaining_files = vtest.filter_vtest_only(remaining_files, {
|
||||
fix_slashes: false
|
||||
})
|
||||
ts.files = remaining_files
|
||||
ts.benchmark.set_total_expected_steps(remaining_files.len)
|
||||
mut pool_of_test_runners := sync.new_pool_processor({
|
||||
callback: worker_trunner
|
||||
})
|
||||
// for handling messages across threads
|
||||
ts.nmessages = chan LogMessage{cap: 10000}
|
||||
ts.nprint_ended = chan int{cap: 0}
|
||||
ts.nmessage_idx = 0
|
||||
go ts.print_messages()
|
||||
pool_of_test_runners.set_shared_context(ts)
|
||||
pool_of_test_runners.work_on_pointers(remaining_files.pointers())
|
||||
ts.benchmark.stop()
|
||||
ts.append_message(.sentinel, '') // send the sentinel
|
||||
_ := <-ts.nprint_ended // wait for the stop of the printing thread
|
||||
eprintln(term.h_divider('-'))
|
||||
// cleanup generated .tmp.c files after successfull tests:
|
||||
if ts.benchmark.nfail == 0 {
|
||||
if ts.rm_binaries {
|
||||
os.rmdir_all(ts.vtmp_dir)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn worker_trunner(mut p sync.PoolProcessor, idx int, thread_id int) voidptr {
|
||||
mut ts := &TestSession(p.get_shared_context())
|
||||
tmpd := ts.vtmp_dir
|
||||
show_stats := '-stats' in ts.vargs.split(' ')
|
||||
// tls_bench is used to format the step messages/timings
|
||||
mut tls_bench := &benchmark.Benchmark(p.get_thread_context(idx))
|
||||
if isnil(tls_bench) {
|
||||
tls_bench = benchmark.new_benchmark_pointer()
|
||||
tls_bench.set_total_expected_steps(ts.benchmark.nexpected_steps)
|
||||
p.set_thread_context(idx, tls_bench)
|
||||
}
|
||||
tls_bench.no_cstep = true
|
||||
dot_relative_file := p.get_string_item(idx)
|
||||
mut relative_file := dot_relative_file.replace('./', '')
|
||||
if ts.root_relative {
|
||||
relative_file = relative_file.replace(ts.vroot + os.path_separator, '')
|
||||
}
|
||||
file := os.real_path(relative_file)
|
||||
// Ensure that the generated binaries will be stored in the temporary folder.
|
||||
// Remove them after a test passes/fails.
|
||||
fname := os.file_name(file)
|
||||
generated_binary_fname := if os.user_os() == 'windows' { fname.replace('.v', '.exe') } else { fname.replace('.v',
|
||||
'') }
|
||||
generated_binary_fpath := os.join_path(tmpd, generated_binary_fname)
|
||||
if os.exists(generated_binary_fpath) {
|
||||
if ts.rm_binaries {
|
||||
os.rm(generated_binary_fpath)
|
||||
}
|
||||
}
|
||||
mut cmd_options := [ts.vargs]
|
||||
if !ts.vargs.contains('fmt') {
|
||||
cmd_options << ' -o "$generated_binary_fpath"'
|
||||
}
|
||||
cmd := '"$ts.vexe" ' + cmd_options.join(' ') + ' "$file"'
|
||||
ts.benchmark.step()
|
||||
tls_bench.step()
|
||||
if relative_file.replace('\\', '/') in ts.skip_files {
|
||||
ts.benchmark.skip()
|
||||
tls_bench.skip()
|
||||
ts.append_message(.skip, tls_bench.step_message_skip(relative_file))
|
||||
return sync.no_result
|
||||
}
|
||||
if show_stats {
|
||||
ts.append_message(.ok, term.h_divider('-'))
|
||||
status := os.system(cmd)
|
||||
if status == 0 {
|
||||
ts.benchmark.ok()
|
||||
tls_bench.ok()
|
||||
} else {
|
||||
ts.failed = true
|
||||
ts.benchmark.fail()
|
||||
tls_bench.fail()
|
||||
return sync.no_result
|
||||
}
|
||||
} else {
|
||||
r := os.exec(cmd) or {
|
||||
ts.failed = true
|
||||
ts.benchmark.fail()
|
||||
tls_bench.fail()
|
||||
ts.append_message(.fail, tls_bench.step_message_fail(relative_file))
|
||||
return sync.no_result
|
||||
}
|
||||
if r.exit_code != 0 {
|
||||
ts.failed = true
|
||||
ts.benchmark.fail()
|
||||
tls_bench.fail()
|
||||
ts.append_message(.fail, tls_bench.step_message_fail('$relative_file\n$r.output\n'))
|
||||
} else {
|
||||
ts.benchmark.ok()
|
||||
tls_bench.ok()
|
||||
ts.append_message(.ok, tls_bench.step_message_ok(relative_file))
|
||||
}
|
||||
}
|
||||
if os.exists(generated_binary_fpath) {
|
||||
if ts.rm_binaries {
|
||||
os.rm(generated_binary_fpath)
|
||||
}
|
||||
}
|
||||
return sync.no_result
|
||||
}
|
||||
|
||||
pub fn vlib_should_be_present(parent_dir string) {
|
||||
vlib_dir := os.join_path(parent_dir, 'vlib')
|
||||
if !os.is_dir(vlib_dir) {
|
||||
eprintln('$vlib_dir is missing, it must be next to the V executable')
|
||||
exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn v_build_failing(zargs string, folder string) bool {
|
||||
return v_build_failing_skipped(zargs, folder, [])
|
||||
}
|
||||
|
||||
pub fn prepare_test_session(zargs string, folder string, oskipped []string, main_label string) TestSession {
|
||||
vexe := pref.vexe_path()
|
||||
parent_dir := os.dir(vexe)
|
||||
vlib_should_be_present(parent_dir)
|
||||
vargs := zargs.replace(vexe, '')
|
||||
eheader(main_label)
|
||||
if vargs.len > 0 {
|
||||
eprintln('v compiler args: "$vargs"')
|
||||
}
|
||||
mut session := new_test_session(vargs)
|
||||
files := os.walk_ext(os.join_path(parent_dir, folder), '.v')
|
||||
mut mains := []string{}
|
||||
mut skipped := oskipped
|
||||
for f in files {
|
||||
if !f.contains('modules') && !f.contains('preludes') {
|
||||
// $if !linux {
|
||||
// run pg example only on linux
|
||||
if f.contains('/pg/') {
|
||||
continue
|
||||
}
|
||||
// }
|
||||
if f.contains('life_gg') || f.contains('/graph.v') || f.contains('rune.v') {
|
||||
continue
|
||||
}
|
||||
$if windows {
|
||||
// skip pico example on windows
|
||||
if f.ends_with('examples\\pico\\pico.v') {
|
||||
continue
|
||||
}
|
||||
}
|
||||
c := os.read_file(f) or {
|
||||
panic(err)
|
||||
}
|
||||
maxc := if c.len > 300 { 300 } else { c.len }
|
||||
start := c[0..maxc]
|
||||
if start.contains('module ') && !start.contains('module main') {
|
||||
skipped_f := f.replace(os.join_path(parent_dir, ''), '')
|
||||
skipped << skipped_f
|
||||
}
|
||||
mains << f
|
||||
}
|
||||
}
|
||||
session.files << mains
|
||||
session.skip_files << skipped
|
||||
return session
|
||||
}
|
||||
|
||||
pub fn v_build_failing_skipped(zargs string, folder string, oskipped []string) bool {
|
||||
main_label := 'Building $folder ...'
|
||||
finish_label := 'building $folder'
|
||||
mut session := prepare_test_session(zargs, folder, oskipped, main_label)
|
||||
session.test()
|
||||
eprintln(session.benchmark.total_message(finish_label))
|
||||
return session.failed
|
||||
}
|
||||
|
||||
pub fn build_v_cmd_failed(cmd string) bool {
|
||||
res := os.exec(cmd) or {
|
||||
return true
|
||||
}
|
||||
if res.exit_code != 0 {
|
||||
eprintln('')
|
||||
eprintln(res.output)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
pub fn building_any_v_binaries_failed() bool {
|
||||
eheader('Building V binaries...')
|
||||
eprintln('VFLAGS is: "' + os.getenv('VFLAGS') + '"')
|
||||
vexe := pref.vexe_path()
|
||||
parent_dir := os.dir(vexe)
|
||||
vlib_should_be_present(parent_dir)
|
||||
os.chdir(parent_dir)
|
||||
mut failed := false
|
||||
v_build_commands := ['$vexe -o v_g -g cmd/v', '$vexe -o v_prod_g -prod -g cmd/v',
|
||||
'$vexe -o v_cg -cg cmd/v', '$vexe -o v_prod_cg -prod -cg cmd/v', '$vexe -o v_prod -prod cmd/v']
|
||||
mut bmark := benchmark.new_benchmark()
|
||||
for cmd in v_build_commands {
|
||||
bmark.step()
|
||||
if build_v_cmd_failed(cmd) {
|
||||
bmark.fail()
|
||||
failed = true
|
||||
eprintln(bmark.step_message_fail('command: $cmd . See details above ^^^^^^^'))
|
||||
eprintln('')
|
||||
continue
|
||||
}
|
||||
bmark.ok()
|
||||
eprintln(bmark.step_message_ok('command: $cmd'))
|
||||
}
|
||||
bmark.stop()
|
||||
eprintln(term.h_divider('-'))
|
||||
eprintln(bmark.total_message('building v binaries'))
|
||||
return failed
|
||||
}
|
||||
|
||||
pub fn eheader(msg string) {
|
||||
eprintln(term.header(msg, '-'))
|
||||
}
|
||||
|
||||
pub fn header(msg string) {
|
||||
println(term.header(msg, '-'))
|
||||
}
|
||||
|
||||
pub fn setup_new_vtmp_folder() string {
|
||||
now := time.sys_mono_now()
|
||||
new_vtmp_dir := os.join_path(os.temp_dir(), 'v', 'test_session_$now')
|
||||
os.mkdir_all(new_vtmp_dir)
|
||||
os.setenv('VTMP', new_vtmp_dir, true)
|
||||
return new_vtmp_dir
|
||||
}
|
||||
176
cmd/tools/modules/vgit/vgit.v
Normal file
176
cmd/tools/modules/vgit/vgit.v
Normal file
@@ -0,0 +1,176 @@
|
||||
module vgit
|
||||
|
||||
import os
|
||||
import flag
|
||||
import scripting
|
||||
|
||||
const (
|
||||
remote_v_repo_url = 'https://github.com/vlang/v'
|
||||
remote_vc_repo_url = 'https://github.com/vlang/vc'
|
||||
)
|
||||
|
||||
pub fn check_v_commit_timestamp_before_self_rebuilding(v_timestamp int) {
|
||||
if v_timestamp >= 1561805697 {
|
||||
return
|
||||
}
|
||||
eprintln('##################################################################')
|
||||
eprintln('# WARNING: v self rebuilding, before 5b7a1e8 (2019-06-29 12:21) #')
|
||||
eprintln('# required the v executable to be built *inside* #')
|
||||
eprintln('# the toplevel compiler/ folder. #')
|
||||
eprintln('# #')
|
||||
eprintln('# That is not supported by this tool. #')
|
||||
eprintln('# You will have to build it manually there. #')
|
||||
eprintln('##################################################################')
|
||||
}
|
||||
|
||||
pub fn validate_commit_exists(commit string) {
|
||||
if commit.len == 0 {
|
||||
return
|
||||
}
|
||||
cmd := "git cat-file -t \'$commit\' "
|
||||
if !scripting.exit_0_status(cmd) {
|
||||
eprintln('Commit: "$commit" does not exist in the current repository.')
|
||||
exit(3)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn line_to_timestamp_and_commit(line string) (int, string) {
|
||||
parts := line.split(' ')
|
||||
return parts[0].int(), parts[1]
|
||||
}
|
||||
|
||||
pub fn normalized_workpath_for_commit(workdir string, commit string) string {
|
||||
nc := 'v_at_' + commit.replace('^', '_').replace('-', '_').replace('/', '_')
|
||||
return os.real_path(workdir + os.path_separator + nc)
|
||||
}
|
||||
|
||||
pub fn prepare_vc_source(vcdir string, cdir string, commit string) (string, string) {
|
||||
scripting.chdir(cdir)
|
||||
// Building a historic v with the latest vc is not always possible ...
|
||||
// It is more likely, that the vc *at the time of the v commit*,
|
||||
// or slightly before that time will be able to build the historic v:
|
||||
vline := scripting.run('git rev-list -n1 --timestamp "$commit" ')
|
||||
v_timestamp, v_commithash := line_to_timestamp_and_commit(vline)
|
||||
check_v_commit_timestamp_before_self_rebuilding(v_timestamp)
|
||||
scripting.chdir(vcdir)
|
||||
scripting.run('git checkout master')
|
||||
vcbefore := scripting.run('git rev-list HEAD -n1 --timestamp --before=$v_timestamp ')
|
||||
_, vccommit_before := line_to_timestamp_and_commit(vcbefore)
|
||||
scripting.run('git checkout "$vccommit_before" ')
|
||||
scripting.run('wc *.c')
|
||||
scripting.chdir(cdir)
|
||||
return v_commithash, vccommit_before
|
||||
}
|
||||
|
||||
pub fn clone_or_pull(remote_git_url string, local_worktree_path string) {
|
||||
// NB: after clone_or_pull, the current repo branch is === HEAD === master
|
||||
if os.is_dir(local_worktree_path) && os.is_dir(os.join_path(local_worktree_path, '.git')) {
|
||||
// Already existing ... Just pulling in this case is faster usually.
|
||||
scripting.run('git -C "$local_worktree_path" checkout --quiet master')
|
||||
scripting.run('git -C "$local_worktree_path" pull --quiet ')
|
||||
} else {
|
||||
// Clone a fresh
|
||||
scripting.run('git clone --quiet "$remote_git_url" "$local_worktree_path" ')
|
||||
}
|
||||
}
|
||||
|
||||
pub struct VGitContext {
|
||||
pub:
|
||||
cc string = 'cc' // what compiler to use
|
||||
workdir string = '/tmp' // the base working folder
|
||||
commit_v string = 'master' // the commit-ish that needs to be prepared
|
||||
path_v string // where is the local working copy v repo
|
||||
path_vc string // where is the local working copy vc repo
|
||||
v_repo_url string // the remote v repo URL
|
||||
vc_repo_url string // the remote vc repo URL
|
||||
pub mut:
|
||||
// these will be filled by vgitcontext.compile_oldv_if_needed()
|
||||
commit_v__hash string // the git commit of the v repo that should be prepared
|
||||
commit_vc_hash string // the git commit of the vc repo, corresponding to commit_v__hash
|
||||
vexename string // v or v.exe
|
||||
vexepath string // the full absolute path to the prepared v/v.exe
|
||||
vvlocation string // v.v or compiler/ or cmd/v, depending on v version
|
||||
}
|
||||
|
||||
pub fn (mut vgit_context VGitContext) compile_oldv_if_needed() {
|
||||
vgit_context.vexename = if os.user_os() == 'windows' { 'v.exe' } else { 'v' }
|
||||
vgit_context.vexepath = os.real_path(os.join_path(vgit_context.path_v, vgit_context.vexename))
|
||||
mut command_for_building_v_from_c_source := ''
|
||||
mut command_for_selfbuilding := ''
|
||||
if 'windows' == os.user_os() {
|
||||
command_for_building_v_from_c_source = '$vgit_context.cc -std=c99 -municode -w -o cv.exe "$vgit_context.path_vc/v_win.c" '
|
||||
command_for_selfbuilding = './cv.exe -o $vgit_context.vexename {SOURCE}'
|
||||
} else {
|
||||
command_for_building_v_from_c_source = '$vgit_context.cc -std=gnu11 -w -o cv "$vgit_context.path_vc/v.c" -lm -lpthread'
|
||||
command_for_selfbuilding = './cv -o $vgit_context.vexename {SOURCE}'
|
||||
}
|
||||
scripting.chdir(vgit_context.workdir)
|
||||
clone_or_pull(vgit_context.v_repo_url, vgit_context.path_v)
|
||||
clone_or_pull(vgit_context.vc_repo_url, vgit_context.path_vc)
|
||||
scripting.chdir(vgit_context.path_v)
|
||||
scripting.run('git checkout $vgit_context.commit_v')
|
||||
v_commithash, vccommit_before := prepare_vc_source(vgit_context.path_vc, vgit_context.path_v,
|
||||
vgit_context.commit_v)
|
||||
vgit_context.commit_v__hash = v_commithash
|
||||
vgit_context.commit_vc_hash = vccommit_before
|
||||
if os.exists('cmd/v') {
|
||||
vgit_context.vvlocation = 'cmd/v'
|
||||
} else {
|
||||
vgit_context.vvlocation = if os.exists('v.v') { 'v.v' } else { 'compiler' }
|
||||
}
|
||||
if os.is_dir(vgit_context.path_v) && os.exists(vgit_context.vexepath) {
|
||||
// already compiled, so no need to compile v again
|
||||
return
|
||||
}
|
||||
// Recompilation is needed. Just to be sure, clean up everything first.
|
||||
scripting.run('git clean -xf')
|
||||
scripting.run(command_for_building_v_from_c_source)
|
||||
build_cmd := command_for_selfbuilding.replace('{SOURCE}', vgit_context.vvlocation)
|
||||
scripting.run(build_cmd)
|
||||
// At this point, there exists a file vgit_context.vexepath
|
||||
// which should be a valid working V executable.
|
||||
}
|
||||
|
||||
pub struct VGitOptions {
|
||||
pub mut:
|
||||
workdir string // the working folder (typically /tmp), where the tool will write
|
||||
v_repo_url string // the url of the V repository. It can be a local folder path, if you want to eliminate network operations...
|
||||
vc_repo_url string // the url of the vc repository. It can be a local folder path, if you want to eliminate network operations...
|
||||
show_help bool // whether to show the usage screen
|
||||
verbose bool // should the tool be much more verbose
|
||||
}
|
||||
|
||||
pub fn add_common_tool_options(mut context VGitOptions, mut fp flag.FlagParser) []string {
|
||||
tdir := os.temp_dir()
|
||||
context.workdir = os.real_path(fp.string('workdir', `w`, tdir, 'A writable base folder. Default: $tdir'))
|
||||
context.v_repo_url = fp.string('vrepo', 0, remote_v_repo_url, 'The url of the V repository. You can clone it locally too. See also --vcrepo below.')
|
||||
context.vc_repo_url = fp.string('vcrepo', 0, remote_vc_repo_url, 'The url of the vc repository. You can clone it
|
||||
${flag.space}beforehand, and then just give the local folder
|
||||
${flag.space}path here. That will eliminate the network ops
|
||||
${flag.space}done by this tool, which is useful, if you want
|
||||
${flag.space}to script it/run it in a restrictive vps/docker.
|
||||
')
|
||||
context.show_help = fp.bool('help', `h`, false, 'Show this help screen.')
|
||||
context.verbose = fp.bool('verbose', `v`, false, 'Be more verbose.')
|
||||
if context.show_help {
|
||||
println(fp.usage())
|
||||
exit(0)
|
||||
}
|
||||
if context.verbose {
|
||||
scripting.set_verbose(true)
|
||||
}
|
||||
if os.is_dir(context.v_repo_url) {
|
||||
context.v_repo_url = os.real_path(context.v_repo_url)
|
||||
}
|
||||
if os.is_dir(context.vc_repo_url) {
|
||||
context.vc_repo_url = os.real_path(context.vc_repo_url)
|
||||
}
|
||||
commits := fp.finalize() or {
|
||||
eprintln('Error: ' + err)
|
||||
exit(1)
|
||||
}
|
||||
for commit in commits {
|
||||
validate_commit_exists(commit)
|
||||
}
|
||||
return commits
|
||||
}
|
||||
15
cmd/tools/modules/vhelp/vhelp.v
Normal file
15
cmd/tools/modules/vhelp/vhelp.v
Normal file
@@ -0,0 +1,15 @@
|
||||
module vhelp
|
||||
|
||||
import os
|
||||
|
||||
pub fn show_topic(topic string) {
|
||||
vexe := os.real_path(os.getenv('VEXE'))
|
||||
vroot := os.dir(vexe)
|
||||
target_topic := os.join_path(vroot, 'cmd', 'v', 'help', '${topic}.txt')
|
||||
content := os.read_file(target_topic) or {
|
||||
eprintln('Unknown topic: $topic')
|
||||
exit(1)
|
||||
}
|
||||
println(content)
|
||||
}
|
||||
|
||||
110
cmd/tools/oldv.v
Normal file
110
cmd/tools/oldv.v
Normal file
@@ -0,0 +1,110 @@
|
||||
import os
|
||||
import flag
|
||||
import scripting
|
||||
import vgit
|
||||
|
||||
const (
|
||||
tool_version = '0.0.3'
|
||||
tool_description = ' Checkout an old V and compile it as it was on specific commit.
|
||||
| This tool is useful, when you want to discover when something broke.
|
||||
| It is also useful, when you just want to experiment with an older historic V.
|
||||
|
|
||||
| The VCOMMIT argument can be a git commitish like HEAD or master and so on.
|
||||
| When oldv is used with git bisect, you probably want to give HEAD. For example:
|
||||
| git bisect start
|
||||
| git bisect bad
|
||||
| git checkout known_good_commit
|
||||
| git bisect good
|
||||
| ## Now git will automatically checkout a middle commit between the bad and the good
|
||||
| cmd/tools/oldv HEAD --command="run commands in oldv folder, to verify if the commit is good or bad"
|
||||
| ## See what the result is, and either do: ...
|
||||
| git bisect good
|
||||
| ## ... or do:
|
||||
| git bisect bad
|
||||
| ## Now you just repeat the above steps, each time running oldv with the same command, then mark the result as good or bad,
|
||||
| ## until you find the commit, where the problem first occurred.
|
||||
| ## When you finish, do not forget to do:
|
||||
| git bisect reset'.strip_margin()
|
||||
)
|
||||
|
||||
struct Context {
|
||||
mut:
|
||||
vgo vgit.VGitOptions
|
||||
commit_v string = 'master'
|
||||
// the commit from which you want to produce a working v compiler (this may be a commit-ish too)
|
||||
commit_vc string = 'master'
|
||||
// this will be derived from commit_v
|
||||
commit_v_hash string // this will be filled from the commit-ish commit_v using rev-list. It IS a commit hash.
|
||||
path_v string // the full path to the v folder inside workdir.
|
||||
path_vc string // the full path to the vc folder inside workdir.
|
||||
cmd_to_run string // the command that you want to run *in* the oldv repo
|
||||
cc string = 'cc'
|
||||
// the C compiler to use for bootstrapping.
|
||||
cleanup bool // should the tool run a cleanup first
|
||||
}
|
||||
|
||||
fn (mut c Context) compile_oldv_if_needed() {
|
||||
mut vgit_context := vgit.VGitContext{
|
||||
workdir: c.vgo.workdir
|
||||
v_repo_url: c.vgo.v_repo_url
|
||||
vc_repo_url: c.vgo.vc_repo_url
|
||||
cc: c.cc
|
||||
commit_v: c.commit_v
|
||||
path_v: c.path_v
|
||||
path_vc: c.path_vc
|
||||
}
|
||||
vgit_context.compile_oldv_if_needed()
|
||||
c.commit_v_hash = vgit_context.commit_v__hash
|
||||
if !os.exists(vgit_context.vexepath) && c.cmd_to_run.len > 0 {
|
||||
// NB: 125 is a special code, that git bisect understands as 'skip this commit'.
|
||||
// it is used to inform git bisect that the current commit leads to a build failure.
|
||||
exit(125)
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
scripting.used_tools_must_exist(['git', 'cc'])
|
||||
mut context := Context{}
|
||||
mut fp := flag.new_flag_parser(os.args)
|
||||
fp.application(os.file_name(os.executable()))
|
||||
fp.version(tool_version)
|
||||
fp.description(tool_description)
|
||||
fp.arguments_description('VCOMMIT')
|
||||
fp.skip_executable()
|
||||
fp.limit_free_args(1, 1)
|
||||
context.cleanup = fp.bool('clean', 0, true, 'Clean before running (slower).')
|
||||
context.cmd_to_run = fp.string('command', `c`, '', 'Command to run in the old V repo.\n')
|
||||
commits := vgit.add_common_tool_options(mut context.vgo, mut fp)
|
||||
if commits.len > 0 {
|
||||
context.commit_v = commits[0]
|
||||
} else {
|
||||
context.commit_v = scripting.run('git rev-list -n1 HEAD')
|
||||
}
|
||||
scripting.cprintln('################# context.commit_v: $context.commit_v #####################')
|
||||
context.path_v = vgit.normalized_workpath_for_commit(context.vgo.workdir, context.commit_v)
|
||||
context.path_vc = vgit.normalized_workpath_for_commit(context.vgo.workdir, 'vc')
|
||||
if !os.is_dir(context.vgo.workdir) {
|
||||
eprintln('Work folder: $context.vgo.workdir , does not exist.')
|
||||
exit(2)
|
||||
}
|
||||
ecc := os.getenv('CC')
|
||||
if ecc != '' {
|
||||
context.cc = ecc
|
||||
}
|
||||
if context.cleanup {
|
||||
scripting.rmrf(context.path_v)
|
||||
scripting.rmrf(context.path_vc)
|
||||
}
|
||||
context.compile_oldv_if_needed()
|
||||
scripting.chdir(context.path_v)
|
||||
scripting.cprintln('# v commit hash: $context.commit_v_hash')
|
||||
scripting.cprintln('# checkout folder: $context.path_v')
|
||||
if context.cmd_to_run.len > 0 {
|
||||
cmdres := os.exec(context.cmd_to_run) or {
|
||||
panic(err)
|
||||
}
|
||||
scripting.cprintln('# command: ${context.cmd_to_run:-34s} exit code: ${cmdres.exit_code:-4d} result:')
|
||||
println(cmdres.output)
|
||||
exit(cmdres.exit_code)
|
||||
}
|
||||
}
|
||||
194
cmd/tools/performance_compare.v
Normal file
194
cmd/tools/performance_compare.v
Normal file
@@ -0,0 +1,194 @@
|
||||
import os
|
||||
import flag
|
||||
import scripting
|
||||
import vgit
|
||||
|
||||
const (
|
||||
tool_version = '0.0.5'
|
||||
tool_description = " Compares V executable size and performance,
|
||||
| between 2 commits from V\'s local git history.
|
||||
| When only one commit is given, it is compared to master.
|
||||
| ".strip_margin()
|
||||
)
|
||||
|
||||
struct Context {
|
||||
cwd string // current working folder
|
||||
mut:
|
||||
vgo vgit.VGitOptions
|
||||
a string // the full path to the 'after' folder inside workdir
|
||||
b string // the full path to the 'before' folder inside workdir
|
||||
vc string // the full path to the vc folder inside workdir. It is used during bootstrapping v from the C source.
|
||||
commit_before string // the git commit for the 'before' state
|
||||
commit_after string // the git commit for the 'after' state
|
||||
warmups int // how many times to execute a command before gathering stats
|
||||
hyperfineopts string // use for additional CLI options that will be given to the hyperfine command
|
||||
vflags string // other v options to pass to compared v commands
|
||||
}
|
||||
|
||||
fn new_context() Context {
|
||||
return Context{
|
||||
cwd: os.getwd()
|
||||
commit_after: 'master'
|
||||
warmups: 4
|
||||
}
|
||||
}
|
||||
|
||||
fn (c Context) compare_versions() {
|
||||
// Input is validated at this point...
|
||||
// Cleanup artifacts from previous runs of this tool:
|
||||
scripting.chdir(c.vgo.workdir)
|
||||
scripting.run('rm -rf "$c.a" "$c.b" "$c.vc" ')
|
||||
// clone the VC source *just once per comparison*, and reuse it:
|
||||
scripting.run('git clone --quiet "$c.vgo.vc_repo_url" "$c.vc" ')
|
||||
println('Comparing V performance of commit $c.commit_before (before) vs commit $c.commit_after (after) ...')
|
||||
c.prepare_v(c.b, c.commit_before)
|
||||
c.prepare_v(c.a, c.commit_after)
|
||||
scripting.chdir(c.vgo.workdir)
|
||||
if c.vflags.len > 0 {
|
||||
os.setenv('VFLAGS', c.vflags, true)
|
||||
}
|
||||
// The first is the baseline, against which all the others will be compared.
|
||||
// It is the fastest, since hello_world.v has only a single println in it,
|
||||
mut perf_files := []string{}
|
||||
perf_files <<
|
||||
c.compare_v_performance('source_hello', ['vprod @DEBUG@ -o source.c examples/hello_world.v', 'vprod -o source.c examples/hello_world.v', 'v @DEBUG@ -o source.c examples/hello_world.v', 'v -o source.c examples/hello_world.v'])
|
||||
perf_files <<
|
||||
c.compare_v_performance('source_v', ['vprod @DEBUG@ -o source.c @COMPILER@', 'vprod -o source.c @COMPILER@', 'v @DEBUG@ -o source.c @COMPILER@', 'v -o source.c @COMPILER@'])
|
||||
perf_files <<
|
||||
c.compare_v_performance('binary_hello', ['vprod -o hello examples/hello_world.v', 'v -o hello examples/hello_world.v'])
|
||||
perf_files <<
|
||||
c.compare_v_performance('binary_v', ['vprod -o binary @COMPILER@', 'v -o binary @COMPILER@'])
|
||||
println('All performance files:')
|
||||
for f in perf_files {
|
||||
println(' $f')
|
||||
}
|
||||
}
|
||||
|
||||
fn (c &Context) prepare_v(cdir string, commit string) {
|
||||
mut cc := os.getenv('CC')
|
||||
if cc == '' {
|
||||
cc = 'cc'
|
||||
}
|
||||
mut vgit_context := vgit.VGitContext{
|
||||
cc: cc
|
||||
commit_v: commit
|
||||
path_v: cdir
|
||||
path_vc: c.vc
|
||||
workdir: c.vgo.workdir
|
||||
v_repo_url: c.vgo.v_repo_url
|
||||
vc_repo_url: c.vgo.vc_repo_url
|
||||
}
|
||||
vgit_context.compile_oldv_if_needed()
|
||||
scripting.chdir(cdir)
|
||||
println('Making a v compiler in $cdir')
|
||||
scripting.run('./v -cc $cc -o v $vgit_context.vvlocation')
|
||||
println('Making a vprod compiler in $cdir')
|
||||
scripting.run('./v -cc $cc -prod -o vprod $vgit_context.vvlocation')
|
||||
println('Stripping and compressing cv v and vprod binaries in $cdir')
|
||||
scripting.run('cp cv cv_stripped')
|
||||
scripting.run('cp v v_stripped')
|
||||
scripting.run('cp vprod vprod_stripped')
|
||||
scripting.run('strip *_stripped')
|
||||
scripting.run('cp cv_stripped cv_stripped_upxed')
|
||||
scripting.run('cp v_stripped v_stripped_upxed')
|
||||
scripting.run('cp vprod_stripped vprod_stripped_upxed')
|
||||
scripting.run('upx -qqq --lzma cv_stripped_upxed')
|
||||
scripting.run('upx -qqq --lzma v_stripped_upxed')
|
||||
scripting.run('upx -qqq --lzma vprod_stripped_upxed')
|
||||
scripting.show_sizes_of_files(['$cdir/cv', '$cdir/cv_stripped', '$cdir/cv_stripped_upxed'])
|
||||
scripting.show_sizes_of_files(['$cdir/v', '$cdir/v_stripped', '$cdir/v_stripped_upxed'])
|
||||
scripting.show_sizes_of_files(['$cdir/vprod', '$cdir/vprod_stripped', '$cdir/vprod_stripped_upxed'])
|
||||
vversion := scripting.run('$cdir/v -version')
|
||||
vcommit := scripting.run('git rev-parse --short --verify HEAD')
|
||||
println('V version is: $vversion , local source commit: $vcommit')
|
||||
if vgit_context.vvlocation == 'cmd/v' {
|
||||
if os.exists('vlib/v/ast/ast.v') {
|
||||
println('Source lines of the compiler: ' +
|
||||
scripting.run('find cmd/v/ vlib/v/ -name "*.v" | grep -v /tests/ | xargs wc | tail -n -1'))
|
||||
} else {
|
||||
println('Source lines of the compiler: ' +
|
||||
scripting.run('wc cmd/v/*.v vlib/compiler/*.v | tail -n -1'))
|
||||
}
|
||||
} else if vgit_context.vvlocation == 'v.v' {
|
||||
println('Source lines of the compiler: ' + scripting.run('wc v.v vlib/compiler/*.v | tail -n -1'))
|
||||
} else {
|
||||
println('Source lines of the compiler: ' + scripting.run('wc compiler/*.v | tail -n -1'))
|
||||
}
|
||||
}
|
||||
|
||||
fn (c Context) compare_v_performance(label string, commands []string) string {
|
||||
println('---------------------------------------------------------------------------------')
|
||||
println('Compare v performance when doing the following commands ($label):')
|
||||
mut source_location_a := ''
|
||||
mut source_location_b := ''
|
||||
if os.exists('$c.a/cmd/v') {
|
||||
source_location_a = 'cmd/v'
|
||||
} else {
|
||||
source_location_a = if os.exists('$c.a/v.v') { 'v.v ' } else { 'compiler/ ' }
|
||||
}
|
||||
if os.exists('$c.b/cmd/v') {
|
||||
source_location_b = 'cmd/v'
|
||||
} else {
|
||||
source_location_b = if os.exists('$c.b/v.v') { 'v.v ' } else { 'compiler/ ' }
|
||||
}
|
||||
timestamp_a, _ := vgit.line_to_timestamp_and_commit(scripting.run('cd $c.a/ ; git rev-list -n1 --timestamp HEAD'))
|
||||
timestamp_b, _ := vgit.line_to_timestamp_and_commit(scripting.run('cd $c.b/ ; git rev-list -n1 --timestamp HEAD'))
|
||||
debug_option_a := if timestamp_a > 1570877641 { '-cg ' } else { '-debug ' }
|
||||
debug_option_b := if timestamp_b > 1570877641 { '-cg ' } else { '-debug ' }
|
||||
mut hyperfine_commands_arguments := []string{}
|
||||
for cmd in commands {
|
||||
println(cmd)
|
||||
}
|
||||
for cmd in commands {
|
||||
hyperfine_commands_arguments <<
|
||||
" \'cd ${c.b:-34s} ; ./$cmd \' ".replace_each(['@COMPILER@', source_location_b, '@DEBUG@', debug_option_b])
|
||||
}
|
||||
for cmd in commands {
|
||||
hyperfine_commands_arguments <<
|
||||
" \'cd ${c.a:-34s} ; ./$cmd \' ".replace_each(['@COMPILER@', source_location_a, '@DEBUG@', debug_option_a])
|
||||
}
|
||||
// /////////////////////////////////////////////////////////////////////////////
|
||||
cmd_stats_file := os.real_path([c.vgo.workdir, 'v_performance_stats_${label}.json'].join(os.path_separator))
|
||||
comparison_cmd := 'hyperfine $c.hyperfineopts ' + '--export-json $cmd_stats_file ' + '--time-unit millisecond ' +
|
||||
'--style full --warmup $c.warmups ' + hyperfine_commands_arguments.join(' ')
|
||||
// /////////////////////////////////////////////////////////////////////////////
|
||||
if c.vgo.verbose {
|
||||
println(comparison_cmd)
|
||||
}
|
||||
os.system(comparison_cmd)
|
||||
println('The detailed performance comparison report was saved to: $cmd_stats_file .')
|
||||
println('')
|
||||
return cmd_stats_file
|
||||
}
|
||||
|
||||
fn main() {
|
||||
scripting.used_tools_must_exist(['cp', 'rm', 'strip', 'make', 'git', 'upx', 'cc', 'wc', 'tail',
|
||||
'find', 'xargs', 'hyperfine'])
|
||||
mut context := new_context()
|
||||
mut fp := flag.new_flag_parser(os.args)
|
||||
fp.application(os.file_name(os.executable()))
|
||||
fp.version(tool_version)
|
||||
fp.description(tool_description)
|
||||
fp.arguments_description('COMMIT_BEFORE [COMMIT_AFTER]')
|
||||
fp.skip_executable()
|
||||
fp.limit_free_args(1, 2)
|
||||
context.vflags = fp.string('vflags', 0, '', 'Additional options to pass to the v commands, for example "-cc tcc"')
|
||||
context.hyperfineopts = fp.string('hyperfine_options', 0, '', 'Additional options passed to hyperfine.
|
||||
${flag.space}For example on linux, you may want to pass:
|
||||
$flag.space--hyperfine_options "--prepare \'sync; echo 3 | sudo tee /proc/sys/vm/drop_caches\'"
|
||||
')
|
||||
commits := vgit.add_common_tool_options(mut context.vgo, mut fp)
|
||||
context.commit_before = commits[0]
|
||||
if commits.len > 1 {
|
||||
context.commit_after = commits[1]
|
||||
}
|
||||
context.b = vgit.normalized_workpath_for_commit(context.vgo.workdir, context.commit_before)
|
||||
context.a = vgit.normalized_workpath_for_commit(context.vgo.workdir, context.commit_after)
|
||||
context.vc = vgit.normalized_workpath_for_commit(context.vgo.workdir, 'vc')
|
||||
if !os.is_dir(context.vgo.workdir) {
|
||||
msg := 'Work folder: ' + context.vgo.workdir + ' , does not exist.'
|
||||
eprintln(msg)
|
||||
exit(2)
|
||||
}
|
||||
context.compare_versions()
|
||||
}
|
||||
28
cmd/tools/preludes/README.md
Normal file
28
cmd/tools/preludes/README.md
Normal file
@@ -0,0 +1,28 @@
|
||||
# V preludes:
|
||||
|
||||
The cmd/tools/preludes/ contains small v code snippets, that V uses when
|
||||
compiling certain v programs. V adds the files below automatically itself.
|
||||
Each file is used in different situations (see below).
|
||||
|
||||
NB: preludes are *NOT* intended to be used by user programs/modules.
|
||||
The folder cmd/tools/preludes/ is *NOT* a v module.
|
||||
|
||||
## Details:
|
||||
|
||||
### cmd/tools/preludes/live_main.v
|
||||
Used when compiling live programs. This file is used by the main executable
|
||||
live program, that starts the file change monitoring thread. Each live program
|
||||
needs module `os` and module `time`, in order for the background file change
|
||||
monitoring thread to work properly.
|
||||
|
||||
### cmd/tools/preludes/live_shared.v
|
||||
Used when compiling live programs, for the shared library portion of the live
|
||||
programs, that is reloaded each time the code is changed.
|
||||
|
||||
### cmd/tools/preludes/tests_assertions.v
|
||||
Used when compiling `_test.v` programs.
|
||||
It specifies how failed assertions will look.
|
||||
|
||||
### cmd/tools/preludes/tests_with_stats.v
|
||||
Used when compiling `_test.v` programs with -stats option.
|
||||
It specifies how the result will appear ('assert' vs 'asserts' and so on).
|
||||
9
cmd/tools/preludes/live.v
Normal file
9
cmd/tools/preludes/live.v
Normal file
@@ -0,0 +1,9 @@
|
||||
module main
|
||||
|
||||
// This prelude is loaded in every v program compiled with -live,
|
||||
// in both the main executable, and in the shared library.
|
||||
import live
|
||||
|
||||
const (
|
||||
no_warning_live_is_used = live.is_used
|
||||
)
|
||||
9
cmd/tools/preludes/live_main.v
Normal file
9
cmd/tools/preludes/live_main.v
Normal file
@@ -0,0 +1,9 @@
|
||||
module main
|
||||
|
||||
// This prelude is loaded in every v program compiled with -live,
|
||||
// but only for the main executable.
|
||||
import live.executable
|
||||
|
||||
const (
|
||||
no_warning_live_executable_is_used = executable.is_used
|
||||
)
|
||||
9
cmd/tools/preludes/live_shared.v
Normal file
9
cmd/tools/preludes/live_shared.v
Normal file
@@ -0,0 +1,9 @@
|
||||
module main
|
||||
|
||||
// This prelude is loaded in every v program compiled with -live,
|
||||
// but only for the shared library.
|
||||
import live.sharedlib
|
||||
|
||||
const (
|
||||
no_warning_live_shared_is_used = sharedlib.is_used
|
||||
)
|
||||
7
cmd/tools/preludes/profiled_program.v
Normal file
7
cmd/tools/preludes/profiled_program.v
Normal file
@@ -0,0 +1,7 @@
|
||||
module main
|
||||
|
||||
import time
|
||||
|
||||
const (
|
||||
profiled_program_time_used = time.seconds_per_minute
|
||||
)
|
||||
44
cmd/tools/preludes/tests_assertions.v
Normal file
44
cmd/tools/preludes/tests_assertions.v
Normal file
@@ -0,0 +1,44 @@
|
||||
module main
|
||||
|
||||
import os
|
||||
import term
|
||||
|
||||
// //////////////////////////////////////////////////////////////////
|
||||
// / This file will get compiled as part of the main program,
|
||||
// / for a _test.v file.
|
||||
// / The methods defined here are called back by the test program's
|
||||
// / assert statements, on each success/fail. The goal is to make
|
||||
// / customizing the look & feel of the assertions results easier,
|
||||
// / since it is done in normal V code, instead of in embedded C ...
|
||||
// //////////////////////////////////////////////////////////////////
|
||||
// TODO copy pasta builtin.v fn ___print_assert_failure
|
||||
fn cb_assertion_failed(i &VAssertMetaInfo) {
|
||||
use_color := term.can_show_color_on_stderr()
|
||||
use_relative_paths := match os.getenv('VERROR_PATHS') {
|
||||
'absolute' { false }
|
||||
else { true }
|
||||
}
|
||||
final_filename := if use_relative_paths { i.fpath } else { os.real_path(i.fpath) }
|
||||
final_funcname := i.fn_name.replace('main.', '').replace('__', '.')
|
||||
final_src := if use_color { term.bold(i.src) } else { i.src }
|
||||
eprintln('')
|
||||
eprintln('$final_filename:${i.line_nr+1}: failed assert in function $final_funcname')
|
||||
eprintln('Source : `$final_src`')
|
||||
if i.op.len > 0 && i.op != 'call' {
|
||||
mut slvalue := '$i.lvalue'
|
||||
mut srvalue := '$i.rvalue'
|
||||
lpostfix := if slvalue == i.llabel { '.' } else { '<= `$i.llabel`' }
|
||||
rpostfix := if srvalue == i.rlabel { '.' } else { '<= `$i.rlabel`' }
|
||||
if use_color {
|
||||
slvalue = term.bold(term.yellow(slvalue))
|
||||
srvalue = term.bold(term.yellow(srvalue))
|
||||
}
|
||||
eprintln(' left value: $slvalue $lpostfix')
|
||||
eprintln(' right value: $srvalue $rpostfix')
|
||||
}
|
||||
}
|
||||
|
||||
fn cb_assertion_ok(i &VAssertMetaInfo) {
|
||||
// do nothing for now on an OK assertion
|
||||
// println('OK ${(i.line_nr+1):5d}|${i.src}')
|
||||
}
|
||||
91
cmd/tools/preludes/tests_with_stats.v
Normal file
91
cmd/tools/preludes/tests_with_stats.v
Normal file
@@ -0,0 +1,91 @@
|
||||
module main
|
||||
|
||||
// /////////////////////////////////////////////////////////////////////
|
||||
// / This file will get compiled as a part of the same module,
|
||||
// / in which a given _test.v file is, when v is given -stats argument
|
||||
// / The methods defined here are called back by the test program's
|
||||
// / main function, so that customizing the look & feel of the results
|
||||
// / is easy, since it is done in normal V code, instead of in embedded C ...
|
||||
// /////////////////////////////////////////////////////////////////////
|
||||
import os
|
||||
import benchmark
|
||||
|
||||
const (
|
||||
inner_indent = ' '
|
||||
)
|
||||
|
||||
struct BenchedTests {
|
||||
mut:
|
||||
bench benchmark.Benchmark
|
||||
oks int
|
||||
fails int
|
||||
test_suit_file string
|
||||
step_func_name string
|
||||
}
|
||||
|
||||
// ///////////////////////////////////////////////////////////////////
|
||||
// Called at the start of the test program produced by `v -stats file_test.v`
|
||||
fn start_testing(total_number_of_tests int, vfilename string) BenchedTests {
|
||||
mut b := BenchedTests{
|
||||
bench: benchmark.new_benchmark()
|
||||
}
|
||||
b.bench.set_total_expected_steps(total_number_of_tests)
|
||||
b.test_suit_file = vfilename
|
||||
println('running tests in: $b.test_suit_file')
|
||||
return b
|
||||
}
|
||||
|
||||
// Called before each test_ function, defined in file_test.v
|
||||
fn (mut b BenchedTests) testing_step_start(stepfunc string) {
|
||||
b.step_func_name = stepfunc.replace('main.', '').replace('__', '.')
|
||||
b.oks = C.g_test_oks
|
||||
b.fails = C.g_test_fails
|
||||
b.bench.step()
|
||||
}
|
||||
|
||||
// Called after each test_ function, defined in file_test.v
|
||||
fn (mut b BenchedTests) testing_step_end() {
|
||||
ok_diff := C.g_test_oks - b.oks
|
||||
fail_diff := C.g_test_fails - b.fails
|
||||
// ////////////////////////////////////////////////////////////////
|
||||
if ok_diff == 0 && fail_diff == 0 {
|
||||
b.bench.neither_fail_nor_ok()
|
||||
println(inner_indent + b.bench.step_message_ok(' NO asserts | ') + b.fn_name())
|
||||
return
|
||||
}
|
||||
// ////////////////////////////////////////////////////////////////
|
||||
if ok_diff > 0 {
|
||||
b.bench.ok_many(ok_diff)
|
||||
}
|
||||
if fail_diff > 0 {
|
||||
b.bench.fail_many(fail_diff)
|
||||
}
|
||||
// ////////////////////////////////////////////////////////////////
|
||||
if ok_diff > 0 && fail_diff == 0 {
|
||||
println(inner_indent + b.bench.step_message_ok(nasserts(ok_diff)) + b.fn_name())
|
||||
return
|
||||
}
|
||||
if fail_diff > 0 {
|
||||
println(inner_indent + b.bench.step_message_fail(nasserts(fail_diff)) + b.fn_name())
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
fn (b &BenchedTests) fn_name() string {
|
||||
return b.step_func_name + '()'
|
||||
}
|
||||
|
||||
// Called at the end of the test program produced by `v -stats file_test.v`
|
||||
fn (mut b BenchedTests) end_testing() {
|
||||
b.bench.stop()
|
||||
println(inner_indent + b.bench.total_message('running V tests in "' + os.file_name(b.test_suit_file) +
|
||||
'"'))
|
||||
}
|
||||
|
||||
// ///////////////////////////////////////////////////////////////////
|
||||
fn nasserts(n int) string {
|
||||
if n == 1 {
|
||||
return '${n:5d} assert | '
|
||||
}
|
||||
return '${n:5d} asserts | '
|
||||
}
|
||||
297
cmd/tools/repeat.v
Normal file
297
cmd/tools/repeat.v
Normal file
@@ -0,0 +1,297 @@
|
||||
module main
|
||||
|
||||
import os
|
||||
import flag
|
||||
import time
|
||||
import term
|
||||
import math
|
||||
import scripting
|
||||
import v.util
|
||||
|
||||
struct CmdResult {
|
||||
mut:
|
||||
runs int
|
||||
cmd string
|
||||
icmd int
|
||||
outputs []string
|
||||
oms map[string][]int
|
||||
summary map[string]Aints
|
||||
timings []int
|
||||
atiming Aints
|
||||
}
|
||||
|
||||
struct Context {
|
||||
mut:
|
||||
count int
|
||||
series int
|
||||
warmup int
|
||||
show_help bool
|
||||
show_output bool
|
||||
fail_on_regress_percent int
|
||||
fail_on_maxtime int // in ms
|
||||
verbose bool
|
||||
commands []string
|
||||
results []CmdResult
|
||||
cmd_template string // {T} will be substituted with the current command
|
||||
cmd_params map[string][]string
|
||||
cline string // a terminal clearing line
|
||||
}
|
||||
|
||||
struct Aints {
|
||||
values []int
|
||||
mut:
|
||||
imin int
|
||||
imax int
|
||||
average f64
|
||||
stddev f64
|
||||
}
|
||||
|
||||
fn new_aints(vals []int) Aints {
|
||||
mut res := Aints{
|
||||
values: vals
|
||||
}
|
||||
mut sum := i64(0)
|
||||
mut imin := math.max_i32
|
||||
mut imax := -math.max_i32
|
||||
for i in vals {
|
||||
sum += i
|
||||
if i < imin {
|
||||
imin = i
|
||||
}
|
||||
if i > imax {
|
||||
imax = i
|
||||
}
|
||||
}
|
||||
res.imin = imin
|
||||
res.imax = imax
|
||||
if vals.len > 0 {
|
||||
res.average = sum / f64(vals.len)
|
||||
}
|
||||
//
|
||||
mut devsum := f64(0.0)
|
||||
for i in vals {
|
||||
x := f64(i) - res.average
|
||||
devsum += (x * x)
|
||||
}
|
||||
res.stddev = math.sqrt(devsum / f64(vals.len))
|
||||
return res
|
||||
}
|
||||
|
||||
fn (a Aints) str() string {
|
||||
return util.bold('${a.average:9.3f}') +
|
||||
'ms ± σ: ${a.stddev:-5.1f}ms, min … max: ${a.imin}ms … ${a.imax}ms'
|
||||
}
|
||||
|
||||
const (
|
||||
max_fail_percent = 100000
|
||||
max_time = 60 * 1000 // ms
|
||||
performance_regression_label = 'Performance regression detected, failing since '
|
||||
)
|
||||
|
||||
fn main() {
|
||||
mut context := Context{}
|
||||
context.parse_options()
|
||||
context.run()
|
||||
context.show_diff_summary()
|
||||
}
|
||||
|
||||
fn (mut context Context) parse_options() {
|
||||
mut fp := flag.new_flag_parser(os.args)
|
||||
fp.application(os.file_name(os.executable()))
|
||||
fp.version('0.0.1')
|
||||
fp.description('Repeat command(s) and collect statistics. NB: you have to quote each command, if it contains spaces.')
|
||||
fp.arguments_description('CMD1 CMD2 ...')
|
||||
fp.skip_executable()
|
||||
fp.limit_free_args_to_at_least(1)
|
||||
context.count = fp.int('count', `c`, 10, 'Repetition count.')
|
||||
context.series = fp.int('series', `s`, 2, 'Series count. `-s 2 -c 4 a b` => aaaabbbbaaaabbbb, while `-s 3 -c 2 a b` => aabbaabbaabb.')
|
||||
context.warmup = fp.int('warmup', `w`, 2, 'Warmup runs. These are done *only at the start*, and are ignored.')
|
||||
context.show_help = fp.bool('help', `h`, false, 'Show this help screen.')
|
||||
context.show_output = fp.bool('output', `O`, false, 'Show command stdout/stderr in the progress indicator for each command. NB: slower, for verbose commands.')
|
||||
context.verbose = fp.bool('verbose', `v`, false, 'Be more verbose.')
|
||||
context.fail_on_maxtime = fp.int('max_time', `m`, max_time, 'Fail with exit code 2, when first cmd takes above M milliseconds (regression).')
|
||||
context.fail_on_regress_percent = fp.int('fail_percent', `f`, max_fail_percent, 'Fail with exit code 3, when first cmd is X% slower than the rest (regression).')
|
||||
context.cmd_template = fp.string('template', `t`, '{T}', 'Command template. {T} will be substituted with the current command.')
|
||||
cmd_params := fp.string_multi('parameter', `p`, 'A parameter substitution list. `{p}=val1,val2,val2` means that {p} in the template, will be substituted with each of val1, val2, val3.')
|
||||
for p in cmd_params {
|
||||
parts := p.split(':')
|
||||
if parts.len > 1 {
|
||||
context.cmd_params[parts[0]] = parts[1].split(',')
|
||||
}
|
||||
}
|
||||
if context.show_help {
|
||||
println(fp.usage())
|
||||
exit(0)
|
||||
}
|
||||
if context.verbose {
|
||||
scripting.set_verbose(true)
|
||||
}
|
||||
commands := fp.finalize() or {
|
||||
eprintln('Error: ' + err)
|
||||
exit(1)
|
||||
}
|
||||
context.commands = context.expand_all_commands(commands)
|
||||
context.results = []CmdResult{len: context.commands.len, init: CmdResult{}}
|
||||
context.cline = '\r' + term.h_divider('')
|
||||
}
|
||||
|
||||
fn (mut context Context) clear_line() {
|
||||
print(context.cline)
|
||||
}
|
||||
|
||||
fn (mut context Context) expand_all_commands(commands []string) []string {
|
||||
mut all_commands := []string{}
|
||||
for cmd in commands {
|
||||
maincmd := context.cmd_template.replace('{T}', cmd)
|
||||
mut substituted_commands := [maincmd]
|
||||
for paramk, paramlist in context.cmd_params {
|
||||
for paramv in paramlist {
|
||||
mut new_substituted_commands := []string{}
|
||||
for cscmd in substituted_commands {
|
||||
scmd := cscmd.replace(paramk, paramv)
|
||||
new_substituted_commands << scmd
|
||||
}
|
||||
substituted_commands << new_substituted_commands
|
||||
}
|
||||
}
|
||||
all_commands << substituted_commands
|
||||
}
|
||||
mut unique := map[string]int{}
|
||||
for x in all_commands {
|
||||
if x.contains('{') && x.contains('}') {
|
||||
continue
|
||||
}
|
||||
unique[x] = 1
|
||||
}
|
||||
return unique.keys()
|
||||
}
|
||||
|
||||
fn (mut context Context) run() {
|
||||
mut run_warmups := 0
|
||||
for si in 1 .. context.series + 1 {
|
||||
for icmd, cmd in context.commands {
|
||||
mut runs := 0
|
||||
mut duration := 0
|
||||
mut sum := 0
|
||||
mut oldres := ''
|
||||
println('Series: ${si:4}/${context.series:-4}, command: $cmd')
|
||||
if context.warmup > 0 && run_warmups < context.commands.len {
|
||||
for i in 1 .. context.warmup + 1 {
|
||||
print('\r warming up run: ${i:4}/${context.warmup:-4} for ${cmd:-50s} took ${duration:6} ms ...')
|
||||
mut sw := time.new_stopwatch({})
|
||||
os.exec(cmd) or {
|
||||
continue
|
||||
}
|
||||
duration = int(sw.elapsed().milliseconds())
|
||||
}
|
||||
run_warmups++
|
||||
}
|
||||
context.clear_line()
|
||||
for i in 1 .. (context.count + 1) {
|
||||
avg := f64(sum) / f64(i)
|
||||
print('\rAverage: ${avg:9.3f}ms | run: ${i:4}/${context.count:-4} | took ${duration:6} ms')
|
||||
if context.show_output {
|
||||
print(' | result: ${oldres:s}')
|
||||
}
|
||||
mut sw := time.new_stopwatch({})
|
||||
res := scripting.exec(cmd) or {
|
||||
continue
|
||||
}
|
||||
duration = int(sw.elapsed().milliseconds())
|
||||
if res.exit_code != 0 {
|
||||
eprintln('${i:10} non 0 exit code for cmd: $cmd')
|
||||
continue
|
||||
}
|
||||
context.results[icmd].outputs <<
|
||||
res.output.trim_right('\r\n').replace('\r\n', '\n').split('\n')
|
||||
context.results[icmd].timings << duration
|
||||
sum += duration
|
||||
runs++
|
||||
oldres = res.output.replace('\n', ' ')
|
||||
}
|
||||
context.results[icmd].cmd = cmd
|
||||
context.results[icmd].icmd = icmd
|
||||
context.results[icmd].runs += runs
|
||||
context.results[icmd].atiming = new_aints(context.results[icmd].timings)
|
||||
context.clear_line()
|
||||
print('\r')
|
||||
mut m := map[string][]int{}
|
||||
for o in context.results[icmd].outputs {
|
||||
x := o.split(':')
|
||||
if x.len > 1 {
|
||||
k := x[0]
|
||||
v := x[1].trim_left(' ').int()
|
||||
m[k] << v
|
||||
}
|
||||
}
|
||||
mut summary := map[string]Aints{}
|
||||
for k, v in m {
|
||||
// show a temporary summary for the current series/cmd cycle
|
||||
s := new_aints(v)
|
||||
println(' $k: $s')
|
||||
summary[k] = s
|
||||
}
|
||||
// merge current raw results to the previous ones
|
||||
old_oms := context.results[icmd].oms
|
||||
mut new_oms := map[string][]int{}
|
||||
for k, v in m {
|
||||
if old_oms[k].len == 0 {
|
||||
new_oms[k] = v
|
||||
} else {
|
||||
new_oms[k] << old_oms[k]
|
||||
new_oms[k] << v
|
||||
}
|
||||
}
|
||||
context.results[icmd].oms = new_oms
|
||||
// println('')
|
||||
}
|
||||
}
|
||||
// create full summaries, taking account of all runs
|
||||
for icmd in 0 .. context.results.len {
|
||||
mut new_full_summary := map[string]Aints{}
|
||||
for k, v in context.results[icmd].oms {
|
||||
new_full_summary[k] = new_aints(v)
|
||||
}
|
||||
context.results[icmd].summary = new_full_summary
|
||||
}
|
||||
}
|
||||
|
||||
fn (mut context Context) show_diff_summary() {
|
||||
context.results.sort_with_compare(fn (a &CmdResult, b &CmdResult) int {
|
||||
if a.atiming.average < b.atiming.average {
|
||||
return -1
|
||||
}
|
||||
if a.atiming.average > b.atiming.average {
|
||||
return 1
|
||||
}
|
||||
return 0
|
||||
})
|
||||
println('Summary (commands are ordered by ascending mean time), after $context.series series of $context.count repetitions:')
|
||||
base := context.results[0].atiming.average
|
||||
mut first_cmd_percentage := f64(100.0)
|
||||
for i, r in context.results {
|
||||
cpercent := (r.atiming.average / base) * 100 - 100
|
||||
first_marker := if r.icmd == 0 { util.bold('>') } else { ' ' }
|
||||
if r.icmd == 0 {
|
||||
first_cmd_percentage = cpercent
|
||||
}
|
||||
println(' $first_marker${(i + 1):3} | ${cpercent:6.1f}% slower | ${r.cmd:-55s} | $r.atiming')
|
||||
}
|
||||
$if debugcontext ? {
|
||||
println('context: $context')
|
||||
}
|
||||
if int(base) > context.fail_on_maxtime {
|
||||
print(performance_regression_label)
|
||||
println('average time: ${base:6.1f} ms > $context.fail_on_maxtime ms threshold.')
|
||||
exit(2)
|
||||
}
|
||||
if context.fail_on_regress_percent == max_fail_percent || context.results.len < 2 {
|
||||
return
|
||||
}
|
||||
fail_threshold_max := f64(context.fail_on_regress_percent)
|
||||
if first_cmd_percentage > fail_threshold_max {
|
||||
print(performance_regression_label)
|
||||
println('${first_cmd_percentage:5.1f}% > ${fail_threshold_max:5.1f}% threshold.')
|
||||
exit(3)
|
||||
}
|
||||
}
|
||||
81
cmd/tools/test_os_process.v
Normal file
81
cmd/tools/test_os_process.v
Normal file
@@ -0,0 +1,81 @@
|
||||
module main
|
||||
|
||||
import os
|
||||
import time
|
||||
import os.cmdline
|
||||
|
||||
enum Target {
|
||||
both
|
||||
stderr
|
||||
stdout
|
||||
alternate
|
||||
}
|
||||
|
||||
fn s2target(s string) Target {
|
||||
return match s {
|
||||
'both' { Target.both }
|
||||
'stderr' { Target.stderr }
|
||||
'alternate' { Target.alternate }
|
||||
else { Target.stdout }
|
||||
}
|
||||
}
|
||||
|
||||
struct Context {
|
||||
mut:
|
||||
timeout_ms int
|
||||
period_ms int
|
||||
exitcode int
|
||||
target Target
|
||||
omode Target
|
||||
is_verbose bool
|
||||
}
|
||||
|
||||
fn (mut ctx Context) println(s string) {
|
||||
if ctx.target == .alternate {
|
||||
ctx.omode = if ctx.omode == .stderr { Target.stdout } else { Target.stderr }
|
||||
}
|
||||
if ctx.target in [.both, .stdout] || ctx.omode == .stdout {
|
||||
println('stdout, $s')
|
||||
}
|
||||
if ctx.target in [.both, .stderr] || ctx.omode == .stderr {
|
||||
eprintln('stderr, $s')
|
||||
}
|
||||
}
|
||||
|
||||
fn do_timeout(c &Context) {
|
||||
mut ctx := c
|
||||
time.sleep_ms(ctx.timeout_ms)
|
||||
exit(ctx.exitcode)
|
||||
}
|
||||
|
||||
fn main() {
|
||||
mut ctx := Context{}
|
||||
args := os.args[1..]
|
||||
if '-h' in args || '--help' in args {
|
||||
println("Usage:
|
||||
test_os_process [-v] [-h] [-target stderr/stdout/both/alternate] [-exitcode 0] [-timeout_ms 1000] [-period_ms 100]
|
||||
Prints lines periodically (-period_ms), to stdout/stderr (-target).
|
||||
After a while (-timeout_ms), exit with (-exitcode).
|
||||
This program is useful for platform independent testing
|
||||
of child process/standart input/output control.
|
||||
It is used in V\'s `os` module tests.
|
||||
")
|
||||
}
|
||||
ctx.is_verbose = '-v' in args
|
||||
ctx.target = s2target(cmdline.option(args, '-target', 'both'))
|
||||
ctx.exitcode = cmdline.option(args, '-exitcode', '0').int()
|
||||
ctx.timeout_ms = cmdline.option(args, '-timeout_ms', '1000').int()
|
||||
ctx.period_ms = cmdline.option(args, '-period_ms', '100').int()
|
||||
if ctx.target == .alternate {
|
||||
ctx.omode = .stdout
|
||||
}
|
||||
if ctx.is_verbose {
|
||||
eprintln('> args: $args | context: $ctx')
|
||||
}
|
||||
go do_timeout(&ctx)
|
||||
for i := 1; true; i++ {
|
||||
ctx.println('$i')
|
||||
time.sleep_ms(ctx.period_ms)
|
||||
}
|
||||
time.sleep(100000)
|
||||
}
|
||||
149
cmd/tools/vbin2v.v
Normal file
149
cmd/tools/vbin2v.v
Normal file
@@ -0,0 +1,149 @@
|
||||
module main
|
||||
|
||||
import os
|
||||
import flag
|
||||
import strings
|
||||
|
||||
const (
|
||||
tool_version = '0.0.4'
|
||||
tool_description = 'Converts a list of arbitrary files into a single v module file.'
|
||||
)
|
||||
|
||||
struct Context {
|
||||
mut:
|
||||
files []string
|
||||
prefix string
|
||||
show_help bool
|
||||
module_name string
|
||||
write_file string
|
||||
}
|
||||
|
||||
fn (context Context) header() string {
|
||||
mut header_s := ''
|
||||
header_s += 'module $context.module_name\n'
|
||||
header_s += '\n'
|
||||
allfiles := context.files.join(' ')
|
||||
mut options := []string{}
|
||||
if context.prefix.len > 0 {
|
||||
options << '-p $context.prefix'
|
||||
}
|
||||
if context.module_name.len > 0 {
|
||||
options << '-m $context.module_name'
|
||||
}
|
||||
if context.write_file.len > 0 {
|
||||
options << '-w $context.write_file'
|
||||
}
|
||||
soptions := options.join(' ')
|
||||
header_s += '// File generated by:\n'
|
||||
header_s += '// v bin2v $allfiles $soptions\n'
|
||||
header_s += '// Please, do not edit this file.\n'
|
||||
header_s += '// Your changes may be overwritten.\n'
|
||||
header_s += 'const (\n'
|
||||
return header_s
|
||||
}
|
||||
|
||||
fn (context Context) footer() string {
|
||||
return ')\n'
|
||||
}
|
||||
|
||||
fn (context Context) file2v(bname string, fbytes []byte, bn_max int) string {
|
||||
mut sb := strings.new_builder(1000)
|
||||
bn_diff_len := bn_max - bname.len
|
||||
sb.write('\t${bname}_len' + ' '.repeat(bn_diff_len - 4) + ' = $fbytes.len\n')
|
||||
mut last_len := sb.len
|
||||
fbyte := fbytes[0]
|
||||
sb.write('\t$bname' + ' '.repeat(bn_diff_len) + ' = [byte($fbyte), ')
|
||||
for i := 1; i < fbytes.len; i++ {
|
||||
b := int(fbytes[i]).str()
|
||||
sb_diff_len := sb.len - last_len
|
||||
if i < 30 && sb_diff_len > 86 {
|
||||
sb.write('$b,\n\t\t')
|
||||
last_len = sb.len
|
||||
} else if sb_diff_len > 88 && 92 - sb_diff_len < b.len {
|
||||
sb.write('$b,\n\t\t')
|
||||
last_len = sb.len
|
||||
} else if i == fbytes.len - 1 {
|
||||
sb.write(b)
|
||||
} else {
|
||||
sb.write('$b, ')
|
||||
}
|
||||
}
|
||||
sb.write(']!!\n')
|
||||
return sb.str()
|
||||
}
|
||||
|
||||
fn (context Context) bname_and_bytes(file string) ?(string, []byte) {
|
||||
fname := os.file_name(file)
|
||||
fname_no_dots := fname.replace('.', '_')
|
||||
byte_name := '$context.prefix$fname_no_dots'.to_lower()
|
||||
fbytes := os.read_bytes(file) or {
|
||||
return error('Error: $err')
|
||||
}
|
||||
return byte_name, fbytes
|
||||
}
|
||||
|
||||
fn (context Context) max_bname_len(bnames []string) int {
|
||||
mut max := 0
|
||||
for n in bnames {
|
||||
if n.len > max {
|
||||
max = n.len
|
||||
}
|
||||
}
|
||||
// Add 4 to max due to "_len" suffix
|
||||
return max + 4
|
||||
}
|
||||
|
||||
fn main() {
|
||||
mut context := Context{}
|
||||
mut fp := flag.new_flag_parser(os.args[1..])
|
||||
fp.application('v bin2v')
|
||||
fp.version(tool_version)
|
||||
fp.description(tool_description)
|
||||
fp.arguments_description('FILE [FILE]...')
|
||||
context.show_help = fp.bool('help', `h`, false, 'Show this help screen.')
|
||||
context.module_name = fp.string('module', `m`, 'binary', 'Name of the generated module.')
|
||||
context.prefix = fp.string('prefix', `p`, '', 'A prefix put before each resource name.')
|
||||
context.write_file = fp.string('write', `w`, '', 'Write directly to a file with the given name.')
|
||||
if context.show_help {
|
||||
println(fp.usage())
|
||||
exit(0)
|
||||
}
|
||||
files := fp.finalize() or {
|
||||
eprintln('Error: ' + err)
|
||||
exit(1)
|
||||
}
|
||||
real_files := files.filter(it != 'bin2v')
|
||||
if real_files.len == 0 {
|
||||
println(fp.usage())
|
||||
exit(0)
|
||||
}
|
||||
context.files = real_files
|
||||
if context.write_file != '' && !context.write_file.ends_with('.v') {
|
||||
context.write_file += '.v'
|
||||
}
|
||||
mut file_byte_map := map[string][]byte{}
|
||||
for file in real_files {
|
||||
bname, fbytes := context.bname_and_bytes(file) or {
|
||||
eprintln(err)
|
||||
continue
|
||||
}
|
||||
file_byte_map[bname] = fbytes
|
||||
}
|
||||
max_bname := context.max_bname_len(file_byte_map.keys())
|
||||
if context.write_file.len > 0 {
|
||||
mut out_file := os.create(context.write_file) or {
|
||||
panic(err)
|
||||
}
|
||||
out_file.write_str(context.header())
|
||||
for bname, fbytes in file_byte_map {
|
||||
out_file.write_str(context.file2v(bname, fbytes, max_bname))
|
||||
}
|
||||
out_file.write_str(context.footer())
|
||||
} else {
|
||||
println(context.header())
|
||||
for bname, fbytes in file_byte_map {
|
||||
println(context.file2v(bname, fbytes, max_bname))
|
||||
}
|
||||
println(context.footer())
|
||||
}
|
||||
}
|
||||
16
cmd/tools/vbuild-examples.v
Normal file
16
cmd/tools/vbuild-examples.v
Normal file
@@ -0,0 +1,16 @@
|
||||
module main
|
||||
|
||||
import os
|
||||
import testing
|
||||
|
||||
fn main() {
|
||||
args := os.args
|
||||
args_string := args[1..].join(' ')
|
||||
params := args_string.all_before('build-examples')
|
||||
if testing.v_build_failing(params, 'examples') {
|
||||
exit(1)
|
||||
}
|
||||
if testing.v_build_failing(params + '-live', os.join_path('examples', 'hot_reload')) {
|
||||
exit(1)
|
||||
}
|
||||
}
|
||||
36
cmd/tools/vbuild-tools.v
Normal file
36
cmd/tools/vbuild-tools.v
Normal file
@@ -0,0 +1,36 @@
|
||||
module main
|
||||
|
||||
import os
|
||||
import testing
|
||||
import v.util
|
||||
|
||||
fn p(s string) string {
|
||||
println(s)
|
||||
return s
|
||||
}
|
||||
|
||||
fn main() {
|
||||
args := os.args
|
||||
args_string := args[1..].join(' ')
|
||||
skips := []string{}
|
||||
vexe := os.getenv('VEXE')
|
||||
vroot := os.dir(vexe)
|
||||
util.ensure_modules_for_all_tools_are_installed('-v' in args)
|
||||
folder := 'cmd/tools'
|
||||
main_label := 'Building $folder ...'
|
||||
finish_label := 'building $folder'
|
||||
mut session := testing.prepare_test_session(args_string.all_before('build-tools'), folder, skips, main_label)
|
||||
session.rm_binaries = false
|
||||
session.test()
|
||||
eprintln(session.benchmark.total_message(finish_label))
|
||||
if session.failed {
|
||||
exit(1)
|
||||
}
|
||||
//
|
||||
mut executables := os.ls(session.vtmp_dir)?
|
||||
executables.sort()
|
||||
executables = executables.filter(it !in ['gen1m', 'gen_vc', 'fast', 'wyhash'])
|
||||
for exe in executables {
|
||||
os.mv_by_cp(os.join_path(session.vtmp_dir, exe), os.join_path(vroot, 'cmd', 'tools', exe))
|
||||
}
|
||||
}
|
||||
9
cmd/tools/vbuild-vbinaries.v
Normal file
9
cmd/tools/vbuild-vbinaries.v
Normal file
@@ -0,0 +1,9 @@
|
||||
module main
|
||||
|
||||
import testing
|
||||
|
||||
fn main() {
|
||||
if testing.building_any_v_binaries_failed() {
|
||||
exit(1)
|
||||
}
|
||||
}
|
||||
424
cmd/tools/vcomplete.v
Normal file
424
cmd/tools/vcomplete.v
Normal file
@@ -0,0 +1,424 @@
|
||||
// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved.
|
||||
// Use of this source code is governed by an MIT license
|
||||
// that can be found in the LICENSE file.
|
||||
//
|
||||
// Utility functions helping integrate with various shell auto-completion systems.
|
||||
// The install process and communication is inspired from that of [kitty](https://sw.kovidgoyal.net/kitty/#completion-for-kitty)
|
||||
// This method avoids writing and maintaining external files on the user's file system.
|
||||
// The user will be responsible for adding a small line to their .*rc - that will ensure *live* (i.e. not-static)
|
||||
// auto-completion features.
|
||||
//
|
||||
// # bash
|
||||
// To install auto-completion for V in bash, simply add this code to your `~/.bashrc`:
|
||||
// `source /dev/stdin <<<"$(v complete setup bash)"`
|
||||
// On more recent versions of bash (>3.2) this should suffice:
|
||||
// `source <(v complete setup bash)`
|
||||
//
|
||||
// # fish
|
||||
// For versions of fish <3.0.0, add the following to your `~/.config/fish/config.fish`
|
||||
// `v complete setup fish | source`
|
||||
// Later versions of fish source completions by default.
|
||||
//
|
||||
// # zsh
|
||||
// To install auto-completion for V in zsh - please add the following to your `~/.zshrc`:
|
||||
// ```
|
||||
// autoload -Uz compinit
|
||||
// compinit
|
||||
// # Completion for v
|
||||
// v complete setup zsh | source /dev/stdin
|
||||
// ```
|
||||
// Please note that you should let v load the zsh completions after the call to compinit
|
||||
//
|
||||
// # powershell //TODO
|
||||
//
|
||||
module main
|
||||
|
||||
import os
|
||||
|
||||
const (
|
||||
auto_complete_shells = ['bash', 'fish', 'zsh', 'powershell'] // list of supported shells
|
||||
vexe = os.getenv('VEXE')
|
||||
)
|
||||
|
||||
// Snooped from cmd/v/v.v, vlib/v/pref/pref.v
|
||||
const (
|
||||
auto_complete_commands = [
|
||||
/* simple_cmd */
|
||||
'fmt',
|
||||
'up',
|
||||
'vet',
|
||||
'self',
|
||||
'tracev',
|
||||
'symlink',
|
||||
'bin2v',
|
||||
'test',
|
||||
'test-fmt',
|
||||
'test-compiler',
|
||||
'test-fixed',
|
||||
'test-cleancode',
|
||||
'repl',
|
||||
'complete',
|
||||
'build-tools',
|
||||
'build-examples',
|
||||
'build-vbinaries',
|
||||
'setup-freetype',
|
||||
'doc',
|
||||
'doctor',
|
||||
/* commands */
|
||||
'help',
|
||||
'new',
|
||||
'init',
|
||||
'complete',
|
||||
'translate',
|
||||
'self',
|
||||
'search',
|
||||
'install',
|
||||
'update',
|
||||
'upgrade',
|
||||
'outdated',
|
||||
'list',
|
||||
'remove',
|
||||
'vlib-docs',
|
||||
'get',
|
||||
'version',
|
||||
'run',
|
||||
'build',
|
||||
'build-module',
|
||||
]
|
||||
auto_complete_flags = [
|
||||
'-apk',
|
||||
'-show-timings',
|
||||
'-check-syntax',
|
||||
'-v',
|
||||
'-progress',
|
||||
'-silent',
|
||||
'-g',
|
||||
'-cg',
|
||||
'-repl',
|
||||
'-live',
|
||||
'-sharedlive',
|
||||
'-shared',
|
||||
'--enable-globals',
|
||||
'-enable-globals',
|
||||
'-autofree',
|
||||
'-compress',
|
||||
'-freestanding',
|
||||
'-no-preludes',
|
||||
'-prof',
|
||||
'-profile',
|
||||
'-profile-no-inline',
|
||||
'-prod',
|
||||
'-simulator',
|
||||
'-stats',
|
||||
'-obfuscate',
|
||||
'-translated',
|
||||
'-color',
|
||||
'-nocolor',
|
||||
'-showcc',
|
||||
'-show-c-output',
|
||||
'-experimental',
|
||||
'-usecache',
|
||||
'-prealloc',
|
||||
'-parallel',
|
||||
'-x64',
|
||||
'-W',
|
||||
'-keepc',
|
||||
'-w',
|
||||
'-print_v_files',
|
||||
'-error-limit',
|
||||
'-os',
|
||||
'-printfn',
|
||||
'-cflags',
|
||||
'-define',
|
||||
'-d',
|
||||
'-cc',
|
||||
'-o',
|
||||
'-b',
|
||||
'-path',
|
||||
'-custom-prelude',
|
||||
'-name',
|
||||
'-bundle',
|
||||
'-V',
|
||||
'-version',
|
||||
'--version',
|
||||
]
|
||||
auto_complete_flags_doc = [
|
||||
'-all',
|
||||
'-f',
|
||||
'-h',
|
||||
'-help',
|
||||
'-m',
|
||||
'-o',
|
||||
'-readme',
|
||||
'-v',
|
||||
'-filename',
|
||||
'-pos',
|
||||
'-no-timestamp',
|
||||
'-inline-assets',
|
||||
'-open',
|
||||
'-p',
|
||||
'-s',
|
||||
'-l',
|
||||
]
|
||||
auto_complete_flags_fmt = [
|
||||
'-c',
|
||||
'-diff',
|
||||
'-l',
|
||||
'-w',
|
||||
'-debug',
|
||||
'-verify',
|
||||
]
|
||||
auto_complete_flags_bin2v = [
|
||||
'-h',
|
||||
'--help',
|
||||
'-m',
|
||||
'--module',
|
||||
'-p',
|
||||
'--prefix',
|
||||
'-w',
|
||||
'--write',
|
||||
]
|
||||
auto_complete_flags_self = [
|
||||
'-prod',
|
||||
]
|
||||
auto_complete_compilers = [
|
||||
'cc',
|
||||
'gcc',
|
||||
'tcc',
|
||||
'tinyc',
|
||||
'clang',
|
||||
'mingw',
|
||||
'msvc',
|
||||
]
|
||||
)
|
||||
|
||||
fn auto_complete(args []string) {
|
||||
if args.len <= 1 || args[0] != 'complete' {
|
||||
if args.len == 1 {
|
||||
eprintln('auto completion require arguments to work.')
|
||||
} else {
|
||||
eprintln('auto completion failed for "$args".')
|
||||
}
|
||||
exit(1)
|
||||
}
|
||||
sub := args[1]
|
||||
sub_args := args[1..]
|
||||
match sub {
|
||||
'setup' {
|
||||
if sub_args.len <= 1 || sub_args[1] !in auto_complete_shells {
|
||||
eprintln('please specify a shell to setup auto completion for ($auto_complete_shells).')
|
||||
exit(1)
|
||||
}
|
||||
shell := sub_args[1]
|
||||
mut setup := ''
|
||||
match shell {
|
||||
'bash' { setup = '
|
||||
_v_completions() {
|
||||
local src
|
||||
local limit
|
||||
# Send all words up to the word the cursor is currently on
|
||||
let limit=1+\$COMP_CWORD
|
||||
src=\$($vexe complete bash \$(printf "%s\\n" \${COMP_WORDS[@]: 0:\$limit}))
|
||||
if [[ \$? == 0 ]]; then
|
||||
eval \${src}
|
||||
#echo \${src}
|
||||
fi
|
||||
}
|
||||
|
||||
complete -o nospace -F _v_completions v
|
||||
' }
|
||||
'fish' { setup = '
|
||||
function __v_completions
|
||||
# Send all words up to the one before the cursor
|
||||
$vexe complete fish (commandline -cop)
|
||||
end
|
||||
complete -f -c v -a "(__v_completions)"
|
||||
' }
|
||||
'zsh' { setup = '
|
||||
#compdef v
|
||||
_v() {
|
||||
local src
|
||||
# Send all words up to the word the cursor is currently on
|
||||
src=\$($vexe complete zsh \$(printf "%s\\n" \${(@)words[1,\$CURRENT]}))
|
||||
if [[ \$? == 0 ]]; then
|
||||
eval \${src}
|
||||
#echo \${src}
|
||||
fi
|
||||
}
|
||||
compdef _v v
|
||||
' }
|
||||
// 'powershell' {} //TODO
|
||||
else {}
|
||||
}
|
||||
println(setup)
|
||||
}
|
||||
'bash' {
|
||||
if sub_args.len <= 1 {
|
||||
exit(0)
|
||||
}
|
||||
mut lines := []string{}
|
||||
list := auto_complete_request(sub_args[1..])
|
||||
for entry in list {
|
||||
lines << "COMPREPLY+=(\'$entry\')"
|
||||
}
|
||||
println(lines.join('\n'))
|
||||
}
|
||||
'fish' {
|
||||
if sub_args.len <= 1 {
|
||||
exit(0)
|
||||
}
|
||||
mut lines := []string{}
|
||||
list := auto_complete_request(sub_args[1..])
|
||||
for entry in list {
|
||||
lines << '$entry'
|
||||
}
|
||||
println(lines.join('\n'))
|
||||
}
|
||||
'zsh' {
|
||||
if sub_args.len <= 1 {
|
||||
exit(0)
|
||||
}
|
||||
mut lines := []string{}
|
||||
list := auto_complete_request(sub_args[1..])
|
||||
for entry in list {
|
||||
lines << 'compadd -U -S \"\" -- \'$entry\';'
|
||||
}
|
||||
println(lines.join('\n'))
|
||||
}
|
||||
// 'powershell' {} //TODO
|
||||
else {}
|
||||
}
|
||||
exit(0)
|
||||
}
|
||||
|
||||
fn auto_complete_request(args []string) []string {
|
||||
// Using space will ensure a uniform input in cases where the shell
|
||||
// returns the completion input as a string (['v','run'] vs. ['v run']).
|
||||
split_by := ' '
|
||||
request := args.join(split_by)
|
||||
mut list := []string{}
|
||||
// new_part := request.ends_with('\n\n')
|
||||
mut parts := request.trim_right(' ').split(split_by)
|
||||
if parts.len <= 1 { // 'v <tab>' -> top level commands.
|
||||
for command in auto_complete_commands {
|
||||
list << command
|
||||
}
|
||||
} else {
|
||||
part := parts.last().trim(' ')
|
||||
mut parent_command := ''
|
||||
for i := parts.len - 1; i >= 0; i-- {
|
||||
if parts[i].starts_with('-') {
|
||||
continue
|
||||
}
|
||||
parent_command = parts[i]
|
||||
break
|
||||
}
|
||||
get_flags := fn (base []string, flag string) []string {
|
||||
if flag.len == 1 { return base
|
||||
} else { return base.filter(it.starts_with(flag))
|
||||
}
|
||||
}
|
||||
if part.starts_with('-') { // 'v -<tab>' -> flags.
|
||||
match parent_command {
|
||||
'bin2v' { // 'v bin2v -<tab>'
|
||||
list = get_flags(auto_complete_flags_bin2v, part)
|
||||
}
|
||||
'build' { // 'v build -<tab>' -> flags.
|
||||
list = get_flags(auto_complete_flags, part)
|
||||
}
|
||||
'doc' { // 'v doc -<tab>' -> flags.
|
||||
list = get_flags(auto_complete_flags_doc, part)
|
||||
}
|
||||
'fmt' { // 'v fmt -<tab>' -> flags.
|
||||
list = get_flags(auto_complete_flags_fmt, part)
|
||||
}
|
||||
'self' { // 'v self -<tab>' -> flags.
|
||||
list = get_flags(auto_complete_flags_self, part)
|
||||
}
|
||||
else {
|
||||
for flag in auto_complete_flags {
|
||||
if flag == part {
|
||||
if flag == '-cc' { // 'v -cc <tab>' -> list of available compilers.
|
||||
for compiler in auto_complete_compilers {
|
||||
path := os.find_abs_path_of_executable(compiler) or {
|
||||
''
|
||||
}
|
||||
if path != '' {
|
||||
list << compiler
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if flag.starts_with(part) { // 'v -<char(s)><tab>' -> flags matching "<char(s)>".
|
||||
list << flag
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
match part {
|
||||
'help' { // 'v help <tab>' -> top level commands except "help".
|
||||
list = auto_complete_commands.filter(it != part && it != 'complete')
|
||||
}
|
||||
else {
|
||||
// 'v <char(s)><tab>' -> commands matching "<char(s)>".
|
||||
// Don't include if part matches a full command - instead go to path completion below.
|
||||
for command in auto_complete_commands {
|
||||
if part != command && command.starts_with(part) {
|
||||
list << command
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Nothing of value was found.
|
||||
// Mimic shell dir and file completion
|
||||
if list.len == 0 {
|
||||
mut ls_path := '.'
|
||||
mut collect_all := part in auto_complete_commands
|
||||
mut path_complete := false
|
||||
if part.ends_with(os.path_separator) || part == '.' || part == '..' {
|
||||
// 'v <command>(.*/$|.|..)<tab>' -> output full directory list
|
||||
ls_path = '.' + os.path_separator + part
|
||||
collect_all = true
|
||||
} else if !collect_all && part.contains(os.path_separator) && os.is_dir(os.dir(part)) {
|
||||
// 'v <command>(.*/.* && os.is_dir)<tab>' -> output completion friendly directory list
|
||||
ls_path = os.dir(part)
|
||||
path_complete = true
|
||||
}
|
||||
entries := os.ls(ls_path) or {
|
||||
return list
|
||||
}
|
||||
last := part.all_after_last(os.path_separator)
|
||||
if path_complete {
|
||||
path := part.all_before_last(os.path_separator)
|
||||
for entry in entries {
|
||||
if entry.starts_with(last) {
|
||||
list << os.join_path(path, entry)
|
||||
}
|
||||
}
|
||||
// If only one possible file - send full path to completion system.
|
||||
// Please note that this might be bash specific - needs more testing.
|
||||
if list.len == 1 {
|
||||
list = [list[0]]
|
||||
}
|
||||
} else {
|
||||
for entry in entries {
|
||||
if collect_all {
|
||||
list << entry
|
||||
} else {
|
||||
if entry.starts_with(last) {
|
||||
list << entry
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return list
|
||||
}
|
||||
|
||||
fn main() {
|
||||
args := os.args[1..]
|
||||
// println('"$args"')
|
||||
auto_complete(args)
|
||||
}
|
||||
145
cmd/tools/vcreate.v
Normal file
145
cmd/tools/vcreate.v
Normal file
@@ -0,0 +1,145 @@
|
||||
module main
|
||||
|
||||
// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved.
|
||||
// Use of this source code is governed by an MIT license that can be found in the LICENSE file.
|
||||
//
|
||||
// This module follows a similar convention to Rust: `init` makes the
|
||||
// structure of the program in the _current_ directory, while `new`
|
||||
// makes the program structure in a _sub_ directory. Besides that, the
|
||||
// functionality is essentially the same.
|
||||
import os
|
||||
|
||||
struct Create {
|
||||
mut:
|
||||
name string
|
||||
description string
|
||||
}
|
||||
|
||||
fn cerror(e string) {
|
||||
eprintln('\nerror: $e')
|
||||
}
|
||||
|
||||
fn vmod_content(name string, desc string) string {
|
||||
return [
|
||||
'Module {',
|
||||
" name: '$name'",
|
||||
" description: '$desc'",
|
||||
" version: '0.0.0'",
|
||||
' dependencies: []',
|
||||
'}',
|
||||
].join('\n')
|
||||
}
|
||||
|
||||
fn main_content() string {
|
||||
return [
|
||||
'module main\n',
|
||||
'fn main() {',
|
||||
" println('Hello World!')",
|
||||
'}',
|
||||
].join('\n')
|
||||
}
|
||||
|
||||
fn gen_gitignore(name string) string {
|
||||
return [
|
||||
'# Binaries for programs and plugins',
|
||||
'main',
|
||||
'$name',
|
||||
'*.exe',
|
||||
'*.exe~',
|
||||
'*.so',
|
||||
'*.dylib',
|
||||
'*.dll',
|
||||
].join('\n')
|
||||
}
|
||||
|
||||
fn (c &Create) write_vmod(new bool) {
|
||||
vmod_path := if new { '$c.name/v.mod' } else { 'v.mod' }
|
||||
mut vmod := os.create(vmod_path) or {
|
||||
cerror(err)
|
||||
exit(1)
|
||||
}
|
||||
vmod.write_str(vmod_content(c.name, c.description))
|
||||
vmod.close()
|
||||
}
|
||||
|
||||
fn (c &Create) write_main(new bool) {
|
||||
if !new && (os.exists('${c.name}.v') || os.exists('src/${c.name}.v')) {
|
||||
return
|
||||
}
|
||||
main_path := if new { '$c.name/${c.name}.v' } else { '${c.name}.v' }
|
||||
mut main := os.create(main_path) or {
|
||||
cerror(err)
|
||||
exit(2)
|
||||
}
|
||||
main.write_str(main_content())
|
||||
main.close()
|
||||
}
|
||||
|
||||
fn (c &Create) create_git_repo(dir string) {
|
||||
// Create Git Repo and .gitignore file
|
||||
if !os.is_dir('$dir/.git') {
|
||||
os.exec('git init $dir') or {
|
||||
cerror('Unable to create git repo')
|
||||
exit(4)
|
||||
}
|
||||
if !os.exists('$dir/.gitignore') {
|
||||
mut fl := os.create('$dir/.gitignore') or {
|
||||
// We don't really need a .gitignore, it's just a nice-to-have
|
||||
return
|
||||
}
|
||||
fl.write_str(gen_gitignore(c.name))
|
||||
fl.close()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn create() {
|
||||
mut c := Create{}
|
||||
c.name = os.input('Input your project name: ')
|
||||
if c.name == '' {
|
||||
cerror('project name cannot be empty')
|
||||
exit(1)
|
||||
}
|
||||
if c.name.contains('-') {
|
||||
cerror('"$c.name" should not contain hyphens')
|
||||
exit(1)
|
||||
}
|
||||
if os.is_dir(c.name) {
|
||||
cerror('$c.name folder already exists')
|
||||
exit(3)
|
||||
}
|
||||
c.description = os.input('Input your project description: ')
|
||||
println('Initialising ...')
|
||||
os.mkdir(c.name) or {
|
||||
panic(err)
|
||||
}
|
||||
c.write_vmod(true)
|
||||
c.write_main(true)
|
||||
c.create_git_repo(c.name)
|
||||
}
|
||||
|
||||
fn init_project() {
|
||||
if os.exists('v.mod') {
|
||||
cerror('`v init` cannot be run on existing v modules')
|
||||
exit(3)
|
||||
}
|
||||
mut c := Create{}
|
||||
c.name = os.file_name(os.getwd())
|
||||
c.description = ''
|
||||
c.write_vmod(false)
|
||||
c.write_main(false)
|
||||
c.create_git_repo('')
|
||||
println("Change your module's description in `v.mod`")
|
||||
}
|
||||
|
||||
fn main() {
|
||||
if os.args[1] == 'new' {
|
||||
create()
|
||||
} else if os.args[1] == 'init' {
|
||||
init_project()
|
||||
} else {
|
||||
cerror('Unknown command: ${os.args[1]}')
|
||||
exit(1)
|
||||
}
|
||||
println('Complete!')
|
||||
}
|
||||
1
cmd/tools/vdoc-resources/arrow.svg
Normal file
1
cmd/tools/vdoc-resources/arrow.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="dropdown-arrow" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M7 10l5 5 5-5z"/></svg>
|
||||
|
After Width: | Height: | Size: 175 B |
1
cmd/tools/vdoc-resources/dark.svg
Normal file
1
cmd/tools/vdoc-resources/dark.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="dark-icon" enable-background="new 0 0 24 24" height="24" viewBox="0 0 24 24" width="24"><g><rect fill="none" height="24" width="24"/></g><g><g><g><path d="M11.1,12.08C8.77,7.57,10.6,3.6,11.63,2.01C6.27,2.2,1.98,6.59,1.98,12c0,0.14,0.02,0.28,0.02,0.42 C2.62,12.15,3.29,12,4,12c1.66,0,3.18,0.83,4.1,2.15C9.77,14.63,11,16.17,11,18c0,1.52-0.87,2.83-2.12,3.51 c0.98,0.32,2.03,0.5,3.11,0.5c3.5,0,6.58-1.8,8.37-4.52C18,17.72,13.38,16.52,11.1,12.08z"/></g><path d="M7,16l-0.18,0C6.4,14.84,5.3,14,4,14c-1.66,0-3,1.34-3,3s1.34,3,3,3c0.62,0,2.49,0,3,0c1.1,0,2-0.9,2-2 C9,16.9,8.1,16,7,16z"/></g></g></svg>
|
||||
|
After Width: | Height: | Size: 642 B |
582
cmd/tools/vdoc-resources/doc.css
Normal file
582
cmd/tools/vdoc-resources/doc.css
Normal file
@@ -0,0 +1,582 @@
|
||||
:root {
|
||||
--background-color: #fff;
|
||||
--link-color: #2779bd;
|
||||
--text-color: #000;
|
||||
--ref-symbol-color: #dae1e7;
|
||||
--ref-symbol-hover-color: #b8c2cc;
|
||||
--title-bottom-line-color: #f1f5f8;
|
||||
--footer-top-line-color: #f1f5f8;
|
||||
--footer-text-color: #616161;
|
||||
--code-signature-border-color: #a0aec0;
|
||||
--menu-background-color: #4b6c88;
|
||||
--menu-text-color: #fff;
|
||||
--menu-indent-line-color: #3b3b3b66;
|
||||
--menu-indent-line-active-color: #00000066;
|
||||
--menu-scrollbar-color: #a0aec0;
|
||||
--menu-toggle-icon-color: #fff;
|
||||
--menu-toggle-icon-hover-color: #00000044;
|
||||
--menu-search-background-color: #00000044;
|
||||
--menu-search-font-color: #fff;
|
||||
--toc-text-color: #2779bd;
|
||||
--toc-indicator-color: #4299e1;
|
||||
--code-default-text-color: #5c6e74;
|
||||
--code-background-color: #edf2f7;
|
||||
--code-keyword-text-color: #2b6cb0;
|
||||
--code-builtin-text-color: #0a0a0a;
|
||||
--code-function-text-color: #319795;
|
||||
--code-comment-text-color: #93a1a1;
|
||||
--code-punctuation-text-color: #999999;
|
||||
--code-symbol-text-color: #702459;
|
||||
--code-operator-text-color: #a67f59;
|
||||
}
|
||||
:root.dark .dark-icon {
|
||||
display: none;
|
||||
}
|
||||
:root:not(.dark) .light-icon {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.dark body {
|
||||
--background-color: #1a202c;
|
||||
--text-color: #fff;
|
||||
--link-color: #90cdf4;
|
||||
--ref-symbol-color: #2d3748;
|
||||
--ref-symbol-hover-color: #4a5568;
|
||||
--title-bottom-line-color: #2d3748;
|
||||
--footer-top-line-color: #2d3748;
|
||||
--footer-text-color: #bbd3e1;
|
||||
--code-signature-border-color: #4a5568;
|
||||
--menu-background-color: #2d3748;
|
||||
--menu-text-color: #fff;
|
||||
--menu-indent-line-color: #4a5568;
|
||||
--menu-indent-line-active-color: #90cdf4;
|
||||
--menu-scrollbar-color: #4a5568;
|
||||
--menu-toggle-icon-color: #fff;
|
||||
--menu-search-background-color: #4a5568;
|
||||
--menu-search-font-color: #fff;
|
||||
--toc-text-color: #90cdf4;
|
||||
--toc-indicator-color: #4299e1;
|
||||
--code-default-text-color: #cbd5e0;
|
||||
--code-background-color: #2d3748;
|
||||
--code-builtin-text-color: #68d391;
|
||||
--code-keyword-text-color: #63b3ed;
|
||||
--code-function-text-color: #4fd1c5;
|
||||
--code-comment-text-color: #a0aec0;
|
||||
--code-punctuation-text-color: #a0aec0;
|
||||
--code-symbol-text-color: #ed64a6;
|
||||
}
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||
background-color: #fff;
|
||||
background-color: var(--background-color);
|
||||
color: #000;
|
||||
color: var(--text-color);
|
||||
overflow-y: scroll;
|
||||
}
|
||||
|
||||
/** Reset for menus */
|
||||
.doc-nav ul,
|
||||
.doc-toc ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* Left nav */
|
||||
.doc-nav {
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
display: flex;
|
||||
background-color: #4b6c88;
|
||||
background-color: var(--menu-background-color);
|
||||
color: #fff;
|
||||
color: var(--menu-text-color);
|
||||
flex-direction: column;
|
||||
overflow-y: auto;
|
||||
height: 100vh;
|
||||
z-index: 10;
|
||||
scrollbar-width: thin;
|
||||
scrollbar-color: #a0aec0 transparent;
|
||||
scrollbar-color: var(--menu-scrollbar-color) transparent;
|
||||
}
|
||||
*::-webkit-scrollbar {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
}
|
||||
*::-webkit-scrollbar-track {
|
||||
background: transparent;
|
||||
}
|
||||
*::-webkit-scrollbar-thumb {
|
||||
background-color: #a0aec0;
|
||||
background-color: var(--menu-scrollbar-color);
|
||||
border: 3px solid transparent;
|
||||
}
|
||||
.doc-nav li {
|
||||
line-height: 1.8;
|
||||
font-weight: 300;
|
||||
}
|
||||
.doc-nav .content.show {
|
||||
display: flex;
|
||||
}
|
||||
.doc-nav .content.hidden {
|
||||
display: none;
|
||||
}
|
||||
.doc-nav #toggle-menu {
|
||||
cursor: pointer;
|
||||
padding: 0.3rem;
|
||||
fill: #fff;
|
||||
fill: var(--menu-toggle-icon-color);
|
||||
}
|
||||
.doc-nav #toggle-menu:active {
|
||||
background-color: #00000044;
|
||||
background-color: var(--menu-toggle-icon-hover-color);
|
||||
border-radius: 5rem;
|
||||
}
|
||||
.doc-nav > .heading-container {
|
||||
position: relative;
|
||||
/* IE11 */
|
||||
position: sticky;
|
||||
position: -webkit-sticky;
|
||||
top: 0;
|
||||
background-color: #4b6c88;
|
||||
background-color: var(--menu-background-color);
|
||||
z-index: 10;
|
||||
}
|
||||
.doc-nav > .heading-container > .heading {
|
||||
display: flex;
|
||||
padding: 0 1rem;
|
||||
height: 56px;
|
||||
}
|
||||
.doc-nav > .heading-container > .heading > .module {
|
||||
font-size: 1.6rem;
|
||||
font-weight: 500;
|
||||
margin: 0;
|
||||
}
|
||||
.doc-nav > .heading-container > .heading > .toggle-version-container {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.doc-nav > .heading-container > .heading > .toggle-version-container > #dark-mode-toggle {
|
||||
cursor: pointer;
|
||||
fill: #fff;
|
||||
display: flex;
|
||||
visibility: hidden;
|
||||
}
|
||||
.doc-nav > .heading-container > .heading > .toggle-version-container > #dark-mode-toggle > svg {
|
||||
width: 1.2rem;
|
||||
height: 1.2rem;
|
||||
}
|
||||
.doc-nav > .heading-container > .heading > #search {
|
||||
margin-top: 1rem;
|
||||
border: none;
|
||||
border-radius: 0.2rem;
|
||||
padding: 0.5rem 1rem;
|
||||
outline: none;
|
||||
background-color: #00000044;
|
||||
background-color: var(--menu-search-background-color);
|
||||
color: #fff;
|
||||
color: var(--menu-search-text-color);
|
||||
margin-left: -0.6rem;
|
||||
margin-right: -0.6rem;
|
||||
}
|
||||
.doc-nav > .heading-container > .heading > #search::placeholder {
|
||||
color: #edf2f7;
|
||||
text-transform: uppercase;
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
}
|
||||
.doc-nav > .heading-container > .heading > #search:-ms-input-placeholder {
|
||||
color: #edf2f7;
|
||||
text-transform: uppercase;
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
}
|
||||
.doc-nav > .content {
|
||||
padding: 0 2rem 2rem 2rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
.doc-nav > .content > ul > li.active {
|
||||
font-weight: 600;
|
||||
}
|
||||
.doc-nav > .content > ul > li.open ul {
|
||||
display: initial;
|
||||
}
|
||||
.doc-nav > .content > ul > li.open > .menu-row > .dropdown-arrow {
|
||||
transform: initial;
|
||||
}
|
||||
.doc-nav > .content > ul > li > .menu-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.doc-nav > .content > ul > li > .menu-row > .dropdown-arrow {
|
||||
transform: rotate(-90deg);
|
||||
height: 18px;
|
||||
width: 18px;
|
||||
margin-left: calc(-18px - 0.3rem);
|
||||
margin-right: 0.3rem;
|
||||
cursor: pointer;
|
||||
fill: #fff;
|
||||
pointer-events: all;
|
||||
}
|
||||
.doc-nav > .content > ul > li > ul {
|
||||
margin: 0.4rem 0;
|
||||
display: none;
|
||||
}
|
||||
.doc-nav > .content > ul > li > ul > li {
|
||||
border-color: #ffffff66;
|
||||
border-color: var(--menu-indent-line-color);
|
||||
border-left-width: 1.7px;
|
||||
border-left-style: solid;
|
||||
padding-left: 0.7rem;
|
||||
}
|
||||
.doc-nav > .content > ul > li > ul > li.active {
|
||||
border-color: #00000066;
|
||||
border-color: var(--menu-indent-line-active-color);
|
||||
}
|
||||
.doc-nav > .content a {
|
||||
color: #fff;
|
||||
color: var(--menu-text-color);
|
||||
text-decoration: none;
|
||||
user-select: none;
|
||||
}
|
||||
.doc-nav > .content a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* Main content */
|
||||
.doc-container {
|
||||
display: flex;
|
||||
flex-direction: column-reverse;
|
||||
margin-top: 56px;
|
||||
}
|
||||
.doc-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: 1rem;
|
||||
overflow: hidden;
|
||||
}
|
||||
.doc-content p {
|
||||
line-height: 1.4;
|
||||
}
|
||||
.doc-content a {
|
||||
color: #2779bd;
|
||||
color: var(--link-color);
|
||||
}
|
||||
.doc-content > .doc-node {
|
||||
padding: 5rem 0 2rem 0;
|
||||
margin-top: -4rem;
|
||||
overflow: hidden;
|
||||
word-break: break-all; /* IE11 */
|
||||
word-break: break-word;
|
||||
}
|
||||
.doc-content > .doc-node.const:nth-child(2) {
|
||||
padding-bottom: 0 !important;
|
||||
}
|
||||
.doc-content > .doc-node.const:not(:first-child) {
|
||||
padding-top: 4rem;
|
||||
}
|
||||
.doc-content > .doc-node.const:not(:last-child) {
|
||||
padding-bottom: 2rem;
|
||||
}
|
||||
.doc-content > .timestamp {
|
||||
font-size: 0.8rem;
|
||||
color: #b8c2cc;
|
||||
color: var(--timestamp-color);
|
||||
}
|
||||
.doc-content > .doc-node > .title {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 1rem;
|
||||
border-bottom: 1px solid #f1f5f8;
|
||||
border-bottom: 1px solid var(--title-bottom-line-color);
|
||||
}
|
||||
.doc-content > .doc-node > .title > .link {
|
||||
display: flex;
|
||||
margin-left: auto;
|
||||
fill: #dae1e7;
|
||||
fill: var(--ref-symbol-color);
|
||||
}
|
||||
.doc-content > .doc-node > .title > .link:hover {
|
||||
fill: #b8c2cc;
|
||||
fill: var(--ref-symbol-hover-color);
|
||||
}
|
||||
.doc-content > .doc-node h1 {
|
||||
font-size: 2.5rem;
|
||||
font-weight: 400;
|
||||
}
|
||||
.doc-content > .doc-node .signature {
|
||||
border-color: #a0aec0;
|
||||
border-color: var(--code-signature-border-color);
|
||||
border-left-width: 3px;
|
||||
border-left-style: solid;
|
||||
}
|
||||
.doc-content > .doc-node > ul > li .task-list-item-checkbox {
|
||||
margin-right: 0.5rem;
|
||||
}
|
||||
.doc-content > .doc-node > .title h1,
|
||||
.doc-content > .doc-node > .title h2,
|
||||
.doc-content > .doc-node > .title h3,
|
||||
.doc-content > .doc-node > .title h4,
|
||||
.doc-content > .doc-node > .title h5,
|
||||
.doc-content > .doc-node > .title h6 {
|
||||
font-weight: 400;
|
||||
padding-top: 0.6rem 0;
|
||||
margin: 0;
|
||||
}
|
||||
.doc-content > .doc-node > .title h1 a,
|
||||
.doc-content > .doc-node > .title h2 a,
|
||||
.doc-content > .doc-node > .title h3 a,
|
||||
.doc-content > .doc-node > .title h4 a,
|
||||
.doc-content > .doc-node > .title h5 a,
|
||||
.doc-content > .doc-node > .title h6 a {
|
||||
text-decoration: none;
|
||||
color: #dae1e7;
|
||||
color: var(--ref-symbol-color);
|
||||
}
|
||||
.doc-content > .doc-node > .title h1 a:hover,
|
||||
.doc-content > .doc-node > .title h2 a:hover,
|
||||
.doc-content > .doc-node > .title h3 a:hover,
|
||||
.doc-content > .doc-node > .title h4 a:hover,
|
||||
.doc-content > .doc-node > .title h5 a:hover,
|
||||
.doc-content > .doc-node > .title h6 a:hover {
|
||||
color: #b8c2cc;
|
||||
color: var(--ref-symbol-hover-color);
|
||||
}
|
||||
.doc-content > .footer {
|
||||
padding-top: 1rem;
|
||||
margin-top: auto;
|
||||
bottom: 1rem;
|
||||
color: 616161;
|
||||
color: var(--footer-text-color);
|
||||
border-color: #f1f5f8;
|
||||
border-color: var(--footer-top-line-color);
|
||||
border-top-style: solid;
|
||||
border-top-width: 1px;
|
||||
font-size: 0.8rem;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* Right menu */
|
||||
.doc-toc {
|
||||
right: 0;
|
||||
top: 0;
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
padding: 1rem 1rem 0 1rem;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
-ms-overflow-style: none;
|
||||
scrollbar-width: none;
|
||||
}
|
||||
.doc-toc::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
.doc-toc li {
|
||||
line-height: 1.5;
|
||||
}
|
||||
.doc-toc a {
|
||||
color: #2779bd;
|
||||
color: var(--toc-text-color);
|
||||
font-size: 0.9rem;
|
||||
font-weight: 600;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
display: block;
|
||||
text-decoration: none;
|
||||
border-left-width: 2px;
|
||||
border-left-style: solid;
|
||||
border-color: transparent;
|
||||
padding-left: 0.4rem;
|
||||
}
|
||||
.doc-toc a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.doc-toc a.active {
|
||||
border-color: #4299e1;
|
||||
border-color: var(--toc-indicator-color);
|
||||
}
|
||||
.doc-toc li ul {
|
||||
margin: 0.2rem 0 0.2rem;
|
||||
font-size: 0.7rem;
|
||||
list-style: none;
|
||||
}
|
||||
.doc-toc li ul a {
|
||||
font-weight: 400;
|
||||
padding-left: 0.8rem;
|
||||
}
|
||||
|
||||
/* Code highlight */
|
||||
pre, code, pre code {
|
||||
color: #5c6e74;
|
||||
color: var(--code-default-text-color);
|
||||
font-size: 0.948em;
|
||||
text-shadow: none;
|
||||
font-family: monospace;
|
||||
background-color: #edf2f7;
|
||||
background-color: var(--code-background-color);
|
||||
border-radius: 0.25rem;
|
||||
}
|
||||
pre code {
|
||||
direction: ltr;
|
||||
text-align: left;
|
||||
white-space: pre;
|
||||
word-spacing: normal;
|
||||
word-break: normal;
|
||||
line-height: 1.5;
|
||||
-moz-tab-size: 4;
|
||||
-o-tab-size: 4;
|
||||
tab-size: 4;
|
||||
-webkit-hyphens: none;
|
||||
-moz-hyphens: none;
|
||||
-ms-hyphens: none;
|
||||
hyphens: none;
|
||||
display: block;
|
||||
overflow-x: auto;
|
||||
padding: 1rem;
|
||||
}
|
||||
code {
|
||||
padding: 0.2rem;
|
||||
vertical-align: middle;
|
||||
}
|
||||
pre {
|
||||
overflow: auto;
|
||||
margin: 0;
|
||||
}
|
||||
.namespace {
|
||||
opacity: .7;
|
||||
}
|
||||
.token.comment {
|
||||
color: #93a1a1;
|
||||
color: var(--code-comment-text-color)
|
||||
}
|
||||
.token.punctuation {
|
||||
color: #999999;
|
||||
color: var(--code-punctuation-text-color);
|
||||
}
|
||||
.token.number,
|
||||
.token.symbol {
|
||||
color: #702459;
|
||||
color: var(--code-symbol-text-color);
|
||||
}
|
||||
.token.string,
|
||||
.token.char,
|
||||
.token.builtin {
|
||||
color: #38a169;
|
||||
color: var(--code-builtin-text-color);
|
||||
}
|
||||
.token.operator,
|
||||
.token.entity,
|
||||
.token.url,
|
||||
.language-css .token.string,
|
||||
.style .token.string {
|
||||
color: #a67f59;
|
||||
color: var(--code-operator-text-color);
|
||||
background: transparent;
|
||||
}
|
||||
.token.boolean,
|
||||
.token.keyword {
|
||||
color: #2b6cb0;
|
||||
color: var(--code-keyword-text-color);
|
||||
}
|
||||
.token.function {
|
||||
color: #319795;
|
||||
color: var(--code-function-text-color);
|
||||
}
|
||||
|
||||
/* Medium screen and up */
|
||||
@media (min-width: 768px) {
|
||||
.doc-container {
|
||||
flex-direction: row;
|
||||
}
|
||||
.doc-content {
|
||||
font-size: 0.95rem;
|
||||
flex: 1;
|
||||
padding: 1rem 2rem;
|
||||
}
|
||||
.doc-toc {
|
||||
position: relative;
|
||||
/* IE11 */
|
||||
position: sticky;
|
||||
position: -webkit-sticky;
|
||||
align-self: flex-start;
|
||||
top: 56px;
|
||||
height: auto;
|
||||
height: 100vh;
|
||||
min-width: 200px;
|
||||
width: auto;
|
||||
max-width: 300px;
|
||||
}
|
||||
.doc-toc > ul {
|
||||
padding-bottom: 1rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 1023px) {
|
||||
.doc-nav.hidden {
|
||||
height: auto;
|
||||
}
|
||||
.doc-nav > .heading-container > .heading {
|
||||
align-items: center;
|
||||
}
|
||||
.doc-nav > .heading-container > .heading > .toggle-version-container {
|
||||
flex-grow: 1;
|
||||
padding: 0 1rem;
|
||||
justify-content: space-between;
|
||||
}
|
||||
.doc-nav > .heading-container > .heading > #search {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 1024px) {
|
||||
.doc-nav {
|
||||
width: 300px;
|
||||
}
|
||||
.doc-nav #toggle-menu {
|
||||
display: none;
|
||||
}
|
||||
.doc-nav > .heading-container > .heading {
|
||||
height: auto;
|
||||
padding: 1rem 2rem;
|
||||
flex-direction: column-reverse;
|
||||
justify-content: center;
|
||||
}
|
||||
.doc-nav > .heading-container > .heading > .toggle-version-container {
|
||||
align-items: center;
|
||||
margin-bottom: 0.2rem;
|
||||
display: flex;
|
||||
flex-direction: row-reverse;
|
||||
}
|
||||
.doc-nav > .heading-container > .heading > .toggle-version-container > #dark-mode-toggle {
|
||||
margin-right: auto;
|
||||
}
|
||||
.doc-nav .content.show,
|
||||
.doc-nav .content.hidden {
|
||||
display: flex;
|
||||
}
|
||||
.doc-content > .doc-node.const:nth-child(2) {
|
||||
padding-bottom: 0 !important;
|
||||
}
|
||||
.doc-content > .doc-node.const:not(:first-child) {
|
||||
padding-top: 0;
|
||||
}
|
||||
.doc-content > .doc-node.const:not(:last-child) {
|
||||
padding-bottom: 1rem;
|
||||
}
|
||||
.doc-container {
|
||||
margin-top: 0;
|
||||
margin-left: 300px;
|
||||
}
|
||||
.doc-node {
|
||||
padding-top: 1rem !important;
|
||||
margin-top: 0 !important;
|
||||
}
|
||||
.doc-toc {
|
||||
top: 0;
|
||||
}
|
||||
}
|
||||
121
cmd/tools/vdoc-resources/doc.js
Normal file
121
cmd/tools/vdoc-resources/doc.js
Normal file
@@ -0,0 +1,121 @@
|
||||
(function() {
|
||||
if (document.body.scrollIntoView) {
|
||||
var docnav = document.querySelector('.doc-nav');
|
||||
var active = docnav.querySelector('li.active');
|
||||
if (active) {
|
||||
active.scrollIntoView({ block: 'center', inline: 'nearest' });
|
||||
}
|
||||
}
|
||||
setupScrollSpy();
|
||||
setupMobileToggle();
|
||||
setupDarkMode();
|
||||
setupSearch();
|
||||
setupCollapse();
|
||||
})();
|
||||
|
||||
function setupScrollSpy() {
|
||||
var sectionPositions = [];
|
||||
var sections = document.querySelectorAll('section');
|
||||
sections.forEach(function(section) {
|
||||
sectionPositions.push(section.offsetTop);
|
||||
});
|
||||
var scrollPos = 0;
|
||||
window.addEventListener('scroll', function(e) {
|
||||
// Reset classes
|
||||
document.querySelectorAll('.doc-toc a[class="active"]').forEach(function(link) {
|
||||
link.classList.remove('active');
|
||||
});
|
||||
// Set current menu link as active
|
||||
var scrollPosition = document.documentElement.scrollTop || document.body.scrollTop;
|
||||
for (var i = 0; i < sectionPositions.length; i++) {
|
||||
var section = sections[i];
|
||||
var position = sectionPositions[i];
|
||||
if (position >= scrollPosition) {
|
||||
var link = document.querySelector('.doc-toc a[href="#' + section.id + '"]');
|
||||
if (link) {
|
||||
link.classList.add('active');
|
||||
var docToc = document.querySelector('.doc-toc');
|
||||
var tocHeight = docToc.clientHeight;
|
||||
var scrollTop = docToc.scrollTop;
|
||||
if ((document.body.getBoundingClientRect()).top < scrollPos && scrollTop < link.offsetTop - 10) {
|
||||
docToc.scrollTop = link.clientHeight + link.offsetTop - tocHeight + 10;
|
||||
} else if (scrollTop > link.offsetTop - 10) {
|
||||
docToc.scrollTop = link.offsetTop - 10;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
scrollPos = (document.body.getBoundingClientRect()).top;
|
||||
});
|
||||
}
|
||||
|
||||
function setupMobileToggle() {
|
||||
var toggle = document.getElementById('toggle-menu');
|
||||
toggle.addEventListener('click', function(ev) {
|
||||
document.querySelectorAll('.doc-nav').forEach(function(el) {
|
||||
el.classList.toggle('hidden');
|
||||
});
|
||||
document.querySelectorAll('.doc-nav .content').forEach(function(el) {
|
||||
el.classList.toggle('hidden');
|
||||
el.classList.toggle('show');
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function setupDarkMode() {
|
||||
var html = document.getElementsByTagName('html')[0];
|
||||
var darkModeToggle = document.getElementById('dark-mode-toggle');
|
||||
darkModeToggle.addEventListener('click', function() {
|
||||
html.classList.toggle('dark');
|
||||
var isDarkModeEnabled = html.classList.contains('dark');
|
||||
localStorage.setItem('dark-mode', isDarkModeEnabled);
|
||||
darkModeToggle.setAttribute('aria-checked', isDarkModeEnabled)
|
||||
});
|
||||
if (localStorage.getItem('dark-mode') === 'true') {
|
||||
html.classList.add('dark');
|
||||
}
|
||||
|
||||
// Check if css var() is supported and enable dark mode toggle
|
||||
if (window.CSS && CSS.supports('color', 'var(--fake-var)')) {
|
||||
darkModeToggle.style.visibility = 'unset';
|
||||
}
|
||||
}
|
||||
|
||||
function setupSearch() {
|
||||
var searchInput = document.getElementById('search');
|
||||
searchInput.addEventListener('input', function(e) {
|
||||
var searchValue = e.target.value.toLowerCase();
|
||||
var menuItems = document.querySelectorAll('.content > ul > li');
|
||||
for (var i = 0; i < menuItems.length; i++) {
|
||||
var menuItem = menuItems[i];
|
||||
var links = menuItem.querySelectorAll('a');
|
||||
var hasResult = false;
|
||||
for (var li = 0; li < links.length; li++) {
|
||||
var link = links[li];
|
||||
if (!searchValue || link.text.toLowerCase().indexOf(searchValue) !== -1) {
|
||||
hasResult = true;
|
||||
}
|
||||
if (li > 0) {
|
||||
if (!searchValue || link.text.toLowerCase().indexOf(searchValue) !== -1) {
|
||||
link.style.display = '';
|
||||
} else {
|
||||
link.style.display = 'none';
|
||||
}
|
||||
}
|
||||
}
|
||||
menuItem.style.display = !searchValue || hasResult ? '' : 'none';
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function setupCollapse() {
|
||||
var dropdownArrows = document.querySelectorAll('.dropdown-arrow');
|
||||
for (var i = 0; i < dropdownArrows.length; i++) {
|
||||
var dropdownArrow = dropdownArrows[i];
|
||||
dropdownArrow.addEventListener('click', function(e) {
|
||||
var parent = e.target.parentElement.parentElement.parentElement;
|
||||
parent.classList.toggle('open');
|
||||
});
|
||||
}
|
||||
}
|
||||
1
cmd/tools/vdoc-resources/light.svg
Normal file
1
cmd/tools/vdoc-resources/light.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="light-icon" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M6.76 4.84l-1.8-1.79-1.41 1.41 1.79 1.79 1.42-1.41zM4 10.5H1v2h3v-2zm9-9.95h-2V3.5h2V.55zm7.45 3.91l-1.41-1.41-1.79 1.79 1.41 1.41 1.79-1.79zm-3.21 13.7l1.79 1.8 1.41-1.41-1.8-1.79-1.4 1.4zM20 10.5v2h3v-2h-3zm-8-5c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm-1 16.95h2V19.5h-2v2.95zm-7.45-3.91l1.41 1.41 1.79-1.8-1.41-1.41-1.79 1.8z"/></svg>
|
||||
|
After Width: | Height: | Size: 499 B |
1
cmd/tools/vdoc-resources/link.svg
Normal file
1
cmd/tools/vdoc-resources/link.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"/></svg>
|
||||
|
After Width: | Height: | Size: 350 B |
1
cmd/tools/vdoc-resources/menu.svg
Normal file
1
cmd/tools/vdoc-resources/menu.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" id="toggle-menu" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"/></svg>
|
||||
|
After Width: | Height: | Size: 201 B |
171
cmd/tools/vdoc-resources/normalize.css
vendored
Normal file
171
cmd/tools/vdoc-resources/normalize.css
vendored
Normal file
@@ -0,0 +1,171 @@
|
||||
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
|
||||
html {
|
||||
line-height: 1.15;
|
||||
-webkit-text-size-adjust: 100%;
|
||||
}
|
||||
|
||||
main {
|
||||
display: block;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 2em;
|
||||
margin: 0.67em 0;
|
||||
}
|
||||
|
||||
hr {
|
||||
box-sizing: content-box;
|
||||
height: 0;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
pre {
|
||||
font-family: monospace, monospace;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
a {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
abbr[title] {
|
||||
border-bottom: none;
|
||||
text-decoration: underline;
|
||||
text-decoration: underline dotted;
|
||||
}
|
||||
|
||||
b,
|
||||
strong {
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
kbd,
|
||||
samp {
|
||||
font-family: monospace, monospace;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
small {
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
sub,
|
||||
sup {
|
||||
font-size: 75%;
|
||||
line-height: 0;
|
||||
position: relative;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sub {
|
||||
bottom: -0.25em;
|
||||
}
|
||||
|
||||
sup {
|
||||
top: -0.5em;
|
||||
}
|
||||
|
||||
img {
|
||||
border-style: none;
|
||||
}
|
||||
|
||||
button,
|
||||
input,
|
||||
optgroup,
|
||||
select,
|
||||
textarea {
|
||||
font-family: inherit;
|
||||
font-size: 100%;
|
||||
line-height: 1.15;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
button,
|
||||
input {
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
button,
|
||||
select {
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
button,
|
||||
[type="button"],
|
||||
[type="reset"],
|
||||
[type="submit"] {
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
|
||||
button::-moz-focus-inner,
|
||||
[type="button"]::-moz-focus-inner,
|
||||
[type="reset"]::-moz-focus-inner,
|
||||
[type="submit"]::-moz-focus-inner {
|
||||
border-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
button:-moz-focusring,
|
||||
[type="button"]:-moz-focusring,
|
||||
[type="reset"]:-moz-focusring,
|
||||
[type="submit"]:-moz-focusring {
|
||||
outline: 1px dotted ButtonText;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
padding: 0.35em 0.75em 0.625em;
|
||||
}
|
||||
|
||||
legend {
|
||||
box-sizing: border-box;
|
||||
color: inherit;
|
||||
display: table;
|
||||
max-width: 100%;
|
||||
padding: 0;
|
||||
white-space: normal;
|
||||
}
|
||||
|
||||
progress {
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
textarea {
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
[type="checkbox"],
|
||||
[type="radio"] {
|
||||
box-sizing: border-box;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
[type="number"]::-webkit-inner-spin-button,
|
||||
[type="number"]::-webkit-outer-spin-button {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
[type="search"] {
|
||||
-webkit-appearance: textfield;
|
||||
outline-offset: -2px;
|
||||
}
|
||||
|
||||
[type="search"]::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
::-webkit-file-upload-button {
|
||||
-webkit-appearance: button;
|
||||
font: inherit;
|
||||
}
|
||||
|
||||
summary {
|
||||
display: list-item;
|
||||
}
|
||||
|
||||
template {
|
||||
display: none;
|
||||
}
|
||||
|
||||
[hidden] {
|
||||
display: none;
|
||||
}
|
||||
1064
cmd/tools/vdoc.v
Normal file
1064
cmd/tools/vdoc.v
Normal file
File diff suppressed because it is too large
Load Diff
286
cmd/tools/vdoctor.v
Normal file
286
cmd/tools/vdoctor.v
Normal file
@@ -0,0 +1,286 @@
|
||||
import os
|
||||
import time
|
||||
import v.util
|
||||
import runtime
|
||||
|
||||
struct App {
|
||||
mut:
|
||||
report_lines []string
|
||||
cached_cpuinfo map[string]string
|
||||
}
|
||||
|
||||
fn (mut a App) println(s string) {
|
||||
a.report_lines << s
|
||||
}
|
||||
|
||||
fn (mut a App) collect_info() {
|
||||
mut os_kind := os.user_os()
|
||||
mut arch_details := []string{}
|
||||
arch_details << '$runtime.nr_cpus() cpus'
|
||||
if runtime.is_32bit() {
|
||||
arch_details << '32bit'
|
||||
}
|
||||
if runtime.is_64bit() {
|
||||
arch_details << '64bit'
|
||||
}
|
||||
if runtime.is_big_endian() {
|
||||
arch_details << 'big endian'
|
||||
}
|
||||
if runtime.is_little_endian() {
|
||||
arch_details << 'little endian'
|
||||
}
|
||||
if os_kind == 'macos' {
|
||||
arch_details << a.cmd({
|
||||
command: 'sysctl -n machdep.cpu.brand_string'
|
||||
})
|
||||
}
|
||||
if os_kind == 'linux' {
|
||||
info := a.cpu_info()
|
||||
mut cpu_details := ''
|
||||
if cpu_details == '' {
|
||||
cpu_details = info['model name']
|
||||
}
|
||||
if cpu_details == '' {
|
||||
cpu_details = info['hardware']
|
||||
}
|
||||
if cpu_details == '' {
|
||||
cpu_details = os.uname().machine
|
||||
}
|
||||
arch_details << cpu_details
|
||||
}
|
||||
if os_kind == 'windows' {
|
||||
arch_details << a.cmd({
|
||||
command: 'wmic cpu get name /format:table'
|
||||
line: 1
|
||||
})
|
||||
}
|
||||
//
|
||||
mut os_details := ''
|
||||
wsl_check := a.cmd({
|
||||
command: 'cat /proc/sys/kernel/osrelease'
|
||||
})
|
||||
if os_kind == 'linux' {
|
||||
os_details = a.get_linux_os_name()
|
||||
info := a.cpu_info()
|
||||
if 'hypervisor' in info['flags'] {
|
||||
if 'microsoft' in wsl_check {
|
||||
// WSL 2 is a Managed VM and Full Linux Kernel
|
||||
// See https://docs.microsoft.com/en-us/windows/wsl/compare-versions
|
||||
os_details += ' (WSL 2)'
|
||||
} else {
|
||||
os_details += ' (VM)'
|
||||
}
|
||||
}
|
||||
// WSL 1 is NOT a Managed VM and Full Linux Kernel
|
||||
// See https://docs.microsoft.com/en-us/windows/wsl/compare-versions
|
||||
if 'Microsoft' in wsl_check {
|
||||
os_details += ' (WSL)'
|
||||
}
|
||||
// From https://unix.stackexchange.com/a/14346
|
||||
if a.cmd(command: '[ "$(awk \'\$5=="/" {print \$1}\' </proc/1/mountinfo)" != "$(awk \'\$5=="/" {print \$1}\' </proc/$$/mountinfo)" ] ; echo \$?') == '0' {
|
||||
os_details += ' (chroot)'
|
||||
}
|
||||
} else if os_kind == 'macos' {
|
||||
mut details := []string{}
|
||||
details << a.cmd({
|
||||
command: 'sw_vers -productName'
|
||||
})
|
||||
details << a.cmd({
|
||||
command: 'sw_vers -productVersion'
|
||||
})
|
||||
details << a.cmd({
|
||||
command: 'sw_vers -buildVersion'
|
||||
})
|
||||
os_details = details.join(', ')
|
||||
} else if os_kind == 'windows' {
|
||||
wmic_info := a.cmd({
|
||||
command: 'wmic os get * /format:value'
|
||||
line: -1
|
||||
})
|
||||
p := a.parse(wmic_info, '=')
|
||||
caption, build_number, os_arch := p['caption'], p['buildnumber'], p['osarchitecture']
|
||||
os_details = '$caption v$build_number $os_arch'
|
||||
} else {
|
||||
ouname := os.uname()
|
||||
os_details = '$ouname.release, $ouname.version'
|
||||
}
|
||||
a.line('OS', '$os_kind, $os_details')
|
||||
a.line('Processor', arch_details.join(', '))
|
||||
a.line('CC version', a.cmd({
|
||||
command: 'cc --version'
|
||||
}))
|
||||
a.println('')
|
||||
a.line('getwd', os.getwd())
|
||||
vexe := os.getenv('VEXE')
|
||||
vroot := os.dir(vexe)
|
||||
os.chdir(vroot)
|
||||
a.line('vroot', vroot)
|
||||
a.line('vexe', vexe)
|
||||
a.line('vexe mtime', time.unix(os.file_last_mod_unix(vexe)).str())
|
||||
is_writable_vroot := os.is_writable_folder(vroot) or {
|
||||
false
|
||||
}
|
||||
a.line('is vroot writable', is_writable_vroot.str())
|
||||
a.line('V full version', util.full_v_version(true))
|
||||
vtmp := os.getenv('VTMP')
|
||||
if vtmp != '' {
|
||||
a.line('env VTMP', '"$vtmp"')
|
||||
}
|
||||
vflags := os.getenv('VFLAGS')
|
||||
if vflags != '' {
|
||||
a.line('env VFLAGS', '"$vflags"')
|
||||
}
|
||||
a.println('')
|
||||
a.line('Git version', a.cmd({
|
||||
command: 'git --version'
|
||||
}))
|
||||
a.line('Git vroot status', a.git_info())
|
||||
a.line('.git/config present', os.is_file('.git/config').str())
|
||||
//
|
||||
a.report_tcc_version('thirdparty/tcc')
|
||||
}
|
||||
|
||||
struct CmdConfig {
|
||||
line int
|
||||
command string
|
||||
}
|
||||
|
||||
fn (mut a App) cmd(c CmdConfig) string {
|
||||
x := os.exec(c.command) or {
|
||||
return 'N/A'
|
||||
}
|
||||
if x.exit_code == 0 {
|
||||
if c.line < 0 {
|
||||
return x.output
|
||||
}
|
||||
output := x.output.split_into_lines()
|
||||
if output.len > 0 && output.len > c.line {
|
||||
return output[c.line]
|
||||
}
|
||||
}
|
||||
return 'Error: $x.output'
|
||||
}
|
||||
|
||||
fn (mut a App) line(label string, value string) {
|
||||
a.println('$label: ${util.bold(value)}')
|
||||
}
|
||||
|
||||
fn (app &App) parse(config string, sep string) map[string]string {
|
||||
mut m := map[string]string{}
|
||||
for line in config.split_into_lines() {
|
||||
sline := line.trim_space()
|
||||
if sline.len == 0 || sline[0] == `#` {
|
||||
continue
|
||||
}
|
||||
x := sline.split(sep)
|
||||
if x.len < 2 {
|
||||
continue
|
||||
}
|
||||
m[x[0].trim_space().to_lower()] = x[1].trim_space().trim('"')
|
||||
}
|
||||
return m
|
||||
}
|
||||
|
||||
fn (mut a App) get_linux_os_name() string {
|
||||
mut os_details := ''
|
||||
linux_os_methods := ['os-release', 'lsb_release', 'kernel', 'uname']
|
||||
for m in linux_os_methods {
|
||||
match m {
|
||||
'os-release' {
|
||||
if !os.is_file('/etc/os-release') {
|
||||
continue
|
||||
}
|
||||
lines := os.read_file('/etc/os-release') or {
|
||||
continue
|
||||
}
|
||||
vals := a.parse(lines, '=')
|
||||
if vals['PRETTY_NAME'] == '' {
|
||||
continue
|
||||
}
|
||||
os_details = vals['PRETTY_NAME']
|
||||
break
|
||||
}
|
||||
'lsb_release' {
|
||||
exists := a.cmd({
|
||||
command: 'type lsb_release'
|
||||
})
|
||||
if exists.starts_with('Error') {
|
||||
continue
|
||||
}
|
||||
os_details = a.cmd({
|
||||
command: 'lsb_release -d -s'
|
||||
})
|
||||
break
|
||||
}
|
||||
'kernel' {
|
||||
if !os.is_file('/proc/version') {
|
||||
continue
|
||||
}
|
||||
os_details = a.cmd({
|
||||
command: 'cat /proc/version'
|
||||
})
|
||||
break
|
||||
}
|
||||
'uname' {
|
||||
ouname := os.uname()
|
||||
os_details = '$ouname.release, $ouname.version'
|
||||
break
|
||||
}
|
||||
else {}
|
||||
}
|
||||
}
|
||||
return os_details
|
||||
}
|
||||
|
||||
fn (mut a App) cpu_info() map[string]string {
|
||||
if a.cached_cpuinfo.len > 0 {
|
||||
return a.cached_cpuinfo
|
||||
}
|
||||
info := os.exec('cat /proc/cpuinfo') or {
|
||||
return a.cached_cpuinfo
|
||||
}
|
||||
vals := a.parse(info.output, ':')
|
||||
a.cached_cpuinfo = vals
|
||||
return vals
|
||||
}
|
||||
|
||||
fn (mut a App) git_info() string {
|
||||
mut out := a.cmd({
|
||||
command: 'git -C . describe --abbrev=8 --dirty --always --tags'
|
||||
}).trim_space()
|
||||
os.exec('git -C . remote add V_REPO https://github.com/vlang/v') or { } // ignore failure (i.e. remote exists)
|
||||
os.exec('git -C . fetch V_REPO') or { }
|
||||
commit_count := a.cmd({
|
||||
command: 'git rev-list @{0}...V_REPO/master --right-only --count'
|
||||
}).int()
|
||||
if commit_count > 0 {
|
||||
out += ' ($commit_count commit(s) behind V master)'
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
fn (mut a App) report_tcc_version(tccfolder string) {
|
||||
if !os.is_file(os.join_path(tccfolder, '.git', 'config')) {
|
||||
a.line(tccfolder, 'N/A')
|
||||
return
|
||||
}
|
||||
tcc_branch_name := a.cmd({
|
||||
command: 'git -C $tccfolder rev-parse --abbrev-ref HEAD'
|
||||
})
|
||||
tcc_commit := a.cmd({
|
||||
command: 'git -C $tccfolder describe --abbrev=8 --dirty --always --tags'
|
||||
})
|
||||
a.line('$tccfolder status', '$tcc_branch_name $tcc_commit')
|
||||
}
|
||||
|
||||
fn (mut a App) report_info() {
|
||||
for x in a.report_lines {
|
||||
println(x)
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
mut app := App{}
|
||||
app.collect_info()
|
||||
app.report_info()
|
||||
}
|
||||
344
cmd/tools/vfmt.v
Normal file
344
cmd/tools/vfmt.v
Normal file
@@ -0,0 +1,344 @@
|
||||
// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved.
|
||||
// Use of this source code is governed by an MIT license
|
||||
// that can be found in the LICENSE file.
|
||||
module main
|
||||
|
||||
import os
|
||||
import os.cmdline
|
||||
import rand
|
||||
import v.ast
|
||||
import v.pref
|
||||
import v.fmt
|
||||
import v.util
|
||||
import v.parser
|
||||
import v.table
|
||||
import vhelp
|
||||
|
||||
struct FormatOptions {
|
||||
is_l bool
|
||||
is_c bool // NB: This refers to the '-c' fmt flag, NOT the C backend
|
||||
is_w bool
|
||||
is_diff bool
|
||||
is_verbose bool
|
||||
is_all bool
|
||||
is_worker bool
|
||||
is_debug bool
|
||||
is_noerror bool
|
||||
is_verify bool // exit(1) if the file is not vfmt'ed
|
||||
}
|
||||
|
||||
const (
|
||||
formatted_file_token = '\@\@\@' + 'FORMATTED_FILE: '
|
||||
platform_and_file_extensions = [
|
||||
['windows', '_windows.v'],
|
||||
['linux', '_lin.v', '_linux.v', '_nix.v'],
|
||||
['macos', '_mac.v', '_darwin.v'],
|
||||
['freebsd', '_bsd.v', '_freebsd.v'],
|
||||
['netbsd', '_bsd.v', '_netbsd.v'],
|
||||
['openbsd', '_bsd.v', '_openbsd.v'],
|
||||
['solaris', '_solaris.v'],
|
||||
['haiku', '_haiku.v'],
|
||||
['qnx', '_qnx.v'],
|
||||
]
|
||||
)
|
||||
|
||||
fn main() {
|
||||
// if os.getenv('VFMT_ENABLE') == '' {
|
||||
// eprintln('v fmt is disabled for now')
|
||||
// exit(1)
|
||||
// }
|
||||
toolexe := os.executable()
|
||||
util.set_vroot_folder(os.dir(os.dir(os.dir(toolexe))))
|
||||
args := util.join_env_vflags_and_os_args()
|
||||
foptions := FormatOptions{
|
||||
is_c: '-c' in args
|
||||
is_l: '-l' in args
|
||||
is_w: '-w' in args
|
||||
is_diff: '-diff' in args
|
||||
is_verbose: '-verbose' in args || '--verbose' in args
|
||||
is_all: '-all' in args || '--all' in args
|
||||
is_worker: '-worker' in args
|
||||
is_debug: '-debug' in args
|
||||
is_noerror: '-noerror' in args
|
||||
is_verify: '-verify' in args
|
||||
}
|
||||
if foptions.is_verbose {
|
||||
eprintln('vfmt foptions: $foptions')
|
||||
}
|
||||
if foptions.is_worker {
|
||||
// -worker should be added by a parent vfmt process.
|
||||
// We launch a sub process for each file because
|
||||
// the v compiler can do an early exit if it detects
|
||||
// a syntax error, but we want to process ALL passed
|
||||
// files if possible.
|
||||
foptions.format_file(cmdline.option(args, '-worker', ''))
|
||||
exit(0)
|
||||
}
|
||||
// we are NOT a worker at this stage, i.e. we are a parent vfmt process
|
||||
possible_files := cmdline.only_non_options(cmdline.options_after(args, ['fmt']))
|
||||
if foptions.is_verbose {
|
||||
eprintln('vfmt toolexe: $toolexe')
|
||||
eprintln('vfmt args: ' + os.args.str())
|
||||
eprintln('vfmt env_vflags_and_os_args: ' + args.str())
|
||||
eprintln('vfmt possible_files: ' + possible_files.str())
|
||||
}
|
||||
mut files := []string{}
|
||||
for file in possible_files {
|
||||
if os.is_dir(file) {
|
||||
files << os.walk_ext(file, '.v')
|
||||
files << os.walk_ext(file, '.vsh')
|
||||
continue
|
||||
}
|
||||
if !file.ends_with('.v') && !file.ends_with('.vv') && !file.ends_with('.vsh') {
|
||||
verror('v fmt can only be used on .v files.\nOffending file: "$file"')
|
||||
continue
|
||||
}
|
||||
if !os.exists(file) {
|
||||
verror('"$file" does not exist')
|
||||
continue
|
||||
}
|
||||
files << file
|
||||
}
|
||||
if files.len == 0 {
|
||||
vhelp.show_topic('fmt')
|
||||
exit(0)
|
||||
}
|
||||
mut cli_args_no_files := []string{}
|
||||
for a in os.args {
|
||||
if a !in files {
|
||||
cli_args_no_files << a
|
||||
}
|
||||
}
|
||||
mut errors := 0
|
||||
for file in files {
|
||||
fpath := os.real_path(file)
|
||||
mut worker_command_array := cli_args_no_files.clone()
|
||||
worker_command_array << ['-worker', util.quote_path(fpath)]
|
||||
worker_cmd := worker_command_array.join(' ')
|
||||
if foptions.is_verbose {
|
||||
eprintln('vfmt worker_cmd: $worker_cmd')
|
||||
}
|
||||
worker_result := os.exec(worker_cmd) or {
|
||||
errors++
|
||||
continue
|
||||
}
|
||||
if worker_result.exit_code != 0 {
|
||||
eprintln(worker_result.output)
|
||||
if worker_result.exit_code == 1 {
|
||||
eprintln('vfmt error while formatting file: $file .')
|
||||
}
|
||||
errors++
|
||||
continue
|
||||
}
|
||||
if worker_result.output.len > 0 {
|
||||
if worker_result.output.contains(formatted_file_token) {
|
||||
wresult := worker_result.output.split(formatted_file_token)
|
||||
formatted_warn_errs := wresult[0]
|
||||
formatted_file_path := wresult[1].trim_right('\n\r')
|
||||
foptions.post_process_file(fpath, formatted_file_path)
|
||||
if formatted_warn_errs.len > 0 {
|
||||
eprintln(formatted_warn_errs)
|
||||
}
|
||||
continue
|
||||
}
|
||||
}
|
||||
errors++
|
||||
}
|
||||
if errors > 0 {
|
||||
eprintln('Encountered a total of: $errors errors.')
|
||||
if foptions.is_noerror {
|
||||
exit(0)
|
||||
}
|
||||
exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
fn (foptions &FormatOptions) format_file(file string) {
|
||||
mut prefs := pref.new_preferences()
|
||||
prefs.is_fmt = true
|
||||
if foptions.is_verbose {
|
||||
eprintln('vfmt2 running fmt.fmt over file: $file')
|
||||
}
|
||||
table := table.new_table()
|
||||
// checker := checker.new_checker(table, prefs)
|
||||
file_ast := parser.parse_file(file, table, .parse_comments, prefs, &ast.Scope{
|
||||
parent: 0
|
||||
})
|
||||
// checker.check(file_ast)
|
||||
formatted_content := fmt.fmt(file_ast, table, foptions.is_debug)
|
||||
file_name := os.file_name(file)
|
||||
ulid := rand.ulid()
|
||||
vfmt_output_path := os.join_path(os.temp_dir(), 'vfmt_${ulid}_$file_name')
|
||||
os.write_file(vfmt_output_path, formatted_content)
|
||||
if foptions.is_verbose {
|
||||
eprintln('fmt.fmt worked and $formatted_content.len bytes were written to $vfmt_output_path .')
|
||||
}
|
||||
eprintln('$formatted_file_token$vfmt_output_path')
|
||||
}
|
||||
|
||||
fn print_compiler_options(compiler_params &pref.Preferences) {
|
||||
eprintln(' os: ' + compiler_params.os.str())
|
||||
eprintln(' ccompiler: $compiler_params.ccompiler')
|
||||
eprintln(' path: $compiler_params.path ')
|
||||
eprintln(' out_name: $compiler_params.out_name ')
|
||||
eprintln(' vroot: $compiler_params.vroot ')
|
||||
eprintln('lookup_path: $compiler_params.lookup_path ')
|
||||
eprintln(' out_name: $compiler_params.out_name ')
|
||||
eprintln(' cflags: $compiler_params.cflags ')
|
||||
eprintln(' is_test: $compiler_params.is_test ')
|
||||
eprintln(' is_script: $compiler_params.is_script ')
|
||||
}
|
||||
|
||||
fn (foptions &FormatOptions) post_process_file(file string, formatted_file_path string) {
|
||||
if formatted_file_path.len == 0 {
|
||||
return
|
||||
}
|
||||
if foptions.is_diff {
|
||||
diff_cmd := util.find_working_diff_command() or {
|
||||
eprintln(err)
|
||||
return
|
||||
}
|
||||
if foptions.is_verbose {
|
||||
eprintln('Using diff command: $diff_cmd')
|
||||
}
|
||||
println(util.color_compare_files(diff_cmd, file, formatted_file_path))
|
||||
return
|
||||
}
|
||||
if foptions.is_verify {
|
||||
diff_cmd := util.find_working_diff_command() or {
|
||||
eprintln(err)
|
||||
return
|
||||
}
|
||||
x := util.color_compare_files(diff_cmd, file, formatted_file_path)
|
||||
if x.len != 0 {
|
||||
println("$file is not vfmt'ed")
|
||||
exit(1)
|
||||
}
|
||||
return
|
||||
}
|
||||
fc := os.read_file(file) or {
|
||||
eprintln('File $file could not be read')
|
||||
return
|
||||
}
|
||||
formatted_fc := os.read_file(formatted_file_path) or {
|
||||
eprintln('File $formatted_file_path could not be read')
|
||||
return
|
||||
}
|
||||
is_formatted_different := fc != formatted_fc
|
||||
if foptions.is_c {
|
||||
if is_formatted_different {
|
||||
eprintln('File is not formatted: $file')
|
||||
exit(2)
|
||||
}
|
||||
return
|
||||
}
|
||||
if foptions.is_l {
|
||||
if is_formatted_different {
|
||||
eprintln('File needs formatting: $file')
|
||||
}
|
||||
return
|
||||
}
|
||||
if foptions.is_w {
|
||||
if is_formatted_different {
|
||||
os.mv_by_cp(formatted_file_path, file) or {
|
||||
panic(err)
|
||||
}
|
||||
eprintln('Reformatted file: $file')
|
||||
} else {
|
||||
eprintln('Already formatted file: $file')
|
||||
}
|
||||
return
|
||||
}
|
||||
print(formatted_fc)
|
||||
}
|
||||
|
||||
fn (f FormatOptions) str() string {
|
||||
return 'FormatOptions{ is_l: $f.is_l, is_w: $f.is_w, is_diff: $f.is_diff, is_verbose: $f.is_verbose,' +
|
||||
' is_all: $f.is_all, is_worker: $f.is_worker, is_debug: $f.is_debug, is_noerror: $f.is_noerror,' +
|
||||
' is_verify: $f.is_verify" }'
|
||||
}
|
||||
|
||||
fn file_to_target_os(file string) string {
|
||||
for extensions in platform_and_file_extensions {
|
||||
for ext in extensions {
|
||||
if file.ends_with(ext) {
|
||||
return extensions[0]
|
||||
}
|
||||
}
|
||||
}
|
||||
return ''
|
||||
}
|
||||
|
||||
fn file_to_mod_name_and_is_module_file(file string) (string, bool) {
|
||||
mut mod_name := 'main'
|
||||
mut is_module_file := false
|
||||
flines := read_source_lines(file) or {
|
||||
return mod_name, is_module_file
|
||||
}
|
||||
for fline in flines {
|
||||
line := fline.trim_space()
|
||||
if line.starts_with('module ') {
|
||||
if !line.starts_with('module main') {
|
||||
is_module_file = true
|
||||
mod_name = line.replace('module ', ' ').trim_space()
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
return mod_name, is_module_file
|
||||
}
|
||||
|
||||
fn read_source_lines(file string) ?[]string {
|
||||
source_lines := os.read_lines(file) or {
|
||||
return error('can not read $file')
|
||||
}
|
||||
return source_lines
|
||||
}
|
||||
|
||||
fn get_compile_name_of_potential_v_project(file string) string {
|
||||
// This function get_compile_name_of_potential_v_project returns:
|
||||
// a) the file's folder, if file is part of a v project
|
||||
// b) the file itself, if the file is a standalone v program
|
||||
pfolder := os.real_path(os.dir(file))
|
||||
// a .v project has many 'module main' files in one folder
|
||||
// if there is only one .v file, then it must be a standalone
|
||||
all_files_in_pfolder := os.ls(pfolder) or {
|
||||
panic(err)
|
||||
}
|
||||
mut vfiles := []string{}
|
||||
for f in all_files_in_pfolder {
|
||||
vf := os.join_path(pfolder, f)
|
||||
if f.starts_with('.') || !f.ends_with('.v') || os.is_dir(vf) {
|
||||
continue
|
||||
}
|
||||
vfiles << vf
|
||||
}
|
||||
if vfiles.len == 1 {
|
||||
return file
|
||||
}
|
||||
// /////////////////////////////////////////////////////////////
|
||||
// At this point, we know there are many .v files in the folder
|
||||
// We will have to read them all, and if there are more than one
|
||||
// containing `fn main` then the folder contains multiple standalone
|
||||
// v programs. If only one contains `fn main` then the folder is
|
||||
// a project folder, that should be compiled with `v pfolder`.
|
||||
mut main_fns := 0
|
||||
for f in vfiles {
|
||||
slines := read_source_lines(f) or {
|
||||
panic(err)
|
||||
}
|
||||
for line in slines {
|
||||
if line.contains('fn main()') {
|
||||
main_fns++
|
||||
if main_fns > 1 {
|
||||
return file
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return pfolder
|
||||
}
|
||||
|
||||
fn verror(s string) {
|
||||
util.verror('vfmt error', s)
|
||||
}
|
||||
601
cmd/tools/vpm.v
Normal file
601
cmd/tools/vpm.v
Normal file
@@ -0,0 +1,601 @@
|
||||
// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved.
|
||||
// Use of this source code is governed by an MIT license
|
||||
// that can be found in the LICENSE file.
|
||||
module main
|
||||
|
||||
import os
|
||||
import os.cmdline
|
||||
import net.http
|
||||
import json
|
||||
import vhelp
|
||||
import v.vmod
|
||||
|
||||
const (
|
||||
default_vpm_server_urls = ['https://vpm.vlang.io']
|
||||
valid_vpm_commands = ['help', 'search', 'install', 'update', 'upgrade', 'outdated',
|
||||
'list', 'remove']
|
||||
excluded_dirs = ['cache', 'vlib']
|
||||
supported_vcs_systems = ['git', 'hg']
|
||||
supported_vcs_folders = ['.git', '.hg']
|
||||
supported_vcs_update_cmds = {
|
||||
'git': 'git pull'
|
||||
'hg': 'hg pull --update'
|
||||
}
|
||||
supported_vcs_install_cmds = {
|
||||
'git': 'git clone --depth=1'
|
||||
'hg': 'hg clone'
|
||||
}
|
||||
supported_vcs_outdated_steps = {
|
||||
'git': ['git fetch', 'git rev-parse @', 'git rev-parse @{u}']
|
||||
'hg': ['hg incoming']
|
||||
}
|
||||
)
|
||||
|
||||
struct Mod {
|
||||
id int
|
||||
name string
|
||||
url string
|
||||
nr_downloads int
|
||||
vcs string
|
||||
}
|
||||
|
||||
struct Vmod {
|
||||
mut:
|
||||
name string
|
||||
version string
|
||||
deps []string
|
||||
}
|
||||
|
||||
fn main() {
|
||||
init_settings()
|
||||
// This tool is intended to be launched by the v frontend,
|
||||
// which provides the path to V inside os.getenv('VEXE')
|
||||
args := os.args // args are: vpm [options] SUBCOMMAND module names
|
||||
params := cmdline.only_non_options(args[1..])
|
||||
verbose_println('cli params: $params')
|
||||
if params.len < 1 {
|
||||
vpm_help()
|
||||
exit(5)
|
||||
}
|
||||
vpm_command := params[0]
|
||||
mut module_names := params[1..]
|
||||
ensure_vmodules_dir_exist()
|
||||
// println('module names: ') println(module_names)
|
||||
match vpm_command {
|
||||
'help' {
|
||||
vpm_help()
|
||||
}
|
||||
'search' {
|
||||
vpm_search(module_names)
|
||||
}
|
||||
'install' {
|
||||
if module_names.len == 0 && os.exists('./v.mod') {
|
||||
println('Detected v.mod file inside the project directory. Using it...')
|
||||
manifest := vmod.from_file('./v.mod') or {
|
||||
panic(err)
|
||||
}
|
||||
module_names = manifest.dependencies
|
||||
}
|
||||
vpm_install(module_names)
|
||||
}
|
||||
'update' {
|
||||
vpm_update(module_names)
|
||||
}
|
||||
'upgrade' {
|
||||
vpm_upgrade()
|
||||
}
|
||||
'outdated' {
|
||||
vpm_outdated()
|
||||
}
|
||||
'list' {
|
||||
vpm_list()
|
||||
}
|
||||
'remove' {
|
||||
vpm_remove(module_names)
|
||||
}
|
||||
else {
|
||||
println('Error: you tried to run "v $vpm_command"')
|
||||
println('... but the v package management tool vpm only knows about these commands:')
|
||||
for validcmd in valid_vpm_commands {
|
||||
println(' v $validcmd')
|
||||
}
|
||||
exit(3)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn vpm_search(keywords []string) {
|
||||
search_keys := keywords.map(it.replace('_', '-'))
|
||||
if settings.is_help {
|
||||
vhelp.show_topic('search')
|
||||
exit(0)
|
||||
}
|
||||
if search_keys.len == 0 {
|
||||
println(' v search requires *at least one* keyword')
|
||||
exit(2)
|
||||
}
|
||||
modules := get_all_modules()
|
||||
installed_modules := get_installed_modules()
|
||||
joined := search_keys.join(', ')
|
||||
mut index := 0
|
||||
for mod in modules {
|
||||
// TODO for some reason .filter results in substr error, so do it manually
|
||||
for k in search_keys {
|
||||
if !mod.contains(k) {
|
||||
continue
|
||||
}
|
||||
if index == 0 {
|
||||
println('Search results for "$joined":\n')
|
||||
}
|
||||
index++
|
||||
mut parts := mod.split('.')
|
||||
// in case the author isn't present
|
||||
if parts.len == 1 {
|
||||
parts << parts[0]
|
||||
parts[0] = ' '
|
||||
} else {
|
||||
parts[0] = ' by ${parts[0]} '
|
||||
}
|
||||
installed := if mod in installed_modules { ' (installed)' } else { '' }
|
||||
println('${index}. ${parts[1]}${parts[0]}[$mod]$installed')
|
||||
break
|
||||
}
|
||||
}
|
||||
if index == 0 {
|
||||
vexe := os.getenv('VEXE')
|
||||
vroot := os.real_path(os.dir(vexe))
|
||||
mut messages := ['No module(s) found for `$joined` .']
|
||||
for vlibmod in search_keys {
|
||||
if os.is_dir(os.join_path(vroot, 'vlib', vlibmod)) {
|
||||
messages << 'There is already an existing "$vlibmod" module in vlib, so you can just `import $vlibmod` .'
|
||||
}
|
||||
}
|
||||
for m in messages {
|
||||
println(m)
|
||||
}
|
||||
} else {
|
||||
println('\nUse "v install author_name.module_name" to install the module.')
|
||||
}
|
||||
}
|
||||
|
||||
fn vpm_install(module_names []string) {
|
||||
if settings.is_help {
|
||||
vhelp.show_topic('install')
|
||||
exit(0)
|
||||
}
|
||||
if module_names.len == 0 {
|
||||
println(' v install requires *at least one* module name')
|
||||
exit(2)
|
||||
}
|
||||
mut errors := 0
|
||||
for n in module_names {
|
||||
name := n.trim_space().replace('_', '-')
|
||||
mod := get_module_meta_info(name) or {
|
||||
errors++
|
||||
println('Errors while retrieving meta data for module $name:')
|
||||
println(err)
|
||||
continue
|
||||
}
|
||||
mut vcs := mod.vcs
|
||||
if vcs == '' {
|
||||
vcs = supported_vcs_systems[0]
|
||||
}
|
||||
if vcs !in supported_vcs_systems {
|
||||
errors++
|
||||
println('Skipping module "$name", since it uses an unsupported VCS {$vcs} .')
|
||||
continue
|
||||
}
|
||||
mod_name_as_path := mod.name.replace('.', os.path_separator).replace('-', '_').to_lower()
|
||||
final_module_path := os.real_path(os.join_path(settings.vmodules_path, mod_name_as_path))
|
||||
if os.exists(final_module_path) {
|
||||
vpm_update([name])
|
||||
continue
|
||||
}
|
||||
println('Installing module "$name" from $mod.url to $final_module_path ...')
|
||||
vcs_install_cmd := supported_vcs_install_cmds[vcs]
|
||||
cmd := '$vcs_install_cmd "$mod.url" "$final_module_path"'
|
||||
verbose_println(' command: $cmd')
|
||||
cmdres := os.exec(cmd) or {
|
||||
errors++
|
||||
println('Could not install module "$name" to "$final_module_path" .')
|
||||
verbose_println('Error command: $cmd')
|
||||
verbose_println('Error details: $err')
|
||||
continue
|
||||
}
|
||||
if cmdres.exit_code != 0 {
|
||||
errors++
|
||||
println('Failed installing module "$name" to "$final_module_path" .')
|
||||
verbose_println('Failed command: $cmd')
|
||||
verbose_println('Failed command output:\n$cmdres.output')
|
||||
continue
|
||||
}
|
||||
resolve_dependencies(name, final_module_path, module_names)
|
||||
}
|
||||
if errors > 0 {
|
||||
exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
fn vpm_update(m []string) {
|
||||
mut module_names := m
|
||||
if settings.is_help {
|
||||
vhelp.show_topic('update')
|
||||
exit(0)
|
||||
}
|
||||
if module_names.len == 0 {
|
||||
module_names = get_installed_modules()
|
||||
}
|
||||
mut errors := 0
|
||||
for name in module_names {
|
||||
final_module_path := valid_final_path_of_existing_module(name) or {
|
||||
continue
|
||||
}
|
||||
os.chdir(final_module_path)
|
||||
println('Updating module "$name"...')
|
||||
verbose_println(' work folder: $final_module_path')
|
||||
vcs := vcs_used_in_dir(final_module_path) or {
|
||||
continue
|
||||
}
|
||||
vcs_cmd := supported_vcs_update_cmds[vcs[0]]
|
||||
verbose_println(' command: $vcs_cmd')
|
||||
vcs_res := os.exec('$vcs_cmd') or {
|
||||
errors++
|
||||
println('Could not update module "$name".')
|
||||
verbose_println('Error command: $vcs_cmd')
|
||||
verbose_println('Error details:\n$err')
|
||||
continue
|
||||
}
|
||||
if vcs_res.exit_code != 0 {
|
||||
errors++
|
||||
println('Failed updating module "$name".')
|
||||
verbose_println('Failed command: $vcs_cmd')
|
||||
verbose_println('Failed details:\n$vcs_res.output')
|
||||
continue
|
||||
} else {
|
||||
verbose_println(' $vcs_res.output.trim_space()')
|
||||
}
|
||||
resolve_dependencies(name, final_module_path, module_names)
|
||||
}
|
||||
if errors > 0 {
|
||||
exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
fn get_outdated() ?[]string {
|
||||
module_names := get_installed_modules()
|
||||
mut outdated := []string{}
|
||||
for name in module_names {
|
||||
final_module_path := valid_final_path_of_existing_module(name) or {
|
||||
continue
|
||||
}
|
||||
os.chdir(final_module_path)
|
||||
vcs := vcs_used_in_dir(final_module_path) or {
|
||||
continue
|
||||
}
|
||||
vcs_cmd_steps := supported_vcs_outdated_steps[vcs[0]]
|
||||
mut outputs := []string{}
|
||||
for step in vcs_cmd_steps {
|
||||
res := os.exec(step) or {
|
||||
verbose_println('Error command: $step')
|
||||
verbose_println('Error details:\n$err')
|
||||
return error('Error while checking latest commits for "$name".')
|
||||
}
|
||||
if vcs[0] == 'hg' {
|
||||
if res.exit_code == 1 {
|
||||
outdated << name
|
||||
}
|
||||
} else {
|
||||
outputs << res.output
|
||||
}
|
||||
}
|
||||
if vcs[0] == 'git' && outputs[1] != outputs[2] {
|
||||
outdated << name
|
||||
}
|
||||
}
|
||||
return outdated
|
||||
}
|
||||
|
||||
fn vpm_upgrade() {
|
||||
outdated := get_outdated() or {
|
||||
exit(1)
|
||||
}
|
||||
if outdated.len > 0 {
|
||||
vpm_update(outdated)
|
||||
} else {
|
||||
println('Modules are up to date.')
|
||||
}
|
||||
}
|
||||
|
||||
fn vpm_outdated() {
|
||||
outdated := get_outdated() or {
|
||||
exit(1)
|
||||
}
|
||||
if outdated.len > 0 {
|
||||
println('Outdated modules:')
|
||||
for m in outdated {
|
||||
println(' $m')
|
||||
}
|
||||
} else {
|
||||
println('Modules are up to date.')
|
||||
}
|
||||
}
|
||||
|
||||
fn vpm_list() {
|
||||
module_names := get_installed_modules()
|
||||
if module_names.len == 0 {
|
||||
println('You have no modules installed.')
|
||||
exit(0)
|
||||
}
|
||||
println('Installed modules:')
|
||||
for mod in module_names {
|
||||
println(' $mod')
|
||||
}
|
||||
}
|
||||
|
||||
fn vpm_remove(module_names []string) {
|
||||
if settings.is_help {
|
||||
vhelp.show_topic('remove')
|
||||
exit(0)
|
||||
}
|
||||
if module_names.len == 0 {
|
||||
println(' v update requires *at least one* module name')
|
||||
exit(2)
|
||||
}
|
||||
for name in module_names {
|
||||
final_module_path := valid_final_path_of_existing_module(name) or {
|
||||
continue
|
||||
}
|
||||
println('Removing module "$name"...')
|
||||
verbose_println('removing folder $final_module_path')
|
||||
os.rmdir_all(final_module_path)
|
||||
// delete author directory if it is empty
|
||||
author := name.split('.')[0]
|
||||
author_dir := os.real_path(os.join_path(settings.vmodules_path, author))
|
||||
if os.is_dir_empty(author_dir) {
|
||||
verbose_println('removing author folder $author_dir')
|
||||
os.rmdir(author_dir)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn valid_final_path_of_existing_module(name string) ?string {
|
||||
mod_name_as_path := name.replace('.', os.path_separator).replace('-', '_').to_lower()
|
||||
name_of_vmodules_folder := os.join_path(settings.vmodules_path, mod_name_as_path)
|
||||
final_module_path := os.real_path(name_of_vmodules_folder)
|
||||
if !os.exists(final_module_path) {
|
||||
println('No module with name "$name" exists at $name_of_vmodules_folder')
|
||||
return none
|
||||
}
|
||||
if !os.is_dir(final_module_path) {
|
||||
println('Skipping "$name_of_vmodules_folder", since it is not a folder.')
|
||||
return none
|
||||
}
|
||||
vcs_used_in_dir(final_module_path) or {
|
||||
println('Skipping "$name_of_vmodules_folder", since it does not use a supported vcs.')
|
||||
return none
|
||||
}
|
||||
return final_module_path
|
||||
}
|
||||
|
||||
fn ensure_vmodules_dir_exist() {
|
||||
if !os.is_dir(settings.vmodules_path) {
|
||||
println('Creating $settings.vmodules_path/ ...')
|
||||
os.mkdir(settings.vmodules_path) or {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn vpm_help() {
|
||||
vhelp.show_topic('vpm')
|
||||
}
|
||||
|
||||
fn vcs_used_in_dir(dir string) ?[]string {
|
||||
mut vcs := []string{}
|
||||
for repo_subfolder in supported_vcs_folders {
|
||||
checked_folder := os.real_path(os.join_path(dir, repo_subfolder))
|
||||
if os.is_dir(checked_folder) {
|
||||
vcs << repo_subfolder.replace('.', '')
|
||||
}
|
||||
}
|
||||
if vcs.len == 0 {
|
||||
return none
|
||||
}
|
||||
return vcs
|
||||
}
|
||||
|
||||
fn get_installed_modules() []string {
|
||||
dirs := os.ls(settings.vmodules_path) or {
|
||||
return []
|
||||
}
|
||||
mut modules := []string{}
|
||||
for dir in dirs {
|
||||
adir := os.join_path(settings.vmodules_path, dir)
|
||||
if dir in excluded_dirs || !os.is_dir(adir) {
|
||||
continue
|
||||
}
|
||||
if os.exists(os.join_path(adir, 'v.mod')) && os.exists(os.join_path(adir, '.git', 'config')) {
|
||||
// an official vlang module with a short module name, like `vsl`, `ui` or `markdown`
|
||||
modules << dir
|
||||
continue
|
||||
}
|
||||
author := dir
|
||||
mods := os.ls(adir) or {
|
||||
continue
|
||||
}
|
||||
for m in mods {
|
||||
vcs_used_in_dir(os.join_path(adir, m)) or {
|
||||
continue
|
||||
}
|
||||
modules << '${author}.$m'
|
||||
}
|
||||
}
|
||||
return modules
|
||||
}
|
||||
|
||||
fn get_all_modules() []string {
|
||||
url := get_working_server_url()
|
||||
r := http.get(url) or {
|
||||
panic(err)
|
||||
}
|
||||
if r.status_code != 200 {
|
||||
println('Failed to search vpm.vlang.io. Status code: $r.status_code')
|
||||
exit(1)
|
||||
}
|
||||
s := r.text
|
||||
mut read_len := 0
|
||||
mut modules := []string{}
|
||||
for read_len < s.len {
|
||||
mut start_token := '<a href="/mod'
|
||||
end_token := '</a>'
|
||||
// get the start index of the module entry
|
||||
mut start_index := s.index_after(start_token, read_len)
|
||||
if start_index == -1 {
|
||||
break
|
||||
}
|
||||
// get the index of the end of anchor (a) opening tag
|
||||
// we use the previous start_index to make sure we are getting a module and not just a random 'a' tag
|
||||
start_token = '">'
|
||||
start_index = s.index_after(start_token, start_index) + start_token.len
|
||||
// get the index of the end of module entry
|
||||
end_index := s.index_after(end_token, start_index)
|
||||
if end_index == -1 {
|
||||
break
|
||||
}
|
||||
modules << s[start_index..end_index]
|
||||
read_len = end_index
|
||||
if read_len >= s.len {
|
||||
break
|
||||
}
|
||||
}
|
||||
return modules
|
||||
}
|
||||
|
||||
fn resolve_dependencies(name string, module_path string, module_names []string) {
|
||||
vmod_path := os.join_path(module_path, 'v.mod')
|
||||
if !os.exists(vmod_path) {
|
||||
return
|
||||
}
|
||||
data := os.read_file(vmod_path) or {
|
||||
return
|
||||
}
|
||||
vmod := parse_vmod(data)
|
||||
mut deps := []string{}
|
||||
// filter out dependencies that were already specified by the user
|
||||
for d in vmod.deps {
|
||||
if d !in module_names {
|
||||
deps << d
|
||||
}
|
||||
}
|
||||
if deps.len > 0 {
|
||||
println('Resolving $deps.len dependencies for module "$name"...')
|
||||
verbose_println('Found dependencies: $deps')
|
||||
vpm_install(deps)
|
||||
}
|
||||
}
|
||||
|
||||
fn parse_vmod(data string) Vmod {
|
||||
keys := ['name', 'version', 'deps']
|
||||
mut m := {
|
||||
'name': ''
|
||||
'version': ''
|
||||
'deps': ''
|
||||
}
|
||||
for key in keys {
|
||||
mut key_index := data.index('$key:') or {
|
||||
continue
|
||||
}
|
||||
key_index += key.len + 1
|
||||
m[key] = data[key_index..data.index_after('\n', key_index)].trim_space().replace("'",
|
||||
'').replace('[', '').replace(']', '')
|
||||
}
|
||||
mut vmod := Vmod{}
|
||||
vmod.name = m['name']
|
||||
vmod.version = m['version']
|
||||
if m['deps'].len > 0 {
|
||||
vmod.deps = m['deps'].split(',')
|
||||
}
|
||||
return vmod
|
||||
}
|
||||
|
||||
fn get_working_server_url() string {
|
||||
server_urls := if settings.server_urls.len > 0 { settings.server_urls } else { default_vpm_server_urls }
|
||||
for url in server_urls {
|
||||
verbose_println('Trying server url: $url')
|
||||
http.head(url) or {
|
||||
verbose_println(' $url failed.')
|
||||
continue
|
||||
}
|
||||
return url
|
||||
}
|
||||
panic('No responding vpm server found. Please check your network connectivity and try again later.')
|
||||
}
|
||||
|
||||
// settings context:
|
||||
struct VpmSettings {
|
||||
mut:
|
||||
is_help bool
|
||||
is_verbose bool
|
||||
server_urls []string
|
||||
vmodules_path string
|
||||
}
|
||||
|
||||
const (
|
||||
settings = &VpmSettings{}
|
||||
)
|
||||
|
||||
fn init_settings() {
|
||||
mut s := &VpmSettings(0)
|
||||
unsafe {
|
||||
s = settings
|
||||
}
|
||||
s.is_help = '-h' in os.args || '--help' in os.args || 'help' in os.args
|
||||
s.is_verbose = '-v' in os.args
|
||||
s.server_urls = cmdline.options(os.args, '-server-url')
|
||||
s.vmodules_path = os.vmodules_dir()
|
||||
}
|
||||
|
||||
fn verbose_println(s string) {
|
||||
if settings.is_verbose {
|
||||
println(s)
|
||||
}
|
||||
}
|
||||
|
||||
fn get_module_meta_info(name string) ?Mod {
|
||||
mut errors := []string{}
|
||||
for server_url in default_vpm_server_urls {
|
||||
modurl := server_url + '/jsmod/$name'
|
||||
verbose_println('Retrieving module metadata from: $modurl ...')
|
||||
r := http.get(modurl) or {
|
||||
errors << 'Http server did not respond to our request for ${modurl}.'
|
||||
errors << 'Error details: $err'
|
||||
continue
|
||||
}
|
||||
if r.status_code == 404 || r.text.contains('404') {
|
||||
errors <<
|
||||
'Skipping module "$name", since $server_url reported that "$name" does not exist.'
|
||||
continue
|
||||
}
|
||||
if r.status_code != 200 {
|
||||
errors <<
|
||||
'Skipping module "$name", since $server_url responded with $r.status_code http status code. Please try again later.'
|
||||
continue
|
||||
}
|
||||
s := r.text
|
||||
if s.len > 0 && s[0] != `{` {
|
||||
errors << 'Invalid json data'
|
||||
errors << s.trim_space().limit(100) + '...'
|
||||
continue
|
||||
}
|
||||
mod := json.decode(Mod, s) or {
|
||||
errors << 'Skipping module "$name", since its information is not in json format.'
|
||||
continue
|
||||
}
|
||||
if '' == mod.url || '' == mod.name {
|
||||
errors << 'Skipping module "$name", since it is missing name or url information.'
|
||||
continue
|
||||
}
|
||||
return mod
|
||||
}
|
||||
return error(errors.join_lines())
|
||||
}
|
||||
362
cmd/tools/vrepl.v
Normal file
362
cmd/tools/vrepl.v
Normal file
@@ -0,0 +1,362 @@
|
||||
// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved.
|
||||
// Use of this source code is governed by an MIT license
|
||||
// that can be found in the LICENSE file.
|
||||
module main
|
||||
|
||||
import os
|
||||
import term
|
||||
import readline
|
||||
import os.cmdline
|
||||
import v.util
|
||||
|
||||
struct Repl {
|
||||
mut:
|
||||
indent int // indentation level
|
||||
in_func bool // are we inside a new custom user function
|
||||
line string // the current line entered by the user
|
||||
//
|
||||
modules []string // all the import modules
|
||||
includes []string // all the #include statements
|
||||
functions []string // all the user function declarations
|
||||
functions_name []string // all the user function names
|
||||
lines []string // all the other lines/statements
|
||||
temp_lines []string // all the temporary expressions/printlns
|
||||
}
|
||||
|
||||
const (
|
||||
is_stdin_a_pipe = (is_atty(0) == 0)
|
||||
)
|
||||
|
||||
fn new_repl() &Repl {
|
||||
return &Repl{
|
||||
modules: ['os', 'time', 'math']
|
||||
}
|
||||
}
|
||||
|
||||
fn (mut r Repl) checks() bool {
|
||||
mut in_string := false
|
||||
was_indent := r.indent > 0
|
||||
for i := 0; i < r.line.len; i++ {
|
||||
if r.line[i] == `\'` && (i == 0 || r.line[i - 1] != `\\`) {
|
||||
in_string = !in_string
|
||||
}
|
||||
if r.line[i] == `{` && !in_string {
|
||||
r.line = r.line[..i + 1] + '\n' + r.line[i + 1..]
|
||||
i++
|
||||
r.indent++
|
||||
}
|
||||
if r.line[i] == `}` && !in_string {
|
||||
r.line = r.line[..i] + '\n' + r.line[i..]
|
||||
i++
|
||||
r.indent--
|
||||
if r.indent == 0 {
|
||||
r.in_func = false
|
||||
}
|
||||
}
|
||||
if i + 2 < r.line.len && r.indent == 0 && r.line[i + 1] == `f` && r.line[i + 2] == `n` {
|
||||
r.in_func = true
|
||||
}
|
||||
}
|
||||
return r.in_func || (was_indent && r.indent <= 0) || r.indent > 0
|
||||
}
|
||||
|
||||
fn (r &Repl) function_call(line string) bool {
|
||||
for function in r.functions_name {
|
||||
is_function_definition := line.replace(' ', '').starts_with('$function:=')
|
||||
if line.starts_with(function) && !is_function_definition {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
fn (r &Repl) current_source_code(should_add_temp_lines bool) string {
|
||||
mut all_lines := []string{}
|
||||
for mod in r.modules {
|
||||
all_lines << 'import $mod\n'
|
||||
}
|
||||
all_lines << r.includes
|
||||
all_lines << r.functions
|
||||
all_lines << r.lines
|
||||
if should_add_temp_lines {
|
||||
all_lines << r.temp_lines
|
||||
}
|
||||
return all_lines.join('\n')
|
||||
}
|
||||
|
||||
fn repl_help() {
|
||||
println(util.full_v_version(false))
|
||||
println('
|
||||
|help Displays this information.
|
||||
|list Show the program so far.
|
||||
|reset Clears the accumulated program, so you can start a fresh.
|
||||
|Ctrl-C, Ctrl-D, exit Exits the REPL.
|
||||
|clear Clears the screen.
|
||||
'.strip_margin())
|
||||
}
|
||||
|
||||
fn run_repl(workdir string, vrepl_prefix string) {
|
||||
if !is_stdin_a_pipe {
|
||||
println(util.full_v_version(false))
|
||||
println('Use Ctrl-C or `exit` to exit, or `help` to see other available commands')
|
||||
}
|
||||
file := os.join_path(workdir, '.${vrepl_prefix}vrepl.v')
|
||||
temp_file := os.join_path(workdir, '.${vrepl_prefix}vrepl_temp.v')
|
||||
mut prompt := '>>> '
|
||||
defer {
|
||||
if !is_stdin_a_pipe {
|
||||
println('')
|
||||
}
|
||||
os.rm(file)
|
||||
os.rm(temp_file)
|
||||
$if windows {
|
||||
os.rm(file[..file.len - 2] + '.exe')
|
||||
os.rm(temp_file[..temp_file.len - 2] + '.exe')
|
||||
$if msvc {
|
||||
os.rm(file[..file.len - 2] + '.ilk')
|
||||
os.rm(file[..file.len - 2] + '.pdb')
|
||||
os.rm(temp_file[..temp_file.len - 2] + '.ilk')
|
||||
os.rm(temp_file[..temp_file.len - 2] + '.pdb')
|
||||
}
|
||||
} $else {
|
||||
os.rm(file[..file.len - 2])
|
||||
os.rm(temp_file[..temp_file.len - 2])
|
||||
}
|
||||
}
|
||||
mut r := new_repl()
|
||||
vexe := os.getenv('VEXE')
|
||||
for {
|
||||
if r.indent == 0 {
|
||||
prompt = '>>> '
|
||||
} else {
|
||||
prompt = '... '
|
||||
}
|
||||
oline := r.get_one_line(prompt) or {
|
||||
break
|
||||
}
|
||||
line := oline.trim_space()
|
||||
if line == '' && oline.ends_with('\n') {
|
||||
continue
|
||||
}
|
||||
if line.len <= -1 || line == '' || line == 'exit' {
|
||||
break
|
||||
}
|
||||
r.line = line
|
||||
if r.line == '\n' {
|
||||
continue
|
||||
}
|
||||
if r.line == 'clear' {
|
||||
term.erase_display('2')
|
||||
continue
|
||||
}
|
||||
if r.line == 'help' {
|
||||
repl_help()
|
||||
continue
|
||||
}
|
||||
if r.line.contains(':=') && r.line.contains('fn(') {
|
||||
r.in_func = true
|
||||
r.functions_name << r.line.all_before(':= fn(').trim_space()
|
||||
}
|
||||
if r.line.starts_with('fn') {
|
||||
r.in_func = true
|
||||
r.functions_name << r.line.all_after('fn').all_before('(').trim_space()
|
||||
}
|
||||
was_func := r.in_func
|
||||
if r.checks() {
|
||||
for rline in r.line.split('\n') {
|
||||
if r.in_func || was_func {
|
||||
r.functions << rline
|
||||
} else {
|
||||
r.temp_lines << rline
|
||||
}
|
||||
}
|
||||
if r.indent > 0 {
|
||||
continue
|
||||
}
|
||||
r.line = ''
|
||||
}
|
||||
if r.line == 'debug_repl' {
|
||||
eprintln('repl: $r')
|
||||
continue
|
||||
}
|
||||
if r.line == 'reset' {
|
||||
r = new_repl()
|
||||
continue
|
||||
}
|
||||
if r.line == 'list' {
|
||||
source_code := r.current_source_code(true)
|
||||
println('//////////////////////////////////////////////////////////////////////////////////////')
|
||||
println(source_code)
|
||||
println('//////////////////////////////////////////////////////////////////////////////////////')
|
||||
continue
|
||||
}
|
||||
// Save the source only if the user is printing something,
|
||||
// but don't add this print call to the `lines` array,
|
||||
// so that it doesn't get called during the next print.
|
||||
if r.line.starts_with('=') {
|
||||
r.line = 'println(' + r.line[1..] + ')'
|
||||
}
|
||||
if r.line.starts_with('print') {
|
||||
source_code := r.current_source_code(false) + '\n$r.line\n'
|
||||
os.write_file(file, source_code)
|
||||
s := os.exec('"$vexe" -repl run "$file"') or {
|
||||
rerror(err)
|
||||
return
|
||||
}
|
||||
print_output(s)
|
||||
} else {
|
||||
mut temp_line := r.line
|
||||
mut temp_flag := false
|
||||
func_call := r.function_call(r.line)
|
||||
filter_line := r.line.replace(r.line.find_between("\'", "\'"), '').replace(r.line.find_between('"',
|
||||
'"'), '')
|
||||
possible_statement_patterns := [
|
||||
'=',
|
||||
'++',
|
||||
'--',
|
||||
'<<',
|
||||
'//',
|
||||
'/*',
|
||||
'fn ',
|
||||
'pub ',
|
||||
'mut ',
|
||||
'enum ',
|
||||
'const ',
|
||||
'struct ',
|
||||
'interface ',
|
||||
'import ',
|
||||
'#include ',
|
||||
':=',
|
||||
'for ',
|
||||
'or ',
|
||||
'insert',
|
||||
'delete',
|
||||
'prepend',
|
||||
'sort',
|
||||
'clear',
|
||||
'trim',
|
||||
]
|
||||
mut is_statement := false
|
||||
for pattern in possible_statement_patterns {
|
||||
if filter_line.contains(pattern) {
|
||||
is_statement = true
|
||||
break
|
||||
}
|
||||
}
|
||||
// NB: starting a line with 2 spaces escapes the println heuristic
|
||||
if oline.starts_with(' ') {
|
||||
is_statement = true
|
||||
}
|
||||
if !is_statement && !func_call && r.line != '' {
|
||||
temp_line = 'println($r.line)'
|
||||
temp_flag = true
|
||||
}
|
||||
mut temp_source_code := ''
|
||||
if temp_line.starts_with('import ') {
|
||||
mod := r.line.fields()[1]
|
||||
if mod !in r.modules {
|
||||
temp_source_code = '$temp_line\n' + r.current_source_code(false)
|
||||
}
|
||||
} else if temp_line.starts_with('#include ') {
|
||||
temp_source_code = '$temp_line\n' + r.current_source_code(false)
|
||||
} else {
|
||||
for i, l in r.lines {
|
||||
if (l.starts_with('for ') || l.starts_with('if ')) && l.contains('println') {
|
||||
r.lines.delete(i)
|
||||
break
|
||||
}
|
||||
}
|
||||
temp_source_code = r.current_source_code(true) + '\n$temp_line\n'
|
||||
}
|
||||
os.write_file(temp_file, temp_source_code)
|
||||
s := os.exec('"$vexe" -repl run "$temp_file"') or {
|
||||
rerror(err)
|
||||
return
|
||||
}
|
||||
if !func_call && s.exit_code == 0 && !temp_flag {
|
||||
for r.temp_lines.len > 0 {
|
||||
if !r.temp_lines[0].starts_with('print') {
|
||||
r.lines << r.temp_lines[0]
|
||||
}
|
||||
r.temp_lines.delete(0)
|
||||
}
|
||||
if r.line.starts_with('import ') {
|
||||
mod := r.line.fields()[1]
|
||||
if mod !in r.modules {
|
||||
r.modules << mod
|
||||
}
|
||||
} else if r.line.starts_with('#include ') {
|
||||
r.includes << r.line
|
||||
} else {
|
||||
r.lines << r.line
|
||||
}
|
||||
} else {
|
||||
for r.temp_lines.len > 0 {
|
||||
r.temp_lines.delete(0)
|
||||
}
|
||||
}
|
||||
print_output(s)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn print_output(s os.Result) {
|
||||
lines := s.output.trim_right('\n\r').split('\n')
|
||||
for line in lines {
|
||||
if line.contains('.vrepl_temp.v:') {
|
||||
// Hide the temporary file name
|
||||
sline := line.all_after('.vrepl_temp.v:')
|
||||
idx := sline.index(' ') or {
|
||||
println(sline)
|
||||
return
|
||||
}
|
||||
println(sline[idx + 1..])
|
||||
} else if line.contains('.vrepl.v:') {
|
||||
// Ensure that .vrepl.v: is at the start, ignore the path
|
||||
// This is needed to have stable .repl tests.
|
||||
idx := line.index('.vrepl.v:') or {
|
||||
return
|
||||
}
|
||||
println(line[idx..])
|
||||
} else {
|
||||
println(line)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// Support for the parameters replfolder and replprefix is needed
|
||||
// so that the repl can be launched in parallel by several different
|
||||
// threads by the REPL test runner.
|
||||
args := cmdline.options_after(os.args, ['repl'])
|
||||
replfolder := os.real_path(cmdline.option(args, '-replfolder', '.'))
|
||||
replprefix := cmdline.option(args, '-replprefix', 'noprefix.')
|
||||
os.chdir(replfolder)
|
||||
if !os.exists(os.getenv('VEXE')) {
|
||||
println('Usage:')
|
||||
println(' VEXE=vexepath vrepl\n')
|
||||
println(' ... where vexepath is the full path to the v executable file')
|
||||
return
|
||||
}
|
||||
run_repl(replfolder, replprefix)
|
||||
}
|
||||
|
||||
fn rerror(s string) {
|
||||
println('V repl error: $s')
|
||||
os.flush()
|
||||
}
|
||||
|
||||
fn (mut r Repl) get_one_line(prompt string) ?string {
|
||||
mut readline := readline.Readline{}
|
||||
if is_stdin_a_pipe {
|
||||
iline := os.get_raw_line()
|
||||
if iline.len == 0 {
|
||||
return none
|
||||
}
|
||||
return iline
|
||||
}
|
||||
rline := readline.read_line(prompt) or {
|
||||
return none
|
||||
}
|
||||
return rline
|
||||
}
|
||||
51
cmd/tools/vself.v
Normal file
51
cmd/tools/vself.v
Normal file
@@ -0,0 +1,51 @@
|
||||
module main
|
||||
|
||||
import os
|
||||
import os.cmdline
|
||||
import v.pref
|
||||
|
||||
fn main() {
|
||||
vexe := pref.vexe_path()
|
||||
vroot := os.dir(vexe)
|
||||
os.chdir(vroot)
|
||||
os.setenv('VCOLORS', 'always', true)
|
||||
self_idx := os.args.index('self')
|
||||
args := os.args[1..self_idx]
|
||||
jargs := args.join(' ')
|
||||
obinary := cmdline.option(args, '-o', '')
|
||||
sargs := if obinary != '' { jargs } else { '$jargs -o v2 ' }
|
||||
cmd := '$vexe $sargs cmd/v'
|
||||
options := if args.len > 0 { '($sargs)' } else { '' }
|
||||
println('V self compiling ${options}...')
|
||||
compile(vroot, cmd)
|
||||
if obinary != '' {
|
||||
// When -o was given, there is no need to backup/rename the original.
|
||||
// The user just wants an independent copy of v, and so we are done.
|
||||
return
|
||||
}
|
||||
backup_old_version_and_rename_newer()
|
||||
}
|
||||
|
||||
fn compile(vroot string, cmd string) {
|
||||
result := os.exec(cmd) or {
|
||||
panic(err)
|
||||
}
|
||||
if result.exit_code != 0 {
|
||||
eprintln('cannot compile to `$vroot`: \n$result.output')
|
||||
exit(1)
|
||||
}
|
||||
if result.output.len > 0 {
|
||||
println(result.output.trim_space())
|
||||
}
|
||||
}
|
||||
|
||||
fn backup_old_version_and_rename_newer() {
|
||||
v_file := if os.user_os() == 'windows' { 'v.exe' } else { 'v' }
|
||||
v2_file := if os.user_os() == 'windows' { 'v2.exe' } else { 'v2' }
|
||||
bak_file := if os.user_os() == 'windows' { 'v_old.exe' } else { 'v_old' }
|
||||
if os.exists(bak_file) {
|
||||
os.rm(bak_file)
|
||||
}
|
||||
os.mv(v_file, bak_file)
|
||||
os.mv(v2_file, v_file)
|
||||
}
|
||||
23
cmd/tools/vsetup-freetype.v
Normal file
23
cmd/tools/vsetup-freetype.v
Normal file
@@ -0,0 +1,23 @@
|
||||
module main
|
||||
|
||||
import os
|
||||
import v.pref
|
||||
|
||||
fn main() {
|
||||
$if windows {
|
||||
println('Setup freetype...')
|
||||
vroot := os.dir(pref.vexe_path())
|
||||
os.chdir(vroot)
|
||||
if os.is_dir('./thirdparty/freetype') {
|
||||
println('Thirdparty "freetype" is already installed.')
|
||||
} else {
|
||||
s := os.exec('git clone --depth=1 https://github.com/ubawurinna/freetype-windows-binaries ./thirdparty/freetype/') or {
|
||||
panic(err)
|
||||
}
|
||||
println(s.output)
|
||||
println('Thirdparty "freetype" installed successfully.')
|
||||
}
|
||||
} $else {
|
||||
println('It is only for Windows to setup thirdparty "freetype".')
|
||||
}
|
||||
}
|
||||
181
cmd/tools/vsymlink.v
Normal file
181
cmd/tools/vsymlink.v
Normal file
@@ -0,0 +1,181 @@
|
||||
import os
|
||||
import v.pref
|
||||
|
||||
$if windows {
|
||||
$if tinyc {
|
||||
#flag -lAdvapi32
|
||||
#flag -lUser32
|
||||
}
|
||||
}
|
||||
fn main() {
|
||||
vexe := os.real_path(pref.vexe_path())
|
||||
$if windows {
|
||||
setup_symlink_windows(vexe)
|
||||
} $else {
|
||||
setup_symlink(vexe)
|
||||
}
|
||||
}
|
||||
|
||||
fn setup_symlink(vexe string) {
|
||||
link_dir := '/usr/local/bin'
|
||||
if !os.exists(link_dir) {
|
||||
os.mkdir_all(link_dir)
|
||||
}
|
||||
mut link_path := link_dir + '/v'
|
||||
mut ret := os.exec('ln -sf $vexe $link_path') or {
|
||||
panic(err)
|
||||
}
|
||||
if ret.exit_code == 0 {
|
||||
println('Symlink "$link_path" has been created')
|
||||
} else if os.system("uname -o | grep -q \'[A/a]ndroid\'") == 0 {
|
||||
println('Failed to create symlink "$link_path". Trying again with Termux path for Android.')
|
||||
link_path = '/data/data/com.termux/files/usr/bin/v'
|
||||
ret = os.exec('ln -sf $vexe $link_path') or {
|
||||
panic(err)
|
||||
}
|
||||
if ret.exit_code == 0 {
|
||||
println('Symlink "$link_path" has been created')
|
||||
} else {
|
||||
eprintln('Failed to create symlink "$link_path". Try again with sudo.')
|
||||
}
|
||||
} else {
|
||||
eprintln('Failed to create symlink "$link_path". Try again with sudo.')
|
||||
}
|
||||
}
|
||||
|
||||
fn setup_symlink_windows(vexe string) {
|
||||
$if windows {
|
||||
// Create a symlink in a new local folder (.\.bin\.v.exe)
|
||||
// Puts `v` in %PATH% without polluting it with anything else (like make.bat).
|
||||
// This will make `v` available on cmd.exe, PowerShell, and MinGW(MSYS)/WSL/Cygwin
|
||||
vdir := os.real_path(os.dir(vexe))
|
||||
vsymlinkdir := os.join_path(vdir, '.bin')
|
||||
mut vsymlink := os.join_path(vsymlinkdir, 'v.exe')
|
||||
if !os.exists(vsymlinkdir) {
|
||||
os.mkdir_all(vsymlinkdir) // will panic if fails
|
||||
} else {
|
||||
os.rm(vsymlink)
|
||||
}
|
||||
// First, try to create a native symlink at .\.bin\v.exe
|
||||
os.symlink(vsymlink, vexe) or {
|
||||
// typically only fails if you're on a network drive (VirtualBox)
|
||||
// do batch file creation instead
|
||||
eprintln('Could not create a native symlink: $err')
|
||||
eprintln('Creating a batch file instead...')
|
||||
vsymlink = os.join_path(vsymlinkdir, 'v.bat')
|
||||
if os.exists(vsymlink) {
|
||||
os.rm(vsymlink)
|
||||
}
|
||||
os.write_file(vsymlink, '@echo off\n$vexe %*')
|
||||
eprintln('$vsymlink file written.')
|
||||
}
|
||||
if !os.exists(vsymlink) {
|
||||
warn_and_exit('Could not create $vsymlink')
|
||||
}
|
||||
println('Symlink $vsymlink to $vexe created.')
|
||||
println('Checking system %PATH%...')
|
||||
reg_sys_env_handle := get_reg_sys_env_handle() or {
|
||||
warn_and_exit(err)
|
||||
return
|
||||
}
|
||||
// TODO: Fix defers inside ifs
|
||||
// defer {
|
||||
// C.RegCloseKey(reg_sys_env_handle)
|
||||
// }
|
||||
// if the above succeeded, and we cannot get the value, it may simply be empty
|
||||
sys_env_path := get_reg_value(reg_sys_env_handle, 'Path') or {
|
||||
''
|
||||
}
|
||||
current_sys_paths := sys_env_path.split(os.path_delimiter).map(it.trim('/$os.path_separator'))
|
||||
mut new_paths := [vsymlinkdir]
|
||||
for p in current_sys_paths {
|
||||
if p == '' {
|
||||
continue
|
||||
}
|
||||
if p !in new_paths {
|
||||
new_paths << p
|
||||
}
|
||||
}
|
||||
new_sys_env_path := new_paths.join(';')
|
||||
if new_sys_env_path == sys_env_path {
|
||||
println('System %PATH% was already configured.')
|
||||
} else {
|
||||
println('System %PATH% was not configured.')
|
||||
println('Adding symlink directory to system %PATH%...')
|
||||
set_reg_value(reg_sys_env_handle, 'Path', new_sys_env_path) or {
|
||||
warn_and_exit(err)
|
||||
C.RegCloseKey(reg_sys_env_handle)
|
||||
return
|
||||
}
|
||||
println('done.')
|
||||
}
|
||||
println('Notifying running processes to update their Environment...')
|
||||
send_setting_change_msg('Environment') or {
|
||||
eprintln(err)
|
||||
warn_and_exit('You might need to run this again to have the `v` command in your %PATH%')
|
||||
C.RegCloseKey(reg_sys_env_handle)
|
||||
return
|
||||
}
|
||||
C.RegCloseKey(reg_sys_env_handle)
|
||||
println('')
|
||||
println('Note: restart your shell/IDE to load the new %PATH%.')
|
||||
println('After restarting your shell/IDE, give `v version` a try in another dir!')
|
||||
}
|
||||
}
|
||||
|
||||
fn warn_and_exit(err string) {
|
||||
eprintln(err)
|
||||
exit(1)
|
||||
}
|
||||
|
||||
// get the system environment registry handle
|
||||
fn get_reg_sys_env_handle() ?voidptr {
|
||||
$if windows { // wrap for cross-compile compat
|
||||
// open the registry key
|
||||
reg_key_path := 'Environment'
|
||||
reg_env_key := voidptr(0) // or HKEY (HANDLE)
|
||||
if C.RegOpenKeyEx(os.hkey_current_user, reg_key_path.to_wide(), 0, 1 | 2, ®_env_key) != 0 {
|
||||
return error('Could not open "$reg_key_path" in the registry')
|
||||
}
|
||||
return reg_env_key
|
||||
}
|
||||
return error('not on windows')
|
||||
}
|
||||
|
||||
// get a value from a given $key
|
||||
fn get_reg_value(reg_env_key voidptr, key string) ?string {
|
||||
$if windows {
|
||||
// query the value (shortcut the sizing step)
|
||||
reg_value_size := 4095 // this is the max length (not for the registry, but for the system %PATH%)
|
||||
mut reg_value := &u16(malloc(reg_value_size))
|
||||
if C.RegQueryValueEx(reg_env_key, key.to_wide(), 0, 0, reg_value, ®_value_size) != 0 {
|
||||
return error('Unable to get registry value for "$key", try rerunning as an Administrator')
|
||||
}
|
||||
return string_from_wide(reg_value)
|
||||
}
|
||||
return error('not on windows')
|
||||
}
|
||||
|
||||
// sets the value for the given $key to the given $value
|
||||
fn set_reg_value(reg_key voidptr, key string, value string) ?bool {
|
||||
$if windows {
|
||||
if C.RegSetValueEx(reg_key, key.to_wide(), 0, 1, value.to_wide(), 4095) != 0 {
|
||||
return error('Unable to set registry value for "$key", are you running as an Administrator?')
|
||||
}
|
||||
return true
|
||||
}
|
||||
return error('not on windows')
|
||||
}
|
||||
|
||||
// Broadcasts a message to all listening windows (explorer.exe in particular)
|
||||
// letting them know that the system environment has changed and should be reloaded
|
||||
fn send_setting_change_msg(message_data string) ?bool {
|
||||
$if windows {
|
||||
if C.SendMessageTimeout(os.hwnd_broadcast, os.wm_settingchange, 0, message_data.to_wide(), os.smto_abortifhung, 5000, 0) ==
|
||||
0 {
|
||||
return error('Could not broadcast WM_SETTINGCHANGE')
|
||||
}
|
||||
return true
|
||||
}
|
||||
return error('not on windows')
|
||||
}
|
||||
96
cmd/tools/vtest-cleancode.v
Normal file
96
cmd/tools/vtest-cleancode.v
Normal file
@@ -0,0 +1,96 @@
|
||||
module main
|
||||
|
||||
import os
|
||||
import testing
|
||||
import v.util
|
||||
|
||||
const (
|
||||
vet_known_failing_exceptions = [
|
||||
'nonexistent',
|
||||
]
|
||||
vet_folders = [
|
||||
'vlib/sqlite',
|
||||
'vlib/v',
|
||||
'cmd/v',
|
||||
'cmd/tools',
|
||||
]
|
||||
verify_known_failing_exceptions = [
|
||||
'nonexistant',
|
||||
]
|
||||
vfmt_verify_list = [
|
||||
'cmd/v/v.v',
|
||||
'vlib/builtin/array.v',
|
||||
'vlib/os/file.v',
|
||||
'vlib/math/bits/bits.v',
|
||||
'vlib/time/time.v',
|
||||
'vlib/term/colors.v',
|
||||
'vlib/term/term.v',
|
||||
'vlib/v/ast/',
|
||||
'vlib/v/builder/',
|
||||
'vlib/v/cflag/',
|
||||
'vlib/v/checker/',
|
||||
'vlib/v/depgraph/',
|
||||
'vlib/v/doc/',
|
||||
'vlib/v/errors/',
|
||||
'vlib/v/eval/',
|
||||
'vlib/v/fmt/',
|
||||
'vlib/v/gen/auto_str_methods.v',
|
||||
'vlib/v/gen/cgen.v',
|
||||
'vlib/v/gen/cgen_test.v',
|
||||
'vlib/v/gen/cmain.v',
|
||||
'vlib/v/gen/comptime.v',
|
||||
'vlib/v/gen/fn.v',
|
||||
'vlib/v/gen/json.v',
|
||||
'vlib/v/gen/live.v',
|
||||
'vlib/v/gen/profile.v',
|
||||
'vlib/v/gen/sql.v',
|
||||
'vlib/v/gen/str.v',
|
||||
'vlib/v/gen/x64/elf.v',
|
||||
'vlib/v/gen/x64/elf_obj.v',
|
||||
'vlib/v/gen/x64/gen.v',
|
||||
'vlib/v/parser/',
|
||||
'vlib/v/pref/',
|
||||
'vlib/v/scanner/',
|
||||
'vlib/v/table/',
|
||||
'vlib/v/util/',
|
||||
'vlib/v/vet/',
|
||||
'vlib/v/vmod/',
|
||||
'vlib/gg/gg.v',
|
||||
]
|
||||
)
|
||||
|
||||
fn main() {
|
||||
args := os.args
|
||||
args_string := args[1..].join(' ')
|
||||
pass_args := args_string.all_before('test-cleancode')
|
||||
v_test_vetting(pass_args)
|
||||
}
|
||||
|
||||
fn tsession(vargs string, tool_source string, tool_cmd string, tool_args string, flist []string, slist []string) testing.TestSession {
|
||||
testing.setup_new_vtmp_folder()
|
||||
util.prepare_tool_when_needed(tool_source)
|
||||
testing.eheader('Run `$tool_cmd` over most .v files')
|
||||
mut test_session := testing.new_test_session('$vargs $tool_args')
|
||||
test_session.files << flist
|
||||
test_session.skip_files << slist
|
||||
test_session.test()
|
||||
eprintln(test_session.benchmark.total_message('running `$tool_cmd` over most .v files'))
|
||||
return test_session
|
||||
}
|
||||
|
||||
fn v_test_vetting(vargs string) {
|
||||
vet_session := tsession(vargs, 'vvet.v', 'v vet', 'vet', vet_folders, vet_known_failing_exceptions)
|
||||
verify_session := tsession(vargs, 'vfmt.v', 'v fmt -verify', 'fmt -verify', vfmt_verify_list,
|
||||
verify_known_failing_exceptions)
|
||||
//
|
||||
if vet_session.benchmark.nfail > 0 || verify_session.benchmark.nfail > 0 {
|
||||
eprintln('\n')
|
||||
if vet_session.benchmark.nfail > 0 {
|
||||
eprintln('WARNING: `v vet` failed $vet_session.benchmark.nfail times.')
|
||||
}
|
||||
if verify_session.benchmark.nfail > 0 {
|
||||
eprintln('WARNING: `v fmt -verify` failed $verify_session.benchmark.nfail times.')
|
||||
}
|
||||
exit(1)
|
||||
}
|
||||
}
|
||||
71
cmd/tools/vtest-compiler.v
Normal file
71
cmd/tools/vtest-compiler.v
Normal file
@@ -0,0 +1,71 @@
|
||||
module main
|
||||
|
||||
import os
|
||||
import testing
|
||||
import benchmark
|
||||
import v.pref
|
||||
|
||||
fn main() {
|
||||
args := os.args
|
||||
args_string := args[1..].join(' ')
|
||||
v_test_compiler(args_string.all_before('test-compiler'))
|
||||
}
|
||||
|
||||
fn v_test_compiler(vargs string) {
|
||||
vexe := pref.vexe_path()
|
||||
parent_dir := os.dir(vexe)
|
||||
testing.vlib_should_be_present(parent_dir)
|
||||
// Changing the current directory is needed for some of the compiler tests,
|
||||
// vlib/v/tests/local_test.v and vlib/v/tests/repl/repl_test.v
|
||||
os.chdir(parent_dir)
|
||||
/*
|
||||
if !os.exists(parent_dir + '/v.v') {
|
||||
eprintln('v.v is missing, it must be next to the V executable')
|
||||
exit(1)
|
||||
}
|
||||
*/
|
||||
// Make sure v.c can be compiled without warnings
|
||||
$if macos {
|
||||
if os.exists('/cmd/v') {
|
||||
os.system('$vexe -o v.c cmd/v')
|
||||
if os.system('cc -Werror v.c') != 0 {
|
||||
eprintln('cc failed to build v.c without warnings')
|
||||
exit(1)
|
||||
}
|
||||
eprintln('v.c can be compiled without warnings. This is good :)')
|
||||
}
|
||||
}
|
||||
building_tools_failed := testing.v_build_failing(vargs, 'cmd/tools')
|
||||
eprintln('')
|
||||
testing.eheader('Testing all _test.v files...')
|
||||
mut compiler_test_session := testing.new_test_session(vargs)
|
||||
compiler_test_session.files << os.walk_ext(parent_dir, '_test.v')
|
||||
compiler_test_session.test()
|
||||
eprintln(compiler_test_session.benchmark.total_message('running V tests'))
|
||||
eprintln('')
|
||||
building_examples_failed := testing.v_build_failing(vargs, 'examples')
|
||||
eprintln('')
|
||||
building_live_failed := testing.v_build_failing(vargs + '-live', os.join_path('examples',
|
||||
'hot_reload'))
|
||||
eprintln('')
|
||||
//
|
||||
testing.setup_new_vtmp_folder()
|
||||
v_module_install_cmd := '$vexe install nedpals.args'
|
||||
eprintln('')
|
||||
testing.eheader('Installing a v module with: $v_module_install_cmd')
|
||||
mut vmark := benchmark.new_benchmark()
|
||||
ret := os.system(v_module_install_cmd)
|
||||
if ret != 0 {
|
||||
eprintln('failed to run v install')
|
||||
}
|
||||
desired_path := os.join_path(pref.default_module_path, 'nedpals', 'args')
|
||||
if !(os.exists(desired_path) && os.is_dir(desired_path)) {
|
||||
eprintln('v failed to install a test module')
|
||||
}
|
||||
vmark.stop()
|
||||
eprintln('Installing a v module took: ' + vmark.total_duration().str() + 'ms')
|
||||
//
|
||||
if building_tools_failed || compiler_test_session.failed || building_examples_failed || building_live_failed {
|
||||
exit(1)
|
||||
}
|
||||
}
|
||||
85
cmd/tools/vtest-fixed.v
Normal file
85
cmd/tools/vtest-fixed.v
Normal file
@@ -0,0 +1,85 @@
|
||||
module main
|
||||
|
||||
import os
|
||||
import testing
|
||||
import v.pref
|
||||
|
||||
const (
|
||||
skip_test_files = [
|
||||
'vlib/net/http/http_httpbin_test.v',
|
||||
]
|
||||
skip_on_musl = []string{}
|
||||
skip_on_ubuntu_musl = [
|
||||
// 'vlib/v/gen/js/jsgen_test.v',
|
||||
'vlib/net/http/cookie_test.v',
|
||||
'vlib/net/http/http_test.v',
|
||||
'vlib/net/http/status_test.v',
|
||||
'vlib/net/websocket/ws_test.v',
|
||||
'vlib/sqlite/sqlite_test.v',
|
||||
'vlib/orm/orm_test.v',
|
||||
'vlib/clipboard/clipboard_test.v',
|
||||
'vlib/vweb/tests/vweb_test.v',
|
||||
'vlib/x/websocket/websocket_test.v',
|
||||
]
|
||||
skip_on_linux = []string{}
|
||||
skip_on_non_linux = [
|
||||
'vlib/net/websocket/ws_test.v',
|
||||
]
|
||||
skip_on_windows = [
|
||||
'vlib/orm/orm_test.v',
|
||||
'vlib/net/websocket/ws_test.v',
|
||||
'vlib/x/websocket/websocket_test.v',
|
||||
'vlib/vweb/tests/vweb_test.v',
|
||||
]
|
||||
skip_on_non_windows = []string{}
|
||||
skip_on_macos = []string{}
|
||||
skip_on_non_macos = []string{}
|
||||
)
|
||||
|
||||
// NB: musl misses openssl, thus the http tests can not be done there
|
||||
// NB: http_httpbin_test.v: fails with 'cgen error: json: map_string_string is not struct'
|
||||
fn main() {
|
||||
vexe := pref.vexe_path()
|
||||
vroot := os.dir(vexe)
|
||||
os.chdir(vroot)
|
||||
args := os.args
|
||||
args_string := args[1..].join(' ')
|
||||
cmd_prefix := args_string.all_before('test-fixed')
|
||||
title := 'testing all fixed tests'
|
||||
all_test_files := os.walk_ext(os.join_path(vroot, 'vlib'), '_test.v')
|
||||
testing.eheader(title)
|
||||
mut tsession := testing.new_test_session(cmd_prefix)
|
||||
tsession.files << all_test_files
|
||||
tsession.skip_files << skip_test_files
|
||||
//
|
||||
if os.getenv('V_CI_MUSL').len > 0 {
|
||||
tsession.skip_files << skip_on_musl
|
||||
}
|
||||
if os.getenv('V_CI_UBUNTU_MUSL').len > 0 {
|
||||
tsession.skip_files << skip_on_ubuntu_musl
|
||||
}
|
||||
$if !linux {
|
||||
tsession.skip_files << skip_on_non_linux
|
||||
}
|
||||
$if linux {
|
||||
tsession.skip_files << skip_on_linux
|
||||
}
|
||||
$if windows {
|
||||
tsession.skip_files << skip_on_windows
|
||||
}
|
||||
$if !windows {
|
||||
tsession.skip_files << skip_on_non_windows
|
||||
}
|
||||
$if macos {
|
||||
tsession.skip_files << skip_on_macos
|
||||
}
|
||||
$if !macos {
|
||||
tsession.skip_files << skip_on_non_macos
|
||||
}
|
||||
tsession.test()
|
||||
eprintln(tsession.benchmark.total_message(title))
|
||||
if tsession.benchmark.nfail > 0 {
|
||||
eprintln('\nWARNING: failed $tsession.benchmark.nfail times.\n')
|
||||
exit(1)
|
||||
}
|
||||
}
|
||||
59
cmd/tools/vtest-fmt.v
Normal file
59
cmd/tools/vtest-fmt.v
Normal file
@@ -0,0 +1,59 @@
|
||||
module main
|
||||
|
||||
import os
|
||||
import testing
|
||||
import v.util
|
||||
|
||||
const (
|
||||
known_failing_exceptions = [
|
||||
'vlib/crypto/aes/const.v',
|
||||
/* multiple narrow columns of []string turned to 1 long single column, otherwise works */
|
||||
'vlib/vweb/vweb.v',
|
||||
/* $for method in T.methods { => $for method in T(methods) { , `return // xx` => parse expr error */
|
||||
'vlib/v/gen/js/tests/life.v',
|
||||
/* error: unexpected `,`, expecting ), on JS.setInterval(fn () { show(game) game = step(game) }, 500) */
|
||||
'vlib/builtin/js/builtin.v',
|
||||
/* JS.console.error(s) => JS.error(s), JS.process.exit(c) => JS.exit(c) */
|
||||
'vlib/builtin/js/jsfns_node.js.v',
|
||||
'vlib/builtin/js/jsfns.js.v',
|
||||
'vlib/builtin/js/jsfns_browser.js.v',
|
||||
'vlib/builtin/bare/linuxsys_bare.v',
|
||||
/* error: expr(): bad token `asm`, on `asm {}` */
|
||||
'vlib/picoev/picoev.v',
|
||||
/* the fn args are removed, then `cb fn (picohttpparser.Request, mut picohttpparser.Response)` can not be reparsed */
|
||||
'vlib/os/os.v' /* os.v - `a := [ c'/bin/sh', c'-c', byteptr(cmd.str), 0 ]` */,
|
||||
]
|
||||
)
|
||||
|
||||
fn main() {
|
||||
args := os.args
|
||||
args_string := args[1..].join(' ')
|
||||
v_test_formatting(args_string.all_before('test-fmt'))
|
||||
}
|
||||
|
||||
fn v_test_formatting(vargs string) {
|
||||
all_v_files := v_files()
|
||||
util.prepare_tool_when_needed('vfmt.v')
|
||||
testing.eheader('Run "v fmt" over all .v files')
|
||||
mut vfmt_test_session := testing.new_test_session('$vargs fmt -worker')
|
||||
vfmt_test_session.files << all_v_files
|
||||
vfmt_test_session.skip_files << known_failing_exceptions
|
||||
vfmt_test_session.test()
|
||||
eprintln(vfmt_test_session.benchmark.total_message('running vfmt over V files'))
|
||||
if vfmt_test_session.benchmark.nfail > 0 {
|
||||
eprintln('\nWARNING: v fmt failed $vfmt_test_session.benchmark.nfail times.\n')
|
||||
exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
fn v_files() []string {
|
||||
mut files_that_can_be_formatted := []string{}
|
||||
all_test_files := os.walk_ext('.', '.v')
|
||||
for tfile in all_test_files {
|
||||
if tfile.starts_with('./vlib/v/cgen/tests') {
|
||||
continue
|
||||
}
|
||||
files_that_can_be_formatted << tfile
|
||||
}
|
||||
return files_that_can_be_formatted
|
||||
}
|
||||
48
cmd/tools/vtest.v
Normal file
48
cmd/tools/vtest.v
Normal file
@@ -0,0 +1,48 @@
|
||||
module main
|
||||
|
||||
import os
|
||||
import os.cmdline
|
||||
import testing
|
||||
|
||||
fn main() {
|
||||
args := os.args
|
||||
if args.last() == 'test' {
|
||||
println('Usage:')
|
||||
println(' A)')
|
||||
println(' v test folder/ : run all v tests in the given folder.')
|
||||
println(' v -stats test folder/ : the same, but print more stats.')
|
||||
println(' B)')
|
||||
println(' v test file_test.v : run test functions in a given test file.')
|
||||
println(' v -stats test file_test.v : as above, but with more stats.')
|
||||
println(' NB: you can also give many and mixed folder/ file_test.v arguments after test.')
|
||||
println('')
|
||||
return
|
||||
}
|
||||
args_to_executable := args[1..]
|
||||
args_before := cmdline.options_before(args_to_executable, ['test'])
|
||||
args_after := cmdline.options_after(args_to_executable, ['test'])
|
||||
if args_after.join(' ') == 'v' {
|
||||
eprintln('`v test v` has been deprecated.')
|
||||
eprintln('Use `v test-compiler` instead.')
|
||||
exit(1)
|
||||
}
|
||||
mut ts := testing.new_test_session(args_before.join(' '))
|
||||
for targ in args_after {
|
||||
if os.exists(targ) && targ.ends_with('_test.v') {
|
||||
ts.files << targ
|
||||
continue
|
||||
}
|
||||
if os.is_dir(targ) {
|
||||
// Fetch all tests from the directory
|
||||
ts.files << os.walk_ext(targ.trim_right(os.path_separator), '_test.v')
|
||||
continue
|
||||
}
|
||||
println('Unrecognized test file $targ .')
|
||||
}
|
||||
testing.header('Testing...')
|
||||
ts.test()
|
||||
println(ts.benchmark.total_message('running V _test.v files'))
|
||||
if ts.failed {
|
||||
exit(1)
|
||||
}
|
||||
}
|
||||
17
cmd/tools/vtracev.v
Normal file
17
cmd/tools/vtracev.v
Normal file
@@ -0,0 +1,17 @@
|
||||
module main
|
||||
|
||||
import os
|
||||
import v.pref
|
||||
|
||||
fn main() {
|
||||
vexe := pref.vexe_path()
|
||||
vroot := os.dir(vexe)
|
||||
os.chdir(vroot)
|
||||
os.setenv('VCOLORS', 'always', true)
|
||||
self_idx := os.args.index('tracev')
|
||||
args := os.args[1..self_idx]
|
||||
args_str := args.join(' ')
|
||||
options := if args.len > 0 { '($args_str)' } else { '' }
|
||||
println('Compiling a `tracev` executable ${options}...')
|
||||
os.system('$vexe -cg -d trace_parser -d trace_checker -d trace_gen -o tracev $args_str cmd/v')
|
||||
}
|
||||
129
cmd/tools/vup.v
Normal file
129
cmd/tools/vup.v
Normal file
@@ -0,0 +1,129 @@
|
||||
module main
|
||||
|
||||
import os
|
||||
import v.pref
|
||||
import v.util
|
||||
|
||||
struct App {
|
||||
is_verbose bool
|
||||
vexe string
|
||||
vroot string
|
||||
}
|
||||
|
||||
fn new_app() App {
|
||||
vexe := os.real_path(pref.vexe_path())
|
||||
return App{
|
||||
is_verbose: '-v' in os.args
|
||||
vexe: vexe
|
||||
vroot: os.dir(vexe)
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
app := new_app()
|
||||
os.chdir(app.vroot)
|
||||
println('Updating V...')
|
||||
app.update_from_master()
|
||||
v_hash := util.githash(false)
|
||||
current_hash := util.githash(true)
|
||||
// println(v_hash)
|
||||
// println(current_hash)
|
||||
if v_hash == current_hash {
|
||||
app.show_current_v_version()
|
||||
return
|
||||
}
|
||||
$if windows {
|
||||
app.backup('cmd/tools/vup.exe')
|
||||
}
|
||||
app.recompile_v()
|
||||
os.exec('"$app.vexe" cmd/tools/vup.v') or {
|
||||
panic(err)
|
||||
}
|
||||
app.show_current_v_version()
|
||||
}
|
||||
|
||||
fn (app App) update_from_master() {
|
||||
if app.is_verbose {
|
||||
println('> updating from master ...')
|
||||
}
|
||||
if !os.exists('.git') {
|
||||
// initialize as if it had been cloned
|
||||
app.git_command('init')
|
||||
app.git_command('remote add origin https://github.com/vlang/v')
|
||||
app.git_command('fetch')
|
||||
app.git_command('reset --hard origin/master')
|
||||
app.git_command('clean --quiet -xdf --exclude v.exe --exclude cmd/tools/vup.exe')
|
||||
} else {
|
||||
// pull latest
|
||||
app.git_command('pull https://github.com/vlang/v master')
|
||||
}
|
||||
}
|
||||
|
||||
fn (app App) recompile_v() {
|
||||
// NB: app.vexe is more reliable than just v (which may be a symlink)
|
||||
vself := '"$app.vexe" self'
|
||||
if app.is_verbose {
|
||||
println('> recompiling v itself with `$vself` ...')
|
||||
}
|
||||
if self_result := os.exec(vself) {
|
||||
println(self_result.output.trim_space())
|
||||
if self_result.exit_code == 0 {
|
||||
return
|
||||
}
|
||||
}
|
||||
app.make(vself)
|
||||
}
|
||||
|
||||
fn (app App) make(vself string) {
|
||||
mut make := 'make'
|
||||
$if windows {
|
||||
make = 'make.bat'
|
||||
}
|
||||
println('`$vself` failed, running `$make`...')
|
||||
make_result := os.exec(make) or {
|
||||
panic(err)
|
||||
}
|
||||
println(make_result.output)
|
||||
}
|
||||
|
||||
fn (app App) show_current_v_version() {
|
||||
if vout := os.exec('"$app.vexe" version') {
|
||||
mut vversion := vout.output.trim_space()
|
||||
if vout.exit_code == 0 {
|
||||
latest_v_commit := vversion.split(' ').last().all_after('.')
|
||||
if latest_v_commit_time := os.exec('git show -s --format=%ci $latest_v_commit') {
|
||||
if latest_v_commit_time.exit_code == 0 {
|
||||
vversion += ', timestamp: ' + latest_v_commit_time.output.trim_space()
|
||||
}
|
||||
}
|
||||
}
|
||||
println('Current V version:')
|
||||
println(vversion)
|
||||
}
|
||||
}
|
||||
|
||||
fn (app App) backup(file string) {
|
||||
backup_file := '${file}_old.exe'
|
||||
if os.exists(backup_file) {
|
||||
os.rm(backup_file)
|
||||
}
|
||||
os.mv(file, backup_file)
|
||||
}
|
||||
|
||||
fn (app App) git_command(command string) {
|
||||
git_result := os.exec('git $command') or {
|
||||
panic(err)
|
||||
}
|
||||
if git_result.exit_code != 0 {
|
||||
if git_result.output.contains('Permission denied') {
|
||||
eprintln('No access to `$app.vroot`: Permission denied')
|
||||
} else {
|
||||
eprintln(git_result.output)
|
||||
}
|
||||
exit(1)
|
||||
} else {
|
||||
if app.is_verbose {
|
||||
println(git_result.output)
|
||||
}
|
||||
}
|
||||
}
|
||||
75
cmd/tools/vvet.v
Normal file
75
cmd/tools/vvet.v
Normal file
@@ -0,0 +1,75 @@
|
||||
// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved.
|
||||
// Use of this source code is governed by an MIT license that can be found in the LICENSE file.
|
||||
module main
|
||||
|
||||
import v.vet
|
||||
import v.pref
|
||||
import v.parser
|
||||
import v.util
|
||||
import v.table
|
||||
import os
|
||||
import os.cmdline
|
||||
|
||||
struct VetOptions {
|
||||
is_verbose bool
|
||||
mut:
|
||||
errors []string
|
||||
}
|
||||
|
||||
fn (vet_options &VetOptions) vprintln(s string) {
|
||||
if !vet_options.is_verbose {
|
||||
return
|
||||
}
|
||||
println(s)
|
||||
}
|
||||
|
||||
fn main() {
|
||||
args := util.join_env_vflags_and_os_args()
|
||||
paths := cmdline.only_non_options(cmdline.options_after(args, ['vet']))
|
||||
mut vet_options := VetOptions{
|
||||
is_verbose: '-verbose' in args || '-v' in args
|
||||
}
|
||||
for path in paths {
|
||||
if !os.exists(path) {
|
||||
eprintln('File/folder $path does not exist')
|
||||
continue
|
||||
}
|
||||
if path.ends_with('_test.v') || (path.contains('/tests/') && !path.contains('vlib/v/vet/')) {
|
||||
eprintln('skipping $path')
|
||||
continue
|
||||
}
|
||||
if path.ends_with('.v') || path.ends_with('.vv') {
|
||||
vet_options.vet_file(path)
|
||||
} else if os.is_dir(path) {
|
||||
vet_options.vprintln("vetting folder '$path'...")
|
||||
vfiles := os.walk_ext(path, '.v')
|
||||
vvfiles := os.walk_ext(path, '.vv')
|
||||
mut files := []string{}
|
||||
files << vfiles
|
||||
files << vvfiles
|
||||
for file in files {
|
||||
if file.ends_with('_test.v') || file.contains('/tests/') { // TODO copy pasta
|
||||
continue
|
||||
}
|
||||
vet_options.vet_file(file)
|
||||
}
|
||||
}
|
||||
}
|
||||
if vet_options.errors.len > 0 {
|
||||
for err in vet_options.errors {
|
||||
eprintln(err)
|
||||
}
|
||||
eprintln('NB: You can run `v fmt -w file.v` to fix these automatically')
|
||||
exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
fn (mut vet_options VetOptions) vet_file(path string) {
|
||||
mut prefs := pref.new_preferences()
|
||||
prefs.is_vet = true
|
||||
table := table.new_table()
|
||||
vet_options.vprintln("vetting file '$path'...")
|
||||
file_ast, errors := parser.parse_vet_file(path, table, prefs)
|
||||
vet_options.errors << errors
|
||||
vet.vet(file_ast, table, true)
|
||||
}
|
||||
14
cmd/v/help/bin2v.txt
Normal file
14
cmd/v/help/bin2v.txt
Normal file
@@ -0,0 +1,14 @@
|
||||
Usage:
|
||||
v bin2v [options] FILE [FILE]...
|
||||
|
||||
Converts a list of arbitrary files into a single v module file.
|
||||
|
||||
You can use this tool to embed binary files, like pictures or fonts inside
|
||||
the executable of a v program, such that it would not need access to external
|
||||
resources during runtime, and it would be as self-contained as possible.
|
||||
|
||||
Options:
|
||||
-h, --help Show this help screen.
|
||||
-m, --module <string> Name of the generated module.
|
||||
-p, --prefix <string> A prefix put before each resource name.
|
||||
-w, --write <string> Write directly to a file with the given name.
|
||||
69
cmd/v/help/build-c.txt
Normal file
69
cmd/v/help/build-c.txt
Normal file
@@ -0,0 +1,69 @@
|
||||
Usage: v [build flags] ['build'] <file.v|directory>
|
||||
|
||||
This command compiles the given target, along with their dependencies, into an executable.
|
||||
|
||||
This help topic explores C-backend specific build flags.
|
||||
For help regarding building an executable, see `v help build`.
|
||||
|
||||
These build flags are enabled on `build` and `run` as long as the backend is set to `c`:
|
||||
|
||||
-cc <compiler>
|
||||
Change the C compiler V invokes to the specified compiler.
|
||||
The C compiler is required to support C99.
|
||||
Officially supported/tested C compilers include: `clang`, `gcc`, `tcc`, `mingw-w64` and `msvc`.
|
||||
|
||||
-cflags <flag>
|
||||
Pass the provided flag as is to the C compiler.
|
||||
Can be specified multiple times to provide multiple flags.
|
||||
Use quotes to wrap the flag argument if it contains spaces.
|
||||
|
||||
-printfn <fn_name>
|
||||
Prints the content of the generated C function named fn_name. You can repeat that many times.
|
||||
This is useful when you just want to quickly tweak the generated C code,
|
||||
without opening the generated .c file in an text editor.
|
||||
|
||||
-cg
|
||||
Enable generating more debug information in the compiled executable.
|
||||
This makes program backtraces more useful.
|
||||
Using debuggers like gdb/lldb with such executables is easier too.
|
||||
|
||||
-compress
|
||||
Strip the compiled executable to compress it.
|
||||
|
||||
-freestanding
|
||||
Build the executable without dependency on libc.
|
||||
Supported only on `linux` targets currently.
|
||||
|
||||
-live
|
||||
Build the executable with live capabilities (`[live]`).
|
||||
|
||||
-os <os>, -target-os <os>
|
||||
Change the target OS that V tries to compile for.
|
||||
By default, the target OS is the host system.
|
||||
When OS is `cross`, V will attempt to output cross-platform C code.
|
||||
List of OS supported by V: `linux`, `windows`, `ios`, `mac`, `freebsd`, `openbsd`,
|
||||
`netbsd`, `dragonfly`, `solaris`, `android` and `haiku`.
|
||||
|
||||
-m32, -m64
|
||||
Specify whether 32-bit or 64-bit machine code is generated.
|
||||
|
||||
-sanitize
|
||||
Pass flags related to sanitization to the C compiler.
|
||||
|
||||
-shared
|
||||
Tell V to compile a shared object instead of an executable.
|
||||
The resulting file extension will be `.dll` on Windows and `.so` on Unix systems
|
||||
|
||||
-no-prelude
|
||||
Prevents V from generating a prelude in generated .c files, useful for freestanding targets
|
||||
where eg. you replace C standard library with your own, or some definitions/headers break something.
|
||||
|
||||
-custom-prelude <path>
|
||||
Useful for similar use-case as above option, except it replaces V-generated prelude with
|
||||
your custom one loaded from specified <path>.
|
||||
|
||||
-showcc
|
||||
Prints the C command that is used to build the program.
|
||||
|
||||
-keepc
|
||||
Do not remove the temporary .tmp.c and .tmp.c.rsp files. Also do not use a random prefix for them, so they would be fixed and predictable.
|
||||
131
cmd/v/help/build.txt
Normal file
131
cmd/v/help/build.txt
Normal file
@@ -0,0 +1,131 @@
|
||||
Usage: v [build flags] ['build'] <file.v|directory>
|
||||
|
||||
This command compiles the given target, along with their dependencies, into an executable.
|
||||
|
||||
When compiling packages, build ignores files that end in '_test.v'.
|
||||
|
||||
When compiling a single main package, build writes the resulting executable to an output file
|
||||
named after the build target. ('v abc.v' and 'v abc/' both write either 'abc' or 'abc.exe')
|
||||
The '.exe' suffix is added when writing a Windows executable.
|
||||
By default, the executable is stored in the same directory as the compiled source code.
|
||||
|
||||
The -o flag forces build to write the resulting executable or object to the d output file or directory,
|
||||
instead of the default behavior described in the last two paragraphs.
|
||||
|
||||
You can put common options inside an environment variable named VFLAGS, so that
|
||||
you don't have to repeat them.
|
||||
|
||||
You can set it like this: `export VFLAGS="-cc clang -debug"` on *nix,
|
||||
`set VFLAGS=-cc msvc` on Windows.
|
||||
|
||||
V respects the TMPDIR environment variable, and will put .tmp.c files in TMPDIR/v/ .
|
||||
If you have not set it, a suitable platform specific folder (like /tmp) will be used.
|
||||
|
||||
The build flags are shared by the build and run commands:
|
||||
|
||||
-b <backend>, -backend <backend>
|
||||
Specify the backend to use while building the executable.
|
||||
Current list of supported backends:
|
||||
* `c` (default) - V outputs C source code which is passed to a C compiler to be compiled.
|
||||
* `js` - V outputs JS source code which can be passed to NodeJS to be ran.
|
||||
* `x64` - V outputs Linux 64-bit executable directly (highly experimental!).
|
||||
|
||||
-d <flag>[=<value>], -define <flag>[=<value>]
|
||||
Define the provided flag.
|
||||
If value is not provided, it is assumed to be set to `true`.
|
||||
`value` should be `1` or `0` to indicate `true` and `false` respectively otherwise.
|
||||
|
||||
-e <experiment>, -experiments <experiment>
|
||||
Enable the specified experiment.
|
||||
Currently, the only experiment available is: `prealloc`
|
||||
|
||||
-cg
|
||||
Compile the executable in debug mode, allowing code to be debugged more easily.
|
||||
|
||||
-o <output>, -output <output>
|
||||
Force V to output the executable in a specific location
|
||||
(relative to the current working directory if not absolute).
|
||||
|
||||
-obf, -obfuscate
|
||||
Turn on obfuscation for the code being built. Currently only renames symbols.
|
||||
|
||||
-path
|
||||
Specify the order of path V looks up in while searching for imported dependencies,
|
||||
separated by pipes (`|`). In addition to absolute paths, you can
|
||||
also use these special strings too:
|
||||
@vmodules - replaced with the location of the global ~/.vmodules/ folder
|
||||
(modules installed with `v install` are there). You can change
|
||||
its location by setting the environment variable VMODULES.
|
||||
@vlib - replaced with the location of the v's vlib folder.
|
||||
Using these, you can arrange for very flexible search orders for you project, for example:
|
||||
-path "/v/my_project_private_modules|@vlib|@vmodules"
|
||||
By default, -path is just "@vlib|@vmodules" .
|
||||
|
||||
-prod
|
||||
Compile the executable in production mode where most optimizations are enabled.
|
||||
|
||||
-prof, -profile <file.txt>
|
||||
Compile the executable with all functions profiled.
|
||||
The profile results will be stored in `file.txt`.
|
||||
The format is 4 fields, separated by a space, for each v function:
|
||||
a) how many times it was called
|
||||
b) how much *nanoseconds in total* it took
|
||||
c) an average for each function (i.e. (b) / (a) )
|
||||
d) the function name
|
||||
NB: if you want to output the profile info to stdout, use `-profile -`.
|
||||
|
||||
-profile-no-inline
|
||||
Skip [inline] functions when profiling.
|
||||
|
||||
-stats
|
||||
Enable more detailed statistics reporting, while compiling test files.
|
||||
You can use that with `v test` too, for example:
|
||||
v -stats test vlib/
|
||||
... will run test_ functions inside all _test.v files inside vlib/ ,
|
||||
and will report detailed statistics about how much time each test_ function took, how many
|
||||
assertions were made, how many tests passed/failed and so on.
|
||||
|
||||
-translated
|
||||
Enable features that are discouraged in regular V code but required for translated V code.
|
||||
|
||||
-v
|
||||
Enable verbosity in the V compiler while compiling
|
||||
|
||||
-print_v_files
|
||||
Just print the list of all parsed .v files, then stop processing further.
|
||||
This is useful for running external processing tools:
|
||||
./v -print_v_files cmd/v | etags -L -
|
||||
... will generate a TAGS file, that emacs can then use to jump
|
||||
to the definition of functions used by v itself. For vim:
|
||||
./v -print_v_files cmd/v | ctags -L -
|
||||
... will generate a simillar tags file, that vi compatible editors can use.
|
||||
NB: an useful, although not entirely accurate regexp based Universal Ctags options file
|
||||
for V is located in `.ctags.d/v.ctags` . If you use https://ctags.io/ , it will be used
|
||||
up automatically, or you can specify it explicitly with --options=.ctags.d/v.ctags .
|
||||
|
||||
-color, -nocolor
|
||||
Force the use of ANSI colors for the error/warning messages, or disable them completely.
|
||||
By default V tries to show its errors/warnings in ANSI color. The heuristic that it uses
|
||||
to detect whether or not to use ANSI colors may not work in all cases.
|
||||
These options allow you to override the default detection.
|
||||
|
||||
-check-syntax
|
||||
Only scan and parse the files, but then stop. Useful for very quick syntax checks.
|
||||
|
||||
-show-timings
|
||||
Print a summary about how long each compiler stage took, for example:
|
||||
PARSE: 152ms
|
||||
CHECK: 62ms
|
||||
C GEN: 103ms
|
||||
C tcc: 95ms
|
||||
|
||||
-w
|
||||
Hide all warnings.
|
||||
|
||||
-W
|
||||
Treat all warnings as errors, even in development builds.
|
||||
|
||||
For C-specific build flags, use `v help build-c`.
|
||||
|
||||
See also:
|
||||
`v help run` for documentation regarding `v run`.
|
||||
48
cmd/v/help/default.txt
Normal file
48
cmd/v/help/default.txt
Normal file
@@ -0,0 +1,48 @@
|
||||
V is a tool for managing V source code.
|
||||
|
||||
Usage:
|
||||
v [options] [command] [arguments]
|
||||
|
||||
Examples:
|
||||
v hello.v Compile the file `hello.v` and output it as `hello` or `hello.exe`.
|
||||
v run hello.v Same as above but also run the produced executable immediately after compilation.
|
||||
v -cg run hello.v Same as above, but make debugging easier (in case your program crashes).
|
||||
v -o h.c hello.v Translate `hello.v` to `h.c`. Do not compile further.
|
||||
|
||||
V supports the following commands:
|
||||
* New project scaffolding:
|
||||
new Setup the file structure for a V project (in a sub folder).
|
||||
init Setup the file structure for an already existing V project.
|
||||
* Ordinary development:
|
||||
run Compile and run a V program.
|
||||
test Run all test files in the provided directory.
|
||||
fmt Format the V code provided.
|
||||
vet Report suspicious code constructs.
|
||||
doc Generate the documentation for a V module.
|
||||
vlib-docs Generate and open the documentation of all the vlib modules.
|
||||
repl Run the REPL.
|
||||
* Installation/self updating:
|
||||
symlink Create a symbolic link for V.
|
||||
up Run the V self-updater.
|
||||
self [-prod] Run the V self-compiler, use -prod to optimize compilation.
|
||||
version Print the version text and exits.
|
||||
* Module/package management:
|
||||
install Install a module from VPM.
|
||||
remove Remove a module that was installed from VPM.
|
||||
search Search for a module from VPM.
|
||||
update Update an installed module from VPM.
|
||||
upgrade Upgrade all the outdated modules.
|
||||
list List all installed modules.
|
||||
outdated Show installed modules that need updates.
|
||||
* Others:
|
||||
build Build V code in the provided path (the default, so you can skip the word `build`).
|
||||
translate Translate C code to V (coming soon in 0.3).
|
||||
tracev Produce a tracing version of the v compiler.
|
||||
Use `tracev yourfile.v` when the compiler panics.
|
||||
NB: `tracev` is much slower and more verbose than ordinary `v`
|
||||
|
||||
Use "v help <command>" for more information about a command, example: `v help build`, `v help build-c`
|
||||
Use "v help other" to see less frequently used commands.
|
||||
|
||||
Note: Help is required to write more help topics.
|
||||
Only build, doc, fmt, run, test, search, install, remove, update, bin2v are properly documented currently.
|
||||
35
cmd/v/help/doc.txt
Normal file
35
cmd/v/help/doc.txt
Normal file
@@ -0,0 +1,35 @@
|
||||
Usage:
|
||||
v doc [flags] [module_name / folder / V file] [symbol name]
|
||||
|
||||
Examples:
|
||||
v doc os
|
||||
v doc os File
|
||||
v doc -o math.html math
|
||||
v doc -m -f html vlib/
|
||||
|
||||
Generates the documentation of a given directory, module, or V source file
|
||||
and prints or saves them to its desired format. It can generate HTML, JSON,
|
||||
or Markdown format.
|
||||
|
||||
Options:
|
||||
-all Includes private and public functions/methods/structs/consts/enums.
|
||||
-f Specifies the output format to be used.
|
||||
-h, -help Prints this help text.
|
||||
-m Generate docs for modules listed in that folder.
|
||||
-o Specifies the output file/folder path where to store the generated docs.
|
||||
Set it to "stdout" to print the output instead of saving the contents
|
||||
to a file.
|
||||
-readme Include README.md to docs if present.
|
||||
-v Enables verbose logging. For debugging purposes.
|
||||
-filename Specifies the specific file to document.
|
||||
-pos Specifies the position. Used with `-filename`.
|
||||
-no-timestamp Omit timestamp in the output file.
|
||||
|
||||
For HTML mode:
|
||||
-inline-assets Embeds the contents of the CSS and JS assets into the webpage directly.
|
||||
-open Launches the browser when the server docs has started.
|
||||
-p Specifies the port to be used for the docs server.
|
||||
-s Serve HTML-generated docs via HTTP.
|
||||
|
||||
For plain text mode:
|
||||
-l Show the locations of the generated signatures.
|
||||
31
cmd/v/help/fmt.txt
Normal file
31
cmd/v/help/fmt.txt
Normal file
@@ -0,0 +1,31 @@
|
||||
Usage:
|
||||
v fmt [options] path_to_source.v [path_to_other_source.v]
|
||||
|
||||
Formats the given V source files, then prints their formatted source to stdout.
|
||||
|
||||
Options:
|
||||
-c Check if file is already formatted.
|
||||
If it is not, print filepath, and exit with code 2.
|
||||
|
||||
-diff Display the differences between the formatted source(s) and the original source(s).
|
||||
This will attempt to find a working `diff` command automatically unless you
|
||||
specify one with the VDIFF_TOOL environment variable.
|
||||
|
||||
-l List files whose formatting differs from vfmt.
|
||||
|
||||
-w Write result to (source) file(s) instead of to stdout.
|
||||
|
||||
-debug Print the kinds of encountered AST statements/expressions on stderr.
|
||||
|
||||
-verify Make sure the provided file is already formatted. Useful for checking code contributions
|
||||
in CI for example.
|
||||
|
||||
Environment Variables:
|
||||
VDIFF_TOOL A command-line tool that will be executed with the original file path
|
||||
and a temporary formatted file path as arguments. e.g.
|
||||
`VDIFF_TOOL=opendiff v fmt -diff path/to/file.v` will become:
|
||||
opendiff path/to/file.v /tmp/v/vfmt_file.v
|
||||
|
||||
VDIFF_OPTIONS A set of command-line options to be sent immediately after the
|
||||
`diff` command. e.g.
|
||||
VDIFF_OPTIONS="-W 80 -y" v fmt -diff path/to/file.v /tmp/v/vfmt_file.v
|
||||
28
cmd/v/help/help.v
Normal file
28
cmd/v/help/help.v
Normal file
@@ -0,0 +1,28 @@
|
||||
module help
|
||||
|
||||
// TODO: move this file outside internal, and merge it with cmd/tools/modules/vhelp/vhelp.v .
|
||||
import os
|
||||
import v.pref
|
||||
|
||||
const (
|
||||
unknown_topic = 'V Error: Unknown help topic provided. Use `v help` for usage information.'
|
||||
)
|
||||
|
||||
pub fn print_and_exit(topic string) {
|
||||
vexe := pref.vexe_path()
|
||||
vroot := os.dir(vexe)
|
||||
for b in topic {
|
||||
if (b >= `a` && b <= `z`) || b == `-` || (b >= `0` && b <= `9`) {
|
||||
continue
|
||||
}
|
||||
eprintln(unknown_topic)
|
||||
exit(1)
|
||||
}
|
||||
target_topic := os.join_path(vroot, 'cmd', 'v', 'help', '${topic}.txt')
|
||||
content := os.read_file(target_topic) or {
|
||||
eprintln(unknown_topic)
|
||||
exit(1)
|
||||
}
|
||||
println(content)
|
||||
exit(0)
|
||||
}
|
||||
12
cmd/v/help/install.txt
Normal file
12
cmd/v/help/install.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
Usage:
|
||||
v install module [module] [module] [...]
|
||||
^^^^^^^^^^^^^ will install the modules you specified
|
||||
|
||||
You can also do `v install` directly if you have dependencies stored
|
||||
inside the `v.mod` file. This will automatically installs the modules
|
||||
specified inside of it.
|
||||
|
||||
Options:
|
||||
-help - Show usage info.
|
||||
-v - Print more details about the performed operation.
|
||||
-server-url - When doing network operations, use this vpm server. Can be given multiple times.
|
||||
14
cmd/v/help/other.txt
Normal file
14
cmd/v/help/other.txt
Normal file
@@ -0,0 +1,14 @@
|
||||
These are utility commands that you can also launch through v,
|
||||
but which are used less frequently by users:
|
||||
|
||||
bin2v Convert a binary file to a v source file,
|
||||
that can be later embedded in a module or program.
|
||||
|
||||
build-examples Test if all examples can be built.
|
||||
build-tools Test if all tools can be built.
|
||||
build-vbinaries Test if V can be built with different configuration.
|
||||
test-fmt Test if all files in the current directory are formatted properly.
|
||||
test-compiler Test if V is working properly by running all tests, including the compiler ones.
|
||||
NB: this can take a minute or two to run
|
||||
|
||||
setup-freetype Setup thirdparty freetype on Windows.
|
||||
9
cmd/v/help/remove.txt
Normal file
9
cmd/v/help/remove.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
Usage:
|
||||
a) v remove module [module] [module] [...]
|
||||
^^^^^^^^^^^^ will remove the listed modules
|
||||
b) v remove
|
||||
^^^^^^^^^^^^ will remove ALL installed modules
|
||||
Options:
|
||||
-help - Show usage info.
|
||||
-v - Print more details about the performed operation.
|
||||
-server-url - When doing network operations, use this vpm server. Can be given multiple times.
|
||||
13
cmd/v/help/run.txt
Normal file
13
cmd/v/help/run.txt
Normal file
@@ -0,0 +1,13 @@
|
||||
Usage: v [build flags] run <file.v|directory|-> [arguments...]
|
||||
|
||||
This command is equivalent to running `v build` and running the compiled executable.
|
||||
The executable is passed the arguments as provided in [arguments...].
|
||||
|
||||
If the target is '-', it means that the V source code to build comes from stdin.
|
||||
If the '-o' option is not specified, and the target is '-', a temporary base name for the executable will be used.
|
||||
|
||||
The exit status of run will be:
|
||||
* `1` if the compilation failed.
|
||||
* The exit code of the compiled executable otherwise.
|
||||
|
||||
For more about build flags, see `v help build`.
|
||||
8
cmd/v/help/search.txt
Normal file
8
cmd/v/help/search.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
Usage:
|
||||
v search keyword1 [keyword2] [...]
|
||||
^^^^^^^^^^^^^^^^^ will search https://vpm.vlang.io/ for matching modules,
|
||||
and will show details about them
|
||||
Options:
|
||||
-help - Show usage info.
|
||||
-v - Print more details about the performed operation.
|
||||
-server-url - When doing network operations, use this vpm server. Can be given multiple times.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user