Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
380dcbbb58 | ||
|
|
0a002db1e5 | ||
|
|
b5b1c2b9df | ||
|
|
dd8f358076 | ||
|
|
34cd49174e | ||
|
|
2874fd2600 | ||
|
|
56db55a3dc | ||
|
|
8b9e009fc9 | ||
|
|
23720f5fd8 | ||
|
|
dd3938c934 | ||
|
|
cf9b2565d0 | ||
|
|
a250a53361 | ||
|
|
375d62c335 | ||
|
|
df9469ca4e | ||
|
|
a07c8fd6c0 | ||
|
|
e41ead271e | ||
|
|
c1e3843bcf | ||
|
|
af38a6c7c8 | ||
|
|
9fb4ce53a5 | ||
|
|
1f7204baac | ||
|
|
f3932b797b | ||
|
|
24d7926bc7 | ||
|
|
f4db8e996a | ||
|
|
fa91e7d113 | ||
|
|
5889017c02 | ||
|
|
ad8278a3ae | ||
|
|
79c2319c16 | ||
|
|
e36cb639f2 | ||
|
|
23823e650a | ||
|
|
7fdddf23fe | ||
|
|
03c9918b58 | ||
|
|
2cbe7d6313 | ||
|
|
ffb1b832f6 | ||
|
|
d56135ea82 | ||
|
|
7216af8981 | ||
|
|
b8eb77a61a | ||
|
|
ed1fd8077c | ||
|
|
94e02c78a1 | ||
|
|
e6558706b8 | ||
|
|
accd0fb4af | ||
|
|
d0d269b61f | ||
|
|
f7adfc83e8 | ||
|
|
125b6576a4 | ||
|
|
67669b497e | ||
|
|
f809a81829 | ||
|
|
9ea7328ab4 | ||
|
|
ef5926422a | ||
|
|
111a6534e1 | ||
|
|
fcd74cb13c | ||
|
|
49720023bd | ||
|
|
96a12da3a3 | ||
|
|
67eea35d8f | ||
|
|
9d6ea035a9 | ||
|
|
fcd8f25e8b | ||
|
|
5f888eef30 | ||
|
|
c02440cfe1 | ||
|
|
e5abfbca71 | ||
|
|
b4625c7c30 | ||
|
|
b960aecb76 | ||
|
|
2ebc31b273 | ||
|
|
4ea422f34e | ||
|
|
5c44eec26e | ||
|
|
99ac776dbb | ||
|
|
41f2cd70ed | ||
|
|
485dbdeb33 | ||
|
|
1772769c6d | ||
|
|
7393ba3b6b | ||
|
|
af71bc0cd1 | ||
|
|
a3b79dc06d | ||
|
|
d4df455dc0 | ||
|
|
025ab76ca6 | ||
|
|
1613298710 | ||
|
|
bcd6c9ef50 | ||
|
|
6f62c61bb4 | ||
|
|
2cbc5f4b7b | ||
|
|
0ba3df9253 | ||
|
|
f33afd0379 | ||
|
|
f15c635167 | ||
|
|
ec5044da85 | ||
|
|
5818e888f1 | ||
|
|
3b4c8e71e7 | ||
|
|
6ad565886b | ||
|
|
30991405b1 | ||
|
|
6e325b1eb1 | ||
|
|
f2834da643 | ||
|
|
13345e3f85 | ||
|
|
4092a12895 | ||
|
|
c694184fea | ||
|
|
2d1f8e09ac | ||
|
|
32e2c38fc4 | ||
|
|
d0ffef78f1 | ||
|
|
75fc2a842c | ||
|
|
c0ff0efbed | ||
|
|
01290a44fb | ||
|
|
4f2b7e2d68 | ||
|
|
01c3b227a2 | ||
|
|
144845c0b4 | ||
|
|
2b44312fe4 | ||
|
|
ff4cdc8d31 | ||
|
|
b4c1b9dced | ||
|
|
8d097048e8 | ||
|
|
14592c4b37 | ||
|
|
a333ee19e3 | ||
|
|
49fcfad692 | ||
|
|
62f052a36c | ||
|
|
1bd76ebd2d | ||
|
|
6d99657dc0 | ||
|
|
e6003fe683 | ||
|
|
58e1a78191 | ||
|
|
cfd43015c6 | ||
|
|
aa4c8647ba | ||
|
|
6f39f3b2cf | ||
|
|
af6a56ff5a | ||
|
|
6a60262bd6 | ||
|
|
50e3a2f40d | ||
|
|
ed98521ba6 | ||
|
|
a3be300f42 | ||
|
|
1ebb6aaef3 | ||
|
|
8815aa5d83 | ||
|
|
14b197149b | ||
|
|
74030963f4 | ||
|
|
83df072462 | ||
|
|
cdfe77f798 | ||
|
|
bf25e3ddb7 | ||
|
|
c5d64e06c8 | ||
|
|
e4e40ef38e | ||
|
|
ed60b9c77b | ||
|
|
2bdbdebd29 | ||
|
|
6c4049fe6a | ||
|
|
4b85228811 | ||
|
|
25eb322aba | ||
|
|
aa53c7181b | ||
|
|
91ce65c312 | ||
|
|
400ef22046 | ||
|
|
c735a48f37 | ||
|
|
081bf843d5 | ||
|
|
33e16e8ff8 | ||
|
|
f6d1bd8dc5 | ||
|
|
80161f19a0 | ||
|
|
4c48a2b997 | ||
|
|
b57e66d238 | ||
|
|
36e3707eee | ||
|
|
b2f2a4c088 | ||
|
|
f379a7e4d2 | ||
|
|
61de515ba9 | ||
|
|
d66e3b1d1d | ||
|
|
64aed44a59 | ||
|
|
25b73da64a | ||
|
|
4016be17d0 | ||
|
|
a18b91b864 | ||
|
|
6b003436e3 | ||
|
|
2b4a82d17e | ||
|
|
cd8aa4750c | ||
|
|
b69581ce7a | ||
|
|
8b7ad9ecad | ||
|
|
ee7b2f1efa | ||
|
|
48b120cf0b | ||
|
|
b0a82a8bdc | ||
|
|
a10a6d28ad | ||
|
|
2cbba0be71 | ||
|
|
4f03cfdcbe | ||
|
|
0b94fdefe9 | ||
|
|
e68b898a14 | ||
|
|
a06d8e601b | ||
|
|
b54dbce505 | ||
|
|
6216e3f87b | ||
|
|
e792d23cbc | ||
|
|
b388523e2e | ||
|
|
242d69ad55 | ||
|
|
23b370ba7b | ||
|
|
1fb046518a | ||
|
|
6a8b0ede01 | ||
|
|
2fa28a4645 | ||
|
|
23c07aa017 | ||
|
|
adca369b9f | ||
|
|
f086e5cd5b | ||
|
|
9b398b11d7 | ||
|
|
740b98b660 | ||
|
|
ef339a4322 | ||
|
|
75289ad75f | ||
|
|
75f6870919 | ||
|
|
309a6d899e | ||
|
|
b785c76714 | ||
|
|
89d3daeb53 | ||
|
|
f74049089b | ||
|
|
b8b26bb7bf | ||
|
|
640df0fe06 | ||
|
|
2015521a64 | ||
|
|
e24c264f89 | ||
|
|
c0b216c888 | ||
|
|
212ba53ec6 | ||
|
|
ee0052f953 | ||
|
|
937026ccad | ||
|
|
f1f339ee10 | ||
|
|
d5e77d82aa | ||
|
|
9f7d45363f | ||
|
|
bc0557718c | ||
|
|
91aa923203 | ||
|
|
791832845d | ||
|
|
a62acdb5a5 | ||
|
|
cd949b9ced | ||
|
|
7a9d0aae08 | ||
|
|
a5f4a5a734 | ||
|
|
dfdb047546 | ||
|
|
e58ea779db | ||
|
|
979d86f8b9 | ||
|
|
f052b4e2d5 | ||
|
|
2ec6d5a1f6 | ||
|
|
32ac8ae30d | ||
|
|
2f78e86da4 | ||
|
|
f814414502 | ||
|
|
0e3dd7a275 | ||
|
|
ecaf985ae6 | ||
|
|
4f137fe9de | ||
|
|
1b323b6b58 | ||
|
|
8efa45e649 | ||
|
|
5ae826c117 | ||
|
|
26dff27224 | ||
|
|
05b0934e79 | ||
|
|
89251c7796 | ||
|
|
9e0c520ded | ||
|
|
391acc849a | ||
|
|
3c260b59e4 | ||
|
|
e0898fa949 | ||
|
|
bc84cdb538 | ||
|
|
a0912abebd | ||
|
|
1826ebc362 | ||
|
|
61d288db52 | ||
|
|
dd3479425b | ||
|
|
5b361fa8e5 | ||
|
|
8bac39c35f | ||
|
|
d31eff278b | ||
|
|
f28b78931d | ||
|
|
88040d5d35 | ||
|
|
4e216cf144 | ||
|
|
7516eefb4f | ||
|
|
1db3e20d72 | ||
|
|
3f81cc0838 | ||
|
|
f26f88b8e1 | ||
|
|
6f4ce8fe3d | ||
|
|
db9ef1fa46 | ||
|
|
26022ba2b0 | ||
|
|
e86fd97d71 | ||
|
|
1aa22b8124 | ||
|
|
19b55199d4 | ||
|
|
5dcb3081e5 | ||
|
|
60aa015a2b | ||
|
|
353d03a152 | ||
|
|
6ce2b28b80 | ||
|
|
ae7fa0d500 | ||
|
|
f5d1567440 | ||
|
|
ccfc40a47c | ||
|
|
5436cbbb6d | ||
|
|
6610004132 | ||
|
|
5623d1ecf5 | ||
|
|
49d4b82330 | ||
|
|
3e1266e3de | ||
|
|
35964e0756 | ||
|
|
d6b9003f6f | ||
|
|
f7ab54c951 | ||
|
|
62acfc8d90 | ||
|
|
f02661a472 | ||
|
|
1ed96026ae | ||
|
|
4cb51b72e1 | ||
|
|
928a5d4b03 | ||
|
|
93b14d5744 | ||
|
|
4ea5a278c0 | ||
|
|
86f1a0977d | ||
|
|
d726367408 | ||
|
|
a213d227a5 | ||
|
|
e921604cea | ||
|
|
7034b4b5a4 | ||
|
|
1a2c37a2db | ||
|
|
1d10e0446e | ||
|
|
b7a8a07a39 | ||
|
|
45e5d6caa7 | ||
|
|
c7945e8509 | ||
|
|
df6bd14d70 | ||
|
|
c788dd02c0 | ||
|
|
3917fc4f08 | ||
|
|
c916e8d930 | ||
|
|
7230cf3954 | ||
|
|
4c3b402925 | ||
|
|
36dd2d2458 | ||
|
|
a4c1e6a5be | ||
|
|
ed64b7cbf2 | ||
|
|
a0b665b9c7 | ||
|
|
4d76f74f59 | ||
|
|
377c126a4a | ||
|
|
3bcc88e4a5 | ||
|
|
9c62fce293 | ||
|
|
9f25573e73 | ||
|
|
d562206309 | ||
|
|
590dd677e3 | ||
|
|
bdbbfd3786 | ||
|
|
d3a38d9f28 | ||
|
|
c5a7a01889 | ||
|
|
604a2b7d87 | ||
|
|
d1372f928b | ||
|
|
c7e99415e0 | ||
|
|
bc4457c957 | ||
|
|
ecdb08ec8c | ||
|
|
3afa6206ff | ||
|
|
f2d4dec5a6 | ||
|
|
62fff2b37b | ||
|
|
fe2064d5b9 | ||
|
|
c2419ad58d | ||
|
|
6b99f44475 | ||
|
|
eee5aa3060 | ||
|
|
948bc0e138 | ||
|
|
deb7a7da46 | ||
|
|
90fb9919f4 | ||
|
|
11ed061136 | ||
|
|
c98d437c0d | ||
|
|
9c53c7090e | ||
|
|
a86d713e8a | ||
|
|
92384bf0c6 | ||
|
|
bbe5c42e64 | ||
|
|
9791061ca2 | ||
|
|
f87d7a735e | ||
|
|
14055547fa | ||
|
|
9843f739db | ||
|
|
3a3a3453e7 | ||
|
|
0228b9725e | ||
|
|
385a267208 | ||
|
|
bbf217f090 | ||
|
|
f474c284f4 | ||
|
|
3967429440 | ||
|
|
29b0b0611a | ||
|
|
2a9afe8046 | ||
|
|
51b983509d | ||
|
|
36939092fb | ||
|
|
598ac0aff3 | ||
|
|
ae14e4bb3d | ||
|
|
ef52c25aa6 | ||
|
|
18d59c29ae | ||
|
|
f26ee1fb67 | ||
|
|
f82b1beaa0 | ||
|
|
e0c90207de | ||
|
|
e2d49e7c7a | ||
|
|
87b4652f92 | ||
|
|
812ab5e250 | ||
|
|
767c538bbf | ||
|
|
6dba4f60ff | ||
|
|
8e0074e580 | ||
|
|
399f19752d | ||
|
|
883972a466 | ||
|
|
5a48ce22c7 | ||
|
|
2278b396a8 | ||
|
|
54bf446cbc | ||
|
|
ecfe50be26 | ||
|
|
7ecc049fd4 | ||
|
|
7e4fa575f8 | ||
|
|
1994fa1a7e | ||
|
|
623029cc62 | ||
|
|
4076edd843 | ||
|
|
a6c015adc3 | ||
|
|
20954f7f75 | ||
|
|
315f3086f3 | ||
|
|
783e4bc227 | ||
|
|
26fdb44186 | ||
|
|
39f50a85c4 | ||
|
|
f973792142 | ||
|
|
1ad52f98b1 | ||
|
|
934a8563df | ||
|
|
034390f36c | ||
|
|
6d85f9cdf9 | ||
|
|
58d3a5285a | ||
|
|
989ca62269 | ||
|
|
13968a9723 | ||
|
|
1d0a886ec6 | ||
|
|
5798b073a1 | ||
|
|
976c901875 | ||
|
|
b8fe2ac52e | ||
|
|
4b1be560bb | ||
|
|
ee36eab4b6 | ||
|
|
c2a1a88257 | ||
|
|
3150de06ca | ||
|
|
61ef05afc8 | ||
|
|
357cc3fdc1 | ||
|
|
fa0fe29791 | ||
|
|
a1044f2f30 | ||
|
|
df670f8e13 | ||
|
|
a64b60670f | ||
|
|
473ce33fec | ||
|
|
63193e123b | ||
|
|
1e47af5b6f | ||
|
|
11f7300035 | ||
|
|
c67590a505 | ||
|
|
9e592073dd | ||
|
|
e5cdfac6b7 | ||
|
|
f7543e3aaa | ||
|
|
7a2de290cf | ||
|
|
8c49ac2a8d | ||
|
|
557ced4b75 | ||
|
|
106bde2dc6 | ||
|
|
a509b332b5 | ||
|
|
6ae687faa3 | ||
|
|
2e00bb9a31 | ||
|
|
10090a03a6 | ||
|
|
1f278e75c3 | ||
|
|
bcc256ec16 | ||
|
|
42fe8076e6 | ||
|
|
5297166d4f | ||
|
|
b89e45a4b6 | ||
|
|
060c14117c | ||
|
|
b00df8d64d | ||
|
|
4e7b679889 | ||
|
|
30950f0aaa | ||
|
|
385c336ba7 | ||
|
|
b8fae51686 | ||
|
|
c750359475 | ||
|
|
618c9c7d0c | ||
|
|
8b36869283 | ||
|
|
64c9e5f67a | ||
|
|
5dae210933 | ||
|
|
85312ed31d | ||
|
|
19db7fe4b5 | ||
|
|
38e90ce750 | ||
|
|
76f22333e6 | ||
|
|
740c141887 | ||
|
|
b00eaa2670 | ||
|
|
3a839384bb | ||
|
|
5f307788e2 | ||
|
|
ce9ab28489 | ||
|
|
3ca675fd58 | ||
|
|
09519ae210 | ||
|
|
a370b3d064 | ||
|
|
1246f5a62c | ||
|
|
164a2962b6 | ||
|
|
5f14aab942 | ||
|
|
1502b87e47 | ||
|
|
88768b9c28 | ||
|
|
94ab7f9087 | ||
|
|
e5abb36d32 | ||
|
|
91393ad80e | ||
|
|
ad6fd53398 | ||
|
|
d85e30e746 | ||
|
|
1935d85357 | ||
|
|
18f29bffa8 | ||
|
|
f0a8c1aa16 | ||
|
|
f3c8c5f389 | ||
|
|
52f7999233 | ||
|
|
173f79ca4e | ||
|
|
7ed461992e | ||
|
|
57f9e1e5c9 | ||
|
|
0bb6c89282 | ||
|
|
bfab754869 | ||
|
|
957b812f78 | ||
|
|
288978b251 | ||
|
|
9a37e6882c | ||
|
|
b2c9167eec | ||
|
|
8b7dc8ba3a | ||
|
|
7ea76ed031 | ||
|
|
f092c8fadf | ||
|
|
1001afecc8 | ||
|
|
add968510d | ||
|
|
68c891e713 | ||
|
|
2ad3a4006e | ||
|
|
cc1eb1a977 | ||
|
|
bdd881b4e7 | ||
|
|
0b4f51b32e | ||
|
|
25d98de880 | ||
|
|
7fa6d48ce4 | ||
|
|
a07827e079 | ||
|
|
7290c0ce6a | ||
|
|
cc13a92a06 | ||
|
|
0c1df4edb1 | ||
|
|
e1cf5abc32 | ||
|
|
d9551d2dcc | ||
|
|
35d12432e7 | ||
|
|
8bf86bedcf | ||
|
|
53d99cddc4 | ||
|
|
8aa5f40dfa | ||
|
|
7133b63c95 | ||
|
|
885881294d | ||
|
|
aecb7d541b | ||
|
|
db7c9c78b9 | ||
|
|
0d2e793df7 | ||
|
|
0317f3439d | ||
|
|
ae2faa7b2d | ||
|
|
fd63b2674a | ||
|
|
47b502b965 | ||
|
|
56ac2218d5 | ||
|
|
ac0801f75e | ||
|
|
0924f5c0e9 | ||
|
|
0e4389c96f | ||
|
|
61e33bda63 | ||
|
|
80b4c418ad | ||
|
|
483f9823c8 | ||
|
|
607bc7af62 | ||
|
|
905fc0fe9b | ||
|
|
e79dbfb671 | ||
|
|
217760ea68 | ||
|
|
71d78e310b | ||
|
|
b641611b86 | ||
|
|
50a8c7b1df | ||
|
|
f7a1d32bea | ||
|
|
062b0a80d3 | ||
|
|
81989243ad | ||
|
|
d37cffa9d8 | ||
|
|
bde41134f9 | ||
|
|
4497b7fb2b | ||
|
|
63dbbb8b38 | ||
|
|
64cc5c42e7 | ||
|
|
17f7cd1c2c | ||
|
|
0b66fe2535 | ||
|
|
1cc0983315 | ||
|
|
828589705d | ||
|
|
fb0b4d1504 | ||
|
|
390c987081 | ||
|
|
87f0b9fdee | ||
|
|
c83637e6fe | ||
|
|
c4b44d3038 | ||
|
|
0b1064ea7d | ||
|
|
16f5f68ff8 | ||
|
|
d2cb68506b | ||
|
|
9b290c5a8a | ||
|
|
7bac5a7101 | ||
|
|
736cf279c3 | ||
|
|
3d49cfa0e7 | ||
|
|
9e7b2d68ad | ||
|
|
2199ec324d | ||
|
|
4f3e3c8f63 | ||
|
|
585cb66534 | ||
|
|
325ea2939d | ||
|
|
1a26463bcb | ||
|
|
8401086544 | ||
|
|
5b44545fd2 | ||
|
|
71a1005720 | ||
|
|
52b2b8f6df | ||
|
|
67345e0e6d | ||
|
|
fcd84dda26 | ||
|
|
dfd4970060 | ||
|
|
256d0cd95f | ||
|
|
9d4238b236 | ||
|
|
9ba19af496 | ||
|
|
c15f359d8f | ||
|
|
7fc86af212 | ||
|
|
10c477eb09 | ||
|
|
4f4d662541 | ||
|
|
9196ba593b | ||
|
|
0c6e43c33d | ||
|
|
6514d98b2c | ||
|
|
64b502b4f2 | ||
|
|
3b0b4d1ef0 | ||
|
|
5661f0a56d | ||
|
|
1534bc53d8 | ||
|
|
ecf57ce8d2 | ||
|
|
0259eeeb5d | ||
|
|
8c989a057d | ||
|
|
3a0aa9eaa9 | ||
|
|
76e427fdb2 | ||
|
|
0a13cdec11 | ||
|
|
6ff23b461c | ||
|
|
f17ce8703d | ||
|
|
978d9ae574 | ||
|
|
399b43666f | ||
|
|
880277c473 | ||
|
|
3faceeb863 | ||
|
|
5746586532 | ||
|
|
b1deef866d | ||
|
|
fb89c1c2d8 | ||
|
|
fdda9c2db5 | ||
|
|
89cdae0456 | ||
|
|
f73a5d169a | ||
|
|
5f94a645d5 | ||
|
|
f9b6d18af4 | ||
|
|
51fff8eb42 | ||
|
|
e4809d9f90 | ||
|
|
bbcc3fdcab | ||
|
|
781e813abd | ||
|
|
8e8482b527 | ||
|
|
3e2488a9e7 | ||
|
|
2a94a2b26d | ||
|
|
51557b5ae9 | ||
|
|
1201a56169 | ||
|
|
3c32946d88 | ||
|
|
41b7678e62 | ||
|
|
1145a49108 | ||
|
|
02c547b60e | ||
|
|
46e6b87d13 | ||
|
|
1bf090238d | ||
|
|
438a7e337d | ||
|
|
4ae2f001fa | ||
|
|
effb26733e | ||
|
|
1fa4f67afd | ||
|
|
6254bb6ad2 | ||
|
|
bf6bc96437 | ||
|
|
71d1f4c701 | ||
|
|
26d5679d5d | ||
|
|
f297d411df | ||
|
|
2ad35c83c0 | ||
|
|
72c9f2115e | ||
|
|
805f884b17 | ||
|
|
26726df578 | ||
|
|
b7a0279352 | ||
|
|
f724ae8912 | ||
|
|
ab55557ddb | ||
|
|
c70dc9e93b | ||
|
|
0aaf0c5af4 | ||
|
|
29ff9be9f7 | ||
|
|
52469738d3 | ||
|
|
25d74973b0 | ||
|
|
8dd2efd090 | ||
|
|
07683b02fe | ||
|
|
a0a7d5b678 | ||
|
|
adf99597f6 | ||
|
|
52fe7952d6 | ||
|
|
aa4c5df4b7 | ||
|
|
3e34ba2227 | ||
|
|
a3de2f9bee | ||
|
|
28f6dd66d2 | ||
|
|
89fd6a960c | ||
|
|
08a28c3fd5 | ||
|
|
95ae82ff5c | ||
|
|
8b06e7d04f | ||
|
|
b1021432ec | ||
|
|
2cca514128 | ||
|
|
2e33027272 | ||
|
|
73a0b95df7 | ||
|
|
39f32a3b45 | ||
|
|
94294dd372 | ||
|
|
61e98c0e0d | ||
|
|
bb910aa280 | ||
|
|
a6c7ffd8f5 | ||
|
|
4c2124ebf4 | ||
|
|
aefe53cab1 | ||
|
|
ce3d3fa403 | ||
|
|
55a9117ecf | ||
|
|
16f352169c | ||
|
|
e5d08d2a9e | ||
|
|
3194b10e62 | ||
|
|
12c653fa7b | ||
|
|
0c32d707ab | ||
|
|
b4e2a8457f | ||
|
|
f6d7577688 | ||
|
|
c026a827c6 | ||
|
|
55421659dc | ||
|
|
1a718f3f0e | ||
|
|
68078182bf | ||
|
|
7bcbea62e9 | ||
|
|
ec66642c60 | ||
|
|
4119b6c263 | ||
|
|
adff6e66d5 | ||
|
|
1877aed36a | ||
|
|
49d9cfd5ee | ||
|
|
6867272d06 | ||
|
|
890dae3a87 | ||
|
|
9a7fa21028 | ||
|
|
50c1efadd8 | ||
|
|
83df90082a | ||
|
|
b1d7d19ed7 | ||
|
|
64de2af400 | ||
|
|
646c3e5ca5 | ||
|
|
f0be1a2d76 | ||
|
|
df8523e550 | ||
|
|
7d7b898ee6 | ||
|
|
a94de6edff | ||
|
|
6fbf85df90 | ||
|
|
dfa59e12aa | ||
|
|
5a5903ab25 | ||
|
|
fc7cdac41b | ||
|
|
68733b4ea6 | ||
|
|
9a9d58f76b | ||
|
|
3dd3e8857f | ||
|
|
b25e5192bb | ||
|
|
c18f3f67b3 | ||
|
|
e5b3136d3b | ||
|
|
554c91430b | ||
|
|
5ee1034856 | ||
|
|
dcc1f93f1c | ||
|
|
7690c1a1dd | ||
|
|
3832029be4 | ||
|
|
61ab30fe87 | ||
|
|
839eefa032 | ||
|
|
7779eb0a56 | ||
|
|
da43cf9b15 | ||
|
|
73653f894e | ||
|
|
12feb81aa1 | ||
|
|
e41b32c5cd | ||
|
|
f73d351981 | ||
|
|
5f43d5fcc1 | ||
|
|
444b3ccb9e | ||
|
|
a052d76f62 | ||
|
|
8ac65e65b5 | ||
|
|
2ec525e129 | ||
|
|
b124e441fa | ||
|
|
ff6fd3473b | ||
|
|
da110e78f0 | ||
|
|
89f609d70b | ||
|
|
9dfb2c6060 | ||
|
|
20759af979 | ||
|
|
2dbe8e4366 | ||
|
|
f94e7e05e0 | ||
|
|
aa2b618ff6 | ||
|
|
551642a987 | ||
|
|
c1c59368c1 | ||
|
|
6aa6146689 | ||
|
|
558a3cf892 | ||
|
|
659cc18243 | ||
|
|
1e5c015f99 | ||
|
|
225a8631d2 | ||
|
|
b8cd5d8bb0 | ||
|
|
9fcdafb9cc | ||
|
|
c71e06a208 | ||
|
|
77319d5ce0 | ||
|
|
80ea255a7c | ||
|
|
7dcf4db276 | ||
|
|
eac4703376 | ||
|
|
ca4482d664 | ||
|
|
b31c42e629 | ||
|
|
754dd9a440 | ||
|
|
25dc96ac27 | ||
|
|
1a03dd2a1d | ||
|
|
2136b84aae | ||
|
|
9c835e5370 | ||
|
|
0a09372f61 | ||
|
|
af1ab619e6 | ||
|
|
d07c90b6aa | ||
|
|
1b8f652d97 | ||
|
|
7817a10b5f | ||
|
|
6eeff1ab02 | ||
|
|
bc0770aa9b | ||
|
|
d737c07a10 | ||
|
|
40e28c2a85 | ||
|
|
f3f151075b | ||
|
|
79d0b01722 | ||
|
|
8ad680b57b | ||
|
|
1822556dc2 | ||
|
|
f2ca7a2c03 | ||
|
|
0940fb709c | ||
|
|
9d79f0ff2b | ||
|
|
c23d218403 | ||
|
|
8dacea0cd5 | ||
|
|
04e93a9bb4 | ||
|
|
a17c8e6dd4 | ||
|
|
4508c95dac | ||
|
|
bcc45e5d60 | ||
|
|
df83a38c61 | ||
|
|
348be98436 | ||
|
|
927a0a8995 | ||
|
|
9f8a5ad797 | ||
|
|
27b5faca11 | ||
|
|
fc72913cb5 | ||
|
|
857256b753 | ||
|
|
c2af2c9296 | ||
|
|
9525fc702d | ||
|
|
0820b5ef52 | ||
|
|
58d071c917 | ||
|
|
9650bb7d9f | ||
|
|
3c06384078 | ||
|
|
ec0f671ecf | ||
|
|
fb3c9af085 | ||
|
|
19f918d111 | ||
|
|
c22ed1e843 | ||
|
|
6aab5a14f7 | ||
|
|
c1a5f25b5b | ||
|
|
be06726777 | ||
|
|
888d38632a | ||
|
|
2f35092acf | ||
|
|
75b4240b3e | ||
|
|
b5ac4e8515 | ||
|
|
825ecc350d | ||
|
|
81d0baa321 | ||
|
|
99b198f281 | ||
|
|
99b956c319 | ||
|
|
dd1ab75d13 | ||
|
|
58e60ac36a | ||
|
|
e1596fe3a9 | ||
|
|
66a9890551 | ||
|
|
8ea26d6e62 | ||
|
|
d04aa1c4a5 | ||
|
|
536a94ca3d | ||
|
|
3713694b47 | ||
|
|
a177759d3a | ||
|
|
6e60876af8 | ||
|
|
c752e31cb4 | ||
|
|
48d5fef90a | ||
|
|
ff24cdf33a | ||
|
|
abde9a33b9 | ||
|
|
e8bc0e8c42 | ||
|
|
ca777ddf92 | ||
|
|
c90c130d05 | ||
|
|
bcb7cd5875 | ||
|
|
35fa7f63a0 | ||
|
|
85936c3cf3 | ||
|
|
61360a8313 | ||
|
|
6d29964cb3 | ||
|
|
bf67be3000 | ||
|
|
462a8565ab | ||
|
|
ab5d4329f8 | ||
|
|
e621e98595 | ||
|
|
a84ab7e549 | ||
|
|
babafd20d0 | ||
|
|
d688979d4f | ||
|
|
a0b948057e | ||
|
|
a08a9b6e11 | ||
|
|
1f43948f92 | ||
|
|
e8d91542a8 | ||
|
|
f9c1dec542 | ||
|
|
834bfbc8eb | ||
|
|
2cc1f62b0f | ||
|
|
64cf9270ed | ||
|
|
02cc49b5ab | ||
|
|
742299309b | ||
|
|
42664952a1 | ||
|
|
5aa64f156d | ||
|
|
4e4828694a | ||
|
|
4ab525fd51 | ||
|
|
d390344167 | ||
|
|
8e2b2e67b7 | ||
|
|
ea26e533c0 | ||
|
|
1852c504bf | ||
|
|
18b7f8d8e4 | ||
|
|
fa1b16293e | ||
|
|
5f7e208926 | ||
|
|
80f41b7c06 | ||
|
|
3e8df13031 | ||
|
|
5743471b68 | ||
|
|
61c22d7b22 | ||
|
|
f82c1ed901 | ||
|
|
2e10951389 | ||
|
|
81b6d710f6 | ||
|
|
c87bd6576d | ||
|
|
ca72441372 | ||
|
|
8312941547 | ||
|
|
837cd84d8c | ||
|
|
86dfc01518 | ||
|
|
bcbabb9ff7 | ||
|
|
5d97af0fc1 | ||
|
|
de6bc2fae2 | ||
|
|
8246ad066f | ||
|
|
b063b69a3a | ||
|
|
96433e00a8 | ||
|
|
02f0349010 | ||
|
|
ebd7fb169e | ||
|
|
fff393310f | ||
|
|
6eb189944a | ||
|
|
a4dfac77a4 | ||
|
|
63cd557eac | ||
|
|
cd04d2a51c | ||
|
|
a051c15bb0 | ||
|
|
85377fa4c2 | ||
|
|
19f14d1516 | ||
|
|
2912ce5223 | ||
|
|
3017c5e83f | ||
|
|
5dce5534ff | ||
|
|
6a4ba9638d | ||
|
|
10859b38af | ||
|
|
2a0cfd26a9 | ||
|
|
a44c5e4f2c | ||
|
|
c31de3cb1a | ||
|
|
d7a9e077ff | ||
|
|
ff2356e96d | ||
|
|
9baa974219 | ||
|
|
b9392b4ab7 | ||
|
|
292aa0e647 | ||
|
|
236ea2af7a | ||
|
|
ddb62591c2 | ||
|
|
24f7a15fa0 | ||
|
|
9903bc708d | ||
|
|
42e41bb122 | ||
|
|
a83b58b090 | ||
|
|
5ffc2e05c1 | ||
|
|
9649aa793b | ||
|
|
67661a188b | ||
|
|
9c4f93050e | ||
|
|
5994640826 | ||
|
|
3121cd9ca6 | ||
|
|
f383145b11 | ||
|
|
6f288bb086 | ||
|
|
94756538fd | ||
|
|
12f04343d5 | ||
|
|
a469383507 | ||
|
|
7d3559127b | ||
|
|
15fe2279c7 | ||
|
|
3a1e751f22 | ||
|
|
4899e8936b | ||
|
|
e6d146e4b8 | ||
|
|
b99c86b288 | ||
|
|
f013b1fdb8 | ||
|
|
9584ce76ac | ||
|
|
3a3e4a9554 | ||
|
|
955ea7cc9b | ||
|
|
d1a1fe2f41 | ||
|
|
25cc0cdfc6 | ||
|
|
e55adab7f9 | ||
|
|
ac0920a52b | ||
|
|
e7e99e7da8 | ||
|
|
ff7baa5135 | ||
|
|
db13ca2680 | ||
|
|
6bd63798d6 | ||
|
|
287ef10bf2 | ||
|
|
a6f012a251 | ||
|
|
7cfe3606ff | ||
|
|
1192d5b38e | ||
|
|
8f2016e8ee | ||
|
|
0828a20096 | ||
|
|
4e34f2dbe4 | ||
|
|
faa6d9e28e | ||
|
|
e17ff5e93e | ||
|
|
471f9b3701 | ||
|
|
196510aa19 | ||
|
|
af8ea7c0a3 | ||
|
|
ed15700734 | ||
|
|
977f1f6342 | ||
|
|
45a9907832 | ||
|
|
a9d86c8f62 | ||
|
|
7673fd0ec4 | ||
|
|
02a7c5c45a | ||
|
|
f7165bae4f | ||
|
|
d87cc30854 | ||
|
|
32b997d3d8 | ||
|
|
832165fc9f | ||
|
|
2efdb847a9 | ||
|
|
d8cdeee035 | ||
|
|
9db05b6945 | ||
|
|
d80e04ec66 | ||
|
|
929d548419 | ||
|
|
64b949583d | ||
|
|
de4a6babef | ||
|
|
37dfc2dda4 | ||
|
|
b7cd0d9d7d | ||
|
|
7821797aae | ||
|
|
3a5a00bab4 | ||
|
|
a6df7eeaba | ||
|
|
1942a701bf | ||
|
|
1f1b2b0236 | ||
|
|
eedadd9ba0 | ||
|
|
0dea2e48c2 | ||
|
|
f3c44319b3 | ||
|
|
86a81392de | ||
|
|
b33117997a | ||
|
|
34457f222c | ||
|
|
e3db8a5bf4 | ||
|
|
734ce74be2 | ||
|
|
5262a75d87 | ||
|
|
b7488e61b0 | ||
|
|
5210e23479 | ||
|
|
64ecdb78ad | ||
|
|
8c3e10cb5e | ||
|
|
2737f46885 | ||
|
|
dfca58c539 | ||
|
|
214a22911d | ||
|
|
c8a36e091e | ||
|
|
6c95236356 | ||
|
|
8a2e6738eb | ||
|
|
d036a413c5 | ||
|
|
d2f9113397 | ||
|
|
881836c0e8 | ||
|
|
6bdf5f2495 | ||
|
|
9b559d0a18 | ||
|
|
25022e93d3 | ||
|
|
17ddec484a | ||
|
|
a4535a9feb | ||
|
|
7b2eb67be9 | ||
|
|
1fbbd6be51 | ||
|
|
7ab06da098 | ||
|
|
c71c100efb | ||
|
|
1d4371268c | ||
|
|
66a62b36a7 | ||
|
|
c74908f4ae | ||
|
|
fde1427e44 | ||
|
|
255ecac866 | ||
|
|
f97729a8cb | ||
|
|
d6a9927435 | ||
|
|
39af7295d5 | ||
|
|
7906500259 | ||
|
|
a62cb72ca6 | ||
|
|
48f90bd944 | ||
|
|
61fca7feeb | ||
|
|
af92309090 | ||
|
|
c295ad8a64 | ||
|
|
55aaeccc36 | ||
|
|
9e3eecc9af | ||
|
|
5fe62db314 | ||
|
|
40ac9fd074 | ||
|
|
8168a12737 | ||
|
|
ef120e8313 | ||
|
|
fd200daff1 | ||
|
|
552c86c98b | ||
|
|
9b2c34b7b9 | ||
|
|
bc5002041c | ||
|
|
5767a5e19d | ||
|
|
dbc0d90158 | ||
|
|
4ce4631167 | ||
|
|
fc57be8d9d | ||
|
|
8292868a86 | ||
|
|
1b38713e30 | ||
|
|
b31e464d95 | ||
|
|
ba4825c00e | ||
|
|
50a82baaff | ||
|
|
53970a6351 | ||
|
|
a88ca881ad | ||
|
|
4216aa4605 | ||
|
|
118bed15b6 | ||
|
|
c9f46cc19f | ||
|
|
3efc997fcc | ||
|
|
6b0ab5ef37 | ||
|
|
3b1284196a | ||
|
|
58c50dc38b | ||
|
|
4980ff732a | ||
|
|
abc19f357c | ||
|
|
c6017ef418 | ||
|
|
820a82293c | ||
|
|
ddbf7a3dd7 | ||
|
|
c5946e2f08 | ||
|
|
eb9da46a83 | ||
|
|
0d0e0042de | ||
|
|
7a0d5feefc | ||
|
|
2a8a60b9ad | ||
|
|
c5463c6c20 | ||
|
|
26911f91b4 | ||
|
|
418e1fc177 | ||
|
|
0b4a761875 | ||
|
|
fdfc1b7ca6 | ||
|
|
4c7ddbcf62 | ||
|
|
07bb7dd411 | ||
|
|
38d49bf23a | ||
|
|
a037a70449 | ||
|
|
c268e8a2a7 | ||
|
|
e420f54746 | ||
|
|
ac2398d987 | ||
|
|
82d462fef7 | ||
|
|
289562e442 | ||
|
|
873775aafe | ||
|
|
941d31ce91 | ||
|
|
dd174e241d | ||
|
|
03bed1c17c | ||
|
|
e2e1868270 | ||
|
|
9ea6727743 | ||
|
|
bd1f66b411 | ||
|
|
a8ade55826 | ||
|
|
913ddf4785 | ||
|
|
c5be0b55c7 | ||
|
|
e8080fc86f | ||
|
|
579e4db42b | ||
|
|
eba352eb07 | ||
|
|
16bc8f6e5d | ||
|
|
05014a36c3 | ||
|
|
276e095d2c | ||
|
|
208f28bfd6 | ||
|
|
3f09f608a9 | ||
|
|
b5fc4cc9b2 | ||
|
|
4062d86dff | ||
|
|
b7c0624369 | ||
|
|
9697ee65f0 | ||
|
|
155ed2b669 | ||
|
|
6c4080832b | ||
|
|
882b62c25b | ||
|
|
5878686eac | ||
|
|
9b2c568db5 | ||
|
|
f87944a72a | ||
|
|
5986aee6da | ||
|
|
2ffd9210d2 | ||
|
|
de6ddc2440 | ||
|
|
70944b6352 | ||
|
|
0c9e000a4f | ||
|
|
2091cc2614 | ||
|
|
927d2bb9e6 | ||
|
|
502eb84116 | ||
|
|
1c8b8f4d6d | ||
|
|
399e8ad1db | ||
|
|
8e0a0792b8 | ||
|
|
6712181c45 | ||
|
|
940a720501 | ||
|
|
5b68300c02 | ||
|
|
5ef1d8db35 | ||
|
|
98ba6828cc | ||
|
|
f1328840d2 | ||
|
|
f2eb925120 | ||
|
|
80a293b83d | ||
|
|
831f29c963 | ||
|
|
c648c1f56b | ||
|
|
6cd03fc81b | ||
|
|
6ece751d81 | ||
|
|
7ca75be2ac | ||
|
|
d3020a39e9 | ||
|
|
46335eb722 | ||
|
|
bab6eff42f | ||
|
|
f1bec1e564 | ||
|
|
33a6b6699e | ||
|
|
fc21920a65 | ||
|
|
d4910cc370 | ||
|
|
62222e592e | ||
|
|
e52fdd51da | ||
|
|
dfe7ff348f | ||
|
|
8f79cfae66 | ||
|
|
e0253a5f15 | ||
|
|
8dbb12554c | ||
|
|
8e7c8357ac | ||
|
|
5567e3abd8 | ||
|
|
8aac4eccb1 | ||
|
|
cfd09cf9e6 | ||
|
|
cda9491ffa | ||
|
|
ffa9ca3249 | ||
|
|
b83519cdd2 | ||
|
|
51f7d1e5e1 | ||
|
|
0f089261af | ||
|
|
1041278dca | ||
|
|
b77eee9197 | ||
|
|
e5bf202d4f | ||
|
|
0e45efcfc1 | ||
|
|
af8cf554a5 | ||
|
|
3c6438c12f | ||
|
|
a8285cbc0e | ||
|
|
8fa7cbbde2 | ||
|
|
548d6a82d4 | ||
|
|
764b1d143a | ||
|
|
d59bad705f | ||
|
|
28b567ca8e | ||
|
|
cd73fb3755 | ||
|
|
772b7f948e | ||
|
|
0225a566e9 | ||
|
|
da17ded7fa | ||
|
|
823b5879eb | ||
|
|
60847b3962 | ||
|
|
0d91db0e06 | ||
|
|
3fa056f4d5 | ||
|
|
05f2b24011 | ||
|
|
2f0c3fddd3 | ||
|
|
21c8d54373 | ||
|
|
2aeb48d722 | ||
|
|
bf2802e4e4 | ||
|
|
e01071a625 | ||
|
|
4a8802a38d | ||
|
|
631ecff716 | ||
|
|
997161f862 | ||
|
|
3cbc918860 | ||
|
|
4f24cafb45 | ||
|
|
0122819f26 | ||
|
|
2b1054bf41 | ||
|
|
53d65fd430 | ||
|
|
79e0d487d0 | ||
|
|
13f740ed99 | ||
|
|
211e497a89 | ||
|
|
f04ee43425 | ||
|
|
3c9c1f1622 | ||
|
|
cc1998c1d6 | ||
|
|
223f63036c | ||
|
|
2ece201c00 | ||
|
|
fe8245fbab | ||
|
|
419d5c1316 | ||
|
|
e61c360bab | ||
|
|
d479d79c36 | ||
|
|
1bddf02180 | ||
|
|
acdd5ca9d2 | ||
|
|
09ba872c38 | ||
|
|
d790c6fd4d | ||
|
|
2b58af166a | ||
|
|
6e043a77bc | ||
|
|
aa8e0ce62e | ||
|
|
36e4b13232 | ||
|
|
63bfb423b4 | ||
|
|
cb31a0d840 | ||
|
|
ac7d437d33 | ||
|
|
d41698455e | ||
|
|
91f4dbb10a | ||
|
|
adc9892578 | ||
|
|
9ece80f6d8 | ||
|
|
78b09612e9 | ||
|
|
501df6ea8c | ||
|
|
26a83985f4 | ||
|
|
8f137f9842 | ||
|
|
c2eabf1274 | ||
|
|
5059a45aab | ||
|
|
fb1ca8ffa8 | ||
|
|
c5e6699421 | ||
|
|
297bada947 | ||
|
|
336c529fe8 | ||
|
|
de14a285a4 | ||
|
|
b428ff154f | ||
|
|
8cd858f5f5 | ||
|
|
3f66cb5c59 | ||
|
|
b18f561724 | ||
|
|
d651a3b898 | ||
|
|
d66482a115 | ||
|
|
59f25f8636 | ||
|
|
11a2c04008 | ||
|
|
d3dd19e26f | ||
|
|
8a4bfa2183 | ||
|
|
4edd43062c | ||
|
|
1523516673 | ||
|
|
8e1006d78d | ||
|
|
922ac06e2d | ||
|
|
33f2d606e7 | ||
|
|
2300e38645 | ||
|
|
d362ef9814 | ||
|
|
f3b5c507d8 | ||
|
|
f6a2a65474 | ||
|
|
e2213568f3 | ||
|
|
e18d53e7ba | ||
|
|
6f76898110 | ||
|
|
95f8f11dc4 | ||
|
|
fcf2090ffd | ||
|
|
59c90611c4 | ||
|
|
c6af5ce8b5 | ||
|
|
014f30e942 | ||
|
|
7b4288c6f4 | ||
|
|
d3263a187e | ||
|
|
f0c961aa73 | ||
|
|
2c436f94b0 | ||
|
|
2fd3214300 | ||
|
|
b33b1b3cc2 | ||
|
|
a9000a4c9d | ||
|
|
a11b2aeb4d | ||
|
|
f31d641a13 | ||
|
|
1a7e9b9fd8 | ||
|
|
2a8556df50 | ||
|
|
acf53d02a8 | ||
|
|
0e43057f0f | ||
|
|
d2d20971a2 | ||
|
|
edf99c77a2 | ||
|
|
b88ca99a47 | ||
|
|
23f214973f | ||
|
|
7b1f093012 | ||
|
|
f83f82db8a | ||
|
|
2da22041b5 | ||
|
|
2fe3961b23 | ||
|
|
b82a86e5e4 | ||
|
|
10224c1294 | ||
|
|
7e3ff84d3b | ||
|
|
4795a5e9bb | ||
|
|
83092d7c00 | ||
|
|
d1c9d4d298 | ||
|
|
69fcb1b1b4 | ||
|
|
09ccd3af42 | ||
|
|
375b64b4f8 | ||
|
|
3d3763fbc6 | ||
|
|
febccce8e3 | ||
|
|
1443b4f3fc | ||
|
|
5c1f592c17 | ||
|
|
d91a217559 | ||
|
|
565dc06c56 | ||
|
|
783ef7290a | ||
|
|
7f1efd4b84 | ||
|
|
bf5435d5b6 | ||
|
|
70560ece68 | ||
|
|
62050c2060 | ||
|
|
241bb9f6fe | ||
|
|
0274e2d527 | ||
|
|
b24be86710 | ||
|
|
ed6b46ee9a | ||
|
|
4777a7de8f | ||
|
|
e043c13019 | ||
|
|
a8537c4fa0 | ||
|
|
72163c935b | ||
|
|
0b2a32ba81 | ||
|
|
bc94dae1e4 | ||
|
|
cd8aa87f82 | ||
|
|
d1f345437b | ||
|
|
200b9e2ca6 | ||
|
|
8cd4b6f520 | ||
|
|
07148cbeb9 | ||
|
|
66b12b8809 | ||
|
|
346ee37472 | ||
|
|
db7b8e7bab | ||
|
|
b6a46ab078 | ||
|
|
6c0eaea632 | ||
|
|
c44c50b50c | ||
|
|
e2fabf924f | ||
|
|
01340bb4e9 | ||
|
|
1b91354125 | ||
|
|
105f08f7a1 | ||
|
|
c267efb76d | ||
|
|
47676ca893 | ||
|
|
3b0fb6a268 | ||
|
|
8fe1f37342 | ||
|
|
95e47d19ef | ||
|
|
7907870362 | ||
|
|
3dd0aa4806 | ||
|
|
6a0d08e09a | ||
|
|
46c9e53676 | ||
|
|
b520073176 | ||
|
|
81576fa30f | ||
|
|
c458f20adb | ||
|
|
130b832378 | ||
|
|
a48e9db30c | ||
|
|
88ecb46bce | ||
|
|
8734c62ece | ||
|
|
0f37d2f097 | ||
|
|
1f22ea7e24 | ||
|
|
8fe05b3a8c | ||
|
|
46fbe89bd4 | ||
|
|
72c8572b1e | ||
|
|
a64bbc14da | ||
|
|
e97b3e1570 | ||
|
|
6e879df2ba | ||
|
|
fedb8ec7c6 | ||
|
|
92a16965a1 | ||
|
|
958dfd9e5b | ||
|
|
b924f8de3e | ||
|
|
17f2bcc343 | ||
|
|
0d9ecd04f1 | ||
|
|
034de98202 | ||
|
|
3267ef003c | ||
|
|
5f957090fd | ||
|
|
400c848a7b | ||
|
|
b04021930f | ||
|
|
b906bc8189 | ||
|
|
1895ff855c | ||
|
|
54e443035c | ||
|
|
09b69a9423 | ||
|
|
e53bc01aa2 | ||
|
|
1513b95136 | ||
|
|
fb611c79bc | ||
|
|
6b3cdce94d | ||
|
|
d68f76b51e | ||
|
|
6ba1262347 | ||
|
|
6cc70dfe7b | ||
|
|
41933fa969 | ||
|
|
c03fea0f1a | ||
|
|
8aac573589 | ||
|
|
7b1677e120 | ||
|
|
adead7f983 | ||
|
|
7ff83d5e61 | ||
|
|
d51ae12747 | ||
|
|
a17cb4220a | ||
|
|
3251ee599b | ||
|
|
490fc7504f | ||
|
|
f2959f4d7a | ||
|
|
d7520eacf3 | ||
|
|
e17de19810 | ||
|
|
4be65505a4 | ||
|
|
918faeae44 | ||
|
|
423a727fcf | ||
|
|
1ad20e18a2 | ||
|
|
bb43c500c2 | ||
|
|
4ae01b6d4b | ||
|
|
59af571d61 | ||
|
|
355711c24c | ||
|
|
c7b6f3c554 | ||
|
|
c31528b716 | ||
|
|
655c320c3c | ||
|
|
5e915a5a3a | ||
|
|
27607493d8 | ||
|
|
b80404df5a | ||
|
|
f2d9aff338 | ||
|
|
6bc6d4931d | ||
|
|
b7bd343019 | ||
|
|
1a71059316 | ||
|
|
d9ca558f74 | ||
|
|
c9a114b38f | ||
|
|
44298673fc | ||
|
|
c9869894de | ||
|
|
41893b049d | ||
|
|
e9659f2c6e | ||
|
|
7f9e5758bc | ||
|
|
03fa10fbd1 | ||
|
|
d3d9655534 | ||
|
|
586068e874 | ||
|
|
8e69cde774 | ||
|
|
ba2da8d98c | ||
|
|
007292cbda | ||
|
|
b608921b9d | ||
|
|
8e31eb99d9 | ||
|
|
ceac5cb95a | ||
|
|
14f2c9f030 | ||
|
|
3d40ac231a | ||
|
|
baf6f50be3 | ||
|
|
d9de95ca15 | ||
|
|
2b3d2ac541 | ||
|
|
4b4c93cd94 | ||
|
|
fa4d7b22c1 | ||
|
|
3cb7f7e61f | ||
|
|
779f2ce2b5 | ||
|
|
0c4c83e5bd | ||
|
|
a369ede8d9 | ||
|
|
36ce8f885f | ||
|
|
2cde4d6f1a | ||
|
|
066c8f1247 | ||
|
|
347794b0c7 | ||
|
|
4495d0b26d | ||
|
|
b1d50e4336 | ||
|
|
cb035dd1f2 | ||
|
|
3faaca14c0 | ||
|
|
53107bc57c | ||
|
|
d38740c098 | ||
|
|
ccc18a6f66 | ||
|
|
e26cae6838 | ||
|
|
9ea53681a5 | ||
|
|
3ed087134c | ||
|
|
902355e021 | ||
|
|
32e98912df | ||
|
|
6bc49d595e | ||
|
|
6b3c0f1b10 | ||
|
|
35501431f8 | ||
|
|
27a3c9958d | ||
|
|
5b3d4ebf44 | ||
|
|
cfc064efcd | ||
|
|
4f7a64a1a2 | ||
|
|
c84cb36004 | ||
|
|
0502351002 | ||
|
|
5de420ee70 | ||
|
|
6a73275924 | ||
|
|
d12591062e | ||
|
|
3926110b33 | ||
|
|
f5975e6534 | ||
|
|
b55e2c7ac5 | ||
|
|
73fda38d71 | ||
|
|
9211292b60 | ||
|
|
f63a8da581 | ||
|
|
fd314b1b04 | ||
|
|
ea52c76595 | ||
|
|
7659e2826b | ||
|
|
8e898151f6 | ||
|
|
b2b0ad37af | ||
|
|
cee6ebe1d9 | ||
|
|
566e657fad | ||
|
|
db1f631396 | ||
|
|
426c08293d | ||
|
|
631a4452d0 | ||
|
|
9b29698b0e | ||
|
|
b5c94e9e1f | ||
|
|
384cd35d6b | ||
|
|
2d4df9149f | ||
|
|
d3c2ccbb93 | ||
|
|
c637221b92 | ||
|
|
814f01b263 | ||
|
|
b763aa57d3 | ||
|
|
54b1e69975 | ||
|
|
dacfe08033 | ||
|
|
f5aa7dc33e | ||
|
|
90c6e9876a | ||
|
|
9fa950db6a | ||
|
|
8ea627e085 | ||
|
|
536d38e3bf | ||
|
|
c10c626869 | ||
|
|
24d37bc233 | ||
|
|
158719cf46 | ||
|
|
b6327ed6c3 | ||
|
|
c60a2c6752 | ||
|
|
1f7c27d7f9 | ||
|
|
1d82458a3a | ||
|
|
25d122c3f7 | ||
|
|
627acc535e | ||
|
|
515d858b4d | ||
|
|
7ec15af47c | ||
|
|
cac58e9f88 | ||
|
|
0c28725628 | ||
|
|
084a8e708c | ||
|
|
045d50bb90 | ||
|
|
68eda19665 | ||
|
|
ae564c8428 | ||
|
|
5241ce28e0 | ||
|
|
febb880e32 | ||
|
|
d1c344b944 | ||
|
|
a19d1c325e | ||
|
|
82225338c4 | ||
|
|
fa72ab582d | ||
|
|
0b3e43c93f | ||
|
|
8b332a7795 | ||
|
|
39ab866a10 | ||
|
|
d4cdfe6994 | ||
|
|
c18592b5a3 | ||
|
|
fee924b374 | ||
|
|
6724e13c63 | ||
|
|
717de54b06 | ||
|
|
51cd214f1e | ||
|
|
da277c8593 | ||
|
|
b3cce807bb | ||
|
|
a533eb9a43 | ||
|
|
9702eae953 | ||
|
|
a4b51997ff | ||
|
|
b1274d3c76 | ||
|
|
8f8565dbfd | ||
|
|
7f4614c31c | ||
|
|
e231453778 | ||
|
|
8729804dc2 | ||
|
|
0cf237c839 | ||
|
|
ddc1f901c2 | ||
|
|
9ca27af2df | ||
|
|
082435ec8b | ||
|
|
324c5f59f4 |
@@ -0,0 +1,5 @@
|
||||
blank_issues_enabled: true
|
||||
contact_links:
|
||||
- name: Discussion or question
|
||||
url: https://github.com/microsoft/vscode-cpptools/discussions/new
|
||||
about: Please use our Discussions board to start a discussion or to ask a question.
|
||||
@@ -1,14 +1,21 @@
|
||||
---
|
||||
name: Debugger
|
||||
about: Issues pertaining to debugging such as call stack, breakpoints, watch window,
|
||||
name: Bug Report - Debugger
|
||||
about: Create a bug report for debugging such as call stack, breakpoints, watch window,
|
||||
launching or attaching to a debuggee.
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
Type: Debugger
|
||||
**Input information below**
|
||||
Bug type: Debugger
|
||||
|
||||
<!-- Prior to creating a bug report, please review:
|
||||
📝 Existing issues at https://github.com/Microsoft/vscode-cpptools/issues
|
||||
📜 Our documentation at https://code.visualstudio.com/docs/languages/cpp
|
||||
📙 FAQs at https://code.visualstudio.com/docs/cpp/faq-cpp
|
||||
-->
|
||||
|
||||
**Please review existing issues and our documentation at https://github.com/Microsoft/vscode-cpptools/tree/master/Documentation prior to filing an issue.**
|
||||
|
||||
**Describe the bug**
|
||||
- OS and Version:
|
||||
@@ -17,6 +24,7 @@ Type: Debugger
|
||||
- Other extensions you installed (and if the issue persists after disabling them):
|
||||
- A clear and concise description of what the bug is.
|
||||
|
||||
|
||||
**To Reproduce**
|
||||
*Please include a code sample and `launch.json` configuration.*
|
||||
Steps to reproduce the behavior:
|
||||
@@ -25,6 +33,7 @@ Steps to reproduce the behavior:
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
|
||||
**Additional context**
|
||||
*If applicable, please include logging by adding "logging": { "engineLogging": true, "trace": true, "traceResponse": true } in your `launch.json`*
|
||||
Add any other context about the problem here including log or error messages in your Debug Console or Output windows.
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
---
|
||||
name: Feature Request
|
||||
about: Suggest an idea for this extension.
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
Type: Feature Request
|
||||
|
||||
<!-- Prior to creating a feature request, please review
|
||||
existing issues at https://github.com/Microsoft/vscode-cpptools/issues
|
||||
to avoid creating duplicates.
|
||||
-->
|
||||
|
||||
<!-- Describe the feature you'd like. -->
|
||||
@@ -1,13 +1,20 @@
|
||||
---
|
||||
name: General Extension
|
||||
about: Issues pertaining to downloading, installing, or building the extension.
|
||||
name: Bug Report - General Extension
|
||||
about: Create a bug report for downloading, installing, or building the extension.
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
Type: General
|
||||
**Input information below**
|
||||
Bug type: General
|
||||
|
||||
<!-- Prior to creating a bug report, please review:
|
||||
📝 Existing issues at https://github.com/Microsoft/vscode-cpptools/issues
|
||||
📜 Our documentation at https://code.visualstudio.com/docs/languages/cpp
|
||||
📙 FAQs at https://code.visualstudio.com/docs/cpp/faq-cpp
|
||||
-->
|
||||
|
||||
**Please review existing issues and our documentation at https://github.com/Microsoft/vscode-cpptools/tree/master/Documentation prior to filing an issue.**
|
||||
|
||||
**Describe the bug**
|
||||
- OS and Version:
|
||||
@@ -16,6 +23,7 @@ Type: General
|
||||
- Other extensions you installed (and if the issue persists after disabling them):
|
||||
- A clear and concise description of what the bug is.
|
||||
|
||||
|
||||
**To Reproduce**
|
||||
*Please include code sample and `task.json` files.*
|
||||
Steps to reproduce the behavior:
|
||||
@@ -24,11 +32,14 @@ Steps to reproduce the behavior:
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
<!-- A clear and concise description of what you expected to happen. -->
|
||||
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
<!-- If applicable, add screenshots to help explain your problem. -->
|
||||
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here including log messages from the Output window.
|
||||
<!-- Add any other context about the problem here including log messages from the Output window. -->
|
||||
|
||||
@@ -1,39 +1,65 @@
|
||||
---
|
||||
name: Language Service
|
||||
about: 'Issues pertaining to IntelliSense, autocomplete, code editing, etc. '
|
||||
name: Bug Report - Language Service
|
||||
about: 'Create a bug report for IntelliSense, autocomplete, code editing, code navigation, etc.'
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Type: LanguageService**
|
||||
<!----- Input information below ----->
|
||||
Bug type: Language Service
|
||||
|
||||
<!--
|
||||
**Please review existing issues and our documentation at https://github.com/Microsoft/vscode-cpptools/tree/master/Documentation prior to filing an issue.**
|
||||
<!-- Prior to creating a bug report, please review:
|
||||
📝 Existing issues at https://github.com/Microsoft/vscode-cpptools/issues
|
||||
📜 Our documentation at https://code.visualstudio.com/docs/languages/cpp
|
||||
📙 FAQs at https://code.visualstudio.com/docs/cpp/faq-cpp
|
||||
-->
|
||||
|
||||
|
||||
**Describe the bug**
|
||||
- OS and Version:
|
||||
- VS Code Version:
|
||||
- C/C++ Extension Version:
|
||||
- Other extensions you installed (and if the issue persists after disabling them):
|
||||
- A clear and concise description of what the bug is.
|
||||
- If using SSH remote, specify OS of remote machine:
|
||||
- A clear and concise description of what the bug is, including information about the workspace (i.e. is the workspace a single project or multiple projects, size of the project, etc).
|
||||
|
||||
**To Reproduce**
|
||||
<!-- Steps to reproduce the behavior: -->
|
||||
<!-- *The most actionable issue reports include a code sample including configuration files such as c_cpp_properties.json* -->
|
||||
|
||||
**Steps to reproduce**
|
||||
<!-- Provide clear steps to reproduce the bug: -->
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
|
||||
**Expected behavior**
|
||||
<!-- A clear and concise description of what you expected to happen. -->
|
||||
|
||||
|
||||
**Code sample and logs**
|
||||
<!-- Please provide code sample, your c_cpp_properties.json and logs. -->
|
||||
- Code sample
|
||||
|
||||
- Configurations in `c_cpp_properties.json`
|
||||
|
||||
- Logs from running `C/C++: Log Diagnostics` from the VS Code command palette
|
||||
|
||||
- Logs from [the language server logging](https://code.visualstudio.com/docs/cpp/enable-logging-cpp#_enable-logging-for-the-language-server)
|
||||
|
||||
|
||||
**Screenshots**
|
||||
<!-- If applicable, add screenshots to help explain your problem. -->
|
||||
|
||||
|
||||
**Additional context**
|
||||
<!--
|
||||
* Call Stacks: For bugs like crashes, deadlocks, infinite loops, etc. that we are not able to repro and for which the call stack may be useful, please attach a debugger and/or create a dmp and provide the call stacks. Windows binaries have symbols available in VS Code by setting your "symbolSearchPath" to "https://msdl.microsoft.com/download/symbols".
|
||||
* Add any other context about the problem here including log messages in your Output window ("C_Cpp.loggingLevel": "Debug" in settings.json).
|
||||
Providing call stacks:
|
||||
For bugs like crashes, deadlocks, infinite loops, etc. that we are not able to repro and for which the call stack may be useful, please attach a debugger and/or create a dmp and provide the call stacks. Windows binaries have symbols available in VS Code by setting your "symbolSearchPath" to "https://msdl.microsoft.com/download/symbols".
|
||||
|
||||
Instructions for attaching debugger to language service process:
|
||||
https://github.com/microsoft/vscode-cpptools/wiki/Attaching-debugger-to-cpptools-or-cpptools%E2%80%90srv.
|
||||
|
||||
Performance analysis:
|
||||
For a performance issue see instructions at https://github.com/microsoft/vscode-cpptools/wiki/Troubleshooting-Performance-Issues.
|
||||
-->
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
# ignore dependency packages
|
||||
node_modules
|
||||
*.js.map
|
||||
@@ -0,0 +1,43 @@
|
||||
"use strict";
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Locker = void 0;
|
||||
const utils_1 = require("../common/utils");
|
||||
const ActionBase_1 = require("../common/ActionBase");
|
||||
class Locker extends ActionBase_1.ActionBase {
|
||||
constructor(github, daysSinceClose, daysSinceUpdate, labels, milestoneName, milestoneId, ignoreLabels, ignoreMilestoneNames, ignoreMilestoneIds, minimumVotes, maximumVotes) {
|
||||
super(labels, milestoneName, milestoneId, ignoreLabels, ignoreMilestoneNames, ignoreMilestoneIds, minimumVotes, maximumVotes);
|
||||
this.github = github;
|
||||
this.daysSinceClose = daysSinceClose;
|
||||
this.daysSinceUpdate = daysSinceUpdate;
|
||||
}
|
||||
async run() {
|
||||
const closedTimestamp = utils_1.daysAgoToHumanReadbleDate(this.daysSinceClose);
|
||||
const updatedTimestamp = utils_1.daysAgoToHumanReadbleDate(this.daysSinceUpdate);
|
||||
const query = this.buildQuery((this.daysSinceClose ? `closed:<${closedTimestamp} ` : "") + (this.daysSinceUpdate ? `updated:<${updatedTimestamp} ` : "") + "is:closed is:unlocked");
|
||||
for await (const page of this.github.query({ q: query })) {
|
||||
await Promise.all(page.map(async (issue) => {
|
||||
const hydrated = await issue.getIssue();
|
||||
if (!hydrated.locked && hydrated.open === false && this.validateIssue(hydrated)
|
||||
// TODO: Verify closed and updated timestamps
|
||||
) {
|
||||
console.log(`Locking issue ${hydrated.number}`);
|
||||
await issue.lockIssue();
|
||||
}
|
||||
else {
|
||||
if (hydrated.locked) {
|
||||
console.log(`Issue ${hydrated.number} is already locked. Ignoring`);
|
||||
}
|
||||
else if (hydrated.open) {
|
||||
console.log(`Issue ${hydrated.number} is open. Ignoring`);
|
||||
}
|
||||
}
|
||||
}));
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.Locker = Locker;
|
||||
//# sourceMappingURL=Locker.js.map
|
||||
@@ -0,0 +1,55 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { GitHub, Issue } from '../api/api'
|
||||
import { daysAgoToHumanReadbleDate } from '../common/utils'
|
||||
import { ActionBase } from '../common/ActionBase'
|
||||
|
||||
export class Locker extends ActionBase {
|
||||
constructor(
|
||||
private github: GitHub,
|
||||
private daysSinceClose: number,
|
||||
private daysSinceUpdate: number,
|
||||
labels?: string,
|
||||
milestoneName?: string,
|
||||
milestoneId?: string,
|
||||
ignoreLabels?: string,
|
||||
ignoreMilestoneNames?: string,
|
||||
ignoreMilestoneIds?: string,
|
||||
minimumVotes?: number,
|
||||
maximumVotes?: number
|
||||
)
|
||||
{
|
||||
super(labels, milestoneName, milestoneId, ignoreLabels, ignoreMilestoneNames, ignoreMilestoneIds, minimumVotes, maximumVotes);
|
||||
}
|
||||
|
||||
async run() {
|
||||
const closedTimestamp = daysAgoToHumanReadbleDate(this.daysSinceClose)
|
||||
const updatedTimestamp = daysAgoToHumanReadbleDate(this.daysSinceUpdate)
|
||||
|
||||
const query = this.buildQuery((this.daysSinceClose ? `closed:<${closedTimestamp} ` : "") + (this.daysSinceUpdate ? `updated:<${updatedTimestamp} ` : "") + "is:closed is:unlocked");
|
||||
|
||||
for await (const page of this.github.query({ q: query })) {
|
||||
await Promise.all(
|
||||
page.map(async (issue) => {
|
||||
const hydrated = await issue.getIssue()
|
||||
|
||||
if (!hydrated.locked && hydrated.open === false && this.validateIssue(hydrated)
|
||||
// TODO: Verify closed and updated timestamps
|
||||
) {
|
||||
console.log(`Locking issue ${hydrated.number}`)
|
||||
await issue.lockIssue()
|
||||
} else {
|
||||
if (hydrated.locked) {
|
||||
console.log(`Issue ${hydrated.number} is already locked. Ignoring`)
|
||||
} else if (hydrated.open) {
|
||||
console.log(`Issue ${hydrated.number} is open. Ignoring`)
|
||||
}
|
||||
}
|
||||
}),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
name: Locker
|
||||
description: Lock closed issues and PRs after some time has passed
|
||||
inputs:
|
||||
token:
|
||||
description: GitHub token with issue, comment, and label read/write permissions
|
||||
default: ${{ github.token }}
|
||||
daysSinceClose:
|
||||
description: Days to wait since closing before locking the item
|
||||
required: true
|
||||
daysSinceUpdate:
|
||||
description: days to wait since the last interaction before locking the item
|
||||
required: true
|
||||
milestoneName:
|
||||
description: items with these milestones will be considered (name only, must match ID)
|
||||
milestoneId:
|
||||
description: items with these milestones will be considered (id only, must match name)
|
||||
labels:
|
||||
description: items with these labels will not be considered. May be "*".
|
||||
ignoreMilestoneNames:
|
||||
description: items with these milestones will not be considered (names only, must match IDs). May be "*".
|
||||
ignoreMilestoneIds:
|
||||
description: items with these milestones will not be considered (IDs only, must match names)
|
||||
ignoreLabels:
|
||||
description: items with these labels will not be considered
|
||||
minimumVotes:
|
||||
descriptions: Only issues with at least this many votes will be considered.
|
||||
maximumVotes:
|
||||
descriptions: Only issues fewer or equal to this many votes will be considered.
|
||||
readonly:
|
||||
description: If true, changes are not applied.
|
||||
runs:
|
||||
using: 'node12'
|
||||
main: 'index.js'
|
||||
@@ -0,0 +1,20 @@
|
||||
"use strict";
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const utils_1 = require("../common/utils");
|
||||
const Locker_1 = require("./Locker");
|
||||
const Action_1 = require("../common/Action");
|
||||
class LockerAction extends Action_1.Action {
|
||||
constructor() {
|
||||
super(...arguments);
|
||||
this.id = 'Locker';
|
||||
}
|
||||
async onTriggered(github) {
|
||||
await new Locker_1.Locker(github, +utils_1.getRequiredInput('daysSinceClose'), +utils_1.getRequiredInput('daysSinceUpdate'), utils_1.getInput('labels') || undefined, utils_1.getInput('milestoneName') || undefined, utils_1.getInput('milestoneId') || undefined, utils_1.getInput('ignoreLabels') || undefined, utils_1.getInput('ignoreMilestoneNames') || undefined, utils_1.getInput('ignoreMilestoneIds') || undefined, +(utils_1.getInput('minimumVotes') || 0), +(utils_1.getInput('maximumVotes') || 9999999)).run();
|
||||
}
|
||||
}
|
||||
new LockerAction().run(); // eslint-disable-line
|
||||
//# sourceMappingURL=index.js.map
|
||||
@@ -0,0 +1,31 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { OctoKit } from '../api/octokit'
|
||||
import { getInput, getRequiredInput } from '../common/utils'
|
||||
import { Locker } from './Locker'
|
||||
import { Action } from '../common/Action'
|
||||
|
||||
class LockerAction extends Action {
|
||||
id = 'Locker'
|
||||
|
||||
async onTriggered(github: OctoKit) {
|
||||
await new Locker(
|
||||
github,
|
||||
+getRequiredInput('daysSinceClose'),
|
||||
+getRequiredInput('daysSinceUpdate'),
|
||||
getInput('labels') || undefined,
|
||||
getInput('milestoneName') || undefined,
|
||||
getInput('milestoneId') || undefined,
|
||||
getInput('ignoreLabels') || undefined,
|
||||
getInput('ignoreMilestoneNames') || undefined,
|
||||
getInput('ignoreMilestoneIds') || undefined,
|
||||
+(getInput('minimumVotes') || 0),
|
||||
+(getInput('maximumVotes') || 9999999)
|
||||
).run()
|
||||
}
|
||||
}
|
||||
|
||||
new LockerAction().run() // eslint-disable-line
|
||||
@@ -0,0 +1,72 @@
|
||||
"use strict";
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Reopener = void 0;
|
||||
const ActionBase_1 = require("../common/ActionBase");
|
||||
class Reopener extends ActionBase_1.ActionBase {
|
||||
constructor(github, alsoApplyToOpenIssues, addLabels, removeLabels, reopenComment, setMilestoneId, labels, milestoneName, milestoneId, ignoreLabels, ignoreMilestoneNames, ignoreMilestoneIds, minimumVotes, maximumVotes) {
|
||||
super(labels, milestoneName, milestoneId, ignoreLabels, ignoreMilestoneNames, ignoreMilestoneIds, minimumVotes, maximumVotes);
|
||||
this.github = github;
|
||||
this.alsoApplyToOpenIssues = alsoApplyToOpenIssues;
|
||||
this.addLabels = addLabels;
|
||||
this.removeLabels = removeLabels;
|
||||
this.reopenComment = reopenComment;
|
||||
this.setMilestoneId = setMilestoneId;
|
||||
}
|
||||
async run() {
|
||||
const addLabelsSet = this.addLabels ? this.addLabels.split(',') : [];
|
||||
const removeLabelsSet = this.removeLabels ? this.removeLabels.split(',') : [];
|
||||
console.log(`alsoApplyToOpenIssues: ${this.alsoApplyToOpenIssues}`);
|
||||
const query = this.buildQuery((this.alsoApplyToOpenIssues ? "" : "is:closed ") + "is:unlocked");
|
||||
for await (const page of this.github.query({ q: query })) {
|
||||
await Promise.all(page.map(async (issue) => {
|
||||
const hydrated = await issue.getIssue();
|
||||
if (!hydrated.locked && (this.alsoApplyToOpenIssues || hydrated.open === false) && this.validateIssue(hydrated)
|
||||
// TODO: Verify closed and updated timestamps
|
||||
) {
|
||||
if (hydrated.open === false) {
|
||||
console.log(`Reopening issue ${hydrated.number}`);
|
||||
await issue.reopenIssue();
|
||||
}
|
||||
if (this.setMilestoneId != undefined) {
|
||||
console.log(`Setting milestone of issue ${hydrated.number} to id ${+this.setMilestoneId}`);
|
||||
await issue.setMilestone(+this.setMilestoneId);
|
||||
}
|
||||
if (removeLabelsSet.length > 0) {
|
||||
for (const removeLabel of removeLabelsSet) {
|
||||
if (removeLabel && removeLabel.length > 0) {
|
||||
console.log(`Removing label on issue ${hydrated.number}: ${removeLabel}`);
|
||||
await issue.removeLabel(removeLabel);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (addLabelsSet.length > 0) {
|
||||
for (const addLabel of addLabelsSet) {
|
||||
if (addLabel && addLabel.length > 0) {
|
||||
console.log(`Adding label on issue ${hydrated.number}: ${addLabel}`);
|
||||
await issue.addLabel(addLabel);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.reopenComment) {
|
||||
console.log(`Posting comment to issue ${hydrated.number}.`);
|
||||
await issue.postComment(this.reopenComment);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (hydrated.locked) {
|
||||
console.log(`Issue ${hydrated.number} is locked. Ignoring`);
|
||||
}
|
||||
else if (!this.alsoApplyToOpenIssues && hydrated.open) {
|
||||
console.log(`Issue ${hydrated.number} is open. Ignoring`);
|
||||
}
|
||||
}
|
||||
}));
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.Reopener = Reopener;
|
||||
//# sourceMappingURL=Reopener.js.map
|
||||
@@ -0,0 +1,84 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { GitHub, Issue } from '../api/api'
|
||||
import { ActionBase } from '../common/ActionBase'
|
||||
|
||||
export class Reopener extends ActionBase {
|
||||
constructor(
|
||||
private github: GitHub,
|
||||
private alsoApplyToOpenIssues: boolean,
|
||||
private addLabels?: string,
|
||||
private removeLabels?: string,
|
||||
private reopenComment?: string,
|
||||
private setMilestoneId?: string,
|
||||
labels?: string,
|
||||
milestoneName?: string,
|
||||
milestoneId?: string,
|
||||
ignoreLabels?: string,
|
||||
ignoreMilestoneNames?: string,
|
||||
ignoreMilestoneIds?: string,
|
||||
minimumVotes?: number,
|
||||
maximumVotes?: number
|
||||
)
|
||||
{
|
||||
super(labels, milestoneName, milestoneId, ignoreLabels, ignoreMilestoneNames, ignoreMilestoneIds, minimumVotes, maximumVotes);
|
||||
}
|
||||
|
||||
async run() {
|
||||
const addLabelsSet = this.addLabels ? this.addLabels.split(',') : [];
|
||||
const removeLabelsSet = this.removeLabels ? this.removeLabels.split(',') : [];
|
||||
|
||||
console.log(`alsoApplyToOpenIssues: ${this.alsoApplyToOpenIssues}`);
|
||||
|
||||
const query = this.buildQuery((this.alsoApplyToOpenIssues ? "": "is:closed ") + "is:unlocked");
|
||||
|
||||
for await (const page of this.github.query({ q: query })) {
|
||||
await Promise.all(
|
||||
page.map(async (issue) => {
|
||||
const hydrated = await issue.getIssue()
|
||||
if (!hydrated.locked && (this.alsoApplyToOpenIssues || hydrated.open === false) && this.validateIssue(hydrated)
|
||||
// TODO: Verify closed and updated timestamps
|
||||
) {
|
||||
if (hydrated.open === false) {
|
||||
console.log(`Reopening issue ${hydrated.number}`)
|
||||
await issue.reopenIssue()
|
||||
}
|
||||
if (this.setMilestoneId != undefined) {
|
||||
console.log(`Setting milestone of issue ${hydrated.number} to id ${+this.setMilestoneId}`)
|
||||
await issue.setMilestone(+this.setMilestoneId)
|
||||
}
|
||||
if (removeLabelsSet.length > 0) {
|
||||
for (const removeLabel of removeLabelsSet) {
|
||||
if (removeLabel && removeLabel.length > 0) {
|
||||
console.log(`Removing label on issue ${hydrated.number}: ${removeLabel}`)
|
||||
await issue.removeLabel(removeLabel)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (addLabelsSet.length > 0) {
|
||||
for (const addLabel of addLabelsSet) {
|
||||
if (addLabel && addLabel.length > 0) {
|
||||
console.log(`Adding label on issue ${hydrated.number}: ${addLabel}`)
|
||||
await issue.addLabel(addLabel)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.reopenComment) {
|
||||
console.log(`Posting comment to issue ${hydrated.number}.`)
|
||||
await issue.postComment(this.reopenComment)
|
||||
}
|
||||
} else {
|
||||
if (hydrated.locked) {
|
||||
console.log(`Issue ${hydrated.number} is locked. Ignoring`)
|
||||
} else if (!this.alsoApplyToOpenIssues && hydrated.open) {
|
||||
console.log(`Issue ${hydrated.number} is open. Ignoring`)
|
||||
}
|
||||
}
|
||||
}),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
name: Locker
|
||||
description: Lock closed issues and PRs after some time has passed
|
||||
inputs:
|
||||
token:
|
||||
description: GitHub token with issue, comment, and label read/write permissions
|
||||
default: ${{ github.token }}
|
||||
alsoApplyToOpenIssues:
|
||||
description: If true, applies to issues that are already opened (to add/remove labels, etc., but not reopen).
|
||||
addLabels:
|
||||
description: Labels to add to issue as it is reopend.
|
||||
reopenComment:
|
||||
description: Comment to add upon reopening the issue.
|
||||
setMilestoneId:
|
||||
description: Milestone to set reopened issue to.
|
||||
removeLabels:
|
||||
description: Labels to remove from issue as it is reopened.
|
||||
milestoneName:
|
||||
description: items with these milestones will be considered (name only, must match ID)
|
||||
milestoneId:
|
||||
description: items with these milestones will be considered (id only, must match name)
|
||||
labels:
|
||||
description: items with these labels will not be considered. May be "*".
|
||||
ignoreMilestoneNames:
|
||||
description: items with these milestones will not be considered (names only, must match IDs). May be "*".
|
||||
ignoreMilestoneIds:
|
||||
description: items with these milestones will not be considered (IDs only, must match names)
|
||||
ignoreLabels:
|
||||
description: items with these labels will not be considered
|
||||
minimumVotes:
|
||||
descriptions: Only issues with at least this many votes will be considered.
|
||||
maximumVotes:
|
||||
descriptions: Only issues fewer or equal to this many votes will be considered.
|
||||
readonly:
|
||||
description: If true, changes are not applied.
|
||||
runs:
|
||||
using: 'node12'
|
||||
main: 'index.js'
|
||||
@@ -0,0 +1,21 @@
|
||||
"use strict";
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const utils_1 = require("../common/utils");
|
||||
const Reopener_1 = require("./Reopener");
|
||||
const Action_1 = require("../common/Action");
|
||||
class ReopenerAction extends Action_1.Action {
|
||||
constructor() {
|
||||
super(...arguments);
|
||||
this.id = 'Locker';
|
||||
}
|
||||
async onTriggered(github) {
|
||||
const alsoApplyToOpenIssues = utils_1.getInput('alsoApplyToOpenIssues');
|
||||
await new Reopener_1.Reopener(github, alsoApplyToOpenIssues != undefined && alsoApplyToOpenIssues.toLowerCase() == 'true', utils_1.getInput('addLabels') || undefined, utils_1.getInput('removeLabels') || undefined, utils_1.getInput('reopenComment') || '', utils_1.getInput('setMilestoneId') || undefined, utils_1.getInput('labels') || undefined, utils_1.getInput('milestoneName') || undefined, utils_1.getInput('milestoneId') || undefined, utils_1.getInput('ignoreLabels') || undefined, utils_1.getInput('ignoreMilestoneNames') || undefined, utils_1.getInput('ignoreMilestoneIds') || undefined, +(utils_1.getInput('minimumVotes') || 0), +(utils_1.getInput('maximumVotes') || 9999999)).run();
|
||||
}
|
||||
}
|
||||
new ReopenerAction().run(); // eslint-disable-line
|
||||
//# sourceMappingURL=index.js.map
|
||||
@@ -0,0 +1,35 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { OctoKit } from '../api/octokit'
|
||||
import { getInput, getRequiredInput } from '../common/utils'
|
||||
import { Reopener } from './Reopener'
|
||||
import { Action } from '../common/Action'
|
||||
|
||||
class ReopenerAction extends Action {
|
||||
id = 'Locker'
|
||||
|
||||
async onTriggered(github: OctoKit) {
|
||||
const alsoApplyToOpenIssues: string | undefined = getInput('alsoApplyToOpenIssues');
|
||||
await new Reopener(
|
||||
github,
|
||||
alsoApplyToOpenIssues != undefined && alsoApplyToOpenIssues.toLowerCase() == 'true',
|
||||
getInput('addLabels') || undefined,
|
||||
getInput('removeLabels') || undefined,
|
||||
getInput('reopenComment') || '',
|
||||
getInput('setMilestoneId') || undefined,
|
||||
getInput('labels') || undefined,
|
||||
getInput('milestoneName') || undefined,
|
||||
getInput('milestoneId') || undefined,
|
||||
getInput('ignoreLabels') || undefined,
|
||||
getInput('ignoreMilestoneNames') || undefined,
|
||||
getInput('ignoreMilestoneIds') || undefined,
|
||||
+(getInput('minimumVotes') || 0),
|
||||
+(getInput('maximumVotes') || 9999999)
|
||||
).run()
|
||||
}
|
||||
}
|
||||
|
||||
new ReopenerAction().run() // eslint-disable-line
|
||||
@@ -0,0 +1,106 @@
|
||||
"use strict";
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.StaleCloser = void 0;
|
||||
const ActionBase_1 = require("../common/ActionBase");
|
||||
const utils_1 = require("../common/utils");
|
||||
class StaleCloser extends ActionBase_1.ActionBase {
|
||||
constructor(github, closeDays, labels, closeComment, pingDays, pingComment, additionalTeam, addLabels, removeLabels, setMilestoneId, milestoneName, milestoneId, ignoreLabels, ignoreMilestoneNames, ignoreMilestoneIds, minimumVotes, maximumVotes, involves) {
|
||||
super(labels, milestoneName, milestoneId, ignoreLabels, ignoreMilestoneNames, ignoreMilestoneIds, minimumVotes, maximumVotes, involves);
|
||||
this.github = github;
|
||||
this.closeDays = closeDays;
|
||||
this.closeComment = closeComment;
|
||||
this.pingDays = pingDays;
|
||||
this.pingComment = pingComment;
|
||||
this.additionalTeam = additionalTeam;
|
||||
this.addLabels = addLabels;
|
||||
this.removeLabels = removeLabels;
|
||||
this.setMilestoneId = setMilestoneId;
|
||||
}
|
||||
async run() {
|
||||
const updatedTimestamp = utils_1.daysAgoToHumanReadbleDate(this.closeDays);
|
||||
const pingTimestamp = this.pingDays ? utils_1.daysAgoToTimestamp(this.pingDays) : undefined;
|
||||
const query = this.buildQuery((this.closeDays ? `updated:<${updatedTimestamp} ` : "") + "is:open is:unlocked");
|
||||
const addLabelsSet = this.addLabels ? this.addLabels.split(',') : [];
|
||||
const removeLabelsSet = this.removeLabels ? this.removeLabels.split(',') : [];
|
||||
for await (const page of this.github.query({ q: query })) {
|
||||
for (const issue of page) {
|
||||
const hydrated = await issue.getIssue();
|
||||
const lastCommentIterator = await issue.getComments(true).next();
|
||||
if (lastCommentIterator.done) {
|
||||
throw Error('Unexpected comment data');
|
||||
}
|
||||
const lastComment = lastCommentIterator.value[0];
|
||||
if (hydrated.open && this.validateIssue(hydrated)
|
||||
// TODO: Verify updated timestamp
|
||||
) {
|
||||
if (!lastComment ||
|
||||
lastComment.author.isGitHubApp ||
|
||||
pingTimestamp == undefined ||
|
||||
// TODO: List the collaborators once per go rather than checking a single user each issue
|
||||
this.additionalTeam.includes(lastComment.author.name) ||
|
||||
await issue.hasWriteAccess(lastComment.author)) {
|
||||
if (pingTimestamp != undefined) {
|
||||
if (lastComment) {
|
||||
console.log(`Last comment on issue ${hydrated.number} by ${lastComment.author.name}. Closing.`);
|
||||
}
|
||||
else {
|
||||
console.log(`No comments on issue ${hydrated.number}. Closing.`);
|
||||
}
|
||||
}
|
||||
if (this.closeComment) {
|
||||
console.log(`Posting comment on issue ${hydrated.number}`);
|
||||
await issue.postComment(this.closeComment);
|
||||
}
|
||||
if (removeLabelsSet.length > 0) {
|
||||
for (const removeLabel of removeLabelsSet) {
|
||||
if (removeLabel && removeLabel.length > 0) {
|
||||
console.log(`Removing label on issue ${hydrated.number}: ${removeLabel}`);
|
||||
await issue.removeLabel(removeLabel);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (addLabelsSet.length > 0) {
|
||||
for (const addLabel of addLabelsSet) {
|
||||
if (addLabel && addLabel.length > 0) {
|
||||
console.log(`Adding label on issue ${hydrated.number}: ${addLabel}`);
|
||||
await issue.addLabel(addLabel);
|
||||
}
|
||||
}
|
||||
}
|
||||
await issue.closeIssue();
|
||||
if (this.setMilestoneId != undefined) {
|
||||
console.log(`Setting milestone of issue ${hydrated.number} to id ${+this.setMilestoneId}`);
|
||||
await issue.setMilestone(+this.setMilestoneId);
|
||||
}
|
||||
console.log(`Closing issue ${hydrated.number}.`);
|
||||
}
|
||||
else {
|
||||
// Ping
|
||||
if (hydrated.updatedAt < pingTimestamp && hydrated.assignee) {
|
||||
console.log(`Last comment on issue ${hydrated.number} by ${lastComment.author.name}. Pinging @${hydrated.assignee}`);
|
||||
if (this.pingComment) {
|
||||
await issue.postComment(this.pingComment
|
||||
.replace('${assignee}', hydrated.assignee)
|
||||
.replace('${author}', hydrated.author.name));
|
||||
}
|
||||
}
|
||||
else {
|
||||
console.log(`Last comment on issue ${hydrated.number} by ${lastComment.author.name}. Skipping.${hydrated.assignee ? ' cc @' + hydrated.assignee : ''}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (!hydrated.open) {
|
||||
console.log(`Issue ${hydrated.number} is not open. Ignoring`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.StaleCloser = StaleCloser;
|
||||
//# sourceMappingURL=StaleCloser.js.map
|
||||
@@ -0,0 +1,128 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { GitHub } from '../api/api'
|
||||
import { ActionBase } from '../common/ActionBase'
|
||||
import { daysAgoToHumanReadbleDate, daysAgoToTimestamp } from '../common/utils'
|
||||
|
||||
export class StaleCloser extends ActionBase {
|
||||
constructor(
|
||||
private github: GitHub,
|
||||
private closeDays: number,
|
||||
labels: string,
|
||||
private closeComment: string,
|
||||
private pingDays: number,
|
||||
private pingComment: string,
|
||||
private additionalTeam: string[],
|
||||
private addLabels?: string,
|
||||
private removeLabels?: string,
|
||||
private setMilestoneId?: string,
|
||||
milestoneName?: string,
|
||||
milestoneId?: string,
|
||||
ignoreLabels?: string,
|
||||
ignoreMilestoneNames?: string,
|
||||
ignoreMilestoneIds?: string,
|
||||
minimumVotes?: number,
|
||||
maximumVotes?: number,
|
||||
involves?: string
|
||||
)
|
||||
{
|
||||
super(labels, milestoneName, milestoneId, ignoreLabels, ignoreMilestoneNames, ignoreMilestoneIds, minimumVotes, maximumVotes, involves);
|
||||
}
|
||||
|
||||
async run() {
|
||||
const updatedTimestamp = daysAgoToHumanReadbleDate(this.closeDays)
|
||||
const pingTimestamp = this.pingDays ? daysAgoToTimestamp(this.pingDays) : undefined;
|
||||
|
||||
const query = this.buildQuery((this.closeDays ? `updated:<${updatedTimestamp} ` : "") + "is:open is:unlocked");
|
||||
|
||||
const addLabelsSet = this.addLabels ? this.addLabels.split(',') : [];
|
||||
const removeLabelsSet = this.removeLabels ? this.removeLabels.split(',') : [];
|
||||
|
||||
for await (const page of this.github.query({ q: query })) {
|
||||
for (const issue of page) {
|
||||
const hydrated = await issue.getIssue()
|
||||
const lastCommentIterator = await issue.getComments(true).next()
|
||||
if (lastCommentIterator.done) {
|
||||
throw Error('Unexpected comment data')
|
||||
}
|
||||
const lastComment = lastCommentIterator.value[0]
|
||||
|
||||
if (hydrated.open && this.validateIssue(hydrated)
|
||||
// TODO: Verify updated timestamp
|
||||
) {
|
||||
if (
|
||||
!lastComment ||
|
||||
lastComment.author.isGitHubApp ||
|
||||
pingTimestamp == undefined ||
|
||||
// TODO: List the collaborators once per go rather than checking a single user each issue
|
||||
this.additionalTeam.includes(lastComment.author.name) ||
|
||||
await issue.hasWriteAccess(lastComment.author)
|
||||
) {
|
||||
if (pingTimestamp != undefined) {
|
||||
if (lastComment) {
|
||||
console.log(
|
||||
`Last comment on issue ${hydrated.number} by ${lastComment.author.name}. Closing.`,
|
||||
)
|
||||
} else {
|
||||
console.log(`No comments on issue ${hydrated.number}. Closing.`)
|
||||
}
|
||||
}
|
||||
if (this.closeComment) {
|
||||
console.log(`Posting comment on issue ${hydrated.number}`)
|
||||
await issue.postComment(this.closeComment)
|
||||
}
|
||||
if (removeLabelsSet.length > 0) {
|
||||
for (const removeLabel of removeLabelsSet) {
|
||||
if (removeLabel && removeLabel.length > 0) {
|
||||
console.log(`Removing label on issue ${hydrated.number}: ${removeLabel}`)
|
||||
await issue.removeLabel(removeLabel)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (addLabelsSet.length > 0) {
|
||||
for (const addLabel of addLabelsSet) {
|
||||
if (addLabel && addLabel.length > 0) {
|
||||
console.log(`Adding label on issue ${hydrated.number}: ${addLabel}`)
|
||||
await issue.addLabel(addLabel)
|
||||
}
|
||||
}
|
||||
}
|
||||
await issue.closeIssue()
|
||||
if (this.setMilestoneId != undefined) {
|
||||
console.log(`Setting milestone of issue ${hydrated.number} to id ${+this.setMilestoneId}`)
|
||||
await issue.setMilestone(+this.setMilestoneId)
|
||||
}
|
||||
console.log(`Closing issue ${hydrated.number}.`)
|
||||
} else {
|
||||
// Ping
|
||||
if (hydrated.updatedAt < pingTimestamp && hydrated.assignee) {
|
||||
console.log(
|
||||
`Last comment on issue ${hydrated.number} by ${lastComment.author.name}. Pinging @${hydrated.assignee}`,
|
||||
)
|
||||
if (this.pingComment) {
|
||||
await issue.postComment(
|
||||
this.pingComment
|
||||
.replace('${assignee}', hydrated.assignee)
|
||||
.replace('${author}', hydrated.author.name),
|
||||
)
|
||||
}
|
||||
} else {
|
||||
console.log(
|
||||
`Last comment on issue ${hydrated.number} by ${lastComment.author.name}. Skipping.${
|
||||
hydrated.assignee ? ' cc @' + hydrated.assignee : ''
|
||||
}`,
|
||||
)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (!hydrated.open) {
|
||||
console.log(`Issue ${hydrated.number} is not open. Ignoring`)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
name: Stale Issue Closer
|
||||
description: Close issues that are marked with a specified label and were last interacted with by a contributor or bot
|
||||
inputs:
|
||||
token:
|
||||
description: GitHub token with issue, comment, and label read/write permissions
|
||||
default: ${{ github.token }}
|
||||
closeDays:
|
||||
description: Days to wait before closing the issue
|
||||
required: true
|
||||
closeComment:
|
||||
description: Comment to add upon closing the issue
|
||||
pingDays:
|
||||
description: Days to wait before pinging the assignee, if any. If set, issue is not closed if there is an assignee.
|
||||
additionalTeam:
|
||||
description: Pipe-separated list of additional users to treat as team members
|
||||
pingComment:
|
||||
description: Comment to add when pinging assignee. ${assignee} and ${author} are replaced.
|
||||
milestoneName:
|
||||
description: items with these milestones will be considered (name only, must match ID)
|
||||
milestoneId:
|
||||
description: items with these milestones will be considered (id only, must match name)
|
||||
labels:
|
||||
description: items with these labels will not be considered. May be "*".
|
||||
required: true
|
||||
ignoreMilestoneNames:
|
||||
description: items with these milestones will not be considered (names only, must match IDs). May be "*".
|
||||
ignoreMilestoneIds:
|
||||
description: items with these milestones will not be considered (IDs only, must match names)
|
||||
ignoreLabels:
|
||||
description: items with these labels will not be considered
|
||||
addLabels:
|
||||
description: Labels to add to issue as it is closed.
|
||||
removeLabels:
|
||||
description: Labels to remove from issue as it is closed.
|
||||
setMilestoneId:
|
||||
description: Milestone to set closed issue to.
|
||||
minimumVotes:
|
||||
descriptions: Only issues with at least this many votes will be considered.
|
||||
maximumVotes:
|
||||
descriptions: Only issues fewer or equal to this many votes will be considered.
|
||||
involves:
|
||||
descriptions: Qualifier to find issues that in some way involve a certain user either as an author, assignee, or mentions.
|
||||
readonly:
|
||||
description: If true, changes are not applied.
|
||||
runs:
|
||||
using: 'node12'
|
||||
main: 'index.js'
|
||||
@@ -0,0 +1,21 @@
|
||||
"use strict";
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const utils_1 = require("../common/utils");
|
||||
const StaleCloser_1 = require("./StaleCloser");
|
||||
const Action_1 = require("../common/Action");
|
||||
class StaleCloserAction extends Action_1.Action {
|
||||
constructor() {
|
||||
super(...arguments);
|
||||
this.id = 'StaleCloser';
|
||||
}
|
||||
async onTriggered(github) {
|
||||
var _a;
|
||||
await new StaleCloser_1.StaleCloser(github, +utils_1.getRequiredInput('closeDays'), utils_1.getRequiredInput('labels'), utils_1.getInput('closeComment') || '', +(utils_1.getInput('pingDays') || 0), utils_1.getInput('pingComment') || '', ((_a = utils_1.getInput('additionalTeam')) !== null && _a !== void 0 ? _a : '').split(','), utils_1.getInput('addLabels') || undefined, utils_1.getInput('removeLabels') || undefined, utils_1.getInput('setMilestoneId') || undefined, utils_1.getInput('milestoneName') || undefined, utils_1.getInput('milestoneId') || undefined, utils_1.getInput('ignoreLabels') || undefined, utils_1.getInput('ignoreMilestoneNames') || undefined, utils_1.getInput('ignoreMilestoneIds') || undefined, +(utils_1.getInput('minimumVotes') || 0), +(utils_1.getInput('maximumVotes') || 9999999), utils_1.getInput('involves') || undefined).run();
|
||||
}
|
||||
}
|
||||
new StaleCloserAction().run(); // eslint-disable-line
|
||||
//# sourceMappingURL=index.js.map
|
||||
@@ -0,0 +1,38 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { OctoKit } from '../api/octokit'
|
||||
import { getInput, getRequiredInput } from '../common/utils'
|
||||
import { StaleCloser } from './StaleCloser'
|
||||
import { Action } from '../common/Action'
|
||||
|
||||
class StaleCloserAction extends Action {
|
||||
id = 'StaleCloser'
|
||||
|
||||
async onTriggered(github: OctoKit) {
|
||||
await new StaleCloser(
|
||||
github,
|
||||
+getRequiredInput('closeDays'),
|
||||
getRequiredInput('labels'),
|
||||
getInput('closeComment') || '',
|
||||
+(getInput('pingDays') || 0),
|
||||
getInput('pingComment') || '',
|
||||
(getInput('additionalTeam') ?? '').split(','),
|
||||
getInput('addLabels') || undefined,
|
||||
getInput('removeLabels') || undefined,
|
||||
getInput('setMilestoneId') || undefined,
|
||||
getInput('milestoneName') || undefined,
|
||||
getInput('milestoneId') || undefined,
|
||||
getInput('ignoreLabels') || undefined,
|
||||
getInput('ignoreMilestoneNames') || undefined,
|
||||
getInput('ignoreMilestoneIds') || undefined,
|
||||
+(getInput('minimumVotes') || 0),
|
||||
+(getInput('maximumVotes') || 9999999),
|
||||
getInput('involves') || undefined
|
||||
).run()
|
||||
}
|
||||
}
|
||||
|
||||
new StaleCloserAction().run() // eslint-disable-line
|
||||
@@ -0,0 +1,7 @@
|
||||
"use strict";
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
//# sourceMappingURL=api.js.map
|
||||
@@ -0,0 +1,100 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
export interface GitHub {
|
||||
query(query: Query): AsyncIterableIterator<GitHubIssue[]>
|
||||
|
||||
hasWriteAccess(user: User): Promise<boolean>
|
||||
|
||||
repoHasLabel(label: string): Promise<boolean>
|
||||
createLabel(label: string, color: string, description: string): Promise<void>
|
||||
deleteLabel(label: string): Promise<void>
|
||||
|
||||
readConfig(path: string): Promise<any>
|
||||
|
||||
dispatch(title: string): Promise<void>
|
||||
|
||||
createIssue(owner: string, repo: string, title: string, body: string): Promise<void>
|
||||
|
||||
releaseContainsCommit(release: string, commit: string): Promise<'yes' | 'no' | 'unknown'>
|
||||
}
|
||||
|
||||
export interface GitHubIssue extends GitHub {
|
||||
getIssue(): Promise<Issue>
|
||||
|
||||
postComment(body: string): Promise<void>
|
||||
deleteComment(id: number): Promise<void>
|
||||
getComments(last?: boolean): AsyncIterableIterator<Comment[]>
|
||||
|
||||
closeIssue(): Promise<void>
|
||||
lockIssue(): Promise<void>
|
||||
reopenIssue(): Promise<void>
|
||||
|
||||
setMilestone(milestoneId: number): Promise<void>
|
||||
|
||||
addLabel(label: string): Promise<void>
|
||||
removeLabel(label: string): Promise<void>
|
||||
|
||||
addAssignee(assignee: string): Promise<void>
|
||||
removeAssignee(assignee: string): Promise<void>
|
||||
|
||||
getClosingInfo(): Promise<{ hash: string | undefined; timestamp: number } | undefined>
|
||||
}
|
||||
|
||||
type SortVar =
|
||||
| 'comments'
|
||||
| 'reactions'
|
||||
| 'reactions-+1'
|
||||
| 'reactions--1'
|
||||
| 'reactions-smile'
|
||||
| 'reactions-thinking_face'
|
||||
| 'reactions-heart'
|
||||
| 'reactions-tada'
|
||||
| 'interactions'
|
||||
| 'created'
|
||||
| 'updated'
|
||||
type SortOrder = 'asc' | 'desc'
|
||||
export type Reactions = {
|
||||
'+1': number
|
||||
'-1': number
|
||||
laugh: number
|
||||
hooray: number
|
||||
confused: number
|
||||
heart: number
|
||||
rocket: number
|
||||
eyes: number
|
||||
}
|
||||
|
||||
export interface User {
|
||||
name: string
|
||||
isGitHubApp?: boolean
|
||||
}
|
||||
export interface Comment {
|
||||
author: User
|
||||
body: string
|
||||
id: number
|
||||
timestamp: number
|
||||
}
|
||||
export interface Issue {
|
||||
author: User
|
||||
body: string
|
||||
title: string
|
||||
labels: string[]
|
||||
open: boolean
|
||||
locked: boolean
|
||||
number: number
|
||||
numComments: number
|
||||
reactions: Reactions
|
||||
milestoneId: number | null
|
||||
assignee?: string
|
||||
createdAt: number
|
||||
updatedAt: number
|
||||
closedAt?: number
|
||||
}
|
||||
export interface Query {
|
||||
q: string
|
||||
sort?: SortVar
|
||||
order?: SortOrder
|
||||
}
|
||||
@@ -0,0 +1,405 @@
|
||||
"use strict";
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.OctoKitIssue = exports.OctoKit = exports.getNumRequests = void 0;
|
||||
const core_1 = require("@actions/core");
|
||||
const github_1 = require("@actions/github");
|
||||
const child_process_1 = require("child_process");
|
||||
let numRequests = 0;
|
||||
exports.getNumRequests = () => numRequests;
|
||||
class OctoKit {
|
||||
constructor(token, params, options = { readonly: false }) {
|
||||
this.token = token;
|
||||
this.params = params;
|
||||
this.options = options;
|
||||
// when in readonly mode, record labels just-created so at to not throw unneccesary errors
|
||||
this.mockLabels = new Set();
|
||||
this.writeAccessCache = {};
|
||||
this._octokit = new github_1.GitHub(token);
|
||||
}
|
||||
get octokit() {
|
||||
numRequests++;
|
||||
return this._octokit;
|
||||
}
|
||||
// TODO: just iterate over the issues in a page here instead of making caller do it
|
||||
async *query(query) {
|
||||
const q = query.q + ` repo:${this.params.owner}/${this.params.repo}`;
|
||||
console.log(`Querying for ${q}:`);
|
||||
const options = this.octokit.search.issuesAndPullRequests.endpoint.merge({
|
||||
...query,
|
||||
q,
|
||||
per_page: 100,
|
||||
headers: { Accept: 'application/vnd.github.squirrel-girl-preview+json' },
|
||||
});
|
||||
let pageNum = 0;
|
||||
const timeout = async () => {
|
||||
if (pageNum < 2) {
|
||||
/* pass */
|
||||
}
|
||||
else if (pageNum < 4) {
|
||||
await new Promise((resolve) => setTimeout(resolve, 3000));
|
||||
}
|
||||
else {
|
||||
await new Promise((resolve) => setTimeout(resolve, 30000));
|
||||
}
|
||||
};
|
||||
for await (const pageResponse of this.octokit.paginate.iterator(options)) {
|
||||
await timeout();
|
||||
numRequests++;
|
||||
const page = pageResponse.data;
|
||||
console.log(`Page ${++pageNum}: ${page.map(({ number }) => number).join(' ')}`);
|
||||
yield page.map((issue) => new OctoKitIssue(this.token, this.params, this.octokitIssueToIssue(issue), this.options));
|
||||
}
|
||||
}
|
||||
async createIssue(owner, repo, title, body) {
|
||||
core_1.debug(`Creating issue \`${title}\` on ${owner}/${repo}`);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.create({ owner, repo, title, body });
|
||||
}
|
||||
octokitIssueToIssue(issue) {
|
||||
var _a, _b, _c, _d, _e, _f;
|
||||
return {
|
||||
author: { name: issue.user.login, isGitHubApp: issue.user.type === 'Bot' },
|
||||
body: issue.body,
|
||||
number: issue.number,
|
||||
title: issue.title,
|
||||
labels: issue.labels.map((label) => label.name),
|
||||
open: issue.state === 'open',
|
||||
locked: issue.locked,
|
||||
numComments: issue.comments,
|
||||
reactions: issue.reactions,
|
||||
assignee: (_b = (_a = issue.assignee) === null || _a === void 0 ? void 0 : _a.login) !== null && _b !== void 0 ? _b : (_d = (_c = issue.assignees) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.login,
|
||||
milestoneId: (_f = (_e = issue.milestone) === null || _e === void 0 ? void 0 : _e.number) !== null && _f !== void 0 ? _f : null,
|
||||
createdAt: +new Date(issue.created_at),
|
||||
updatedAt: +new Date(issue.updated_at),
|
||||
closedAt: issue.closed_at ? +new Date(issue.closed_at) : undefined,
|
||||
};
|
||||
}
|
||||
async hasWriteAccess(user) {
|
||||
if (user.name in this.writeAccessCache) {
|
||||
core_1.debug('Got permissions from cache for ' + user);
|
||||
return this.writeAccessCache[user.name];
|
||||
}
|
||||
core_1.debug('Fetching permissions for ' + user);
|
||||
const permissions = (await this.octokit.repos.getCollaboratorPermissionLevel({
|
||||
...this.params,
|
||||
username: user.name,
|
||||
})).data.permission;
|
||||
return (this.writeAccessCache[user.name] = permissions === 'admin' || permissions === 'write');
|
||||
}
|
||||
async repoHasLabel(name) {
|
||||
try {
|
||||
await this.octokit.issues.getLabel({ ...this.params, name });
|
||||
return true;
|
||||
}
|
||||
catch (err) {
|
||||
if (err.status === 404) {
|
||||
return this.options.readonly && this.mockLabels.has(name);
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
async createLabel(name, color, description) {
|
||||
core_1.debug('Creating label ' + name);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.createLabel({ ...this.params, color, description, name });
|
||||
else
|
||||
this.mockLabels.add(name);
|
||||
}
|
||||
async deleteLabel(name) {
|
||||
core_1.debug('Deleting label ' + name);
|
||||
try {
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.deleteLabel({ ...this.params, name });
|
||||
}
|
||||
catch (err) {
|
||||
if (err.status === 404) {
|
||||
return;
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
async readConfig(path) {
|
||||
core_1.debug('Reading config at ' + path);
|
||||
const repoPath = `.github/${path}.json`;
|
||||
try {
|
||||
const data = (await this.octokit.repos.getContents({ ...this.params, path: repoPath })).data;
|
||||
if ('type' in data && data.type === 'file') {
|
||||
if (data.encoding === 'base64' && data.content) {
|
||||
return JSON.parse(Buffer.from(data.content, 'base64').toString('utf-8'));
|
||||
}
|
||||
throw Error(`Could not read contents "${data.content}" in encoding "${data.encoding}"`);
|
||||
}
|
||||
throw Error('Found directory at config path when expecting file' + JSON.stringify(data));
|
||||
}
|
||||
catch (e) {
|
||||
throw Error('Error with config file at ' + repoPath + ': ' + JSON.stringify(e));
|
||||
}
|
||||
}
|
||||
async releaseContainsCommit(release, commit) {
|
||||
return new Promise((resolve, reject) => child_process_1.exec(`git -C ./repo merge-base --is-ancestor ${commit} ${release}`, (err) => {
|
||||
if (!err || err.code === 1) {
|
||||
resolve(!err ? 'yes' : 'no');
|
||||
}
|
||||
else if (err.message.includes(`Not a valid commit name ${release}`)) {
|
||||
// release branch is forked. Probably in endgame. Not released.
|
||||
resolve('no');
|
||||
}
|
||||
else if (err.message.includes(`Not a valid commit name ${commit}`)) {
|
||||
// commit is probably in a different repo.
|
||||
resolve('unknown');
|
||||
}
|
||||
else {
|
||||
reject(err);
|
||||
}
|
||||
}));
|
||||
}
|
||||
async dispatch(title) {
|
||||
core_1.debug('Dispatching ' + title);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.repos.createDispatchEvent({ ...this.params, event_type: title });
|
||||
}
|
||||
}
|
||||
exports.OctoKit = OctoKit;
|
||||
class OctoKitIssue extends OctoKit {
|
||||
constructor(token, params, issueData, options = { readonly: false }) {
|
||||
super(token, params, options);
|
||||
this.params = params;
|
||||
this.issueData = issueData;
|
||||
console.log('running bot on issue', issueData.number);
|
||||
}
|
||||
async addAssignee(assignee) {
|
||||
core_1.debug('Adding assignee ' + assignee + ' to ' + this.issueData.number);
|
||||
if (!this.options.readonly) {
|
||||
await this.octokit.issues.addAssignees({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
assignees: [assignee],
|
||||
});
|
||||
}
|
||||
}
|
||||
async removeAssignee(assignee) {
|
||||
core_1.debug('Removing assignee ' + assignee + ' to ' + this.issueData.number);
|
||||
if (!this.options.readonly) {
|
||||
await this.octokit.issues.removeAssignees({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
assignees: [assignee],
|
||||
});
|
||||
}
|
||||
}
|
||||
async closeIssue() {
|
||||
core_1.debug('Closing issue ' + this.issueData.number);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.update({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
state: 'closed',
|
||||
});
|
||||
}
|
||||
async reopenIssue() {
|
||||
core_1.debug('Reopening issue ' + this.issueData.number);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.update({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
state: 'open',
|
||||
});
|
||||
}
|
||||
async lockIssue() {
|
||||
core_1.debug('Locking issue ' + this.issueData.number);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.lock({ ...this.params, issue_number: this.issueData.number });
|
||||
}
|
||||
async getIssue() {
|
||||
if (isIssue(this.issueData)) {
|
||||
core_1.debug('Got issue data from query result ' + this.issueData.number);
|
||||
return this.issueData;
|
||||
}
|
||||
console.log('Fetching issue ' + this.issueData.number);
|
||||
const issue = (await this.octokit.issues.get({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
mediaType: { previews: ['squirrel-girl'] },
|
||||
})).data;
|
||||
return (this.issueData = this.octokitIssueToIssue(issue));
|
||||
}
|
||||
async postComment(body) {
|
||||
core_1.debug(`Posting comment ${body} on ${this.issueData.number}`);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.createComment({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
body,
|
||||
});
|
||||
}
|
||||
async deleteComment(id) {
|
||||
core_1.debug(`Deleting comment ${id} on ${this.issueData.number}`);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.deleteComment({
|
||||
owner: this.params.owner,
|
||||
repo: this.params.repo,
|
||||
comment_id: id,
|
||||
});
|
||||
}
|
||||
async setMilestone(milestoneId) {
|
||||
core_1.debug(`Setting milestone for ${this.issueData.number} to ${milestoneId}`);
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.update({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
milestone: milestoneId,
|
||||
});
|
||||
}
|
||||
async *getComments(last) {
|
||||
core_1.debug('Fetching comments for ' + this.issueData.number);
|
||||
const response = this.octokit.paginate.iterator(this.octokit.issues.listComments.endpoint.merge({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
per_page: 100,
|
||||
...(last ? { per_page: 1, page: (await this.getIssue()).numComments } : {}),
|
||||
}));
|
||||
for await (const page of response) {
|
||||
numRequests++;
|
||||
yield page.data.map((comment) => ({
|
||||
author: { name: comment.user.login, isGitHubApp: comment.user.type === 'Bot' },
|
||||
body: comment.body,
|
||||
id: comment.id,
|
||||
timestamp: +new Date(comment.created_at),
|
||||
}));
|
||||
}
|
||||
}
|
||||
async addLabel(name) {
|
||||
core_1.debug(`Adding label ${name} to ${this.issueData.number}`);
|
||||
if (!(await this.repoHasLabel(name))) {
|
||||
throw Error(`Action could not execute becuase label ${name} is not defined.`);
|
||||
}
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.addLabels({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
labels: [name],
|
||||
});
|
||||
}
|
||||
async getAssigner(assignee) {
|
||||
const options = this.octokit.issues.listEventsForTimeline.endpoint.merge({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
});
|
||||
let assigner;
|
||||
for await (const event of this.octokit.paginate.iterator(options)) {
|
||||
numRequests++;
|
||||
const timelineEvents = event.data;
|
||||
for (const timelineEvent of timelineEvents) {
|
||||
if (timelineEvent.event === 'assigned' &&
|
||||
timelineEvent.assignee.login === assignee) {
|
||||
assigner = timelineEvent.actor.login;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!assigner) {
|
||||
throw Error('Expected to find ' + assignee + ' in issue timeline but did not.');
|
||||
}
|
||||
return assigner;
|
||||
}
|
||||
async removeLabel(name) {
|
||||
core_1.debug(`Removing label ${name} from ${this.issueData.number}`);
|
||||
try {
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.removeLabel({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
name,
|
||||
});
|
||||
}
|
||||
catch (err) {
|
||||
if (err.status === 404) {
|
||||
console.log(`Label ${name} not found on issue`);
|
||||
return;
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
async getClosingInfo(alreadyChecked = []) {
|
||||
var _a, _b, _c, _d, _e, _f, _g;
|
||||
if (alreadyChecked.includes(this.issueData.number)) {
|
||||
return undefined;
|
||||
}
|
||||
alreadyChecked.push(this.issueData.number);
|
||||
if ((await this.getIssue()).open) {
|
||||
return;
|
||||
}
|
||||
const closingHashComment = /(?:\\|\/)closedWith (\S*)/;
|
||||
const options = this.octokit.issues.listEventsForTimeline.endpoint.merge({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
});
|
||||
let closingCommit;
|
||||
const crossReferencing = [];
|
||||
for await (const event of this.octokit.paginate.iterator(options)) {
|
||||
numRequests++;
|
||||
const timelineEvents = event.data;
|
||||
for (const timelineEvent of timelineEvents) {
|
||||
if ((timelineEvent.event === 'closed' || timelineEvent.event === 'merged') &&
|
||||
timelineEvent.commit_id &&
|
||||
timelineEvent.commit_url
|
||||
.toLowerCase()
|
||||
.includes(`/${this.params.owner}/${this.params.repo}/`.toLowerCase())) {
|
||||
closingCommit = {
|
||||
hash: timelineEvent.commit_id,
|
||||
timestamp: +new Date(timelineEvent.created_at),
|
||||
};
|
||||
}
|
||||
if (timelineEvent.event === 'reopened') {
|
||||
closingCommit = undefined;
|
||||
}
|
||||
if (timelineEvent.event === 'commented' &&
|
||||
!((_a = timelineEvent.body) === null || _a === void 0 ? void 0 : _a.includes('UNABLE_TO_LOCATE_COMMIT_MESSAGE')) &&
|
||||
closingHashComment.test(timelineEvent.body)) {
|
||||
closingCommit = {
|
||||
hash: closingHashComment.exec(timelineEvent.body)[1],
|
||||
timestamp: +new Date(timelineEvent.created_at),
|
||||
};
|
||||
}
|
||||
if (timelineEvent.event === 'cross-referenced' && ((_c = (_b = timelineEvent.source) === null || _b === void 0 ? void 0 : _b.issue) === null || _c === void 0 ? void 0 : _c.number) && ((_f = (_e = (_d = timelineEvent.source) === null || _d === void 0 ? void 0 : _d.issue) === null || _e === void 0 ? void 0 : _e.pull_request) === null || _f === void 0 ? void 0 : _f.url.includes(`/${this.params.owner}/${this.params.repo}/`.toLowerCase()))) {
|
||||
crossReferencing.push(timelineEvent.source.issue.number);
|
||||
}
|
||||
}
|
||||
}
|
||||
// If we dont have any closing info, try to get it from linked issues (PRs).
|
||||
// If there's a linked issue that was closed at almost the same time, guess it was a PR that closed this.
|
||||
if (!closingCommit) {
|
||||
for (const id of crossReferencing.reverse()) {
|
||||
const closed = await new OctoKitIssue(this.token, this.params, {
|
||||
number: id,
|
||||
}, this.options).getClosingInfo(alreadyChecked);
|
||||
if (closed) {
|
||||
if (Math.abs(closed.timestamp - ((_g = (await this.getIssue()).closedAt) !== null && _g !== void 0 ? _g : 0)) < 5000) {
|
||||
closingCommit = closed;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
console.log(`Got ${JSON.stringify(closingCommit)} as closing commit of ${this.issueData.number}`);
|
||||
return closingCommit;
|
||||
}
|
||||
}
|
||||
exports.OctoKitIssue = OctoKitIssue;
|
||||
function isIssue(object) {
|
||||
const isIssue = 'author' in object &&
|
||||
'body' in object &&
|
||||
'title' in object &&
|
||||
'labels' in object &&
|
||||
'open' in object &&
|
||||
'locked' in object &&
|
||||
'number' in object &&
|
||||
'numComments' in object &&
|
||||
'reactions' in object &&
|
||||
'milestoneId' in object;
|
||||
return isIssue;
|
||||
}
|
||||
//# sourceMappingURL=octokit.js.map
|
||||
@@ -0,0 +1,470 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { debug } from '@actions/core'
|
||||
import { GitHub as GitHubAPI } from '@actions/github'
|
||||
import { Octokit } from '@octokit/rest'
|
||||
import { exec } from 'child_process'
|
||||
import { Comment, GitHub, GitHubIssue, Issue, Query, User } from './api'
|
||||
|
||||
let numRequests = 0
|
||||
export const getNumRequests = () => numRequests
|
||||
|
||||
export class OctoKit implements GitHub {
|
||||
private _octokit: GitHubAPI
|
||||
protected get octokit(): GitHubAPI {
|
||||
numRequests++
|
||||
return this._octokit
|
||||
}
|
||||
|
||||
// when in readonly mode, record labels just-created so at to not throw unneccesary errors
|
||||
protected mockLabels: Set<string> = new Set()
|
||||
|
||||
constructor(
|
||||
protected token: string,
|
||||
protected params: { repo: string; owner: string },
|
||||
protected options: { readonly: boolean } = { readonly: false },
|
||||
) {
|
||||
this._octokit = new GitHubAPI(token)
|
||||
}
|
||||
|
||||
// TODO: just iterate over the issues in a page here instead of making caller do it
|
||||
async *query(query: Query): AsyncIterableIterator<GitHubIssue[]> {
|
||||
const q = query.q + ` repo:${this.params.owner}/${this.params.repo}`
|
||||
console.log(`Querying for ${q}:`)
|
||||
|
||||
const options = this.octokit.search.issuesAndPullRequests.endpoint.merge({
|
||||
...query,
|
||||
q,
|
||||
per_page: 100,
|
||||
headers: { Accept: 'application/vnd.github.squirrel-girl-preview+json' },
|
||||
})
|
||||
|
||||
let pageNum = 0
|
||||
|
||||
const timeout = async () => {
|
||||
if (pageNum < 2) {
|
||||
/* pass */
|
||||
} else if (pageNum < 4) {
|
||||
await new Promise((resolve) => setTimeout(resolve, 3000))
|
||||
} else {
|
||||
await new Promise((resolve) => setTimeout(resolve, 30000))
|
||||
}
|
||||
}
|
||||
|
||||
for await (const pageResponse of this.octokit.paginate.iterator(options)) {
|
||||
await timeout()
|
||||
numRequests++
|
||||
const page: Array<Octokit.SearchIssuesAndPullRequestsResponseItemsItem> = pageResponse.data
|
||||
console.log(`Page ${++pageNum}: ${page.map(({ number }) => number).join(' ')}`)
|
||||
yield page.map(
|
||||
(issue) => new OctoKitIssue(this.token, this.params, this.octokitIssueToIssue(issue), this.options),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
async createIssue(owner: string, repo: string, title: string, body: string): Promise<void> {
|
||||
debug(`Creating issue \`${title}\` on ${owner}/${repo}`)
|
||||
if (!this.options.readonly) await this.octokit.issues.create({ owner, repo, title, body })
|
||||
}
|
||||
|
||||
protected octokitIssueToIssue(
|
||||
issue: Octokit.IssuesGetResponse | Octokit.SearchIssuesAndPullRequestsResponseItemsItem,
|
||||
): Issue {
|
||||
return {
|
||||
author: { name: issue.user.login, isGitHubApp: issue.user.type === 'Bot' },
|
||||
body: issue.body,
|
||||
number: issue.number,
|
||||
title: issue.title,
|
||||
labels: (issue.labels as Octokit.IssuesGetLabelResponse[]).map((label) => label.name),
|
||||
open: issue.state === 'open',
|
||||
locked: (issue as any).locked,
|
||||
numComments: issue.comments,
|
||||
reactions: (issue as any).reactions,
|
||||
assignee: issue.assignee?.login ?? (issue as any).assignees?.[0]?.login,
|
||||
milestoneId: issue.milestone?.number ?? null,
|
||||
createdAt: +new Date(issue.created_at),
|
||||
updatedAt: +new Date(issue.updated_at),
|
||||
closedAt: issue.closed_at ? +new Date((issue.closed_at as unknown) as string) : undefined,
|
||||
}
|
||||
}
|
||||
|
||||
private writeAccessCache: Record<string, boolean> = {}
|
||||
async hasWriteAccess(user: User): Promise<boolean> {
|
||||
if (user.name in this.writeAccessCache) {
|
||||
debug('Got permissions from cache for ' + user)
|
||||
return this.writeAccessCache[user.name]
|
||||
}
|
||||
debug('Fetching permissions for ' + user)
|
||||
const permissions = (
|
||||
await this.octokit.repos.getCollaboratorPermissionLevel({
|
||||
...this.params,
|
||||
username: user.name,
|
||||
})
|
||||
).data.permission
|
||||
return (this.writeAccessCache[user.name] = permissions === 'admin' || permissions === 'write')
|
||||
}
|
||||
|
||||
async repoHasLabel(name: string): Promise<boolean> {
|
||||
try {
|
||||
await this.octokit.issues.getLabel({ ...this.params, name })
|
||||
return true
|
||||
} catch (err) {
|
||||
if (err.status === 404) {
|
||||
return this.options.readonly && this.mockLabels.has(name)
|
||||
}
|
||||
throw err
|
||||
}
|
||||
}
|
||||
|
||||
async createLabel(name: string, color: string, description: string): Promise<void> {
|
||||
debug('Creating label ' + name)
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.createLabel({ ...this.params, color, description, name })
|
||||
else this.mockLabels.add(name)
|
||||
}
|
||||
|
||||
async deleteLabel(name: string): Promise<void> {
|
||||
debug('Deleting label ' + name)
|
||||
try {
|
||||
if (!this.options.readonly) await this.octokit.issues.deleteLabel({ ...this.params, name })
|
||||
} catch (err) {
|
||||
if (err.status === 404) {
|
||||
return
|
||||
}
|
||||
throw err
|
||||
}
|
||||
}
|
||||
|
||||
async readConfig(path: string): Promise<any> {
|
||||
debug('Reading config at ' + path)
|
||||
const repoPath = `.github/${path}.json`
|
||||
try {
|
||||
const data = (await this.octokit.repos.getContents({ ...this.params, path: repoPath })).data
|
||||
|
||||
if ('type' in data && data.type === 'file') {
|
||||
if (data.encoding === 'base64' && data.content) {
|
||||
return JSON.parse(Buffer.from(data.content, 'base64').toString('utf-8'))
|
||||
}
|
||||
throw Error(`Could not read contents "${data.content}" in encoding "${data.encoding}"`)
|
||||
}
|
||||
throw Error('Found directory at config path when expecting file' + JSON.stringify(data))
|
||||
} catch (e) {
|
||||
throw Error('Error with config file at ' + repoPath + ': ' + JSON.stringify(e))
|
||||
}
|
||||
}
|
||||
|
||||
async releaseContainsCommit(release: string, commit: string): Promise<'yes' | 'no' | 'unknown'> {
|
||||
return new Promise((resolve, reject) =>
|
||||
exec(`git -C ./repo merge-base --is-ancestor ${commit} ${release}`, (err) => {
|
||||
if (!err || err.code === 1) {
|
||||
resolve(!err ? 'yes' : 'no')
|
||||
} else if (err.message.includes(`Not a valid commit name ${release}`)) {
|
||||
// release branch is forked. Probably in endgame. Not released.
|
||||
resolve('no')
|
||||
} else if (err.message.includes(`Not a valid commit name ${commit}`)) {
|
||||
// commit is probably in a different repo.
|
||||
resolve('unknown')
|
||||
} else {
|
||||
reject(err)
|
||||
}
|
||||
}),
|
||||
)
|
||||
}
|
||||
|
||||
async dispatch(title: string): Promise<void> {
|
||||
debug('Dispatching ' + title)
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.repos.createDispatchEvent({ ...this.params, event_type: title })
|
||||
}
|
||||
}
|
||||
|
||||
export class OctoKitIssue extends OctoKit implements GitHubIssue {
|
||||
constructor(
|
||||
token: string,
|
||||
protected params: { repo: string; owner: string },
|
||||
private issueData: { number: number } | Issue,
|
||||
options: { readonly: boolean } = { readonly: false },
|
||||
) {
|
||||
super(token, params, options)
|
||||
console.log('running bot on issue', issueData.number)
|
||||
}
|
||||
|
||||
async addAssignee(assignee: string): Promise<void> {
|
||||
debug('Adding assignee ' + assignee + ' to ' + this.issueData.number)
|
||||
if (!this.options.readonly) {
|
||||
await this.octokit.issues.addAssignees({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
assignees: [assignee],
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
async removeAssignee(assignee: string): Promise<void> {
|
||||
debug('Removing assignee ' + assignee + ' to ' + this.issueData.number)
|
||||
if (!this.options.readonly) {
|
||||
await this.octokit.issues.removeAssignees({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
assignees: [assignee],
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
async closeIssue(): Promise<void> {
|
||||
debug('Closing issue ' + this.issueData.number)
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.update({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
state: 'closed',
|
||||
})
|
||||
}
|
||||
|
||||
async reopenIssue(): Promise<void> {
|
||||
debug('Reopening issue ' + this.issueData.number)
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.update({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
state: 'open',
|
||||
})
|
||||
}
|
||||
|
||||
async lockIssue(): Promise<void> {
|
||||
debug('Locking issue ' + this.issueData.number)
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.lock({ ...this.params, issue_number: this.issueData.number })
|
||||
}
|
||||
|
||||
async getIssue(): Promise<Issue> {
|
||||
if (isIssue(this.issueData)) {
|
||||
debug('Got issue data from query result ' + this.issueData.number)
|
||||
return this.issueData
|
||||
}
|
||||
|
||||
console.log('Fetching issue ' + this.issueData.number)
|
||||
const issue = (
|
||||
await this.octokit.issues.get({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
mediaType: { previews: ['squirrel-girl'] },
|
||||
})
|
||||
).data
|
||||
return (this.issueData = this.octokitIssueToIssue(issue))
|
||||
}
|
||||
|
||||
async postComment(body: string): Promise<void> {
|
||||
debug(`Posting comment ${body} on ${this.issueData.number}`)
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.createComment({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
body,
|
||||
})
|
||||
}
|
||||
|
||||
async deleteComment(id: number): Promise<void> {
|
||||
debug(`Deleting comment ${id} on ${this.issueData.number}`)
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.deleteComment({
|
||||
owner: this.params.owner,
|
||||
repo: this.params.repo,
|
||||
comment_id: id,
|
||||
})
|
||||
}
|
||||
|
||||
async setMilestone(milestoneId: number) {
|
||||
debug(`Setting milestone for ${this.issueData.number} to ${milestoneId}`)
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.update({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
milestone: milestoneId,
|
||||
})
|
||||
}
|
||||
|
||||
async *getComments(last?: boolean): AsyncIterableIterator<Comment[]> {
|
||||
debug('Fetching comments for ' + this.issueData.number)
|
||||
|
||||
const response = this.octokit.paginate.iterator(
|
||||
this.octokit.issues.listComments.endpoint.merge({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
per_page: 100,
|
||||
...(last ? { per_page: 1, page: (await this.getIssue()).numComments } : {}),
|
||||
}),
|
||||
)
|
||||
|
||||
for await (const page of response) {
|
||||
numRequests++
|
||||
yield (page.data as Octokit.IssuesListCommentsResponseItem[]).map((comment) => ({
|
||||
author: { name: comment.user.login, isGitHubApp: comment.user.type === 'Bot' },
|
||||
body: comment.body,
|
||||
id: comment.id,
|
||||
timestamp: +new Date(comment.created_at),
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
async addLabel(name: string): Promise<void> {
|
||||
debug(`Adding label ${name} to ${this.issueData.number}`)
|
||||
if (!(await this.repoHasLabel(name))) {
|
||||
throw Error(`Action could not execute becuase label ${name} is not defined.`)
|
||||
}
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.addLabels({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
labels: [name],
|
||||
})
|
||||
}
|
||||
|
||||
async getAssigner(assignee: string): Promise<string> {
|
||||
const options = this.octokit.issues.listEventsForTimeline.endpoint.merge({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
})
|
||||
|
||||
let assigner: string | undefined
|
||||
|
||||
for await (const event of this.octokit.paginate.iterator(options)) {
|
||||
numRequests++
|
||||
const timelineEvents = event.data as Octokit.IssuesListEventsForTimelineResponseItem[]
|
||||
for (const timelineEvent of timelineEvents) {
|
||||
if (
|
||||
timelineEvent.event === 'assigned' &&
|
||||
(timelineEvent as any).assignee.login === assignee
|
||||
) {
|
||||
assigner = timelineEvent.actor.login
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!assigner) {
|
||||
throw Error('Expected to find ' + assignee + ' in issue timeline but did not.')
|
||||
}
|
||||
|
||||
return assigner
|
||||
}
|
||||
|
||||
async removeLabel(name: string): Promise<void> {
|
||||
debug(`Removing label ${name} from ${this.issueData.number}`)
|
||||
try {
|
||||
if (!this.options.readonly)
|
||||
await this.octokit.issues.removeLabel({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
name,
|
||||
})
|
||||
} catch (err) {
|
||||
if (err.status === 404) {
|
||||
console.log(`Label ${name} not found on issue`)
|
||||
return
|
||||
}
|
||||
throw err
|
||||
}
|
||||
}
|
||||
|
||||
async getClosingInfo(
|
||||
alreadyChecked: number[] = [],
|
||||
): Promise<{ hash: string | undefined; timestamp: number } | undefined> {
|
||||
if (alreadyChecked.includes(this.issueData.number)) {
|
||||
return undefined
|
||||
}
|
||||
alreadyChecked.push(this.issueData.number)
|
||||
|
||||
if ((await this.getIssue()).open) {
|
||||
return
|
||||
}
|
||||
|
||||
const closingHashComment = /(?:\\|\/)closedWith (\S*)/
|
||||
|
||||
const options = this.octokit.issues.listEventsForTimeline.endpoint.merge({
|
||||
...this.params,
|
||||
issue_number: this.issueData.number,
|
||||
})
|
||||
let closingCommit: { hash: string | undefined; timestamp: number } | undefined
|
||||
const crossReferencing: number[] = []
|
||||
for await (const event of this.octokit.paginate.iterator(options)) {
|
||||
numRequests++
|
||||
|
||||
const timelineEvents = event.data as Octokit.IssuesListEventsForTimelineResponseItem[]
|
||||
for (const timelineEvent of timelineEvents) {
|
||||
if (
|
||||
(timelineEvent.event === 'closed' || timelineEvent.event === 'merged') &&
|
||||
timelineEvent.commit_id &&
|
||||
timelineEvent.commit_url
|
||||
.toLowerCase()
|
||||
.includes(`/${this.params.owner}/${this.params.repo}/`.toLowerCase())
|
||||
) {
|
||||
closingCommit = {
|
||||
hash: timelineEvent.commit_id,
|
||||
timestamp: +new Date(timelineEvent.created_at),
|
||||
}
|
||||
}
|
||||
if (timelineEvent.event === 'reopened') {
|
||||
closingCommit = undefined
|
||||
}
|
||||
if (
|
||||
timelineEvent.event === 'commented' &&
|
||||
!((timelineEvent as any).body as string)?.includes('UNABLE_TO_LOCATE_COMMIT_MESSAGE') &&
|
||||
closingHashComment.test((timelineEvent as any).body)
|
||||
) {
|
||||
closingCommit = {
|
||||
hash: closingHashComment.exec((timelineEvent as any).body)![1],
|
||||
timestamp: +new Date(timelineEvent.created_at),
|
||||
}
|
||||
}
|
||||
if (
|
||||
timelineEvent.event === 'cross-referenced' &&
|
||||
(timelineEvent as any).source?.issue?.number &&
|
||||
(timelineEvent as any).source?.issue?.pull_request?.url.includes(
|
||||
`/${this.params.owner}/${this.params.repo}/`.toLowerCase(),
|
||||
)
|
||||
) {
|
||||
crossReferencing.push((timelineEvent as any).source.issue.number)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If we dont have any closing info, try to get it from linked issues (PRs).
|
||||
// If there's a linked issue that was closed at almost the same time, guess it was a PR that closed this.
|
||||
if (!closingCommit) {
|
||||
for (const id of crossReferencing.reverse()) {
|
||||
const closed = await new OctoKitIssue(this.token, this.params, {
|
||||
number: id,
|
||||
}, this.options).getClosingInfo(alreadyChecked)
|
||||
|
||||
if (closed) {
|
||||
if (Math.abs(closed.timestamp - ((await this.getIssue()).closedAt ?? 0)) < 5000) {
|
||||
closingCommit = closed
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`Got ${JSON.stringify(closingCommit)} as closing commit of ${this.issueData.number}`)
|
||||
return closingCommit
|
||||
}
|
||||
}
|
||||
|
||||
function isIssue(object: any): object is Issue {
|
||||
const isIssue =
|
||||
'author' in object &&
|
||||
'body' in object &&
|
||||
'title' in object &&
|
||||
'labels' in object &&
|
||||
'open' in object &&
|
||||
'locked' in object &&
|
||||
'number' in object &&
|
||||
'numComments' in object &&
|
||||
'reactions' in object &&
|
||||
'milestoneId' in object
|
||||
|
||||
return isIssue
|
||||
}
|
||||
@@ -0,0 +1,129 @@
|
||||
"use strict";
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Action = void 0;
|
||||
const octokit_1 = require("../api/octokit");
|
||||
const github_1 = require("@actions/github");
|
||||
const utils_1 = require("./utils");
|
||||
const core_1 = require("@actions/core");
|
||||
class Action {
|
||||
constructor() {
|
||||
this.token = utils_1.getRequiredInput('token');
|
||||
this.username = new github_1.GitHub(this.token).users.getAuthenticated().then((v) => v.data.name);
|
||||
}
|
||||
async run() {
|
||||
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
||||
console.log('running ', this.id, 'with context', {
|
||||
...github_1.context,
|
||||
payload: {
|
||||
issue: (_b = (_a = github_1.context.payload) === null || _a === void 0 ? void 0 : _a.issue) === null || _b === void 0 ? void 0 : _b.number,
|
||||
label: (_d = (_c = github_1.context.payload) === null || _c === void 0 ? void 0 : _c.label) === null || _d === void 0 ? void 0 : _d.name,
|
||||
repository: (_f = (_e = github_1.context.payload) === null || _e === void 0 ? void 0 : _e.repository) === null || _f === void 0 ? void 0 : _f.html_url,
|
||||
sender: (_j = (_h = (_g = github_1.context.payload) === null || _g === void 0 ? void 0 : _g.sender) === null || _h === void 0 ? void 0 : _h.login) !== null && _j !== void 0 ? _j : (_l = (_k = github_1.context.payload) === null || _k === void 0 ? void 0 : _k.sender) === null || _l === void 0 ? void 0 : _l.type,
|
||||
},
|
||||
});
|
||||
if (utils_1.errorLoggingIssue) {
|
||||
const { repo, issue, owner } = utils_1.errorLoggingIssue;
|
||||
if (github_1.context.repo.repo === repo &&
|
||||
github_1.context.repo.owner === owner &&
|
||||
((_m = github_1.context.payload.issue) === null || _m === void 0 ? void 0 : _m.number) === issue) {
|
||||
return console.log('refusing to run on error logging issue to prevent cascading errors');
|
||||
}
|
||||
}
|
||||
try {
|
||||
const token = utils_1.getRequiredInput('token');
|
||||
const readonly = !!core_1.getInput('readonly');
|
||||
const issue = (_o = github_1.context === null || github_1.context === void 0 ? void 0 : github_1.context.issue) === null || _o === void 0 ? void 0 : _o.number;
|
||||
if (issue) {
|
||||
const octokit = new octokit_1.OctoKitIssue(token, github_1.context.repo, { number: issue }, { readonly });
|
||||
if (github_1.context.eventName === 'issue_comment') {
|
||||
await this.onCommented(octokit, github_1.context.payload.comment.body, github_1.context.actor);
|
||||
}
|
||||
else if (github_1.context.eventName === 'issues') {
|
||||
switch (github_1.context.payload.action) {
|
||||
case 'opened':
|
||||
await this.onOpened(octokit);
|
||||
break;
|
||||
case 'reopened':
|
||||
await this.onReopened(octokit);
|
||||
break;
|
||||
case 'closed':
|
||||
await this.onClosed(octokit);
|
||||
break;
|
||||
case 'labeled':
|
||||
await this.onLabeled(octokit, github_1.context.payload.label.name);
|
||||
break;
|
||||
case 'unassigned':
|
||||
await this.onUnassigned(octokit, github_1.context.payload.assignee.login);
|
||||
break;
|
||||
case 'edited':
|
||||
await this.onEdited(octokit);
|
||||
break;
|
||||
case 'milestoned':
|
||||
await this.onMilestoned(octokit);
|
||||
break;
|
||||
default:
|
||||
throw Error('Unexpected action: ' + github_1.context.payload.action);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
await this.onTriggered(new octokit_1.OctoKit(token, github_1.context.repo, { readonly }));
|
||||
}
|
||||
}
|
||||
catch (e) {
|
||||
await this.error(e);
|
||||
}
|
||||
const usage = await utils_1.getRateLimit(this.token);
|
||||
}
|
||||
async error(error) {
|
||||
const details = {
|
||||
message: `${error.message}\n${error.stack}`,
|
||||
id: this.id,
|
||||
user: await this.username,
|
||||
};
|
||||
if (github_1.context.issue.number)
|
||||
details.issue = github_1.context.issue.number;
|
||||
const rendered = `
|
||||
Message: ${details.message}
|
||||
|
||||
Actor: ${details.user}
|
||||
|
||||
ID: ${details.id}
|
||||
`;
|
||||
await utils_1.logErrorToIssue(rendered, true, this.token);
|
||||
core_1.setFailed(error.message);
|
||||
}
|
||||
async onTriggered(_octokit) {
|
||||
throw Error('not implemented');
|
||||
}
|
||||
async onEdited(_issue) {
|
||||
throw Error('not implemented');
|
||||
}
|
||||
async onLabeled(_issue, _label) {
|
||||
throw Error('not implemented');
|
||||
}
|
||||
async onUnassigned(_issue, _label) {
|
||||
throw Error('not implemented');
|
||||
}
|
||||
async onOpened(_issue) {
|
||||
throw Error('not implemented');
|
||||
}
|
||||
async onReopened(_issue) {
|
||||
throw Error('not implemented');
|
||||
}
|
||||
async onClosed(_issue) {
|
||||
throw Error('not implemented');
|
||||
}
|
||||
async onMilestoned(_issue) {
|
||||
throw Error('not implemented');
|
||||
}
|
||||
async onCommented(_issue, _comment, _actor) {
|
||||
throw Error('not implemented');
|
||||
}
|
||||
}
|
||||
exports.Action = Action;
|
||||
//# sourceMappingURL=Action.js.map
|
||||
@@ -0,0 +1,137 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { OctoKit, OctoKitIssue, getNumRequests } from '../api/octokit'
|
||||
import { context, GitHub } from '@actions/github'
|
||||
import { getRequiredInput, logErrorToIssue, getRateLimit, errorLoggingIssue } from './utils'
|
||||
import { getInput, setFailed } from '@actions/core'
|
||||
|
||||
export abstract class Action {
|
||||
abstract id: string
|
||||
|
||||
private username: Promise<string>
|
||||
private token = getRequiredInput('token')
|
||||
|
||||
constructor() {
|
||||
this.username = new GitHub(this.token).users.getAuthenticated().then((v) => v.data.name)
|
||||
}
|
||||
|
||||
public async run() {
|
||||
console.log('running ', this.id, 'with context', {
|
||||
...context,
|
||||
payload: {
|
||||
issue: context.payload?.issue?.number,
|
||||
label: context.payload?.label?.name,
|
||||
repository: context.payload?.repository?.html_url,
|
||||
sender: context.payload?.sender?.login ?? context.payload?.sender?.type,
|
||||
},
|
||||
})
|
||||
|
||||
if (errorLoggingIssue) {
|
||||
const { repo, issue, owner } = errorLoggingIssue
|
||||
if (
|
||||
context.repo.repo === repo &&
|
||||
context.repo.owner === owner &&
|
||||
context.payload.issue?.number === issue
|
||||
) {
|
||||
return console.log('refusing to run on error logging issue to prevent cascading errors')
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const token = getRequiredInput('token')
|
||||
const readonly = !!getInput('readonly')
|
||||
|
||||
const issue = context?.issue?.number
|
||||
if (issue) {
|
||||
const octokit = new OctoKitIssue(token, context.repo, { number: issue }, { readonly })
|
||||
if (context.eventName === 'issue_comment') {
|
||||
await this.onCommented(octokit, context.payload.comment.body, context.actor)
|
||||
} else if (context.eventName === 'issues') {
|
||||
switch (context.payload.action) {
|
||||
case 'opened':
|
||||
await this.onOpened(octokit)
|
||||
break
|
||||
case 'reopened':
|
||||
await this.onReopened(octokit)
|
||||
break
|
||||
case 'closed':
|
||||
await this.onClosed(octokit)
|
||||
break
|
||||
case 'labeled':
|
||||
await this.onLabeled(octokit, context.payload.label.name)
|
||||
break
|
||||
case 'unassigned':
|
||||
await this.onUnassigned(octokit, context.payload.assignee.login)
|
||||
break
|
||||
case 'edited':
|
||||
await this.onEdited(octokit)
|
||||
break
|
||||
case 'milestoned':
|
||||
await this.onMilestoned(octokit)
|
||||
break
|
||||
default:
|
||||
throw Error('Unexpected action: ' + context.payload.action)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
await this.onTriggered(new OctoKit(token, context.repo, { readonly }))
|
||||
}
|
||||
} catch (e) {
|
||||
await this.error(e)
|
||||
}
|
||||
|
||||
const usage = await getRateLimit(this.token)
|
||||
}
|
||||
|
||||
private async error(error: Error) {
|
||||
const details: any = {
|
||||
message: `${error.message}\n${error.stack}`,
|
||||
id: this.id,
|
||||
user: await this.username,
|
||||
}
|
||||
|
||||
if (context.issue.number) details.issue = context.issue.number
|
||||
|
||||
const rendered = `
|
||||
Message: ${details.message}
|
||||
|
||||
Actor: ${details.user}
|
||||
|
||||
ID: ${details.id}
|
||||
`
|
||||
await logErrorToIssue(rendered, true, this.token)
|
||||
|
||||
setFailed(error.message)
|
||||
}
|
||||
|
||||
protected async onTriggered(_octokit: OctoKit): Promise<void> {
|
||||
throw Error('not implemented')
|
||||
}
|
||||
protected async onEdited(_issue: OctoKitIssue): Promise<void> {
|
||||
throw Error('not implemented')
|
||||
}
|
||||
protected async onLabeled(_issue: OctoKitIssue, _label: string): Promise<void> {
|
||||
throw Error('not implemented')
|
||||
}
|
||||
protected async onUnassigned(_issue: OctoKitIssue, _label: string): Promise<void> {
|
||||
throw Error('not implemented')
|
||||
}
|
||||
protected async onOpened(_issue: OctoKitIssue): Promise<void> {
|
||||
throw Error('not implemented')
|
||||
}
|
||||
protected async onReopened(_issue: OctoKitIssue): Promise<void> {
|
||||
throw Error('not implemented')
|
||||
}
|
||||
protected async onClosed(_issue: OctoKitIssue): Promise<void> {
|
||||
throw Error('not implemented')
|
||||
}
|
||||
protected async onMilestoned(_issue: OctoKitIssue): Promise<void> {
|
||||
throw Error('not implemented')
|
||||
}
|
||||
protected async onCommented(_issue: OctoKitIssue, _comment: string, _actor: string): Promise<void> {
|
||||
throw Error('not implemented')
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,181 @@
|
||||
"use strict";
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.ActionBase = void 0;
|
||||
class ActionBase {
|
||||
constructor(labels, milestoneName, milestoneId, ignoreLabels, ignoreMilestoneNames, ignoreMilestoneIds, minimumVotes, maximumVotes, involves) {
|
||||
this.labels = labels;
|
||||
this.milestoneName = milestoneName;
|
||||
this.milestoneId = milestoneId;
|
||||
this.ignoreLabels = ignoreLabels;
|
||||
this.ignoreMilestoneNames = ignoreMilestoneNames;
|
||||
this.ignoreMilestoneIds = ignoreMilestoneIds;
|
||||
this.minimumVotes = minimumVotes;
|
||||
this.maximumVotes = maximumVotes;
|
||||
this.involves = involves;
|
||||
this.labelsSet = [];
|
||||
this.ignoreLabelsSet = [];
|
||||
this.ignoreMilestoneNamesSet = [];
|
||||
this.ignoreMilestoneIdsSet = [];
|
||||
this.ignoreAllWithLabels = false;
|
||||
this.ignoreAllWithMilestones = false;
|
||||
this.involvesSet = [];
|
||||
}
|
||||
buildQuery(baseQuery) {
|
||||
var _a, _b, _c, _d, _e, _f;
|
||||
let query = baseQuery;
|
||||
console.log(`labels: ${this.labels}`);
|
||||
console.log(`milestoneName: ${this.milestoneName}`);
|
||||
console.log(`milestoneId: ${this.milestoneId}`);
|
||||
console.log(`ignoreLabels: ${this.ignoreLabels}`);
|
||||
console.log(`ignoreMilestoneNames: ${this.ignoreMilestoneNames}`);
|
||||
console.log(`ignoreMilestoneIds: ${this.ignoreMilestoneIds}`);
|
||||
console.log(`minimumVotes: ${this.minimumVotes}`);
|
||||
console.log(`maximumVotes: ${this.maximumVotes}`);
|
||||
console.log(`involves: ${this.involves}`);
|
||||
// Both milestone name and milestone Id must be provided and must match.
|
||||
// The name is used to construct the query, which does not accept ID.
|
||||
// The ID is used for comparisons with issue data, which does not include the name.
|
||||
// TODO: Figure out a way to convert either from milestone name to ID, or vice versa.
|
||||
// If label inclusion and exclusion are mixed, exclusion will take precedence.
|
||||
// For example, an issue with both labels A and B will not match if B is excluded, even if A is included.
|
||||
// If a milestoneName/milestoneId are set, ignoreMilenameName/ignoreMilestoneIds are ignored.
|
||||
// GitHub does not appear to support searching for all issues with milestones (not lacking a milestone). "-no:milestone" does not work.
|
||||
// GitHub does not appear to support searching for all issues with labels (not lacking a label). "-no:label" does not work.
|
||||
// All indicated labels must be present
|
||||
if (this.labels) {
|
||||
if (((_a = this.labels) === null || _a === void 0 ? void 0 : _a.length) > 2 && ((_b = this.labels) === null || _b === void 0 ? void 0 : _b.startsWith('"')) && ((_c = this.labels) === null || _c === void 0 ? void 0 : _c.endsWith('"'))) {
|
||||
this.labels = this.labels.substring(1, this.labels.length - 2);
|
||||
}
|
||||
this.labelsSet = (_d = this.labels) === null || _d === void 0 ? void 0 : _d.split(',');
|
||||
for (const str of this.labelsSet) {
|
||||
if (str != "") {
|
||||
query = query.concat(` label:"${str}"`);
|
||||
}
|
||||
}
|
||||
}
|
||||
// The "involves" qualifier to find issues that in some way involve a certain user.
|
||||
// It is a logical OR between the author, assignee, and mentions.
|
||||
if (this.involves) {
|
||||
this.involvesSet = (_e = this.involves) === null || _e === void 0 ? void 0 : _e.split(',');
|
||||
for (const str of this.involvesSet) {
|
||||
if (str != "") {
|
||||
query = query.concat(` involves:"${str}"`);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.ignoreLabels) {
|
||||
if (this.ignoreLabels == "*" && !this.labels) { // only if unlabeled
|
||||
query = query.concat(` no:label`);
|
||||
this.ignoreAllWithLabels = true;
|
||||
}
|
||||
else {
|
||||
this.ignoreLabelsSet = (_f = this.ignoreLabels) === null || _f === void 0 ? void 0 : _f.split(',');
|
||||
for (const str of this.ignoreLabelsSet) {
|
||||
if (str != "") {
|
||||
query = query.concat(` -label:"${str}"`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.milestoneName) {
|
||||
query = query.concat(` milestone:"${this.milestoneName}"`);
|
||||
}
|
||||
else if (this.ignoreMilestoneNames) {
|
||||
if (this.ignoreMilestoneNames == "*") {
|
||||
query = query.concat(` no:milestone`);
|
||||
this.ignoreAllWithMilestones = true;
|
||||
}
|
||||
else if (this.ignoreMilestoneIds) {
|
||||
this.ignoreMilestoneNamesSet = this.ignoreMilestoneNames.split(',');
|
||||
this.ignoreMilestoneIdsSet = this.ignoreMilestoneIds.split(',');
|
||||
for (const str of this.ignoreMilestoneNamesSet) {
|
||||
if (str != "") {
|
||||
query = query.concat(` -milestone:"${str}"`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return query;
|
||||
}
|
||||
// This is necessary because GitHub sometimes returns incorrect results,
|
||||
// and because issues may get modified while we are processing them.
|
||||
validateIssue(issue) {
|
||||
if (this.ignoreAllWithLabels) {
|
||||
// Validate that the issue does not have labels
|
||||
if (issue.labels && issue.labels.length !== 0) {
|
||||
console.log(`Issue ${issue.number} skipped due to label found after querying for no:label.`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Make sure all labels we wanted are present.
|
||||
if ((!issue.labels || issue.labels.length == 0) && this.labelsSet.length > 0) {
|
||||
console.log(`Issue ${issue.number} skipped due to not having a required label set. No labels found.`);
|
||||
return false;
|
||||
}
|
||||
for (const str of this.labelsSet) {
|
||||
if (!issue.labels.includes(str)) {
|
||||
console.log(`Issue ${issue.number} skipped due to not having a required label set.`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// Make sure no labels we wanted to ignore are present.
|
||||
if (issue.labels && issue.labels.length > 0) {
|
||||
for (const str of this.ignoreLabelsSet) {
|
||||
if (issue.labels.includes(str)) {
|
||||
console.log(`Issue ${issue.number} skipped due to having an ignore label set: ${str}`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.ignoreAllWithMilestones) {
|
||||
// Validate that the issue does not have a milestone.
|
||||
if (issue.milestoneId != null) {
|
||||
console.log(`Issue ${issue.number} skipped due to milestone found after querying for no:milestone.`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Make sure milestone is present, if required.
|
||||
if (this.milestoneId != undefined && issue.milestoneId != +this.milestoneId) {
|
||||
console.log(`Issue ${issue.number} skipped due to not having required milsetone id ${this.milestoneId}. Had: ${issue.milestoneId}`);
|
||||
return false;
|
||||
}
|
||||
// Make sure a milestones we wanted to ignore is not present.
|
||||
if (issue.milestoneId != null) {
|
||||
for (const str of this.ignoreMilestoneIdsSet) {
|
||||
if (issue.milestoneId == +str) {
|
||||
console.log(`Issue ${issue.number} skipped due to milestone ${issue.milestoneId} found in list of ignored milestone IDs.`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Verify the issue has a sufficient number of upvotes
|
||||
let upvotes = 0;
|
||||
if (issue.reactions) {
|
||||
upvotes = issue.reactions['+1'];
|
||||
}
|
||||
if (this.minimumVotes != undefined) {
|
||||
if (upvotes < this.minimumVotes) {
|
||||
console.log(`Issue ${issue.number} skipped due to not having at least ${this.minimumVotes} upvotes. Had: ${upvotes}`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// Verify the issue does not have too many upvotes
|
||||
if (this.maximumVotes != undefined) {
|
||||
if (upvotes > this.maximumVotes) {
|
||||
console.log(`Issue ${issue.number} skipped due to having more than ${this.maximumVotes} upvotes. Had: ${upvotes}`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
exports.ActionBase = ActionBase;
|
||||
//# sourceMappingURL=ActionBase.js.map
|
||||
@@ -0,0 +1,187 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { Issue } from '../api/api'
|
||||
|
||||
export class ActionBase {
|
||||
constructor(
|
||||
private labels?: string,
|
||||
private milestoneName?: string,
|
||||
private milestoneId?: string,
|
||||
private ignoreLabels?: string,
|
||||
private ignoreMilestoneNames?: string,
|
||||
private ignoreMilestoneIds?: string,
|
||||
private minimumVotes?: number,
|
||||
private maximumVotes?: number,
|
||||
private involves?: string,
|
||||
) {}
|
||||
|
||||
private labelsSet: string[] = [];
|
||||
private ignoreLabelsSet: string[] = [];
|
||||
private ignoreMilestoneNamesSet: string[] = [];
|
||||
private ignoreMilestoneIdsSet: string[] = [];
|
||||
private ignoreAllWithLabels: boolean = false;
|
||||
private ignoreAllWithMilestones: boolean = false;
|
||||
private involvesSet: string[] = [];
|
||||
|
||||
buildQuery(baseQuery: string): string {
|
||||
let query = baseQuery;
|
||||
|
||||
console.log(`labels: ${this.labels}`);
|
||||
console.log(`milestoneName: ${this.milestoneName}`);
|
||||
console.log(`milestoneId: ${this.milestoneId}`);
|
||||
console.log(`ignoreLabels: ${this.ignoreLabels}`);
|
||||
console.log(`ignoreMilestoneNames: ${this.ignoreMilestoneNames}`);
|
||||
console.log(`ignoreMilestoneIds: ${this.ignoreMilestoneIds}`);
|
||||
console.log(`minimumVotes: ${this.minimumVotes}`);
|
||||
console.log(`maximumVotes: ${this.maximumVotes}`);
|
||||
console.log(`involves: ${this.involves}`);
|
||||
|
||||
// Both milestone name and milestone Id must be provided and must match.
|
||||
// The name is used to construct the query, which does not accept ID.
|
||||
// The ID is used for comparisons with issue data, which does not include the name.
|
||||
// TODO: Figure out a way to convert either from milestone name to ID, or vice versa.
|
||||
|
||||
// If label inclusion and exclusion are mixed, exclusion will take precedence.
|
||||
// For example, an issue with both labels A and B will not match if B is excluded, even if A is included.
|
||||
|
||||
// If a milestoneName/milestoneId are set, ignoreMilenameName/ignoreMilestoneIds are ignored.
|
||||
|
||||
// GitHub does not appear to support searching for all issues with milestones (not lacking a milestone). "-no:milestone" does not work.
|
||||
// GitHub does not appear to support searching for all issues with labels (not lacking a label). "-no:label" does not work.
|
||||
|
||||
// All indicated labels must be present
|
||||
if (this.labels) {
|
||||
if (this.labels?.length > 2 && this.labels?.startsWith('"') && this.labels?.endsWith('"')) {
|
||||
this.labels = this.labels.substring(1, this.labels.length - 2);
|
||||
}
|
||||
this.labelsSet = this.labels?.split(',');
|
||||
for (const str of this.labelsSet) {
|
||||
if (str != "") {
|
||||
query = query.concat(` label:"${str}"`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// The "involves" qualifier to find issues that in some way involve a certain user.
|
||||
// It is a logical OR between the author, assignee, and mentions.
|
||||
if (this.involves) {
|
||||
this.involvesSet = this.involves?.split(',');
|
||||
for (const str of this.involvesSet) {
|
||||
if (str != "") {
|
||||
query = query.concat(` involves:"${str}"`)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (this.ignoreLabels) {
|
||||
if (this.ignoreLabels == "*" && !this.labels) { // only if unlabeled
|
||||
query = query.concat(` no:label`)
|
||||
this.ignoreAllWithLabels = true;
|
||||
} else {
|
||||
this.ignoreLabelsSet = this.ignoreLabels?.split(',');
|
||||
for (const str of this.ignoreLabelsSet) {
|
||||
if (str != "") {
|
||||
query = query.concat(` -label:"${str}"`)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (this.milestoneName) {
|
||||
query = query.concat(` milestone:"${this.milestoneName}"`)
|
||||
}
|
||||
else if (this.ignoreMilestoneNames) {
|
||||
if (this.ignoreMilestoneNames == "*") {
|
||||
query = query.concat(` no:milestone`)
|
||||
this.ignoreAllWithMilestones = true;
|
||||
} else if (this.ignoreMilestoneIds) {
|
||||
this.ignoreMilestoneNamesSet = this.ignoreMilestoneNames.split(',');
|
||||
this.ignoreMilestoneIdsSet = this.ignoreMilestoneIds.split(',');
|
||||
for (const str of this.ignoreMilestoneNamesSet) {
|
||||
if (str != "") {
|
||||
query = query.concat(` -milestone:"${str}"`)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return query;
|
||||
}
|
||||
|
||||
// This is necessary because GitHub sometimes returns incorrect results,
|
||||
// and because issues may get modified while we are processing them.
|
||||
validateIssue(issue: Issue): boolean {
|
||||
if (this.ignoreAllWithLabels) {
|
||||
// Validate that the issue does not have labels
|
||||
if (issue.labels && issue.labels.length !== 0) {
|
||||
console.log(`Issue ${issue.number} skipped due to label found after querying for no:label.`);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
// Make sure all labels we wanted are present.
|
||||
if ((!issue.labels || issue.labels.length == 0) && this.labelsSet.length > 0) {
|
||||
console.log(`Issue ${issue.number} skipped due to not having a required label set. No labels found.`);
|
||||
return false;
|
||||
}
|
||||
for (const str of this.labelsSet) {
|
||||
if (!issue.labels.includes(str)) {
|
||||
console.log(`Issue ${issue.number} skipped due to not having a required label set.`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// Make sure no labels we wanted to ignore are present.
|
||||
if (issue.labels && issue.labels.length > 0) {
|
||||
for (const str of this.ignoreLabelsSet) {
|
||||
if (issue.labels.includes(str)) {
|
||||
console.log(`Issue ${issue.number} skipped due to having an ignore label set: ${str}`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.ignoreAllWithMilestones) {
|
||||
// Validate that the issue does not have a milestone.
|
||||
if (issue.milestoneId != null) {
|
||||
console.log(`Issue ${issue.number} skipped due to milestone found after querying for no:milestone.`);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
// Make sure milestone is present, if required.
|
||||
if (this.milestoneId != undefined && issue.milestoneId != +this.milestoneId) {
|
||||
console.log(`Issue ${issue.number} skipped due to not having required milsetone id ${this.milestoneId}. Had: ${issue.milestoneId}`);
|
||||
return false;
|
||||
}
|
||||
// Make sure a milestones we wanted to ignore is not present.
|
||||
if (issue.milestoneId != null) {
|
||||
for (const str of this.ignoreMilestoneIdsSet) {
|
||||
if (issue.milestoneId == +str) {
|
||||
console.log(`Issue ${issue.number} skipped due to milestone ${issue.milestoneId} found in list of ignored milestone IDs.`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Verify the issue has a sufficient number of upvotes
|
||||
let upvotes = 0;
|
||||
if (issue.reactions) {
|
||||
upvotes = issue.reactions['+1'];
|
||||
}
|
||||
if (this.minimumVotes != undefined) {
|
||||
if (upvotes < this.minimumVotes) {
|
||||
console.log(`Issue ${issue.number} skipped due to not having at least ${this.minimumVotes} upvotes. Had: ${upvotes}`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// Verify the issue does not have too many upvotes
|
||||
if (this.maximumVotes != undefined) {
|
||||
if (upvotes > this.maximumVotes) {
|
||||
console.log(`Issue ${issue.number} skipped due to having more than ${this.maximumVotes} upvotes. Had: ${upvotes}`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
"use strict";
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.logErrorToIssue = exports.errorLoggingIssue = exports.getRateLimit = exports.daysAgoToHumanReadbleDate = exports.daysAgoToTimestamp = exports.loadLatestRelease = exports.normalizeIssue = exports.getRequiredInput = exports.getInput = void 0;
|
||||
const core = require("@actions/core");
|
||||
const github_1 = require("@actions/github");
|
||||
const axios_1 = require("axios");
|
||||
const octokit_1 = require("../api/octokit");
|
||||
exports.getInput = (name) => core.getInput(name) || undefined;
|
||||
exports.getRequiredInput = (name) => core.getInput(name, { required: true });
|
||||
exports.normalizeIssue = (issue) => {
|
||||
let { body, title } = issue;
|
||||
body = body !== null && body !== void 0 ? body : '';
|
||||
title = title !== null && title !== void 0 ? title : '';
|
||||
const isBug = body.includes('bug_report_template') || /Issue Type:.*Bug.*/.test(body);
|
||||
const isFeatureRequest = body.includes('feature_request_template') || /Issue Type:.*Feature Request.*/.test(body);
|
||||
const cleanse = (str) => {
|
||||
let out = str
|
||||
.toLowerCase()
|
||||
.replace(/<!--.*-->/gu, '')
|
||||
.replace(/.* version: .*/gu, '')
|
||||
.replace(/issue type: .*/gu, '')
|
||||
.replace(/vs ?code/gu, '')
|
||||
.replace(/we have written.*please paste./gu, '')
|
||||
.replace(/steps to reproduce:/gu, '')
|
||||
.replace(/does this issue occur when all extensions are disabled.*/gu, '')
|
||||
.replace(/!?\[[^\]]*\]\([^)]*\)/gu, '')
|
||||
.replace(/\s+/gu, ' ')
|
||||
.replace(/```[^`]*?```/gu, '');
|
||||
while (out.includes(`<details>`) &&
|
||||
out.includes('</details>') &&
|
||||
out.indexOf(`</details>`) > out.indexOf(`<details>`)) {
|
||||
out = out.slice(0, out.indexOf('<details>')) + out.slice(out.indexOf(`</details>`) + 10);
|
||||
}
|
||||
return out;
|
||||
};
|
||||
return {
|
||||
body: cleanse(body),
|
||||
title: cleanse(title),
|
||||
issueType: isBug ? 'bug' : isFeatureRequest ? 'feature_request' : 'unknown',
|
||||
};
|
||||
};
|
||||
exports.loadLatestRelease = async (quality) => (await axios_1.default.get(`https://vscode-update.azurewebsites.net/api/update/darwin/${quality}/latest`)).data;
|
||||
exports.daysAgoToTimestamp = (days) => +new Date(Date.now() - days * 24 * 60 * 60 * 1000);
|
||||
exports.daysAgoToHumanReadbleDate = (days) => new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString().replace(/\.\d{3}\w$/, '');
|
||||
exports.getRateLimit = async (token) => {
|
||||
const usageData = (await new github_1.GitHub(token).rateLimit.get()).data.resources;
|
||||
const usage = {};
|
||||
['core', 'graphql', 'search'].forEach(async (category) => {
|
||||
usage[category] = 1 - usageData[category].remaining / usageData[category].limit;
|
||||
});
|
||||
return usage;
|
||||
};
|
||||
exports.errorLoggingIssue = (() => {
|
||||
try {
|
||||
const repo = github_1.context.repo.owner.toLowerCase() + '/' + github_1.context.repo.repo.toLowerCase();
|
||||
if (repo === 'microsoft/vscode-cpptools') {
|
||||
return { repo: 'vscode-cpptools', owner: 'Microsoft', issue: 6282 };
|
||||
}
|
||||
else if (exports.getInput('errorLogIssueNumber')) {
|
||||
return { ...github_1.context.repo, issue: +exports.getRequiredInput('errorLogIssueNumber') };
|
||||
}
|
||||
else {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
catch (e) {
|
||||
console.error(e);
|
||||
return undefined;
|
||||
}
|
||||
})();
|
||||
exports.logErrorToIssue = async (message, ping, token) => {
|
||||
// Attempt to wait out abuse detection timeout if present
|
||||
await new Promise((resolve) => setTimeout(resolve, 10000));
|
||||
const dest = exports.errorLoggingIssue;
|
||||
if (!dest)
|
||||
return console.log('no error logging repo defined. swallowing error:', message);
|
||||
return new octokit_1.OctoKitIssue(token, { owner: dest.owner, repo: dest.repo }, { number: dest.issue }, { readonly: !!exports.getInput('readonly') })
|
||||
.postComment(`
|
||||
Workflow: ${github_1.context.workflow}
|
||||
|
||||
Error: ${message}
|
||||
|
||||
Issue: ${ping ? `${github_1.context.repo.owner}/${github_1.context.repo.repo}#` : ''}${github_1.context.issue.number}
|
||||
|
||||
Repo: ${github_1.context.repo.owner}/${github_1.context.repo.repo}
|
||||
|
||||
<!-- Context:
|
||||
${JSON.stringify(github_1.context, null, 2)
|
||||
.replace(/<!--/gu, '<@--')
|
||||
.replace(/-->/gu, '--@>')
|
||||
.replace(/\/|\\/gu, 'slash-')}
|
||||
-->
|
||||
`);
|
||||
};
|
||||
//# sourceMappingURL=utils.js.map
|
||||
@@ -0,0 +1,119 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import * as core from '@actions/core'
|
||||
import { context, GitHub } from '@actions/github'
|
||||
import axios from 'axios'
|
||||
import { OctoKitIssue } from '../api/octokit'
|
||||
|
||||
export const getInput = (name: string) => core.getInput(name) || undefined
|
||||
export const getRequiredInput = (name: string) => core.getInput(name, { required: true })
|
||||
|
||||
export const normalizeIssue = (issue: {
|
||||
body: string
|
||||
title: string
|
||||
}): { body: string; title: string; issueType: 'bug' | 'feature_request' | 'unknown' } => {
|
||||
let { body, title } = issue
|
||||
body = body ?? ''
|
||||
title = title ?? ''
|
||||
const isBug = body.includes('bug_report_template') || /Issue Type:.*Bug.*/.test(body)
|
||||
const isFeatureRequest =
|
||||
body.includes('feature_request_template') || /Issue Type:.*Feature Request.*/.test(body)
|
||||
|
||||
const cleanse = (str: string) => {
|
||||
let out = str
|
||||
.toLowerCase()
|
||||
.replace(/<!--.*-->/gu, '')
|
||||
.replace(/.* version: .*/gu, '')
|
||||
.replace(/issue type: .*/gu, '')
|
||||
.replace(/vs ?code/gu, '')
|
||||
.replace(/we have written.*please paste./gu, '')
|
||||
.replace(/steps to reproduce:/gu, '')
|
||||
.replace(/does this issue occur when all extensions are disabled.*/gu, '')
|
||||
.replace(/!?\[[^\]]*\]\([^)]*\)/gu, '')
|
||||
.replace(/\s+/gu, ' ')
|
||||
.replace(/```[^`]*?```/gu, '')
|
||||
|
||||
while (
|
||||
out.includes(`<details>`) &&
|
||||
out.includes('</details>') &&
|
||||
out.indexOf(`</details>`) > out.indexOf(`<details>`)
|
||||
) {
|
||||
out = out.slice(0, out.indexOf('<details>')) + out.slice(out.indexOf(`</details>`) + 10)
|
||||
}
|
||||
|
||||
return out
|
||||
}
|
||||
|
||||
return {
|
||||
body: cleanse(body),
|
||||
title: cleanse(title),
|
||||
issueType: isBug ? 'bug' : isFeatureRequest ? 'feature_request' : 'unknown',
|
||||
}
|
||||
}
|
||||
|
||||
export interface Release {
|
||||
productVersion: string
|
||||
timestamp: number
|
||||
version: string
|
||||
}
|
||||
|
||||
export const loadLatestRelease = async (quality: 'stable' | 'insider'): Promise<Release | undefined> =>
|
||||
(await axios.get(`https://vscode-update.azurewebsites.net/api/update/darwin/${quality}/latest`)).data
|
||||
|
||||
export const daysAgoToTimestamp = (days: number): number => +new Date(Date.now() - days * 24 * 60 * 60 * 1000)
|
||||
|
||||
export const daysAgoToHumanReadbleDate = (days: number) =>
|
||||
new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString().replace(/\.\d{3}\w$/, '')
|
||||
|
||||
export const getRateLimit = async (token: string) => {
|
||||
const usageData = (await new GitHub(token).rateLimit.get()).data.resources
|
||||
const usage = {} as { core: number; graphql: number; search: number }
|
||||
;(['core', 'graphql', 'search'] as const).forEach(async (category) => {
|
||||
usage[category] = 1 - usageData[category].remaining / usageData[category].limit
|
||||
})
|
||||
return usage
|
||||
}
|
||||
|
||||
export const errorLoggingIssue = (() => {
|
||||
try {
|
||||
const repo = context.repo.owner.toLowerCase() + '/' + context.repo.repo.toLowerCase()
|
||||
if (repo === 'microsoft/vscode-cpptools') {
|
||||
return { repo: 'vscode-cpptools', owner: 'Microsoft', issue: 6282 }
|
||||
} else if (getInput('errorLogIssueNumber')) {
|
||||
return { ...context.repo, issue: +getRequiredInput('errorLogIssueNumber') }
|
||||
} else {
|
||||
return undefined
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
return undefined
|
||||
}
|
||||
})()
|
||||
|
||||
export const logErrorToIssue = async (message: string, ping: boolean, token: string): Promise<void> => {
|
||||
// Attempt to wait out abuse detection timeout if present
|
||||
await new Promise((resolve) => setTimeout(resolve, 10000))
|
||||
const dest = errorLoggingIssue
|
||||
if (!dest) return console.log('no error logging repo defined. swallowing error:', message)
|
||||
|
||||
return new OctoKitIssue(token, { owner: dest.owner, repo: dest.repo }, { number: dest.issue }, { readonly: !!getInput('readonly') })
|
||||
.postComment(`
|
||||
Workflow: ${context.workflow}
|
||||
|
||||
Error: ${message}
|
||||
|
||||
Issue: ${ping ? `${context.repo.owner}/${context.repo.repo}#` : ''}${context.issue.number}
|
||||
|
||||
Repo: ${context.repo.owner}/${context.repo.repo}
|
||||
|
||||
<!-- Context:
|
||||
${JSON.stringify(context, null, 2)
|
||||
.replace(/<!--/gu, '<@--')
|
||||
.replace(/-->/gu, '--@>')
|
||||
.replace(/\/|\\/gu, 'slash-')}
|
||||
-->
|
||||
`)
|
||||
}
|
||||
Generated
+1183
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "vscode-cpptools-github-triage-actions",
|
||||
"version": "1.0.0",
|
||||
"description": "GitHub Actions used by VS Code cpptools for triaging issues",
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"lint": "eslint -c .eslintrc --fix --ext .ts .",
|
||||
"watch": "tsc --watch"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.2.6",
|
||||
"@actions/github": "^2.1.1",
|
||||
"axios": "^0.21.4"
|
||||
},
|
||||
"resolutions": {
|
||||
"follow-redirects": "1.14.7"
|
||||
},
|
||||
"devDependencies": {
|
||||
"eslint": "^8.1.0",
|
||||
"typescript": "^3.8.3"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "es2019",
|
||||
"strict": true,
|
||||
"module": "commonjs",
|
||||
"moduleResolution": "node",
|
||||
"removeComments": false,
|
||||
"resolveJsonModule": true,
|
||||
"sourceMap": true,
|
||||
"lib": [
|
||||
"es2020"
|
||||
]
|
||||
},
|
||||
"exclude": [
|
||||
"**/*.test.ts",
|
||||
"**/vm-filesystem/**"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
name: By Design closer - debugger
|
||||
on:
|
||||
schedule:
|
||||
- cron: 10 11 * * * # Run at 11:10 AM UTC (3:10 AM PST, 4:10 AM PDT)
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
readonly:
|
||||
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Actions
|
||||
uses: actions/checkout@v2
|
||||
- name: Install Actions
|
||||
run: cd ./.github/actions && npm install --production && cd ../..
|
||||
- name: Stale Closer
|
||||
uses: ./.github/actions/StaleCloser
|
||||
with:
|
||||
readonly: ${{ github.event.inputs.readonly }}
|
||||
labels: by design,debugger
|
||||
ignoreLabels: language service,internal
|
||||
closeDays: 0
|
||||
closeComment: "This issue has been closed automatically because it's labeled as 'by design'."
|
||||
@@ -0,0 +1,28 @@
|
||||
name: By Design Closer
|
||||
on:
|
||||
schedule:
|
||||
- cron: 0 12 * * * # Run at 12:00 PM UTC (4:00 AM PST, 5:00 AM PDT)
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
readonly:
|
||||
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Actions
|
||||
uses: actions/checkout@v2
|
||||
- name: Install Actions
|
||||
run: cd ./.github/actions && npm install --production && cd ../..
|
||||
- name: Stale Closer
|
||||
uses: ./.github/actions/StaleCloser
|
||||
with:
|
||||
readonly: ${{ github.event.inputs.readonly }}
|
||||
labels: by design
|
||||
ignoreLabels: debugger,Feature Request,more info needed,internal
|
||||
closeDays: 60
|
||||
closeComment: "This issue has been closed automatically because it's labeled as 'by design' and has not had recent activity."
|
||||
pingDays: 80
|
||||
pingComment: "Hey @${assignee}, this issue might need further attention.\n\n@${author}, you can help us out by closing this issue if it is no longer relevant."
|
||||
@@ -0,0 +1,47 @@
|
||||
name: CI (Linux)
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Use Node.js 14.16.x
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: 14.16.x
|
||||
|
||||
- name: Install Dependencies
|
||||
run: yarn install
|
||||
working-directory: Extension
|
||||
|
||||
- name: Compile Sources
|
||||
run: yarn run compile
|
||||
working-directory: Extension
|
||||
|
||||
- name: Run Linter
|
||||
run: yarn run lint
|
||||
working-directory: Extension
|
||||
|
||||
- name: Compile Test Sources
|
||||
run: yarn run pretest
|
||||
working-directory: Extension
|
||||
|
||||
- name: Run unit tests
|
||||
uses: GabrielBB/[email protected]
|
||||
with:
|
||||
run: yarn run unitTests
|
||||
working-directory: Extension
|
||||
|
||||
# - name: Run languageServer integration tests
|
||||
# uses: GabrielBB/[email protected]
|
||||
# with:
|
||||
# run: yarn run integrationTests
|
||||
# working-directory: Extension
|
||||
@@ -0,0 +1,47 @@
|
||||
name: CI (Mac)
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: macos-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Use Node.js 14.16.x
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: 14.16.x
|
||||
|
||||
- name: Install Dependencies
|
||||
run: yarn install --network-timeout 100000
|
||||
working-directory: Extension
|
||||
|
||||
- name: Compile Sources
|
||||
run: yarn run compile
|
||||
working-directory: Extension
|
||||
|
||||
- name: Run Linter
|
||||
run: yarn run lint
|
||||
working-directory: Extension
|
||||
|
||||
- name: Compile Test Sources
|
||||
run: yarn run pretest
|
||||
working-directory: Extension
|
||||
|
||||
- name: Run unit tests
|
||||
uses: GabrielBB/[email protected]
|
||||
with:
|
||||
run: yarn run unitTests
|
||||
working-directory: Extension
|
||||
|
||||
# - name: Run languageServer integration tests
|
||||
# uses: GabrielBB/[email protected]
|
||||
# with:
|
||||
# run: yarn run integrationTests
|
||||
# working-directory: Extension
|
||||
@@ -0,0 +1,43 @@
|
||||
name: CI (Windows)
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: windows-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Use Node.js 14.16.x
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: 14.16.x
|
||||
|
||||
- name: Install Dependencies
|
||||
run: yarn install
|
||||
working-directory: Extension
|
||||
|
||||
- name: Compile Sources
|
||||
run: yarn run compile
|
||||
working-directory: Extension
|
||||
|
||||
- name: Run Linter
|
||||
run: yarn run lint
|
||||
working-directory: Extension
|
||||
|
||||
- name: Compile Test Sources
|
||||
run: yarn run pretest
|
||||
working-directory: Extension
|
||||
|
||||
- name: Run unit tests
|
||||
run: yarn run unitTests
|
||||
working-directory: Extension
|
||||
|
||||
# - name: Run languageServer integration tests
|
||||
# run: yarn run integrationTests
|
||||
# working-directory: Extension
|
||||
@@ -0,0 +1,28 @@
|
||||
name: Duplicate Closer
|
||||
on:
|
||||
schedule:
|
||||
- cron: 10 12 * * * # Run at 12:10 PM UTC (4:10 AM PST, 5:10 AM PDT)
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
readonly:
|
||||
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Actions
|
||||
uses: actions/checkout@v2
|
||||
- name: Install Actions
|
||||
run: cd ./.github/actions && npm install --production && cd ../..
|
||||
- name: Stale Closer
|
||||
uses: ./.github/actions/StaleCloser
|
||||
with:
|
||||
readonly: ${{ github.event.inputs.readonly }}
|
||||
labels: duplicate
|
||||
ignoreLabels: debugger,Feature Request,more info needed,by design,internal
|
||||
closeDays: 60
|
||||
closeComment: "This issue has been closed automatically because it's labeled as a 'duplicate' and has not had recent activity."
|
||||
pingDays: 80
|
||||
pingComment: "Hey @${assignee}, this issue might need further attention.\n\n@${author}, you can help us out by closing this issue if it is no longer relevant."
|
||||
@@ -0,0 +1,30 @@
|
||||
name: Enhancement Closer (no milestone)
|
||||
on:
|
||||
schedule:
|
||||
- cron: 50 11 * * * # Run at 11:50 AM UTC (3:50 AM PST, 4:50 AM PDT)
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
readonly:
|
||||
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Actions
|
||||
uses: actions/checkout@v2
|
||||
- name: Install Actions
|
||||
run: cd ./.github/actions && npm install --production && cd ../..
|
||||
- name: Stale Closer
|
||||
uses: ./.github/actions/StaleCloser
|
||||
with:
|
||||
readonly: ${{ github.event.inputs.readonly }}
|
||||
labels: enhancement
|
||||
ignoreLabels: debugger,internal,Feature Request
|
||||
addLabels: more votes needed
|
||||
closeDays: 60
|
||||
maximumVotes: 2
|
||||
closeComment: "This feature request is being closed due to insufficient upvotes. When enough upvotes are received, this issue will be eligible for our backlog."
|
||||
setMilestoneId: 30
|
||||
ignoreMilestoneNames: "*"
|
||||
@@ -0,0 +1,30 @@
|
||||
name: Enhancement Closer (Triage)
|
||||
on:
|
||||
schedule:
|
||||
- cron: 40 11 * * * # Run at 11:40 AM UTC (3:40 AM PST, 4:40 AM PDT)
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
readonly:
|
||||
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Actions
|
||||
uses: actions/checkout@v2
|
||||
- name: Install Actions
|
||||
run: cd ./.github/actions && npm install --production && cd ../..
|
||||
- name: Stale Closer
|
||||
uses: ./.github/actions/StaleCloser
|
||||
with:
|
||||
readonly: ${{ github.event.inputs.readonly }}
|
||||
labels: enhancement
|
||||
ignoreLabels: debugger,internal,Feature Request
|
||||
addLabels: more votes needed
|
||||
closeDays: 60
|
||||
maximumVotes: 2
|
||||
closeComment: "This feature request is being closed due to insufficient upvotes. When enough upvotes are received, this issue will be eligible for our backlog."
|
||||
milestoneName: Triage
|
||||
milestoneId: 30
|
||||
@@ -0,0 +1,31 @@
|
||||
name: Enhancement Reopener
|
||||
on:
|
||||
schedule:
|
||||
- cron: 20 12 * * * # Run at 12:20 PM UTC (4:20 AM PST, 5:20 AM PDT)
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
readonly:
|
||||
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Actions
|
||||
uses: actions/checkout@v2
|
||||
- name: Install Actions
|
||||
run: cd ./.github/actions && npm install --production && cd ../..
|
||||
- name: Run Reopener
|
||||
uses: ./.github/actions/Reopener
|
||||
with:
|
||||
readonly: ${{ github.event.inputs.readonly }}
|
||||
alsoApplyToOpenIssues: true
|
||||
reopenComment: This feature request has received enough votes to be added to our backlog.
|
||||
labels: enhancement
|
||||
minimumVotes: 3
|
||||
ignoreLabels: debugger,internal,Feature Request
|
||||
milestoneId: 30
|
||||
milestoneName: Triage
|
||||
setMilestoneId: 28
|
||||
removeLabels: more votes needed
|
||||
@@ -0,0 +1,26 @@
|
||||
name: External closer - debugger
|
||||
on:
|
||||
schedule:
|
||||
- cron: 10 11 * * * # Run at 11:10 AM UTC (3:10 AM PST, 4:10 AM PDT)
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
readonly:
|
||||
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Actions
|
||||
uses: actions/checkout@v2
|
||||
- name: Install Actions
|
||||
run: cd ./.github/actions && npm install --production && cd ../..
|
||||
- name: Stale Closer
|
||||
uses: ./.github/actions/StaleCloser
|
||||
with:
|
||||
readonly: ${{ github.event.inputs.readonly }}
|
||||
labels: external,debugger
|
||||
ignoreLabels: language service,internal
|
||||
closeDays: 0
|
||||
closeComment: "This issue has been closed automatically because it's labeled as 'external'."
|
||||
@@ -0,0 +1,30 @@
|
||||
name: Feature Request Closer (no milestone)
|
||||
on:
|
||||
schedule:
|
||||
- cron: 50 11 * * * # Run at 11:50 AM UTC (3:50 AM PST, 4:50 AM PDT)
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
readonly:
|
||||
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Actions
|
||||
uses: actions/checkout@v2
|
||||
- name: Install Actions
|
||||
run: cd ./.github/actions && npm install --production && cd ../..
|
||||
- name: Stale Closer
|
||||
uses: ./.github/actions/StaleCloser
|
||||
with:
|
||||
readonly: ${{ github.event.inputs.readonly }}
|
||||
labels: Feature Request
|
||||
ignoreLabels: debugger,internal
|
||||
addLabels: more votes needed
|
||||
closeDays: 60
|
||||
maximumVotes: 2
|
||||
closeComment: "This feature request is being closed due to insufficient upvotes. When enough upvotes are received, this issue will be eligible for our backlog."
|
||||
setMilestoneId: 30
|
||||
ignoreMilestoneNames: "*"
|
||||
@@ -0,0 +1,30 @@
|
||||
name: Feature Request Closer (Triage)
|
||||
on:
|
||||
schedule:
|
||||
- cron: 40 11 * * * # Run at 11:40 AM UTC (3:40 AM PST, 4:40 AM PDT)
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
readonly:
|
||||
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Actions
|
||||
uses: actions/checkout@v2
|
||||
- name: Install Actions
|
||||
run: cd ./.github/actions && npm install --production && cd ../..
|
||||
- name: Stale Closer
|
||||
uses: ./.github/actions/StaleCloser
|
||||
with:
|
||||
readonly: ${{ github.event.inputs.readonly }}
|
||||
labels: Feature Request
|
||||
ignoreLabels: debugger,internal
|
||||
addLabels: more votes needed
|
||||
closeDays: 60
|
||||
maximumVotes: 2
|
||||
closeComment: "This feature request is being closed due to insufficient upvotes. When enough upvotes are received, this issue will be eligible for our backlog."
|
||||
milestoneName: Triage
|
||||
milestoneId: 30
|
||||
@@ -0,0 +1,31 @@
|
||||
name: Feature Request Reopener
|
||||
on:
|
||||
schedule:
|
||||
- cron: 20 12 * * * # Run at 12:20 PM UTC (4:20 AM PST, 5:20 AM PDT)
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
readonly:
|
||||
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Actions
|
||||
uses: actions/checkout@v2
|
||||
- name: Install Actions
|
||||
run: cd ./.github/actions && npm install --production && cd ../..
|
||||
- name: Run Reopener
|
||||
uses: ./.github/actions/Reopener
|
||||
with:
|
||||
readonly: ${{ github.event.inputs.readonly }}
|
||||
alsoApplyToOpenIssues: true
|
||||
reopenComment: This feature request has received enough votes to be added to our backlog.
|
||||
labels: Feature Request
|
||||
minimumVotes: 3
|
||||
ignoreLabels: debugger,internal
|
||||
milestoneId: 30
|
||||
milestoneName: Triage
|
||||
setMilestoneId: 28
|
||||
removeLabels: more votes needed
|
||||
@@ -0,0 +1,26 @@
|
||||
name: Investigate closer - debugger
|
||||
on:
|
||||
schedule:
|
||||
- cron: 10 11 * * * # Run at 11:10 AM UTC (3:10 AM PST, 4:10 AM PDT)
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
readonly:
|
||||
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Actions
|
||||
uses: actions/checkout@v2
|
||||
- name: Install Actions
|
||||
run: cd ./.github/actions && npm install --production && cd ../..
|
||||
- name: Stale Closer
|
||||
uses: ./.github/actions/StaleCloser
|
||||
with:
|
||||
readonly: ${{ github.event.inputs.readonly }}
|
||||
labels: investigate,debugger
|
||||
ignoreLabels: language service,internal
|
||||
closeDays: 180
|
||||
closeComment: "This issue has been closed automatically because it has not had recent activity."
|
||||
@@ -0,0 +1,26 @@
|
||||
name: Investigate Costing closer - debugger
|
||||
on:
|
||||
schedule:
|
||||
- cron: 10 11 * * * # Run at 11:10 AM UTC (3:10 AM PST, 4:10 AM PDT)
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
readonly:
|
||||
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Actions
|
||||
uses: actions/checkout@v2
|
||||
- name: Install Actions
|
||||
run: cd ./.github/actions && npm install --production && cd ../..
|
||||
- name: Stale Closer
|
||||
uses: ./.github/actions/StaleCloser
|
||||
with:
|
||||
readonly: ${{ github.event.inputs.readonly }}
|
||||
labels: "investigate: costing,debugger"
|
||||
ignoreLabels: language service,internal
|
||||
closeDays: 180
|
||||
closeComment: "This issue has been closed automatically because it has not had recent activity."
|
||||
@@ -0,0 +1,25 @@
|
||||
name: Locker
|
||||
on:
|
||||
schedule:
|
||||
- cron: 30 11 * * * # Run at 11:30 AM UTC (3:30 AM PST, 4:30 AM PDT)
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
readonly:
|
||||
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Actions
|
||||
uses: actions/checkout@v2
|
||||
- name: Install Actions
|
||||
run: cd ./.github/actions && npm install --production && cd ../..
|
||||
- name: Run Locker
|
||||
uses: ./.github/actions/Locker
|
||||
with:
|
||||
readonly: ${{ github.event.inputs.readonly }}
|
||||
daysSinceClose: 45
|
||||
daysSinceUpdate: 3
|
||||
ignoreLabels: more votes needed,debugger,internal
|
||||
@@ -0,0 +1,29 @@
|
||||
name: More Info Needed Closer - debugger
|
||||
on:
|
||||
schedule:
|
||||
- cron: 10 11 * * * # Run at 11:10 AM UTC (3:10 AM PST, 4:10 AM PDT)
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
readonly:
|
||||
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Actions
|
||||
uses: actions/checkout@v2
|
||||
- name: Install Actions
|
||||
run: cd ./.github/actions && npm install --production && cd ../..
|
||||
- name: Stale Closer
|
||||
uses: ./.github/actions/StaleCloser
|
||||
with:
|
||||
readonly: ${{ github.event.inputs.readonly }}
|
||||
labels: more info needed,debugger
|
||||
ignoreLabels: language service,internal
|
||||
involves: wardengnaw,pieandcakes,calgagi
|
||||
closeDays: 14
|
||||
closeComment: "This issue has been closed automatically because it needs more information and has not had recent activity."
|
||||
pingDays: 7
|
||||
pingComment: "Hey @${assignee}, this issue might need further attention.\n\n@${author}, you can help us out by closing this issue if the problem no longer exists, or adding more information."
|
||||
@@ -0,0 +1,28 @@
|
||||
name: More Info Needed Closer
|
||||
on:
|
||||
schedule:
|
||||
- cron: 10 11 * * * # Run at 11:10 AM UTC (3:10 AM PST, 4:10 AM PDT)
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
readonly:
|
||||
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Actions
|
||||
uses: actions/checkout@v2
|
||||
- name: Install Actions
|
||||
run: cd ./.github/actions && npm install --production && cd ../..
|
||||
- name: Stale Closer
|
||||
uses: ./.github/actions/StaleCloser
|
||||
with:
|
||||
readonly: ${{ github.event.inputs.readonly }}
|
||||
labels: more info needed
|
||||
ignoreLabels: debugger,internal
|
||||
closeDays: 60
|
||||
closeComment: "This issue has been closed automatically because it needs more information and has not had recent activity."
|
||||
pingDays: 80
|
||||
pingComment: "Hey @${assignee}, this issue might need further attention.\n\n@${author}, you can help us out by closing this issue if the problem no longer exists, or adding more information."
|
||||
@@ -0,0 +1,29 @@
|
||||
name: Question Closer - debugger
|
||||
on:
|
||||
schedule:
|
||||
- cron: 20 11 * * * # Run at 11:20 AM UTC (3:20 AM PST, 4:20 AM PDT)
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
readonly:
|
||||
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Actions
|
||||
uses: actions/checkout@v2
|
||||
- name: Install Actions
|
||||
run: cd ./.github/actions && npm install --production && cd ../..
|
||||
- name: Stale Closer
|
||||
uses: ./.github/actions/StaleCloser
|
||||
with:
|
||||
readonly: ${{ github.event.inputs.readonly }}
|
||||
labels: question,debugger
|
||||
ignoreLabels: language service,internal
|
||||
involves: wardengnaw,pieandcakes,calgagi
|
||||
closeDays: 14
|
||||
closeComment: "This issue has been closed automatically because it's labeled as a 'question' and has not had recent activity."
|
||||
pingDays: 7
|
||||
pingComment: "Hey @${assignee}, this issue might need further attention.\n\n@${author}, you can help us out by closing this issue if the question has been answered."
|
||||
@@ -0,0 +1,28 @@
|
||||
name: Question Closer
|
||||
on:
|
||||
schedule:
|
||||
- cron: 20 11 * * * # Run at 11:20 AM UTC (3:20 AM PST, 4:20 AM PDT)
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
readonly:
|
||||
description: "readonly: Specify true or 1 to prevent changes from being commited to GitHub"
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Actions
|
||||
uses: actions/checkout@v2
|
||||
- name: Install Actions
|
||||
run: cd ./.github/actions && npm install --production && cd ../..
|
||||
- name: Stale Closer
|
||||
uses: ./.github/actions/StaleCloser
|
||||
with:
|
||||
readonly: ${{ github.event.inputs.readonly }}
|
||||
labels: question
|
||||
ignoreLabels: debugger,internal
|
||||
closeDays: 60
|
||||
closeComment: "This issue has been closed automatically because it's labeled as a 'question' and has not had recent activity."
|
||||
pingDays: 80
|
||||
pingComment: "Hey @${assignee}, this issue might need further attention.\n\n@${author}, you can help us out by closing this issue if the question has been answered."
|
||||
+9
-1
@@ -4,4 +4,12 @@ browse*.db*
|
||||
*.obj
|
||||
*.pdb
|
||||
*.exe
|
||||
*.ilk
|
||||
*.ilk
|
||||
|
||||
# ignore exported localization xlf and LCL directories
|
||||
Build/loc/LCL
|
||||
vscode-extensions-localization-export
|
||||
OneLocBuild
|
||||
|
||||
# ignore imported localization xlf directory
|
||||
vscode-translations-import
|
||||
|
||||
@@ -0,0 +1,299 @@
|
||||
NOTICES AND INFORMATION
|
||||
Do Not Translate or Localize
|
||||
|
||||
This software incorporates material from third parties. Microsoft makes certain
|
||||
open source code available at https://3rdpartysource.microsoft.com, or you may
|
||||
send a check or money order for US $5.00, including the product name, the open
|
||||
source component name, and version number, to:
|
||||
|
||||
Source Code Compliance Team
|
||||
Microsoft Corporation
|
||||
One Microsoft Way
|
||||
Redmond, WA 98052
|
||||
USA
|
||||
|
||||
Notwithstanding any other terms, you may reverse engineer this software to the
|
||||
extent required to debug changes to any libraries licensed under the GNU Lesser
|
||||
General Public License.
|
||||
|
||||
---
|
||||
|
||||
LLDB-MI
|
||||
|
||||
==============================================================================
|
||||
The LLVM Project is under the Apache License v2.0 with LLVM Exceptions:
|
||||
==============================================================================
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
|
||||
---- LLVM Exceptions to the Apache 2.0 License ----
|
||||
|
||||
As an exception, if, as a result of your compiling your source code, portions
|
||||
of this Software are embedded into an Object form of such source code, you
|
||||
may redistribute such embedded portions in such Object form without complying
|
||||
with the conditions of Sections 4(a), 4(b) and 4(d) of the License.
|
||||
|
||||
In addition, if you combine or link compiled forms of this Software with
|
||||
software that is licensed under the GPLv2 ("Combined Software") and if a
|
||||
court of competent jurisdiction determines that the patent provision (Section
|
||||
3), the indemnity provision (Section 9) or other Section of the License
|
||||
conflicts with the conditions of the GPLv2, you may retroactively and
|
||||
prospectively choose to deem waived or otherwise exclude such Section(s) of
|
||||
the License, but only in their entirety and only with respect to the Combined
|
||||
Software.
|
||||
|
||||
==============================================================================
|
||||
Software from third parties included in the LLVM Project:
|
||||
==============================================================================
|
||||
The LLVM Project contains third party software which is under different license
|
||||
terms. All such code will be identified clearly using at least one of two
|
||||
mechanisms:
|
||||
1) It will be in a separate directory tree with its own `LICENSE.txt` or
|
||||
`LICENSE` file at the top containing the specific license and restrictions
|
||||
which apply to that software, or
|
||||
2) It will contain specific license and restriction terms at the top of every
|
||||
file.
|
||||
|
||||
==============================================================================
|
||||
Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy):
|
||||
==============================================================================
|
||||
University of Illinois/NCSA
|
||||
Open Source License
|
||||
|
||||
Copyright (c) 2010 Apple Inc.
|
||||
All rights reserved.
|
||||
|
||||
Developed by:
|
||||
|
||||
LLDB Team
|
||||
|
||||
http://lldb.llvm.org/
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal with
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimers.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimers in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the names of the LLDB Team, copyright holders, nor the names of
|
||||
its contributors may be used to endorse or promote products derived from
|
||||
this Software without specific prior written permission.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
|
||||
SOFTWARE.
|
||||
|
||||
---
|
||||
@@ -0,0 +1,6 @@
|
||||
This folder contains the entitlements needed for the debugger to run on macOS.
|
||||
|
||||
We use the entitlements that the .net runtime uses. See https://github.com/dotnet/runtime/blob/57678512d214af368ff055f358c5106f1aa19ac4/eng/pipelines/common/entitlements.plist
|
||||
|
||||
Related Links:
|
||||
https://docs.microsoft.com/en-us/dotnet/core/install/macos-notarization-issues#default-entitlements
|
||||
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.cs.allow-jit</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.disable-library-validation</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.debugger</key>
|
||||
<true/>
|
||||
<key>com.apple.security.get-task-allow</key>
|
||||
<true/>
|
||||
<key>com.apple.security.task_for_pid-allow</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,30 @@
|
||||
---
|
||||
parameters:
|
||||
archs: ["x86_64", "arm64"]
|
||||
|
||||
jobs:
|
||||
- job:
|
||||
pool:
|
||||
name: VSEngSS-MicroBuild2022-1ES
|
||||
steps:
|
||||
- checkout: none
|
||||
|
||||
- ${{ each arch in parameters.archs }}:
|
||||
- task: DownloadPipelineArtifact@1
|
||||
displayName: 'Downloading unsigned_lldb-mi_${{ arch }}'
|
||||
inputs:
|
||||
targetPath: '$(Pipeline.Workspace)/Artifacts'
|
||||
artifactName: 'unsigned_lldb-mi_${{ arch }}'
|
||||
|
||||
- task: MicroBuildSignMacFiles@1
|
||||
displayName: 'ESRP Sign'
|
||||
inputs:
|
||||
SigningTarget: '$(Pipeline.Workspace)\Artifacts\lldb-mi_${{ arch }}.zip'
|
||||
SigningCert: 8023
|
||||
|
||||
- task: PublishPipelineArtifact@1
|
||||
displayName: 'Publish signed LLDB-MI'
|
||||
inputs:
|
||||
targetPath: '$(Pipeline.Workspace)\Artifacts\lldb-mi_${{ arch }}.zip'
|
||||
artifactName: 'lldb-mi_${{ arch }}_zip'
|
||||
...
|
||||
@@ -0,0 +1,160 @@
|
||||
parameters:
|
||||
# Note: Make sure llvm_repo is the same as the one in Extension/cgmanifest.json
|
||||
# 'RepositoryUrl' for llvm-project.
|
||||
llvm_repo: https://github.com/llvm/llvm-project.git
|
||||
|
||||
# Note: Make sure llvm_commit is the same as the one in Extension/cgmanifest.json
|
||||
# 'CommitHash' for llvm-project.
|
||||
llvm_commit: 0d44201451f03ba907cdb268ddddfc3fa38a0ebd
|
||||
|
||||
llvm_build_type: Release
|
||||
|
||||
llvm_arch: x86_64
|
||||
|
||||
llvm_additional_parameters: "-DLLDB_USE_SYSTEM_DEBUGSERVER=ON -DLLDB_RELOCATABLE_PYTHON=1 -DLLDB_INCLUDE_TESTS=OFF -DLLDB_BUILD_FRAMEWORK=1"
|
||||
|
||||
# Note: Make sure lldb_mi_repo is the same as the one in Extension/cgmanifest.json
|
||||
# 'CommitHash' for lldb-mi.
|
||||
lldb_mi_repo: https://github.com/lldb-tools/lldb-mi.git
|
||||
|
||||
# Note: Make sure lldb_mi_commit is the same as the one in Extension/cgmanifest.json
|
||||
# 'CommitHash' for lldb-mi.
|
||||
lldb_mi_commit: 2388bd74133bc21eac59b2e2bf97f2a30770a315
|
||||
|
||||
lldb_mi_additional_parameters: "-DUSE_LLDB_FRAMEWORK=1"
|
||||
|
||||
jobs:
|
||||
- job: LLDB_MI_${{ parameters.llvm_arch }}
|
||||
timeoutInMinutes: 360
|
||||
pool:
|
||||
${{if eq(parameters['llvm_arch'], 'arm64')}}:
|
||||
name: cpptoolsMacM1pool
|
||||
${{ else }}:
|
||||
vmImage: macOS-latest
|
||||
steps:
|
||||
- task: CmdLine@2
|
||||
displayName: 'Install Dependencies'
|
||||
inputs:
|
||||
script: brew install cmake ninja swig
|
||||
continueOnError: true
|
||||
|
||||
- task: CmdLine@2
|
||||
displayName: 'Make sure buildspace does not exist'
|
||||
inputs:
|
||||
script: rm -rf $(Build.StagingDirectory)/buildspace
|
||||
condition: always()
|
||||
|
||||
- task: CmdLine@2
|
||||
displayName: 'Build LLVM Project'
|
||||
inputs:
|
||||
script: |
|
||||
log_and_exec_cmd() {
|
||||
echo "##[command] $1"
|
||||
$1
|
||||
}
|
||||
|
||||
log_and_exec_cmd "sudo rm -rf /Library/Developer/CommandLineTools"
|
||||
log_and_exec_cmd "sudo xcode-select --switch /Applications/XCode.app"
|
||||
|
||||
log_and_exec_cmd "cd $(Build.StagingDirectory)"
|
||||
log_and_exec_cmd "mkdir $(Build.StagingDirectory)/buildspace"
|
||||
|
||||
log_and_exec_cmd "git clone ${{ parameters.llvm_repo }} llvm-project"
|
||||
log_and_exec_cmd "cd llvm-project"
|
||||
log_and_exec_cmd "git checkout ${{ parameters.llvm_commit }}"
|
||||
|
||||
log_and_exec_cmd "./lldb/scripts/macos-setup-codesign.sh"
|
||||
|
||||
log_and_exec_cmd "cd .."
|
||||
log_and_exec_cmd "mkdir $(Build.StagingDirectory)/buildspace/llvm-inst"
|
||||
log_and_exec_cmd "mkdir $(Build.StagingDirectory)/buildspace/llvm-build"
|
||||
log_and_exec_cmd "cd $(Build.StagingDirectory)/buildspace/llvm-build"
|
||||
|
||||
log_and_exec_cmd "cmake -DLLVM_ENABLE_PROJECTS=clang;lldb -DCMAKE_BUILD_TYPE=${{ parameters.llvm_build_type }} -DCMAKE_INSTALL_PREFIX=$(Build.StagingDirectory)/buildspace/llvm-inst/ -DCMAKE_OSX_ARCHITECTURES=${{ parameters.llvm_arch }} ${{ parameters.llvm_additional_parameters }} -GNinja $(Build.StagingDirectory)/llvm-project/llvm"
|
||||
if [[ $? -ne 0 ]]
|
||||
then
|
||||
echo "##[error] cmake llvm failed"
|
||||
cat $(Build.SourcesDirectory)/buildspace/llvm-build/CMakeFiles/CMakeError.log
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_and_exec_cmd ninja
|
||||
if [[ $? -ne 0 ]]
|
||||
then
|
||||
echo "##[error] ninja failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
### Workaround for https://github.com/llvm/llvm-project/issues/108
|
||||
log_and_exec_cmd "ninja install"
|
||||
|
||||
# Remove conflicting LLDB.framework file.
|
||||
log_and_exec_cmd "rm -rf $(Build.StagingDirectory)/buildspace/llvm-inst/Library/Frameworks/LLDB.framework"
|
||||
|
||||
# Build lldb/sources/API first
|
||||
log_and_exec_cmd "cmake -P $(Build.StagingDirectory)/buildspace/llvm-build/tools/lldb/source/API/cmake_install.cmake"
|
||||
### End of Workaround
|
||||
|
||||
log_and_exec_cmd "ninja install"
|
||||
if [[ $? -ne 0 ]]
|
||||
then
|
||||
echo "##[error] ninja install failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "##[section] Build LLDB-MI"
|
||||
# Download lldb-mi and build it against our custom installation.
|
||||
log_and_exec_cmd "cd $(Build.StagingDirectory)/buildspace"
|
||||
log_and_exec_cmd "git clone ${{ parameters.lldb_mi_repo }} lldb-mi"
|
||||
log_and_exec_cmd "cd lldb-mi"
|
||||
log_and_exec_cmd "git checkout ${{ parameters.lldb_mi_commit }}"
|
||||
|
||||
# Create a separate build directory for building lldb-mi.
|
||||
log_and_exec_cmd "mkdir build"
|
||||
log_and_exec_cmd "cd build"
|
||||
log_and_exec_cmd "cmake -DCMAKE_PREFIX_PATH=$(Build.StagingDirectory)/buildspace/llvm-inst/ -DCMAKE_OSX_ARCHITECTURES=${{ parameters.llvm_arch }} ${{ parameters.lldb_mi_additional_parameters }} -GNinja .."
|
||||
log_and_exec_cmd "ninja"
|
||||
if [[ $? -ne 0 ]]
|
||||
then
|
||||
echo "##[error] ninja failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_and_exec_cmd "mkdir $(Build.StagingDirectory)/publish"
|
||||
log_and_exec_cmd "cd $(Build.StagingDirectory)/publish"
|
||||
|
||||
log_and_exec_cmd "mkdir -p ./debugAdapters/lldb-mi_${{ parameters.llvm_arch }}/bin"
|
||||
|
||||
log_and_exec_cmd "cp $(Build.StagingDirectory)/buildspace/lldb-mi/build/src/lldb-mi ./debugAdapters/lldb-mi_${{ parameters.llvm_arch }}/bin/."
|
||||
|
||||
# Set rpath for finding LLDB.Framework
|
||||
log_and_exec_cmd "install_name_tool -add_rpath @rpath/LLDB.framework/Versions/A/LLDB ./debugAdapters/lldb-mi_${{ parameters.llvm_arch }}/bin/lldb-mi"
|
||||
|
||||
# Set rpath for App Store XCode LLDB.Framework
|
||||
log_and_exec_cmd "install_name_tool -add_rpath /Applications/Xcode.app/Contents/SharedFrameworks/ ./debugAdapters/lldb-mi_${{ parameters.llvm_arch }}/bin/lldb-mi"
|
||||
|
||||
# Set rpath for XCode CLI LLDB.Framework
|
||||
log_and_exec_cmd "install_name_tool -add_rpath /Library/Developer/CommandLineTools/Library/PrivateFrameworks/ ./debugAdapters/lldb-mi_${{ parameters.llvm_arch }}/bin/lldb-mi"
|
||||
|
||||
# Set rpath next to the lldb-mi executable LLDB.Framework
|
||||
log_and_exec_cmd "install_name_tool -add_rpath @executable_path/. ./debugAdapters/lldb-mi_${{ parameters.llvm_arch }}/bin/lldb-mi"
|
||||
|
||||
# Add entitlements
|
||||
log_and_exec_cmd "codesign -s - -f --entitlements $(Build.SourcesDirectory)/Build/lldb-mi/debugger-entitlements.plist ./debugAdapters/lldb-mi_${{ parameters.llvm_arch }}/bin/lldb-mi"
|
||||
|
||||
# Grab NOTICE.TXT
|
||||
cp $(Build.SourcesDirectory)/Build/lldb-mi/NOTICE.TXT ./debugAdapters/lldb-mi_${{ parameters.llvm_arch }}/.
|
||||
|
||||
zip -r $(Build.StagingDirectory)/lldb-mi_${{ parameters.llvm_arch }}.zip ./debugAdapters
|
||||
|
||||
- task: PublishPipelineArtifact@1
|
||||
displayName: 'Publish LLDB-MI'
|
||||
inputs:
|
||||
targetPath: '$(Build.StagingDirectory)/lldb-mi_${{ parameters.llvm_arch }}.zip'
|
||||
artifactName: 'unsigned_lldb-mi_${{ parameters.llvm_arch }}'
|
||||
|
||||
- task: CmdLine@2
|
||||
displayName: 'Clean up'
|
||||
inputs:
|
||||
script: rm -rf $(Build.StagingDirectory)/buildspace
|
||||
condition: always()
|
||||
@@ -0,0 +1,23 @@
|
||||
parameters:
|
||||
- name: Build_Type
|
||||
displayName: Build Type
|
||||
type: string
|
||||
default: Release
|
||||
|
||||
stages:
|
||||
- stage: Build
|
||||
dependsOn: []
|
||||
jobs:
|
||||
- template: lldb-mi.template.yml
|
||||
parameters:
|
||||
llvm_build_type: ${{ parameters.Build_Type }}
|
||||
llvm_arch: x86_64
|
||||
- template: lldb-mi.template.yml
|
||||
parameters:
|
||||
llvm_build_type: ${{ parameters.Build_Type }}
|
||||
llvm_arch: arm64
|
||||
|
||||
- stage: Signing
|
||||
dependsOn: ["Build"]
|
||||
jobs:
|
||||
- template: lldb-mi-sign.template.yml
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"Projects": [
|
||||
{
|
||||
"LanguangeSet": "VS_Main_Languages",
|
||||
"LocItems": [
|
||||
{
|
||||
"SourceFile": "vscode-extensions-localization-export\\vscode-extensions\\vscode-cpptools.xlf",
|
||||
"Languages": "cs;de;es;fr;it;ja;ko;pl;pt-BR;ru;tr;zh-Hans;zh-Hant",
|
||||
"LclFile": "Build\\loc\\LCL\\{Lang}\\vscode-cpptools.xlf.lcl"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
# ==================================================================================
|
||||
# Pipeline for VsCodeExtension-Localization build definition
|
||||
# Runs OneLocBuild task to localize xlf file
|
||||
# ==================================================================================
|
||||
|
||||
resources:
|
||||
repositories:
|
||||
- repository: self
|
||||
clean: true
|
||||
|
||||
trigger: none
|
||||
pr: none
|
||||
schedules:
|
||||
- cron: "0 7 * * *"
|
||||
displayName: Daily 7 AM
|
||||
branches:
|
||||
include:
|
||||
- main
|
||||
always: true
|
||||
|
||||
pool:
|
||||
name: 'AzurePipelines-EO'
|
||||
demands:
|
||||
- ImageOverride -equals AzurePipelinesWindows2022compliant
|
||||
|
||||
steps:
|
||||
- task: CmdLine@2
|
||||
inputs:
|
||||
script: 'cd Extension && yarn install'
|
||||
|
||||
- task: CmdLine@2
|
||||
inputs:
|
||||
script: 'cd ./Extension && yarn run translations-export && cd ..'
|
||||
|
||||
- task: OneLocBuild@2
|
||||
env:
|
||||
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
|
||||
inputs:
|
||||
locProj: 'Build/loc/LocProject.json'
|
||||
outDir: '$(Build.ArtifactStagingDirectory)'
|
||||
isCreatePrSelected: false
|
||||
prSourceBranchPrefix: 'locfiles'
|
||||
packageSourceAuth: 'patAuth'
|
||||
patVariable: '$(OneLocBuildPat)'
|
||||
LclSource: lclFilesfromPackage
|
||||
LclPackageId: 'LCL-JUNO-PROD-VCPP'
|
||||
lsBuildXLocPackageVersion: '7.0.30510'
|
||||
|
||||
- task: CmdLine@2
|
||||
inputs:
|
||||
script: 'cd Extension && node ./translations_auto_pr.js microsoft vscode-cpptools csigs $(csigsPat) csigs [email protected] "$(Build.ArtifactStagingDirectory)/loc" vscode-extensions-localization-export/vscode-extensions && cd ..'
|
||||
|
||||
- task: PublishBuildArtifacts@1
|
||||
inputs:
|
||||
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
|
||||
ArtifactName: 'drop'
|
||||
publishLocation: 'Container'
|
||||
+8
-2
@@ -1,3 +1,9 @@
|
||||
## Microsoft Open Source Code of Conduct
|
||||
# Microsoft Open Source Code of Conduct
|
||||
|
||||
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact opencode@microsoft.com with any additional questions or comments.
|
||||
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
|
||||
|
||||
Resources:
|
||||
|
||||
- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/)
|
||||
- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)
|
||||
- Contact [[email protected]](mailto:[email protected]) with questions or concerns
|
||||
+17
-2
@@ -6,15 +6,30 @@
|
||||
* File an [issue](https://github.com/Microsoft/vscode-cpptools/issues) and a [pull request](https://github.com/Microsoft/vscode-cpptools/pulls) with the change and we will review it.
|
||||
* If the change affects functionality, add a line describing the change to [**CHANGELOG.md**](Extension/CHANGELOG.md).
|
||||
* Try and add a test in [**test/extension.test.ts**](Extension/test/unitTests/extension.test.ts).
|
||||
* Run tests via opening the [**Extension**](https://github.com/Microsoft/vscode-cpptools/tree/master/Extension) folder in Visual Studio Code, selecting the "Launch Tests" configuration in the Debug pane, and choosing "Start Debugging".
|
||||
* Run tests via opening the [**Extension**](https://github.com/Microsoft/vscode-cpptools/tree/main/Extension) folder in Visual Studio Code, selecting the "Launch Tests" configuration in the Debug pane, and choosing "Start Debugging".
|
||||
|
||||
## About the Code
|
||||
|
||||
* Execution starts in the `activate` method in [**main.ts**](Extension/src/main.ts).
|
||||
* `processRuntimeDependencies` handles the downloading and installation of the OS-dependent files. Downloading code exists in [**packageManager.ts**](Extension/src/packageManager.ts).
|
||||
* `downloadCpptoolsJsonPkg` handles the **cpptools.json**, which can be used to enable changes to occur mid-update, such as turning the `intelliSenseEngine` to `"Default"` for a certain percentage of users.
|
||||
* The debugger code is in the [**Debugger**](https://github.com/Microsoft/vscode-cpptools/tree/master/Extension/src/Debugger) folder.
|
||||
* The debugger code is in the [**Debugger**](https://github.com/Microsoft/vscode-cpptools/tree/main/Extension/src/Debugger) folder.
|
||||
* [**LanguageServer/client.ts**](Extension/src/LanguageServer/client.ts) handles various language server functionality.
|
||||
* [**LanguageServer/configurations.ts**](Extension/src/LanguageServer/configurations.ts) handles functionality related to **c_cpp_properties.json**.
|
||||
* [**telemetry.ts**](Extension/src/telemetry.ts): Telemetry data gets sent to either `logLanguageServerEvent` or `logDebuggerEvent`.
|
||||
* The Tag Parser (symbol database) doesn't automatically expand macros, so the [**cpp.hint**](Extension/cpp.hint) file contains definitions of macros that should be expanded in order for symbols to be parsed correctly.
|
||||
|
||||
## String Localization
|
||||
|
||||
* [vscode-nls](https://github.com/microsoft/vscode-nls) is used to localize strings in TypeScript code. To use [vscode-nls](https://github.com/microsoft/vscode-nls), the source file must contain:
|
||||
```typescript
|
||||
import * as nls from 'vscode-nls';
|
||||
|
||||
nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })();
|
||||
const localize: nls.LocalizeFunc = nls.loadMessageBundle();
|
||||
```
|
||||
* For each user-facing string, wrap the string in a call to localize:
|
||||
```typescript
|
||||
const readmeMessage: string = localize("refer.read.me", "Please refer to {0} for troubleshooting information. Issues can be created at {1}", readmePath, "https://github.com/Microsoft/vscode-cpptools/issues");
|
||||
```
|
||||
* The first parameter to localize should be a unique key for that string, not used by any other call to localize() in the file unless representing the same string. The second parameter is the string to localize. Both of these parameters must be string literals. Tokens such as {0} and {1} are supported in the localizable string, with replacement values passed as additional parameters to localize().
|
||||
|
||||
@@ -21,4 +21,4 @@ This option will generate a tasks.json file for you, build your active source fi
|
||||
|
||||
### F5
|
||||
Another way to begin building and debugging your active file is to execute the command by pressing <kbd>F5</kbd>. This method will configure
|
||||
both a tasks.json and launch.json file for you, build your active source file, and then launch the debugger.
|
||||
both a tasks.json and launch.json file for you, build your active source file, and then launch the debugger.
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# Fib
|
||||
|
||||
This code sample is to show debugging. Update `launch.json` and `tasks.json` in the `.vscode` folder to use your setup to build and debug.
|
||||
This code sample is to show debugging. Update `launch.json` and `tasks.json` in the `.vscode` folder to use your setup to build and debug.
|
||||
@@ -15,14 +15,14 @@ static int fib(int n){
|
||||
switch (n) {
|
||||
case 0: return 1;
|
||||
case 1: return 1;
|
||||
default: return (fib(n-2) + fib(n-1));
|
||||
}
|
||||
default: return (fib(n-2) + fib(n-1));
|
||||
}
|
||||
}
|
||||
|
||||
void * thread_proc(void* ctx)
|
||||
{
|
||||
int tid = g_tid++;
|
||||
|
||||
|
||||
char thread_name[16];
|
||||
sprintf(thread_name, "Thread %d", tid);
|
||||
#ifdef __APPLE__
|
||||
@@ -30,19 +30,19 @@ void * thread_proc(void* ctx)
|
||||
#else
|
||||
pthread_setname_np(pthread_self(), thread_name);
|
||||
#endif
|
||||
|
||||
|
||||
// Random delay, 0 - 0.5 sec
|
||||
timespec ts;
|
||||
ts.tv_sec = 0;
|
||||
ts.tv_nsec = 500000000 + ((float)rand() / (float)RAND_MAX) * 500000000;
|
||||
nanosleep(&ts, NULL);
|
||||
|
||||
|
||||
volatile int i = 0;
|
||||
while (i <= 30) {
|
||||
std::cout << "Thread " << tid << ": fib(" << i << ") = " << fib(i) << std::endl;
|
||||
i++;
|
||||
nanosleep(&ts, NULL);
|
||||
}
|
||||
|
||||
|
||||
std::cout << thread_name << " exited!" << std::endl;
|
||||
}
|
||||
@@ -5,10 +5,19 @@ These steps will allow you to debug the TypeScript code that is part of the Micr
|
||||
Prerequisite steps:
|
||||
* Clone the release branch of [this](https://github.com/Microsoft/vscode-cpptools) repository.
|
||||
* git clone -b release https://github.com/Microsoft/vscode-cpptools
|
||||
* Install [npm](https://nodejs.org).
|
||||
* Install [node](https://nodejs.org).
|
||||
* Install [yarn](https://yarnpkg.com).
|
||||
* From a command line, run the following commands from the **Extension** folder in the root of the repository:
|
||||
* `npm install` will install the dependencies needed to build the extension.
|
||||
* **(optional)** `npm install -g vsce` will install `vsce` globally to create a VSIX package that you can install.
|
||||
* **(optional)** Set an environment variable `CPPTOOLS_DEV=1`.
|
||||
* This enables the local developer workflow when testing the debugger, copying dependencies from the **node_modules** folder. Testing the language server does not require this step.
|
||||
* `yarn install` will install the dependencies needed to build the extension.
|
||||
* **(optional)** `yarn global add vsce` will install `vsce` globally to create a VSIX package that you can install.
|
||||
* Open the **Extension** folder in Visual Studio Code and press F5. This will launch a VS Code Extension Host window and activate the TypeScript debugger. You can set breakpoints on the extension source code and debug your scenario.
|
||||
* If, after pressing F5, you see the following error in the `[Extension Development Host]` window,
|
||||
> Unable to start the C/C++ language server. IntelliSense features will be disabled. Error: Missing binary at .../vscode-cpptools/Extension/bin/cpptools
|
||||
* Then, you can follow the instructions in this [comment in a discussion about building this extension locally](https://github.com/microsoft/vscode-cpptools/discussions/8745#discussioncomment-2091563).
|
||||
> get the <package.version.number> binaries from installing the extension and then copying the binaries
|
||||
1. To do this, install this extension from the Visual Studio Marketplace and find its location on your device. It might be in a directory like `\\wsl$\Ubuntu\home\hamir\.vscode-server\extensions\ms-vscode.cpptools-<package.version.number>`, for example.
|
||||
2. Next, go to the `bin/` directory of the aforementioned directory, and drag-and-drop, or copy-and-paste, `cpptools` and `cpptools-srv` from `...\extensions\ms-vscode.cpptools-<package.version.number>\bin\` to this repository's `Extension\bin\` directory on your local device, so that `.../vscode-cpptools/Extension/bin/cpptools` and `.../vscode-cpptools/Extension/bin/cpptools-srv` both exist in your workspace.
|
||||
3. The aforementioned warning should be gone, and Intellisense, which gives those squiggly red error lines, should now be present.
|
||||
4. The `insiders` branch has binaries compatible with the latest Pre-Release version of the extension, and the `release` branch has binaries compatible with the latest Release version, but the `main` branch may have TypeScript changes that are incompatible with the published binaries, in which case, you'll need to create a branch off the `insiders` or `release` branches.
|
||||
|
||||
* Feel free to use [the Discussions tab of this repository](https://github.com/microsoft/vscode-cpptools/discussions) if you have any further questions on building this extension locally.
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
# Exception Settings
|
||||
|
||||
The Microsoft Windows C/C++ debugger (cppvsdbg) supports configuration options for if the debugger stops when exceptions are thrown. This is done with the 'All Exceptions' check box in the BREAKPOINTS section of the 'Run and Debug' view.
|
||||
|
||||
Note that the BREAKPOINTS section will be missing this entry until the first time that the folder has been debugged with the 'cppvsdbg' debugger.
|
||||
|
||||
Checking 'All Exceptions' will configure the debugger to stop when an exception is thrown.
|
||||
|
||||
##### Exception Conditions
|
||||
|
||||
The 'All Exceptions' checkbox support conditions to break on only selected exception types (C++ exceptions) or codes (Win32 exceptions). To edit the condition, click on the pencil icon or right click on the entry and invoke 'Edit Condition'. The condition is a comma-separated list of exception types and codes to break on, or if the list starts with '!', a list of exception types and codes to ignore.
|
||||
|
||||
Examples conditions:
|
||||
|
||||
| Example condition value | Result |
|
||||
|-------------------------|--------|
|
||||
| 0xC0000005, 0xC0000094 | Break on Win32 Access Violation exceptions and integer division by zero exceptions |
|
||||
| std::out_of_range, 0xC0000005 | This will break on out-of-range exceptions, and access violation exceptions |
|
||||
| !MyExceptionClass | This will break on all exceptions except C++ `MyExceptionClass` exceptions |
|
||||
| !MyExceptionClass, 0x6831C815 | This will break on all exceptions except C++ `MyExceptionClass` exceptions and Win32 exceptions with custom code 0x6831C815 |
|
||||
@@ -1,6 +1,6 @@
|
||||
# How To Debug MIEngine
|
||||
|
||||
MIEngine is one of the components used to enable the C/C++ debugging scenario with the Microsoft C/C++ extension with VS Code. This document is to help enable users who want to debug and contribute to MIEngine to fix issues or extend functionality. MIEngine is used to communicate with `gdb`/`lldb` using the MI protocol.
|
||||
MIEngine is one of the components used to enable the C/C++ debugging scenario with the Microsoft C/C++ extension with VS Code. This document is to help enable users who want to debug and contribute to MIEngine to fix issues or extend functionality. MIEngine is used to communicate with `gdb`/`lldb` using the MI protocol.
|
||||
|
||||
**Repository:** https://github.com/Microsoft/MIEngine
|
||||
|
||||
@@ -19,7 +19,7 @@ You can open the solution file **MIDebugEngine.sln** located under **src** and c
|
||||
|
||||
The symbol files are as follows:
|
||||
|
||||
**On Windows**
|
||||
**On Windows**
|
||||
* Microsoft.MICore.pdb
|
||||
* Microsoft.MIDebugEngine.pdb
|
||||
* vscode\OpenDebugAD7.pdb
|
||||
@@ -37,7 +37,7 @@ On Windows, the easiest way to debug is to use Visual Studio. Locate the **src\D
|
||||
|
||||
If you are not building the extension, Locate the **out\src\Debugger\extension.ts** file in the **.vscode\extensions\ms-vscode.cpptools** folder and open it in an editor.
|
||||
|
||||
Locate the following lines:
|
||||
Locate the following lines:
|
||||
```json
|
||||
return {
|
||||
command: command
|
||||
@@ -48,13 +48,13 @@ and add the following line to the object:
|
||||
args: ["--pauseForDebugger"]
|
||||
```
|
||||
|
||||
This will cause the debugger to look like it has hung once you start debugging, but in reality it is waiting for a debugger to attach. Set your breakpoints and attach your debugger to the `OpenDebugAD7.exe` process. Once the debugger is attached, VS Code should start debugging and you can reproduce your scenario.
|
||||
This will cause the debugger to look like it has hung once you start debugging, but in reality it is waiting for a debugger to attach. Set your breakpoints and attach your debugger to the `OpenDebugAD7.exe` process. Once the debugger is attached, VS Code should start debugging and you can reproduce your scenario.
|
||||
|
||||
### Debugging MIEngine running on Linux or Mac OS X
|
||||
### Debugging MIEngine running on Linux or macOS
|
||||
|
||||
#### With MonoDevelop
|
||||
|
||||
On Linux and Mac OS X, we use `mono` as our framework. You can download Xamarin Studio v5.10.1.6 and remotely attach to your Mac or Linux box to debug there.
|
||||
On Linux and macOS, we use `mono` as our framework. You can download Xamarin Studio v5.10.1.6 and remotely attach to your Mac or Linux box to debug there.
|
||||
|
||||
##### Install Prerequisites
|
||||
1. Install [GTK](http://www.mono-project.com/download/).
|
||||
@@ -78,12 +78,12 @@ MonoDevelop.exe
|
||||
|
||||
##### Configure the extension to enable remote debugging
|
||||
|
||||
Open the **~/.vscode/extensions/ms-vscode.cpptools-\<version\>/debugAdapters/OpenDebugAD7** file with a text editor and locate and uncomment the line at the bottom. When you start debugging, it will now hang until the remote debugger is attached from Xamarin Studio.
|
||||
Open the **~/.vscode/extensions/ms-vscode.cpptools-\<version\>/debugAdapters/OpenDebugAD7** file with a text editor and locate and uncomment the line at the bottom. When you start debugging, it will now hang until the remote debugger is attached from Xamarin Studio.
|
||||
|
||||
##### Attach the remote debugger
|
||||
|
||||
In MonoDevelop: Run -> Run With -> Custom Command Mono Soft Debugger.
|
||||
Fill in the IP and port of the Linux/Mac OS X machine and hit "Connect" to start debugging.
|
||||
Fill in the IP and port of the Linux/macOS machine and hit "Connect" to start debugging.
|
||||
|
||||
After you've done this once, you can hit the MonoDevelop "Play" button or <kbd>F5</kbd> to bring up the connect dialog again.
|
||||
|
||||
@@ -113,7 +113,7 @@ After you've done this once, you can hit the MonoDevelop "Play" button or <kbd>F
|
||||
|
||||
##### Configure the extension to enable remote debugging
|
||||
|
||||
Open the **~/.vscode/extensions/ms-vscode.cpptools-\<version\>/debugAdapters/OpenDebugAD7** file with a text editor and locate and uncomment the line at the bottom. When you start debugging, it will now hang until the remote debugger is attached from VS Code.
|
||||
Open the **~/.vscode/extensions/ms-vscode.cpptools-\<version\>/debugAdapters/OpenDebugAD7** file with a text editor and locate and uncomment the line at the bottom. When you start debugging, it will now hang until the remote debugger is attached from VS Code.
|
||||
|
||||
##### Attach the remote debugger
|
||||
|
||||
|
||||
@@ -1,54 +1 @@
|
||||
# Pipe Transport
|
||||
|
||||
Pipe Transport allows communication through a pipe program to a remote shell. An example on Linux would be `ssh`.
|
||||
|
||||
## How-To
|
||||
|
||||
We have added `"pipeTransport"` as an option within the **launch.json** file. The structure looks as follows:
|
||||
```json
|
||||
"pipeTransport": {
|
||||
"pipeCwd": "/usr/bin",
|
||||
"pipeProgram": "/usr/bin/ssh",
|
||||
"pipeArgs": [
|
||||
"-pw",
|
||||
"<password>",
|
||||
"[email protected]"
|
||||
],
|
||||
"debuggerPath": "/usr/bin/gdb"
|
||||
},
|
||||
```
|
||||
The `pipeArgs` can be any set of arguments necessary to setup and authenticate the pipe connection. In the example, a password is used but you can also use an ssh key.
|
||||
|
||||
You may also need to add a `sourceFileMap` to map the path of where the code exists on the remote shell to where it is locally:
|
||||
```json
|
||||
"sourceFileMap": {
|
||||
// "remote": "local"
|
||||
"/home/user/src": "/src/projectA/src"
|
||||
}
|
||||
```
|
||||
|
||||
## Attach
|
||||
|
||||
You can also use the above `pipeTransport` block to attach to a remote process. In the attach case, you will need to specify a `processId`. We have added the ability to query processes from the remote machine. To do this, change `"processId": "${command.pickProcess}"` to `"processId": "${command.pickRemoteProcess}"`. The `pipeTransport` settings will be used to query the processes on the remote machine. Then select the process from the drop down list. As with `launch`, you may need to configure `sourceFileMap`.
|
||||
|
||||
## Docker example
|
||||
|
||||
The `pipeTransport` can also be used to debug a process in a Docker container. For an attach, **launch.json** will include:
|
||||
|
||||
```json
|
||||
"pipeTransport": {
|
||||
"pipeCwd": "${workspaceRoot}",
|
||||
"pipeProgram": "docker",
|
||||
"pipeArgs": [
|
||||
"exec",
|
||||
"-i",
|
||||
"hello_gdb",
|
||||
"sh",
|
||||
"-c"
|
||||
],
|
||||
"debuggerPath": "/usr/bin/gdb"
|
||||
},
|
||||
```
|
||||
Where `hello_gdb` is the name of your container.
|
||||
|
||||
Launching a process is accomplished by starting a container and then using the same `pipeTransport` launch additional processes in the container. See this [**launch.json**](https://github.com/andyneff/hello-world-gdb/blob/master/.vscode/launch.json) for a [full example](https://github.com/andyneff/hello-world-gdb/).
|
||||
The documentation for pipe transport has moved to https://code.visualstudio.com/docs/cpp/pipe-transport.
|
||||
@@ -1,91 +1 @@
|
||||
# Windows 10's Windows Subsystem for Linux
|
||||
|
||||
With the release of Windows 10 Creators Update (Build 15063), you will now be able to use Visual Studio Code and the Microsoft C/C++ extension to debug your [Windows Subsystem for Linux (WSL)](https://msdn.microsoft.com/en-us/commandline/wsl/about) projects.
|
||||
|
||||
Code can be written on Windows itself using VSCode and debugged through `bash.exe` to the Bash on Windows layer.
|
||||
|
||||
As of the Fall Creator's Update, you can have multiple distros installed, but `bash.exe` and `wsl.exe` use the default distro. Use [WSL Config](https://msdn.microsoft.com/en-us/commandline/wsl/wsl-config) to set your default distro.
|
||||
|
||||
**NOTE: Creator's Update (Build 15063 or later) is required due to bug-fixes within the subsystem that we rely on to provide debugging. Debugging using a previous version of WSL is unsupported and likely will not work. To check your Windows version, enter `winver` in a command prompt.**
|
||||
|
||||
## Prerequisites
|
||||
|
||||
* [Windows 10 Creators Update or later with Windows Subsystem for Linux](https://msdn.microsoft.com/en-us/commandline/wsl/install_guide) installed.
|
||||
* Install g++/gcc and gdb within `WSL` to allow compiling and debugging. You can use the package manager to do this. For example, to install g++, you can run `sudo apt install g++` in the Bash window.
|
||||
* [Visual Studio Code](https://code.visualstudio.com) + Microsoft C/C++ extension for VSCode.
|
||||
|
||||
## How-To
|
||||
|
||||
To debug, commands will be routed from Windows through `bash.exe` to set up debugging. Because our extension runs as a 32-bit process, it will need to use the `C:\Windows\SysNative` folder to access the `bash.exe` executable that is normally in `C:\Windows\System32`. We will be using the `"pipeTransport"` ability within the extension to do debugging and `"sourceFileMap"` to map the source from the subsystem's paths back to Windows path.
|
||||
|
||||
**NOTE: Applications will need to be compiled in the `Windows Subsystem for Linux (WSL)` prior to debugging.**
|
||||
|
||||
### Example `launch.json` for Launching
|
||||
|
||||
In the following example, I have a local drive, `Z:\` that has my source code within windows for an app called _kitchensink_. I have set up the `"program"` and `"cwd"` paths to point to the directory within `WSL`. I have set up the `"pipeTransport"` to use `bash.exe`. I have also set up a `"sourceFileMap"` to have everything that is returned by `gdb` that starts with `/mnt/z` to point to `Z:\\` in Windows.
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "C++ Launch",
|
||||
"type": "cppdbg",
|
||||
"request": "launch",
|
||||
"program": "/mnt/z/Bash/kitchensink/a.out",
|
||||
"args": ["-fThreading"],
|
||||
"stopAtEntry": false,
|
||||
"cwd": "/mnt/z/Bash/kitchensink",
|
||||
"environment": [],
|
||||
"externalConsole": true,
|
||||
"windows": {
|
||||
"MIMode": "gdb",
|
||||
"setupCommands": [
|
||||
{
|
||||
"description": "Enable pretty-printing for gdb",
|
||||
"text": "-enable-pretty-printing",
|
||||
"ignoreFailures": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"pipeTransport": {
|
||||
"pipeCwd": "",
|
||||
"pipeProgram": "c:\\windows\\sysnative\\bash.exe",
|
||||
"pipeArgs": ["-c"],
|
||||
"debuggerPath": "/usr/bin/gdb"
|
||||
},
|
||||
"sourceFileMap": {
|
||||
"/mnt/z": "z:\\"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Example `launch.json` for Attaching to an Existing Process
|
||||
|
||||
This configuration similar to the launch process above. I have chosen to start the same application above from the Bash command line and now I want to attach to it for debugging. I have changed the `"processID"` to use the remote process picker by specifying the command `"${command:pickRemoteProcess}"` and set up the same `"sourceFileMap"`. When I press <kbd>F5</kbd> to attach, I get a picker drop down showing the running processes within `WSL`. I can scroll or search for the process I want to attach to and start debugging.
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "C++ Attach",
|
||||
"type": "cppdbg",
|
||||
"request": "attach",
|
||||
"program": "/mnt/z/Bash/kitchensink/a.out",
|
||||
"processId": "${command:pickRemoteProcess}",
|
||||
"windows": {
|
||||
"MIMode": "gdb",
|
||||
"setupCommands": [
|
||||
{
|
||||
"description": "Enable pretty-printing for gdb",
|
||||
"text": "-enable-pretty-printing",
|
||||
"ignoreFailures": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"pipeTransport": {
|
||||
"pipeCwd": "",
|
||||
"pipeProgram": "c:\\windows\\sysnative\\bash.exe",
|
||||
"pipeArgs": ["-c"],
|
||||
"debuggerPath": "/usr/bin/gdb"
|
||||
},
|
||||
"sourceFileMap": {
|
||||
"/mnt/z": "z:\\"
|
||||
}
|
||||
}
|
||||
```
|
||||
The documentation for GCC on Windows Subsystem for Linux (WSL) has moved to https://code.visualstudio.com/docs/cpp/config-wsl.
|
||||
@@ -1,15 +1 @@
|
||||
# Natvis - Custom views for native objects
|
||||
|
||||
The Natvis framework allows developers to write custom schemas to help visualize native objects.
|
||||
|
||||
For gdb/lldb debugging (`"type": "cppdbg"`), a subset of the Natvis framework has been ported to the C/C++ extension and the code resides in the [MIEngine](https://github.com/Microsoft/MIEngine) shared component. If additional features that are not implemented are requested, please file an [issue](https://github.com/Microsoft/MIEngine/issues) on the MIEngine GitHub page with details of what is missing.
|
||||
|
||||
For Visual C++ debugging (`"type": "cppvsdbg"`), the debugger contains the full implementation of the Natvis framework as Visual Studio.
|
||||
|
||||
## Documentation
|
||||
|
||||
The official documentation can be found [here](https://docs.microsoft.com/en-us/visualstudio/debugger/create-custom-views-of-native-objects).
|
||||
|
||||
## Schema
|
||||
|
||||
The Natvis schema can be found [here](natvis.xsd).
|
||||
The documentation for Natvis has moved to https://code.visualstudio.com/docs/cpp/natvis.
|
||||
@@ -240,7 +240,7 @@
|
||||
</xs:annotation>
|
||||
</xs:attribute>
|
||||
</xs:complexType>
|
||||
|
||||
|
||||
<!-- Attributes for elements that support filtering by view-->
|
||||
<xs:attributeGroup name="ViewConstraints">
|
||||
<xs:attribute name="IncludeView" type ="ViewIncludeType" use="optional" />
|
||||
@@ -335,9 +335,9 @@
|
||||
are evaluated in the context of the node.
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:attribute>
|
||||
</xs:attribute>
|
||||
</xs:attributeGroup>
|
||||
|
||||
|
||||
<xs:complexType name="ListItemsNodeType">
|
||||
<xs:annotation>
|
||||
<xs:documentation>Expression that points to value of the linked list node. It can be left empty or have 'this' to refer to the linked list node itself. This expression is evaluated under the context of the linked list node and not the parent linked list type.</xs:documentation>
|
||||
@@ -402,7 +402,7 @@
|
||||
<xs:documentation>
|
||||
Indicates that the item should use the icon associated with general data.
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:annotation>
|
||||
</xs:enumeration>
|
||||
<xs:enumeration value="Method">
|
||||
<xs:annotation>
|
||||
@@ -864,16 +864,16 @@
|
||||
<xs:complexType name="MostDerivedObjectType">
|
||||
<xs:annotation>
|
||||
<xs:documentation>
|
||||
Specifies an expression which evaluates to the current object, casted to its most-derived type.
|
||||
|
||||
In most cases, the debugger is able to automatically determine an object's most-derived type, in which case use of the <MostDerivedType>
|
||||
Specifies an expression which evaluates to the current object, casted to its most-derived type.
|
||||
|
||||
In most cases, the debugger is able to automatically determine an object's most-derived type, in which case use of the <MostDerivedType>
|
||||
element is unecessary. Automatic determination of an object's most-derived type requires the object to be an instance of a C++ class, with a
|
||||
compiler-generated virtual function table. This is sufficient for most class-hierarchies; however, custom logic may occasionally be necessary
|
||||
when dealing with a class hierarchy that does not contain virtual functions, or when the virtual function table is manually constructed by the
|
||||
when dealing with a class hierarchy that does not contain virtual functions, or when the virtual function table is manually constructed by the
|
||||
application code.
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
|
||||
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="StringType">
|
||||
<xs:attributeGroup ref="CommonAttributes" />
|
||||
@@ -935,12 +935,12 @@
|
||||
<xs:annotation>
|
||||
<xs:documentation>
|
||||
Indicates that the given type is a smart pointer. The text inside this element specifies the expression to evaluate the underlying pointer.
|
||||
|
||||
|
||||
The <SmartPointer> element has the following effects:
|
||||
- If no alternative <DisplayString> element is provided (or all <DisplayString> elements have failed conditions), the underlying pointer will be the display string
|
||||
- If no alternative <StringView> element is provided (or all <StringView> elements have failed conditions), the underlying pointer will be the string view, if it has one.
|
||||
- If no alternative <Expand> element is provided, the expansion of the smart pointer will be the expansion of the underlying pointer.
|
||||
- The smart pointer class will also support overloaded operators as determined by the <Usage> attribute. You can opt out of this behavior by specifying
|
||||
- The smart pointer class will also support overloaded operators as determined by the <Usage> attribute. You can opt out of this behavior by specifying
|
||||
'DefaultExpansion="false"'
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
@@ -949,7 +949,7 @@
|
||||
<xs:attributeGroup ref="CommonAttributes_NoCondition" />
|
||||
<xs:attribute name="Usage" type="SmartPointerUsage" use="required">
|
||||
<xs:annotation>
|
||||
<xs:documentation>Indicates which combinations of operators this smart pointer object supports.
|
||||
<xs:documentation>Indicates which combinations of operators this smart pointer object supports.
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:attribute>
|
||||
@@ -1004,10 +1004,10 @@
|
||||
<xs:documentation>Specifies an optional priority to assign to this entry for type matching. Higher priority entries within a particular file or directory
|
||||
are checked first. <Type> entries that do not specify a priority receive default priority of "Medium" <AlternativeType> entries which do not specify a priority
|
||||
will inherit the priority of the enclosing <Type> element. The priority is only used to disambiguate type matching when all other means of disambiguation are unavailable.
|
||||
For example, entries with more specific template instantiations, module constraints, or view constraints will take priority regardless of any priority values specified.
|
||||
Similarly, regardless of priority, natvis files that are part of a loaded project will always take precedence over files in the user natvis directory,
|
||||
which will, in turn, take precedence over files in the system-wide natvis directory.
|
||||
|
||||
For example, entries with more specific template instantiations, module constraints, or view constraints will take priority regardless of any priority values specified.
|
||||
Similarly, regardless of priority, natvis files that are part of a loaded project will always take precedence over files in the user natvis directory,
|
||||
which will, in turn, take precedence over files in the system-wide natvis directory.
|
||||
|
||||
If two entries have the same priority and cannot otherwise be disambiguated, it is unspecified which one will get used.
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
|
||||
+1
-102
@@ -1,102 +1 @@
|
||||
# FAQs
|
||||
|
||||
## Table of Contents
|
||||
* Setup: [Debugging Setup](#debugging-setup)
|
||||
* Setup: [What is the .vscode/ipch folder?](#what-is-the-vscodeipch-folder)
|
||||
* Setup: [How do I disable the IntelliSense cache (ipch)?](#how-do-i-disable-the-intellisense-cache-ipch)
|
||||
* Debugger: [Why is debugging not working?](#why-is-debugging-not-working)
|
||||
* Build: [How to enable debug symbols](#how-to-enable-debug-symbols)
|
||||
* Logging: [How to enable logging](#how-to-enable-logging)
|
||||
|
||||
## Debugging Setup
|
||||
The debugger needs to be configured to know which executable and debugger to use:
|
||||
|
||||
Click menu item: `Debug` -> `Add Configuration...`
|
||||
|
||||
The file **launch.json** will now be open for editing with a new configuration. The default settings will *probably* work except that you need to specify the **program** setting.
|
||||
|
||||
See the [**Documentation/Debugger**](https://github.com/Microsoft/vscode-cpptools/tree/master/Documentation/Debugger) folder in this repository for more in-depth documentation on how to configure the debugger.
|
||||
|
||||
## What is the .vscode/ipch folder?
|
||||
|
||||
The language server caches information about included header files to improve the performance of IntelliSense. When you edit C/C++ files in your workspace folder, the language server will store cache files in the `.vscode/ipch` folder by default. VS Code per-workspace storage folders were not selected for the following reasons:
|
||||
* The workspace storage location provided by VS Code is somewhat obscure and we had reservations about writing GB's worth of files in this location where users may not see them or know where to find them.
|
||||
* Parity with Visual Studio. This is how Visual Studio works and they receive little to no feedback/complaints on the location.
|
||||
|
||||
With this in mind we knew that we wouldn't be able to please everyone, so we provided settings to allow you to customize this the way that works best for your situation. We also figured that putting the files in the workspace folder would bring the issue to your attention quickly so that you can take action if you don't like the default behavior.
|
||||
|
||||
#### `"C_Cpp.intelliSenseCachePath": <string>`
|
||||
This setting allows you to set workspace or global overrides for the cache path. For example, if you want to share a single cache location for all workspace folders, you just open the VS Code settings, and add a "User" setting for "IntelliSense Cache Path".
|
||||
|
||||
#### `"C_Cpp.intelliSenseCacheSize": <number>`
|
||||
This setting allows you to set a limit on the amount of caching the extension does. This is an approximation, but the extension will make a best effort to keep the cache size as close to the limit you set as possible. If you are sharing the cache location across workspaces as explained above, you can still increase/decrease the limit, but you should make sure that you add a "User" setting for "IntelliSense Cache Size".
|
||||
|
||||
## How do I disable the IntelliSense cache (ipch)?
|
||||
|
||||
If you do not want to use the IntelliSense caching feature to improve the performance of IntelliSense, you can disable the feature by setting the "IntelliSense Cache Size" setting to 0. (or `"C_Cpp.intelliSenseCacheSize": 0"` in the JSON settings editor)
|
||||
|
||||
## Why is debugging not working?
|
||||
|
||||
### My breakpoints aren't being hit
|
||||
|
||||
When you start debugging, if it is showing that your breakpoints aren't bound (solid red circle) or they are not being hit, you may need to enable [debug symbols](#how-to-enable-debug-symbols) during compilation.
|
||||
|
||||
### Debugging starts but all the lines in my stack trace are grey
|
||||
|
||||
If your debugger is showing a grey stacktrace or won't stop at a breakpoint, or the symbols in the call stack are grey then your executable was compiled without [debug symbols](#how-to-enable-debug-symbols).
|
||||
|
||||
## How to enable debug symbols?
|
||||
|
||||
Enabling debug symbols are dependent on the type of compiler you are using. Below are some of the compilers and the compiler options necessary to enable debug symbols.
|
||||
|
||||
When in doubt, please check your compiler's documentation for the options necessary to include debug symbols in the output. This may be some variant of `-g` or `--debug`.
|
||||
|
||||
* #### Clang (C++)
|
||||
* If you invoke the compiler manually then add the `--debug` option.
|
||||
* If you're using a script then make sure the `CXXFLAGS` environment variable is set; e.g. `export CXXFLAGS="${CXXFLAGS} --debug"`
|
||||
* If you're using CMake then set make sure the `CMAKE_CXX_FLAGS` is set; e.g. `export CMAKE_CXX_FLAGS=${CXXFLAGS}`
|
||||
|
||||
* #### Clang (C)
|
||||
See Clang C++ but use `CFLAGS` instead of `CXXFLAGS`.
|
||||
|
||||
* #### gcc or g++
|
||||
If you invoke the compiler manually, add the `-g` option.
|
||||
|
||||
* #### cl.exe
|
||||
Symbols are located in the `*.pdb` file.
|
||||
|
||||
## How to enable logging
|
||||
|
||||
Enabling logging will show communication information between VS Code and our extension and between our extension and the debugger.
|
||||
|
||||
### Logging for `MI` debuggers
|
||||
|
||||
The logging block with its defaults is as follows:
|
||||
|
||||
```
|
||||
"logging": {
|
||||
"trace": false,
|
||||
"traceResponse": false,
|
||||
"engineLogging": false
|
||||
}
|
||||
```
|
||||
|
||||
#### VS Code and the CppTools extension
|
||||
|
||||
The logging here is called `trace` logging and can be enabled by setting `trace` and `traceResponse` to `true` in the logging block inside `launch.json`. This will help diagnose issues related to VS Code's communication to our extension and our responses.
|
||||
|
||||
#### CppTools extension and the debugger
|
||||
|
||||
The logging between CppTools and the debugger is called `engineLogging`. When using an `MI` debugger such as `gdb` or `lldb`, this will show the request, response and events using the `mi` interpreter. This logging will help us determine whether the debugger is receiving the right commands and generating the correct responses.
|
||||
|
||||
### Logging for `Visual C++` debugger
|
||||
|
||||
The logging block with its defaults is as follows:
|
||||
|
||||
```
|
||||
"logging": {
|
||||
"engineLogging": false
|
||||
}
|
||||
```
|
||||
|
||||
The `Visual C++` debugger logging will show only the communication to and from VS Code as all communication to the debugger is done internally to the process and is not visible through logging.
|
||||
The FAQs for the C/C++ extension has moved to https://code.visualstudio.com/docs/cpp/faq-cpp.
|
||||
@@ -1,56 +1,3 @@
|
||||
This file is deprecated.
|
||||
|
||||
# Configuring includePath for better IntelliSense results
|
||||
|
||||
This page describes how to configure include paths for folders containing C or C++ files to get the full IntelliSense experience. If you're seeing the following message when opening a folder in VS Code, it means the C++ IntelliSense engine needs additional information about the paths in which your include files are located.
|
||||
|
||||

|
||||
|
||||
## Where are the include paths defined?
|
||||
|
||||
The include paths are defined in the `"includePath"` setting in a file called **c_cpp_properties.json** located in the **.vscode** directory in the opened folder.
|
||||
|
||||
You can create or open this file by either using the `"C/Cpp: Edit Configurations"` command in the command palette or by selecting `"Edit "includePath" setting"` in the lightbulb menu (see the screenshot below). The quickest way to locate a lightbulb is to scroll to the top of the source file and click on any green squiggle that shows up under a #include statement.
|
||||
|
||||

|
||||
|
||||
When a folder is opened, the extension attempts to locate your system headers based on your operating system, but it does not know about any other libraries that your project depends on. You can hover over the green squiggles or open the Problems window to understand which headers the IntelliSense engine is unable to open - sometimes it's the dependent headers that can't be located.
|
||||
|
||||

|
||||
|
||||
## How to specify the include paths?
|
||||
|
||||
You can specify the remaining paths using one of the techniques described below.
|
||||
|
||||
#### 1. Use `compile_commands.json` file to supply includePaths and defines information
|
||||
|
||||
The extension can get the information for `"includePath"` and `"defines"` from a **compile_commands.json** file, which can be auto-generated by many build systems such as CMake and Ninja. Look for the section where your current configuration is defined (by default there's one configuration per OS, such as "Win32 or "Mac"), and set the `"compileCommands"` property in **c_cpp_properties.json** to the full path to your **compile_commands.json** file and the extension will use that instead of the `"includes"` and `"defines"` properties for IntelliSense.
|
||||
|
||||

|
||||
|
||||
#### 2. Use the lightbulb suggestions to auto-resolve includePath
|
||||
|
||||
The first thing to try is to leverage the lightbulb path suggestions to auto-resolve the include paths. When you open a folder, the extension will **recursively** search for potential include paths that match the header files your code is using based on the paths set by the `"browse.path"` setting in **c_cpp_properties.json**. Click on the green squiggles under #include statements and you'll see a lightbulb offering suggestions of paths that will allow IntelliSense to resolve the included file.
|
||||
|
||||

|
||||
|
||||
If you don't see path suggestions in the lightbulb, try adding the root folder where the headers are likely located in to the `"browse.path"` setting in **c_cpp_properties.json**. This allows the extension to **recursively** search in these folders and offer more suggestions in the lightbulb as the search process goes on.
|
||||
|
||||
#### 3. Manually add include paths
|
||||
If none of the above fully resolves the paths, you could manually specify the paths to the headers that your project depends on in the **c_cpp_properties.json** file. Look for the section where your current configuration is defined (by default there's one configuration per OS, such as "Win32 or "Mac"), and add your paths in the `"includePath"` setting and defines in the `"defines"` setting. For example, the following screenshot shows a snippet of the file specifying path for the Mac configuration.
|
||||
|
||||

|
||||
|
||||
## Verify the include paths are correctly resolved
|
||||
|
||||
There are two ways to verify that the include paths are correctly resolved:
|
||||
|
||||
1. The green squiggles in the source file are no longer showing
|
||||
2. Error messages are cleared in the Problems window
|
||||
|
||||
This indicates that the IntelliSense engine has got the include paths resolved so you can start enjoying the full IntelliSense for your C or C++ code for the current translation unit. Note that you may still see errors on other files if they belong to a different translation unit that requires additional include paths to be configured.
|
||||
|
||||
## See Also
|
||||
|
||||
[IntelliSense engines](https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/LanguageServer/IntelliSense%20engine.md)
|
||||
|
||||
[**c_cpp_properties.json** reference guide](https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/LanguageServer/c_cpp_properties.json.md)
|
||||
Please find documentation for the C/C++ extension at https://code.visualstudio.com/docs/languages/cpp.
|
||||
@@ -1,99 +1 @@
|
||||
# Customizing Default Settings
|
||||
|
||||
In version 0.17.0 we introduced new settings that allow you to override the extension's default values for properties set in **c_cpp_properties.json**.
|
||||
|
||||
## New VS Code settings
|
||||
|
||||
The following `C_Cpp.default.*` settings map to each of the properties in a configuration block of **c_cpp_properties.json**. Namely:
|
||||
|
||||
```
|
||||
C_Cpp.default.includePath : string[]
|
||||
C_Cpp.default.defines : string[]
|
||||
C_Cpp.default.compileCommands : string
|
||||
C_Cpp.default.macFrameworkPath : string[]
|
||||
C_Cpp.default.forcedIncludes : string[]
|
||||
C_Cpp.default.intelliSenseMode : string
|
||||
C_Cpp.default.compilerPath : string
|
||||
C_Cpp.default.cStandard : c89 | c99 | c11
|
||||
C_Cpp.default.cppStandard : c++98 | c++03 | c++11 | c++14 | c++17
|
||||
C_Cpp.default.browse.path : string[]
|
||||
C_Cpp.default.browse.databaseFilename : string
|
||||
C_Cpp.default.browse.limitSymbolsToIncludedHeaders : boolean
|
||||
```
|
||||
|
||||
These settings have all of the benefits of VS Code settings, meaning that they can have default, "User", "Workspace", and "Folder" values. So you can set a global value for `C_Cpp.default.cppStandard` in your "User" settings and have it apply to all of the folders you open. If any one folder needs a different value, you can override the value by adding a "Folder" or "Workspace" value.
|
||||
|
||||
This property of VS Code settings allows you to configure each of your workspaces independently - making the **c_cpp_properties.json** file optional.
|
||||
|
||||
## Updated **c_cpp_properties.json** syntax
|
||||
|
||||
A special variable has been added to the accepted syntax of **c_cpp_properties.json** that will instruct the extension to insert the value from the VS Code settings mentioned above. If you set the value of any setting in **c_cpp_properties.json** to "${default}" it will instruct the extension to read the VS Code default setting for that property and insert it. For example:
|
||||
|
||||
```
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Win32",
|
||||
"includePath": [
|
||||
"additional/paths",
|
||||
"${default}"
|
||||
],
|
||||
"defines": [
|
||||
"${default}",
|
||||
],
|
||||
"macFrameworkPath": [
|
||||
"${default}",
|
||||
"additional/paths"
|
||||
],
|
||||
"forceInclude": [
|
||||
"${default}",
|
||||
"additional/paths"
|
||||
],
|
||||
"compileCommands": "${default}",
|
||||
"browse": {
|
||||
"limitSymbolsToIncludedHeaders": true,
|
||||
"databaseFilename": "${default}",
|
||||
"path": [
|
||||
"${default}",
|
||||
"additional/paths"
|
||||
]
|
||||
},
|
||||
"intelliSenseMode": "${default}",
|
||||
"cStandard": "${default}",
|
||||
"cppStandard": "${default}",
|
||||
"compilerPath": "${default}"
|
||||
}
|
||||
],
|
||||
```
|
||||
|
||||
Take note that for the properties that accept string[], the syntax proposed above allows you to augment the VS Code setting with additional values, thus allowing you to have common paths listed in the VS Code settings and configuration-specific settings in **c_cpp_properties.json**.
|
||||
|
||||
If a property is missing from **c_cpp_properties.json**, the extension will use the value in the VS Code setting. If a developer assigns values to all of the settings that apply for a given folder, then **c_cpp_properties.json** could be removed from the .vscode folder as it will no longer be needed.
|
||||
|
||||
### System includes
|
||||
|
||||
A new setting will be added that allows you specify the system include path separate from the folder's include path. If this setting has a value, then the system include path the extension gets from the compiler specified in the `compilerPath` setting will not be added to the path array that the extension uses for IntelliSense. We may want to provide a VS Code command to populate this value from the compiler's default for users who are interested in using it in case they want to make some modifications to the defaults.
|
||||
|
||||
```
|
||||
C_Cpp.default.systemIncludePath : string[]
|
||||
```
|
||||
|
||||
### System Include Path/Defines Resolution Strategies
|
||||
|
||||
The extension determines the system includePath and defines to send to the IntelliSense engine in the following manner:
|
||||
|
||||
1. If `compileCommands` has a valid value and the file open in the editor is in the database, use the compile command in the database entry to determine the include path and defines.
|
||||
* The system include path and defines are determined using the following logic (in order):
|
||||
1. If `systemIncludePath` has a value, use it (continue to the next step to search for system defines).
|
||||
2. If `compilerPath` is valid, query it.
|
||||
3. Interpret the first argument in the command as the compiler and attempt to query it.
|
||||
4. If `compilerPath` is `""`, use an empty array for system include path and defines.
|
||||
5. If `compilerPath` is undefined, look for a compiler on the system and query it.
|
||||
|
||||
2. If `compileCommands` is invalid or the current file is not listed in the database, use the `includePath` and `defines` properties in the configuration for IntelliSense.
|
||||
* The system include path and defines are determined using the following logic (in order):
|
||||
1. If `systemIncludePath` has a value, use it (continue to the next step to search for system defines).
|
||||
2. If `compilerPath` is valid, query it.
|
||||
3. If `compilerPath` is `""`, use an empty array for system include path and defines (they are assumed to be in the `includePath` and `defines` for the current config already).
|
||||
4. If `compilerPath` is undefined, look for a compiler on the system and query it.
|
||||
|
||||
System includes should no longer be added to the `"includePath"` or `"browse.path"` variables. If the extension detects any system include paths in the `"includePath"` property it will silently remove them so that it can ensure system include paths are added last and in the correct order (this is especially important for GCC/Clang). In a future update we may add a notification message to the extension to remind developers to remove system include paths from their `"includePath"` and `'browse.path"` as they will be ignored.
|
||||
The documentation for customizing default settings has moved to https://code.visualstudio.com/docs/cpp/customize-default-settings-cpp.
|
||||
@@ -1,12 +1 @@
|
||||
# How to enable logging in the extension
|
||||
|
||||
If you are experiencing a problem that we are unable to diagnose based on information in your issue report, we might ask you to enable logging and send us your logs.
|
||||
|
||||
As of version 0.14.0 of the extension, logging information is now delivered directly to the Output window in VSCode. To turn on full logging for an issue report, add `"C_Cpp.loggingLevel": "Information"` or `"C_Cpp.loggingLevel": "Debug"` to your **settings.json**.
|
||||
|
||||

|
||||
|
||||
VS Code organizes the logging from different extensions to improve readability so you must select the "C/C++" option in the log filter selector to see logging from the C/C++ extension:
|
||||
|
||||

|
||||
|
||||
The documentation for logging has moved to https://code.visualstudio.com/docs/cpp/enable-logging-cpp.
|
||||
@@ -1,66 +1 @@
|
||||
# Frequently asked questions
|
||||
|
||||
* [How do I get IntelliSense to work correctly?](#how-do-i-get-intellisense-to-work-correctly)
|
||||
* [Why do I see red squiggles under Standard Library types?](#why-do-i-see-red-squiggles-under-standard-library-types)
|
||||
* [How do I get the new IntelliSense to work with MinGW on Windows?](#how-do-i-get-the-new-intellisense-to-work-with-mingw-on-windows)
|
||||
* [How do I get the new IntelliSense to work with the Windows Subsystem for Linux?](#how-do-i-get-the-new-intellisense-to-work-with-the-windows-subsystem-for-linux)
|
||||
* [What is the difference between `"includePath"` and `"browse.path"` in **c_cpp_properties.json**?](#what-is-the-difference-between-includepath-and-browsepath-in-c_cpp_propertiesjson)
|
||||
* [How do I re-create the IntelliSense database?](#how-do-i-re-create-the-intellisense-database)
|
||||
|
||||
## How do I get IntelliSense to work correctly?
|
||||
|
||||
There are two IntelliSense engines present in the extension: the "fuzzy" engine (or Tag Parser), and the new "Default" engine. If you are using version 0.11.0 or higher of the cpptools extension, then you can preview our new IntelliSense engine which has more accurate auto-complete suggestions and tooltips. To use the new engine, you need to ensure that `"C_Cpp.intelliSenseEngine"` is set to `"Default"` in your settings. Since the engine is still in preview it is not on by default for everyone yet.
|
||||
|
||||
After selecting the IntelliSense engine that you prefer, take a look at the Problems window in VS Code to see if you need to do any further configuration for your folder. For example, the Default engine will not provide squiggles and auto-complete suggestions for a translation unit (read: a source file and its dependencies) if the include path is not configured properly. You can select any of the problems in the window to navigate to the line when the problem was detected and a lightbulb will appear in the editor with some options (code actions) to help you resolve the problem:
|
||||
|
||||
1. Update your `includePath` (and preprocessor defines)
|
||||
2. Force semantic IntelliSense
|
||||
|
||||
#### Update your `includePath` (and preprocessor defines)
|
||||
|
||||
Selecting this option will open a file called **c_cpp_properties.json**. If you haven't created this file already, it will be created for you in the **.vscode** folder of your workspace.
|
||||
|
||||
Add the necessary paths to your include files to the `"includePath"` array. The `${workspaceRoot}` variable is available to use to get a relative path to the folder you have opened. Also add any required symbols that need to be defined to the `"defines"` array. Both "\<var\>" and "\<var\>=\<value\>" syntax is accepted. When you edit and save this file, the IntelliSense engine will reset and reparse source your source files and headers with the new settings.
|
||||
|
||||
#### Force semantic IntelliSense
|
||||
|
||||
If you want IntelliSense to operate on your files even when all #include directives do not resolve, then you can choose the `Force semantic IntelliSense` code action to always use the new IntelliSense engine. You can also set the `C_Cpp.intelliSenseEngineFallback` setting to `"Disabled"`.
|
||||
|
||||
## Why do I see red squiggles under Standard Library types?
|
||||
|
||||
The most common reason for this is missing include paths and defines. The easiest way to fix this on each platform is as follows:
|
||||
|
||||
**Linux/Mac**
|
||||
* Set `"intelliSenseMode": "clang-x64"` or `"intelliSenseMode": "gcc-x64"` and `"compilerPath"` in **c_cpp_properties.json** to the path to your compiler.
|
||||
|
||||
**Windows**
|
||||
* If you are using a Microsoft compiler from Visual Studio, set `"intelliSenseMode": "msvc-x64"`, but don't add the `"compilerPath"` property to **c_cpp_properties.json**.
|
||||
* If you are using Clang for Windows, set `"intelliSenseMode": "msvc-x64"`, and `"compilerPath"` in **c_cpp_properties.json** to the path to your compiler.
|
||||
|
||||
## How do I get the new IntelliSense to work with MinGW on Windows?
|
||||
|
||||
The page discussing configuration with MinGW is [here](https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/LanguageServer/MinGW.md).
|
||||
|
||||
## How do I get the new IntelliSense to work with the Windows Subsystem for Linux?
|
||||
|
||||
The page discussing configuration with WSL is [here](https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/LanguageServer/Windows%20Subsystem%20for%20Linux.md).
|
||||
|
||||
## What is the difference between `"includePath"` and `"browse.path"` in **c_cpp_properties.json**?
|
||||
|
||||
Starting with version 0.11.0 of the cpptools extension, there are now two settings in the **c_cpp_properties.json** file. They are used by the different IntelliSense engines that we support and have slightly different meanings for the components that use them.
|
||||
|
||||
The active IntelliSense engine is controlled via the `"C_Cpp.intelliSenseEngine"` setting in your **settings.json** file. The valid values for this setting are `"Default"` and `"Tag Parser"`.
|
||||
|
||||
* #### `"includePath"`
|
||||
This array of path strings is used by the new "Default" IntelliSense engine that was introduced in version 0.11.0 of the extension. This new engine provides semantic-aware IntelliSense features and will be the eventual replacement for the Tag Parser that has been powering the extension since it was first released. It currently provides tooltips and error squiggles in the editor. The remaining features (e.g. code completion, signature help, go to definition, ...) are implemented using the Tag Parser's database, so it is still important to ensure that the browse.path setting is properly set.
|
||||
|
||||
The paths that you specify for this setting are the same paths that you would send to your compiler via the `-I` switch. When your source files are parsed, the IntelliSense engine will prepend these paths to the files specified by your #include directives while attempting to resolve them. These paths are **not** searched recursively.
|
||||
|
||||
* #### `"browse.path"`
|
||||
This array of path strings is used by the "Tag Parser" (a.k.a. "browse engine"). This engine will _recursively_ enumerate all files under the paths specified and track them as potential includes while tag parsing your project folder. To disable recursive enumeration of a path, you can append a `/*` to the path string.
|
||||
|
||||
When you open a workspace for the first time, the extension adds `${workspaceRoot}` to both arrays. If this is undesirable, you can open your **c_cpp_properties.json** file and remove it.
|
||||
|
||||
## How do I re-create the IntelliSense database?
|
||||
|
||||
Starting in version 0.12.3 of the extension, we added a command that will reset your IntelliSense database. Open the command palette and choose the "C/Cpp: Reset IntelliSense Database" command.
|
||||
The FAQs for the C/C++ extension has moved to https://code.visualstudio.com/docs/cpp/faq-cpp.
|
||||
@@ -1,44 +0,0 @@
|
||||
# IntelliSense engines
|
||||
|
||||
There are two IntelliSense engines used to power the C/C++ IntelliSense experience in VS Code.
|
||||
|
||||
* `"Default"` - Visual Studio's IntelliSense engine, which is the default engine that provides semantic-aware IntelliSense features
|
||||
* `"Tag Parser"` - the "fuzzy" IntelliSense engine that provides quick but "fuzzy" results, is used to provide the fallback experience if the default engine is unable to fully resolve include paths
|
||||
|
||||
Ultimately all the IntelliSense and code browsing features will be powered by the "Default" engine. The following features have been implemented so far:
|
||||
|
||||
* Auto-complete suggestions for class/struct/namespace members
|
||||
* Parameter hints
|
||||
* Quick info (hover over tooltip)
|
||||
* Error squiggles
|
||||
* Reference highlighting
|
||||
|
||||
The other IntelliSense features, such as global auto-complete, and code browsing features, such as Go to definition/declaration, are currently powered by the "Tag Parser" based engine.
|
||||
|
||||
### `includePath` and `browse.path`
|
||||
The two IntelliSense engines use two different settings in the **c_cpp_properties.json** file for specifying include paths. This file is located in the **.vscode** directory in the opened folder. You can create or open this file by either using the "C/Cpp: Edit Configurations" command in the command palette or by selecting "Edit "includePath" setting" in the lightbulb menu. Look for the following settings in the section where your current configuration is defined (by default there's one configuration per OS, such as "Win32 or "Mac").
|
||||
|
||||
* #### `"includePath"`
|
||||
This array of path strings is used by the "Default" IntelliSense engine. The paths that you specify for this setting are the same paths that you would send to your compiler via the -I switch. When your source files are parsed, the IntelliSense engine will prepend these paths to the files specified by your #include directives while attempting to resolve them. These paths are searched **non-recursively**.
|
||||
|
||||
* #### `"browse.path"`
|
||||
This array of path strings is used by the "Tag Parser" (a.k.a. "browse engine"). This engine will **recursively** enumerate all files under the paths specified and track them as potential includes while tag parsing your project folder. To disable recursive enumeration of a path, you can append a `/*` to the path string.
|
||||
|
||||
### How fallback works and how to control the behavior
|
||||
|
||||
The extension first tries to fully parse any opened file using the "Default" IntelliSense engine. If it discovers that it cannot find a header file or a dependency, it will fall back to the tag parser and provide the fuzzy IntelliSense behavior. The fallback affects a full translation unit (TU), not just a single open file. The Problems panel provides details about unresolved headers and dependencies. Other opened TUs will continue to use the "Default" IntelliSense engine provided that all #include dependencies are resolved.
|
||||
|
||||
We recognize that resolving all #includes may not be necessary for all projects and you may still want to experience the productivity benefits of using the "Default" semantic engine without customizing the default include path. For that, the “Force semantic IntelliSense” action can be chosen. When invoked, all unresolved #include squiggles will turn red and semantic member list and linting will be enabled in all files regardless of whether or not #include statements can be resolved.
|
||||
|
||||
### IntelliSense engine setting
|
||||
|
||||
We recommend using the "Default" engine for the best IntelliSense experience. However, it is possible to explicitly choose the IntelliSense engine by editing your [user or workspace settings](https://code.visualstudio.com/docs/getstarted/settings). The setting you should modify is `"C_Cpp.intelliSenseEngine"`. There are two values for this setting:
|
||||
|
||||
* `"Default"` - use Visual Studio's IntelliSense engine
|
||||
* `"Tag Parser"` - use the "fuzzy" IntelliSense engine
|
||||
|
||||
### See Also
|
||||
|
||||
[Configuring includePath for better IntelliSense results](https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/Getting%20started%20with%20IntelliSense%20configuration.md)
|
||||
|
||||
[**c_cpp_properties.json** reference guide](https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/LanguageServer/c_cpp_properties.json.md)
|
||||
@@ -1,31 +1,2 @@
|
||||
# MinGW
|
||||
|
||||
To use MinGW on Windows, we recommend you add the following configuration to your **c_cpp_properties.json** file. Select "C/Cpp: Edit Configurations" from the command palette to create this file if you haven't already.
|
||||
|
||||
## Extension version 0.17.0 and higher:
|
||||
|
||||
When you set the `compilerPath` property and change `intelliSenseMode` to `clang-x64` (or `gcc-x64` in version 0.18.0 and higher), you no longer need to copy the system include path or defines to `includePath`, `browse.path`, or `defines` to enable IntelliSense to work properly. For example:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "MinGW",
|
||||
"intelliSenseMode": "gcc-x64",
|
||||
"compilerPath": "C:/mingw64/bin/gcc.exe",
|
||||
"includePath": [
|
||||
"${workspaceFolder}"
|
||||
],
|
||||
"defines": [],
|
||||
"cStandard": "c11",
|
||||
"cppStandard": "c++17"
|
||||
}
|
||||
```
|
||||
|
||||
Replace "gcc.exe" with whatever compiler you're using, e.g. "g++.exe", "clang-5.0.exe", etc. -- just make sure the file is a valid Windows executable (not a 0 size symlink).
|
||||
|
||||
For Cygwin, set the `compilerPath` to the appropriate Cygwin path, e.g. "C:/cygwin64/bin/g++.exe".
|
||||
|
||||
If it seems like the `compilerPath` is not getting used, you can debug the issue via [enabling logging](Enabling%20logging.md).
|
||||
|
||||
## Extension version 0.16.1 and earlier:
|
||||
|
||||
If you have an older version of the C/C++ extension installed, use [these instructions](Archive/MinGW.md) instead.
|
||||
The documentation for Mingw-w64 has moved to https://code.visualstudio.com/docs/cpp/config-mingw.
|
||||
@@ -1,33 +1 @@
|
||||
# Windows Subsystem for Linux
|
||||
|
||||
> **Note:** If you are on **build 17110 of Windows or higher**, you must use extension version 0.17.0 or higher for IntelliSense to work. The Windows team turned on case-sensitive folders for the WSL environment and the C/C++ extension doesn't support case-sensitive folders until version 0.17.0.
|
||||
|
||||
To use the Windows Subsystem for Linux with this extension you need to add a configuration to your **c_cpp_properties.json** file which adds the necessary header paths from within the WSL filesystem to the `includePath`.
|
||||
|
||||
Select "C/Cpp: Edit Configurations" from the command palette to create the **c_cpp_properties.json** file if you haven't already.
|
||||
|
||||
## With extension version 0.17.0 and higher:
|
||||
|
||||
In **c_cpp_properties.json** you can directly address your WSL compiler and include paths by using *nix-style paths and we will do the conversion to Windows paths for you. If you have multiple distros installed, we disambiguate the `compilerPath` by picking the one marked as Default when you run `wslconfig.exe /l` in a CMD or PowerShell window. We continue to support Windows-style paths for these properties as outlined in the [archived instructions](Archive/Windows%20Subsystem%20for%20Linux.md) if you prefer to use those.
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "WSL",
|
||||
"intelliSenseMode": "gcc-x64",
|
||||
"compilerPath": "/usr/bin/gcc",
|
||||
"includePath": [
|
||||
"${workspaceFolder}/**"
|
||||
],
|
||||
"defines": [],
|
||||
"cStandard": "c11",
|
||||
"cppStandard": "c++17"
|
||||
}
|
||||
```
|
||||
|
||||
## Earlier versions of the extension:
|
||||
|
||||
If you are on a build of Windows prior to 17110 and you have an older version of the C/C++ extension installed, use [these instructions](Archive/Windows%20Subsystem%20for%20Linux.md) instead.
|
||||
|
||||
---
|
||||
|
||||
Remember to [heed the warnings of the Windows team about not creating or editing Linux files from a Windows app](https://blogs.msdn.microsoft.com/commandline/2016/11/17/do-not-change-linux-files-using-windows-apps-and-tools/)!
|
||||
The documentation for GCC on Windows Subsystem for Linux (WSL) has moved to https://code.visualstudio.com/docs/cpp/config-wsl.
|
||||
@@ -1,100 +1 @@
|
||||
# `c_cpp_properties.json` Reference Guide
|
||||
|
||||
> See also: [Customizing Default Settings](Customizing%20Default%20Settings.md)
|
||||
|
||||
### Example
|
||||
|
||||
```json
|
||||
{
|
||||
"env" : {
|
||||
"myDefaultIncludePath": [
|
||||
"${workspaceFolder}",
|
||||
"${workspaceFolder}/include"
|
||||
],
|
||||
"myCompilerPath": "/usr/local/bin/gcc-7"
|
||||
},
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Mac",
|
||||
"intelliSenseMode": "clang-x64",
|
||||
"includePath": [ "${myDefaultIncludePath}", "/another/path" ],
|
||||
"macFrameworkPath": [ "/System/Library/Frameworks" ],
|
||||
"defines": [ "FOO", "BAR=100" ],
|
||||
"forcedInclude": [ "${workspaceFolder}/include/config.h" ],
|
||||
"compilerPath": "/usr/bin/clang",
|
||||
"cStandard": "c11",
|
||||
"cppStandard": "c++17",
|
||||
"compileCommands": "/path/to/compile_commands.json",
|
||||
"browse": {
|
||||
"path": [ "${workspaceFolder}" ],
|
||||
"limitSymbolsToIncludedHeaders": true,
|
||||
"databaseFilename": ""
|
||||
}
|
||||
}
|
||||
],
|
||||
"version": 4
|
||||
}
|
||||
```
|
||||
|
||||
## Top-level properties
|
||||
|
||||
* #### `env`
|
||||
An array of user-defined variables that will be available for substitution in the configurations via the standard environment variable syntax: `${<var>}` or `${env:<var>}`. Strings and arrays of strings are accepted.
|
||||
|
||||
* #### `configurations`
|
||||
An array of configuration objects that provide the IntelliSense engine with information about your project and your preferences. By default, the extension creates a configuration for you based on your operating system. You may also add additional configurations.
|
||||
|
||||
* #### `version`
|
||||
We recommend you don't edit this field. It tracks the current version of the **c_cpp_properties.json** file so that the extension knows what properties and settings should be present and how to upgrade this file to the latest version.
|
||||
|
||||
## Configuration properties
|
||||
|
||||
* #### `name`
|
||||
A friendly name for the configuration. "Linux", "Mac", and "Win32" are special names that instruct the extension to load that configuration by default on the associated operating system unless additional configurations have been created. The status bar in VS Code will show you which configuration is active. You can also click on the label in the status bar to change the active configuration.
|
||||
|
||||
* #### `intelliSenseMode`
|
||||
If `"C_Cpp.intelliSenseEngine"` is set to "Default" in your settings file, this property determines which mode the IntelliSense engine will run in. `"msvc-x64"` maps to Visual Studio mode with 64-bit pointer sizes. `"clang-x64"` maps to CLang mode with 64-bit pointer sizes. `"gcc-x64"` maps to GCC mode with 64-bit pointer sizes. Windows uses `"msvc-x64"` by default, macOS uses `"clang-x64"` by default, and Linux uses `"gcc-x64"` by default.
|
||||
|
||||
* #### `includePath`
|
||||
If `"C_Cpp.intelliSenseEngine"` is set to "Default" in your settings file, this list of paths will be used by IntelliSense to search for headers included by your source files. This is basically the same as the list of paths you pass to your compiler with the `-I` switch. If a path ends with `/**` the IntelliSense engine will do a recursive search for includes starting from that directory. If on Windows with Visual Studio installed, or if a compiler is specified in the `compilerPath` setting, it is not necessary to list the system include paths in this list.
|
||||
|
||||
* #### `macFrameworkPath`
|
||||
If `"C_Cpp.intelliSenseEngine"` is set to "Default" in your settings file, this list of paths will be used by IntelliSense to search for framework headers included by your source files. This is basically the same as the list of paths you pass to your compiler with the `-F` switch; the IntelliSense engine will not do a recursive search in these paths for includes.
|
||||
|
||||
* #### `defines`
|
||||
If `"C_Cpp.intelliSenseEngine"` is set to "Default" in your settings file, this list of preprocessor symbols will be used by IntelliSense during the compilation of your source files. This is basically the same as the list of symbols you pass to your compiler with the `-D` switch. If on Windows with Visual Studio installed, or if a compiler is specified in the `compilerPath` setting, it is not necessary to list the system include paths in this list.
|
||||
|
||||
* #### `forcedInclude` (optional)
|
||||
A list of files that should be included before any other characters in the source file are processed. Files are included in the order listed.
|
||||
|
||||
* #### `compilerPath` (optional)
|
||||
The absolute path to the compiler you use to build your project. The extension will query the compiler to determine the system include paths and default defines to use for IntelliSense.
|
||||
|
||||
Args can be added to modify the includes/defines used, e.g. `-nostdinc++`, `-m32`, `-fno-ms-extensions`, etc., but paths with spaces must be surrounded by double quotes (`"`) if args are used.
|
||||
|
||||
If you want to disable automatic querying of system include paths and defines, set this value to the emptry string `""`. This is generally not recommended, but there are some cases where automatic querying of system includes and defines is undesirable.
|
||||
|
||||
* #### `cStandard`
|
||||
The C standard revision to use for IntelliSense in your project.
|
||||
|
||||
* #### `cppStandard`
|
||||
The C++ standard revision to use for IntelliSense in your project.
|
||||
|
||||
* #### `compileCommands` (optional)
|
||||
If `"C_Cpp.intelliSenseEngine"` is set to "Default" in your settings file, the includes and defines discovered in this file will be used instead of the values set for `includePath` and `defines`. If the compile commands database does not contain an entry for the translation unit that corresponds to the file you opened in the editor, then a warning message will appear and the extension will use the `includePath` and `defines` settings instead.
|
||||
|
||||
>For more information about the file format, see the [Clang documentation](https://clang.llvm.org/docs/JSONCompilationDatabase.html). Some build systems, such as CMake, [simplify generating this file](https://cmake.org/cmake/help/v3.5/variable/CMAKE_EXPORT_COMPILE_COMMANDS.html).
|
||||
|
||||
* #### `browse`
|
||||
The set of properties used when `"C_Cpp.intelliSenseEngine"` is set to `"Tag Parser"` (also referred to as "fuzzy" IntelliSense, or the "browse" engine). These properties are also used by the Go To Definition/Declaration features, or when the "Default" IntelliSense engine is unable to resolve the #includes in your source files.
|
||||
|
||||
### Browse properties
|
||||
|
||||
* #### `path`
|
||||
This list of paths will be used by the Tag Parser to search for headers included by your source files. If omitted, `includePath` will be used as the `path`. The Tag Parser will automatically search all subfolders in these paths unless the path ends with a `/*` or `\*`. For example, `/usr/include` directs the Tag Parser to search the `include` folder and its subfolders for headers while `/usr/include/*` directs the Tag Parser not to look in any subfolders of `/usr/include`.
|
||||
|
||||
* #### `limitSymbolsToIncludedHeaders`
|
||||
When true, the Tag Parser will only parse code files that have been directly or indirectly included by a source file in `${workspaceFolder}`. When false, the Tag Parser will parse all code files found in the paths specified in the **path** list.
|
||||
|
||||
* #### `databaseFilename`
|
||||
When set, this instructs the extension to save the Tag Parser's symbol database somewhere other than the workspace's default storage location. If a relative path is specified, it will be made relative to the workspace's default storage location, not the workspace folder itself. The `${workspaceFolder}` variable can be used to specify a path relative to the workspace folder (e.g. `${workspaceFolder}/.vscode/browse.vc.db`)
|
||||
The documentation for c_cpp_properties.json has moved to https://code.visualstudio.com/docs/cpp/c-cpp-properties-schema-reference.
|
||||
@@ -0,0 +1 @@
|
||||
The documentation for enhanced colorization has moved to https://code.visualstudio.com/docs/cpp/colorization-cpp.
|
||||
@@ -0,0 +1,4 @@
|
||||
*.js
|
||||
test/**/index.ts
|
||||
test/**/runTest.ts
|
||||
tools/prepublish.js
|
||||
@@ -0,0 +1,155 @@
|
||||
module.exports = {
|
||||
"env": {
|
||||
"browser": true,
|
||||
"es6": true,
|
||||
"node": true
|
||||
},
|
||||
"parser": "@typescript-eslint/parser",
|
||||
"parserOptions": {
|
||||
"project": "tsconfig.json",
|
||||
"sourceType": "module"
|
||||
},
|
||||
"plugins": [
|
||||
"@typescript-eslint",
|
||||
"@typescript-eslint/tslint",
|
||||
"eslint-plugin-jsdoc",
|
||||
"@typescript-eslint/eslint-plugin-tslint",
|
||||
"eslint-plugin-import",
|
||||
],
|
||||
"rules": {
|
||||
"@typescript-eslint/adjacent-overload-signatures": "error",
|
||||
"@typescript-eslint/array-type": "error",
|
||||
"camelcase": "off",
|
||||
"@typescript-eslint/naming-convention": [
|
||||
"error",
|
||||
{
|
||||
"selector": "typeLike",
|
||||
"format": ["PascalCase"]
|
||||
}
|
||||
],
|
||||
"@typescript-eslint/indent": "error",
|
||||
"@typescript-eslint/member-delimiter-style": [
|
||||
"error",
|
||||
{
|
||||
"multiline": {
|
||||
"delimiter": "semi",
|
||||
"requireLast": true
|
||||
},
|
||||
"singleline": {
|
||||
"delimiter": "semi",
|
||||
"requireLast": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"@typescript-eslint/no-for-in-array": "error",
|
||||
"@typescript-eslint/no-misused-new": "error",
|
||||
"@typescript-eslint/no-namespace": "error",
|
||||
"@typescript-eslint/no-non-null-assertion": "error",
|
||||
"@typescript-eslint/no-extra-non-null-assertion": "error",
|
||||
"@typescript-eslint/no-this-alias": "error",
|
||||
"@typescript-eslint/no-unnecessary-qualifier": "error",
|
||||
"@typescript-eslint/no-unnecessary-type-arguments": "error",
|
||||
"@typescript-eslint/no-var-requires": "error",
|
||||
"@typescript-eslint/prefer-function-type": "error",
|
||||
"@typescript-eslint/prefer-namespace-keyword": "error",
|
||||
"@typescript-eslint/semi": "error",
|
||||
"@typescript-eslint/triple-slash-reference": "error",
|
||||
"@typescript-eslint/type-annotation-spacing": "error",
|
||||
"@typescript-eslint/unified-signatures": "error",
|
||||
"arrow-body-style": "error",
|
||||
"comma-dangle": "error",
|
||||
"constructor-super": "error",
|
||||
"curly": "error",
|
||||
"eol-last": "error",
|
||||
"eqeqeq": [
|
||||
"error",
|
||||
"always"
|
||||
],
|
||||
"import/no-default-export": "error",
|
||||
"import/no-unassigned-import": "error",
|
||||
"jsdoc/no-types": "error",
|
||||
"new-parens": "error",
|
||||
"no-bitwise": "error",
|
||||
"no-caller": "error",
|
||||
"no-cond-assign": "error",
|
||||
"no-debugger": "error",
|
||||
"no-duplicate-case": "error",
|
||||
"no-duplicate-imports": "error",
|
||||
"no-eval": "error",
|
||||
"no-fallthrough": "error",
|
||||
"no-invalid-this": "error",
|
||||
"no-irregular-whitespace": "error",
|
||||
"no-multiple-empty-lines": ["error", { "max": 1, "maxEOF": 1, "maxBOF": 0 }],
|
||||
"no-new-wrappers": "error",
|
||||
"no-redeclare": "error",
|
||||
"no-return-await": "error",
|
||||
"no-sequences": "error",
|
||||
"no-sparse-arrays": "error",
|
||||
"no-trailing-spaces": "error",
|
||||
"no-undef-init": "error",
|
||||
"no-unsafe-finally": "error",
|
||||
"no-unused-expressions": "error",
|
||||
"no-unused-labels": "error",
|
||||
"no-var": "error",
|
||||
"one-var": [
|
||||
"error",
|
||||
"never"
|
||||
],
|
||||
"prefer-const": "error",
|
||||
"prefer-object-spread": "error",
|
||||
"space-in-parens": [
|
||||
"error",
|
||||
"never"
|
||||
],
|
||||
"spaced-comment": [
|
||||
"error",
|
||||
"always"
|
||||
],
|
||||
"use-isnan": "error",
|
||||
"valid-typeof": "error",
|
||||
"yoda": "error",
|
||||
"@typescript-eslint/tslint/config": [
|
||||
"error",
|
||||
{
|
||||
"rules": {
|
||||
"encoding": true,
|
||||
"file-header": [
|
||||
true,
|
||||
".*"
|
||||
],
|
||||
"import-spacing": true,
|
||||
"match-default-export-name": true,
|
||||
"no-boolean-literal-compare": true,
|
||||
"no-mergeable-namespace": true,
|
||||
"no-reference-import": true,
|
||||
"no-unnecessary-callback-wrapper": true,
|
||||
"number-literal-format": true,
|
||||
"one-line": [
|
||||
true,
|
||||
"check-catch",
|
||||
"check-finally",
|
||||
"check-else",
|
||||
"check-open-brace",
|
||||
"check-whitespace"
|
||||
],
|
||||
"prefer-method-signature": true,
|
||||
"prefer-while": true,
|
||||
"typedef": [
|
||||
true,
|
||||
"variable-declaration",
|
||||
"call-signature",
|
||||
"variable-declaration-ignore-function"
|
||||
],
|
||||
"whitespace": [
|
||||
true,
|
||||
"check-branch",
|
||||
"check-operator",
|
||||
"check-separator",
|
||||
"check-preblock",
|
||||
"check-type"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
};
|
||||
+15
-1
@@ -9,7 +9,10 @@ dist
|
||||
server
|
||||
debugAdapters
|
||||
LLVM
|
||||
bin/Microsoft.VSCode.CPP.*
|
||||
bin/cpptools*
|
||||
bin/*.dll
|
||||
bin/.vs
|
||||
bin/LICENSE.txt
|
||||
|
||||
# ignore lock files
|
||||
install.lock
|
||||
@@ -19,3 +22,14 @@ install.lock
|
||||
|
||||
# ignore vscode test
|
||||
.vscode-test/
|
||||
|
||||
# ignore generated localization file
|
||||
**/nls.*.json
|
||||
**/*.nls.*.json
|
||||
|
||||
# ignore generate native header
|
||||
localized_string_ids.h
|
||||
|
||||
# ignore generate files. It will be generated when building
|
||||
src/nativeStrings.ts
|
||||
|
||||
|
||||
Vendored
+91
-15
@@ -3,7 +3,7 @@
|
||||
"version": "0.1.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Launch Extension",
|
||||
"name": "Launch Extension (development)",
|
||||
"type": "extensionHost",
|
||||
"request": "launch",
|
||||
"runtimeExecutable": "${execPath}",
|
||||
@@ -18,36 +18,72 @@
|
||||
"preLaunchTask": "Compile Dev",
|
||||
},
|
||||
{
|
||||
"name": "Launch Tests",
|
||||
"name": "Launch Extension (production)",
|
||||
"type": "extensionHost",
|
||||
"request": "launch",
|
||||
"runtimeExecutable": "${execPath}",
|
||||
"args": [
|
||||
"--extensionDevelopmentPath=${workspaceFolder}",
|
||||
"--extensionTestsPath=${workspaceFolder}/out/test/unitTests"
|
||||
"--extensionDevelopmentPath=${workspaceFolder}"
|
||||
],
|
||||
"stopOnEntry": false,
|
||||
"sourceMaps": true,
|
||||
"outFiles": [
|
||||
"${workspaceFolder}/out/test/**/*.js"
|
||||
"${workspaceFolder}/dist/**/*.js"
|
||||
],
|
||||
"preLaunchTask": "TypeScript Compile"
|
||||
"preLaunchTask": "TypeScript Compile",
|
||||
},
|
||||
{
|
||||
"name": "Node Attach",
|
||||
"type": "node",
|
||||
"request": "attach",
|
||||
"port": 5858
|
||||
},
|
||||
{
|
||||
"name": "Launch Integration Tests",
|
||||
"name": "Launch Extension (do not build)",
|
||||
"type": "extensionHost",
|
||||
"request": "launch",
|
||||
"runtimeExecutable": "${execPath}",
|
||||
"args": [
|
||||
"--extensionDevelopmentPath=${workspaceFolder}"
|
||||
],
|
||||
"stopOnEntry": false,
|
||||
"sourceMaps": true,
|
||||
"outFiles": [
|
||||
"${workspaceFolder}/dist/**/*.js"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Launch Extension (watch, development)",
|
||||
"type": "extensionHost",
|
||||
"request": "launch",
|
||||
"runtimeExecutable": "${execPath}",
|
||||
"args": [
|
||||
"--extensionDevelopmentPath=${workspaceFolder}"
|
||||
],
|
||||
"stopOnEntry": false,
|
||||
"sourceMaps": true,
|
||||
"outFiles": [
|
||||
"${workspaceFolder}/dist/**/*.js"
|
||||
],
|
||||
"preLaunchTask": "Compile Dev Watch",
|
||||
},
|
||||
{
|
||||
"name": "Launch Extension (watch, production)",
|
||||
"type": "extensionHost",
|
||||
"request": "launch",
|
||||
"runtimeExecutable": "${execPath}",
|
||||
"args": [
|
||||
"--extensionDevelopmentPath=${workspaceFolder}"
|
||||
],
|
||||
"stopOnEntry": false,
|
||||
"sourceMaps": true,
|
||||
"outFiles": [
|
||||
"${workspaceFolder}/dist/**/*.js"
|
||||
],
|
||||
"preLaunchTask": "TypeScript Compile Watch",
|
||||
},
|
||||
{
|
||||
"name": "Launch Unit Tests",
|
||||
"type": "extensionHost",
|
||||
"request": "launch",
|
||||
"runtimeExecutable": "${execPath}",
|
||||
"args": [
|
||||
"${workspaceFolder}/test/integrationTests/testAssets/SimpleCppProject",
|
||||
"--extensionDevelopmentPath=${workspaceFolder}",
|
||||
"--extensionTestsPath=${workspaceFolder}/out/test/integrationTests/languageServer"
|
||||
"--extensionTestsPath=${workspaceFolder}/out/test/unitTests/index"
|
||||
],
|
||||
"stopOnEntry": false,
|
||||
"sourceMaps": true,
|
||||
@@ -56,5 +92,45 @@
|
||||
],
|
||||
"preLaunchTask": "Pretest"
|
||||
},
|
||||
{
|
||||
"name": "Launch Integration Tests",
|
||||
"type": "extensionHost",
|
||||
"request": "launch",
|
||||
"runtimeExecutable": "${execPath}",
|
||||
"args": [
|
||||
"${workspaceFolder}/test/integrationTests/testAssets/SimpleCppProject/simpleCppProject.code-workspace",
|
||||
"--extensionDevelopmentPath=${workspaceFolder}",
|
||||
"--extensionTestsPath=${workspaceFolder}/out/test/integrationTests/languageServer/index"
|
||||
],
|
||||
"stopOnEntry": false,
|
||||
"sourceMaps": true,
|
||||
"outFiles": [
|
||||
"${workspaceFolder}/out/test/**/*.js"
|
||||
],
|
||||
"preLaunchTask": "Pretest",
|
||||
},
|
||||
{
|
||||
"name": "Launch E2E IntelliSense features tests",
|
||||
"type": "extensionHost",
|
||||
"request": "launch",
|
||||
"runtimeExecutable": "${execPath}",
|
||||
"args": [
|
||||
"C:/git/Vcls-vscode-test/SingleRootProject",
|
||||
"--extensionDevelopmentPath=${workspaceFolder}",
|
||||
"--extensionTestsPath=${workspaceFolder}/out/test/integrationTests/IntelliSenseFeatures/index"
|
||||
],
|
||||
"stopOnEntry": false,
|
||||
"sourceMaps": true,
|
||||
"outFiles": [
|
||||
"${workspaceFolder}/out/test/**/*.js"
|
||||
],
|
||||
"preLaunchTask": "Pretest"
|
||||
},
|
||||
{
|
||||
"name": "Node Attach",
|
||||
"type": "node",
|
||||
"request": "attach",
|
||||
"port": 5858
|
||||
},
|
||||
]
|
||||
}
|
||||
Vendored
+104
-21
@@ -9,7 +9,7 @@
|
||||
"kind": "build",
|
||||
"isDefault": true
|
||||
},
|
||||
"isBackground": true,
|
||||
"isBackground": false,
|
||||
"type": "shell",
|
||||
"presentation": {
|
||||
"echo": true,
|
||||
@@ -17,28 +17,25 @@
|
||||
"focus": false,
|
||||
"panel": "shared"
|
||||
},
|
||||
"command": "npm",
|
||||
"command": "yarn",
|
||||
"args": [
|
||||
"run",
|
||||
"compile",
|
||||
"--loglevel",
|
||||
"silent"
|
||||
],
|
||||
"problemMatcher": "$tsc-watch"
|
||||
"compile"
|
||||
]
|
||||
},
|
||||
{
|
||||
"label": "TypeScript Lint",
|
||||
"group": "build",
|
||||
"isBackground": false,
|
||||
"type": "shell",
|
||||
"command": "npm",
|
||||
"command": "yarn",
|
||||
"args": [
|
||||
"run",
|
||||
"tslint"
|
||||
"lint"
|
||||
],
|
||||
"problemMatcher": {
|
||||
"fileLocation": "absolute",
|
||||
"source": "tslint",
|
||||
"source": "lint",
|
||||
"pattern": [
|
||||
{
|
||||
"regexp": "(ERROR:) ([a-zA-Z/:\\-\\.]*)\\[(\\d+), (\\d+)\\]: (.*)",
|
||||
@@ -51,7 +48,7 @@
|
||||
]
|
||||
},
|
||||
"dependsOn": [
|
||||
"TypeScript Compile"
|
||||
"Compile Dev"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -59,30 +56,116 @@
|
||||
"group": "build",
|
||||
"isBackground": false,
|
||||
"type": "shell",
|
||||
"command": "npm",
|
||||
"command": "yarn",
|
||||
"args": [
|
||||
"run",
|
||||
"compileDev"
|
||||
],
|
||||
"dependsOn": [
|
||||
"TypeScript Compile"
|
||||
],
|
||||
"problemMatcher": "$tsc-watch"
|
||||
"compile-dev"
|
||||
]
|
||||
},
|
||||
{
|
||||
"label": "Pretest",
|
||||
"group": "build",
|
||||
"isBackground": false,
|
||||
"type": "shell",
|
||||
"command": "npm",
|
||||
"command": "yarn",
|
||||
"args": [
|
||||
"run",
|
||||
"pretest"
|
||||
],
|
||||
"dependsOn": [
|
||||
"TypeScript Compile"
|
||||
"Compile Dev"
|
||||
]
|
||||
},
|
||||
{
|
||||
"label": "TypeScript Compile Watch",
|
||||
"group": {
|
||||
"kind": "build",
|
||||
"isDefault": true
|
||||
},
|
||||
"isBackground": true,
|
||||
"type": "shell",
|
||||
"presentation": {
|
||||
"echo": true,
|
||||
"reveal": "silent",
|
||||
"focus": false,
|
||||
"panel": "shared"
|
||||
},
|
||||
"command": "yarn",
|
||||
"args": [
|
||||
"run",
|
||||
"compile-watch"
|
||||
],
|
||||
"problemMatcher": "$tsc-watch"
|
||||
"problemMatcher": [
|
||||
{
|
||||
"owner": "typescript",
|
||||
"source": "ts",
|
||||
"applyTo": "closedDocuments",
|
||||
"fileLocation": "absolute",
|
||||
"severity": "error",
|
||||
"pattern": [
|
||||
{
|
||||
"regexp": "\\[tsl\\] ERROR in (.*)?\\((\\d+),(\\d+)\\)",
|
||||
"file": 1,
|
||||
"line": 2,
|
||||
"column": 3
|
||||
},
|
||||
{
|
||||
"regexp": "\\s*TS\\d+:\\s*(.*)",
|
||||
"message": 1
|
||||
}
|
||||
],
|
||||
"background": {
|
||||
"activeOnStart": true,
|
||||
"beginsPattern": {
|
||||
"regexp": "asset"
|
||||
},
|
||||
"endsPattern": {
|
||||
"regexp": "webpack (.*?) compiled (.*?) ms"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"label": "Compile Dev Watch",
|
||||
"group": "build",
|
||||
"isBackground": true,
|
||||
"type": "shell",
|
||||
"command": "yarn",
|
||||
"args": [
|
||||
"run",
|
||||
"compile-dev-watch"
|
||||
],
|
||||
"problemMatcher": [
|
||||
{
|
||||
"owner": "typescript",
|
||||
"source": "ts",
|
||||
"applyTo": "closedDocuments",
|
||||
"fileLocation": "absolute",
|
||||
"severity": "error",
|
||||
"pattern": [
|
||||
{
|
||||
"regexp": "\\[tsl\\] ERROR in (.*)?\\((\\d+),(\\d+)\\)",
|
||||
"file": 1,
|
||||
"line": 2,
|
||||
"column": 3
|
||||
},
|
||||
{
|
||||
"regexp": "\\s*TS\\d+:\\s*(.*)",
|
||||
"message": 1
|
||||
}
|
||||
],
|
||||
"background": {
|
||||
"activeOnStart": true,
|
||||
"beginsPattern": {
|
||||
"regexp": "asset"
|
||||
},
|
||||
"endsPattern": {
|
||||
"regexp": "webpack (.*?) compiled (.*?) ms"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
+14
-2
@@ -20,16 +20,28 @@ ui/*.ts
|
||||
|
||||
# ignore Azure-Pipelines files
|
||||
jobs/**
|
||||
cgmanifest.json
|
||||
|
||||
# ignore development files
|
||||
tsconfig.json
|
||||
test.tsconfig.json
|
||||
tslint.json
|
||||
.eslintrc.js
|
||||
webpack.config.js
|
||||
README.md
|
||||
tscCompileList.txt
|
||||
gulpfile.js
|
||||
.gitattributes
|
||||
.gitignore
|
||||
CMakeLists.txt
|
||||
debugAdapters/install.lock*
|
||||
typings/**
|
||||
**/*.map
|
||||
**/*.map
|
||||
import_edge_strings.js
|
||||
localized_string_ids.h
|
||||
translations_auto_pr.js
|
||||
|
||||
# ignore i18n language files
|
||||
i18n/**
|
||||
|
||||
# ignore node_modules
|
||||
node_modules/
|
||||
|
||||
+969
-5
File diff suppressed because it is too large
Load Diff
@@ -1,203 +0,0 @@
|
||||
MICROSOFT PRE-RELEASE SOFTWARE LICENSE TERMS
|
||||
MICROSOFT C/C++ EXTENSION FOR VISUAL STUDIO CODE
|
||||
|
||||
These license terms are an agreement between Microsoft Corporation (or
|
||||
based on where you live, one of its affiliates) and you. They apply to
|
||||
the pre-release software named above. The terms also apply to any
|
||||
Microsoft services or updates for the software, except to the extent
|
||||
those have additional terms.
|
||||
|
||||
IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW.
|
||||
|
||||
1. INSTALLATION AND USE RIGHTS. You may only use the C/C++ Extension
|
||||
for Visual Studio Code with Visual Studio Code, Visual Studio or
|
||||
Xamarin Studio software to help you develop and test your
|
||||
applications.
|
||||
|
||||
2. TERMS FOR SPECIFIC COMPONENTS
|
||||
a. Third Party Components. The software may include third party
|
||||
components with separate legal notices or governed by other
|
||||
agreements, as may be described in the ThirdPartyNotices file(s)
|
||||
accompanying the software.
|
||||
b. Package Managers. The software may include package managers, like
|
||||
Nuget, that give you the option to download other Microsoft and third
|
||||
party software packages to use with your application. Those packages
|
||||
are under their own licenses, and not this agreement. Microsoft does
|
||||
not distribute, license or provide any warranties for any of the third
|
||||
party packages.
|
||||
|
||||
3. DATA.
|
||||
a. Data Collection. The software may collect information about you and
|
||||
your use of the software, and send that to Microsoft. Microsoft may
|
||||
use this information to provide services and improve our products and
|
||||
services. You may opt-out of many of these scenarios, but not all, as
|
||||
described in the product documentation. There are also some features
|
||||
in the software that may enable you and Microsoft to collect data from
|
||||
users of your applications. If you use these features, you must comply
|
||||
with applicable law, including providing appropriate notices to users
|
||||
of your applications together with a copy of Microsoft’s privacy
|
||||
statement. Our privacy statement is located at
|
||||
https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more
|
||||
about data collection and use in the help documentation and our
|
||||
privacy statement. Your use of the software operates as your consent
|
||||
to these practices.
|
||||
b. Processing of Personal Data. To the extent Microsoft is a processor
|
||||
or subprocessor of personal data in connection with the software,
|
||||
Microsoft makes the commitments in the European Union General Data
|
||||
Protection Regulation Terms of the Online Services Terms to all
|
||||
customers effective May 25, 2018, at
|
||||
http://go.microsoft.com/?linkid=9840733.
|
||||
|
||||
4. PRE-RELEASE SOFTWARE. This software is a pre-release version. It
|
||||
may not work the way a final version of the software will. We may
|
||||
change it for the final, commercial version. We also may not release a
|
||||
commercial version.
|
||||
|
||||
5. FEEDBACK. If you give feedback about the software to Microsoft, you
|
||||
give to Microsoft, without charge, the right to use, share and
|
||||
commercialize your feedback in any way and for any purpose. You will
|
||||
not give feedback that is subject to a license that requires Microsoft
|
||||
to license its software or documentation to third parties because we
|
||||
include your feedback in them. These rights survive this agreement.
|
||||
|
||||
6. SCOPE OF LICENSE. The software is licensed, not sold. This
|
||||
agreement only gives you some rights to use the software. Microsoft
|
||||
reserves all other rights. Unless applicable law gives you more rights
|
||||
despite this limitation, you may use the software only as expressly
|
||||
permitted in this agreement. In doing so, you must comply with any
|
||||
technical limitations in the software that only allow you to use it in
|
||||
certain ways. You may not
|
||||
* work around any technical limitations in the software;
|
||||
* reverse engineer, decompile or disassemble the software, or attempt
|
||||
to derive the source code for the software, except and to the extent
|
||||
required by third party licensing terms governing use of certain open
|
||||
source components that may be included with the software;
|
||||
* remove, minimize, block or modify any notices of Microsoft or its
|
||||
suppliers in the software;
|
||||
* use the software in any way that is against the law; or
|
||||
* share, publish, rent, or lease the software, or provide the software
|
||||
as a stand-alone hosted solution for others to use.
|
||||
|
||||
7. EXPORT RESTRICTIONS. You must comply with all domestic and
|
||||
international export laws and regulations that apply to the software,
|
||||
which include restrictions on destinations, end users and end use.
|
||||
For further information on export restrictions, visit
|
||||
(aka.ms/exporting).
|
||||
|
||||
8. SUPPORT SERVICES. Because this software is “as is,” we may not
|
||||
provide support services for it.
|
||||
|
||||
9. ENTIRE AGREEMENT. This agreement, and the terms for supplements,
|
||||
updates, Internet-based services and support services that you use,
|
||||
are the entire agreement for the software and support services.
|
||||
|
||||
10. APPLICABLE LAW. If you acquired the software in the United
|
||||
States, Washington law applies to interpretation of and claims for
|
||||
breach of this agreement, and the laws of the state where you live
|
||||
apply to all other claims. If you acquired the software in any other
|
||||
country, its laws apply.
|
||||
|
||||
11. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes
|
||||
certain legal rights. You may have other rights, including consumer
|
||||
rights, under the laws of your state or country. Separate and apart
|
||||
from your relationship with Microsoft, you may also have rights with
|
||||
respect to the party from which you acquired the software. This
|
||||
agreement does not change those other rights if the laws of your state
|
||||
or country do not permit it to do so. For example, if you acquired the
|
||||
software in one of the below regions, or mandatory country law
|
||||
applies, then the following provisions apply to you:
|
||||
|
||||
a. Australia. You have statutory guarantees under the Australian
|
||||
Consumer Law and nothing in this agreement is intended to affect those
|
||||
rights.
|
||||
|
||||
b. Canada. If you acquired this software in Canada, you may stop
|
||||
receiving updates by turning off the automatic update feature,
|
||||
disconnecting your device from the Internet (if and when you re-
|
||||
connect to the Internet, however, the software will resume checking
|
||||
for and installing updates), or uninstalling the software. The product
|
||||
documentation, if any, may also specify how to turn off updates for
|
||||
your specific device or software.
|
||||
|
||||
c. Germany and Austria.
|
||||
(i) Warranty. The properly licensed software will perform
|
||||
substantially as described in any Microsoft materials that accompany
|
||||
the software. However, Microsoft gives no contractual guarantee in
|
||||
relation to the licensed software.
|
||||
(ii) Limitation of Liability. In case of intentional conduct, gross
|
||||
negligence, claims based on the Product Liability Act, as well as, in
|
||||
case of death or personal or physical injury, Microsoft is liable
|
||||
according to the statutory law.
|
||||
Subject to the foregoing clause (ii), Microsoft will only be liable
|
||||
for slight negligence if Microsoft is in breach of such material
|
||||
contractual obligations, the fulfillment of which facilitate the due
|
||||
performance of this agreement, the breach of which would endanger the
|
||||
purpose of this agreement and the compliance with which a party may
|
||||
constantly trust in (so-called "cardinal obligations"). In other cases
|
||||
of slight negligence, Microsoft will not be liable for slight
|
||||
negligence.
|
||||
|
||||
12. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS-IS.” YOU
|
||||
BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES,
|
||||
GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL
|
||||
LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
|
||||
13. LIMITATION ON AND EXCLUSION OF DAMAGES. YOU CAN RECOVER FROM
|
||||
MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU
|
||||
CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST
|
||||
PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES.
|
||||
|
||||
This limitation applies to (a) anything related to the software,
|
||||
services, content (including code) on third party Internet sites, or
|
||||
third party applications; and (b) claims for breach of contract,
|
||||
breach of warranty, guarantee or condition, strict liability,
|
||||
negligence, or other tort to the extent permitted by applicable law.
|
||||
|
||||
It also applies even if Microsoft knew or should have known about the
|
||||
possibility of the damages. The above limitation or exclusion may not
|
||||
apply to you because your country may not allow the exclusion or
|
||||
limitation of incidental, consequential or other damages.
|
||||
|
||||
Please note: As this software is distributed in Quebec, Canada, some
|
||||
of the clauses in this agreement are provided below in French.
|
||||
|
||||
Remarque : Ce logiciel étant distribué au Québec, Canada, certaines
|
||||
des clauses dans ce contrat sont fournies ci-dessous en français.
|
||||
|
||||
EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert
|
||||
« tel quel ». Toute utilisation de ce logiciel est à votre seule
|
||||
risque et péril. Microsoft n’accorde aucune autre garantie
|
||||
expresse. Vous pouvez bénéficier de droits additionnels en vertu du
|
||||
droit local sur la protection des consommateurs, que ce contrat ne
|
||||
peut modifier. La ou elles sont permises par le droit locale, les
|
||||
garanties implicites de qualité marchande, d’adéquation à un
|
||||
usage particulier et d’absence de contrefaçon sont exclues.
|
||||
|
||||
LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ
|
||||
POUR LES DOMMAGES. Vous pouvez obtenir de Microsoft et de ses
|
||||
fournisseurs une indemnisation en cas de dommages directs uniquement
|
||||
à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune
|
||||
indemnisation pour les autres dommages, y compris les dommages
|
||||
spéciaux, indirects ou accessoires et pertes de bénéfices.
|
||||
|
||||
Cette limitation concerne:
|
||||
|
||||
* tout ce qui est relié au logiciel, aux services ou au contenu (y
|
||||
compris le code) figurant sur des sites Internet tiers ou dans des
|
||||
programmes tiers ; et
|
||||
* les réclamations au titre de violation de contrat ou de garantie,
|
||||
ou au titre de responsabilité stricte, de négligence ou d’une
|
||||
autre faute dans la limite autorisée par la loi en vigueur.
|
||||
|
||||
Elle s’applique également, même si Microsoft connaissait ou
|
||||
devrait connaître l’éventualité d’un tel dommage. Si votre pays
|
||||
n’autorise pas l’exclusion ou la limitation de responsabilité
|
||||
pour les dommages indirects, accessoires ou de quelque nature que ce
|
||||
soit, il se peut que la limitation ou l’exclusion ci-dessus ne
|
||||
s’appliquera pas à votre égard.
|
||||
|
||||
EFFET JURIDIQUE. Le présent contrat décrit certains droits
|
||||
juridiques. Vous pourriez avoir d’autres droits prévus par les lois
|
||||
de votre pays. Le présent contrat ne modifie pas les droits que vous
|
||||
confèrent les lois de votre pays si celles-ci ne le permettent pas.
|
||||
+54
-30
@@ -1,34 +1,58 @@
|
||||
# C/C++ for Visual Studio Code
|
||||
This preview release of the extension adds language support for C/C++ to Visual Studio Code including:
|
||||
* Language service
|
||||
* Code Formatting (clang-format)
|
||||
* Auto-Completion
|
||||
* Symbol Searching
|
||||
* Go to Definition/Declaration
|
||||
* Peek Definition/Declaration
|
||||
* Class/Method Navigation
|
||||
* Signature Help
|
||||
* Quick Info (Hover)
|
||||
* Error Squiggles
|
||||
* Debugging
|
||||
* Support for debugging Windows (PDB, MinGW/Cygwin), Linux and macOS applications
|
||||
* Line by line code stepping
|
||||
* Breakpoints (including conditional and function breakpoints)
|
||||
* Variable inspection
|
||||
* Multi-threaded debugging support
|
||||
* Core dump debugging support
|
||||
* Executing GDB or MI commands directly when using 'C++ (GDB/LLDB)' debugging environment
|
||||
* For help configuring the debugger see [Configuring launch.json for C/C++ debugging](https://github.com/Microsoft/vscode-cpptools/blob/master/launch.md)
|
||||
on our [GitHub page](https://github.com/Microsoft/vscode-cpptools).
|
||||
|
||||
You can find more detailed information about C/C++ support for Visual Studio Code at our [GitHub page](https://github.com/Microsoft/vscode-cpptools/tree/master/Documentation) and our [VS Code documentation page](https://code.visualstudio.com/docs/languages/cpp).
|
||||
#### [Repository](https://github.com/microsoft/vscode-cpptools) | [Issues](https://github.com/microsoft/vscode-cpptools/issues) | [Documentation](https://code.visualstudio.com/docs/languages/cpp) | [Code Samples](https://github.com/microsoft/vscode-cpptools/tree/main/Code%20Samples)
|
||||
|
||||
## Installation
|
||||
The extension has OS-specific binary dependencies, so installation via the Marketplace requires an Internet connection so that these additional dependencies can be downloaded. If you are working on a computer that does not have access to the Internet or is behind a strict firewall, you may need to use our OS-specific packages and install them by invoking VS Code's `"Install from VSIX..."` command. These "offline' packages are available at: https://github.com/Microsoft/vscode-cpptools/releases.
|
||||
* `cpptools-linux.vsix` - for 64-bit Linux
|
||||
* `cpptools-linux32.vsix` - for 32-bit Linux
|
||||
* `cpptools-osx.vsix` - for macOS
|
||||
* `cpptools-win32.vsix` - for 64-bit & 32-bit Windows
|
||||
[](https://aka.ms/vsls)
|
||||
|
||||
## Contact Us
|
||||
If you run into any issues or have suggestions for us, please file [issues and suggestions on GitHub](https://github.com/Microsoft/vscode-cpptools/issues). If you haven’t already provided us feedback, please take this [quick survey](https://www.research.net/r/VBVV6C6) and let us know what you think!
|
||||
The C/C++ extension adds language support for C/C++ to Visual Studio Code, including features such as IntelliSense and debugging.
|
||||
|
||||
## Overview and tutorials
|
||||
* [C/C++ extension overview](https://code.visualstudio.com/docs/languages/cpp)
|
||||
|
||||
C/C++ extension tutorials per compiler and platform
|
||||
* [Microsoft C++ compiler (MSVC) on Windows](https://code.visualstudio.com/docs/cpp/config-msvc)
|
||||
* [GCC and Mingw-w64 on Windows](https://code.visualstudio.com/docs/cpp/config-mingw)
|
||||
* [GCC on Windows Subsystem for Linux (WSL)](https://code.visualstudio.com/docs/cpp/config-wsl)
|
||||
* [GCC on Linux](https://code.visualstudio.com/docs/cpp/config-linux)
|
||||
* [Clang on macOS](https://code.visualstudio.com/docs/cpp/config-clang-mac)
|
||||
|
||||
## Quick links
|
||||
* [Editing features (IntelliSense)](https://code.visualstudio.com/docs/cpp/cpp-ide)
|
||||
* [IntelliSense configuration](https://code.visualstudio.com/docs/cpp/customize-default-settings-cpp)
|
||||
* [Enhanced colorization](https://code.visualstudio.com/docs/cpp/colorization-cpp)
|
||||
* [Debugging](https://code.visualstudio.com/docs/cpp/cpp-debug)
|
||||
* [Debug configuration](https://code.visualstudio.com/docs/cpp/launch-json-reference)
|
||||
* [Enable logging for IntelliSense or debugging](https://code.visualstudio.com/docs/cpp/enable-logging-cpp)
|
||||
|
||||
## Questions and feedback
|
||||
|
||||
**[FAQs](https://code.visualstudio.com/docs/cpp/faq-cpp)**
|
||||
<br>
|
||||
Check out the FAQs before filing a question.
|
||||
<br>
|
||||
|
||||
**[Provide feedback](https://github.com/microsoft/vscode-cpptools/issues/new/choose)**
|
||||
<br>
|
||||
File questions, issues, or feature requests for the extension.
|
||||
<br>
|
||||
|
||||
**[Known issues](https://github.com/Microsoft/vscode-cpptools/issues)**
|
||||
<br>
|
||||
If someone has already filed an issue that encompasses your feedback, please leave a 👍 or 👎 reaction on the issue to upvote or downvote it to help us prioritize the issue.
|
||||
<br>
|
||||
|
||||
**[Quick survey](https://www.research.net/r/VBVV6C6)**
|
||||
<br>
|
||||
Let us know what you think of the extension by taking the quick survey.
|
||||
|
||||
## Contribution
|
||||
|
||||
Contributions are always welcome. Please see our [contributing guide](CONTRIBUTING.md) for more details.
|
||||
|
||||
## Microsoft Open Source Code of Conduct
|
||||
|
||||
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact opencode@microsoft.com with any additional questions or comments.
|
||||
|
||||
## Data and telemetry
|
||||
|
||||
This extension collects usage data and sends it to Microsoft to help improve our products and services. Collection of telemetry is controlled via the same setting provided by Visual Studio Code: `"telemetry.enableTelemetry"`. Read our [privacy statement](https://privacy.microsoft.com/en-us/privacystatement) to learn more.
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
<h1 data-loc-id="incompatible.extension.heading">Incompatible or Mismatched C/C++ Extension Binaries</h1>
|
||||
|
||||
<p data-loc-id="incompat.extension.text1">The C/C++ extension includes native binaries.</p>
|
||||
|
||||
<p data-loc-id="incompat.extension.text2">When installed via the marketplace UI in VS Code, the correct native binaries should be included. If incompatible binaries were detected and the C/C++ extension had been installed via the marketplace UI in VS Code, <a href="https://github.com/microsoft/vscode/issues/new?assignees=&labels=&template=bug_report.md" data-loc-id="bug.report.link.title">please report the issue</a>.</p>
|
||||
|
||||
<h1 data-loc-id="reinstalling.extension.heading">Reinstalling the C/C++ Extension</h1>
|
||||
|
||||
<p data-loc-id="reinstall.extension.text1">When reinstalling an equivalent version of an extension, VS Code may reuse the existing extension directory. To prevent this from occurring when reinstalling the C/C++ extension, it may be necessary to first delete the existing extension directory.</p>
|
||||
|
||||
<p data-loc-id="reinstall.extension.text2">Installed extension directories can be found under one of the following paths under your user directory (`%USERPROFILE%` on Windows, or `$HOME` on Linux and macOS)</p>
|
||||
|
||||
<pre><code class="lang-bash">%USERPROFILE%\.vscode\extensions</code></pre>
|
||||
<pre><code class="lang-bash">%USERPROFILE%\.vscode-insiders\extensions</code></pre>
|
||||
<pre><code class="lang-bash">%USERPROFILE%\.vscode-exploration\extensions</code></pre>
|
||||
|
||||
<p data-loc-id="reinstall.extension.text3">In a remote connection:</p>
|
||||
<pre><code class="lang-bash">$HOME/.vscode-server/extensions</code></pre>
|
||||
<pre><code class="lang-bash">$HOME/.vscode-server-insiders/extensions</code></pre>
|
||||
<pre><code class="lang-bash">$HOME/.vscode-server-exploration/extensions</code></pre>
|
||||
|
||||
<p data-loc-id="reinstall.extension.text4">Example paths to installed C/C++ extension directories:</p>
|
||||
|
||||
<p data-loc-id="reinstall.extension.text5">On Windows:</p>
|
||||
<pre><code class="lang-bash">%USERPROFILE%\.vscode\extensions\ms-vscode.cpptools-1.9.0</code></pre>
|
||||
|
||||
<p data-loc-id="reinstall.extension.text6">On Linux:</p>
|
||||
<pre><code class="lang-bash">$HOME/.vscode/extensions/ms-vscode.cpptools-1.9.0</code></pre>
|
||||
|
||||
<p data-loc-id="reinstall.extension.text7">Then reinstall via the marketplace UI in VS Code.</p>
|
||||
|
||||
<p data-loc-id="reinstall.extension.text8">If the correct version of the extension fails to be deployed by VS Code, the correct VSIX for your system can be <a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools" data-loc-id="download.vsix.link.title">downloaded from the VS Code marketplace web site</a> and installed using the `Install from VSIX...` option under the '...' menu in the marketplace UI in VS Code.</p>
|
||||
@@ -1,270 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<STYLE type="text/css">
|
||||
body {
|
||||
padding: 10px 20px;
|
||||
line-height: 22px
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
max-height: 100%
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none
|
||||
}
|
||||
|
||||
a:focus,
|
||||
input:focus,
|
||||
select:focus,
|
||||
textarea:focus {
|
||||
outline: 1px solid -webkit-focus-ring-color;
|
||||
outline-offset: -1px
|
||||
}
|
||||
|
||||
hr {
|
||||
border: 0;
|
||||
height: 2px;
|
||||
border-bottom: 2px solid
|
||||
}
|
||||
|
||||
h1 {
|
||||
padding-bottom: .3em;
|
||||
line-height: 1.2;
|
||||
border-bottom-width: 1px;
|
||||
border-bottom-style: solid
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3 {
|
||||
font-weight: 400
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-decoration: underline
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse
|
||||
}
|
||||
|
||||
table > thead > tr > th {
|
||||
text-align: left
|
||||
}
|
||||
|
||||
table > thead > tr > th,
|
||||
table > thead > tr > td,
|
||||
table > tbody > tr > th,
|
||||
table > tbody > tr > td {
|
||||
padding: 5px 10px
|
||||
}
|
||||
|
||||
blockquote {
|
||||
margin: 0 7px 0 5px;
|
||||
padding: 0 16px 0 10px;
|
||||
border-left: 5px solid
|
||||
}
|
||||
|
||||
code {
|
||||
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
|
||||
font-size: 14px;
|
||||
line-height: 19px
|
||||
}
|
||||
|
||||
.mac code {
|
||||
font-size: 12px;
|
||||
line-height: 18px
|
||||
}
|
||||
|
||||
code > div {
|
||||
padding: 16px;
|
||||
border-radius: 3px;
|
||||
overflow: auto
|
||||
}
|
||||
|
||||
.monaco-tokenized-source {
|
||||
white-space: pre
|
||||
}
|
||||
|
||||
/** Theming */
|
||||
|
||||
.vscode-light {
|
||||
color: #1e1e1e
|
||||
}
|
||||
|
||||
.vscode-dark {
|
||||
color: #ddd
|
||||
}
|
||||
|
||||
.vscode-high-contrast {
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.vscode-light code {
|
||||
color: #a31515
|
||||
}
|
||||
|
||||
.vscode-dark code {
|
||||
color: #d7ba7d
|
||||
}
|
||||
|
||||
.vscode-light code > div {
|
||||
background-color: rgba(220, 220, 220, .4)
|
||||
}
|
||||
|
||||
.vscode-dark code > div {
|
||||
background-color: rgba(10, 10, 10, .4)
|
||||
}
|
||||
|
||||
.vscode-high-contrast code > div {
|
||||
background-color: #000
|
||||
}
|
||||
|
||||
.vscode-high-contrast h1 {
|
||||
border-color: #000
|
||||
}
|
||||
|
||||
.vscode-light table > thead > tr > th {
|
||||
border-color: rgba(0, 0, 0, .69)
|
||||
}
|
||||
|
||||
.vscode-dark table > thead > tr > th {
|
||||
border-color: rgba(255, 255, 255, .69)
|
||||
}
|
||||
|
||||
.vscode-light h1,
|
||||
.vscode-light hr,
|
||||
.vscode-light table > tbody > tr + tr > td {
|
||||
border-color: rgba(0, 0, 0, .18)
|
||||
}
|
||||
|
||||
.vscode-dark h1,
|
||||
.vscode-dark hr,
|
||||
.vscode-dark table > tbody > tr + tr > td {
|
||||
border-color: rgba(255, 255, 255, 0.18)
|
||||
}
|
||||
|
||||
.vscode-light blockquote,
|
||||
.vscode-dark blockquote {
|
||||
background: rgba(127, 127, 127, .1);
|
||||
border-color: rgba(0, 122, 204, .5)
|
||||
}
|
||||
|
||||
.vscode-high-contrast blockquote {
|
||||
background: transparent;
|
||||
border-color: #fff
|
||||
}
|
||||
|
||||
.main-content {
|
||||
width: 65%;
|
||||
vertical-align: top
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
vertical-align: top
|
||||
}
|
||||
|
||||
.footer {
|
||||
padding: 25px;
|
||||
text-align: center
|
||||
}
|
||||
|
||||
.vscode-light table > tbody > tr > td.sidebar {
|
||||
background-color: rgba(0, 0, 0, 0.1);
|
||||
border-radius: 10px
|
||||
}
|
||||
|
||||
.vscode-dark table > tbody > tr > td.sidebar {
|
||||
background-color: rgba(255, 255, 255, 0.1);
|
||||
border-radius: 10px
|
||||
}
|
||||
|
||||
.vscode-light a {
|
||||
color: #4080D0
|
||||
}
|
||||
|
||||
.vscode-dark a {
|
||||
color: #a2c1e8
|
||||
}
|
||||
</STYLE>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div>
|
||||
<div>
|
||||
<h1>Microsoft C/C++ Extension for VS Code</h1>
|
||||
</div>
|
||||
<table>
|
||||
<tr>
|
||||
<td class="main-content">
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div>
|
||||
<h2 class="caption">May 2019 Update</h2>
|
||||
<div>Thank you for installing the C/C++ extension! We're excited to announce the following features in the May update:<br/>
|
||||
<h3 style="font-weight: 600">IntelliSense configuration settings editor UI</h3>
|
||||
The extension now has a UI editor to edit basic IntelliSense configuration settings defined in the underlying <code>c_cpp_properties.json</code> file.<br/>
|
||||
<br/>
|
||||
You can get to the IntelliSense configuration settings editor UI through the command palette (Ctrl+Shift+P) and running the <code>C/C++: Edit configurations (UI)</code> command.
|
||||
The <code>c_cpp_properties.json</code> file can be opened by running the <code>C/C++: Edit configurations (JSON)</code> command.
|
||||
<br/>
|
||||
<br/>
|
||||
<em style="font-weight: 600">Please Note:</em> When configuring IntelliSense for the first time, VS Code will open the UI editor or JSON file based on your <code>workbench.settings.editor</code> setting.
|
||||
If <code>workbench.settings.editor</code> is set to “ui”, then the UI editor will open by default, and if it is set to “json”, then the JSON file will open by default. You can view that setting under VS Code preferences → settings → “Workbench Settings Editor”.<br/>
|
||||
|
||||
<h3 style="font-weight: 600">Log diagnostics command</h3>
|
||||
We added the command <code>C/C++: Log Diagnostics</code> to help diagnose IntelliSense issues. Running the command shows IntelliSense information of the current translation unit that is associated with the active file.<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
Additional features and bug fixes are detailed in the <a href="https://github.com/Microsoft/vscode-cpptools/releases">full release notes</a>.</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td class="sidebar">
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<div>
|
||||
<h3 class="caption">Getting Started</h3>
|
||||
<div><a href="https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/Getting%20started%20with%20IntelliSense%20configuration.md">Configuring IntelliSense</a></div>
|
||||
<div><a href="https://github.com/Microsoft/vscode-cpptools/blob/master/launch.md">Configuring Debugging</a></div>
|
||||
<div><a href="https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/LanguageServer/MinGW.md">IntelliSense for MinGW projects</a></div>
|
||||
<div><a href="https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/LanguageServer/Windows%20Subsystem%20for%20Linux.md">IntelliSense for Windows Subsystem for Linux projects</a></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div>
|
||||
<h3 class="caption">Blog Posts</h3>
|
||||
<div><a href="https://devblogs.microsoft.com/cppblog/vscode-cpp-may-2019-update/">May 2019 Update</a></div>
|
||||
<div><a href="https://devblogs.microsoft.com/cppblog/visual-studio-code-c-c-extension-march-2019-update/">March 2019 Update</a></div>
|
||||
<div><a href="https://devblogs.microsoft.com/cppblog/vs-code-cpp-extension-january-2019-update/">January 2019 Update</a></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" class="footer">
|
||||
<div>
|
||||
Having trouble with the extension? -
|
||||
<a href="https://github.com/Microsoft/vscode-cpptools/tree/master/Documentation">Browse the documentation</a> -
|
||||
<a href="https://www.github.com/Microsoft/vscode-cpptools/issues">Report an issue</a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
+1408
-3428
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -0,0 +1,3 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.00001 8.70708L11.6465 12.3535L12.3536 11.6464L8.70711 7.99998L12.3536 4.35353L11.6465 3.64642L8.00001 7.29287L4.35356 3.64642L3.64645 4.35353L7.2929 7.99998L3.64645 11.6464L4.35356 12.3535L8.00001 8.70708Z" fill="#C5C5C5"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 380 B |
@@ -0,0 +1,3 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.99998 8.70708L11.6464 12.3535L12.3535 11.6464L8.70708 7.99998L12.3535 4.35353L11.6464 3.64642L7.99998 7.29287L4.35353 3.64642L3.64642 4.35353L7.29287 7.99998L3.64642 11.6464L4.35353 12.3535L7.99998 8.70708Z" fill="#424242"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 381 B |
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user