mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-24 18:47:10 -05:00
Compare commits
351 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e57eb999fc | ||
|
|
99af31fa1f | ||
|
|
e2990db33e | ||
|
|
b2238dc37b | ||
|
|
6770bf877e | ||
|
|
ba66305bb5 | ||
|
|
8e731c75c3 | ||
|
|
db0409569a | ||
|
|
fb4ab6b501 | ||
|
|
bd1d96a57a | ||
|
|
6fe49e8cef | ||
|
|
6da98ed439 | ||
|
|
5ef69f5133 | ||
|
|
ebf47df35e | ||
|
|
2a93d7c5e9 | ||
|
|
573c5b4470 | ||
|
|
41838b7720 | ||
|
|
ee1359fd7c | ||
|
|
189bcf703e | ||
|
|
ddfdd43fc3 | ||
|
|
648287fa85 | ||
|
|
de27f2c2a5 | ||
|
|
8ff0ee59c5 | ||
|
|
a5a8c9761e | ||
|
|
89554e5c14 | ||
|
|
5618799305 | ||
|
|
32a89676f1 | ||
|
|
461dd79bc2 | ||
|
|
7ef3f003dd | ||
|
|
0c1edc1aeb | ||
|
|
2dfd75352f | ||
|
|
136a1d8cee | ||
|
|
5fd29d5ad8 | ||
|
|
64929de09d | ||
|
|
fefe1454de | ||
|
|
0eaee18dc4 | ||
|
|
28fff9ace8 | ||
|
|
a41073adbf | ||
|
|
379eae22ed | ||
|
|
f49fe59e1f | ||
|
|
9e61c468d1 | ||
|
|
7e0c7e35a1 | ||
|
|
b02bf17d1f | ||
|
|
510b84df3c | ||
|
|
2eebcab74a | ||
|
|
5ccc0fd97b | ||
|
|
76967d9467 | ||
|
|
eb0ee387ec | ||
|
|
bd7aac8ee0 | ||
|
|
977111eb21 | ||
|
|
5ccde42213 | ||
|
|
8b9aeb8679 | ||
|
|
308dfee963 | ||
|
|
f22dacadbe | ||
|
|
13d4ab22b1 | ||
|
|
968d570073 | ||
|
|
638eb151dd | ||
|
|
52e3c2f9c7 | ||
|
|
d517cf0c8c | ||
|
|
9acd757f6a | ||
|
|
167a9f991a | ||
|
|
5cebfb3013 | ||
|
|
4e5d001a9c | ||
|
|
09b578a169 | ||
|
|
d3105beb43 | ||
|
|
74c2d16660 | ||
|
|
c09e7b9e2f | ||
|
|
88126c68e7 | ||
|
|
455de9add6 | ||
|
|
2f6c944317 | ||
|
|
0059ffb777 | ||
|
|
12ba85ec33 | ||
|
|
c161f8d8ad | ||
|
|
206738db63 | ||
|
|
7ecb6b4427 | ||
|
|
0c47a4486b | ||
|
|
c79929fdd2 | ||
|
|
61cbc5eff0 | ||
|
|
fa4ad6cdb9 | ||
|
|
1b26dc0558 | ||
|
|
833313c72b | ||
|
|
8a0824c1c6 | ||
|
|
2d2376a2a6 | ||
|
|
774151b6e9 | ||
|
|
041f34beda | ||
|
|
b1526603cc | ||
|
|
6070922579 | ||
|
|
8cdb5b36a9 | ||
|
|
ad68fddbc9 | ||
|
|
dd8b12f805 | ||
|
|
c5d3251bb5 | ||
|
|
48b6dd796b | ||
|
|
362af3c153 | ||
|
|
fa2fcf2e40 | ||
|
|
8529b52e73 | ||
|
|
ef5ca7bc3a | ||
|
|
5b34dd2eee | ||
|
|
d647dbde09 | ||
|
|
d2e367c139 | ||
|
|
c3ddbba997 | ||
|
|
51ab435e5f | ||
|
|
4a8609c3ef | ||
|
|
03df1edcf8 | ||
|
|
5bd983e7a3 | ||
|
|
4293d53e79 | ||
|
|
ce10c3ac3f | ||
|
|
74caccdfe6 | ||
|
|
778a34a9d2 | ||
|
|
102d820935 | ||
|
|
4a4e6dd90c | ||
|
|
82a08d108b | ||
|
|
099916bf19 | ||
|
|
48dcb7258e | ||
|
|
e181cf2fcd | ||
|
|
746b4d7815 | ||
|
|
a67e3abb4c | ||
|
|
30d9e9c141 | ||
|
|
0fd870d156 | ||
|
|
768d333b35 | ||
|
|
2058682743 | ||
|
|
1c0f7c6702 | ||
|
|
9e0ba700c1 | ||
|
|
ea5f9be441 | ||
|
|
6b5c31410d | ||
|
|
8e4d0ad446 | ||
|
|
0a6dc2720d | ||
|
|
ef8c0e91e6 | ||
|
|
2f6c764869 | ||
|
|
73b9849dd5 | ||
|
|
64e217eac2 | ||
|
|
826e069b63 | ||
|
|
6e8a08c27a | ||
|
|
5a01218691 | ||
|
|
f45374bc30 | ||
|
|
ecbd8fb82c | ||
|
|
a42407b81a | ||
|
|
a622e4ac40 | ||
|
|
6816f2dabb | ||
|
|
a0c3f8f614 | ||
|
|
01b9754c80 | ||
|
|
cd8f26ae9d | ||
|
|
b650168704 | ||
|
|
9587edd867 | ||
|
|
642920504a | ||
|
|
67abc2f690 | ||
|
|
5bf85a2855 | ||
|
|
829717f5de | ||
|
|
866bfc61ba | ||
|
|
6638db1f35 | ||
|
|
f0dde491be | ||
|
|
994a2382ad | ||
|
|
856fec4243 | ||
|
|
d1c594cfd0 | ||
|
|
86da9852ca | ||
|
|
4ba6a979ba | ||
|
|
82974a2135 | ||
|
|
585c18ef4d | ||
|
|
7ec516d851 | ||
|
|
7e970d04ca | ||
|
|
808ce4366d | ||
|
|
8271226487 | ||
|
|
bbb7a67bd2 | ||
|
|
698b4fce41 | ||
|
|
302e8305ef | ||
|
|
659f392196 | ||
|
|
775a25d944 | ||
|
|
bceb766d28 | ||
|
|
36fd618ed4 | ||
|
|
99c473cdf6 | ||
|
|
88b55d0e06 | ||
|
|
184d4bbe27 | ||
|
|
4fc6f4a13e | ||
|
|
adad11c725 | ||
|
|
a1b5af0445 | ||
|
|
db4f512991 | ||
|
|
42ff30515c | ||
|
|
62565e0577 | ||
|
|
de177c0335 | ||
|
|
d614116b63 | ||
|
|
a7ff238653 | ||
|
|
6fb120f5dd | ||
|
|
6e8cc3aaca | ||
|
|
18ab73cc1d | ||
|
|
d1c7370f1c | ||
|
|
794f7a14c0 | ||
|
|
7cd2a6d6aa | ||
|
|
febf6b9e70 | ||
|
|
7201025a15 | ||
|
|
4787d7ba5c | ||
|
|
3de95af25c | ||
|
|
0bf4790a64 | ||
|
|
0d9353d99e | ||
|
|
a898c46e74 | ||
|
|
493e7087cf | ||
|
|
f5ce7fb2a5 | ||
|
|
a8818ab0df | ||
|
|
9691fab917 | ||
|
|
a7f5741608 | ||
|
|
c34869c243 | ||
|
|
ab94b9785e | ||
|
|
ee94524ab1 | ||
|
|
6cce532ca4 | ||
|
|
7f16a4d857 | ||
|
|
255ea1945b | ||
|
|
b38b53b658 | ||
|
|
82c60a23c0 | ||
|
|
c93ea20b75 | ||
|
|
6a4e4fc07b | ||
|
|
d358cdac1e | ||
|
|
4f8ced1f6b | ||
|
|
8cc60fde90 | ||
|
|
b8bc629970 | ||
|
|
9a83dfc022 | ||
|
|
d5e26527a6 | ||
|
|
c9226a07c5 | ||
|
|
d451528b36 | ||
|
|
48b2cbb0bf | ||
|
|
39e6b9933d | ||
|
|
d08fb1aee2 | ||
|
|
5235a1d029 | ||
|
|
3135b8525b | ||
|
|
0e9797c394 | ||
|
|
4145ecfb32 | ||
|
|
20e9b329b1 | ||
|
|
d1ccbf028f | ||
|
|
a1fc621e1b | ||
|
|
9ef6bec960 | ||
|
|
b631530753 | ||
|
|
d9997cebfc | ||
|
|
ffee69a765 | ||
|
|
7a38943412 | ||
|
|
c970173fc0 | ||
|
|
0979ce8de6 | ||
|
|
878bcc0d92 | ||
|
|
68b2f1a8e4 | ||
|
|
8cd06f74b9 | ||
|
|
43387f0d0b | ||
|
|
f3a6fc6f88 | ||
|
|
f2bc367e78 | ||
|
|
46a8410fc5 | ||
|
|
be7c26ede5 | ||
|
|
fb3b7be9e5 | ||
|
|
78731e0c8c | ||
|
|
6b67f27cac | ||
|
|
56182a53d1 | ||
|
|
66e1c01793 | ||
|
|
f0039a64a7 | ||
|
|
22501a09a1 | ||
|
|
c03cce7f60 | ||
|
|
98abf4a758 | ||
|
|
c19bc54877 | ||
|
|
e17d4e96ae | ||
|
|
b333788c3c | ||
|
|
632ca0685e | ||
|
|
52de2b4751 | ||
|
|
fc0c05c755 | ||
|
|
22b8ebd281 | ||
|
|
ec91d3eda0 | ||
|
|
7b31ee27d8 | ||
|
|
927120fa3b | ||
|
|
f1ca2a35ef | ||
|
|
1760af13d1 | ||
|
|
183cb84fbc | ||
|
|
019d5088ec | ||
|
|
15913e5e48 | ||
|
|
e6ffb97a7b | ||
|
|
8655044dfb | ||
|
|
f26c790736 | ||
|
|
7e553031ce | ||
|
|
164ec41fb1 | ||
|
|
8cd9097526 | ||
|
|
134b0b32c6 | ||
|
|
de4b7af1ad | ||
|
|
f976fc9418 | ||
|
|
55059907a3 | ||
|
|
8ca0082ec4 | ||
|
|
5b50696a1b | ||
|
|
840683e3f0 | ||
|
|
ee5dbdffb9 | ||
|
|
43f6a5576d | ||
|
|
8a44de27e7 | ||
|
|
fa9bbd4e1e | ||
|
|
66048f1d63 | ||
|
|
bafd9fd437 | ||
|
|
dae71c3bf4 | ||
|
|
ae8304fc33 | ||
|
|
d6ef42c8b0 | ||
|
|
131b0b93bf | ||
|
|
82185f75d7 | ||
|
|
3769b5066f | ||
|
|
ba8c331356 | ||
|
|
80248846bb | ||
|
|
cf5297958a | ||
|
|
22996cbce7 | ||
|
|
7563416754 | ||
|
|
02b1673c71 | ||
|
|
6ef87d7067 | ||
|
|
e3921c6d14 | ||
|
|
f9ef9d85f4 | ||
|
|
7a2c30e159 | ||
|
|
6438967202 | ||
|
|
63bf82ad84 | ||
|
|
18ab2ae799 | ||
|
|
86d6295bf0 | ||
|
|
3f306d2396 | ||
|
|
2f1f5b2376 | ||
|
|
62d7c71093 | ||
|
|
4f69ed5745 | ||
|
|
ddddf3beb4 | ||
|
|
0ae525cbd5 | ||
|
|
0520870754 | ||
|
|
8b17b77010 | ||
|
|
e2ef1f8a89 | ||
|
|
7f7052ad42 | ||
|
|
738ca479e4 | ||
|
|
34a274a7d1 | ||
|
|
b1496aa12f | ||
|
|
30acba7921 | ||
|
|
b5c0c37a23 | ||
|
|
ef0a92d83f | ||
|
|
b364e32beb | ||
|
|
7f51921176 | ||
|
|
efebd681b6 | ||
|
|
d635390b33 | ||
|
|
61f0d614ce | ||
|
|
27b80804f5 | ||
|
|
df0c505452 | ||
|
|
564f78b6f6 | ||
|
|
df6b6ded33 | ||
|
|
e801a04bcf | ||
|
|
3b1eaca58e | ||
|
|
22a427f934 | ||
|
|
4645a8ba6b | ||
|
|
1b88c10197 | ||
|
|
5a392dfd58 | ||
|
|
e49ff93122 | ||
|
|
399788ccc1 | ||
|
|
08fde8719d | ||
|
|
f7bef3f87b | ||
|
|
c70e7794eb | ||
|
|
9eb438bb24 | ||
|
|
38decaea90 | ||
|
|
ade68b184d | ||
|
|
3c702c15e2 | ||
|
|
76e8805a6b | ||
|
|
5dc7049f8c | ||
|
|
97f852c3d6 | ||
|
|
a8eed6114b | ||
|
|
6864d39f85 | ||
|
|
6f47c1fcda | ||
|
|
c2c64293f5 |
16
.eslintignore
Normal file
16
.eslintignore
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
**/vs/nls.build.js
|
||||||
|
**/vs/nls.js
|
||||||
|
**/vs/css.build.js
|
||||||
|
**/vs/css.js
|
||||||
|
**/vs/loader.js
|
||||||
|
**/promise-polyfill/**
|
||||||
|
**/insane/**
|
||||||
|
**/marked/**
|
||||||
|
**/test/**/*.js
|
||||||
|
**/node_modules/**
|
||||||
|
**/vscode-api-tests/testWorkspace/**
|
||||||
|
**/vscode-api-tests/testWorkspace2/**
|
||||||
|
**/extensions/**/out/**
|
||||||
|
**/extensions/**/build/**
|
||||||
|
**/extensions/markdown-language-features/media/**
|
||||||
|
**/extensions/typescript-basics/test/colorize-fixtures/**
|
||||||
289
.eslintrc.json
289
.eslintrc.json
@@ -1,20 +1,273 @@
|
|||||||
{
|
{
|
||||||
"root": true,
|
"root": true,
|
||||||
"env": {
|
"parser": "@typescript-eslint/parser",
|
||||||
"node": true,
|
"parserOptions": {
|
||||||
"es6": true
|
"ecmaVersion": 6,
|
||||||
},
|
"sourceType": "module"
|
||||||
"rules": {
|
},
|
||||||
"no-console": 0,
|
"plugins": [
|
||||||
"no-cond-assign": 0,
|
"@typescript-eslint",
|
||||||
"no-unused-vars": 1,
|
"jsdoc"
|
||||||
"no-extra-semi": "warn",
|
],
|
||||||
"semi": "warn"
|
"rules": {
|
||||||
},
|
"constructor-super": "warn",
|
||||||
"extends": "eslint:recommended",
|
"curly": "warn",
|
||||||
"parserOptions": {
|
"eqeqeq": "warn",
|
||||||
"ecmaFeatures": {
|
"no-buffer-constructor": "warn",
|
||||||
"experimentalObjectRestSpread": true
|
"no-caller": "warn",
|
||||||
}
|
"no-debugger": "warn",
|
||||||
}
|
"no-duplicate-case": "warn",
|
||||||
|
"no-duplicate-imports": "warn",
|
||||||
|
"no-eval": "warn",
|
||||||
|
"no-extra-semi": "warn",
|
||||||
|
"no-new-wrappers": "warn",
|
||||||
|
"no-redeclare": "off",
|
||||||
|
"no-sparse-arrays": "warn",
|
||||||
|
"no-throw-literal": "warn",
|
||||||
|
"no-unsafe-finally": "warn",
|
||||||
|
"no-unused-labels": "warn",
|
||||||
|
"no-restricted-globals": ["warn", "name", "length", "event", "closed", "external", "status", "origin", "orientation"], // non-complete list of globals that are easy to access unintentionally
|
||||||
|
"no-var": "warn",
|
||||||
|
"jsdoc/no-types": "warn",
|
||||||
|
"semi": "off",
|
||||||
|
"@typescript-eslint/semi": "warn",
|
||||||
|
"@typescript-eslint/class-name-casing": "warn",
|
||||||
|
"code-no-unused-expressions": [
|
||||||
|
"warn",
|
||||||
|
{
|
||||||
|
"allowTernary": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"code-translation-remind": "warn",
|
||||||
|
"code-no-nls-in-standalone-editor": "warn",
|
||||||
|
"code-no-standalone-editor": "warn",
|
||||||
|
"code-no-unexternalized-strings": "warn",
|
||||||
|
"code-layering": [
|
||||||
|
"warn",
|
||||||
|
{
|
||||||
|
"common": ["browser"], // {{SQL CARBON EDIT}} @anthonydresser not ideal, but for our purposes its fine for now,
|
||||||
|
"node": [
|
||||||
|
"common"
|
||||||
|
],
|
||||||
|
"browser": [
|
||||||
|
"common"
|
||||||
|
],
|
||||||
|
"electron-main": [
|
||||||
|
"common",
|
||||||
|
"node"
|
||||||
|
],
|
||||||
|
"electron-browser": [
|
||||||
|
"common",
|
||||||
|
"browser",
|
||||||
|
"node"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"code-import-patterns": [
|
||||||
|
"warn",
|
||||||
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
// !!! Do not relax these rules !!!
|
||||||
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
{
|
||||||
|
"target": "**/{vs,sql}/base/common/**",
|
||||||
|
"restrictions": [
|
||||||
|
"vs/nls",
|
||||||
|
"**/{vs,sql}/base/common/**"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"target": "**/{vs,sql}/base/test/common/**",
|
||||||
|
"restrictions": [
|
||||||
|
"assert",
|
||||||
|
"sinon",
|
||||||
|
"vs/nls",
|
||||||
|
"**/{vs,sql}/base/common/**",
|
||||||
|
"**/{vs,sql}/base/test/common/**"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"target": "**/{vs,sql}/base/browser/**",
|
||||||
|
"restrictions": [
|
||||||
|
"vs/nls",
|
||||||
|
"vs/css!./**/*",
|
||||||
|
"**/{vs,sql}/base/{common,browser}/**",
|
||||||
|
"@angular/*",
|
||||||
|
"rxjs/*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"target": "**/{vs,sql}/base/node/**",
|
||||||
|
"restrictions": [
|
||||||
|
"vs/nls",
|
||||||
|
"**/{vs,sql}/base/{common,browser,node}/**",
|
||||||
|
"!path" // node modules (except path where we have our own impl)
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// vs/base/test/browser contains tests for vs/base/browser
|
||||||
|
"target": "**/{vs,sql}/base/test/browser/**",
|
||||||
|
"restrictions": [
|
||||||
|
"assert",
|
||||||
|
"vs/nls",
|
||||||
|
"**/{vs,sql}/base/{common,browser}/**",
|
||||||
|
"**/{vs,sql}/base/test/{common,browser}/**",
|
||||||
|
"@angular/*",
|
||||||
|
"rxjs/*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"target": "**/{vs,sql}/base/parts/*/common/**",
|
||||||
|
"restrictions": [
|
||||||
|
"vs/nls",
|
||||||
|
"**/{vs,sql}/base/common/**",
|
||||||
|
"**/{vs,sql}/base/parts/*/common/**"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"target": "**/{vs,sql}/base/parts/*/browser/**",
|
||||||
|
"restrictions": [
|
||||||
|
"vs/nls",
|
||||||
|
"vs/css!./**/*",
|
||||||
|
"**/{vs,sql}/base/{common,browser}/**",
|
||||||
|
"**/{vs,sql}/base/parts/*/{common,browser}/**",
|
||||||
|
"@angular/*",
|
||||||
|
"rxjs/*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"target": "**/{vs,sql}/base/parts/*/node/**",
|
||||||
|
"restrictions": [
|
||||||
|
"vs/nls",
|
||||||
|
"**/{vs,sql}/base/{common,browser,node}/**",
|
||||||
|
"**/{vs,sql}/base/parts/*/{common,browser,node}/**",
|
||||||
|
"!path" // node modules (except path where we have our own impl)
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"target": "**/{vs,sql}/base/parts/*/electron-browser/**",
|
||||||
|
"restrictions": [
|
||||||
|
"vs/nls",
|
||||||
|
"vs/css!./**/*",
|
||||||
|
"**/{vs,sql}/base/{common,browser,node,electron-browser}/**",
|
||||||
|
"**/{vs,sql}/base/parts/*/{common,browser,node,electron-browser}/**",
|
||||||
|
"!path", // node modules (except path where we have our own impl)
|
||||||
|
"@angular/*",
|
||||||
|
"rxjs/*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"target": "**/{vs,sql}/base/parts/*/electron-main/**",
|
||||||
|
"restrictions": [
|
||||||
|
"vs/nls",
|
||||||
|
"**/{vs,sql}/base/{common,browser,node,electron-main}/**",
|
||||||
|
"**/{vs,sql}/base/parts/*/{common,browser,node,electron-main}/**",
|
||||||
|
"!path", // node modules (except path where we have our own impl)
|
||||||
|
"@angular/*",
|
||||||
|
"rxjs/*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"target": "**/{vs,sql}/platform/*/common/**",
|
||||||
|
"restrictions": [
|
||||||
|
"vs/nls",
|
||||||
|
"**/{vs,sql}/base/common/**",
|
||||||
|
"**/{vs,sql}/base/parts/*/common/**",
|
||||||
|
"**/{vs,sql}/{platform,workbench}/**/common/**",
|
||||||
|
"**/vs/editor/common/**",
|
||||||
|
"azdata" // TODO remove
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"target": "**/{vs,sql}/platform/*/test/common/**",
|
||||||
|
"restrictions": [
|
||||||
|
"assert",
|
||||||
|
"sinon",
|
||||||
|
"vs/nls",
|
||||||
|
"**/{vs,sql}/base/common/**",
|
||||||
|
"**/{vs,sql}/{platform,workbench}/**/common/**",
|
||||||
|
"**/{vs,sql}/{base,platform,workbench}/**/test/common/**",
|
||||||
|
"typemoq",
|
||||||
|
"azdata" // TODO remove
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"target": "**/{vs,sql}/platform/*/browser/**",
|
||||||
|
"restrictions": [
|
||||||
|
"vs/nls",
|
||||||
|
"vs/css!./**/*",
|
||||||
|
"**/{vs,sql}/base/{common,browser}/**",
|
||||||
|
"**/{vs,sql}/base/parts/*/{common,browser}/**",
|
||||||
|
"**/{vs,sql}/{platform,workbench}/**/{common,browser}/**",
|
||||||
|
"**/vs/editor/{common,browser}/**",
|
||||||
|
"@angular/*",
|
||||||
|
"rxjs/*",
|
||||||
|
"azdata" // TODO remove
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"target": "**/{vs,sql}/platform/*/node/**",
|
||||||
|
"restrictions": [
|
||||||
|
"vs/nls",
|
||||||
|
"**/{vs,sql}/base/{common,browser,node}/**",
|
||||||
|
"**/{vs,sql}/base/parts/*/{common,browser,node}/**",
|
||||||
|
"**/{vs,sql}/{platform,workbench}/**/{common,browser,node}/**",
|
||||||
|
"**/vs/editor/{common,browser,node}/**",
|
||||||
|
"!path", // node modules (except path where we have our own impl)
|
||||||
|
"azdata" // TODO remove
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"target": "**/{vs,sql}/platform/*/electron-browser/**",
|
||||||
|
"restrictions": [
|
||||||
|
"vs/nls",
|
||||||
|
"vs/css!./**/*",
|
||||||
|
"**/{vs,sql}/base/{common,browser,node}/**",
|
||||||
|
"**/{vs,sql}/base/parts/*/{common,browser,node,electron-browser}/**",
|
||||||
|
"**/{vs,sql}/{platform,workbench}/**/{common,browser,node,electron-browser}/**",
|
||||||
|
"**/vs/editor/{common,browser,node,electron-browser}/**",
|
||||||
|
"!path", // node modules (except path where we have our own impl)
|
||||||
|
"@angular/*",
|
||||||
|
"rxjs/*",
|
||||||
|
"azdata" // TODO remove
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"target": "**/{vs,sql}/platform/*/electron-main/**",
|
||||||
|
"restrictions": [
|
||||||
|
"vs/nls",
|
||||||
|
"**/{vs,sql}/base/{common,browser,node}/**",
|
||||||
|
"**/{vs,sql}/base/parts/*/{common,browser,node,electron-browser}/**",
|
||||||
|
"**/{vs,sql}/{platform,workbench}/**/{common,browser,node,electron-main}/**",
|
||||||
|
"**/vs/editor/{common,browser,node,electron-main}/**",
|
||||||
|
"!path", // node modules (except path where we have our own impl)
|
||||||
|
"azdata" // TODO remove
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"target": "**/{vs,sql}/platform/*/test/browser/**",
|
||||||
|
"restrictions": [
|
||||||
|
"assert",
|
||||||
|
"sinon",
|
||||||
|
"vs/nls",
|
||||||
|
"**/{vs,sql}/base/{common,browser}/**",
|
||||||
|
"**/{vs,sql}/{platform,workbench}/**/{common,browser}/**",
|
||||||
|
"**/{vs,sql}/{base,platform,workbench}/**/test/{common,browser}/**",
|
||||||
|
"typemoq",
|
||||||
|
"@angular/*",
|
||||||
|
"rxjs/*",
|
||||||
|
"azdata" // TODO remove
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"overrides": [
|
||||||
|
{
|
||||||
|
"files": [
|
||||||
|
"*.js"
|
||||||
|
],
|
||||||
|
"rules": {
|
||||||
|
"jsdoc/no-types": "off"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
7
.eslintrc.sql.json
Normal file
7
.eslintrc.sql.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"extends": ".eslintrc.json",
|
||||||
|
"rules": {
|
||||||
|
"no-sync": "warn",
|
||||||
|
"strict": ["warn", "never"]
|
||||||
|
}
|
||||||
|
}
|
||||||
4
.github/ISSUE_TEMPLATE/bug_report.md
vendored
4
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -2,11 +2,11 @@
|
|||||||
name: Bug report
|
name: Bug report
|
||||||
about: Create a report to help us improve
|
about: Create a report to help us improve
|
||||||
title: ''
|
title: ''
|
||||||
labels: Bug
|
labels: ''
|
||||||
assignees: ''
|
assignees: ''
|
||||||
|
|
||||||
---
|
---
|
||||||
|
<!-- Please read our Rules of Conduct: https://opensource.microsoft.com/codeofconduct/ -->
|
||||||
<!-- Please search existing issues to avoid creating duplicates. -->
|
<!-- Please search existing issues to avoid creating duplicates. -->
|
||||||
<!-- Also please test using the latest insiders build to make sure your issue has not already been fixed. -->
|
<!-- Also please test using the latest insiders build to make sure your issue has not already been fixed. -->
|
||||||
|
|
||||||
|
|||||||
1
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
1
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
blank_issues_enabled: false
|
||||||
2
.github/ISSUE_TEMPLATE/feature_request.md
vendored
2
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -2,7 +2,7 @@
|
|||||||
name: Feature request
|
name: Feature request
|
||||||
about: Suggest an idea for this project
|
about: Suggest an idea for this project
|
||||||
title: ''
|
title: ''
|
||||||
labels: Enhancement
|
labels: ''
|
||||||
assignees: ''
|
assignees: ''
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
8
.github/classifier.yml
vendored
8
.github/classifier.yml
vendored
@@ -2,12 +2,14 @@
|
|||||||
perform: true,
|
perform: true,
|
||||||
alwaysRequireAssignee: false,
|
alwaysRequireAssignee: false,
|
||||||
labelsRequiringAssignee: [],
|
labelsRequiringAssignee: [],
|
||||||
|
defaultLabel: 'Triage: Needed',
|
||||||
|
defaultAssignee: '',
|
||||||
autoAssignees: {
|
autoAssignees: {
|
||||||
Area - Acquisition: [],
|
Area - Acquisition: [],
|
||||||
Area - Azure: [],
|
Area - Azure: [],
|
||||||
Area - Backup\Restore: [],
|
Area - Backup\Restore: [],
|
||||||
Area - Charting\Insights: [],
|
Area - Charting\Insights: [],
|
||||||
Area - Connection: [],
|
Area - Connection: [ charles-gagnon ],
|
||||||
Area - DacFX: [],
|
Area - DacFX: [],
|
||||||
Area - Dashboard: [],
|
Area - Dashboard: [],
|
||||||
Area - Data Explorer: [],
|
Area - Data Explorer: [],
|
||||||
@@ -15,9 +17,9 @@
|
|||||||
Area - Extensibility: [],
|
Area - Extensibility: [],
|
||||||
Area - External Table: [],
|
Area - External Table: [],
|
||||||
Area - Fundamentals: [],
|
Area - Fundamentals: [],
|
||||||
Area - Language Service: [],
|
Area - Language Service: [ charles-gagnon ],
|
||||||
Area - Localization: [],
|
Area - Localization: [],
|
||||||
Area - Notebooks: [],
|
Area - Notebooks: [ chlafreniere ],
|
||||||
Area - Performance: [],
|
Area - Performance: [],
|
||||||
Area - Query Editor: [ anthonydresser ],
|
Area - Query Editor: [ anthonydresser ],
|
||||||
Area - Query Plan: [],
|
Area - Query Plan: [],
|
||||||
|
|||||||
34
.github/feature-requests.yml
vendored
Normal file
34
.github/feature-requests.yml
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
typeLabel: {
|
||||||
|
name: 'feature-request'
|
||||||
|
},
|
||||||
|
candidateMilestone: {
|
||||||
|
number: 107,
|
||||||
|
name: 'Backlog Candidates'
|
||||||
|
},
|
||||||
|
approvedMilestone: {
|
||||||
|
number: 8,
|
||||||
|
name: 'Backlog'
|
||||||
|
},
|
||||||
|
onLabeled: {
|
||||||
|
delay: 60,
|
||||||
|
perform: true
|
||||||
|
},
|
||||||
|
onCandidateMilestoned: {
|
||||||
|
candidatesComment: "This feature request is now a candidate for our backlog. The community has 60 days to upvote the issue. If it receives 20 upvotes we will move it to our backlog. If not, we will close it. To learn more about how we handle feature requests, please see our [documentation](https://aka.ms/vscode-issue-lifecycle).\n\nHappy Coding!",
|
||||||
|
perform: true
|
||||||
|
},
|
||||||
|
onMonitorUpvotes: {
|
||||||
|
upvoteThreshold: 20,
|
||||||
|
acceptanceComment: ":slightly_smiling_face: This feature request received a sufficient number of community upvotes and we moved it to our backlog. To learn more about how we handle feature requests, please see our [documentation](https://aka.ms/vscode-issue-lifecycle).\n\nHappy Coding!",
|
||||||
|
perform: true
|
||||||
|
},
|
||||||
|
onMonitorDaysOnCandidateMilestone: {
|
||||||
|
daysOnMilestone: 60,
|
||||||
|
warningPeriod: 10,
|
||||||
|
numberOfCommentsToPreventAutomaticRejection: 20,
|
||||||
|
rejectionComment: ":slightly_frowning_face: In the last 60 days, this feature request has received less than 20 community upvotes and we closed it. Still a big Thank You to you for taking the time to create this issue! To learn more about how we handle feature requests, please see our [documentation](https://aka.ms/vscode-issue-lifecycle).\n\nHappy Coding!",
|
||||||
|
warningComment: "This feature request has not yet received the 20 community upvotes it takes to make to our backlog. 10 days to go. To learn more about how we handle feature requests, please see our [documentation](https://aka.ms/vscode-issue-lifecycle).\n\nHappy Coding",
|
||||||
|
perform: true
|
||||||
|
}
|
||||||
|
}
|
||||||
2
.github/locker.yml
vendored
2
.github/locker.yml
vendored
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
daysAfterClose: 45,
|
daysAfterClose: 45,
|
||||||
daysSinceLastUpdate: 3,
|
daysSinceLastUpdate: 3,
|
||||||
ignoredLabels: [],
|
ignoredLabels: ['A11y_ADS_OctTestPass', 'A11y_ADS_Schema_Dacpac_Backup', 'A11y_AzureDataStudio', 'A11yExclusion', 'A11yMAS', 'A11yResolved: Will Not Fix', 'A11yTCS'],
|
||||||
perform: true
|
perform: true
|
||||||
}
|
}
|
||||||
|
|||||||
6
.github/stale.yml
vendored
Normal file
6
.github/stale.yml
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
perform: true,
|
||||||
|
label: 'Stale PR',
|
||||||
|
daysSinceLastUpdate: 7,
|
||||||
|
ignoredLabels: ['Do Not Merge']
|
||||||
|
}
|
||||||
100
.github/workflows/ci.yml
vendored
100
.github/workflows/ci.yml
vendored
@@ -11,46 +11,46 @@ on:
|
|||||||
- release/*
|
- release/*
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
linux:
|
# linux:
|
||||||
runs-on: ubuntu-latest
|
# runs-on: ubuntu-latest
|
||||||
env:
|
# env:
|
||||||
CHILD_CONCURRENCY: "1"
|
# CHILD_CONCURRENCY: "1"
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
steps:
|
# steps:
|
||||||
- uses: actions/checkout@v1
|
# - uses: actions/checkout@v1
|
||||||
# TODO: rename azure-pipelines/linux/xvfb.init to github-actions
|
# # TODO: rename azure-pipelines/linux/xvfb.init to github-actions
|
||||||
- run: |
|
# - run: |
|
||||||
sudo apt-get update
|
# sudo apt-get update
|
||||||
sudo apt-get install -y libxkbfile-dev pkg-config libsecret-1-dev libxss1 dbus xvfb libgtk-3-0 libkrb5-dev # {{SQL CARBON EDIT}} add kerberos dep
|
# sudo apt-get install -y libxkbfile-dev pkg-config libsecret-1-dev libxss1 dbus xvfb libgtk-3-0 libkrb5-dev # {{SQL CARBON EDIT}} add kerberos dep
|
||||||
sudo cp build/azure-pipelines/linux/xvfb.init /etc/init.d/xvfb
|
# sudo cp build/azure-pipelines/linux/xvfb.init /etc/init.d/xvfb
|
||||||
sudo chmod +x /etc/init.d/xvfb
|
# sudo chmod +x /etc/init.d/xvfb
|
||||||
sudo update-rc.d xvfb defaults
|
# sudo update-rc.d xvfb defaults
|
||||||
sudo service xvfb start
|
# sudo service xvfb start
|
||||||
name: Setup Build Environment
|
# name: Setup Build Environment
|
||||||
- uses: actions/setup-node@v1
|
# - uses: actions/setup-node@v1
|
||||||
with:
|
# with:
|
||||||
node-version: 10
|
# node-version: 10
|
||||||
# TODO: cache node modules
|
# # TODO: cache node modules
|
||||||
- run: yarn --frozen-lockfile
|
# - run: yarn --frozen-lockfile
|
||||||
name: Install Dependencies
|
# name: Install Dependencies
|
||||||
- run: yarn electron x64
|
# - run: yarn electron x64
|
||||||
name: Download Electron
|
# name: Download Electron
|
||||||
- run: yarn gulp hygiene --skip-tslint
|
# - run: yarn gulp hygiene
|
||||||
name: Run Hygiene Checks
|
# name: Run Hygiene Checks
|
||||||
- run: yarn gulp tslint
|
# - run: yarn strict-vscode # {{SQL CARBON EDIT}} add step
|
||||||
name: Run TSLint Checks
|
# name: Run Strict Compile Options
|
||||||
- run: yarn strict-null-check # {{SQL CARBON EDIT}} add step
|
# # - run: yarn monaco-compile-check {{SQL CARBON EDIT}} remove step
|
||||||
name: Run Strict Null Check
|
# # name: Run Monaco Editor Checks
|
||||||
# - run: yarn monaco-compile-check {{SQL CARBON EDIT}} remove step
|
# - run: yarn valid-layers-check
|
||||||
# name: Run Monaco Editor Checks
|
# name: Run Valid Layers Checks
|
||||||
- run: yarn compile
|
# - run: yarn compile
|
||||||
name: Compile Sources
|
# name: Compile Sources
|
||||||
# - run: yarn download-builtin-extensions {{SQL CARBON EDIT}} remove step
|
# # - run: yarn download-builtin-extensions {{SQL CARBON EDIT}} remove step
|
||||||
# name: Download Built-in Extensions
|
# # name: Download Built-in Extensions
|
||||||
- run: DISPLAY=:10 ./scripts/test.sh --tfs "Unit Tests"
|
# - run: DISPLAY=:10 ./scripts/test.sh --tfs "Unit Tests"
|
||||||
name: Run Unit Tests
|
# name: Run Unit Tests
|
||||||
# - run: DISPLAY=:10 ./scripts/test-integration.sh --tfs "Integration Tests" {{SQL CARBON EDIT}} remove step
|
# # - run: DISPLAY=:10 ./scripts/test-integration.sh --tfs "Integration Tests" {{SQL CARBON EDIT}} remove step
|
||||||
# name: Run Integration Tests
|
# # name: Run Integration Tests
|
||||||
|
|
||||||
windows:
|
windows:
|
||||||
runs-on: windows-2016
|
runs-on: windows-2016
|
||||||
@@ -69,14 +69,14 @@ jobs:
|
|||||||
name: Install Dependencies
|
name: Install Dependencies
|
||||||
- run: yarn electron
|
- run: yarn electron
|
||||||
name: Download Electron
|
name: Download Electron
|
||||||
- run: yarn gulp hygiene --skip-tslint
|
- run: yarn gulp hygiene
|
||||||
name: Run Hygiene Checks
|
name: Run Hygiene Checks
|
||||||
- run: yarn gulp tslint
|
- run: yarn strict-vscode # {{SQL CARBON EDIT}} add step
|
||||||
name: Run TSLint Checks
|
name: Run Strict Compile Options
|
||||||
- run: yarn strict-null-check # {{SQL CARBON EDIT}} add step
|
|
||||||
name: Run Strict Null Check
|
|
||||||
# - run: yarn monaco-compile-check {{SQL CARBON EDIT}} remove step
|
# - run: yarn monaco-compile-check {{SQL CARBON EDIT}} remove step
|
||||||
# name: Run Monaco Editor Checks
|
# name: Run Monaco Editor Checks
|
||||||
|
- run: yarn valid-layers-check
|
||||||
|
name: Run Valid Layers Checks
|
||||||
- run: yarn compile
|
- run: yarn compile
|
||||||
name: Compile Sources
|
name: Compile Sources
|
||||||
# - run: yarn download-builtin-extensions {{SQL CARBON EDIT}} remove step
|
# - run: yarn download-builtin-extensions {{SQL CARBON EDIT}} remove step
|
||||||
@@ -100,14 +100,14 @@ jobs:
|
|||||||
name: Install Dependencies
|
name: Install Dependencies
|
||||||
- run: yarn electron x64
|
- run: yarn electron x64
|
||||||
name: Download Electron
|
name: Download Electron
|
||||||
- run: yarn gulp hygiene --skip-tslint
|
- run: yarn gulp hygiene
|
||||||
name: Run Hygiene Checks
|
name: Run Hygiene Checks
|
||||||
- run: yarn gulp tslint
|
- run: yarn strict-vscode # {{SQL CARBON EDIT}} add step
|
||||||
name: Run TSLint Checks
|
name: Run Strict Compile Options
|
||||||
- run: yarn strict-null-check # {{SQL CARBON EDIT}} add step
|
|
||||||
name: Run Strict Null Check
|
|
||||||
# - run: yarn monaco-compile-check {{SQL CARBON EDIT}} remove step
|
# - run: yarn monaco-compile-check {{SQL CARBON EDIT}} remove step
|
||||||
# name: Run Monaco Editor Checks
|
# name: Run Monaco Editor Checks
|
||||||
|
- run: yarn valid-layers-check
|
||||||
|
name: Run Valid Layers Checks
|
||||||
- run: yarn compile
|
- run: yarn compile
|
||||||
name: Compile Sources
|
name: Compile Sources
|
||||||
# - run: yarn download-builtin-extensions {{SQL CARBON EDIT}} remove step
|
# - run: yarn download-builtin-extensions {{SQL CARBON EDIT}} remove step
|
||||||
|
|||||||
13
.github/workflows/tslint.yml
vendored
13
.github/workflows/tslint.yml
vendored
@@ -1,13 +0,0 @@
|
|||||||
name: TSLint Enforcement
|
|
||||||
on: [pull_request]
|
|
||||||
jobs:
|
|
||||||
job:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 5
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v1
|
|
||||||
- name: TSLint
|
|
||||||
uses: aaomidi/gh-action-tslint@master
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
tslint_config: 'tslint-sql.json'
|
|
||||||
1
.vscode/extensions.json
vendored
1
.vscode/extensions.json
vendored
@@ -2,7 +2,6 @@
|
|||||||
// See https://go.microsoft.com/fwlink/?LinkId=827846
|
// See https://go.microsoft.com/fwlink/?LinkId=827846
|
||||||
// for the documentation about the extensions.json format
|
// for the documentation about the extensions.json format
|
||||||
"recommendations": [
|
"recommendations": [
|
||||||
"ms-vscode.vscode-typescript-tslint-plugin",
|
|
||||||
"dbaeumer.vscode-eslint",
|
"dbaeumer.vscode-eslint",
|
||||||
"EditorConfig.EditorConfig",
|
"EditorConfig.EditorConfig",
|
||||||
"msjsdiag.debugger-for-chrome"
|
"msjsdiag.debugger-for-chrome"
|
||||||
|
|||||||
102
.vscode/launch.json
vendored
102
.vscode/launch.json
vendored
@@ -36,7 +36,10 @@
|
|||||||
"port": 5876,
|
"port": 5876,
|
||||||
"outFiles": [
|
"outFiles": [
|
||||||
"${workspaceFolder}/out/**/*.js"
|
"${workspaceFolder}/out/**/*.js"
|
||||||
]
|
],
|
||||||
|
"presentation": {
|
||||||
|
"hidden": true,
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "node",
|
"type": "node",
|
||||||
@@ -54,7 +57,10 @@
|
|||||||
"port": 5875,
|
"port": 5875,
|
||||||
"outFiles": [
|
"outFiles": [
|
||||||
"${workspaceFolder}/out/**/*.js"
|
"${workspaceFolder}/out/**/*.js"
|
||||||
]
|
],
|
||||||
|
"presentation": {
|
||||||
|
"hidden": true,
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "chrome",
|
"type": "chrome",
|
||||||
@@ -67,17 +73,16 @@
|
|||||||
"request": "launch",
|
"request": "launch",
|
||||||
"name": "Launch azuredatastudio",
|
"name": "Launch azuredatastudio",
|
||||||
"windows": {
|
"windows": {
|
||||||
"runtimeExecutable": "${workspaceFolder}/scripts/sql.bat",
|
"runtimeExecutable": "${workspaceFolder}/scripts/sql.bat"
|
||||||
"timeout": 45000
|
|
||||||
},
|
},
|
||||||
"osx": {
|
"osx": {
|
||||||
"runtimeExecutable": "${workspaceFolder}/scripts/sql.sh",
|
"runtimeExecutable": "${workspaceFolder}/scripts/sql.sh"
|
||||||
"timeout": 45000
|
|
||||||
},
|
},
|
||||||
"linux": {
|
"linux": {
|
||||||
"runtimeExecutable": "${workspaceFolder}/scripts/sql.sh",
|
"runtimeExecutable": "${workspaceFolder}/scripts/sql.sh"
|
||||||
"timeout": 45000
|
|
||||||
},
|
},
|
||||||
|
"port": 9222,
|
||||||
|
"timeout": 20000,
|
||||||
"env": {
|
"env": {
|
||||||
"VSCODE_EXTHOST_WILL_SEND_SOCKET": null
|
"VSCODE_EXTHOST_WILL_SEND_SOCKET": null
|
||||||
},
|
},
|
||||||
@@ -85,9 +90,12 @@
|
|||||||
"urlFilter": "*workbench.html*",
|
"urlFilter": "*workbench.html*",
|
||||||
"runtimeArgs": [
|
"runtimeArgs": [
|
||||||
"--inspect=5875",
|
"--inspect=5875",
|
||||||
"--no-cached-data"
|
"--no-cached-data",
|
||||||
],
|
],
|
||||||
"webRoot": "${workspaceFolder}"
|
"webRoot": "${workspaceFolder}",
|
||||||
|
// Settings for js-debug:
|
||||||
|
"pauseForSourceMap": false,
|
||||||
|
"outFiles": ["${workspaceFolder}/out/**/*.js"],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "node",
|
"type": "node",
|
||||||
@@ -102,7 +110,11 @@
|
|||||||
],
|
],
|
||||||
"outFiles": [
|
"outFiles": [
|
||||||
"${workspaceFolder}/out/**/*.js"
|
"${workspaceFolder}/out/**/*.js"
|
||||||
]
|
],
|
||||||
|
"presentation": {
|
||||||
|
"group": "2_launch",
|
||||||
|
"order": 1
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "chrome",
|
"type": "chrome",
|
||||||
@@ -136,13 +148,21 @@
|
|||||||
"runtimeArgs": [
|
"runtimeArgs": [
|
||||||
"web"
|
"web"
|
||||||
],
|
],
|
||||||
|
"presentation": {
|
||||||
|
"group": "2_launch",
|
||||||
|
"order": 2
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "chrome",
|
"type": "chrome",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"name": "Launch ADS (Web, Chrome) (TBD)",
|
"name": "Launch ADS (Web, Chrome) (TBD)",
|
||||||
"url": "http://localhost:8080",
|
"url": "http://localhost:8080",
|
||||||
"preLaunchTask": "Run web"
|
"preLaunchTask": "Run web",
|
||||||
|
"presentation": {
|
||||||
|
"group": "2_launch",
|
||||||
|
"order": 3
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "node",
|
"type": "node",
|
||||||
@@ -153,16 +173,11 @@
|
|||||||
"cwd": "${workspaceFolder}/extensions/git",
|
"cwd": "${workspaceFolder}/extensions/git",
|
||||||
"outFiles": [
|
"outFiles": [
|
||||||
"${workspaceFolder}/extensions/git/out/**/*.js"
|
"${workspaceFolder}/extensions/git/out/**/*.js"
|
||||||
]
|
],
|
||||||
},
|
"presentation": {
|
||||||
{
|
"group": "5_tests",
|
||||||
"name": "Launch Built-in Extension",
|
"order": 10
|
||||||
"type": "extensionHost",
|
}
|
||||||
"request": "launch",
|
|
||||||
"runtimeExecutable": "${execPath}",
|
|
||||||
"args": [
|
|
||||||
"--extensionDevelopmentPath=${workspaceRoot}/extensions/debug-auto-launch"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "node",
|
"type": "node",
|
||||||
@@ -172,6 +187,10 @@
|
|||||||
"cwd": "${workspaceFolder}/test/smoke",
|
"cwd": "${workspaceFolder}/test/smoke",
|
||||||
"env": {
|
"env": {
|
||||||
"BUILD_ARTIFACTSTAGINGDIRECTORY": "${workspaceFolder}"
|
"BUILD_ARTIFACTSTAGINGDIRECTORY": "${workspaceFolder}"
|
||||||
|
},
|
||||||
|
"presentation": {
|
||||||
|
"group": "5_tests",
|
||||||
|
"order": 8
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -196,6 +215,9 @@
|
|||||||
],
|
],
|
||||||
"env": {
|
"env": {
|
||||||
"MOCHA_COLORS": "true"
|
"MOCHA_COLORS": "true"
|
||||||
|
},
|
||||||
|
"presentation": {
|
||||||
|
"hidden": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -246,40 +268,50 @@
|
|||||||
"Run Extension Unit Tests"
|
"Run Extension Unit Tests"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "Debug Extension Integration Tests",
|
|
||||||
"configurations": [
|
|
||||||
"Attach to Extension Host",
|
|
||||||
"Run Extension Integration Tests"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "Debug azuredatastudio Main and Renderer",
|
"name": "Debug azuredatastudio Main and Renderer",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
"Launch azuredatastudio",
|
"Launch azuredatastudio",
|
||||||
"Attach to Main Process"
|
"Attach to Main Process"
|
||||||
]
|
],
|
||||||
|
"presentation": {
|
||||||
|
"group": "1_vscode",
|
||||||
|
"order": 1
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Debug Renderer and search processes",
|
"name": "Debug azuredatastudio Main, Renderer & Extension Host",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
"Launch azuredatastudio",
|
"Launch azuredatastudio",
|
||||||
"Attach to Search Process"
|
"Attach to Main Process",
|
||||||
]
|
"Attach to Extension Host"
|
||||||
|
],
|
||||||
|
"presentation": {
|
||||||
|
"group": "1_vscode",
|
||||||
|
"order": 3
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Debug Renderer and Extension Host processes",
|
"name": "Debug Renderer and Extension Host processes",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
"Launch azuredatastudio",
|
"Launch azuredatastudio",
|
||||||
"Attach to Extension Host"
|
"Attach to Extension Host"
|
||||||
]
|
],
|
||||||
|
"presentation": {
|
||||||
|
"group": "1_vscode",
|
||||||
|
"order": 2
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Attach Renderer and Extension Host",
|
"name": "Attach Renderer and Extension Host",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
"Attach to azuredatastudio",
|
"Attach to azuredatastudio",
|
||||||
"Attach to Extension Host"
|
"Attach to Extension Host"
|
||||||
]
|
],
|
||||||
|
"presentation": {
|
||||||
|
"group": "1_vscode",
|
||||||
|
"order": 2
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
10
.vscode/searches/ts36031.code-search
vendored
Normal file
10
.vscode/searches/ts36031.code-search
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# Query: \\w+\\?\\..+![(.[]
|
||||||
|
# Flags: RegExp
|
||||||
|
# ContextLines: 2
|
||||||
|
|
||||||
|
src/vs/base/browser/ui/tree/asyncDataTree.ts:
|
||||||
|
270 } : undefined,
|
||||||
|
271 isChecked: options.ariaProvider!.isChecked ? (e) => {
|
||||||
|
272: return options.ariaProvider?.isChecked!(e.element as T);
|
||||||
|
273 } : undefined
|
||||||
|
274 },
|
||||||
6
.vscode/settings.json
vendored
6
.vscode/settings.json
vendored
@@ -37,8 +37,14 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"eslint.options": {
|
||||||
|
"rulePaths": [
|
||||||
|
"./build/lib/eslint"
|
||||||
|
]
|
||||||
|
},
|
||||||
"typescript.tsdk": "node_modules/typescript/lib",
|
"typescript.tsdk": "node_modules/typescript/lib",
|
||||||
"npm.exclude": "**/extensions/**",
|
"npm.exclude": "**/extensions/**",
|
||||||
|
"npm.packageManager": "yarn",
|
||||||
"emmet.excludeLanguages": [],
|
"emmet.excludeLanguages": [],
|
||||||
"typescript.preferences.importModuleSpecifier": "non-relative",
|
"typescript.preferences.importModuleSpecifier": "non-relative",
|
||||||
"typescript.preferences.quoteStyle": "single",
|
"typescript.preferences.quoteStyle": "single",
|
||||||
|
|||||||
29
.vscode/tasks.json
vendored
29
.vscode/tasks.json
vendored
@@ -33,40 +33,32 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "npm",
|
"type": "npm",
|
||||||
"script": "strict-initialization-watch",
|
"script": "strict-function-types-watch",
|
||||||
"label": "TS - Strict Initialization",
|
"label": "TS - Strict Function Types",
|
||||||
"isBackground": true,
|
"isBackground": true,
|
||||||
"presentation": {
|
"presentation": {
|
||||||
"reveal": "never"
|
"reveal": "never"
|
||||||
},
|
},
|
||||||
"problemMatcher": {
|
"problemMatcher": {
|
||||||
"base": "$tsc-watch",
|
"base": "$tsc-watch",
|
||||||
"owner": "typescript-strict-initialization",
|
"owner": "typescript-function-types",
|
||||||
"applyTo": "allDocuments"
|
"applyTo": "allDocuments"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "npm",
|
"type": "npm",
|
||||||
"script": "strict-null-check-watch",
|
"script": "strict-vscode-watch",
|
||||||
"label": "TS - Strict Null Checks",
|
"label": "TS - Strict VSCode",
|
||||||
"isBackground": true,
|
"isBackground": true,
|
||||||
"presentation": {
|
"presentation": {
|
||||||
"reveal": "never"
|
"reveal": "never"
|
||||||
},
|
},
|
||||||
"problemMatcher": {
|
"problemMatcher": {
|
||||||
"base": "$tsc-watch",
|
"base": "$tsc-watch",
|
||||||
"owner": "typescript-strict-null-checks",
|
"owner": "typescript-vscode",
|
||||||
"applyTo": "allDocuments"
|
"applyTo": "allDocuments"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"type": "gulp",
|
|
||||||
"task": "tslint",
|
|
||||||
"label": "Run tslint",
|
|
||||||
"problemMatcher": [
|
|
||||||
"$tslint5"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"label": "Run tests",
|
"label": "Run tests",
|
||||||
"type": "shell",
|
"type": "shell",
|
||||||
@@ -104,7 +96,6 @@
|
|||||||
"command": "yarn web -- --no-launch",
|
"command": "yarn web -- --no-launch",
|
||||||
"label": "Run web",
|
"label": "Run web",
|
||||||
"isBackground": true,
|
"isBackground": true,
|
||||||
// This section to make error go away when launching the debug config
|
|
||||||
"problemMatcher": {
|
"problemMatcher": {
|
||||||
"pattern": {
|
"pattern": {
|
||||||
"regexp": ""
|
"regexp": ""
|
||||||
@@ -118,5 +109,13 @@
|
|||||||
"reveal": "never"
|
"reveal": "never"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "npm",
|
||||||
|
"script": "eslint",
|
||||||
|
"problemMatcher": {
|
||||||
|
"source": "eslint",
|
||||||
|
"base": "$eslint-stylish"
|
||||||
|
}
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
2
.yarnrc
2
.yarnrc
@@ -1,3 +1,3 @@
|
|||||||
disturl "https://atom.io/download/electron"
|
disturl "https://atom.io/download/electron"
|
||||||
target "6.0.12"
|
target "6.1.6"
|
||||||
runtime "electron"
|
runtime "electron"
|
||||||
|
|||||||
32
CHANGELOG.md
32
CHANGELOG.md
@@ -1,5 +1,37 @@
|
|||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
|
## Version 1.14.1
|
||||||
|
* Release date: December 26, 2019
|
||||||
|
* Release status: General Availability
|
||||||
|
* Hotfix for bug https://github.com/microsoft/azuredatastudio/issues/8768
|
||||||
|
|
||||||
|
## Version 1.14.0
|
||||||
|
* Release date: December 19, 2019
|
||||||
|
* Release status: General Availability
|
||||||
|
* Added bigdatacluster.ignoreSslVerification setting to allow ignoring SSL verification errors when connecting to a BDC [#8129](https://github.com/microsoft/azuredatastudio/issues/8129)
|
||||||
|
* Changed attach to connection dropdown in Notebooks to only list the currently active connection [#8582](https://github.com/microsoft/azuredatastudio/pull/8582)
|
||||||
|
* Allow changing default language flavor for offline query editors [#8419](https://github.com/microsoft/azuredatastudio/pull/8419)
|
||||||
|
* GA status for Big Data Cluster/SQL 2019 features [#8269](https://github.com/microsoft/azuredatastudio/issues/8269)
|
||||||
|
* Resolved [bugs and issues](https://github.com/microsoft/azuredatastudio/milestone/44?closed=1).
|
||||||
|
|
||||||
|
## Contributions and "thank you"
|
||||||
|
We would like to thank all our users who raised issues, and in particular the following users who helped contribute fixes:
|
||||||
|
|
||||||
|
## Version 1.13.1
|
||||||
|
* Release date: November 15, 2019
|
||||||
|
* Release status: General Availability
|
||||||
|
* Resolved [#8210 Copy/Paste results are out of order](https://github.com/microsoft/azuredatastudio/issues/8210).
|
||||||
|
|
||||||
|
## Version 1.13.0
|
||||||
|
* Release date: November 4, 2019
|
||||||
|
* Release status: General Availability
|
||||||
|
* General Availability release for Schema Compare and DACPAC extensions
|
||||||
|
* Resolved [bugs and issues](https://github.com/microsoft/azuredatastudio/milestone/43?closed=1).
|
||||||
|
|
||||||
|
## Contributions and "thank you"
|
||||||
|
We would like to thank all our users who raised issues, and in particular the following users who helped contribute fixes:
|
||||||
|
* aspnerd for `Use selected DB for import wizard schema list` [#7878](https://github.com/microsoft/azuredatastudio/pull/7878)
|
||||||
|
|
||||||
## Version 1.12.2
|
## Version 1.12.2
|
||||||
* Release date: October 11, 2019
|
* Release date: October 11, 2019
|
||||||
* Release status: General Availability
|
* Release status: General Availability
|
||||||
|
|||||||
17
README.md
17
README.md
@@ -10,13 +10,13 @@ Azure Data Studio is a data management tool that enables you to work with SQL Se
|
|||||||
|
|
||||||
Platform | Link
|
Platform | Link
|
||||||
-- | --
|
-- | --
|
||||||
Windows User Installer | https://go.microsoft.com/fwlink/?linkid=2105135
|
Windows User Installer | https://go.microsoft.com/fwlink/?linkid=2113530
|
||||||
Windows System Installer | https://go.microsoft.com/fwlink/?linkid=2105134
|
Windows System Installer | https://go.microsoft.com/fwlink/?linkid=2113628
|
||||||
Windows ZIP | https://go.microsoft.com/fwlink/?linkid=2104938
|
Windows ZIP | https://go.microsoft.com/fwlink/?linkid=2113529
|
||||||
macOS ZIP | https://go.microsoft.com/fwlink/?linkid=2105133
|
macOS ZIP | https://go.microsoft.com/fwlink/?linkid=2113528
|
||||||
Linux TAR.GZ | https://go.microsoft.com/fwlink/?linkid=2105132
|
Linux TAR.GZ | https://go.microsoft.com/fwlink/?linkid=2113627
|
||||||
Linux RPM | https://go.microsoft.com/fwlink/?linkid=2104937
|
Linux RPM | https://go.microsoft.com/fwlink/?linkid=2113718
|
||||||
Linux DEB | https://go.microsoft.com/fwlink/?linkid=2105131
|
Linux DEB | https://go.microsoft.com/fwlink/?linkid=2113344
|
||||||
|
|
||||||
Go to our [download page](https://aka.ms/azuredatastudio) for more specific instructions.
|
Go to our [download page](https://aka.ms/azuredatastudio) for more specific instructions.
|
||||||
|
|
||||||
@@ -69,6 +69,9 @@ The [Microsoft Enterprise and Developer Privacy Statement](https://privacy.micro
|
|||||||
## Contributions and "Thank You"
|
## Contributions and "Thank You"
|
||||||
We would like to thank all our users who raised issues, and in particular the following users who helped contribute fixes:
|
We would like to thank all our users who raised issues, and in particular the following users who helped contribute fixes:
|
||||||
|
|
||||||
|
* eulercamposbarros for `Prevent connections from moving on click (#7528)`
|
||||||
|
* AlexFsmn for `Fixed issue where task icons got hidden if text was too long`
|
||||||
|
* jamesrod817 for `Tempdb (#7022)`
|
||||||
* dzsquared for `fix(snippets): ads parenthesis to sqlcreateindex snippet #7020`
|
* dzsquared for `fix(snippets): ads parenthesis to sqlcreateindex snippet #7020`
|
||||||
* devmattrick for `Update row count as updates are received #6642`
|
* devmattrick for `Update row count as updates are received #6642`
|
||||||
* mottykohn for `In Message panel onclick scroll to line #6417`
|
* mottykohn for `In Message panel onclick scroll to line #6417`
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
trigger:
|
||||||
|
- master
|
||||||
|
- release/*
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
- job: Windows
|
- job: Windows
|
||||||
pool:
|
pool:
|
||||||
@@ -13,6 +17,6 @@ jobs:
|
|||||||
|
|
||||||
- job: macOS
|
- job: macOS
|
||||||
pool:
|
pool:
|
||||||
vmImage: macOS 10.13
|
vmImage: macOS-latest
|
||||||
steps:
|
steps:
|
||||||
- template: build/azure-pipelines/darwin/continuous-build-darwin.yml
|
- template: build/azure-pipelines/darwin/continuous-build-darwin.yml
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
2019-08-30T20:24:23.714Z
|
2019-12-01T02:20:58.491Z
|
||||||
|
|||||||
36
build/azure-pipelines/common/copyArtifacts.ts
Normal file
36
build/azure-pipelines/common/copyArtifacts.ts
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import * as vfs from 'vinyl-fs';
|
||||||
|
|
||||||
|
const files = [
|
||||||
|
'.build/extensions/**/*.vsix', // external extensions
|
||||||
|
'.build/win32-x64/**/*.{exe,zip}', // windows binaries
|
||||||
|
'.build/linux/sha256hashes.txt', // linux hashes
|
||||||
|
'.build/linux/deb/amd64/deb/*', // linux debs
|
||||||
|
'.build/linux/rpm/x86_64/*', // linux rpms
|
||||||
|
'.build/linux/server/*', // linux server
|
||||||
|
'.build/linux/archive/*', // linux archive
|
||||||
|
'.build/docker/**', // docker images
|
||||||
|
'.build/darwin/**', // darwin binaries
|
||||||
|
'.build/version.json' // version information
|
||||||
|
];
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const stream = vfs.src(files, { base: '.build', allowEmpty: true })
|
||||||
|
.pipe(vfs.dest(process.env.BUILD_ARTIFACTSTAGINGDIRECTORY!));
|
||||||
|
|
||||||
|
stream.on('end', () => resolve());
|
||||||
|
stream.on('error', e => reject(e));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
main().catch(err => {
|
||||||
|
console.error(err);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
132
build/azure-pipelines/common/createAsset.ts
Normal file
132
build/azure-pipelines/common/createAsset.ts
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import * as fs from 'fs';
|
||||||
|
import { Readable } from 'stream';
|
||||||
|
import * as crypto from 'crypto';
|
||||||
|
import * as azure from 'azure-storage';
|
||||||
|
import * as mime from 'mime';
|
||||||
|
import { CosmosClient } from '@azure/cosmos';
|
||||||
|
|
||||||
|
interface Asset {
|
||||||
|
platform: string;
|
||||||
|
type: string;
|
||||||
|
url: string;
|
||||||
|
mooncakeUrl?: string;
|
||||||
|
hash: string;
|
||||||
|
sha256hash: string;
|
||||||
|
size: number;
|
||||||
|
supportsFastUpdate?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.argv.length !== 6) {
|
||||||
|
console.error('Usage: node createAsset.js PLATFORM TYPE NAME FILE');
|
||||||
|
process.exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function hashStream(hashName: string, stream: Readable): Promise<string> {
|
||||||
|
return new Promise<string>((c, e) => {
|
||||||
|
const shasum = crypto.createHash(hashName);
|
||||||
|
|
||||||
|
stream
|
||||||
|
.on('data', shasum.update.bind(shasum))
|
||||||
|
.on('error', e)
|
||||||
|
.on('close', () => c(shasum.digest('hex')));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function doesAssetExist(blobService: azure.BlobService, quality: string, blobName: string): Promise<boolean | undefined> {
|
||||||
|
const existsResult = await new Promise<azure.BlobService.BlobResult>((c, e) => blobService.doesBlobExist(quality, blobName, (err, r) => err ? e(err) : c(r)));
|
||||||
|
return existsResult.exists;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function uploadBlob(blobService: azure.BlobService, quality: string, blobName: string, file: string): Promise<void> {
|
||||||
|
const blobOptions: azure.BlobService.CreateBlockBlobRequestOptions = {
|
||||||
|
contentSettings: {
|
||||||
|
contentType: mime.lookup(file),
|
||||||
|
cacheControl: 'max-age=31536000, public'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
await new Promise((c, e) => blobService.createBlockBlobFromLocalFile(quality, blobName, file, blobOptions, err => err ? e(err) : c()));
|
||||||
|
}
|
||||||
|
|
||||||
|
function getEnv(name: string): string {
|
||||||
|
const result = process.env[name];
|
||||||
|
|
||||||
|
if (typeof result === 'undefined') {
|
||||||
|
throw new Error('Missing env: ' + name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function main(): Promise<void> {
|
||||||
|
const [, , platform, type, name, file] = process.argv;
|
||||||
|
const quality = getEnv('VSCODE_QUALITY');
|
||||||
|
const commit = getEnv('BUILD_SOURCEVERSION');
|
||||||
|
|
||||||
|
console.log('Creating asset...');
|
||||||
|
|
||||||
|
const stat = await new Promise<fs.Stats>((c, e) => fs.stat(file, (err, stat) => err ? e(err) : c(stat)));
|
||||||
|
const size = stat.size;
|
||||||
|
|
||||||
|
console.log('Size:', size);
|
||||||
|
|
||||||
|
const stream = fs.createReadStream(file);
|
||||||
|
const [sha1hash, sha256hash] = await Promise.all([hashStream('sha1', stream), hashStream('sha256', stream)]);
|
||||||
|
|
||||||
|
console.log('SHA1:', sha1hash);
|
||||||
|
console.log('SHA256:', sha256hash);
|
||||||
|
|
||||||
|
const blobName = commit + '/' + name;
|
||||||
|
const storageAccount = process.env['AZURE_STORAGE_ACCOUNT_2']!;
|
||||||
|
|
||||||
|
const blobService = azure.createBlobService(storageAccount, process.env['AZURE_STORAGE_ACCESS_KEY_2']!)
|
||||||
|
.withFilter(new azure.ExponentialRetryPolicyFilter(20));
|
||||||
|
|
||||||
|
const blobExists = await doesAssetExist(blobService, quality, blobName);
|
||||||
|
|
||||||
|
if (blobExists) {
|
||||||
|
console.log(`Blob ${quality}, ${blobName} already exists, not publishing again.`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('Uploading blobs to Azure storage...');
|
||||||
|
|
||||||
|
await uploadBlob(blobService, quality, blobName, file);
|
||||||
|
|
||||||
|
console.log('Blobs successfully uploaded.');
|
||||||
|
|
||||||
|
const asset: Asset = {
|
||||||
|
platform,
|
||||||
|
type,
|
||||||
|
url: `${process.env['AZURE_CDN_URL']}/${quality}/${blobName}`,
|
||||||
|
hash: sha1hash,
|
||||||
|
sha256hash,
|
||||||
|
size
|
||||||
|
};
|
||||||
|
|
||||||
|
// Remove this if we ever need to rollback fast updates for windows
|
||||||
|
if (/win32/.test(platform)) {
|
||||||
|
asset.supportsFastUpdate = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('Asset:', JSON.stringify(asset, null, ' '));
|
||||||
|
|
||||||
|
const client = new CosmosClient({ endpoint: process.env['AZURE_DOCUMENTDB_ENDPOINT']!, key: process.env['AZURE_DOCUMENTDB_MASTERKEY'] });
|
||||||
|
const scripts = client.database('builds').container(quality).scripts;
|
||||||
|
await scripts.storedProcedure('createAsset').execute('', [commit, asset, true]);
|
||||||
|
}
|
||||||
|
|
||||||
|
main().then(() => {
|
||||||
|
console.log('Asset successfully created');
|
||||||
|
process.exit(0);
|
||||||
|
}, err => {
|
||||||
|
console.error(err);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
60
build/azure-pipelines/common/createBuild.ts
Normal file
60
build/azure-pipelines/common/createBuild.ts
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import { CosmosClient } from '@azure/cosmos';
|
||||||
|
|
||||||
|
if (process.argv.length !== 3) {
|
||||||
|
console.error('Usage: node createBuild.js VERSION');
|
||||||
|
process.exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getEnv(name: string): string {
|
||||||
|
const result = process.env[name];
|
||||||
|
|
||||||
|
if (typeof result === 'undefined') {
|
||||||
|
throw new Error('Missing env: ' + name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function main(): Promise<void> {
|
||||||
|
const [, , _version] = process.argv;
|
||||||
|
const quality = getEnv('VSCODE_QUALITY');
|
||||||
|
const commit = getEnv('BUILD_SOURCEVERSION');
|
||||||
|
const queuedBy = getEnv('BUILD_QUEUEDBY');
|
||||||
|
const sourceBranch = getEnv('BUILD_SOURCEBRANCH');
|
||||||
|
const version = _version + (quality === 'stable' ? '' : `-${quality}`);
|
||||||
|
|
||||||
|
console.log('Creating build...');
|
||||||
|
console.log('Quality:', quality);
|
||||||
|
console.log('Version:', version);
|
||||||
|
console.log('Commit:', commit);
|
||||||
|
|
||||||
|
const build = {
|
||||||
|
id: commit,
|
||||||
|
timestamp: (new Date()).getTime(),
|
||||||
|
version,
|
||||||
|
isReleased: false,
|
||||||
|
sourceBranch,
|
||||||
|
queuedBy,
|
||||||
|
assets: [],
|
||||||
|
updates: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
const client = new CosmosClient({ endpoint: process.env['AZURE_DOCUMENTDB_ENDPOINT']!, key: process.env['AZURE_DOCUMENTDB_MASTERKEY'] });
|
||||||
|
const scripts = client.database('builds').container(quality).scripts;
|
||||||
|
await scripts.storedProcedure('createBuild').execute('', [{ ...build, _partitionKey: '' }]);
|
||||||
|
}
|
||||||
|
|
||||||
|
main().then(() => {
|
||||||
|
console.log('Build successfully created');
|
||||||
|
process.exit(0);
|
||||||
|
}, err => {
|
||||||
|
console.error(err);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
70
build/azure-pipelines/common/releaseBuild.ts
Normal file
70
build/azure-pipelines/common/releaseBuild.ts
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import { CosmosClient } from '@azure/cosmos';
|
||||||
|
|
||||||
|
function getEnv(name: string): string {
|
||||||
|
const result = process.env[name];
|
||||||
|
|
||||||
|
if (typeof result === 'undefined') {
|
||||||
|
throw new Error('Missing env: ' + name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Config {
|
||||||
|
id: string;
|
||||||
|
frozen: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createDefaultConfig(quality: string): Config {
|
||||||
|
return {
|
||||||
|
id: quality,
|
||||||
|
frozen: false
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getConfig(client: CosmosClient, quality: string): Promise<Config> {
|
||||||
|
const query = `SELECT TOP 1 * FROM c WHERE c.id = "${quality}"`;
|
||||||
|
|
||||||
|
const res = await client.database('builds').container('config').items.query(query).fetchAll();
|
||||||
|
|
||||||
|
if (res.resources.length === 0) {
|
||||||
|
return createDefaultConfig(quality);
|
||||||
|
}
|
||||||
|
|
||||||
|
return res.resources[0] as Config;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function main(): Promise<void> {
|
||||||
|
const commit = getEnv('BUILD_SOURCEVERSION');
|
||||||
|
const quality = getEnv('VSCODE_QUALITY');
|
||||||
|
|
||||||
|
const client = new CosmosClient({ endpoint: process.env['AZURE_DOCUMENTDB_ENDPOINT']!, key: process.env['AZURE_DOCUMENTDB_MASTERKEY'] });
|
||||||
|
const config = await getConfig(client, quality);
|
||||||
|
|
||||||
|
console.log('Quality config:', config);
|
||||||
|
|
||||||
|
if (config.frozen) {
|
||||||
|
console.log(`Skipping release because quality ${quality} is frozen.`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Releasing build ${commit}...`);
|
||||||
|
|
||||||
|
const scripts = client.database('builds').container(quality).scripts;
|
||||||
|
await scripts.storedProcedure('releaseBuild').execute('', [commit]);
|
||||||
|
}
|
||||||
|
|
||||||
|
main().then(() => {
|
||||||
|
console.log('Build successfully released');
|
||||||
|
process.exit(0);
|
||||||
|
}, err => {
|
||||||
|
console.error(err);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
import * as url from 'url';
|
import * as url from 'url';
|
||||||
import * as azure from 'azure-storage';
|
import * as azure from 'azure-storage';
|
||||||
import * as mime from 'mime';
|
import * as mime from 'mime';
|
||||||
import { DocumentClient, RetrievedDocument } from 'documentdb';
|
import { CosmosClient } from '@azure/cosmos';
|
||||||
|
|
||||||
function log(...args: any[]) {
|
function log(...args: any[]) {
|
||||||
console.log(...[`[${new Date().toISOString()}]`, ...args]);
|
console.log(...[`[${new Date().toISOString()}]`, ...args]);
|
||||||
@@ -23,7 +23,7 @@ if (process.argv.length < 3) {
|
|||||||
process.exit(-1);
|
process.exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Build extends RetrievedDocument {
|
interface Build {
|
||||||
assets: Asset[];
|
assets: Asset[];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -38,62 +38,20 @@ interface Asset {
|
|||||||
supportsFastUpdate?: boolean;
|
supportsFastUpdate?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateBuild(commit: string, quality: string, platform: string, type: string, asset: Asset): Promise<void> {
|
|
||||||
const client = new DocumentClient(process.env['AZURE_DOCUMENTDB_ENDPOINT']!, { masterKey: process.env['AZURE_DOCUMENTDB_MASTERKEY'] });
|
|
||||||
const collection = 'dbs/builds/colls/' + quality;
|
|
||||||
const updateQuery = {
|
|
||||||
query: 'SELECT TOP 1 * FROM c WHERE c.id = @id',
|
|
||||||
parameters: [{ name: '@id', value: commit }]
|
|
||||||
};
|
|
||||||
|
|
||||||
let updateTries = 0;
|
|
||||||
|
|
||||||
function _update(): Promise<void> {
|
|
||||||
updateTries++;
|
|
||||||
|
|
||||||
return new Promise<void>((c, e) => {
|
|
||||||
client.queryDocuments(collection, updateQuery).toArray((err, results) => {
|
|
||||||
if (err) { return e(err); }
|
|
||||||
if (results.length !== 1) { return e(new Error('No documents')); }
|
|
||||||
|
|
||||||
const release = results[0];
|
|
||||||
|
|
||||||
release.assets = [
|
|
||||||
...release.assets.filter((a: any) => !(a.platform === platform && a.type === type)),
|
|
||||||
asset
|
|
||||||
];
|
|
||||||
|
|
||||||
client.replaceDocument(release._self, release, err => {
|
|
||||||
if (err && err.code === 409 && updateTries < 5) { return c(_update()); }
|
|
||||||
if (err) { return e(err); }
|
|
||||||
|
|
||||||
log('Build successfully updated.');
|
|
||||||
c();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return _update();
|
|
||||||
}
|
|
||||||
|
|
||||||
async function sync(commit: string, quality: string): Promise<void> {
|
async function sync(commit: string, quality: string): Promise<void> {
|
||||||
log(`Synchronizing Mooncake assets for ${quality}, ${commit}...`);
|
log(`Synchronizing Mooncake assets for ${quality}, ${commit}...`);
|
||||||
|
|
||||||
const cosmosdb = new DocumentClient(process.env['AZURE_DOCUMENTDB_ENDPOINT']!, { masterKey: process.env['AZURE_DOCUMENTDB_MASTERKEY'] });
|
const client = new CosmosClient({ endpoint: process.env['AZURE_DOCUMENTDB_ENDPOINT']!, key: process.env['AZURE_DOCUMENTDB_MASTERKEY'] });
|
||||||
const collection = `dbs/builds/colls/${quality}`;
|
const container = client.database('builds').container(quality);
|
||||||
const query = {
|
|
||||||
query: 'SELECT TOP 1 * FROM c WHERE c.id = @id',
|
|
||||||
parameters: [{ name: '@id', value: commit }]
|
|
||||||
};
|
|
||||||
|
|
||||||
const build = await new Promise<Build>((c, e) => {
|
const query = `SELECT TOP 1 * FROM c WHERE c.id = "${commit}"`;
|
||||||
cosmosdb.queryDocuments(collection, query).toArray((err, results) => {
|
const res = await container.items.query<Build>(query, {}).fetchAll();
|
||||||
if (err) { return e(err); }
|
|
||||||
if (results.length !== 1) { return e(new Error('No documents')); }
|
if (res.resources.length !== 1) {
|
||||||
c(results[0] as Build);
|
throw new Error(`No builds found for ${commit}`);
|
||||||
});
|
}
|
||||||
});
|
|
||||||
|
const build = res.resources[0];
|
||||||
|
|
||||||
log(`Found build for ${commit}, with ${build.assets.length} assets`);
|
log(`Found build for ${commit}, with ${build.assets.length} assets`);
|
||||||
|
|
||||||
@@ -140,8 +98,9 @@ async function sync(commit: string, quality: string): Promise<void> {
|
|||||||
await new Promise((c, e) => readStream.pipe(writeStream).on('finish', c).on('error', e));
|
await new Promise((c, e) => readStream.pipe(writeStream).on('finish', c).on('error', e));
|
||||||
|
|
||||||
log(` Updating build in DB...`);
|
log(` Updating build in DB...`);
|
||||||
asset.mooncakeUrl = `${process.env['MOONCAKE_CDN_URL']}${blobPath}`;
|
const mooncakeUrl = `${process.env['MOONCAKE_CDN_URL']}${blobPath}`;
|
||||||
await updateBuild(commit, quality, asset.platform, asset.type, asset);
|
await container.scripts.storedProcedure('setAssetMooncakeUrl')
|
||||||
|
.execute('', [commit, asset.platform, asset.type, mooncakeUrl]);
|
||||||
|
|
||||||
log(` Done ✔️`);
|
log(` Done ✔️`);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|||||||
@@ -1,47 +1,40 @@
|
|||||||
steps:
|
steps:
|
||||||
- task: NodeTool@0
|
- task: NodeTool@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "10.15.1"
|
versionSpec: "12.13.0"
|
||||||
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@3 # {{SQL CARBON EDIT}} update version
|
||||||
|
inputs:
|
||||||
|
versionSpec: "1.x"
|
||||||
- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
|
- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
|
||||||
inputs:
|
inputs:
|
||||||
keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
|
keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
|
||||||
targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
|
targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
|
||||||
vstsFeed: '$(build-cache)' # {{SQL CARBON EDIT}} update build cache
|
vstsFeed: 'npm-cache' # {{SQL CARBON EDIT}} update build cache
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@3 # {{SQL CARBON EDIT}} update version
|
|
||||||
inputs:
|
|
||||||
versionSpec: "1.x"
|
|
||||||
- script: |
|
- script: |
|
||||||
CHILD_CONCURRENCY=1 yarn --frozen-lockfile
|
CHILD_CONCURRENCY=1 yarn --frozen-lockfile
|
||||||
displayName: Install Dependencies
|
displayName: Install Dependencies
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: $(GITHUB_TOKEN) # {{SQL CARBON EDIT}} add github token
|
|
||||||
- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
|
- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
|
||||||
inputs:
|
inputs:
|
||||||
keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
|
keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
|
||||||
targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
|
targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
|
||||||
vstsFeed: '$(build-cache)' # {{SQL CARBON EDIT}} update build cache
|
vstsFeed: 'npm-cache' # {{SQL CARBON EDIT}} update build cache
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
||||||
- script: |
|
- script: |
|
||||||
yarn electron x64
|
yarn electron x64
|
||||||
displayName: Download Electron
|
displayName: Download Electron
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: $(GITHUB_TOKEN) # {{SQL CARBON EDIT}} add github token
|
|
||||||
- script: |
|
- script: |
|
||||||
yarn gulp hygiene --skip-tslint
|
yarn gulp hygiene
|
||||||
displayName: Run Hygiene Checks
|
displayName: Run Hygiene Checks
|
||||||
- script: |
|
|
||||||
yarn gulp tslint
|
|
||||||
displayName: Run TSLint Checks
|
|
||||||
- script: | # {{SQL CARBON EDIT}} add step
|
- script: | # {{SQL CARBON EDIT}} add step
|
||||||
yarn strict-null-check
|
yarn strict-vscode
|
||||||
displayName: Run Strict Null Check.
|
displayName: Run Strict Null Check.
|
||||||
- script: | # {{SQL CARBON EDIT}} add step
|
|
||||||
yarn tslint
|
|
||||||
displayName: Run TSLint (gci)
|
|
||||||
# - script: | {{SQL CARBON EDIT}} remove step
|
# - script: | {{SQL CARBON EDIT}} remove step
|
||||||
# yarn monaco-compile-check
|
# yarn monaco-compile-check
|
||||||
# displayName: Run Monaco Editor Checks
|
# displayName: Run Monaco Editor Checks
|
||||||
|
- script: |
|
||||||
|
yarn valid-layers-check
|
||||||
|
displayName: Run Valid Layers Checks
|
||||||
- script: |
|
- script: |
|
||||||
yarn compile
|
yarn compile
|
||||||
displayName: Compile Sources
|
displayName: Compile Sources
|
||||||
@@ -60,8 +53,3 @@ steps:
|
|||||||
testResultsFiles: '*-results.xml'
|
testResultsFiles: '*-results.xml'
|
||||||
searchFolder: '$(Build.ArtifactStagingDirectory)/test-results'
|
searchFolder: '$(Build.ArtifactStagingDirectory)/test-results'
|
||||||
condition: succeededOrFailed()
|
condition: succeededOrFailed()
|
||||||
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 # {{SQL CARBON EDIT}} add task
|
|
||||||
displayName: 'Component Detection'
|
|
||||||
inputs:
|
|
||||||
alertWarningLevel: High
|
|
||||||
failOnAlert: true
|
|
||||||
|
|||||||
11
build/azure-pipelines/darwin/createDrop.sh
Executable file
11
build/azure-pipelines/darwin/createDrop.sh
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
REPO="$(pwd)"
|
||||||
|
|
||||||
|
# ensure drop directories exist
|
||||||
|
mkdir -p $REPO/.build/darwin/{archive,server}
|
||||||
|
|
||||||
|
# package Remote Extension Host
|
||||||
|
pushd .. && mv azuredatastudio-reh-darwin azuredatastudio-server-darwin && zip -Xry $REPO/.build/darwin/server/azuredatastudio-server-darwin.zip azuredatastudio-server-darwin && popd
|
||||||
|
|
||||||
|
node build/azure-pipelines/common/copyArtifacts.js
|
||||||
22
build/azure-pipelines/darwin/entitlements.xml
Normal file
22
build/azure-pipelines/darwin/entitlements.xml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?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.disable-executable-page-protection</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.cs.disable-library-validation</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.network.client</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.network.server</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.app-sandbox</key>
|
||||||
|
<false/>
|
||||||
|
<key>com.apple.security.automation.apple-events</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@@ -21,7 +21,7 @@ steps:
|
|||||||
|
|
||||||
- task: NodeTool@0
|
- task: NodeTool@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "10.15.1"
|
versionSpec: "12.13.0"
|
||||||
|
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
inputs:
|
inputs:
|
||||||
|
|||||||
@@ -5,28 +5,20 @@ set -e
|
|||||||
zip -d ../VSCode-darwin.zip "*.pkg"
|
zip -d ../VSCode-darwin.zip "*.pkg"
|
||||||
|
|
||||||
# publish the build
|
# publish the build
|
||||||
PACKAGEJSON=`ls ../VSCode-darwin/*.app/Contents/Resources/app/package.json`
|
node build/azure-pipelines/common/createAsset.js \
|
||||||
VERSION=`node -p "require(\"$PACKAGEJSON\").version"`
|
|
||||||
node build/azure-pipelines/common/publish.js \
|
|
||||||
"$VSCODE_QUALITY" \
|
|
||||||
darwin \
|
darwin \
|
||||||
archive \
|
archive \
|
||||||
"VSCode-darwin-$VSCODE_QUALITY.zip" \
|
"VSCode-darwin-$VSCODE_QUALITY.zip" \
|
||||||
$VERSION \
|
|
||||||
true \
|
|
||||||
../VSCode-darwin.zip
|
../VSCode-darwin.zip
|
||||||
|
|
||||||
# package Remote Extension Host
|
# package Remote Extension Host
|
||||||
pushd .. && mv vscode-reh-darwin vscode-server-darwin && zip -Xry vscode-server-darwin.zip vscode-server-darwin && popd
|
pushd .. && mv vscode-reh-darwin vscode-server-darwin && zip -Xry vscode-server-darwin.zip vscode-server-darwin && popd
|
||||||
|
|
||||||
# publish Remote Extension Host
|
# publish Remote Extension Host
|
||||||
node build/azure-pipelines/common/publish.js \
|
node build/azure-pipelines/common/createAsset.js \
|
||||||
"$VSCODE_QUALITY" \
|
|
||||||
server-darwin \
|
server-darwin \
|
||||||
archive-unsigned \
|
archive-unsigned \
|
||||||
"vscode-server-darwin.zip" \
|
"vscode-server-darwin.zip" \
|
||||||
$VERSION \
|
|
||||||
true \
|
|
||||||
../vscode-server-darwin.zip
|
../vscode-server-darwin.zip
|
||||||
|
|
||||||
# publish hockeyapp symbols
|
# publish hockeyapp symbols
|
||||||
|
|||||||
256
build/azure-pipelines/darwin/sql-product-build-darwin.yml
Normal file
256
build/azure-pipelines/darwin/sql-product-build-darwin.yml
Normal file
@@ -0,0 +1,256 @@
|
|||||||
|
steps:
|
||||||
|
- task: InstallAppleCertificate@2
|
||||||
|
displayName: 'Install developer certificate'
|
||||||
|
inputs:
|
||||||
|
certSecureFile: 'osx_signing_key.p12'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
mkdir -p .build
|
||||||
|
echo -n $BUILD_SOURCEVERSION > .build/commit
|
||||||
|
echo -n $VSCODE_QUALITY > .build/quality
|
||||||
|
displayName: Prepare cache flag
|
||||||
|
|
||||||
|
- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
|
||||||
|
inputs:
|
||||||
|
keyfile: 'build/.cachesalt, .build/commit, .build/quality'
|
||||||
|
targetfolder: '.build, out-build, out-vscode-min, out-vscode-reh-min, out-vscode-reh-web-min'
|
||||||
|
vstsFeed: 'BuildCache'
|
||||||
|
platformIndependent: true
|
||||||
|
alias: 'Compilation'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
exit 1
|
||||||
|
displayName: Check RestoreCache
|
||||||
|
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
||||||
|
|
||||||
|
- task: NodeTool@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: '10.15.3'
|
||||||
|
|
||||||
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@3
|
||||||
|
inputs:
|
||||||
|
versionSpec: '1.x'
|
||||||
|
|
||||||
|
- task: AzureKeyVault@1
|
||||||
|
displayName: 'Azure Key Vault: Get Secrets'
|
||||||
|
inputs:
|
||||||
|
azureSubscription: 'ClientToolsInfra_670062 (88d5392f-a34f-4769-b405-f597fc533613)'
|
||||||
|
KeyVaultName: ado-secrets
|
||||||
|
SecretsFilter: 'github-distro-mixin-password'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
|
||||||
|
cat << EOF > ~/.netrc
|
||||||
|
machine github.com
|
||||||
|
login azuredatastudio
|
||||||
|
password $(github-distro-mixin-password)
|
||||||
|
EOF
|
||||||
|
|
||||||
|
git config user.email "andresse@microsoft.com"
|
||||||
|
git config user.name "AzureDataStudio"
|
||||||
|
displayName: Prepare tooling
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git"
|
||||||
|
git fetch distro
|
||||||
|
git merge $(node -p "require('./package.json').distro")
|
||||||
|
displayName: Merge distro
|
||||||
|
|
||||||
|
- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
|
||||||
|
inputs:
|
||||||
|
keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
|
||||||
|
targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
|
||||||
|
vstsFeed: 'BuildCache'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
CHILD_CONCURRENCY=1 yarn --frozen-lockfile
|
||||||
|
displayName: Install dependencies
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: $(github-distro-mixin-password)
|
||||||
|
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
||||||
|
|
||||||
|
- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
|
||||||
|
inputs:
|
||||||
|
keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
|
||||||
|
targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
|
||||||
|
vstsFeed: 'BuildCache'
|
||||||
|
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
yarn postinstall
|
||||||
|
displayName: Run postinstall scripts
|
||||||
|
condition: and(succeeded(), eq(variables['CacheRestored'], 'true'))
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
node build/azure-pipelines/mixin
|
||||||
|
displayName: Mix in quality
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
yarn gulp install-sqltoolsservice
|
||||||
|
displayName: Install sqltoolsservice
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
yarn gulp package-rebuild-extensions
|
||||||
|
yarn gulp vscode-darwin-min-ci
|
||||||
|
yarn gulp vscode-reh-darwin-min-ci
|
||||||
|
yarn gulp vscode-reh-web-darwin-min-ci
|
||||||
|
displayName: Build
|
||||||
|
env:
|
||||||
|
VSCODE_MIXIN_PASSWORD: $(github-distro-mixin-password)
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
./scripts/test.sh --build --coverage --reporter mocha-junit-reporter
|
||||||
|
displayName: Run unit tests
|
||||||
|
condition: and(succeeded(), eq(variables['RUN_TESTS'], 'true'))
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
pushd ../azuredatastudio-darwin
|
||||||
|
ls
|
||||||
|
|
||||||
|
echo "Cleaning the application"
|
||||||
|
xattr -cr *.app
|
||||||
|
cd *.app
|
||||||
|
find . -name '._*' -print0 | xargs -0 rm -rf --
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
echo "Signing the application with deep"
|
||||||
|
codesign --deep --force --timestamp --options runtime --entitlements $(Build.SourcesDirectory)/build/azure-pipelines/darwin/entitlements.xml -s LPV3BJJYXS *.app
|
||||||
|
|
||||||
|
cd *.app
|
||||||
|
ls
|
||||||
|
echo "Signing specific components"
|
||||||
|
find . -type f -print0 | xargs -0 file | grep ': *Mach-O' | sed 's/: *Mach-O.*//' | while read -r file; do codesign --options runtime --timestamp --entitlements $(Build.SourcesDirectory)/build/azure-pipelines/darwin/entitlements.xml -s LPV3BJJYXS --force "$file" || break; done
|
||||||
|
|
||||||
|
echo "Signing Electron again..."
|
||||||
|
codesign --force --timestamp --options runtime --entitlements $(Build.SourcesDirectory)/build/azure-pipelines/darwin/entitlements.xml -s LPV3BJJYXS Contents/Frameworks/Electron\ Framework.framework
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
echo "Signing the entire application one more time"
|
||||||
|
codesign --force --timestamp --options runtime --entitlements $(Build.SourcesDirectory)/build/azure-pipelines/darwin/entitlements.xml -s LPV3BJJYXS *.app
|
||||||
|
popd
|
||||||
|
displayName: 'Manual codesign'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
mkdir -p .build/darwin/archive
|
||||||
|
pushd ../azuredatastudio-darwin
|
||||||
|
ditto -c -k --keepParent *.app $(Build.SourcesDirectory)/.build/darwin/archive/azuredatastudio-darwin.zip
|
||||||
|
popd
|
||||||
|
displayName: 'Archive'
|
||||||
|
|
||||||
|
- task: PublishPipelineArtifact@0
|
||||||
|
displayName: 'Publish SelfSigned'
|
||||||
|
inputs:
|
||||||
|
artifactName: darwin-selfsigned
|
||||||
|
targetPath: $(Build.SourcesDirectory)/.build/darwin/archive/azuredatastudio-darwin.zip
|
||||||
|
|
||||||
|
- task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1
|
||||||
|
displayName: 'ESRP CodeSigning'
|
||||||
|
inputs:
|
||||||
|
ConnectedServiceName: 'Code Signing'
|
||||||
|
FolderPath: '$(Build.SourcesDirectory)/.build/darwin/archive'
|
||||||
|
Pattern: 'azuredatastudio-darwin.zip'
|
||||||
|
signConfigType: inlineSignParams
|
||||||
|
inlineOperation: |
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"keyCode": "CP-401337-Apple",
|
||||||
|
"operationCode": "MacAppDeveloperSign",
|
||||||
|
"parameters": {
|
||||||
|
"Hardening": "Enable"
|
||||||
|
},
|
||||||
|
"toolName": "sign",
|
||||||
|
"toolVersion": "1.0"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
SessionTimeout: 90
|
||||||
|
condition: and(succeeded(), eq(variables['signtba'], true))
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
zip -d $(Build.SourcesDirectory)/.build/darwin/archive/azuredatastudio-darwin.zip "*.pkg"
|
||||||
|
displayName: Clean Archive
|
||||||
|
condition: and(succeeded(), eq(variables['signtba'], true))
|
||||||
|
|
||||||
|
- task: PublishPipelineArtifact@0
|
||||||
|
displayName: 'Publish Signed'
|
||||||
|
inputs:
|
||||||
|
artifactName: darwin-signed
|
||||||
|
targetPath: $(Build.SourcesDirectory)/.build/darwin/archive/azuredatastudio-darwin.zip
|
||||||
|
condition: and(succeeded(), eq(variables['signtba'], true))
|
||||||
|
|
||||||
|
- task: EsrpCodeSigning@1
|
||||||
|
displayName: 'ESRP Notarization'
|
||||||
|
inputs:
|
||||||
|
ConnectedServiceName: 'Code Signing'
|
||||||
|
FolderPath: '$(Build.SourcesDirectory)/.build/darwin/archive'
|
||||||
|
Pattern: 'azuredatastudio-darwin.zip'
|
||||||
|
signConfigType: inlineSignParams
|
||||||
|
inlineOperation: |
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"KeyCode": "CP-401337-Apple",
|
||||||
|
"OperationCode": "MacAppNotarize",
|
||||||
|
"Parameters": {
|
||||||
|
"BundleId": "com.microsoft.azuredatastudio-$(VSCODE_QUALITY)"
|
||||||
|
},
|
||||||
|
"ToolName": "sign",
|
||||||
|
"ToolVersion": "1.0"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
SessionTimeout: 120
|
||||||
|
condition: and(succeeded(), eq(variables['signtba'], true))
|
||||||
|
|
||||||
|
- task: PublishPipelineArtifact@0
|
||||||
|
displayName: 'Publish Notarized'
|
||||||
|
inputs:
|
||||||
|
artifactName: darwin-notarized
|
||||||
|
targetPath: $(Build.SourcesDirectory)/.build/darwin/archive/azuredatastudio-darwin.zip
|
||||||
|
condition: and(succeeded(), eq(variables['signtba'], true))
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
./build/azure-pipelines/darwin/createDrop.sh
|
||||||
|
displayName: Create Drop
|
||||||
|
|
||||||
|
- task: PublishBuildArtifacts@1
|
||||||
|
displayName: 'Publish Artifact: drop'
|
||||||
|
|
||||||
|
- task: PublishTestResults@2
|
||||||
|
displayName: 'Publish Test Results test-results.xml'
|
||||||
|
inputs:
|
||||||
|
testResultsFiles: 'test-results.xml'
|
||||||
|
searchFolder: '$(Build.SourcesDirectory)'
|
||||||
|
continueOnError: true
|
||||||
|
condition: and(succeeded(), eq(variables['RUN_TESTS'], 'true'))
|
||||||
|
|
||||||
|
- task: PublishTestResults@2
|
||||||
|
displayName: 'Publish Integration and Smoke Test Results'
|
||||||
|
inputs:
|
||||||
|
testResultsFiles: 'dawin-integration-tests-results.xml'
|
||||||
|
searchFolder: '$(Build.ArtifactStagingDirectory)\test-results'
|
||||||
|
continueOnError: true
|
||||||
|
condition: and(succeeded(), eq(variables['RUN_TESTS'], 'true'))
|
||||||
|
|
||||||
|
- task: PublishCodeCoverageResults@1
|
||||||
|
displayName: 'Publish code coverage from $(Build.SourcesDirectory)/.build/coverage/cobertura-coverage.xml'
|
||||||
|
inputs:
|
||||||
|
codeCoverageTool: Cobertura
|
||||||
|
summaryFileLocation: '$(Build.SourcesDirectory)/.build/coverage/cobertura-coverage.xml'
|
||||||
|
reportDirectory: '$(Build.SourcesDirectory)/.build/coverage'
|
||||||
|
continueOnError: true
|
||||||
|
condition: and(succeeded(), eq(variables['RUN_TESTS'], 'true'))
|
||||||
|
|
||||||
|
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
||||||
|
displayName: 'Component Detection'
|
||||||
|
inputs:
|
||||||
|
failOnAlert: true
|
||||||
19
build/azure-pipelines/darwin/sql-publish.ps1
Normal file
19
build/azure-pipelines/darwin/sql-publish.ps1
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
Param(
|
||||||
|
[string]$sourcesDir,
|
||||||
|
[string]$artifactsDir,
|
||||||
|
[string]$storageKey,
|
||||||
|
[string]$documentDbKey
|
||||||
|
)
|
||||||
|
|
||||||
|
$env:AZURE_STORAGE_ACCESS_KEY_2 = $storageKey
|
||||||
|
$env:AZURE_DOCUMENTDB_MASTERKEY = $documentDbKey
|
||||||
|
|
||||||
|
$VersionJson = Get-Content -Raw -Path "$artifactsDir\version.json" | ConvertFrom-Json
|
||||||
|
$Version = $VersionJson.version
|
||||||
|
$Quality = $VersionJson.quality
|
||||||
|
$CommitId = $VersionJson.commit
|
||||||
|
|
||||||
|
$ZipName = "azuredatastudio-darwin.zip"
|
||||||
|
$Zip = "$artifactsDir\darwin\archive\$ZipName"
|
||||||
|
|
||||||
|
node $sourcesDir\build\azure-pipelines\common\publish.js $Quality darwin archive $ZipName $Version true $Zip $CommitId
|
||||||
@@ -1,3 +1,6 @@
|
|||||||
|
pool:
|
||||||
|
vmImage: 'Ubuntu-16.04'
|
||||||
|
|
||||||
trigger:
|
trigger:
|
||||||
branches:
|
branches:
|
||||||
include: ['master', 'release/*']
|
include: ['master', 'release/*']
|
||||||
@@ -8,27 +11,27 @@ pr:
|
|||||||
steps:
|
steps:
|
||||||
- task: NodeTool@0
|
- task: NodeTool@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "10.15.1"
|
versionSpec: "12.13.0"
|
||||||
|
|
||||||
- task: AzureKeyVault@1
|
- task: AzureKeyVault@1
|
||||||
displayName: 'Azure Key Vault: Get Secrets'
|
displayName: 'Azure Key Vault: Get Secrets'
|
||||||
inputs:
|
inputs:
|
||||||
azureSubscription: 'vscode-builds-subscription'
|
azureSubscription: 'azuredatastudio-adointegration'
|
||||||
KeyVaultName: vscode
|
KeyVaultName: ado-secrets
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
cat << EOF > ~/.netrc
|
cat << EOF > ~/.netrc
|
||||||
machine github.com
|
machine github.com
|
||||||
login vscode
|
login azuredatastudio
|
||||||
password $(github-distro-mixin-password)
|
password $(github-distro-mixin-password)
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
git config user.email "vscode@microsoft.com"
|
git config user.email "andresse@microsoft.com"
|
||||||
git config user.name "VSCode"
|
git config user.name "AzureDataStudio"
|
||||||
|
|
||||||
git remote add distro "https://github.com/$VSCODE_MIXIN_REPO.git"
|
git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git"
|
||||||
git fetch distro
|
git fetch distro
|
||||||
|
|
||||||
# Push master branch into oss/master
|
# Push master branch into oss/master
|
||||||
|
|||||||
16
build/azure-pipelines/docker/Dockerfile
Normal file
16
build/azure-pipelines/docker/Dockerfile
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#Download base image ubuntu 16.04
|
||||||
|
FROM ubuntu:16.04
|
||||||
|
|
||||||
|
# Update Software repository
|
||||||
|
RUN apt-get update
|
||||||
|
|
||||||
|
RUN apt-get install -y libxkbfile-dev pkg-config libsecret-1-dev libxss1 dbus libgtk-3-0
|
||||||
|
|
||||||
|
ADD ./ /opt/ads-server
|
||||||
|
|
||||||
|
RUN chmod +x /opt/ads-server/server.sh && chmod +x /opt/ads-server/node
|
||||||
|
|
||||||
|
CMD ["/opt/ads-server/server.sh"]
|
||||||
|
|
||||||
|
EXPOSE 8000:8000
|
||||||
|
EXPOSE 8001:8001
|
||||||
@@ -7,7 +7,7 @@ pr: none
|
|||||||
steps:
|
steps:
|
||||||
- task: NodeTool@0
|
- task: NodeTool@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "10.15.1"
|
versionSpec: "12.13.0"
|
||||||
|
|
||||||
- task: AzureKeyVault@1
|
- task: AzureKeyVault@1
|
||||||
displayName: 'Azure Key Vault: Get Secrets'
|
displayName: 'Azure Key Vault: Get Secrets'
|
||||||
|
|||||||
27
build/azure-pipelines/linux/Dockerfile
Normal file
27
build/azure-pipelines/linux/Dockerfile
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#Download base image ubuntu 16.04
|
||||||
|
FROM ubuntu:16.04
|
||||||
|
|
||||||
|
# Update Software repository
|
||||||
|
RUN apt-get update && apt-get upgrade -y
|
||||||
|
|
||||||
|
RUN apt-get install -y libxkbfile-dev pkg-config libsecret-1-dev libxss1 dbus xvfb libgtk-3-0 \
|
||||||
|
libkrb5-dev git apt-transport-https ca-certificates curl gnupg-agent software-properties-common \
|
||||||
|
libnss3 libasound2 make gcc libx11-dev fakeroot rpm libgconf-2-4 libunwind8 g++-4.8
|
||||||
|
|
||||||
|
RUN rm /usr/bin/gcc
|
||||||
|
RUN rm /usr/bin/g++
|
||||||
|
RUN ln -s /usr/bin/gcc-4.8 /usr/bin/gcc
|
||||||
|
RUN ln -s /usr/bin/g++-4.8 /usr/bin/g++
|
||||||
|
|
||||||
|
#docker
|
||||||
|
RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
|
||||||
|
RUN apt-key fingerprint 0EBFCD88
|
||||||
|
RUN add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
|
||||||
|
RUN apt-get update
|
||||||
|
RUN apt-get -y install docker-ce docker-ce-cli containerd.io
|
||||||
|
|
||||||
|
# This image needs to be built on a linux host; some weird stuff happens and the xvfb service won't start
|
||||||
|
# if built on a windows host.
|
||||||
|
ADD ./xvfb.init /etc/init.d/xvfb
|
||||||
|
RUN chmod +x /etc/init.d/xvfb
|
||||||
|
RUN update-rc.d xvfb defaults
|
||||||
@@ -9,47 +9,40 @@ steps:
|
|||||||
sudo service xvfb start
|
sudo service xvfb start
|
||||||
- task: NodeTool@0
|
- task: NodeTool@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "10.15.1"
|
versionSpec: "12.13.0"
|
||||||
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@3
|
||||||
|
inputs:
|
||||||
|
versionSpec: "1.x"
|
||||||
- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
|
- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
|
||||||
inputs:
|
inputs:
|
||||||
keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
|
keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
|
||||||
targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
|
targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
|
||||||
vstsFeed: '$(build-cache)' # {{SQL CARBON EDIT}} update build cache
|
vstsFeed: 'npm-cache' # {{SQL CARBON EDIT}} update build cache
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@3 # {{SQL CARBON EDIT}} update version
|
|
||||||
inputs:
|
|
||||||
versionSpec: "1.x"
|
|
||||||
- script: |
|
- script: |
|
||||||
CHILD_CONCURRENCY=1 yarn --frozen-lockfile
|
CHILD_CONCURRENCY=1 yarn --frozen-lockfile
|
||||||
displayName: Install Dependencies
|
displayName: Install Dependencies
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: $(GITHUB_TOKEN) # {{SQL CARBON EDIT}} add github token
|
|
||||||
- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
|
- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
|
||||||
inputs:
|
inputs:
|
||||||
keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
|
keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
|
||||||
targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
|
targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
|
||||||
vstsFeed: '$(build-cache)' # {{SQL CARBON EDIT}} update build cache
|
vstsFeed: 'npm-cache' # {{SQL CARBON EDIT}} update build cache
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
||||||
- script: |
|
- script: |
|
||||||
yarn electron x64
|
yarn electron x64
|
||||||
displayName: Download Electron
|
displayName: Download Electron
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: $(GITHUB_TOKEN) # {{SQL CARBON EDIT}} add github token
|
|
||||||
- script: |
|
- script: |
|
||||||
yarn gulp hygiene --skip-tslint
|
yarn gulp hygiene
|
||||||
displayName: Run Hygiene Checks
|
displayName: Run Hygiene Checks
|
||||||
- script: |
|
|
||||||
yarn gulp tslint
|
|
||||||
displayName: Run TSLint Checks
|
|
||||||
- script: | # {{SQL CARBON EDIT}} add gci checks
|
|
||||||
yarn tslint
|
|
||||||
displayName: Run TSLint (gci)
|
|
||||||
- script: | # {{SQL CARBON EDIT}} add strict null check
|
- script: | # {{SQL CARBON EDIT}} add strict null check
|
||||||
yarn strict-null-check
|
yarn strict-vscode
|
||||||
displayName: Run Strict Null Check
|
displayName: Run Strict Null Check
|
||||||
# - script: | {{SQL CARBON EDIT}} remove monaco editor checks
|
# - script: | {{SQL CARBON EDIT}} remove monaco editor checks
|
||||||
# yarn monaco-compile-check
|
# yarn monaco-compile-check
|
||||||
# displayName: Run Monaco Editor Checks
|
# displayName: Run Monaco Editor Checks
|
||||||
|
- script: |
|
||||||
|
yarn valid-layers-check
|
||||||
|
displayName: Run Valid Layers Checks
|
||||||
- script: |
|
- script: |
|
||||||
yarn compile
|
yarn compile
|
||||||
displayName: Compile Sources
|
displayName: Compile Sources
|
||||||
@@ -68,8 +61,3 @@ steps:
|
|||||||
testResultsFiles: '*-results.xml'
|
testResultsFiles: '*-results.xml'
|
||||||
searchFolder: '$(Build.ArtifactStagingDirectory)/test-results'
|
searchFolder: '$(Build.ArtifactStagingDirectory)/test-results'
|
||||||
condition: succeededOrFailed()
|
condition: succeededOrFailed()
|
||||||
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 # {{SQL CARBON EDIT}} add task
|
|
||||||
displayName: 'Component Detection'
|
|
||||||
inputs:
|
|
||||||
alertWarningLevel: High
|
|
||||||
failOnAlert: true
|
|
||||||
|
|||||||
37
build/azure-pipelines/linux/createDrop.sh
Executable file
37
build/azure-pipelines/linux/createDrop.sh
Executable file
@@ -0,0 +1,37 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
REPO="$(pwd)"
|
||||||
|
ROOT="$REPO/.."
|
||||||
|
|
||||||
|
# Publish tarball
|
||||||
|
mkdir -p $REPO/.build/linux/{archive,server}
|
||||||
|
PLATFORM_LINUX="linux-x64"
|
||||||
|
BUILDNAME="azuredatastudio-$PLATFORM_LINUX"
|
||||||
|
BUILD="$ROOT/$BUILDNAME"
|
||||||
|
TARBALL_FILENAME="azuredatastudio-$PLATFORM_LINUX.tar.gz"
|
||||||
|
TARBALL_PATH="$REPO/.build/linux/archive/$TARBALL_FILENAME"
|
||||||
|
|
||||||
|
# create version
|
||||||
|
PACKAGEJSON="$BUILD/resources/app/package.json"
|
||||||
|
VERSION=$(node -p "require(\"$PACKAGEJSON\").version")
|
||||||
|
COMMIT_ID=$(git rev-parse HEAD)
|
||||||
|
echo -e "{ \"version\": \"$VERSION\", \"quality\": \"$VSCODE_QUALITY\", \"commit\": \"$COMMIT_ID\" }" > "$REPO/.build/version.json"
|
||||||
|
|
||||||
|
rm -rf $ROOT/code-*.tar.*
|
||||||
|
(cd $ROOT && tar -czf $TARBALL_PATH $BUILDNAME)
|
||||||
|
|
||||||
|
# Publish Remote Extension Host
|
||||||
|
LEGACY_SERVER_BUILD_NAME="azuredatastudio-reh-$PLATFORM_LINUX"
|
||||||
|
SERVER_BUILD_NAME="azuredatastudio-server-$PLATFORM_LINUX"
|
||||||
|
SERVER_TARBALL_FILENAME="azuredatastudio-server-$PLATFORM_LINUX.tar.gz"
|
||||||
|
SERVER_TARBALL_PATH="$REPO/.build/linux/server/$SERVER_TARBALL_FILENAME"
|
||||||
|
|
||||||
|
rm -rf $ROOT/azuredatastudio-server-*.tar.*
|
||||||
|
(cd $ROOT && mv $LEGACY_SERVER_BUILD_NAME $SERVER_BUILD_NAME && tar --owner=0 --group=0 -czf $SERVER_TARBALL_PATH $SERVER_BUILD_NAME)
|
||||||
|
|
||||||
|
# create docker
|
||||||
|
mkdir -p $REPO/.build/docker
|
||||||
|
docker build -t azuredatastudio-server -f $REPO/build/azure-pipelines/docker/Dockerfile $ROOT/$SERVER_BUILD_NAME
|
||||||
|
docker save azuredatastudio-server | gzip > $REPO/.build/docker/azuredatastudio-server-docker.tar.gz
|
||||||
|
|
||||||
|
node build/azure-pipelines/common/copyArtifacts.js
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------------------------
|
|
||||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
|
||||||
*--------------------------------------------------------------------------------------------*/
|
|
||||||
'use strict';
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
const documentdb_1 = require("documentdb");
|
|
||||||
function createDefaultConfig(quality) {
|
|
||||||
return {
|
|
||||||
id: quality,
|
|
||||||
frozen: false
|
|
||||||
};
|
|
||||||
}
|
|
||||||
function getConfig(quality) {
|
|
||||||
const client = new documentdb_1.DocumentClient(process.env['AZURE_DOCUMENTDB_ENDPOINT'], { masterKey: process.env['AZURE_DOCUMENTDB_MASTERKEY'] });
|
|
||||||
const collection = 'dbs/builds/colls/config';
|
|
||||||
const query = {
|
|
||||||
query: `SELECT TOP 1 * FROM c WHERE c.id = @quality`,
|
|
||||||
parameters: [
|
|
||||||
{ name: '@quality', value: quality }
|
|
||||||
]
|
|
||||||
};
|
|
||||||
return new Promise((c, e) => {
|
|
||||||
client.queryDocuments(collection, query).toArray((err, results) => {
|
|
||||||
if (err && err.code !== 409) {
|
|
||||||
return e(err);
|
|
||||||
}
|
|
||||||
c(!results || results.length === 0 ? createDefaultConfig(quality) : results[0]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
getConfig(process.argv[2])
|
|
||||||
.then(config => {
|
|
||||||
console.log(config.frozen);
|
|
||||||
process.exit(0);
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
console.error(err);
|
|
||||||
process.exit(1);
|
|
||||||
});
|
|
||||||
@@ -21,7 +21,7 @@ steps:
|
|||||||
|
|
||||||
- task: NodeTool@0
|
- task: NodeTool@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "10.15.1"
|
versionSpec: "12.13.0"
|
||||||
|
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
inputs:
|
inputs:
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ steps:
|
|||||||
|
|
||||||
- task: NodeTool@0
|
- task: NodeTool@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "10.15.1"
|
versionSpec: "12.13.0"
|
||||||
|
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
inputs:
|
inputs:
|
||||||
@@ -118,6 +118,32 @@ steps:
|
|||||||
displayName: Run integration tests
|
displayName: Run integration tests
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
yarn gulp "vscode-linux-x64-build-deb"
|
||||||
|
yarn gulp "vscode-linux-x64-build-rpm"
|
||||||
|
yarn gulp "vscode-linux-x64-prepare-snap"
|
||||||
|
displayName: Build packages
|
||||||
|
|
||||||
|
- task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1
|
||||||
|
inputs:
|
||||||
|
ConnectedServiceName: 'ESRP CodeSign'
|
||||||
|
FolderPath: '.build/linux/rpm/x86_64'
|
||||||
|
Pattern: '*.rpm'
|
||||||
|
signConfigType: inlineSignParams
|
||||||
|
inlineOperation: |
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"keyCode": "CP-450779-Pgp",
|
||||||
|
"operationSetCode": "LinuxSign",
|
||||||
|
"parameters": [ ],
|
||||||
|
"toolName": "sign",
|
||||||
|
"toolVersion": "1.0"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
SessionTimeout: 120
|
||||||
|
displayName: Codesign rpm
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
set -e
|
set -e
|
||||||
AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
|
AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
|
||||||
|
|||||||
@@ -10,13 +10,11 @@ BUILD="$ROOT/$BUILDNAME"
|
|||||||
BUILD_VERSION="$(date +%s)"
|
BUILD_VERSION="$(date +%s)"
|
||||||
[ -z "$VSCODE_QUALITY" ] && TARBALL_FILENAME="code-$BUILD_VERSION.tar.gz" || TARBALL_FILENAME="code-$VSCODE_QUALITY-$BUILD_VERSION.tar.gz"
|
[ -z "$VSCODE_QUALITY" ] && TARBALL_FILENAME="code-$BUILD_VERSION.tar.gz" || TARBALL_FILENAME="code-$VSCODE_QUALITY-$BUILD_VERSION.tar.gz"
|
||||||
TARBALL_PATH="$ROOT/$TARBALL_FILENAME"
|
TARBALL_PATH="$ROOT/$TARBALL_FILENAME"
|
||||||
PACKAGEJSON="$BUILD/resources/app/package.json"
|
|
||||||
VERSION=$(node -p "require(\"$PACKAGEJSON\").version")
|
|
||||||
|
|
||||||
rm -rf $ROOT/code-*.tar.*
|
rm -rf $ROOT/code-*.tar.*
|
||||||
(cd $ROOT && tar -czf $TARBALL_PATH $BUILDNAME)
|
(cd $ROOT && tar -czf $TARBALL_PATH $BUILDNAME)
|
||||||
|
|
||||||
node build/azure-pipelines/common/publish.js "$VSCODE_QUALITY" "$PLATFORM_LINUX" archive-unsigned "$TARBALL_FILENAME" "$VERSION" true "$TARBALL_PATH"
|
node build/azure-pipelines/common/createAsset.js "$PLATFORM_LINUX" archive-unsigned "$TARBALL_FILENAME" "$TARBALL_PATH"
|
||||||
|
|
||||||
# Publish Remote Extension Host
|
# Publish Remote Extension Host
|
||||||
LEGACY_SERVER_BUILD_NAME="vscode-reh-$PLATFORM_LINUX"
|
LEGACY_SERVER_BUILD_NAME="vscode-reh-$PLATFORM_LINUX"
|
||||||
@@ -27,32 +25,28 @@ SERVER_TARBALL_PATH="$ROOT/$SERVER_TARBALL_FILENAME"
|
|||||||
rm -rf $ROOT/vscode-server-*.tar.*
|
rm -rf $ROOT/vscode-server-*.tar.*
|
||||||
(cd $ROOT && mv $LEGACY_SERVER_BUILD_NAME $SERVER_BUILD_NAME && tar --owner=0 --group=0 -czf $SERVER_TARBALL_PATH $SERVER_BUILD_NAME)
|
(cd $ROOT && mv $LEGACY_SERVER_BUILD_NAME $SERVER_BUILD_NAME && tar --owner=0 --group=0 -czf $SERVER_TARBALL_PATH $SERVER_BUILD_NAME)
|
||||||
|
|
||||||
node build/azure-pipelines/common/publish.js "$VSCODE_QUALITY" "server-$PLATFORM_LINUX" archive-unsigned "$SERVER_TARBALL_FILENAME" "$VERSION" true "$SERVER_TARBALL_PATH"
|
node build/azure-pipelines/common/createAsset.js "server-$PLATFORM_LINUX" archive-unsigned "$SERVER_TARBALL_FILENAME" "$SERVER_TARBALL_PATH"
|
||||||
|
|
||||||
# Publish hockeyapp symbols
|
# Publish hockeyapp symbols
|
||||||
node build/azure-pipelines/common/symbols.js "$VSCODE_MIXIN_PASSWORD" "$VSCODE_HOCKEYAPP_TOKEN" "x64" "$VSCODE_HOCKEYAPP_ID_LINUX64"
|
node build/azure-pipelines/common/symbols.js "$VSCODE_MIXIN_PASSWORD" "$VSCODE_HOCKEYAPP_TOKEN" "x64" "$VSCODE_HOCKEYAPP_ID_LINUX64"
|
||||||
|
|
||||||
# Publish DEB
|
# Publish DEB
|
||||||
yarn gulp "vscode-linux-x64-build-deb"
|
|
||||||
PLATFORM_DEB="linux-deb-x64"
|
PLATFORM_DEB="linux-deb-x64"
|
||||||
DEB_ARCH="amd64"
|
DEB_ARCH="amd64"
|
||||||
DEB_FILENAME="$(ls $REPO/.build/linux/deb/$DEB_ARCH/deb/)"
|
DEB_FILENAME="$(ls $REPO/.build/linux/deb/$DEB_ARCH/deb/)"
|
||||||
DEB_PATH="$REPO/.build/linux/deb/$DEB_ARCH/deb/$DEB_FILENAME"
|
DEB_PATH="$REPO/.build/linux/deb/$DEB_ARCH/deb/$DEB_FILENAME"
|
||||||
|
|
||||||
node build/azure-pipelines/common/publish.js "$VSCODE_QUALITY" "$PLATFORM_DEB" package "$DEB_FILENAME" "$VERSION" true "$DEB_PATH"
|
node build/azure-pipelines/common/createAsset.js "$PLATFORM_DEB" package "$DEB_FILENAME" "$DEB_PATH"
|
||||||
|
|
||||||
# Publish RPM
|
# Publish RPM
|
||||||
yarn gulp "vscode-linux-x64-build-rpm"
|
|
||||||
PLATFORM_RPM="linux-rpm-x64"
|
PLATFORM_RPM="linux-rpm-x64"
|
||||||
RPM_ARCH="x86_64"
|
RPM_ARCH="x86_64"
|
||||||
RPM_FILENAME="$(ls $REPO/.build/linux/rpm/$RPM_ARCH/ | grep .rpm)"
|
RPM_FILENAME="$(ls $REPO/.build/linux/rpm/$RPM_ARCH/ | grep .rpm)"
|
||||||
RPM_PATH="$REPO/.build/linux/rpm/$RPM_ARCH/$RPM_FILENAME"
|
RPM_PATH="$REPO/.build/linux/rpm/$RPM_ARCH/$RPM_FILENAME"
|
||||||
|
|
||||||
node build/azure-pipelines/common/publish.js "$VSCODE_QUALITY" "$PLATFORM_RPM" package "$RPM_FILENAME" "$VERSION" true "$RPM_PATH"
|
node build/azure-pipelines/common/createAsset.js "$PLATFORM_RPM" package "$RPM_FILENAME" "$RPM_PATH"
|
||||||
|
|
||||||
# Publish Snap
|
# Publish Snap
|
||||||
yarn gulp "vscode-linux-x64-prepare-snap"
|
|
||||||
|
|
||||||
# Pack snap tarball artifact, in order to preserve file perms
|
# Pack snap tarball artifact, in order to preserve file perms
|
||||||
mkdir -p $REPO/.build/linux/snap-tarball
|
mkdir -p $REPO/.build/linux/snap-tarball
|
||||||
SNAP_TARBALL_PATH="$REPO/.build/linux/snap-tarball/snap-x64.tar.gz"
|
SNAP_TARBALL_PATH="$REPO/.build/linux/snap-tarball/snap-x64.tar.gz"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
steps:
|
steps:
|
||||||
- task: NodeTool@0
|
- task: NodeTool@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "10.15.1"
|
versionSpec: "12.13.0"
|
||||||
|
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
inputs:
|
inputs:
|
||||||
@@ -43,12 +43,10 @@ steps:
|
|||||||
# Create snap package
|
# Create snap package
|
||||||
BUILD_VERSION="$(date +%s)"
|
BUILD_VERSION="$(date +%s)"
|
||||||
SNAP_FILENAME="code-$VSCODE_QUALITY-$BUILD_VERSION.snap"
|
SNAP_FILENAME="code-$VSCODE_QUALITY-$BUILD_VERSION.snap"
|
||||||
PACKAGEJSON="$(ls $SNAP_ROOT/code*/usr/share/code*/resources/app/package.json)"
|
|
||||||
VERSION=$(node -p "require(\"$PACKAGEJSON\").version")
|
|
||||||
SNAP_PATH="$SNAP_ROOT/$SNAP_FILENAME"
|
SNAP_PATH="$SNAP_ROOT/$SNAP_FILENAME"
|
||||||
(cd $SNAP_ROOT/code-* && sudo --preserve-env snapcraft snap --output "$SNAP_PATH")
|
(cd $SNAP_ROOT/code-* && sudo --preserve-env snapcraft snap --output "$SNAP_PATH")
|
||||||
|
|
||||||
# Publish snap package
|
# Publish snap package
|
||||||
AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
|
AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
|
||||||
AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \
|
AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \
|
||||||
node build/azure-pipelines/common/publish.js "$VSCODE_QUALITY" "linux-snap-x64" package "$SNAP_FILENAME" "$VERSION" true "$SNAP_PATH"
|
node build/azure-pipelines/common/createAsset.js "linux-snap-x64" package "$SNAP_FILENAME" "$SNAP_PATH"
|
||||||
|
|||||||
172
build/azure-pipelines/linux/sql-product-build-linux.yml
Normal file
172
build/azure-pipelines/linux/sql-product-build-linux.yml
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
steps:
|
||||||
|
- script: |
|
||||||
|
mkdir -p .build
|
||||||
|
echo -n $BUILD_SOURCEVERSION > .build/commit
|
||||||
|
echo -n $VSCODE_QUALITY > .build/quality
|
||||||
|
displayName: Prepare cache flag
|
||||||
|
|
||||||
|
- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
|
||||||
|
inputs:
|
||||||
|
keyfile: 'build/.cachesalt, .build/commit, .build/quality'
|
||||||
|
targetfolder: '.build, out-build, out-vscode-min, out-vscode-reh-min, out-vscode-reh-web-min'
|
||||||
|
vstsFeed: 'BuildCache'
|
||||||
|
platformIndependent: true
|
||||||
|
alias: 'Compilation'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
exit 1
|
||||||
|
displayName: Check RestoreCache
|
||||||
|
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
||||||
|
|
||||||
|
- task: NodeTool@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: '10.15.1'
|
||||||
|
|
||||||
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@3
|
||||||
|
inputs:
|
||||||
|
versionSpec: "1.x"
|
||||||
|
|
||||||
|
- task: AzureKeyVault@1
|
||||||
|
displayName: 'Azure Key Vault: Get Secrets'
|
||||||
|
inputs:
|
||||||
|
azureSubscription: 'ClientToolsInfra_670062 (88d5392f-a34f-4769-b405-f597fc533613)'
|
||||||
|
KeyVaultName: ado-secrets
|
||||||
|
SecretsFilter: 'github-distro-mixin-password'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
cat << EOF > ~/.netrc
|
||||||
|
machine github.com
|
||||||
|
login azuredatastudio
|
||||||
|
password $(github-distro-mixin-password)
|
||||||
|
EOF
|
||||||
|
|
||||||
|
git config user.email "andresse@microsoft.com"
|
||||||
|
git config user.name "AzureDataStudio"
|
||||||
|
displayName: Prepare tooling
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git"
|
||||||
|
git fetch distro
|
||||||
|
git merge $(node -p "require('./package.json').distro")
|
||||||
|
displayName: Merge distro
|
||||||
|
|
||||||
|
- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
|
||||||
|
inputs:
|
||||||
|
keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
|
||||||
|
targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
|
||||||
|
vstsFeed: 'BuildCache'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
CHILD_CONCURRENCY=1 yarn --frozen-lockfile
|
||||||
|
displayName: Install dependencies
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: $(github-distro-mixin-password)
|
||||||
|
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
||||||
|
|
||||||
|
- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
|
||||||
|
inputs:
|
||||||
|
keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
|
||||||
|
targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
|
||||||
|
vstsFeed: 'BuildCache'
|
||||||
|
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
yarn postinstall
|
||||||
|
displayName: Run postinstall scripts
|
||||||
|
condition: and(succeeded(), eq(variables['CacheRestored'], 'true'))
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
node build/azure-pipelines/mixin
|
||||||
|
displayName: Mix in quality
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
yarn gulp install-sqltoolsservice
|
||||||
|
yarn gulp install-ssmsmin
|
||||||
|
displayName: Install extension binaries
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
yarn gulp vscode-linux-x64-min-ci
|
||||||
|
yarn gulp vscode-reh-linux-x64-min-ci
|
||||||
|
yarn gulp vscode-reh-web-linux-x64-min-ci
|
||||||
|
displayName: Build
|
||||||
|
env:
|
||||||
|
VSCODE_MIXIN_PASSWORD: $(github-distro-mixin-password)
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
service xvfb start
|
||||||
|
displayName: Start xvfb
|
||||||
|
condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
yarn gulp package-rebuild-extensions
|
||||||
|
yarn gulp compile-extensions
|
||||||
|
yarn gulp package-external-extensions
|
||||||
|
displayName: Package External extensions
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
APP_ROOT=$(agent.builddirectory)/azuredatastudio-linux-x64
|
||||||
|
APP_NAME=$(node -p "require(\"$APP_ROOT/resources/app/product.json\").applicationName")
|
||||||
|
INTEGRATION_TEST_ELECTRON_PATH="$APP_ROOT/$APP_NAME" \
|
||||||
|
DISPLAY=:10 ./scripts/test-extensions-unit.sh
|
||||||
|
displayName: 'Run Stable Extension Unit Tests'
|
||||||
|
condition: and(succeeded(), eq(variables['RUN_TESTS'], 'true'))
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
APP_ROOT=$(agent.builddirectory)/azuredatastudio-linux-x64
|
||||||
|
APP_NAME=$(node -p "require(\"$APP_ROOT/resources/app/product.json\").applicationName")
|
||||||
|
INTEGRATION_TEST_ELECTRON_PATH="$APP_ROOT/$APP_NAME" \
|
||||||
|
DISPLAY=:10 ./scripts/test-extensions-unit-unstable.sh
|
||||||
|
displayName: 'Run Unstable Extension Unit Tests'
|
||||||
|
continueOnError: true
|
||||||
|
condition: and(succeeded(), eq(variables['RUN_UNSTABLE_TESTS'], 'true'))
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
yarn gulp vscode-linux-x64-build-deb
|
||||||
|
displayName: Build Deb
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
yarn gulp vscode-linux-x64-build-rpm
|
||||||
|
displayName: Build Rpm
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
./build/azure-pipelines/linux/createDrop.sh
|
||||||
|
displayName: Create Drop
|
||||||
|
|
||||||
|
- task: PublishBuildArtifacts@1
|
||||||
|
displayName: 'Publish Artifact: drop'
|
||||||
|
|
||||||
|
- task: PublishTestResults@2
|
||||||
|
displayName: 'Publish Test Results test-results.xml'
|
||||||
|
inputs:
|
||||||
|
testResultsFiles: 'test-results.xml'
|
||||||
|
searchFolder: '$(Build.SourcesDirectory)'
|
||||||
|
continueOnError: true
|
||||||
|
condition: and(succeeded(), eq(variables['RUN_TESTS'], 'true'))
|
||||||
|
|
||||||
|
- task: PublishCodeCoverageResults@1
|
||||||
|
displayName: 'Publish code coverage from $(Build.SourcesDirectory)/.build/coverage/cobertura-coverage.xml'
|
||||||
|
inputs:
|
||||||
|
codeCoverageTool: Cobertura
|
||||||
|
summaryFileLocation: '$(Build.SourcesDirectory)/.build/coverage/cobertura-coverage.xml'
|
||||||
|
reportDirectory: '$(Build.SourcesDirectory)/.build/coverage'
|
||||||
|
continueOnError: true
|
||||||
|
|
||||||
|
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
||||||
|
displayName: 'Component Detection'
|
||||||
|
inputs:
|
||||||
|
failOnAlert: true
|
||||||
36
build/azure-pipelines/linux/sql-publish.ps1
Normal file
36
build/azure-pipelines/linux/sql-publish.ps1
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
Param(
|
||||||
|
[string]$sourcesDir,
|
||||||
|
[string]$artifactsDir,
|
||||||
|
[string]$storageKey,
|
||||||
|
[string]$documentDbKey
|
||||||
|
)
|
||||||
|
|
||||||
|
$env:AZURE_STORAGE_ACCESS_KEY_2 = $storageKey
|
||||||
|
$env:AZURE_DOCUMENTDB_MASTERKEY = $documentDbKey
|
||||||
|
|
||||||
|
$VersionJson = Get-Content -Raw -Path "$artifactsDir\version.json" | ConvertFrom-Json
|
||||||
|
$Version = $VersionJson.version
|
||||||
|
$Quality = $VersionJson.quality
|
||||||
|
$CommitId = $VersionJson.commit
|
||||||
|
$Arch = "x64"
|
||||||
|
|
||||||
|
# Publish tarball
|
||||||
|
$PlatformLinux = "linux-$Arch"
|
||||||
|
$TarballFilename = "azuredatastudio-linux-$Arch.tar.gz"
|
||||||
|
$TarballPath = "$artifactsDir\linux\archive\$TarballFilename"
|
||||||
|
|
||||||
|
node $sourcesDir\build\azure-pipelines\common\publish.js $Quality $PlatformLinux archive-unsigned $TarballFilename $Version true $TarballPath $CommitId
|
||||||
|
|
||||||
|
# Publish DEB
|
||||||
|
$PlatformDeb = "linux-deb-$Arch"
|
||||||
|
$DebFilename = "$(Get-ChildItem -File -Name $artifactsDir\linux\deb\amd64\deb\*.deb)"
|
||||||
|
$DebPath = "$artifactsDir\linux\deb\amd64\deb\$DebFilename"
|
||||||
|
|
||||||
|
node $sourcesDir\build\azure-pipelines\common\publish.js $Quality $PlatformDeb package $DebFilename $Version true $DebPath $CommitId
|
||||||
|
|
||||||
|
# Publish RPM
|
||||||
|
$PlatformRpm = "linux-rpm-$Arch"
|
||||||
|
$RpmFilename = "$(Get-ChildItem -File -Name $artifactsDir\linux\rpm\x86_64\*.rpm)"
|
||||||
|
$RpmPath = "$artifactsDir\linux\rpm\x86_64\$RpmFilename"
|
||||||
|
|
||||||
|
node $sourcesDir\build\azure-pipelines\common\publish.js $Quality $PlatformRpm package $RpmFilename $Version true $RpmPath $CommitId
|
||||||
@@ -21,7 +21,7 @@ function main() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const productJsonFilter = filter('product.json', { restore: true });
|
const productJsonFilter = filter('**/product.json', { restore: true });
|
||||||
|
|
||||||
fancyLog(ansiColors.blue('[mixin]'), `Mixing in sources:`);
|
fancyLog(ansiColors.blue('[mixin]'), `Mixing in sources:`);
|
||||||
return vfs
|
return vfs
|
||||||
@@ -29,7 +29,7 @@ function main() {
|
|||||||
.pipe(filter(f => !f.isDirectory()))
|
.pipe(filter(f => !f.isDirectory()))
|
||||||
.pipe(productJsonFilter)
|
.pipe(productJsonFilter)
|
||||||
.pipe(buffer())
|
.pipe(buffer())
|
||||||
.pipe(json(o => Object.assign({}, require('../product.json'), o)))
|
.pipe(json(o => Object.assign({}, require('../../product.json'), o)))
|
||||||
.pipe(productJsonFilter.restore)
|
.pipe(productJsonFilter.restore)
|
||||||
.pipe(es.mapSync(function (f) {
|
.pipe(es.mapSync(function (f) {
|
||||||
fancyLog(ansiColors.blue('[mixin]'), f.relative, ansiColors.green('✔︎'));
|
fancyLog(ansiColors.blue('[mixin]'), f.relative, ansiColors.green('✔︎'));
|
||||||
@@ -38,4 +38,4 @@ function main() {
|
|||||||
.pipe(vfs.dest('.'));
|
.pipe(vfs.dest('.'));
|
||||||
}
|
}
|
||||||
|
|
||||||
main();
|
main();
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ jobs:
|
|||||||
- template: linux/product-build-linux-multiarch.yml
|
- template: linux/product-build-linux-multiarch.yml
|
||||||
|
|
||||||
- job: LinuxArm64
|
- job: LinuxArm64
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX_ARM64'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable'))
|
condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX_ARM64'], 'true'))
|
||||||
pool:
|
pool:
|
||||||
vmImage: 'Ubuntu-16.04'
|
vmImage: 'Ubuntu-16.04'
|
||||||
variables:
|
variables:
|
||||||
@@ -102,7 +102,7 @@ jobs:
|
|||||||
- job: macOS
|
- job: macOS
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_MACOS'], 'true'))
|
condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_MACOS'], 'true'))
|
||||||
pool:
|
pool:
|
||||||
vmImage: macOS 10.13
|
vmImage: macOS-latest
|
||||||
dependsOn:
|
dependsOn:
|
||||||
- Compile
|
- Compile
|
||||||
steps:
|
steps:
|
||||||
@@ -118,6 +118,7 @@ jobs:
|
|||||||
- Linux
|
- Linux
|
||||||
- LinuxSnap
|
- LinuxSnap
|
||||||
- LinuxArmhf
|
- LinuxArmhf
|
||||||
|
- LinuxArm64
|
||||||
- LinuxAlpine
|
- LinuxAlpine
|
||||||
- macOS
|
- macOS
|
||||||
steps:
|
steps:
|
||||||
@@ -133,6 +134,7 @@ jobs:
|
|||||||
- Linux
|
- Linux
|
||||||
- LinuxSnap
|
- LinuxSnap
|
||||||
- LinuxArmhf
|
- LinuxArmhf
|
||||||
|
- LinuxArm64
|
||||||
- LinuxAlpine
|
- LinuxAlpine
|
||||||
- LinuxWeb
|
- LinuxWeb
|
||||||
- macOS
|
- macOS
|
||||||
|
|||||||
@@ -12,23 +12,24 @@ steps:
|
|||||||
vstsFeed: 'npm-vscode'
|
vstsFeed: 'npm-vscode'
|
||||||
platformIndependent: true
|
platformIndependent: true
|
||||||
alias: 'Compilation'
|
alias: 'Compilation'
|
||||||
|
dryRun: true
|
||||||
|
|
||||||
- task: NodeTool@0
|
- task: NodeTool@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "10.15.1"
|
versionSpec: "12.13.0"
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
|
||||||
|
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "1.x"
|
versionSpec: "1.x"
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
|
||||||
|
|
||||||
- task: AzureKeyVault@1
|
- task: AzureKeyVault@1
|
||||||
displayName: 'Azure Key Vault: Get Secrets'
|
displayName: 'Azure Key Vault: Get Secrets'
|
||||||
inputs:
|
inputs:
|
||||||
azureSubscription: 'vscode-builds-subscription'
|
azureSubscription: 'vscode-builds-subscription'
|
||||||
KeyVaultName: vscode
|
KeyVaultName: vscode
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
set -e
|
set -e
|
||||||
@@ -41,7 +42,7 @@ steps:
|
|||||||
git config user.email "vscode@microsoft.com"
|
git config user.email "vscode@microsoft.com"
|
||||||
git config user.name "VSCode"
|
git config user.name "VSCode"
|
||||||
displayName: Prepare tooling
|
displayName: Prepare tooling
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
set -e
|
set -e
|
||||||
@@ -49,33 +50,33 @@ steps:
|
|||||||
git fetch distro
|
git fetch distro
|
||||||
git merge $(node -p "require('./package.json').distro")
|
git merge $(node -p "require('./package.json').distro")
|
||||||
displayName: Merge distro
|
displayName: Merge distro
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
|
||||||
|
|
||||||
- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
|
- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
|
||||||
inputs:
|
inputs:
|
||||||
keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock'
|
keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock'
|
||||||
targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
|
targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
|
||||||
vstsFeed: 'npm-vscode'
|
vstsFeed: 'npm-vscode'
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
set -e
|
set -e
|
||||||
CHILD_CONCURRENCY=1 yarn --frozen-lockfile
|
CHILD_CONCURRENCY=1 yarn --frozen-lockfile
|
||||||
displayName: Install dependencies
|
displayName: Install dependencies
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), ne(variables['CacheRestored'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'), ne(variables['CacheRestored'], 'true'))
|
||||||
|
|
||||||
- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
|
- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
|
||||||
inputs:
|
inputs:
|
||||||
keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock'
|
keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock'
|
||||||
targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
|
targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
|
||||||
vstsFeed: 'npm-vscode'
|
vstsFeed: 'npm-vscode'
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), ne(variables['CacheRestored'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'), ne(variables['CacheRestored'], 'true'))
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
set -e
|
set -e
|
||||||
yarn postinstall
|
yarn postinstall
|
||||||
displayName: Run postinstall scripts
|
displayName: Run postinstall scripts
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), eq(variables['CacheRestored'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'), eq(variables['CacheRestored'], 'true'))
|
||||||
|
|
||||||
# Mixin must run before optimize, because the CSS loader will
|
# Mixin must run before optimize, because the CSS loader will
|
||||||
# inline small SVGs
|
# inline small SVGs
|
||||||
@@ -83,28 +84,28 @@ steps:
|
|||||||
set -e
|
set -e
|
||||||
node build/azure-pipelines/mixin
|
node build/azure-pipelines/mixin
|
||||||
displayName: Mix in quality
|
displayName: Mix in quality
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
set -e
|
set -e
|
||||||
yarn gulp hygiene --skip-tslint
|
yarn gulp hygiene
|
||||||
yarn gulp tslint
|
|
||||||
yarn monaco-compile-check
|
yarn monaco-compile-check
|
||||||
displayName: Run hygiene, tslint and monaco compile checks
|
yarn valid-layers-check
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
displayName: Run hygiene, monaco compile & valid layers checks
|
||||||
|
condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
set -
|
set -
|
||||||
./build/azure-pipelines/common/extract-telemetry.sh
|
./build/azure-pipelines/common/extract-telemetry.sh
|
||||||
displayName: Extract Telemetry
|
displayName: Extract Telemetry
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
set -e
|
set -e
|
||||||
AZURE_WEBVIEW_STORAGE_ACCESS_KEY="$(vscode-webview-storage-key)" \
|
AZURE_WEBVIEW_STORAGE_ACCESS_KEY="$(vscode-webview-storage-key)" \
|
||||||
./build/azure-pipelines/common/publish-webview.sh
|
./build/azure-pipelines/common/publish-webview.sh
|
||||||
displayName: Publish Webview
|
displayName: Publish Webview
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
set -e
|
set -e
|
||||||
@@ -114,14 +115,22 @@ steps:
|
|||||||
yarn gulp minify-vscode-reh
|
yarn gulp minify-vscode-reh
|
||||||
yarn gulp minify-vscode-reh-web
|
yarn gulp minify-vscode-reh-web
|
||||||
displayName: Compile
|
displayName: Compile
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
set -e
|
set -e
|
||||||
AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \
|
AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \
|
||||||
node build/azure-pipelines/upload-sourcemaps
|
node build/azure-pipelines/upload-sourcemaps
|
||||||
displayName: Upload sourcemaps
|
displayName: Upload sourcemaps
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
VERSION=`node -p "require(\"./package.json\").version"`
|
||||||
|
AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
|
||||||
|
node build/azure-pipelines/common/createBuild.js $VERSION
|
||||||
|
displayName: Create build
|
||||||
|
condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
|
||||||
|
|
||||||
- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
|
- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
|
||||||
inputs:
|
inputs:
|
||||||
@@ -130,4 +139,4 @@ steps:
|
|||||||
vstsFeed: 'npm-vscode'
|
vstsFeed: 'npm-vscode'
|
||||||
platformIndependent: true
|
platformIndependent: true
|
||||||
alias: 'Compilation'
|
alias: 'Compilation'
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
|
||||||
|
|||||||
@@ -35,9 +35,9 @@ function isValidTag(t: string) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parseInt(major, 10) === NaN || parseInt(minor, 10) === NaN) {
|
if (isNaN(parseInt(major, 10)) || isNaN(parseInt(minor, 10))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ pr: none
|
|||||||
steps:
|
steps:
|
||||||
- task: NodeTool@0
|
- task: NodeTool@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "10.15.1"
|
versionSpec: "12.13.0"
|
||||||
|
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
inputs:
|
inputs:
|
||||||
|
|||||||
@@ -19,4 +19,4 @@ steps:
|
|||||||
(cd build ; yarn)
|
(cd build ; yarn)
|
||||||
|
|
||||||
AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
|
AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
|
||||||
node build/azure-pipelines/common/release.js
|
node build/azure-pipelines/common/releaseBuild.js
|
||||||
|
|||||||
74
build/azure-pipelines/sql-product-build.yml
Normal file
74
build/azure-pipelines/sql-product-build.yml
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
resources:
|
||||||
|
containers:
|
||||||
|
- container: linux-x64
|
||||||
|
image: sqltoolscontainers.azurecr.io/linux-build-agent:1
|
||||||
|
endpoint: ContainerRegistry
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
- job: Compile
|
||||||
|
pool:
|
||||||
|
vmImage: 'Ubuntu-16.04'
|
||||||
|
container: linux-x64
|
||||||
|
steps:
|
||||||
|
- template: sql-product-compile.yml
|
||||||
|
|
||||||
|
- job: macOS
|
||||||
|
condition: eq(variables['VSCODE_BUILD_MACOS'], 'true')
|
||||||
|
pool:
|
||||||
|
vmImage: macOS-latest
|
||||||
|
dependsOn:
|
||||||
|
- Compile
|
||||||
|
steps:
|
||||||
|
- template: darwin/sql-product-build-darwin.yml
|
||||||
|
timeoutInMinutes: 180
|
||||||
|
|
||||||
|
- job: Linux
|
||||||
|
condition: eq(variables['VSCODE_BUILD_LINUX'], 'true')
|
||||||
|
pool:
|
||||||
|
vmImage: 'Ubuntu-16.04'
|
||||||
|
container: linux-x64
|
||||||
|
dependsOn:
|
||||||
|
- Compile
|
||||||
|
steps:
|
||||||
|
- template: linux/sql-product-build-linux.yml
|
||||||
|
|
||||||
|
- job: Windows
|
||||||
|
condition: eq(variables['VSCODE_BUILD_WIN32'], 'true')
|
||||||
|
pool:
|
||||||
|
vmImage: VS2017-Win2016
|
||||||
|
dependsOn:
|
||||||
|
- Compile
|
||||||
|
steps:
|
||||||
|
- template: win32/sql-product-build-win32.yml
|
||||||
|
|
||||||
|
- job: Windows_Test
|
||||||
|
condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32'], 'true'))
|
||||||
|
pool:
|
||||||
|
name: mssqltools
|
||||||
|
dependsOn:
|
||||||
|
- Linux
|
||||||
|
- Windows
|
||||||
|
steps:
|
||||||
|
- template: win32/sql-product-test-win32.yml
|
||||||
|
|
||||||
|
- job: Release
|
||||||
|
condition: and(succeeded(), or(eq(variables['VSCODE_RELEASE'], 'true'), and(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['Build.Reason'], 'Schedule'))))
|
||||||
|
pool:
|
||||||
|
vmImage: 'Ubuntu-16.04'
|
||||||
|
dependsOn:
|
||||||
|
- macOS
|
||||||
|
- Linux
|
||||||
|
- Windows
|
||||||
|
- Windows_Test
|
||||||
|
steps:
|
||||||
|
- template: sql-release.yml
|
||||||
|
|
||||||
|
trigger: none
|
||||||
|
pr: none
|
||||||
|
|
||||||
|
schedules:
|
||||||
|
- cron: "0 5 * * Mon-Fri"
|
||||||
|
displayName: Mon-Fri at 7:00
|
||||||
|
branches:
|
||||||
|
include:
|
||||||
|
- master
|
||||||
113
build/azure-pipelines/sql-product-compile.yml
Normal file
113
build/azure-pipelines/sql-product-compile.yml
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
steps:
|
||||||
|
- script: |
|
||||||
|
mkdir -p .build
|
||||||
|
echo -n $BUILD_SOURCEVERSION > .build/commit
|
||||||
|
echo -n $VSCODE_QUALITY > .build/quality
|
||||||
|
displayName: Prepare cache flag
|
||||||
|
|
||||||
|
- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
|
||||||
|
inputs:
|
||||||
|
keyfile: 'build/.cachesalt, .build/commit, .build/quality'
|
||||||
|
targetfolder: '.build, out-build, out-vscode-min, out-vscode-reh-min, out-vscode-reh-web-min'
|
||||||
|
vstsFeed: 'BuildCache'
|
||||||
|
platformIndependent: true
|
||||||
|
alias: 'Compilation'
|
||||||
|
|
||||||
|
- task: NodeTool@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: "10.15.1"
|
||||||
|
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
||||||
|
|
||||||
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@3
|
||||||
|
inputs:
|
||||||
|
versionSpec: "1.x"
|
||||||
|
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
||||||
|
|
||||||
|
- task: AzureKeyVault@1
|
||||||
|
displayName: 'Azure Key Vault: Get Secrets'
|
||||||
|
inputs:
|
||||||
|
azureSubscription: 'ClientToolsInfra_670062 (88d5392f-a34f-4769-b405-f597fc533613)'
|
||||||
|
KeyVaultName: ado-secrets
|
||||||
|
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
cat << EOF > ~/.netrc
|
||||||
|
machine github.com
|
||||||
|
login azuredatastudio
|
||||||
|
password $(github-distro-mixin-password)
|
||||||
|
EOF
|
||||||
|
|
||||||
|
git config user.email "andresse@microsoft.com"
|
||||||
|
git config user.name "AzureDataStudio"
|
||||||
|
displayName: Prepare tooling
|
||||||
|
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git"
|
||||||
|
git fetch distro
|
||||||
|
git merge $(node -p "require('./package.json').distro")
|
||||||
|
displayName: Merge distro
|
||||||
|
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
||||||
|
|
||||||
|
- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
|
||||||
|
inputs:
|
||||||
|
keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
|
||||||
|
targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
|
||||||
|
vstsFeed: 'BuildCache'
|
||||||
|
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
CHILD_CONCURRENCY=1 yarn --frozen-lockfile
|
||||||
|
displayName: Install dependencies
|
||||||
|
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), ne(variables['CacheRestored'], 'true'))
|
||||||
|
|
||||||
|
- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
|
||||||
|
inputs:
|
||||||
|
keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
|
||||||
|
targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
|
||||||
|
vstsFeed: 'BuildCache'
|
||||||
|
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), ne(variables['CacheRestored'], 'true'))
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
yarn postinstall
|
||||||
|
displayName: Run postinstall scripts
|
||||||
|
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), eq(variables['CacheRestored'], 'true'))
|
||||||
|
|
||||||
|
# Mixin must run before optimize, because the CSS loader will
|
||||||
|
# inline small SVGs
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
node build/azure-pipelines/mixin
|
||||||
|
displayName: Mix in quality
|
||||||
|
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
yarn gulp hygiene
|
||||||
|
yarn strict-vscode
|
||||||
|
yarn valid-layers-check
|
||||||
|
displayName: Run hygiene, tslint
|
||||||
|
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
yarn gulp compile-build
|
||||||
|
yarn gulp compile-extensions-build
|
||||||
|
yarn gulp minify-vscode
|
||||||
|
yarn gulp minify-vscode-reh
|
||||||
|
yarn gulp minify-vscode-reh-web
|
||||||
|
displayName: Compile
|
||||||
|
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
||||||
|
|
||||||
|
- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
|
||||||
|
inputs:
|
||||||
|
keyfile: 'build/.cachesalt, .build/commit, .build/quality'
|
||||||
|
targetfolder: '.build, out-build, out-vscode-min, out-vscode-reh-min, out-vscode-reh-web-min'
|
||||||
|
vstsFeed: 'BuildCache'
|
||||||
|
platformIndependent: true
|
||||||
|
alias: 'Compilation'
|
||||||
|
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
||||||
5
build/azure-pipelines/sql-release.yml
Normal file
5
build/azure-pipelines/sql-release.yml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
steps:
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
echo "##vso[build.addbuildtag]Release"
|
||||||
|
displayName: Set For Release
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
steps:
|
steps:
|
||||||
- task: NodeTool@0
|
- task: NodeTool@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "10.15.1"
|
versionSpec: "12.13.0"
|
||||||
|
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
inputs:
|
inputs:
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ steps:
|
|||||||
|
|
||||||
- task: NodeTool@0
|
- task: NodeTool@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "10.15.1"
|
versionSpec: "12.13.0"
|
||||||
|
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
inputs:
|
inputs:
|
||||||
|
|||||||
@@ -7,12 +7,9 @@ ROOT="$REPO/.."
|
|||||||
WEB_BUILD_NAME="vscode-web"
|
WEB_BUILD_NAME="vscode-web"
|
||||||
WEB_TARBALL_FILENAME="vscode-web.tar.gz"
|
WEB_TARBALL_FILENAME="vscode-web.tar.gz"
|
||||||
WEB_TARBALL_PATH="$ROOT/$WEB_TARBALL_FILENAME"
|
WEB_TARBALL_PATH="$ROOT/$WEB_TARBALL_FILENAME"
|
||||||
BUILD="$ROOT/$WEB_BUILD_NAME"
|
|
||||||
PACKAGEJSON="$BUILD/package.json"
|
|
||||||
VERSION=$(node -p "require(\"$PACKAGEJSON\").version")
|
|
||||||
|
|
||||||
rm -rf $ROOT/vscode-web.tar.*
|
rm -rf $ROOT/vscode-web.tar.*
|
||||||
|
|
||||||
(cd $ROOT && tar --owner=0 --group=0 -czf $WEB_TARBALL_PATH $WEB_BUILD_NAME)
|
(cd $ROOT && tar --owner=0 --group=0 -czf $WEB_TARBALL_PATH $WEB_BUILD_NAME)
|
||||||
|
|
||||||
node build/azure-pipelines/common/publish.js "$VSCODE_QUALITY" "web-standalone" archive-unsigned "$WEB_TARBALL_FILENAME" "$VERSION" true "$WEB_TARBALL_PATH"
|
node build/azure-pipelines/common/createAsset.js web-standalone archive-unsigned "$WEB_TARBALL_FILENAME" "$WEB_TARBALL_PATH"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
steps:
|
steps:
|
||||||
- task: NodeTool@0
|
- task: NodeTool@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "10.15.1"
|
versionSpec: "12.13.0"
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@3 # {{SQL CARBON EDIT}} update version
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@3 # {{SQL CARBON EDIT}} update version
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "1.x"
|
versionSpec: "1.x"
|
||||||
@@ -13,39 +13,33 @@ steps:
|
|||||||
inputs:
|
inputs:
|
||||||
keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
|
keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
|
||||||
targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
|
targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
|
||||||
vstsFeed: '$(build-cache)' # {{SQL CARBON EDIT}} update build cache
|
vstsFeed: 'npm-cache' # {{SQL CARBON EDIT}} update build cache
|
||||||
- powershell: |
|
- powershell: |
|
||||||
yarn --frozen-lockfile
|
yarn --frozen-lockfile
|
||||||
env:
|
env:
|
||||||
CHILD_CONCURRENCY: "1"
|
CHILD_CONCURRENCY: "1"
|
||||||
GITHUB_TOKEN: $(GITHUB_TOKEN) # {{SQL CARBON EDIT}} add github token
|
|
||||||
displayName: Install Dependencies
|
displayName: Install Dependencies
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
||||||
- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
|
- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
|
||||||
inputs:
|
inputs:
|
||||||
keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
|
keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
|
||||||
targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
|
targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
|
||||||
vstsFeed: '$(build-cache)' # {{SQL CARBON EDIT}} update build cache
|
vstsFeed: 'npm-cache' # {{SQL CARBON EDIT}} update build cache
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
||||||
- powershell: |
|
- powershell: |
|
||||||
yarn electron
|
yarn electron
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: $(GITHUB_TOKEN) # {{SQL CARBON EDIT}} add github token
|
|
||||||
- script: |
|
- script: |
|
||||||
yarn gulp hygiene --skip-tslint
|
yarn gulp hygiene
|
||||||
displayName: Run Hygiene Checks
|
displayName: Run Hygiene Checks
|
||||||
- script: |
|
|
||||||
yarn gulp tslint
|
|
||||||
displayName: Run TSLint Checks
|
|
||||||
- script: | # {{SQL CARBON EDIT}} add step
|
- script: | # {{SQL CARBON EDIT}} add step
|
||||||
yarn tslint
|
yarn strict-vscode
|
||||||
displayName: Run TSLint (gci)
|
|
||||||
- script: | # {{SQL CARBON EDIT}} add step
|
|
||||||
yarn strict-null-check
|
|
||||||
displayName: Run Strict Null Check
|
displayName: Run Strict Null Check
|
||||||
# - powershell: | {{SQL CARBON EDIT}} remove step
|
# - powershell: | {{SQL CARBON EDIT}} remove step
|
||||||
# yarn monaco-compile-check
|
# yarn monaco-compile-check
|
||||||
# displayName: Run Monaco Editor Checks
|
# displayName: Run Monaco Editor Checks
|
||||||
|
- script: |
|
||||||
|
yarn valid-layers-check
|
||||||
|
displayName: Run Valid Layers Checks
|
||||||
- powershell: |
|
- powershell: |
|
||||||
yarn compile
|
yarn compile
|
||||||
displayName: Compile Sources
|
displayName: Compile Sources
|
||||||
@@ -64,8 +58,3 @@ steps:
|
|||||||
testResultsFiles: '*-results.xml'
|
testResultsFiles: '*-results.xml'
|
||||||
searchFolder: '$(Build.ArtifactStagingDirectory)/test-results'
|
searchFolder: '$(Build.ArtifactStagingDirectory)/test-results'
|
||||||
condition: succeededOrFailed()
|
condition: succeededOrFailed()
|
||||||
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 # {{SQL CARBON EDIT}} add task
|
|
||||||
displayName: 'Component Detection'
|
|
||||||
inputs:
|
|
||||||
alertWarningLevel: High
|
|
||||||
failOnAlert: true
|
|
||||||
|
|||||||
20
build/azure-pipelines/win32/createDrop.ps1
Normal file
20
build/azure-pipelines/win32/createDrop.ps1
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
|
||||||
|
$Arch = "x64"
|
||||||
|
|
||||||
|
$Repo = "$(pwd)"
|
||||||
|
$Root = "$Repo\.."
|
||||||
|
$LegacyServer = "$Root\azuredatastudio-reh-win32-$Arch"
|
||||||
|
$ServerName = "azuredatastudio-server-win32-$Arch"
|
||||||
|
$Server = "$Root\$ServerName"
|
||||||
|
$ServerZipLocation = "$Repo\.build\win32-$Arch\server"
|
||||||
|
$ServerZip = "$ServerZipLocation\azuredatastudio-server-win32-$Arch.zip"
|
||||||
|
|
||||||
|
# Create server archive
|
||||||
|
New-Item $ServerZipLocation -ItemType Directory # this will throw even when success for we don't want to exec this
|
||||||
|
$global:LASTEXITCODE = 0
|
||||||
|
exec { Rename-Item -Path $LegacyServer -NewName $ServerName } "Rename Item"
|
||||||
|
exec { .\node_modules\7zip\7zip-lite\7z.exe a -tzip $ServerZip $Server -r } "Zip Server"
|
||||||
|
|
||||||
|
exec { node build/azure-pipelines/common/copyArtifacts.js } "Copy Artifacts"
|
||||||
@@ -21,7 +21,7 @@ steps:
|
|||||||
|
|
||||||
- task: NodeTool@0
|
- task: NodeTool@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "10.15.1"
|
versionSpec: "12.13.0"
|
||||||
|
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
inputs:
|
inputs:
|
||||||
|
|||||||
@@ -23,14 +23,13 @@ exec { .\node_modules\7zip\7zip-lite\7z.exe a -tzip $ServerZip $Server -r }
|
|||||||
# get version
|
# get version
|
||||||
$PackageJson = Get-Content -Raw -Path "$Build\resources\app\package.json" | ConvertFrom-Json
|
$PackageJson = Get-Content -Raw -Path "$Build\resources\app\package.json" | ConvertFrom-Json
|
||||||
$Version = $PackageJson.version
|
$Version = $PackageJson.version
|
||||||
$Quality = "$env:VSCODE_QUALITY"
|
|
||||||
|
|
||||||
$AssetPlatform = if ("$Arch" -eq "ia32") { "win32" } else { "win32-x64" }
|
$AssetPlatform = if ("$Arch" -eq "ia32") { "win32" } else { "win32-x64" }
|
||||||
|
|
||||||
exec { node build/azure-pipelines/common/publish.js $Quality "$AssetPlatform-archive" archive "VSCode-win32-$Arch-$Version.zip" $Version true $Zip }
|
exec { node build/azure-pipelines/common/createAsset.js "$AssetPlatform-archive" archive "VSCode-win32-$Arch-$Version.zip" $Zip }
|
||||||
exec { node build/azure-pipelines/common/publish.js $Quality "$AssetPlatform" setup "VSCodeSetup-$Arch-$Version.exe" $Version true $SystemExe }
|
exec { node build/azure-pipelines/common/createAsset.js "$AssetPlatform" setup "VSCodeSetup-$Arch-$Version.exe" $SystemExe }
|
||||||
exec { node build/azure-pipelines/common/publish.js $Quality "$AssetPlatform-user" setup "VSCodeUserSetup-$Arch-$Version.exe" $Version true $UserExe }
|
exec { node build/azure-pipelines/common/createAsset.js "$AssetPlatform-user" setup "VSCodeUserSetup-$Arch-$Version.exe" $UserExe }
|
||||||
exec { node build/azure-pipelines/common/publish.js $Quality "server-$AssetPlatform" archive "vscode-server-win32-$Arch.zip" $Version true $ServerZip }
|
exec { node build/azure-pipelines/common/createAsset.js "server-$AssetPlatform" archive "vscode-server-win32-$Arch.zip" $ServerZip }
|
||||||
|
|
||||||
# publish hockeyapp symbols
|
# publish hockeyapp symbols
|
||||||
$hockeyAppId = if ("$Arch" -eq "ia32") { "$env:VSCODE_HOCKEYAPP_ID_WIN32" } else { "$env:VSCODE_HOCKEYAPP_ID_WIN64" }
|
$hockeyAppId = if ("$Arch" -eq "ia32") { "$env:VSCODE_HOCKEYAPP_ID_WIN32" } else { "$env:VSCODE_HOCKEYAPP_ID_WIN64" }
|
||||||
|
|||||||
270
build/azure-pipelines/win32/sql-product-build-win32.yml
Normal file
270
build/azure-pipelines/win32/sql-product-build-win32.yml
Normal file
@@ -0,0 +1,270 @@
|
|||||||
|
steps:
|
||||||
|
- powershell: |
|
||||||
|
mkdir .build -ea 0
|
||||||
|
"$env:BUILD_SOURCEVERSION" | Out-File -Encoding ascii -NoNewLine .build\commit
|
||||||
|
"$env:VSCODE_QUALITY" | Out-File -Encoding ascii -NoNewLine .build\quality
|
||||||
|
displayName: Prepare cache flag
|
||||||
|
|
||||||
|
- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
|
||||||
|
inputs:
|
||||||
|
keyfile: 'build/.cachesalt, .build/commit, .build/quality'
|
||||||
|
targetfolder: '.build, out-build, out-vscode-min, out-vscode-reh-min, out-vscode-reh-web-min'
|
||||||
|
vstsFeed: 'BuildCache'
|
||||||
|
platformIndependent: true
|
||||||
|
alias: 'Compilation'
|
||||||
|
|
||||||
|
- powershell: |
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
exit 1
|
||||||
|
displayName: Check RestoreCache
|
||||||
|
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
||||||
|
|
||||||
|
- task: NodeTool@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: "10.15.1"
|
||||||
|
|
||||||
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@3
|
||||||
|
inputs:
|
||||||
|
versionSpec: "1.x"
|
||||||
|
|
||||||
|
- task: UsePythonVersion@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: '2.x'
|
||||||
|
addToPath: true
|
||||||
|
|
||||||
|
- task: AzureKeyVault@1
|
||||||
|
displayName: 'Azure Key Vault: Get Secrets'
|
||||||
|
inputs:
|
||||||
|
azureSubscription: 'ClientToolsInfra_670062 (88d5392f-a34f-4769-b405-f597fc533613)'
|
||||||
|
KeyVaultName: ado-secrets
|
||||||
|
SecretsFilter: 'github-distro-mixin-password'
|
||||||
|
|
||||||
|
- powershell: |
|
||||||
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
"machine github.com`nlogin azuredatastudio`npassword $(github-distro-mixin-password)" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII
|
||||||
|
|
||||||
|
exec { git config user.email "andresse@microsoft.com" }
|
||||||
|
exec { git config user.name "AzureDataStudio" }
|
||||||
|
displayName: Prepare tooling
|
||||||
|
|
||||||
|
- powershell: |
|
||||||
|
git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git"
|
||||||
|
git fetch distro
|
||||||
|
git merge $(node -p "require('./package.json').distro")
|
||||||
|
displayName: Merge distro
|
||||||
|
|
||||||
|
- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
|
||||||
|
inputs:
|
||||||
|
keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
|
||||||
|
targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
|
||||||
|
vstsFeed: 'BuildCache'
|
||||||
|
|
||||||
|
- powershell: |
|
||||||
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
$env:CHILD_CONCURRENCY="1"
|
||||||
|
exec { yarn --frozen-lockfile }
|
||||||
|
displayName: Install dependencies
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: $(github-distro-mixin-password)
|
||||||
|
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
||||||
|
|
||||||
|
- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
|
||||||
|
inputs:
|
||||||
|
keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
|
||||||
|
targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
|
||||||
|
vstsFeed: 'BuildCache'
|
||||||
|
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
||||||
|
|
||||||
|
- powershell: |
|
||||||
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
exec { yarn postinstall }
|
||||||
|
displayName: Run postinstall scripts
|
||||||
|
condition: and(succeeded(), eq(variables['CacheRestored'], 'true'))
|
||||||
|
|
||||||
|
- powershell: |
|
||||||
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
exec { node build/azure-pipelines/mixin }
|
||||||
|
displayName: Mix in quality
|
||||||
|
|
||||||
|
- powershell: |
|
||||||
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
exec { yarn gulp "install-sqltoolsservice" }
|
||||||
|
displayName: Install sqltoolsservice
|
||||||
|
|
||||||
|
- powershell: |
|
||||||
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
exec { yarn gulp "package-rebuild-extensions" }
|
||||||
|
exec { yarn gulp "vscode-win32-x64-min-ci" }
|
||||||
|
exec { yarn gulp "vscode-reh-win32-x64-min-ci" }
|
||||||
|
exec { yarn gulp "vscode-reh-web-win32-x64-min-ci" }
|
||||||
|
displayName: Build
|
||||||
|
env:
|
||||||
|
VSCODE_MIXIN_PASSWORD: $(github-distro-mixin-password)
|
||||||
|
|
||||||
|
- powershell: |
|
||||||
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
exec { .\scripts\test-unstable.bat --build --coverage --reporter mocha-junit-reporter }
|
||||||
|
continueOnError: true
|
||||||
|
condition: and(succeeded(), eq(variables['RUN_UNSTABLE_TESTS'], 'true'))
|
||||||
|
displayName: Run unstable tests
|
||||||
|
|
||||||
|
- task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1
|
||||||
|
displayName: 'Sign out code'
|
||||||
|
inputs:
|
||||||
|
ConnectedServiceName: 'Code Signing'
|
||||||
|
FolderPath: '$(agent.builddirectory)/azuredatastudio-win32-x64'
|
||||||
|
Pattern: '*.exe,*.node,resources/app/node_modules.asar.unpacked/*.dll,swiftshader/*.dll,d3dcompiler_47.dll,libGLESv2.dll,ffmpeg.dll,libEGL.dll,Microsoft.SqlTools.Hosting.dll,Microsoft.SqlTools.ResourceProvider.Core.dll,Microsoft.SqlTools.ResourceProvider.DefaultImpl.dll,MicrosoftSqlToolsCredentials.dll,MicrosoftSqlToolsServiceLayer.dll,Newtonsoft.Json.dll,SqlSerializationService.dll,SqlToolsResourceProviderService.dll,Microsoft.SqlServer.*.dll,Microsoft.Data.Tools.Sql.BatchParser.dll'
|
||||||
|
signConfigType: inlineSignParams
|
||||||
|
inlineOperation: |
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"keyCode": "CP-230012",
|
||||||
|
"operationSetCode": "SigntoolSign",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"parameterName": "OpusName",
|
||||||
|
"parameterValue": "Azure Data Studio"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameterName": "OpusInfo",
|
||||||
|
"parameterValue": "https://github.com/microsoft/azuredatastudio"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameterName": "PageHash",
|
||||||
|
"parameterValue": "/NPH"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameterName": "FileDigest",
|
||||||
|
"parameterValue": "/fd sha256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameterName": "TimeStamp",
|
||||||
|
"parameterValue": "/tr \"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer\" /td sha256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"toolName": "signtool.exe",
|
||||||
|
"toolVersion": "6.2.9304.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keyCode": "CP-230012",
|
||||||
|
"operationSetCode": "SigntoolVerify",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"parameterName": "VerifyAll",
|
||||||
|
"parameterValue": "/all"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"toolName": "signtool.exe",
|
||||||
|
"toolVersion": "6.2.9304.0"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
SessionTimeout: 600
|
||||||
|
MaxConcurrency: 5
|
||||||
|
MaxRetryAttempts: 20
|
||||||
|
condition: and(succeeded(), eq(variables['signed'], true))
|
||||||
|
|
||||||
|
- powershell: |
|
||||||
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
exec { yarn gulp "vscode-win32-x64-user-setup" }
|
||||||
|
exec { yarn gulp "vscode-win32-x64-system-setup" }
|
||||||
|
exec { yarn gulp "vscode-win32-x64-archive" }
|
||||||
|
displayName: Archive & User & System setup
|
||||||
|
|
||||||
|
- task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1
|
||||||
|
displayName: 'Sign installers'
|
||||||
|
inputs:
|
||||||
|
ConnectedServiceName: 'Code Signing'
|
||||||
|
FolderPath: '.build'
|
||||||
|
Pattern: '*.exe'
|
||||||
|
signConfigType: inlineSignParams
|
||||||
|
inlineOperation: |
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"keyCode": "CP-230012",
|
||||||
|
"operationSetCode": "SigntoolSign",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"parameterName": "OpusName",
|
||||||
|
"parameterValue": "Azure Data Studio"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameterName": "OpusInfo",
|
||||||
|
"parameterValue": "https://github.com/microsoft/azuredatastudio"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameterName": "PageHash",
|
||||||
|
"parameterValue": "/NPH"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameterName": "FileDigest",
|
||||||
|
"parameterValue": "/fd sha256"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameterName": "TimeStamp",
|
||||||
|
"parameterValue": "/tr \"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer\" /td sha256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"toolName": "signtool.exe",
|
||||||
|
"toolVersion": "6.2.9304.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keyCode": "CP-230012",
|
||||||
|
"operationSetCode": "SigntoolVerify",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"parameterName": "VerifyAll",
|
||||||
|
"parameterValue": "/all"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"toolName": "signtool.exe",
|
||||||
|
"toolVersion": "6.2.9304.0"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
SessionTimeout: 600
|
||||||
|
MaxConcurrency: 5
|
||||||
|
MaxRetryAttempts: 20
|
||||||
|
condition: and(succeeded(), eq(variables['signed'], true))
|
||||||
|
|
||||||
|
- task: ArchiveFiles@2
|
||||||
|
displayName: 'Archive build scripts source'
|
||||||
|
inputs:
|
||||||
|
rootFolderOrFile: '$(Build.SourcesDirectory)/build'
|
||||||
|
archiveType: tar
|
||||||
|
archiveFile: '$(Build.BinariesDirectory)/source.tar.gz'
|
||||||
|
|
||||||
|
- task: PublishBuildArtifacts@1
|
||||||
|
displayName: 'Publish Artifact: build scripts source'
|
||||||
|
inputs:
|
||||||
|
PathtoPublish: '$(Build.BinariesDirectory)/source.tar.gz'
|
||||||
|
ArtifactName: source
|
||||||
|
|
||||||
|
- powershell: |
|
||||||
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
.\build\azure-pipelines\win32\createDrop.ps1
|
||||||
|
displayName: Create Drop
|
||||||
|
|
||||||
|
- task: PublishBuildArtifacts@1
|
||||||
|
displayName: 'Publish Artifact: drop'
|
||||||
|
|
||||||
|
- task: PublishTestResults@2
|
||||||
|
displayName: 'Publish Test Results test-results.xml'
|
||||||
|
inputs:
|
||||||
|
testResultsFiles: 'test-results.xml'
|
||||||
|
searchFolder: '$(Build.SourcesDirectory)'
|
||||||
|
failTaskOnFailedTests: true
|
||||||
|
continueOnError: true
|
||||||
|
condition: and(succeeded(), eq(variables['RUN_UNSTABLE_TESTS'], 'true'))
|
||||||
|
|
||||||
|
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
||||||
|
displayName: 'Component Detection'
|
||||||
|
inputs:
|
||||||
|
failOnAlert: true
|
||||||
99
build/azure-pipelines/win32/sql-product-test-win32.yml
Normal file
99
build/azure-pipelines/win32/sql-product-test-win32.yml
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
steps:
|
||||||
|
- task: NodeTool@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: "10.15.1"
|
||||||
|
|
||||||
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@3
|
||||||
|
inputs:
|
||||||
|
versionSpec: "1.x"
|
||||||
|
|
||||||
|
- powershell: |
|
||||||
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
$env:CHILD_CONCURRENCY="1"
|
||||||
|
exec { git clean -fxd }
|
||||||
|
displayName: Clean repo
|
||||||
|
|
||||||
|
- task: DownloadPipelineArtifact@2
|
||||||
|
inputs:
|
||||||
|
buildType: 'current'
|
||||||
|
targetPath: '$(Build.SourcesDirectory)\.build'
|
||||||
|
artifactName: drop
|
||||||
|
|
||||||
|
- powershell: |
|
||||||
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
$env:CHILD_CONCURRENCY="1"
|
||||||
|
exec { yarn --frozen-lockfile }
|
||||||
|
displayName: Install dependencies
|
||||||
|
|
||||||
|
- powershell: |
|
||||||
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
exec { .\node_modules\7zip\7zip-lite\7z.exe x $(Build.SourcesDirectory)\.build\win32-x64/archive/azuredatastudio-win32-x64.zip -o$(Agent.TempDirectory)\azuredatastudio-win32-x64 }
|
||||||
|
displayName: Unzip artifact
|
||||||
|
|
||||||
|
- task: AzureKeyVault@1
|
||||||
|
displayName: 'Azure Key Vault: SqlToolsSecretStore'
|
||||||
|
inputs:
|
||||||
|
azureSubscription: 'ClientToolsInfra_670062 (88d5392f-a34f-4769-b405-f597fc533613)'
|
||||||
|
KeyVaultName: SqlToolsSecretStore
|
||||||
|
SecretsFilter: 'ads-integration-test-azure-server,ads-integration-test-azure-server-password,ads-integration-test-azure-server-username,ads-integration-test-bdc-server,ads-integration-test-bdc-server-password,ads-integration-test-bdc-server-username,ads-integration-test-standalone-server,ads-integration-test-standalone-server-password,ads-integration-test-standalone-server-username,ads-integration-test-standalone-server-2019,ads-integration-test-standalone-server-password-2019,ads-integration-test-standalone-server-username-2019'
|
||||||
|
|
||||||
|
- powershell: |
|
||||||
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
$AppRoot = "$(Agent.TempDirectory)\azuredatastudio-win32-x64"
|
||||||
|
$AppProductJson = Get-Content -Raw -Path "$AppRoot\resources\app\product.json" | ConvertFrom-Json
|
||||||
|
$AppNameShort = $AppProductJson.nameShort
|
||||||
|
exec { $env:INTEGRATION_TEST_ELECTRON_PATH = "$AppRoot\$AppNameShort.exe"; $env:INTEGRATION_TEST_CLI_PATH = "$AppRoot\bin\$AppNameShort"; .\scripts\sql-test-integration.bat }
|
||||||
|
continueOnError: true
|
||||||
|
condition: and(succeeded(), eq(variables['RUN_TESTS'], 'true'))
|
||||||
|
displayName: Run stable tests
|
||||||
|
env:
|
||||||
|
BDC_BACKEND_USERNAME: $(ads-integration-test-bdc-server-username)
|
||||||
|
BDC_BACKEND_PWD: $(ads-integration-test-bdc-server-password)
|
||||||
|
BDC_BACKEND_HOSTNAME: $(ads-integration-test-bdc-server)
|
||||||
|
STANDALONE_SQL_USERNAME: $(ads-integration-test-standalone-server-username)
|
||||||
|
STANDALONE_SQL_PWD: $(ads-integration-test-standalone-server-password)
|
||||||
|
STANDALONE_SQL: $(ads-integration-test-standalone-server)
|
||||||
|
AZURE_SQL_USERNAME: $(ads-integration-test-azure-server-username)
|
||||||
|
AZURE_SQL_PWD: $(ads-integration-test-azure-server-password)
|
||||||
|
AZURE_SQL: $(ads-integration-test-azure-server)
|
||||||
|
STANDALONE_SQL_USERNAME_2019: $(ads-integration-test-standalone-server-username-2019)
|
||||||
|
STANDALONE_SQL_PWD_2019: $(ads-integration-test-standalone-server-password-2019)
|
||||||
|
STANDALONE_SQL_2019: $(ads-integration-test-standalone-server-2019)
|
||||||
|
|
||||||
|
- powershell: |
|
||||||
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
$AppRoot = "$(Agent.TempDirectory)\azuredatastudio-win32-x64"
|
||||||
|
$AppProductJson = Get-Content -Raw -Path "$AppRoot\resources\app\product.json" | ConvertFrom-Json
|
||||||
|
$AppNameShort = $AppProductJson.nameShort
|
||||||
|
exec { $env:INTEGRATION_TEST_ELECTRON_PATH = "$AppRoot\$AppNameShort.exe"; .\scripts\sql-test-integration-unstable.bat }
|
||||||
|
continueOnError: true
|
||||||
|
condition: and(succeeded(), eq(variables['RUN_UNSTABLE_TESTS'], 'true'))
|
||||||
|
displayName: Run unstable integration tests
|
||||||
|
env:
|
||||||
|
BDC_BACKEND_USERNAME: $(ads-integration-test-bdc-server-username)
|
||||||
|
BDC_BACKEND_PWD: $(ads-integration-test-bdc-server-password)
|
||||||
|
BDC_BACKEND_HOSTNAME: $(ads-integration-test-bdc-server)
|
||||||
|
STANDALONE_SQL_USERNAME: $(ads-integration-test-standalone-server-username)
|
||||||
|
STANDALONE_SQL_PWD: $(ads-integration-test-standalone-server-password)
|
||||||
|
STANDALONE_SQL: $(ads-integration-test-standalone-server)
|
||||||
|
AZURE_SQL_USERNAME: $(ads-integration-test-azure-server-username)
|
||||||
|
AZURE_SQL_PWD: $(ads-integration-test-azure-server-password)
|
||||||
|
AZURE_SQL: $(ads-integration-test-azure-server)
|
||||||
|
STANDALONE_SQL_USERNAME_2019: $(ads-integration-test-standalone-server-username-2019)
|
||||||
|
STANDALONE_SQL_PWD_2019: $(ads-integration-test-standalone-server-password-2019)
|
||||||
|
STANDALONE_SQL_2019: $(ads-integration-test-standalone-server-2019)
|
||||||
|
|
||||||
|
- task: PublishTestResults@2
|
||||||
|
displayName: 'Publish Integration and Smoke Test Results'
|
||||||
|
inputs:
|
||||||
|
testResultsFiles: '*.xml'
|
||||||
|
searchFolder: '$(Build.ArtifactStagingDirectory)\test-results'
|
||||||
|
mergeTestResults: true
|
||||||
|
failTaskOnFailedTests: true
|
||||||
|
continueOnError: true
|
||||||
|
condition: and(succeeded(), eq(variables['RUN_TESTS'], 'true'))
|
||||||
29
build/azure-pipelines/win32/sql-publish.ps1
Normal file
29
build/azure-pipelines/win32/sql-publish.ps1
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
Param(
|
||||||
|
[string]$sourcesDir,
|
||||||
|
[string]$artifactsDir,
|
||||||
|
[string]$storageKey,
|
||||||
|
[string]$documentDbKey
|
||||||
|
)
|
||||||
|
|
||||||
|
$env:AZURE_STORAGE_ACCESS_KEY_2 = $storageKey
|
||||||
|
$env:AZURE_DOCUMENTDB_MASTERKEY = $documentDbKey
|
||||||
|
|
||||||
|
$ExeName = "AzureDataStudioSetup.exe"
|
||||||
|
$SystemExe = "$artifactsDir\win32-x64\system-setup\$ExeName"
|
||||||
|
$UserExe = "$artifactsDir\win32-x64\user-setup\$ExeName"
|
||||||
|
$UserExeName = "AzureDataStudioUserSetup.exe"
|
||||||
|
$ZipName = "azuredatastudio-win32-x64.zip"
|
||||||
|
$Zip = "$artifactsDir\win32-x64\archive\$ZipName"
|
||||||
|
|
||||||
|
$VersionJson = Get-Content -Raw -Path "$artifactsDir\version.json" | ConvertFrom-Json
|
||||||
|
$Version = $VersionJson.version
|
||||||
|
$Quality = $VersionJson.quality
|
||||||
|
$CommitId = $VersionJson.commit
|
||||||
|
|
||||||
|
$assetPlatform = "win32-x64"
|
||||||
|
|
||||||
|
node $sourcesDir/build/azure-pipelines/common/publish.js $Quality "$assetPlatform-archive" archive $ZipName $Version true $Zip $CommitId
|
||||||
|
|
||||||
|
node $sourcesDir/build/azure-pipelines/common/publish.js $Quality "$assetPlatform" setup $ExeName $Version true $SystemExe $CommitId
|
||||||
|
|
||||||
|
node $sourcesDir/build/azure-pipelines/common/publish.js $Quality "$assetPlatform-user" setup $UserExeName $Version true $UserExe $CommitId
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"name": "Microsoft.sqlservernotebook",
|
|
||||||
"version": "0.3.2",
|
|
||||||
"repo": "https://github.com/Microsoft/azuredatastudio"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"name": "Microsoft.sqlservernotebook",
|
"name": "Microsoft.sqlservernotebook",
|
||||||
"version": "0.3.2",
|
"version": "0.3.4",
|
||||||
"repo": "https://github.com/Microsoft/azuredatastudio"
|
"repo": "https://github.com/Microsoft/azuredatastudio"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ const os = require('os');
|
|||||||
const { remote } = require('electron');
|
const { remote } = require('electron');
|
||||||
const dialog = remote.dialog;
|
const dialog = remote.dialog;
|
||||||
|
|
||||||
|
const productJsonPath = path.join(__dirname, '..', '..', 'product.json');
|
||||||
const builtInExtensionsPath = path.join(__dirname, '..', 'builtInExtensions.json');
|
const builtInExtensionsPath = path.join(__dirname, '..', 'builtInExtensions.json');
|
||||||
const controlFilePath = path.join(os.homedir(), '.vscode-oss-dev', 'extensions', 'control.json');
|
const controlFilePath = path.join(os.homedir(), '.vscode-oss-dev', 'extensions', 'control.json');
|
||||||
|
|
||||||
@@ -51,6 +52,7 @@ function render(el, state) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const ul = document.createElement('ul');
|
const ul = document.createElement('ul');
|
||||||
|
const { quality } = readJson(productJsonPath);
|
||||||
const { builtin, control } = state;
|
const { builtin, control } = state;
|
||||||
|
|
||||||
for (const ext of builtin) {
|
for (const ext of builtin) {
|
||||||
@@ -61,6 +63,10 @@ function render(el, state) {
|
|||||||
|
|
||||||
const name = document.createElement('code');
|
const name = document.createElement('code');
|
||||||
name.textContent = ext.name;
|
name.textContent = ext.name;
|
||||||
|
if (quality && ext.forQualities && !ext.forQualities.includes(quality)) {
|
||||||
|
name.textContent += ` (only on ${ext.forQualities.join(', ')})`;
|
||||||
|
}
|
||||||
|
|
||||||
li.appendChild(name);
|
li.appendChild(name);
|
||||||
|
|
||||||
const form = document.createElement('form');
|
const form = document.createElement('form');
|
||||||
@@ -123,4 +129,4 @@ function main() {
|
|||||||
render(el, { builtin, control });
|
render(el, { builtin, control });
|
||||||
}
|
}
|
||||||
|
|
||||||
window.onload = main;
|
window.onload = main;
|
||||||
|
|||||||
@@ -17,14 +17,14 @@ const compilation = require('./lib/compilation');
|
|||||||
const monacoapi = require('./monaco/api');
|
const monacoapi = require('./monaco/api');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
|
||||||
var root = path.dirname(__dirname);
|
let root = path.dirname(__dirname);
|
||||||
var sha1 = util.getVersion(root);
|
let sha1 = util.getVersion(root);
|
||||||
var semver = require('./monaco/package.json').version;
|
let semver = require('./monaco/package.json').version;
|
||||||
var headerVersion = semver + '(' + sha1 + ')';
|
let headerVersion = semver + '(' + sha1 + ')';
|
||||||
|
|
||||||
// Build
|
// Build
|
||||||
|
|
||||||
var editorEntryPoints = [
|
let editorEntryPoints = [
|
||||||
{
|
{
|
||||||
name: 'vs/editor/editor.main',
|
name: 'vs/editor/editor.main',
|
||||||
include: [],
|
include: [],
|
||||||
@@ -40,11 +40,11 @@ var editorEntryPoints = [
|
|||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
var editorResources = [
|
let editorResources = [
|
||||||
'out-editor-build/vs/base/browser/ui/codiconLabel/**/*.ttf'
|
'out-editor-build/vs/base/browser/ui/codiconLabel/**/*.ttf'
|
||||||
];
|
];
|
||||||
|
|
||||||
var BUNDLED_FILE_HEADER = [
|
let BUNDLED_FILE_HEADER = [
|
||||||
'/*!-----------------------------------------------------------',
|
'/*!-----------------------------------------------------------',
|
||||||
' * Copyright (c) Microsoft Corporation. All rights reserved.',
|
' * Copyright (c) Microsoft Corporation. All rights reserved.',
|
||||||
' * Version: ' + headerVersion,
|
' * Version: ' + headerVersion,
|
||||||
@@ -57,7 +57,6 @@ var BUNDLED_FILE_HEADER = [
|
|||||||
const languages = i18n.defaultLanguages.concat([]); // i18n.defaultLanguages.concat(process.env.VSCODE_QUALITY !== 'stable' ? i18n.extraLanguages : []);
|
const languages = i18n.defaultLanguages.concat([]); // i18n.defaultLanguages.concat(process.env.VSCODE_QUALITY !== 'stable' ? i18n.extraLanguages : []);
|
||||||
|
|
||||||
const extractEditorSrcTask = task.define('extract-editor-src', () => {
|
const extractEditorSrcTask = task.define('extract-editor-src', () => {
|
||||||
console.log(`If the build fails, consider tweaking shakeLevel below to a lower value.`);
|
|
||||||
const apiusages = monacoapi.execute().usageContent;
|
const apiusages = monacoapi.execute().usageContent;
|
||||||
const extrausages = fs.readFileSync(path.join(root, 'build', 'monaco', 'monaco.usage.recipe')).toString();
|
const extrausages = fs.readFileSync(path.join(root, 'build', 'monaco', 'monaco.usage.recipe')).toString();
|
||||||
standalone.extractEditor({
|
standalone.extractEditor({
|
||||||
@@ -71,14 +70,6 @@ const extractEditorSrcTask = task.define('extract-editor-src', () => {
|
|||||||
apiusages,
|
apiusages,
|
||||||
extrausages
|
extrausages
|
||||||
],
|
],
|
||||||
typings: [
|
|
||||||
'typings/lib.ie11_safe_es6.d.ts',
|
|
||||||
'typings/thenable.d.ts',
|
|
||||||
'typings/es6-promise.d.ts',
|
|
||||||
'typings/require-monaco.d.ts',
|
|
||||||
"typings/lib.es2018.promise.d.ts",
|
|
||||||
'vs/monaco.d.ts'
|
|
||||||
],
|
|
||||||
libs: [
|
libs: [
|
||||||
`lib.es5.d.ts`,
|
`lib.es5.d.ts`,
|
||||||
`lib.dom.d.ts`,
|
`lib.dom.d.ts`,
|
||||||
@@ -86,7 +77,8 @@ const extractEditorSrcTask = task.define('extract-editor-src', () => {
|
|||||||
],
|
],
|
||||||
shakeLevel: 2, // 0-Files, 1-InnerFile, 2-ClassMembers
|
shakeLevel: 2, // 0-Files, 1-InnerFile, 2-ClassMembers
|
||||||
importIgnorePattern: /(^vs\/css!)|(promise-polyfill\/polyfill)/,
|
importIgnorePattern: /(^vs\/css!)|(promise-polyfill\/polyfill)/,
|
||||||
destRoot: path.join(root, 'out-editor-src')
|
destRoot: path.join(root, 'out-editor-src'),
|
||||||
|
redirects: []
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -137,23 +129,75 @@ const createESMSourcesAndResourcesTask = task.define('extract-editor-esm', () =>
|
|||||||
});
|
});
|
||||||
|
|
||||||
const compileEditorESMTask = task.define('compile-editor-esm', () => {
|
const compileEditorESMTask = task.define('compile-editor-esm', () => {
|
||||||
|
console.log(`Launching the TS compiler at ${path.join(__dirname, '../out-editor-esm')}...`);
|
||||||
|
let result;
|
||||||
if (process.platform === 'win32') {
|
if (process.platform === 'win32') {
|
||||||
const result = cp.spawnSync(`..\\node_modules\\.bin\\tsc.cmd`, {
|
result = cp.spawnSync(`..\\node_modules\\.bin\\tsc.cmd`, {
|
||||||
cwd: path.join(__dirname, '../out-editor-esm')
|
cwd: path.join(__dirname, '../out-editor-esm')
|
||||||
});
|
});
|
||||||
console.log(result.stdout.toString());
|
|
||||||
console.log(result.stderr.toString());
|
|
||||||
} else {
|
} else {
|
||||||
const result = cp.spawnSync(`node`, [`../node_modules/.bin/tsc`], {
|
result = cp.spawnSync(`node`, [`../node_modules/.bin/tsc`], {
|
||||||
cwd: path.join(__dirname, '../out-editor-esm')
|
cwd: path.join(__dirname, '../out-editor-esm')
|
||||||
});
|
});
|
||||||
console.log(result.stdout.toString());
|
}
|
||||||
console.log(result.stderr.toString());
|
|
||||||
|
console.log(result.stdout.toString());
|
||||||
|
console.log(result.stderr.toString());
|
||||||
|
|
||||||
|
if (result.status !== 0) {
|
||||||
|
console.log(`The TS Compilation failed, preparing analysis folder...`);
|
||||||
|
const destPath = path.join(__dirname, '../../vscode-monaco-editor-esm-analysis');
|
||||||
|
return util.rimraf(destPath)().then(() => {
|
||||||
|
fs.mkdirSync(destPath);
|
||||||
|
|
||||||
|
// initialize a new repository
|
||||||
|
cp.spawnSync(`git`, [`init`], {
|
||||||
|
cwd: destPath
|
||||||
|
});
|
||||||
|
|
||||||
|
// build a list of files to copy
|
||||||
|
const files = util.rreddir(path.join(__dirname, '../out-editor-esm'));
|
||||||
|
|
||||||
|
// copy files from src
|
||||||
|
for (const file of files) {
|
||||||
|
const srcFilePath = path.join(__dirname, '../src', file);
|
||||||
|
const dstFilePath = path.join(destPath, file);
|
||||||
|
if (fs.existsSync(srcFilePath)) {
|
||||||
|
util.ensureDir(path.dirname(dstFilePath));
|
||||||
|
const contents = fs.readFileSync(srcFilePath).toString().replace(/\r\n|\r|\n/g, '\n');
|
||||||
|
fs.writeFileSync(dstFilePath, contents);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// create an initial commit to diff against
|
||||||
|
cp.spawnSync(`git`, [`add`, `.`], {
|
||||||
|
cwd: destPath
|
||||||
|
});
|
||||||
|
|
||||||
|
// create the commit
|
||||||
|
cp.spawnSync(`git`, [`commit`, `-m`, `"original sources"`, `--no-gpg-sign`], {
|
||||||
|
cwd: destPath
|
||||||
|
});
|
||||||
|
|
||||||
|
// copy files from esm
|
||||||
|
for (const file of files) {
|
||||||
|
const srcFilePath = path.join(__dirname, '../out-editor-esm', file);
|
||||||
|
const dstFilePath = path.join(destPath, file);
|
||||||
|
if (fs.existsSync(srcFilePath)) {
|
||||||
|
util.ensureDir(path.dirname(dstFilePath));
|
||||||
|
const contents = fs.readFileSync(srcFilePath).toString().replace(/\r\n|\r|\n/g, '\n');
|
||||||
|
fs.writeFileSync(dstFilePath, contents);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Open in VS Code the folder at '${destPath}' and you can alayze the compilation error`);
|
||||||
|
throw new Error('Standalone Editor compilation failed. If this is the build machine, simply launch `yarn run gulp editor-distro` on your machine to further analyze the compilation problem.');
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
function toExternalDTS(contents) {
|
function toExternalDTS(contents) {
|
||||||
let lines = contents.split('\n');
|
let lines = contents.split(/\r\n|\r|\n/);
|
||||||
let killNextCloseCurlyBrace = false;
|
let killNextCloseCurlyBrace = false;
|
||||||
for (let i = 0; i < lines.length; i++) {
|
for (let i = 0; i < lines.length; i++) {
|
||||||
let line = lines[i];
|
let line = lines[i];
|
||||||
@@ -219,7 +263,7 @@ const finalEditorResourcesTask = task.define('final-editor-resources', () => {
|
|||||||
// package.json
|
// package.json
|
||||||
gulp.src('build/monaco/package.json')
|
gulp.src('build/monaco/package.json')
|
||||||
.pipe(es.through(function (data) {
|
.pipe(es.through(function (data) {
|
||||||
var json = JSON.parse(data.contents.toString());
|
let json = JSON.parse(data.contents.toString());
|
||||||
json.private = false;
|
json.private = false;
|
||||||
data.contents = Buffer.from(JSON.stringify(json, null, ' '));
|
data.contents = Buffer.from(JSON.stringify(json, null, ' '));
|
||||||
this.emit('data', data);
|
this.emit('data', data);
|
||||||
@@ -263,10 +307,10 @@ const finalEditorResourcesTask = task.define('final-editor-resources', () => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var relativePathToMap = path.relative(path.join(data.relative), path.join('min-maps', data.relative + '.map'));
|
let relativePathToMap = path.relative(path.join(data.relative), path.join('min-maps', data.relative + '.map'));
|
||||||
|
|
||||||
var strContents = data.contents.toString();
|
let strContents = data.contents.toString();
|
||||||
var newStr = '//# sourceMappingURL=' + relativePathToMap.replace(/\\/g, '/');
|
let newStr = '//# sourceMappingURL=' + relativePathToMap.replace(/\\/g, '/');
|
||||||
strContents = strContents.replace(/\/\/# sourceMappingURL=[^ ]+$/, newStr);
|
strContents = strContents.replace(/\/\/# sourceMappingURL=[^ ]+$/, newStr);
|
||||||
|
|
||||||
data.contents = Buffer.from(strContents);
|
data.contents = Buffer.from(strContents);
|
||||||
@@ -309,6 +353,13 @@ gulp.task('editor-distro',
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
gulp.task('monacodts', task.define('monacodts', () => {
|
||||||
|
const result = monacoapi.execute();
|
||||||
|
fs.writeFileSync(result.filePath, result.content);
|
||||||
|
fs.writeFileSync(path.join(root, 'src/vs/editor/common/standalone/standaloneEnums.ts'), result.enums);
|
||||||
|
return Promise.resolve(true);
|
||||||
|
}));
|
||||||
|
|
||||||
//#region monaco type checking
|
//#region monaco type checking
|
||||||
|
|
||||||
function createTscCompileTask(watch) {
|
function createTscCompileTask(watch) {
|
||||||
|
|||||||
@@ -115,7 +115,8 @@ const tasks = compilations.map(function (tsconfigFile) {
|
|||||||
|
|
||||||
const compileTask = task.define(`compile-extension:${name}`, task.series(cleanTask, () => {
|
const compileTask = task.define(`compile-extension:${name}`, task.series(cleanTask, () => {
|
||||||
const pipeline = createPipeline(sqlLocalizedExtensions.includes(name), true); // {{SQL CARBON EDIT}}
|
const pipeline = createPipeline(sqlLocalizedExtensions.includes(name), true); // {{SQL CARBON EDIT}}
|
||||||
const input = pipeline.tsProjectSrc();
|
const nonts = gulp.src(src, srcOpts).pipe(filter(['**', '!**/*.ts']));
|
||||||
|
const input = es.merge(nonts, pipeline.tsProjectSrc());
|
||||||
|
|
||||||
return input
|
return input
|
||||||
.pipe(pipeline())
|
.pipe(pipeline())
|
||||||
@@ -124,7 +125,8 @@ const tasks = compilations.map(function (tsconfigFile) {
|
|||||||
|
|
||||||
const watchTask = task.define(`watch-extension:${name}`, task.series(cleanTask, () => {
|
const watchTask = task.define(`watch-extension:${name}`, task.series(cleanTask, () => {
|
||||||
const pipeline = createPipeline(false);
|
const pipeline = createPipeline(false);
|
||||||
const input = pipeline.tsProjectSrc();
|
const nonts = gulp.src(src, srcOpts).pipe(filter(['**', '!**/*.ts']));
|
||||||
|
const input = es.merge(nonts, pipeline.tsProjectSrc());
|
||||||
const watchInput = watcher(src, { ...srcOpts, ...{ readDelay: 200 } });
|
const watchInput = watcher(src, { ...srcOpts, ...{ readDelay: 200 } });
|
||||||
|
|
||||||
return watchInput
|
return watchInput
|
||||||
@@ -134,7 +136,8 @@ const tasks = compilations.map(function (tsconfigFile) {
|
|||||||
|
|
||||||
const compileBuildTask = task.define(`compile-build-extension-${name}`, task.series(cleanTask, () => {
|
const compileBuildTask = task.define(`compile-build-extension-${name}`, task.series(cleanTask, () => {
|
||||||
const pipeline = createPipeline(true, true);
|
const pipeline = createPipeline(true, true);
|
||||||
const input = pipeline.tsProjectSrc();
|
const nonts = gulp.src(src, srcOpts).pipe(filter(['**', '!**/*.ts']));
|
||||||
|
const input = es.merge(nonts, pipeline.tsProjectSrc());
|
||||||
|
|
||||||
return input
|
return input
|
||||||
.pipe(pipeline())
|
.pipe(pipeline())
|
||||||
|
|||||||
@@ -8,10 +8,8 @@
|
|||||||
const gulp = require('gulp');
|
const gulp = require('gulp');
|
||||||
const filter = require('gulp-filter');
|
const filter = require('gulp-filter');
|
||||||
const es = require('event-stream');
|
const es = require('event-stream');
|
||||||
const gulptslint = require('gulp-tslint');
|
|
||||||
const gulpeslint = require('gulp-eslint');
|
const gulpeslint = require('gulp-eslint');
|
||||||
const tsfmt = require('typescript-formatter');
|
const tsfmt = require('typescript-formatter');
|
||||||
const tslint = require('tslint');
|
|
||||||
const VinylFile = require('vinyl');
|
const VinylFile = require('vinyl');
|
||||||
const vfs = require('vinyl-fs');
|
const vfs = require('vinyl-fs');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
@@ -87,7 +85,7 @@ const indentationFilter = [
|
|||||||
'!src/typings/**/*.d.ts',
|
'!src/typings/**/*.d.ts',
|
||||||
'!extensions/**/*.d.ts',
|
'!extensions/**/*.d.ts',
|
||||||
'!**/*.{svg,exe,png,bmp,scpt,bat,cmd,cur,ttf,woff,eot,md,ps1,template,yaml,yml,d.ts.recipe,ico,icns}',
|
'!**/*.{svg,exe,png,bmp,scpt,bat,cmd,cur,ttf,woff,eot,md,ps1,template,yaml,yml,d.ts.recipe,ico,icns}',
|
||||||
'!build/{lib,tslintRules,download}/**/*.js',
|
'!build/{lib,download}/**/*.js',
|
||||||
'!build/**/*.sh',
|
'!build/**/*.sh',
|
||||||
'!build/azure-pipelines/**/*.js',
|
'!build/azure-pipelines/**/*.js',
|
||||||
'!build/azure-pipelines/**/*.config',
|
'!build/azure-pipelines/**/*.config',
|
||||||
@@ -103,6 +101,7 @@ const indentationFilter = [
|
|||||||
'!extensions/admin-tool-ext-win/ssmsmin/**',
|
'!extensions/admin-tool-ext-win/ssmsmin/**',
|
||||||
'!extensions/resource-deployment/notebooks/**',
|
'!extensions/resource-deployment/notebooks/**',
|
||||||
'!extensions/mssql/notebooks/**',
|
'!extensions/mssql/notebooks/**',
|
||||||
|
'!extensions/integration-tests/testData/**',
|
||||||
'!extensions/big-data-cluster/src/bigDataCluster/controller/apiGenerated.ts',
|
'!extensions/big-data-cluster/src/bigDataCluster/controller/apiGenerated.ts',
|
||||||
'!extensions/big-data-cluster/src/bigDataCluster/controller/clusterApiGenerated2.ts'
|
'!extensions/big-data-cluster/src/bigDataCluster/controller/clusterApiGenerated2.ts'
|
||||||
];
|
];
|
||||||
@@ -125,6 +124,7 @@ const copyrightFilter = [
|
|||||||
'!**/*.opts',
|
'!**/*.opts',
|
||||||
'!**/*.disabled',
|
'!**/*.disabled',
|
||||||
'!**/*.code-workspace',
|
'!**/*.code-workspace',
|
||||||
|
'!**/*.js.map',
|
||||||
'!**/promise-polyfill/polyfill.js',
|
'!**/promise-polyfill/polyfill.js',
|
||||||
'!build/**/*.init',
|
'!build/**/*.init',
|
||||||
'!resources/linux/snap/snapcraft.yaml',
|
'!resources/linux/snap/snapcraft.yaml',
|
||||||
@@ -139,26 +139,26 @@ const copyrightFilter = [
|
|||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
'!extensions/notebook/src/intellisense/text.ts',
|
'!extensions/notebook/src/intellisense/text.ts',
|
||||||
'!extensions/mssql/src/hdfs/webhdfs.ts',
|
'!extensions/mssql/src/hdfs/webhdfs.ts',
|
||||||
'!src/sql/workbench/parts/notebook/browser/outputs/tableRenderers.ts',
|
'!src/sql/workbench/contrib/notebook/browser/outputs/tableRenderers.ts',
|
||||||
'!src/sql/workbench/parts/notebook/common/models/url.ts',
|
'!src/sql/workbench/contrib/notebook/common/models/url.ts',
|
||||||
'!src/sql/workbench/parts/notebook/browser/models/renderMimeInterfaces.ts',
|
'!src/sql/workbench/contrib/notebook/browser/models/renderMimeInterfaces.ts',
|
||||||
'!src/sql/workbench/parts/notebook/browser/models/outputProcessor.ts',
|
'!src/sql/workbench/contrib/notebook/browser/models/outputProcessor.ts',
|
||||||
'!src/sql/workbench/parts/notebook/browser/models/mimemodel.ts',
|
'!src/sql/workbench/contrib/notebook/browser/models/mimemodel.ts',
|
||||||
'!src/sql/workbench/parts/notebook/browser/cellViews/media/*.css',
|
'!src/sql/workbench/contrib/notebook/browser/cellViews/media/*.css',
|
||||||
'!src/sql/base/browser/ui/table/plugins/rowSelectionModel.plugin.ts',
|
'!src/sql/base/browser/ui/table/plugins/rowSelectionModel.plugin.ts',
|
||||||
'!src/sql/base/browser/ui/table/plugins/rowDetailView.ts',
|
'!src/sql/base/browser/ui/table/plugins/rowDetailView.ts',
|
||||||
'!src/sql/base/browser/ui/table/plugins/headerFilter.plugin.ts',
|
'!src/sql/base/browser/ui/table/plugins/headerFilter.plugin.ts',
|
||||||
'!src/sql/base/browser/ui/table/plugins/checkboxSelectColumn.plugin.ts',
|
'!src/sql/base/browser/ui/table/plugins/checkboxSelectColumn.plugin.ts',
|
||||||
'!src/sql/base/browser/ui/table/plugins/cellSelectionModel.plugin.ts',
|
'!src/sql/base/browser/ui/table/plugins/cellSelectionModel.plugin.ts',
|
||||||
'!src/sql/base/browser/ui/table/plugins/autoSizeColumns.plugin.ts',
|
'!src/sql/base/browser/ui/table/plugins/autoSizeColumns.plugin.ts',
|
||||||
'!src/sql/workbench/parts/notebook/browser/outputs/sanitizer.ts',
|
'!src/sql/workbench/contrib/notebook/browser/outputs/sanitizer.ts',
|
||||||
'!src/sql/workbench/parts/notebook/browser/outputs/renderers.ts',
|
'!src/sql/workbench/contrib/notebook/browser/outputs/renderers.ts',
|
||||||
'!src/sql/workbench/parts/notebook/browser/outputs/registry.ts',
|
'!src/sql/workbench/contrib/notebook/browser/outputs/registry.ts',
|
||||||
'!src/sql/workbench/parts/notebook/browser/outputs/factories.ts',
|
'!src/sql/workbench/contrib/notebook/browser/outputs/factories.ts',
|
||||||
'!src/sql/workbench/parts/notebook/common/models/nbformat.ts',
|
'!src/sql/workbench/contrib/notebook/common/models/nbformat.ts',
|
||||||
'!extensions/markdown-language-features/media/tomorrow.css',
|
'!extensions/markdown-language-features/media/tomorrow.css',
|
||||||
'!src/sql/workbench/browser/modelComponents/media/highlight.css',
|
'!src/sql/workbench/browser/modelComponents/media/highlight.css',
|
||||||
'!src/sql/workbench/parts/notebook/electron-browser/cellViews/media/highlight.css',
|
'!src/sql/workbench/contrib/notebook/electron-browser/cellViews/media/highlight.css',
|
||||||
'!extensions/mssql/sqltoolsservice/**',
|
'!extensions/mssql/sqltoolsservice/**',
|
||||||
'!extensions/import/flatfileimportservice/**',
|
'!extensions/import/flatfileimportservice/**',
|
||||||
'!extensions/notebook/src/prompts/**',
|
'!extensions/notebook/src/prompts/**',
|
||||||
@@ -171,7 +171,7 @@ const copyrightFilter = [
|
|||||||
'!**/*.bacpac'
|
'!**/*.bacpac'
|
||||||
];
|
];
|
||||||
|
|
||||||
const eslintFilter = [
|
const jsHygieneFilter = [
|
||||||
'src/**/*.js',
|
'src/**/*.js',
|
||||||
'build/gulpfile.*.js',
|
'build/gulpfile.*.js',
|
||||||
'!src/vs/loader.js',
|
'!src/vs/loader.js',
|
||||||
@@ -184,7 +184,10 @@ const eslintFilter = [
|
|||||||
'!**/test/**'
|
'!**/test/**'
|
||||||
];
|
];
|
||||||
|
|
||||||
const tslintBaseFilter = [
|
const tsHygieneFilter = [
|
||||||
|
'src/**/*.ts',
|
||||||
|
'test/**/*.ts',
|
||||||
|
'extensions/**/*.ts',
|
||||||
'!**/fixtures/**',
|
'!**/fixtures/**',
|
||||||
'!**/typings/**',
|
'!**/typings/**',
|
||||||
'!**/node_modules/**',
|
'!**/node_modules/**',
|
||||||
@@ -194,67 +197,18 @@ const tslintBaseFilter = [
|
|||||||
'!extensions/**/*.test.ts',
|
'!extensions/**/*.test.ts',
|
||||||
'!extensions/html-language-features/server/lib/jquery.d.ts',
|
'!extensions/html-language-features/server/lib/jquery.d.ts',
|
||||||
'!extensions/big-data-cluster/src/bigDataCluster/controller/apiGenerated.ts', // {{SQL CARBON EDIT}},
|
'!extensions/big-data-cluster/src/bigDataCluster/controller/apiGenerated.ts', // {{SQL CARBON EDIT}},
|
||||||
'!extensions/big-data-cluster/src/bigDataCluster/controller/tokenApiGenerated.ts' // {{SQL CARBON EDIT}},
|
'!extensions/big-data-cluster/src/bigDataCluster/controller/tokenApiGenerated.ts', // {{SQL CARBON EDIT}},
|
||||||
|
'!src/vs/workbench/services/themes/common/textMateScopeMatcher.ts', // {{SQL CARBON EDIT}} skip this because we have no plans on touching this and its not ours
|
||||||
|
'!src/vs/workbench/contrib/extensions/browser/extensionTipsService.ts' // {{SQL CARBON EDIT}} skip this because known issue
|
||||||
];
|
];
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}}
|
const sqlHygieneFilter = [ // for rules we want to only apply to our code
|
||||||
const sqlFilter = [
|
'src/sql/**/*.ts',
|
||||||
'src/sql/**',
|
'!**/node_modules/**',
|
||||||
'extensions/**',
|
|
||||||
// Ignore VS Code extensions
|
|
||||||
'!extensions/bat/**',
|
|
||||||
'!extensions/configuration-editing/**',
|
|
||||||
'!extensions/docker/**',
|
|
||||||
'!extensions/extension-editing/**',
|
|
||||||
'!extensions/git/**',
|
|
||||||
'!extensions/git-ui/**',
|
|
||||||
'!extensions/image-preview/**',
|
|
||||||
'!extensions/insights-default/**',
|
|
||||||
'!extensions/json/**',
|
|
||||||
'!extensions/json-language-features/**',
|
|
||||||
'!extensions/markdown-basics/**',
|
|
||||||
'!extensions/markdown-language-features/**',
|
|
||||||
'!extensions/merge-conflict/**',
|
|
||||||
'!extensions/powershell/**',
|
|
||||||
'!extensions/python/**',
|
|
||||||
'!extensions/r/**',
|
|
||||||
'!extensions/theme-*/**',
|
|
||||||
'!extensions/vscode-*/**',
|
|
||||||
'!extensions/xml/**',
|
|
||||||
'!extensions/xml-language-features/**',
|
|
||||||
'!extensions/yarml/**',
|
|
||||||
];
|
|
||||||
|
|
||||||
const tslintCoreFilter = [
|
|
||||||
'src/**/*.ts',
|
|
||||||
'test/**/*.ts',
|
|
||||||
'!extensions/**/*.ts',
|
|
||||||
'!test/automation/**',
|
|
||||||
'!test/smoke/**',
|
|
||||||
...tslintBaseFilter
|
|
||||||
];
|
|
||||||
|
|
||||||
const tslintExtensionsFilter = [
|
|
||||||
'extensions/**/*.ts',
|
'extensions/**/*.ts',
|
||||||
'!src/**/*.ts',
|
'!extensions/{git,search-result,vscode-test-resolver,extension-editing,json-language-features,vscode-colorize-tests}/**/*.ts',
|
||||||
'!test/**/*.ts',
|
|
||||||
'test/automation/**/*.ts',
|
|
||||||
...tslintBaseFilter
|
|
||||||
];
|
];
|
||||||
|
|
||||||
const tslintHygieneFilter = [
|
|
||||||
'src/**/*.ts',
|
|
||||||
'test/**/*.ts',
|
|
||||||
'extensions/**/*.ts',
|
|
||||||
...tslintBaseFilter
|
|
||||||
];
|
|
||||||
|
|
||||||
const fileLengthFilter = filter([
|
|
||||||
'**',
|
|
||||||
'!extensions/import/*.docx',
|
|
||||||
'!extensions/admin-tool-ext-win/license/**'
|
|
||||||
], {restore: true});
|
|
||||||
|
|
||||||
const copyrightHeaderLines = [
|
const copyrightHeaderLines = [
|
||||||
'/*---------------------------------------------------------------------------------------------',
|
'/*---------------------------------------------------------------------------------------------',
|
||||||
' * Copyright (c) Microsoft Corporation. All rights reserved.',
|
' * Copyright (c) Microsoft Corporation. All rights reserved.',
|
||||||
@@ -264,27 +218,17 @@ const copyrightHeaderLines = [
|
|||||||
|
|
||||||
gulp.task('eslint', () => {
|
gulp.task('eslint', () => {
|
||||||
return vfs.src(all, { base: '.', follow: true, allowEmpty: true })
|
return vfs.src(all, { base: '.', follow: true, allowEmpty: true })
|
||||||
.pipe(filter(eslintFilter))
|
.pipe(filter(jsHygieneFilter.concat(tsHygieneFilter)))
|
||||||
.pipe(gulpeslint('src/.eslintrc'))
|
.pipe(gulpeslint({
|
||||||
|
configFile: '.eslintrc.json',
|
||||||
|
rulePaths: ['./build/lib/eslint']
|
||||||
|
}))
|
||||||
.pipe(gulpeslint.formatEach('compact'))
|
.pipe(gulpeslint.formatEach('compact'))
|
||||||
.pipe(gulpeslint.failAfterError());
|
.pipe(gulpeslint.results(results => {
|
||||||
});
|
if (results.warningCount > 0 || results.errorCount > 0) {
|
||||||
|
throw new Error('eslint failed with warnings and/or errors');
|
||||||
gulp.task('tslint', () => {
|
}
|
||||||
return es.merge([
|
}));
|
||||||
|
|
||||||
// Core: include type information (required by certain rules like no-nodejs-globals)
|
|
||||||
vfs.src(all, { base: '.', follow: true, allowEmpty: true })
|
|
||||||
.pipe(filter(tslintCoreFilter))
|
|
||||||
.pipe(gulptslint.default({ rulesDirectory: 'build/lib/tslint', program: tslint.Linter.createProgram('src/tsconfig.json') }))
|
|
||||||
.pipe(gulptslint.default.report({ emitError: true })),
|
|
||||||
|
|
||||||
// Exenstions: do not include type information
|
|
||||||
vfs.src(all, { base: '.', follow: true, allowEmpty: true })
|
|
||||||
.pipe(filter(tslintExtensionsFilter))
|
|
||||||
.pipe(gulptslint.default({ rulesDirectory: 'build/lib/tslint' }))
|
|
||||||
.pipe(gulptslint.default.report({ emitError: true }))
|
|
||||||
]).pipe(es.through());
|
|
||||||
});
|
});
|
||||||
|
|
||||||
function checkPackageJSON(actualPath) {
|
function checkPackageJSON(actualPath) {
|
||||||
@@ -306,7 +250,7 @@ function checkPackageJSON(actualPath) {
|
|||||||
|
|
||||||
const checkPackageJSONTask = task.define('check-package-json', () => {
|
const checkPackageJSONTask = task.define('check-package-json', () => {
|
||||||
return gulp.src('package.json')
|
return gulp.src('package.json')
|
||||||
.pipe(es.through(function() {
|
.pipe(es.through(function () {
|
||||||
checkPackageJSON.call(this, 'remote/package.json');
|
checkPackageJSON.call(this, 'remote/package.json');
|
||||||
checkPackageJSON.call(this, 'remote/web/package.json');
|
checkPackageJSON.call(this, 'remote/web/package.json');
|
||||||
}));
|
}));
|
||||||
@@ -373,8 +317,6 @@ function hygiene(some) {
|
|||||||
replace: undefined,
|
replace: undefined,
|
||||||
tsconfig: undefined,
|
tsconfig: undefined,
|
||||||
tsconfigFile: undefined,
|
tsconfigFile: undefined,
|
||||||
tslint: undefined,
|
|
||||||
tslintFile: undefined,
|
|
||||||
tsfmtFile: undefined,
|
tsfmtFile: undefined,
|
||||||
vscode: undefined,
|
vscode: undefined,
|
||||||
vscodeFile: undefined
|
vscodeFile: undefined
|
||||||
@@ -383,7 +325,7 @@ function hygiene(some) {
|
|||||||
let formatted = result.dest.replace(/\r\n/gm, '\n');
|
let formatted = result.dest.replace(/\r\n/gm, '\n');
|
||||||
|
|
||||||
if (original !== formatted) {
|
if (original !== formatted) {
|
||||||
console.error("File not formatted. Run the 'Format Document' command to fix it:", file.relative);
|
console.error('File not formatted. Run the \'Format Document\' command to fix it:', file.relative);
|
||||||
errorCount++;
|
errorCount++;
|
||||||
}
|
}
|
||||||
cb(null, file);
|
cb(null, file);
|
||||||
@@ -393,57 +335,22 @@ function hygiene(some) {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
const filelength = es.through(function (file) {
|
|
||||||
|
|
||||||
const fileName = path.basename(file.relative);
|
|
||||||
const fileDir = path.dirname(file.relative);
|
|
||||||
//check the filename is < 50 characters (basename gets the filename with extension).
|
|
||||||
if (fileName.length > 50) {
|
|
||||||
console.error(`File name '${fileName}' under ${fileDir} is too long. Rename file to have less than 50 characters.`);
|
|
||||||
errorCount++;
|
|
||||||
}
|
|
||||||
if (file.relative.length > 150) {
|
|
||||||
console.error(`File path ${file.relative} exceeds acceptable file-length. Rename the path to have less than 150 characters.`);
|
|
||||||
errorCount++;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.emit('data', file);
|
|
||||||
});
|
|
||||||
|
|
||||||
const tslintConfiguration = tslint.Configuration.findConfiguration('tslint.json', '.');
|
|
||||||
const tslintOptions = { fix: false, formatter: 'json' };
|
|
||||||
const tsLinter = new tslint.Linter(tslintOptions);
|
|
||||||
|
|
||||||
const tsl = es.through(function (file) {
|
|
||||||
const contents = file.contents.toString('utf8');
|
|
||||||
tsLinter.lint(file.relative, contents, tslintConfiguration.results);
|
|
||||||
this.emit('data', file);
|
|
||||||
});
|
|
||||||
|
|
||||||
let input;
|
let input;
|
||||||
|
|
||||||
if (Array.isArray(some) || typeof some === 'string' || !some) {
|
if (Array.isArray(some) || typeof some === 'string' || !some) {
|
||||||
input = vfs.src(some || all, { base: '.', follow: true, allowEmpty: true });
|
const options = { base: '.', follow: true, allowEmpty: true };
|
||||||
|
if (some) {
|
||||||
|
input = vfs.src(some, options).pipe(filter(all)); // split this up to not unnecessarily filter all a second time
|
||||||
|
} else {
|
||||||
|
input = vfs.src(all, options);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
input = some;
|
input = some;
|
||||||
}
|
}
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}} Linting for SQL
|
|
||||||
const tslintSqlConfiguration = tslint.Configuration.findConfiguration('tslint-sql.json', '.');
|
|
||||||
const tslintSqlOptions = { fix: false, formatter: 'json' };
|
|
||||||
const sqlTsLinter = new tslint.Linter(tslintSqlOptions);
|
|
||||||
|
|
||||||
const sqlTsl = es.through(function (file) { //TODO restore
|
|
||||||
const contents = file.contents.toString('utf8');
|
|
||||||
sqlTsLinter.lint(file.relative, contents, tslintSqlConfiguration.results);
|
|
||||||
});
|
|
||||||
|
|
||||||
const productJsonFilter = filter('product.json', { restore: true });
|
const productJsonFilter = filter('product.json', { restore: true });
|
||||||
|
|
||||||
const result = input
|
const result = input
|
||||||
.pipe(fileLengthFilter)
|
|
||||||
.pipe(filelength)
|
|
||||||
.pipe(fileLengthFilter.restore)
|
|
||||||
.pipe(filter(f => !f.stat.isDirectory()))
|
.pipe(filter(f => !f.stat.isDirectory()))
|
||||||
.pipe(productJsonFilter)
|
.pipe(productJsonFilter)
|
||||||
.pipe(process.env['BUILD_SOURCEVERSION'] ? es.through() : productJson)
|
.pipe(process.env['BUILD_SOURCEVERSION'] ? es.through() : productJson)
|
||||||
@@ -453,25 +360,36 @@ function hygiene(some) {
|
|||||||
.pipe(filter(copyrightFilter))
|
.pipe(filter(copyrightFilter))
|
||||||
.pipe(copyrights);
|
.pipe(copyrights);
|
||||||
|
|
||||||
let typescript = result
|
const typescript = result
|
||||||
.pipe(filter(tslintHygieneFilter))
|
.pipe(filter(tsHygieneFilter))
|
||||||
.pipe(formatting);
|
.pipe(formatting);
|
||||||
|
|
||||||
if (!process.argv.some(arg => arg === '--skip-tslint')) {
|
|
||||||
typescript = typescript.pipe(tsl);
|
|
||||||
typescript = typescript
|
|
||||||
.pipe(filter(sqlFilter)) // {{SQL CARBON EDIT}}
|
|
||||||
.pipe(sqlTsl);
|
|
||||||
}
|
|
||||||
|
|
||||||
const javascript = result
|
const javascript = result
|
||||||
.pipe(filter(eslintFilter))
|
.pipe(filter(jsHygieneFilter.concat(tsHygieneFilter)))
|
||||||
.pipe(gulpeslint('src/.eslintrc'))
|
.pipe(gulpeslint({
|
||||||
|
configFile: '.eslintrc.json',
|
||||||
|
rulePaths: ['./build/lib/eslint']
|
||||||
|
}))
|
||||||
.pipe(gulpeslint.formatEach('compact'))
|
.pipe(gulpeslint.formatEach('compact'))
|
||||||
.pipe(gulpeslint.failAfterError());
|
.pipe(gulpeslint.results(results => {
|
||||||
|
errorCount += results.warningCount;
|
||||||
|
errorCount += results.errorCount;
|
||||||
|
}));
|
||||||
|
|
||||||
|
const sqlJavascript = result
|
||||||
|
.pipe(filter(sqlHygieneFilter))
|
||||||
|
.pipe(gulpeslint({
|
||||||
|
configFile: '.eslintrc.sql.json',
|
||||||
|
rulePaths: ['./build/lib/eslint']
|
||||||
|
}))
|
||||||
|
.pipe(gulpeslint.formatEach('compact'))
|
||||||
|
.pipe(gulpeslint.results(results => {
|
||||||
|
errorCount += results.warningCount;
|
||||||
|
errorCount += results.errorCount;
|
||||||
|
}));
|
||||||
|
|
||||||
let count = 0;
|
let count = 0;
|
||||||
return es.merge(typescript, javascript)
|
return es.merge(typescript, javascript, sqlJavascript)
|
||||||
.pipe(es.through(function (data) {
|
.pipe(es.through(function (data) {
|
||||||
count++;
|
count++;
|
||||||
if (process.env['TRAVIS'] && count % 10 === 0) {
|
if (process.env['TRAVIS'] && count % 10 === 0) {
|
||||||
@@ -480,33 +398,6 @@ function hygiene(some) {
|
|||||||
this.emit('data', data);
|
this.emit('data', data);
|
||||||
}, function () {
|
}, function () {
|
||||||
process.stdout.write('\n');
|
process.stdout.write('\n');
|
||||||
|
|
||||||
const tslintResult = tsLinter.getResult();
|
|
||||||
if (tslintResult.failures.length > 0) {
|
|
||||||
for (const failure of tslintResult.failures) {
|
|
||||||
const name = failure.getFileName();
|
|
||||||
const position = failure.getStartPosition();
|
|
||||||
const line = position.getLineAndCharacter().line;
|
|
||||||
const character = position.getLineAndCharacter().character;
|
|
||||||
|
|
||||||
console.error(`${name}:${line + 1}:${character + 1}:${failure.getFailure()}`);
|
|
||||||
}
|
|
||||||
errorCount += tslintResult.failures.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
const sqlTslintResult = sqlTsLinter.getResult();
|
|
||||||
if (sqlTslintResult.failures.length > 0) {
|
|
||||||
for (const failure of sqlTslintResult.failures) {
|
|
||||||
const name = failure.getFileName();
|
|
||||||
const position = failure.getStartPosition();
|
|
||||||
const line = position.getLineAndCharacter().line;
|
|
||||||
const character = position.getLineAndCharacter().character;
|
|
||||||
|
|
||||||
console.error(`${name}:${line + 1}:${character + 1}:${failure.getFailure()}`);
|
|
||||||
}
|
|
||||||
errorCount += sqlTslintResult.failures.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (errorCount > 0) {
|
if (errorCount > 0) {
|
||||||
this.emit('error', 'Hygiene failed with ' + errorCount + ' errors. Check \'build/gulpfile.hygiene.js\'.');
|
this.emit('error', 'Hygiene failed with ' + errorCount + ' errors. Check \'build/gulpfile.hygiene.js\'.');
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,79 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------------------------
|
|
||||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
|
||||||
*--------------------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
const gulp = require('gulp');
|
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}}
|
|
||||||
const jeditor = require('gulp-json-editor');
|
|
||||||
const product = require('../product.json');
|
|
||||||
|
|
||||||
gulp.task('mixin', function () {
|
|
||||||
// {{SQL CARBON EDIT}}
|
|
||||||
const updateUrl = process.env['SQLOPS_UPDATEURL'];
|
|
||||||
if (!updateUrl) {
|
|
||||||
console.log('Missing SQLOPS_UPDATEURL, skipping mixin');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const quality = process.env['VSCODE_QUALITY'];
|
|
||||||
|
|
||||||
if (!quality) {
|
|
||||||
console.log('Missing VSCODE_QUALITY, skipping mixin');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}} - apply ADS insiders values if needed
|
|
||||||
let newValues = {
|
|
||||||
"nameShort": product.nameShort,
|
|
||||||
"nameLong": product.nameLong,
|
|
||||||
"applicationName": product.applicationName,
|
|
||||||
"dataFolderName": product.dataFolderName,
|
|
||||||
"win32MutexName": product.win32MutexName,
|
|
||||||
"win32DirName": product.win32DirName,
|
|
||||||
"win32NameVersion": product.win32NameVersion,
|
|
||||||
"win32RegValueName": product.win32RegValueName,
|
|
||||||
"win32AppId": product.win32AppId,
|
|
||||||
"win32x64AppId": product.win32x64AppId,
|
|
||||||
"win32UserAppId": product.win32UserAppId,
|
|
||||||
"win32x64UserAppId": product.win32x64UserAppId,
|
|
||||||
"win32AppUserModelId": product.win32AppUserModelId,
|
|
||||||
"win32ShellNameShort": product.win32ShellNameShort,
|
|
||||||
"darwinBundleIdentifier": product.darwinBundleIdentifier,
|
|
||||||
"updateUrl": updateUrl,
|
|
||||||
"quality": quality,
|
|
||||||
"extensionsGallery": {
|
|
||||||
"serviceUrl": 'https://sqlopsextensions.blob.core.windows.net/marketplace/v1/extensionsGallery.json'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (quality === 'insider') {
|
|
||||||
let dashSuffix = '-insiders';
|
|
||||||
let dotSuffix = '.insiders';
|
|
||||||
let displaySuffix = ' - Insiders';
|
|
||||||
|
|
||||||
newValues.extensionsGallery.serviceUrl = `https://sqlopsextensions.blob.core.windows.net/marketplace/v1/extensionsGallery-${quality}.json`;
|
|
||||||
newValues.nameShort += dashSuffix;
|
|
||||||
newValues.nameLong += displaySuffix;
|
|
||||||
newValues.applicationName += dashSuffix;
|
|
||||||
newValues.dataFolderName += dashSuffix;
|
|
||||||
newValues.win32MutexName += dashSuffix;
|
|
||||||
newValues.win32DirName += displaySuffix;
|
|
||||||
newValues.win32NameVersion += displaySuffix;
|
|
||||||
newValues.win32RegValueName += dashSuffix;
|
|
||||||
newValues.win32AppId = "{{9F0801B2-DEE3-4272-A2C6-FBDF25BAAF0F}";
|
|
||||||
newValues.win32x64AppId = "{{6748A5FD-29EB-4BA6-B3C6-E7B981B8D6B0}";
|
|
||||||
newValues.win32UserAppId = "{{0F8CD1ED-483C-40EB-8AD2-8ED784651AA1}";
|
|
||||||
newValues.win32x64UserAppId += dashSuffix;
|
|
||||||
newValues.win32AppUserModelId += dotSuffix;
|
|
||||||
newValues.win32ShellNameShort += displaySuffix;
|
|
||||||
newValues.darwinBundleIdentifier += dotSuffix;
|
|
||||||
}
|
|
||||||
|
|
||||||
return gulp.src('./product.json')
|
|
||||||
.pipe(jeditor(newValues))
|
|
||||||
.pipe(gulp.dest('.'));
|
|
||||||
});
|
|
||||||
@@ -118,7 +118,7 @@ function mixinServer(watch) {
|
|||||||
const packageJSONPath = path.join(path.dirname(__dirname), 'package.json');
|
const packageJSONPath = path.join(path.dirname(__dirname), 'package.json');
|
||||||
function exec(cmdLine) {
|
function exec(cmdLine) {
|
||||||
console.log(cmdLine);
|
console.log(cmdLine);
|
||||||
cp.execSync(cmdLine, { stdio: "inherit" });
|
cp.execSync(cmdLine, { stdio: 'inherit' });
|
||||||
}
|
}
|
||||||
function checkout() {
|
function checkout() {
|
||||||
const packageJSON = JSON.parse(fs.readFileSync(packageJSONPath).toString());
|
const packageJSON = JSON.parse(fs.readFileSync(packageJSONPath).toString());
|
||||||
|
|||||||
@@ -11,8 +11,13 @@ const es = require('event-stream');
|
|||||||
const filter = require('gulp-filter');
|
const filter = require('gulp-filter');
|
||||||
const del = require('del');
|
const del = require('del');
|
||||||
const serviceDownloader = require('service-downloader').ServiceDownloadProvider;
|
const serviceDownloader = require('service-downloader').ServiceDownloadProvider;
|
||||||
const platformInfo = require('service-downloader/out/platform').PlatformInformation;
|
const platform = require('service-downloader/out/platform').PlatformInformation;
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
const ext = require('./lib/extensions');
|
||||||
|
const task = require('./lib/task');
|
||||||
|
const glob = require('glob');
|
||||||
|
const vsce = require('vsce');
|
||||||
|
const mkdirp = require('mkdirp');
|
||||||
|
|
||||||
gulp.task('clean-mssql-extension', util.rimraf('extensions/mssql/node_modules'));
|
gulp.task('clean-mssql-extension', util.rimraf('extensions/mssql/node_modules'));
|
||||||
gulp.task('clean-credentials-extension', util.rimraf('extensions/credentials/node_modules'));
|
gulp.task('clean-credentials-extension', util.rimraf('extensions/credentials/node_modules'));
|
||||||
@@ -93,11 +98,11 @@ const formatStagedFiles = () => {
|
|||||||
|
|
||||||
function installService() {
|
function installService() {
|
||||||
let config = require('../extensions/mssql/config.json');
|
let config = require('../extensions/mssql/config.json');
|
||||||
return platformInfo.getCurrent().then(p => {
|
return platform.getCurrent().then(p => {
|
||||||
let runtime = p.runtimeId;
|
let runtime = p.runtimeId;
|
||||||
// fix path since it won't be correct
|
// fix path since it won't be correct
|
||||||
config.installDirectory = path.join(__dirname, '../extensions/mssql/src', config.installDirectory);
|
config.installDirectory = path.join(__dirname, '../extensions/mssql/src', config.installDirectory);
|
||||||
var installer = new serviceDownloader(config);
|
let installer = new serviceDownloader(config);
|
||||||
let serviceInstallFolder = installer.getInstallDirectory(runtime);
|
let serviceInstallFolder = installer.getInstallDirectory(runtime);
|
||||||
console.log('Cleaning up the install folder: ' + serviceInstallFolder);
|
console.log('Cleaning up the install folder: ' + serviceInstallFolder);
|
||||||
return del(serviceInstallFolder + '/*').then(() => {
|
return del(serviceInstallFolder + '/*').then(() => {
|
||||||
@@ -113,25 +118,50 @@ gulp.task('install-sqltoolsservice', () => {
|
|||||||
return installService();
|
return installService();
|
||||||
});
|
});
|
||||||
|
|
||||||
function installSsmsMin() {
|
|
||||||
const config = require('../extensions/admin-tool-ext-win/config.json');
|
|
||||||
return platformInfo.getCurrent().then(p => {
|
|
||||||
const runtime = p.runtimeId;
|
|
||||||
// fix path since it won't be correct
|
|
||||||
config.installDirectory = path.join(__dirname, '..', 'extensions', 'admin-tool-ext-win', config.installDirectory);
|
|
||||||
var installer = new serviceDownloader(config);
|
|
||||||
const serviceInstallFolder = installer.getInstallDirectory(runtime);
|
|
||||||
const serviceCleanupFolder = path.join(serviceInstallFolder, '..');
|
|
||||||
console.log('Cleaning up the install folder: ' + serviceCleanupFolder);
|
|
||||||
return del(serviceCleanupFolder + '/*').then(() => {
|
|
||||||
console.log('Installing the service. Install folder: ' + serviceInstallFolder);
|
|
||||||
return installer.installService(runtime);
|
|
||||||
}, delError => {
|
|
||||||
console.log('failed to delete the install folder error: ' + delError);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
gulp.task('install-ssmsmin', () => {
|
gulp.task('install-ssmsmin', () => {
|
||||||
return installSsmsMin();
|
const config = require('../extensions/admin-tool-ext-win/config.json');
|
||||||
|
const runtime = 'Windows_64'; // admin-tool-ext is a windows only extension, and we only ship a 64 bit version, so locking the binaries as such
|
||||||
|
// fix path since it won't be correct
|
||||||
|
config.installDirectory = path.join(__dirname, '..', 'extensions', 'admin-tool-ext-win', config.installDirectory);
|
||||||
|
let installer = new serviceDownloader(config);
|
||||||
|
const serviceInstallFolder = installer.getInstallDirectory(runtime);
|
||||||
|
const serviceCleanupFolder = path.join(serviceInstallFolder, '..');
|
||||||
|
console.log('Cleaning up the install folder: ' + serviceCleanupFolder);
|
||||||
|
return del(serviceCleanupFolder + '/*').then(() => {
|
||||||
|
console.log('Installing the service. Install folder: ' + serviceInstallFolder);
|
||||||
|
return installer.installService(runtime);
|
||||||
|
}, delError => {
|
||||||
|
console.log('failed to delete the install folder error: ' + delError);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const root = path.dirname(__dirname);
|
||||||
|
|
||||||
|
gulp.task('package-external-extensions', task.series(
|
||||||
|
task.define('bundle-external-extensions-build', () => ext.packageExternalExtensionsStream().pipe(gulp.dest('.build/external'))),
|
||||||
|
task.define('create-external-extension-vsix-build', () => {
|
||||||
|
const vsixes = glob.sync('.build/external/extensions/*/package.json').map(manifestPath => {
|
||||||
|
const extensionPath = path.dirname(path.join(root, manifestPath));
|
||||||
|
const extensionName = path.basename(extensionPath);
|
||||||
|
return { name: extensionName, path: extensionPath };
|
||||||
|
}).map(element => {
|
||||||
|
const pkgJson = require(path.join(element.path, 'package.json'));
|
||||||
|
const vsixDirectory = path.join(root, '.build', 'extensions');
|
||||||
|
mkdirp.sync(vsixDirectory);
|
||||||
|
const packagePath = path.join(vsixDirectory, `${pkgJson.name}-${pkgJson.version}.vsix`);
|
||||||
|
console.info('Creating vsix for ' + element.path + ' result:' + packagePath);
|
||||||
|
return vsce.createVSIX({
|
||||||
|
cwd: element.path,
|
||||||
|
packagePath: packagePath,
|
||||||
|
useYarn: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return Promise.all(vsixes);
|
||||||
|
})
|
||||||
|
));
|
||||||
|
|
||||||
|
gulp.task('package-rebuild-extensions', task.series(
|
||||||
|
task.define('clean-rebuild-extensions', () => ext.cleanRebuildExtensions('.build/extensions')),
|
||||||
|
task.define('rebuild-extensions-build', () => ext.packageRebuildExtensionsStream().pipe(gulp.dest('.build'))),
|
||||||
|
));
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ const packageJson = require('../package.json');
|
|||||||
const product = require('../product.json');
|
const product = require('../product.json');
|
||||||
const crypto = require('crypto');
|
const crypto = require('crypto');
|
||||||
const i18n = require('./lib/i18n');
|
const i18n = require('./lib/i18n');
|
||||||
const ext = require('./lib/extensions'); // {{SQL CARBON EDIT}}
|
|
||||||
const deps = require('./dependencies');
|
const deps = require('./dependencies');
|
||||||
const { config } = require('./lib/electron');
|
const { config } = require('./lib/electron');
|
||||||
const createAsar = require('./lib/asar').createAsar;
|
const createAsar = require('./lib/asar').createAsar;
|
||||||
@@ -44,6 +43,7 @@ const nodeModules = [
|
|||||||
'electron',
|
'electron',
|
||||||
'original-fs',
|
'original-fs',
|
||||||
'rxjs/Observable',
|
'rxjs/Observable',
|
||||||
|
'rxjs/add/observable/fromPromise',
|
||||||
'rxjs/Subject',
|
'rxjs/Subject',
|
||||||
'rxjs/Observer',
|
'rxjs/Observer',
|
||||||
'slickgrid/lib/jquery.event.drag-2.3.0',
|
'slickgrid/lib/jquery.event.drag-2.3.0',
|
||||||
@@ -92,8 +92,7 @@ const vscodeResources = [
|
|||||||
'out-build/vs/code/electron-browser/sharedProcess/sharedProcess.js',
|
'out-build/vs/code/electron-browser/sharedProcess/sharedProcess.js',
|
||||||
'out-build/vs/code/electron-browser/issue/issueReporter.js',
|
'out-build/vs/code/electron-browser/issue/issueReporter.js',
|
||||||
'out-build/vs/code/electron-browser/processExplorer/processExplorer.js',
|
'out-build/vs/code/electron-browser/processExplorer/processExplorer.js',
|
||||||
// {{SQL CARBON EDIT}}
|
'out-build/sql/workbench/electron-browser/splashscreen/*', // {{SQL CARBON EDIT}} STart
|
||||||
'out-build/sql/workbench/electron-browser/splashscreen/*',
|
|
||||||
'out-build/sql/**/*.{svg,png,cur,html}',
|
'out-build/sql/**/*.{svg,png,cur,html}',
|
||||||
'out-build/sql/base/browser/ui/table/media/*.{gif,png,svg}',
|
'out-build/sql/base/browser/ui/table/media/*.{gif,png,svg}',
|
||||||
'out-build/sql/base/browser/ui/checkbox/media/*.{gif,png,svg}',
|
'out-build/sql/base/browser/ui/checkbox/media/*.{gif,png,svg}',
|
||||||
@@ -111,7 +110,8 @@ const vscodeResources = [
|
|||||||
'out-build/sql/media/objectTypes/*.svg',
|
'out-build/sql/media/objectTypes/*.svg',
|
||||||
'out-build/sql/media/icons/*.svg',
|
'out-build/sql/media/icons/*.svg',
|
||||||
'out-build/sql/workbench/parts/notebook/media/**/*.svg',
|
'out-build/sql/workbench/parts/notebook/media/**/*.svg',
|
||||||
'out-build/sql/setup.js',
|
'out-build/sql/setup.js', // {{SQL CARBON EDIT}} end
|
||||||
|
'out-build/vs/platform/auth/common/auth.css',
|
||||||
'!**/test/**'
|
'!**/test/**'
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -151,9 +151,9 @@ gulp.task(minifyVSCodeTask);
|
|||||||
* @return {Object} A map of paths to checksums.
|
* @return {Object} A map of paths to checksums.
|
||||||
*/
|
*/
|
||||||
function computeChecksums(out, filenames) {
|
function computeChecksums(out, filenames) {
|
||||||
var result = {};
|
let result = {};
|
||||||
filenames.forEach(function (filename) {
|
filenames.forEach(function (filename) {
|
||||||
var fullPath = path.join(process.cwd(), out, filename);
|
let fullPath = path.join(process.cwd(), out, filename);
|
||||||
result[filename] = computeChecksum(fullPath);
|
result[filename] = computeChecksum(fullPath);
|
||||||
});
|
});
|
||||||
return result;
|
return result;
|
||||||
@@ -166,9 +166,9 @@ function computeChecksums(out, filenames) {
|
|||||||
* @return {string} The checksum for `filename`.
|
* @return {string} The checksum for `filename`.
|
||||||
*/
|
*/
|
||||||
function computeChecksum(filename) {
|
function computeChecksum(filename) {
|
||||||
var contents = fs.readFileSync(filename);
|
let contents = fs.readFileSync(filename);
|
||||||
|
|
||||||
var hash = crypto
|
let hash = crypto
|
||||||
.createHash('md5')
|
.createHash('md5')
|
||||||
.update(contents)
|
.update(contents)
|
||||||
.digest('base64')
|
.digest('base64')
|
||||||
@@ -197,9 +197,6 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op
|
|||||||
.pipe(rename(function (path) { path.dirname = path.dirname.replace(new RegExp('^' + out), 'out'); }))
|
.pipe(rename(function (path) { path.dirname = path.dirname.replace(new RegExp('^' + out), 'out'); }))
|
||||||
.pipe(util.setExecutableBit(['**/*.sh']));
|
.pipe(util.setExecutableBit(['**/*.sh']));
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}}
|
|
||||||
ext.packageBuiltInExtensions();
|
|
||||||
|
|
||||||
const extensions = gulp.src(['.build/extensions/**', '!.build/extensions/node_modules/**'], { base: '.build', dot: true }); // {{SQL CARBON EDIT}} - don't package the node_modules directory
|
const extensions = gulp.src(['.build/extensions/**', '!.build/extensions/node_modules/**'], { base: '.build', dot: true }); // {{SQL CARBON EDIT}} - don't package the node_modules directory
|
||||||
|
|
||||||
const sources = es.merge(src, extensions)
|
const sources = es.merge(src, extensions)
|
||||||
@@ -240,7 +237,6 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op
|
|||||||
const api = gulp.src('src/vs/vscode.d.ts').pipe(rename('out/vs/vscode.d.ts'));
|
const api = gulp.src('src/vs/vscode.d.ts').pipe(rename('out/vs/vscode.d.ts'));
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
const dataApi = gulp.src('src/sql/azdata.d.ts').pipe(rename('out/sql/azdata.d.ts'));
|
const dataApi = gulp.src('src/sql/azdata.d.ts').pipe(rename('out/sql/azdata.d.ts'));
|
||||||
const sqlopsAPI = gulp.src('src/sql/sqlops.d.ts').pipe(rename('out/sql/sqlops.d.ts'));
|
|
||||||
|
|
||||||
const telemetry = gulp.src('.build/telemetry/**', { base: '.build/telemetry', dot: true });
|
const telemetry = gulp.src('.build/telemetry/**', { base: '.build/telemetry', dot: true });
|
||||||
|
|
||||||
@@ -257,8 +253,7 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op
|
|||||||
productJsonStream,
|
productJsonStream,
|
||||||
license,
|
license,
|
||||||
api,
|
api,
|
||||||
dataApi,
|
dataApi, // {{SQL CARBON EDIT}}
|
||||||
sqlopsAPI, // {{SQL CARBON EDIT}}
|
|
||||||
telemetry,
|
telemetry,
|
||||||
sources,
|
sources,
|
||||||
deps
|
deps
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ const commit = util.getVersion(root);
|
|||||||
const linuxPackageRevision = Math.floor(new Date().getTime() / 1000);
|
const linuxPackageRevision = Math.floor(new Date().getTime() / 1000);
|
||||||
|
|
||||||
function getDebPackageArch(arch) {
|
function getDebPackageArch(arch) {
|
||||||
return { x64: 'amd64', arm: 'armhf', arm64: "arm64" }[arch];
|
return { x64: 'amd64', arm: 'armhf', arm64: 'arm64' }[arch];
|
||||||
}
|
}
|
||||||
|
|
||||||
function prepareDebPackage(arch) {
|
function prepareDebPackage(arch) {
|
||||||
@@ -118,7 +118,7 @@ function getRpmBuildPath(rpmArch) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getRpmPackageArch(arch) {
|
function getRpmPackageArch(arch) {
|
||||||
return { x64: 'x86_64', arm: 'armhf', arm64: "arm64" }[arch];
|
return { x64: 'x86_64', arm: 'armhf', arm64: 'arm64' }[arch];
|
||||||
}
|
}
|
||||||
|
|
||||||
function prepareRpmPackage(arch) {
|
function prepareRpmPackage(arch) {
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ const repoPath = path.dirname(__dirname);
|
|||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
const buildPath = arch => path.join(path.dirname(repoPath), `azuredatastudio-win32-${arch}`);
|
const buildPath = arch => path.join(path.dirname(repoPath), `azuredatastudio-win32-${arch}`);
|
||||||
const zipDir = arch => path.join(repoPath, '.build', `win32-${arch}`, 'archive');
|
const zipDir = arch => path.join(repoPath, '.build', `win32-${arch}`, 'archive');
|
||||||
const zipPath = arch => path.join(zipDir(arch), `VSCode-win32-${arch}.zip`);
|
const zipPath = arch => path.join(zipDir(arch), `azuredatastudio-win32-${arch}.zip`);
|
||||||
const setupDir = (arch, target) => path.join(repoPath, '.build', `win32-${arch}`, `${target}-setup`);
|
const setupDir = (arch, target) => path.join(repoPath, '.build', `win32-${arch}`, `${target}-setup`);
|
||||||
const issPath = path.join(__dirname, 'win32', 'code.iss');
|
const issPath = path.join(__dirname, 'win32', 'code.iss');
|
||||||
const innoSetupPath = path.join(path.dirname(path.dirname(require.resolve('innosetup'))), 'bin', 'ISCC.exe');
|
const innoSetupPath = path.join(path.dirname(path.dirname(require.resolve('innosetup'))), 'bin', 'ISCC.exe');
|
||||||
|
|||||||
@@ -18,11 +18,15 @@ const fancyLog = require('fancy-log');
|
|||||||
const ansiColors = require('ansi-colors');
|
const ansiColors = require('ansi-colors');
|
||||||
|
|
||||||
const root = path.dirname(path.dirname(__dirname));
|
const root = path.dirname(path.dirname(__dirname));
|
||||||
// {{SQL CARBON EDIT}}
|
const builtInExtensions = require('../builtInExtensions.json');
|
||||||
const quality = process.env['VSCODE_QUALITY'];
|
|
||||||
const builtInExtensions = quality && quality === 'stable' ? require('../builtInExtensions.json') : require('../builtInExtensions-insiders.json');
|
|
||||||
// {{SQL CARBON EDIT}} - END
|
|
||||||
const controlFilePath = path.join(os.homedir(), '.vscode-oss-dev', 'extensions', 'control.json');
|
const controlFilePath = path.join(os.homedir(), '.vscode-oss-dev', 'extensions', 'control.json');
|
||||||
|
const ENABLE_LOGGING = !process.env['VSCODE_BUILD_BUILTIN_EXTENSIONS_SILENCE_PLEASE'];
|
||||||
|
|
||||||
|
function log() {
|
||||||
|
if (ENABLE_LOGGING) {
|
||||||
|
fancyLog.apply(this, arguments);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function getExtensionPath(extension) {
|
function getExtensionPath(extension) {
|
||||||
return path.join(root, '.build', 'builtInExtensions', extension.name);
|
return path.join(root, '.build', 'builtInExtensions', extension.name);
|
||||||
@@ -47,7 +51,7 @@ function isUpToDate(extension) {
|
|||||||
|
|
||||||
function syncMarketplaceExtension(extension) {
|
function syncMarketplaceExtension(extension) {
|
||||||
if (isUpToDate(extension)) {
|
if (isUpToDate(extension)) {
|
||||||
fancyLog(ansiColors.blue('[marketplace]'), `${extension.name}@${extension.version}`, ansiColors.green('✔︎'));
|
log(ansiColors.blue('[marketplace]'), `${extension.name}@${extension.version}`, ansiColors.green('✔︎'));
|
||||||
return es.readArray([]);
|
return es.readArray([]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,13 +60,13 @@ function syncMarketplaceExtension(extension) {
|
|||||||
return ext.fromMarketplace(extension.name, extension.version, extension.metadata)
|
return ext.fromMarketplace(extension.name, extension.version, extension.metadata)
|
||||||
.pipe(rename(p => p.dirname = `${extension.name}/${p.dirname}`))
|
.pipe(rename(p => p.dirname = `${extension.name}/${p.dirname}`))
|
||||||
.pipe(vfs.dest('.build/builtInExtensions'))
|
.pipe(vfs.dest('.build/builtInExtensions'))
|
||||||
.on('end', () => fancyLog(ansiColors.blue('[marketplace]'), extension.name, ansiColors.green('✔︎')));
|
.on('end', () => log(ansiColors.blue('[marketplace]'), extension.name, ansiColors.green('✔︎')));
|
||||||
}
|
}
|
||||||
|
|
||||||
function syncExtension(extension, controlState) {
|
function syncExtension(extension, controlState) {
|
||||||
switch (controlState) {
|
switch (controlState) {
|
||||||
case 'disabled':
|
case 'disabled':
|
||||||
fancyLog(ansiColors.blue('[disabled]'), ansiColors.gray(extension.name));
|
log(ansiColors.blue('[disabled]'), ansiColors.gray(extension.name));
|
||||||
return es.readArray([]);
|
return es.readArray([]);
|
||||||
|
|
||||||
case 'marketplace':
|
case 'marketplace':
|
||||||
@@ -70,15 +74,15 @@ function syncExtension(extension, controlState) {
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
if (!fs.existsSync(controlState)) {
|
if (!fs.existsSync(controlState)) {
|
||||||
fancyLog(ansiColors.red(`Error: Built-in extension '${extension.name}' is configured to run from '${controlState}' but that path does not exist.`));
|
log(ansiColors.red(`Error: Built-in extension '${extension.name}' is configured to run from '${controlState}' but that path does not exist.`));
|
||||||
return es.readArray([]);
|
return es.readArray([]);
|
||||||
|
|
||||||
} else if (!fs.existsSync(path.join(controlState, 'package.json'))) {
|
} else if (!fs.existsSync(path.join(controlState, 'package.json'))) {
|
||||||
fancyLog(ansiColors.red(`Error: Built-in extension '${extension.name}' is configured to run from '${controlState}' but there is no 'package.json' file in that directory.`));
|
log(ansiColors.red(`Error: Built-in extension '${extension.name}' is configured to run from '${controlState}' but there is no 'package.json' file in that directory.`));
|
||||||
return es.readArray([]);
|
return es.readArray([]);
|
||||||
}
|
}
|
||||||
|
|
||||||
fancyLog(ansiColors.blue('[local]'), `${extension.name}: ${ansiColors.cyan(controlState)}`, ansiColors.green('✔︎'));
|
log(ansiColors.blue('[local]'), `${extension.name}: ${ansiColors.cyan(controlState)}`, ansiColors.green('✔︎'));
|
||||||
return es.readArray([]);
|
return es.readArray([]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -97,8 +101,8 @@ function writeControlFile(control) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function main() {
|
function main() {
|
||||||
fancyLog('Syncronizing built-in extensions...');
|
log('Syncronizing built-in extensions...');
|
||||||
fancyLog(`You can manage built-in extensions with the ${ansiColors.cyan('--builtin')} flag`);
|
log(`You can manage built-in extensions with the ${ansiColors.cyan('--builtin')} flag`);
|
||||||
|
|
||||||
const control = readControlFile();
|
const control = readControlFile();
|
||||||
const streams = [];
|
const streams = [];
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ function createCompile(src, build, emitError) {
|
|||||||
const input = es.through();
|
const input = es.through();
|
||||||
const output = input
|
const output = input
|
||||||
.pipe(utf8Filter)
|
.pipe(utf8Filter)
|
||||||
.pipe(bom())
|
.pipe(bom()) // this is required to preserve BOM in test files that loose it otherwise
|
||||||
.pipe(utf8Filter.restore)
|
.pipe(utf8Filter.restore)
|
||||||
.pipe(tsFilter)
|
.pipe(tsFilter)
|
||||||
.pipe(util.loadSourcemaps())
|
.pipe(util.loadSourcemaps())
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ function createCompile(src: string, build: boolean, emitError?: boolean) {
|
|||||||
const input = es.through();
|
const input = es.through();
|
||||||
const output = input
|
const output = input
|
||||||
.pipe(utf8Filter)
|
.pipe(utf8Filter)
|
||||||
.pipe(bom())
|
.pipe(bom()) // this is required to preserve BOM in test files that loose it otherwise
|
||||||
.pipe(utf8Filter.restore)
|
.pipe(utf8Filter.restore)
|
||||||
.pipe(tsFilter)
|
.pipe(tsFilter)
|
||||||
.pipe(util.loadSourcemaps())
|
.pipe(util.loadSourcemaps())
|
||||||
|
|||||||
59
build/lib/eslint/code-import-patterns.js
Normal file
59
build/lib/eslint/code-import-patterns.js
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
"use strict";
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
const path_1 = require("path");
|
||||||
|
const minimatch = require("minimatch");
|
||||||
|
const utils_1 = require("./utils");
|
||||||
|
module.exports = new class {
|
||||||
|
constructor() {
|
||||||
|
this.meta = {
|
||||||
|
messages: {
|
||||||
|
badImport: 'Imports violates \'{{restrictions}}\' restrictions. See https://github.com/microsoft/vscode/wiki/Source-Code-Organization'
|
||||||
|
},
|
||||||
|
docs: {
|
||||||
|
url: 'https://github.com/microsoft/vscode/wiki/Source-Code-Organization'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
create(context) {
|
||||||
|
const configs = context.options;
|
||||||
|
for (const config of configs) {
|
||||||
|
if (minimatch(context.getFilename(), config.target)) {
|
||||||
|
return utils_1.createImportRuleListener((node, value) => this._checkImport(context, config, node, value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
_checkImport(context, config, node, path) {
|
||||||
|
// resolve relative paths
|
||||||
|
if (path[0] === '.') {
|
||||||
|
path = path_1.join(context.getFilename(), path);
|
||||||
|
}
|
||||||
|
let restrictions;
|
||||||
|
if (typeof config.restrictions === 'string') {
|
||||||
|
restrictions = [config.restrictions];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
restrictions = config.restrictions;
|
||||||
|
}
|
||||||
|
let matched = false;
|
||||||
|
for (const pattern of restrictions) {
|
||||||
|
if (minimatch(path, pattern)) {
|
||||||
|
matched = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!matched) {
|
||||||
|
// None of the restrictions matched
|
||||||
|
context.report({
|
||||||
|
loc: node.loc,
|
||||||
|
messageId: 'badImport',
|
||||||
|
data: {
|
||||||
|
restrictions: restrictions.join(' or ')
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
75
build/lib/eslint/code-import-patterns.ts
Normal file
75
build/lib/eslint/code-import-patterns.ts
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
import * as eslint from 'eslint';
|
||||||
|
import { TSESTree } from '@typescript-eslint/experimental-utils';
|
||||||
|
import { join } from 'path';
|
||||||
|
import * as minimatch from 'minimatch';
|
||||||
|
import { createImportRuleListener } from './utils';
|
||||||
|
|
||||||
|
interface ImportPatternsConfig {
|
||||||
|
target: string;
|
||||||
|
restrictions: string | string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export = new class implements eslint.Rule.RuleModule {
|
||||||
|
|
||||||
|
readonly meta: eslint.Rule.RuleMetaData = {
|
||||||
|
messages: {
|
||||||
|
badImport: 'Imports violates \'{{restrictions}}\' restrictions. See https://github.com/microsoft/vscode/wiki/Source-Code-Organization'
|
||||||
|
},
|
||||||
|
docs: {
|
||||||
|
url: 'https://github.com/microsoft/vscode/wiki/Source-Code-Organization'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
|
||||||
|
|
||||||
|
const configs = <ImportPatternsConfig[]>context.options;
|
||||||
|
|
||||||
|
for (const config of configs) {
|
||||||
|
if (minimatch(context.getFilename(), config.target)) {
|
||||||
|
return createImportRuleListener((node, value) => this._checkImport(context, config, node, value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
private _checkImport(context: eslint.Rule.RuleContext, config: ImportPatternsConfig, node: TSESTree.Node, path: string) {
|
||||||
|
|
||||||
|
// resolve relative paths
|
||||||
|
if (path[0] === '.') {
|
||||||
|
path = join(context.getFilename(), path);
|
||||||
|
}
|
||||||
|
|
||||||
|
let restrictions: string[];
|
||||||
|
if (typeof config.restrictions === 'string') {
|
||||||
|
restrictions = [config.restrictions];
|
||||||
|
} else {
|
||||||
|
restrictions = config.restrictions;
|
||||||
|
}
|
||||||
|
|
||||||
|
let matched = false;
|
||||||
|
for (const pattern of restrictions) {
|
||||||
|
if (minimatch(path, pattern)) {
|
||||||
|
matched = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!matched) {
|
||||||
|
// None of the restrictions matched
|
||||||
|
context.report({
|
||||||
|
loc: node.loc,
|
||||||
|
messageId: 'badImport',
|
||||||
|
data: {
|
||||||
|
restrictions: restrictions.join(' or ')
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
68
build/lib/eslint/code-layering.js
Normal file
68
build/lib/eslint/code-layering.js
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
"use strict";
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
const path_1 = require("path");
|
||||||
|
const utils_1 = require("./utils");
|
||||||
|
module.exports = new class {
|
||||||
|
constructor() {
|
||||||
|
this.meta = {
|
||||||
|
messages: {
|
||||||
|
layerbreaker: 'Bad layering. You are not allowed to access {{from}} from here, allowed layers are: [{{allowed}}]'
|
||||||
|
},
|
||||||
|
docs: {
|
||||||
|
url: 'https://github.com/microsoft/vscode/wiki/Source-Code-Organization'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
create(context) {
|
||||||
|
const fileDirname = path_1.dirname(context.getFilename());
|
||||||
|
const parts = fileDirname.split(/\\|\//);
|
||||||
|
const ruleArgs = context.options[0];
|
||||||
|
let config;
|
||||||
|
for (let i = parts.length - 1; i >= 0; i--) {
|
||||||
|
if (ruleArgs[parts[i]]) {
|
||||||
|
config = {
|
||||||
|
allowed: new Set(ruleArgs[parts[i]]).add(parts[i]),
|
||||||
|
disallowed: new Set()
|
||||||
|
};
|
||||||
|
Object.keys(ruleArgs).forEach(key => {
|
||||||
|
if (!config.allowed.has(key)) {
|
||||||
|
config.disallowed.add(key);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!config) {
|
||||||
|
// nothing
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
return utils_1.createImportRuleListener((node, path) => {
|
||||||
|
if (path[0] === '.') {
|
||||||
|
path = path_1.join(path_1.dirname(context.getFilename()), path);
|
||||||
|
}
|
||||||
|
const parts = path_1.dirname(path).split(/\\|\//);
|
||||||
|
for (let i = parts.length - 1; i >= 0; i--) {
|
||||||
|
const part = parts[i];
|
||||||
|
if (config.allowed.has(part)) {
|
||||||
|
// GOOD - same layer
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (config.disallowed.has(part)) {
|
||||||
|
// BAD - wrong layer
|
||||||
|
context.report({
|
||||||
|
loc: node.loc,
|
||||||
|
messageId: 'layerbreaker',
|
||||||
|
data: {
|
||||||
|
from: part,
|
||||||
|
allowed: [...config.allowed.keys()].join(', ')
|
||||||
|
}
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
83
build/lib/eslint/code-layering.ts
Normal file
83
build/lib/eslint/code-layering.ts
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
import * as eslint from 'eslint';
|
||||||
|
import { join, dirname } from 'path';
|
||||||
|
import { createImportRuleListener } from './utils';
|
||||||
|
|
||||||
|
type Config = {
|
||||||
|
allowed: Set<string>;
|
||||||
|
disallowed: Set<string>;
|
||||||
|
};
|
||||||
|
|
||||||
|
export = new class implements eslint.Rule.RuleModule {
|
||||||
|
|
||||||
|
readonly meta: eslint.Rule.RuleMetaData = {
|
||||||
|
messages: {
|
||||||
|
layerbreaker: 'Bad layering. You are not allowed to access {{from}} from here, allowed layers are: [{{allowed}}]'
|
||||||
|
},
|
||||||
|
docs: {
|
||||||
|
url: 'https://github.com/microsoft/vscode/wiki/Source-Code-Organization'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
|
||||||
|
|
||||||
|
const fileDirname = dirname(context.getFilename());
|
||||||
|
const parts = fileDirname.split(/\\|\//);
|
||||||
|
const ruleArgs = <Record<string, string[]>>context.options[0];
|
||||||
|
|
||||||
|
let config: Config | undefined;
|
||||||
|
for (let i = parts.length - 1; i >= 0; i--) {
|
||||||
|
if (ruleArgs[parts[i]]) {
|
||||||
|
config = {
|
||||||
|
allowed: new Set(ruleArgs[parts[i]]).add(parts[i]),
|
||||||
|
disallowed: new Set()
|
||||||
|
};
|
||||||
|
Object.keys(ruleArgs).forEach(key => {
|
||||||
|
if (!config!.allowed.has(key)) {
|
||||||
|
config!.disallowed.add(key);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!config) {
|
||||||
|
// nothing
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
return createImportRuleListener((node, path) => {
|
||||||
|
if (path[0] === '.') {
|
||||||
|
path = join(dirname(context.getFilename()), path);
|
||||||
|
}
|
||||||
|
|
||||||
|
const parts = dirname(path).split(/\\|\//);
|
||||||
|
for (let i = parts.length - 1; i >= 0; i--) {
|
||||||
|
const part = parts[i];
|
||||||
|
|
||||||
|
if (config!.allowed.has(part)) {
|
||||||
|
// GOOD - same layer
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config!.disallowed.has(part)) {
|
||||||
|
// BAD - wrong layer
|
||||||
|
context.report({
|
||||||
|
loc: node.loc,
|
||||||
|
messageId: 'layerbreaker',
|
||||||
|
data: {
|
||||||
|
from: part,
|
||||||
|
allowed: [...config!.allowed.keys()].join(', ')
|
||||||
|
}
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
38
build/lib/eslint/code-no-nls-in-standalone-editor.js
Normal file
38
build/lib/eslint/code-no-nls-in-standalone-editor.js
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
"use strict";
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
const path_1 = require("path");
|
||||||
|
const utils_1 = require("./utils");
|
||||||
|
module.exports = new class NoNlsInStandaloneEditorRule {
|
||||||
|
constructor() {
|
||||||
|
this.meta = {
|
||||||
|
messages: {
|
||||||
|
noNls: 'Not allowed to import vs/nls in standalone editor modules. Use standaloneStrings.ts'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
create(context) {
|
||||||
|
const fileName = context.getFilename();
|
||||||
|
if (/vs(\/|\\)editor(\/|\\)standalone(\/|\\)/.test(fileName)
|
||||||
|
|| /vs(\/|\\)editor(\/|\\)common(\/|\\)standalone(\/|\\)/.test(fileName)
|
||||||
|
|| /vs(\/|\\)editor(\/|\\)editor.api/.test(fileName)
|
||||||
|
|| /vs(\/|\\)editor(\/|\\)editor.main/.test(fileName)
|
||||||
|
|| /vs(\/|\\)editor(\/|\\)editor.worker/.test(fileName)) {
|
||||||
|
return utils_1.createImportRuleListener((node, path) => {
|
||||||
|
// resolve relative paths
|
||||||
|
if (path[0] === '.') {
|
||||||
|
path = path_1.join(context.getFilename(), path);
|
||||||
|
}
|
||||||
|
if (/vs(\/|\\)nls/.test(path)) {
|
||||||
|
context.report({
|
||||||
|
loc: node.loc,
|
||||||
|
messageId: 'noNls'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
};
|
||||||
48
build/lib/eslint/code-no-nls-in-standalone-editor.ts
Normal file
48
build/lib/eslint/code-no-nls-in-standalone-editor.ts
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
import * as eslint from 'eslint';
|
||||||
|
import { join } from 'path';
|
||||||
|
import { createImportRuleListener } from './utils';
|
||||||
|
|
||||||
|
export = new class NoNlsInStandaloneEditorRule implements eslint.Rule.RuleModule {
|
||||||
|
|
||||||
|
readonly meta: eslint.Rule.RuleMetaData = {
|
||||||
|
messages: {
|
||||||
|
noNls: 'Not allowed to import vs/nls in standalone editor modules. Use standaloneStrings.ts'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
|
||||||
|
|
||||||
|
const fileName = context.getFilename();
|
||||||
|
if (
|
||||||
|
/vs(\/|\\)editor(\/|\\)standalone(\/|\\)/.test(fileName)
|
||||||
|
|| /vs(\/|\\)editor(\/|\\)common(\/|\\)standalone(\/|\\)/.test(fileName)
|
||||||
|
|| /vs(\/|\\)editor(\/|\\)editor.api/.test(fileName)
|
||||||
|
|| /vs(\/|\\)editor(\/|\\)editor.main/.test(fileName)
|
||||||
|
|| /vs(\/|\\)editor(\/|\\)editor.worker/.test(fileName)
|
||||||
|
) {
|
||||||
|
return createImportRuleListener((node, path) => {
|
||||||
|
// resolve relative paths
|
||||||
|
if (path[0] === '.') {
|
||||||
|
path = join(context.getFilename(), path);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
/vs(\/|\\)nls/.test(path)
|
||||||
|
) {
|
||||||
|
context.report({
|
||||||
|
loc: node.loc,
|
||||||
|
messageId: 'noNls'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
41
build/lib/eslint/code-no-standalone-editor.js
Normal file
41
build/lib/eslint/code-no-standalone-editor.js
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
"use strict";
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
const path_1 = require("path");
|
||||||
|
const utils_1 = require("./utils");
|
||||||
|
module.exports = new class NoNlsInStandaloneEditorRule {
|
||||||
|
constructor() {
|
||||||
|
this.meta = {
|
||||||
|
messages: {
|
||||||
|
badImport: 'Not allowed to import standalone editor modules.'
|
||||||
|
},
|
||||||
|
docs: {
|
||||||
|
url: 'https://github.com/microsoft/vscode/wiki/Source-Code-Organization'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
create(context) {
|
||||||
|
if (/vs(\/|\\)editor/.test(context.getFilename())) {
|
||||||
|
// the vs/editor folder is allowed to use the standalone editor
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
return utils_1.createImportRuleListener((node, path) => {
|
||||||
|
// resolve relative paths
|
||||||
|
if (path[0] === '.') {
|
||||||
|
path = path_1.join(context.getFilename(), path);
|
||||||
|
}
|
||||||
|
if (/vs(\/|\\)editor(\/|\\)standalone(\/|\\)/.test(path)
|
||||||
|
|| /vs(\/|\\)editor(\/|\\)common(\/|\\)standalone(\/|\\)/.test(path)
|
||||||
|
|| /vs(\/|\\)editor(\/|\\)editor.api/.test(path)
|
||||||
|
|| /vs(\/|\\)editor(\/|\\)editor.main/.test(path)
|
||||||
|
|| /vs(\/|\\)editor(\/|\\)editor.worker/.test(path)) {
|
||||||
|
context.report({
|
||||||
|
loc: node.loc,
|
||||||
|
messageId: 'badImport'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
50
build/lib/eslint/code-no-standalone-editor.ts
Normal file
50
build/lib/eslint/code-no-standalone-editor.ts
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
import * as eslint from 'eslint';
|
||||||
|
import { join } from 'path';
|
||||||
|
import { createImportRuleListener } from './utils';
|
||||||
|
|
||||||
|
export = new class NoNlsInStandaloneEditorRule implements eslint.Rule.RuleModule {
|
||||||
|
|
||||||
|
readonly meta: eslint.Rule.RuleMetaData = {
|
||||||
|
messages: {
|
||||||
|
badImport: 'Not allowed to import standalone editor modules.'
|
||||||
|
},
|
||||||
|
docs: {
|
||||||
|
url: 'https://github.com/microsoft/vscode/wiki/Source-Code-Organization'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
|
||||||
|
|
||||||
|
if (/vs(\/|\\)editor/.test(context.getFilename())) {
|
||||||
|
// the vs/editor folder is allowed to use the standalone editor
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
return createImportRuleListener((node, path) => {
|
||||||
|
|
||||||
|
// resolve relative paths
|
||||||
|
if (path[0] === '.') {
|
||||||
|
path = join(context.getFilename(), path);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
/vs(\/|\\)editor(\/|\\)standalone(\/|\\)/.test(path)
|
||||||
|
|| /vs(\/|\\)editor(\/|\\)common(\/|\\)standalone(\/|\\)/.test(path)
|
||||||
|
|| /vs(\/|\\)editor(\/|\\)editor.api/.test(path)
|
||||||
|
|| /vs(\/|\\)editor(\/|\\)editor.main/.test(path)
|
||||||
|
|| /vs(\/|\\)editor(\/|\\)editor.worker/.test(path)
|
||||||
|
) {
|
||||||
|
context.report({
|
||||||
|
loc: node.loc,
|
||||||
|
messageId: 'badImport'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
111
build/lib/eslint/code-no-unexternalized-strings.js
Normal file
111
build/lib/eslint/code-no-unexternalized-strings.js
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
"use strict";
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
var _a;
|
||||||
|
const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
|
||||||
|
function isStringLiteral(node) {
|
||||||
|
return !!node && node.type === experimental_utils_1.AST_NODE_TYPES.Literal && typeof node.value === 'string';
|
||||||
|
}
|
||||||
|
function isDoubleQuoted(node) {
|
||||||
|
return node.raw[0] === '"' && node.raw[node.raw.length - 1] === '"';
|
||||||
|
}
|
||||||
|
module.exports = new (_a = class NoUnexternalizedStrings {
|
||||||
|
constructor() {
|
||||||
|
this.meta = {
|
||||||
|
messages: {
|
||||||
|
doubleQuoted: 'Only use double-quoted strings for externalized strings.',
|
||||||
|
badKey: 'The key \'{{key}}\' doesn\'t conform to a valid localize identifier.',
|
||||||
|
duplicateKey: 'Duplicate key \'{{key}}\' with different message value.',
|
||||||
|
badMessage: 'Message argument to \'{{message}}\' must be a string literal.'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
create(context) {
|
||||||
|
const externalizedStringLiterals = new Map();
|
||||||
|
const doubleQuotedStringLiterals = new Set();
|
||||||
|
function collectDoubleQuotedStrings(node) {
|
||||||
|
if (isStringLiteral(node) && isDoubleQuoted(node)) {
|
||||||
|
doubleQuotedStringLiterals.add(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function visitLocalizeCall(node) {
|
||||||
|
// localize(key, message)
|
||||||
|
const [keyNode, messageNode] = node.arguments;
|
||||||
|
// (1)
|
||||||
|
// extract key so that it can be checked later
|
||||||
|
let key;
|
||||||
|
if (isStringLiteral(keyNode)) {
|
||||||
|
doubleQuotedStringLiterals.delete(keyNode); //todo@joh reconsider
|
||||||
|
key = keyNode.value;
|
||||||
|
}
|
||||||
|
else if (keyNode.type === experimental_utils_1.AST_NODE_TYPES.ObjectExpression) {
|
||||||
|
for (let property of keyNode.properties) {
|
||||||
|
if (property.type === experimental_utils_1.AST_NODE_TYPES.Property && !property.computed) {
|
||||||
|
if (property.key.type === experimental_utils_1.AST_NODE_TYPES.Identifier && property.key.name === 'key') {
|
||||||
|
if (isStringLiteral(property.value)) {
|
||||||
|
doubleQuotedStringLiterals.delete(property.value); //todo@joh reconsider
|
||||||
|
key = property.value.value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (typeof key === 'string') {
|
||||||
|
let array = externalizedStringLiterals.get(key);
|
||||||
|
if (!array) {
|
||||||
|
array = [];
|
||||||
|
externalizedStringLiterals.set(key, array);
|
||||||
|
}
|
||||||
|
array.push({ call: node, message: messageNode });
|
||||||
|
}
|
||||||
|
// (2)
|
||||||
|
// remove message-argument from doubleQuoted list and make
|
||||||
|
// sure it is a string-literal
|
||||||
|
doubleQuotedStringLiterals.delete(messageNode);
|
||||||
|
if (!isStringLiteral(messageNode)) {
|
||||||
|
context.report({
|
||||||
|
loc: messageNode.loc,
|
||||||
|
messageId: 'badMessage',
|
||||||
|
data: { message: context.getSourceCode().getText(node) }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function reportBadStringsAndBadKeys() {
|
||||||
|
// (1)
|
||||||
|
// report all strings that are in double quotes
|
||||||
|
for (const node of doubleQuotedStringLiterals) {
|
||||||
|
context.report({ loc: node.loc, messageId: 'doubleQuoted' });
|
||||||
|
}
|
||||||
|
for (const [key, values] of externalizedStringLiterals) {
|
||||||
|
// (2)
|
||||||
|
// report all invalid NLS keys
|
||||||
|
if (!key.match(NoUnexternalizedStrings._rNlsKeys)) {
|
||||||
|
for (let value of values) {
|
||||||
|
context.report({ loc: value.call.loc, messageId: 'badKey', data: { key } });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// (2)
|
||||||
|
// report all invalid duplicates (same key, different message)
|
||||||
|
if (values.length > 1) {
|
||||||
|
for (let i = 1; i < values.length; i++) {
|
||||||
|
if (context.getSourceCode().getText(values[i - 1].message) !== context.getSourceCode().getText(values[i].message)) {
|
||||||
|
context.report({ loc: values[i].call.loc, messageId: 'duplicateKey', data: { key } });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
['Literal']: (node) => collectDoubleQuotedStrings(node),
|
||||||
|
['ExpressionStatement[directive] Literal:exit']: (node) => doubleQuotedStringLiterals.delete(node),
|
||||||
|
['CallExpression[callee.type="MemberExpression"][callee.object.name="nls"][callee.property.name="localize"]:exit']: (node) => visitLocalizeCall(node),
|
||||||
|
['CallExpression[callee.name="localize"][arguments.length>=2]:exit']: (node) => visitLocalizeCall(node),
|
||||||
|
['Program:exit']: reportBadStringsAndBadKeys,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_a._rNlsKeys = /^[_a-zA-Z0-9][ .\-_a-zA-Z0-9]*$/,
|
||||||
|
_a);
|
||||||
126
build/lib/eslint/code-no-unexternalized-strings.ts
Normal file
126
build/lib/eslint/code-no-unexternalized-strings.ts
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
import * as eslint from 'eslint';
|
||||||
|
import { TSESTree, AST_NODE_TYPES } from '@typescript-eslint/experimental-utils';
|
||||||
|
|
||||||
|
function isStringLiteral(node: TSESTree.Node | null | undefined): node is TSESTree.StringLiteral {
|
||||||
|
return !!node && node.type === AST_NODE_TYPES.Literal && typeof node.value === 'string';
|
||||||
|
}
|
||||||
|
|
||||||
|
function isDoubleQuoted(node: TSESTree.StringLiteral): boolean {
|
||||||
|
return node.raw[0] === '"' && node.raw[node.raw.length - 1] === '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
export = new class NoUnexternalizedStrings implements eslint.Rule.RuleModule {
|
||||||
|
|
||||||
|
private static _rNlsKeys = /^[_a-zA-Z0-9][ .\-_a-zA-Z0-9]*$/;
|
||||||
|
|
||||||
|
readonly meta: eslint.Rule.RuleMetaData = {
|
||||||
|
messages: {
|
||||||
|
doubleQuoted: 'Only use double-quoted strings for externalized strings.',
|
||||||
|
badKey: 'The key \'{{key}}\' doesn\'t conform to a valid localize identifier.',
|
||||||
|
duplicateKey: 'Duplicate key \'{{key}}\' with different message value.',
|
||||||
|
badMessage: 'Message argument to \'{{message}}\' must be a string literal.'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
|
||||||
|
|
||||||
|
const externalizedStringLiterals = new Map<string, { call: TSESTree.CallExpression, message: TSESTree.Node }[]>();
|
||||||
|
const doubleQuotedStringLiterals = new Set<TSESTree.Node>();
|
||||||
|
|
||||||
|
function collectDoubleQuotedStrings(node: TSESTree.Literal) {
|
||||||
|
if (isStringLiteral(node) && isDoubleQuoted(node)) {
|
||||||
|
doubleQuotedStringLiterals.add(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function visitLocalizeCall(node: TSESTree.CallExpression) {
|
||||||
|
|
||||||
|
// localize(key, message)
|
||||||
|
const [keyNode, messageNode] = (<TSESTree.CallExpression>node).arguments;
|
||||||
|
|
||||||
|
// (1)
|
||||||
|
// extract key so that it can be checked later
|
||||||
|
let key: string | undefined;
|
||||||
|
if (isStringLiteral(keyNode)) {
|
||||||
|
doubleQuotedStringLiterals.delete(keyNode); //todo@joh reconsider
|
||||||
|
key = keyNode.value;
|
||||||
|
|
||||||
|
} else if (keyNode.type === AST_NODE_TYPES.ObjectExpression) {
|
||||||
|
for (let property of keyNode.properties) {
|
||||||
|
if (property.type === AST_NODE_TYPES.Property && !property.computed) {
|
||||||
|
if (property.key.type === AST_NODE_TYPES.Identifier && property.key.name === 'key') {
|
||||||
|
if (isStringLiteral(property.value)) {
|
||||||
|
doubleQuotedStringLiterals.delete(property.value); //todo@joh reconsider
|
||||||
|
key = property.value.value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (typeof key === 'string') {
|
||||||
|
let array = externalizedStringLiterals.get(key);
|
||||||
|
if (!array) {
|
||||||
|
array = [];
|
||||||
|
externalizedStringLiterals.set(key, array);
|
||||||
|
}
|
||||||
|
array.push({ call: node, message: messageNode });
|
||||||
|
}
|
||||||
|
|
||||||
|
// (2)
|
||||||
|
// remove message-argument from doubleQuoted list and make
|
||||||
|
// sure it is a string-literal
|
||||||
|
doubleQuotedStringLiterals.delete(messageNode);
|
||||||
|
if (!isStringLiteral(messageNode)) {
|
||||||
|
context.report({
|
||||||
|
loc: messageNode.loc,
|
||||||
|
messageId: 'badMessage',
|
||||||
|
data: { message: context.getSourceCode().getText(<any>node) }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function reportBadStringsAndBadKeys() {
|
||||||
|
// (1)
|
||||||
|
// report all strings that are in double quotes
|
||||||
|
for (const node of doubleQuotedStringLiterals) {
|
||||||
|
context.report({ loc: node.loc, messageId: 'doubleQuoted' });
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const [key, values] of externalizedStringLiterals) {
|
||||||
|
|
||||||
|
// (2)
|
||||||
|
// report all invalid NLS keys
|
||||||
|
if (!key.match(NoUnexternalizedStrings._rNlsKeys)) {
|
||||||
|
for (let value of values) {
|
||||||
|
context.report({ loc: value.call.loc, messageId: 'badKey', data: { key } });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// (2)
|
||||||
|
// report all invalid duplicates (same key, different message)
|
||||||
|
if (values.length > 1) {
|
||||||
|
for (let i = 1; i < values.length; i++) {
|
||||||
|
if (context.getSourceCode().getText(<any>values[i - 1].message) !== context.getSourceCode().getText(<any>values[i].message)) {
|
||||||
|
context.report({ loc: values[i].call.loc, messageId: 'duplicateKey', data: { key } });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
['Literal']: (node: any) => collectDoubleQuotedStrings(node),
|
||||||
|
['ExpressionStatement[directive] Literal:exit']: (node: any) => doubleQuotedStringLiterals.delete(node),
|
||||||
|
['CallExpression[callee.type="MemberExpression"][callee.object.name="nls"][callee.property.name="localize"]:exit']: (node: any) => visitLocalizeCall(node),
|
||||||
|
['CallExpression[callee.name="localize"][arguments.length>=2]:exit']: (node: any) => visitLocalizeCall(node),
|
||||||
|
['Program:exit']: reportBadStringsAndBadKeys,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
145
build/lib/eslint/code-no-unused-expressions.js
Normal file
145
build/lib/eslint/code-no-unused-expressions.js
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
// FORKED FROM https://github.com/eslint/eslint/blob/b23ad0d789a909baf8d7c41a35bc53df932eaf30/lib/rules/no-unused-expressions.js
|
||||||
|
// and added support for `OptionalCallExpression`, see https://github.com/facebook/create-react-app/issues/8107 and https://github.com/eslint/eslint/issues/12642
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @fileoverview Flag expressions in statement position that do not side effect
|
||||||
|
* @author Michael Ficarra
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Rule Definition
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
meta: {
|
||||||
|
type: 'suggestion',
|
||||||
|
|
||||||
|
docs: {
|
||||||
|
description: 'disallow unused expressions',
|
||||||
|
category: 'Best Practices',
|
||||||
|
recommended: false,
|
||||||
|
url: 'https://eslint.org/docs/rules/no-unused-expressions'
|
||||||
|
},
|
||||||
|
|
||||||
|
schema: [
|
||||||
|
{
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
allowShortCircuit: {
|
||||||
|
type: 'boolean',
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
allowTernary: {
|
||||||
|
type: 'boolean',
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
allowTaggedTemplates: {
|
||||||
|
type: 'boolean',
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
additionalProperties: false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
create(context) {
|
||||||
|
const config = context.options[0] || {},
|
||||||
|
allowShortCircuit = config.allowShortCircuit || false,
|
||||||
|
allowTernary = config.allowTernary || false,
|
||||||
|
allowTaggedTemplates = config.allowTaggedTemplates || false;
|
||||||
|
|
||||||
|
// eslint-disable-next-line jsdoc/require-description
|
||||||
|
/**
|
||||||
|
* @param {ASTNode} node any node
|
||||||
|
* @returns {boolean} whether the given node structurally represents a directive
|
||||||
|
*/
|
||||||
|
function looksLikeDirective(node) {
|
||||||
|
return node.type === 'ExpressionStatement' &&
|
||||||
|
node.expression.type === 'Literal' && typeof node.expression.value === 'string';
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line jsdoc/require-description
|
||||||
|
/**
|
||||||
|
* @param {Function} predicate ([a] -> Boolean) the function used to make the determination
|
||||||
|
* @param {a[]} list the input list
|
||||||
|
* @returns {a[]} the leading sequence of members in the given list that pass the given predicate
|
||||||
|
*/
|
||||||
|
function takeWhile(predicate, list) {
|
||||||
|
for (let i = 0; i < list.length; ++i) {
|
||||||
|
if (!predicate(list[i])) {
|
||||||
|
return list.slice(0, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return list.slice();
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line jsdoc/require-description
|
||||||
|
/**
|
||||||
|
* @param {ASTNode} node a Program or BlockStatement node
|
||||||
|
* @returns {ASTNode[]} the leading sequence of directive nodes in the given node's body
|
||||||
|
*/
|
||||||
|
function directives(node) {
|
||||||
|
return takeWhile(looksLikeDirective, node.body);
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line jsdoc/require-description
|
||||||
|
/**
|
||||||
|
* @param {ASTNode} node any node
|
||||||
|
* @param {ASTNode[]} ancestors the given node's ancestors
|
||||||
|
* @returns {boolean} whether the given node is considered a directive in its current position
|
||||||
|
*/
|
||||||
|
function isDirective(node, ancestors) {
|
||||||
|
const parent = ancestors[ancestors.length - 1],
|
||||||
|
grandparent = ancestors[ancestors.length - 2];
|
||||||
|
|
||||||
|
return (parent.type === 'Program' || parent.type === 'BlockStatement' &&
|
||||||
|
(/Function/u.test(grandparent.type))) &&
|
||||||
|
directives(parent).indexOf(node) >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines whether or not a given node is a valid expression. Recurses on short circuit eval and ternary nodes if enabled by flags.
|
||||||
|
* @param {ASTNode} node any node
|
||||||
|
* @returns {boolean} whether the given node is a valid expression
|
||||||
|
*/
|
||||||
|
function isValidExpression(node) {
|
||||||
|
if (allowTernary) {
|
||||||
|
|
||||||
|
// Recursive check for ternary and logical expressions
|
||||||
|
if (node.type === 'ConditionalExpression') {
|
||||||
|
return isValidExpression(node.consequent) && isValidExpression(node.alternate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (allowShortCircuit) {
|
||||||
|
if (node.type === 'LogicalExpression') {
|
||||||
|
return isValidExpression(node.right);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (allowTaggedTemplates && node.type === 'TaggedTemplateExpression') {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return /^(?:Assignment|OptionalCall|Call|New|Update|Yield|Await)Expression$/u.test(node.type) ||
|
||||||
|
(node.type === 'UnaryExpression' && ['delete', 'void'].indexOf(node.operator) >= 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
ExpressionStatement(node) {
|
||||||
|
if (!isValidExpression(node.expression) && !isDirective(node, context.getAncestors())) {
|
||||||
|
context.report({ node, message: 'Expected an assignment or function call and instead saw an expression.' });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
57
build/lib/eslint/code-translation-remind.js
Normal file
57
build/lib/eslint/code-translation-remind.js
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
"use strict";
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
var _a;
|
||||||
|
const fs_1 = require("fs");
|
||||||
|
const utils_1 = require("./utils");
|
||||||
|
module.exports = new (_a = class TranslationRemind {
|
||||||
|
constructor() {
|
||||||
|
this.meta = {
|
||||||
|
messages: {
|
||||||
|
missing: 'Please add \'{{resource}}\' to ./build/lib/i18n.resources.json file to use translations here.'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
create(context) {
|
||||||
|
return utils_1.createImportRuleListener((node, path) => this._checkImport(context, node, path));
|
||||||
|
}
|
||||||
|
_checkImport(context, node, path) {
|
||||||
|
if (path !== TranslationRemind.NLS_MODULE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const currentFile = context.getFilename();
|
||||||
|
const matchService = currentFile.match(/vs\/workbench\/services\/\w+/);
|
||||||
|
const matchPart = currentFile.match(/vs\/workbench\/contrib\/\w+/);
|
||||||
|
if (!matchService && !matchPart) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const resource = matchService ? matchService[0] : matchPart[0];
|
||||||
|
let resourceDefined = false;
|
||||||
|
let json;
|
||||||
|
try {
|
||||||
|
json = fs_1.readFileSync('./build/lib/i18n.resources.json', 'utf8');
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
console.error('[translation-remind rule]: File with resources to pull from Transifex was not found. Aborting translation resource check for newly defined workbench part/service.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const workbenchResources = JSON.parse(json).workbench;
|
||||||
|
workbenchResources.forEach((existingResource) => {
|
||||||
|
if (existingResource.name === resource) {
|
||||||
|
resourceDefined = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (!resourceDefined) {
|
||||||
|
context.report({
|
||||||
|
loc: node.loc,
|
||||||
|
messageId: 'missing',
|
||||||
|
data: { resource }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_a.NLS_MODULE = 'vs/nls',
|
||||||
|
_a);
|
||||||
67
build/lib/eslint/code-translation-remind.ts
Normal file
67
build/lib/eslint/code-translation-remind.ts
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
import * as eslint from 'eslint';
|
||||||
|
import { TSESTree } from '@typescript-eslint/experimental-utils';
|
||||||
|
import { readFileSync } from 'fs';
|
||||||
|
import { createImportRuleListener } from './utils';
|
||||||
|
|
||||||
|
|
||||||
|
export = new class TranslationRemind implements eslint.Rule.RuleModule {
|
||||||
|
|
||||||
|
private static NLS_MODULE = 'vs/nls';
|
||||||
|
|
||||||
|
readonly meta: eslint.Rule.RuleMetaData = {
|
||||||
|
messages: {
|
||||||
|
missing: 'Please add \'{{resource}}\' to ./build/lib/i18n.resources.json file to use translations here.'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
|
||||||
|
return createImportRuleListener((node, path) => this._checkImport(context, node, path));
|
||||||
|
}
|
||||||
|
|
||||||
|
private _checkImport(context: eslint.Rule.RuleContext, node: TSESTree.Node, path: string) {
|
||||||
|
|
||||||
|
if (path !== TranslationRemind.NLS_MODULE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const currentFile = context.getFilename();
|
||||||
|
const matchService = currentFile.match(/vs\/workbench\/services\/\w+/);
|
||||||
|
const matchPart = currentFile.match(/vs\/workbench\/contrib\/\w+/);
|
||||||
|
if (!matchService && !matchPart) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const resource = matchService ? matchService[0] : matchPart![0];
|
||||||
|
let resourceDefined = false;
|
||||||
|
|
||||||
|
let json;
|
||||||
|
try {
|
||||||
|
json = readFileSync('./build/lib/i18n.resources.json', 'utf8');
|
||||||
|
} catch (e) {
|
||||||
|
console.error('[translation-remind rule]: File with resources to pull from Transifex was not found. Aborting translation resource check for newly defined workbench part/service.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const workbenchResources = JSON.parse(json).workbench;
|
||||||
|
|
||||||
|
workbenchResources.forEach((existingResource: any) => {
|
||||||
|
if (existingResource.name === resource) {
|
||||||
|
resourceDefined = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!resourceDefined) {
|
||||||
|
context.report({
|
||||||
|
loc: node.loc,
|
||||||
|
messageId: 'missing',
|
||||||
|
data: { resource }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
36
build/lib/eslint/utils.js
Normal file
36
build/lib/eslint/utils.js
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
"use strict";
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
function createImportRuleListener(validateImport) {
|
||||||
|
function _checkImport(node) {
|
||||||
|
if (node && node.type === 'Literal' && typeof node.value === 'string') {
|
||||||
|
validateImport(node, node.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
// import ??? from 'module'
|
||||||
|
ImportDeclaration: (node) => {
|
||||||
|
_checkImport(node.source);
|
||||||
|
},
|
||||||
|
// import('module').then(...) OR await import('module')
|
||||||
|
['CallExpression[callee.type="Import"][arguments.length=1] > Literal']: (node) => {
|
||||||
|
_checkImport(node);
|
||||||
|
},
|
||||||
|
// import foo = ...
|
||||||
|
['TSImportEqualsDeclaration > TSExternalModuleReference > Literal']: (node) => {
|
||||||
|
_checkImport(node);
|
||||||
|
},
|
||||||
|
// export ?? from 'module'
|
||||||
|
ExportAllDeclaration: (node) => {
|
||||||
|
_checkImport(node.source);
|
||||||
|
},
|
||||||
|
// export {foo} from 'module'
|
||||||
|
ExportNamedDeclaration: (node) => {
|
||||||
|
_checkImport(node.source);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
exports.createImportRuleListener = createImportRuleListener;
|
||||||
40
build/lib/eslint/utils.ts
Normal file
40
build/lib/eslint/utils.ts
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
import * as eslint from 'eslint';
|
||||||
|
import { TSESTree } from '@typescript-eslint/experimental-utils';
|
||||||
|
|
||||||
|
export function createImportRuleListener(validateImport: (node: TSESTree.Literal, value: string) => any): eslint.Rule.RuleListener {
|
||||||
|
|
||||||
|
function _checkImport(node: TSESTree.Node | null) {
|
||||||
|
if (node && node.type === 'Literal' && typeof node.value === 'string') {
|
||||||
|
validateImport(node, node.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
// import ??? from 'module'
|
||||||
|
ImportDeclaration: (node: any) => {
|
||||||
|
_checkImport((<TSESTree.ImportDeclaration>node).source);
|
||||||
|
},
|
||||||
|
// import('module').then(...) OR await import('module')
|
||||||
|
['CallExpression[callee.type="Import"][arguments.length=1] > Literal']: (node: any) => {
|
||||||
|
_checkImport(node);
|
||||||
|
},
|
||||||
|
// import foo = ...
|
||||||
|
['TSImportEqualsDeclaration > TSExternalModuleReference > Literal']: (node: any) => {
|
||||||
|
_checkImport(node);
|
||||||
|
},
|
||||||
|
// export ?? from 'module'
|
||||||
|
ExportAllDeclaration: (node: any) => {
|
||||||
|
_checkImport((<TSESTree.ExportAllDeclaration>node).source);
|
||||||
|
},
|
||||||
|
// export {foo} from 'module'
|
||||||
|
ExportNamedDeclaration: (node: any) => {
|
||||||
|
_checkImport((<TSESTree.ExportNamedDeclaration>node).source);
|
||||||
|
},
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -27,6 +27,7 @@ const util = require('./util');
|
|||||||
const root = path.dirname(path.dirname(__dirname));
|
const root = path.dirname(path.dirname(__dirname));
|
||||||
const commit = util.getVersion(root);
|
const commit = util.getVersion(root);
|
||||||
const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`;
|
const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`;
|
||||||
|
const product = require('../../product.json');
|
||||||
function fromLocal(extensionPath) {
|
function fromLocal(extensionPath) {
|
||||||
const webpackFilename = path.join(extensionPath, 'extension.webpack.config.js');
|
const webpackFilename = path.join(extensionPath, 'extension.webpack.config.js');
|
||||||
const input = fs.existsSync(webpackFilename)
|
const input = fs.existsSync(webpackFilename)
|
||||||
@@ -185,13 +186,15 @@ const excludedExtensions = [
|
|||||||
'vscode-test-resolver',
|
'vscode-test-resolver',
|
||||||
'ms-vscode.node-debug',
|
'ms-vscode.node-debug',
|
||||||
'ms-vscode.node-debug2',
|
'ms-vscode.node-debug2',
|
||||||
// {{SQL CARBON EDIT}}
|
'integration-tests',
|
||||||
'integration-tests'
|
'ms.vscode.js-debug-nightly'
|
||||||
];
|
];
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
const sqlBuiltInExtensions = [
|
const externalExtensions = [
|
||||||
// Add SQL built-in extensions here.
|
// This is the list of SQL extensions which the source code is included in this repository, but
|
||||||
// the extension will be excluded from SQLOps package and will have separate vsix packages
|
// they get packaged separately. Adding extension name here, will make the build to create
|
||||||
|
// a separate vsix package for the extension and the extension will be excluded from the main package.
|
||||||
|
// Any extension not included here will be installed by default.
|
||||||
'admin-tool-ext-win',
|
'admin-tool-ext-win',
|
||||||
'agent',
|
'agent',
|
||||||
'import',
|
'import',
|
||||||
@@ -201,10 +204,17 @@ const sqlBuiltInExtensions = [
|
|||||||
'schema-compare',
|
'schema-compare',
|
||||||
'cms',
|
'cms',
|
||||||
'query-history',
|
'query-history',
|
||||||
'liveshare'
|
'liveshare',
|
||||||
|
'sql-database-projects',
|
||||||
|
'machine-learning-services'
|
||||||
];
|
];
|
||||||
const builtInExtensions = process.env['VSCODE_QUALITY'] === 'stable' ? require('../builtInExtensions.json') : require('../builtInExtensions-insiders.json');
|
// extensions that require a rebuild since they have native parts
|
||||||
// {{SQL CARBON EDIT}} - End
|
const rebuildExtensions = [
|
||||||
|
'big-data-cluster',
|
||||||
|
'mssql'
|
||||||
|
];
|
||||||
|
const builtInExtensions = require('../builtInExtensions.json')
|
||||||
|
.filter(({ forQualities }) => { var _a; return !product.quality || ((_a = forQualities === null || forQualities === void 0 ? void 0 : forQualities.includes) === null || _a === void 0 ? void 0 : _a.call(forQualities, product.quality)) !== false; });
|
||||||
function packageLocalExtensionsStream() {
|
function packageLocalExtensionsStream() {
|
||||||
const localExtensionDescriptions = glob.sync('extensions/*/package.json')
|
const localExtensionDescriptions = glob.sync('extensions/*/package.json')
|
||||||
.map(manifestPath => {
|
.map(manifestPath => {
|
||||||
@@ -214,7 +224,7 @@ function packageLocalExtensionsStream() {
|
|||||||
})
|
})
|
||||||
.filter(({ name }) => excludedExtensions.indexOf(name) === -1)
|
.filter(({ name }) => excludedExtensions.indexOf(name) === -1)
|
||||||
.filter(({ name }) => builtInExtensions.every(b => b.name !== name))
|
.filter(({ name }) => builtInExtensions.every(b => b.name !== name))
|
||||||
.filter(({ name }) => sqlBuiltInExtensions.indexOf(name) === -1); // {{SQL CARBON EDIT}} add aditional filter
|
.filter(({ name }) => externalExtensions.indexOf(name) === -1); // {{SQL CARBON EDIT}} Remove external Extensions with separate package
|
||||||
const nodeModules = gulp.src('extensions/node_modules/**', { base: '.' });
|
const nodeModules = gulp.src('extensions/node_modules/**', { base: '.' });
|
||||||
const localExtensions = localExtensionDescriptions.map(extension => {
|
const localExtensions = localExtensionDescriptions.map(extension => {
|
||||||
return fromLocal(extension.path)
|
return fromLocal(extension.path)
|
||||||
@@ -233,66 +243,40 @@ function packageMarketplaceExtensionsStream() {
|
|||||||
.pipe(util2.setExecutableBit(['**/*.sh']));
|
.pipe(util2.setExecutableBit(['**/*.sh']));
|
||||||
}
|
}
|
||||||
exports.packageMarketplaceExtensionsStream = packageMarketplaceExtensionsStream;
|
exports.packageMarketplaceExtensionsStream = packageMarketplaceExtensionsStream;
|
||||||
const vfs = require("vinyl-fs");
|
function packageExternalExtensionsStream() {
|
||||||
function packageBuiltInExtensions() {
|
const extenalExtensionDescriptions = glob.sync('extensions/*/package.json')
|
||||||
const sqlBuiltInLocalExtensionDescriptions = glob.sync('extensions/*/package.json')
|
|
||||||
.map(manifestPath => {
|
.map(manifestPath => {
|
||||||
const extensionPath = path.dirname(path.join(root, manifestPath));
|
const extensionPath = path.dirname(path.join(root, manifestPath));
|
||||||
const extensionName = path.basename(extensionPath);
|
const extensionName = path.basename(extensionPath);
|
||||||
return { name: extensionName, path: extensionPath };
|
return { name: extensionName, path: extensionPath };
|
||||||
})
|
})
|
||||||
.filter(({ name }) => excludedExtensions.indexOf(name) === -1)
|
.filter(({ name }) => externalExtensions.indexOf(name) >= 0);
|
||||||
.filter(({ name }) => builtInExtensions.every(b => b.name !== name))
|
const builtExtensions = extenalExtensionDescriptions.map(extension => {
|
||||||
.filter(({ name }) => sqlBuiltInExtensions.indexOf(name) >= 0);
|
return fromLocal(extension.path)
|
||||||
const visxDirectory = path.join(path.dirname(root), 'vsix');
|
.pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
|
||||||
try {
|
|
||||||
if (!fs.existsSync(visxDirectory)) {
|
|
||||||
fs.mkdirSync(visxDirectory);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (err) {
|
|
||||||
// don't fail the build if the output directory already exists
|
|
||||||
console.warn(err);
|
|
||||||
}
|
|
||||||
sqlBuiltInLocalExtensionDescriptions.forEach(element => {
|
|
||||||
let pkgJson = JSON.parse(fs.readFileSync(path.join(element.path, 'package.json'), { encoding: 'utf8' }));
|
|
||||||
const packagePath = path.join(visxDirectory, `${pkgJson.name}-${pkgJson.version}.vsix`);
|
|
||||||
console.info('Creating vsix for ' + element.path + ' result:' + packagePath);
|
|
||||||
vsce.createVSIX({
|
|
||||||
cwd: element.path,
|
|
||||||
packagePath: packagePath,
|
|
||||||
useYarn: true
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
return es.merge(builtExtensions);
|
||||||
}
|
}
|
||||||
exports.packageBuiltInExtensions = packageBuiltInExtensions;
|
exports.packageExternalExtensionsStream = packageExternalExtensionsStream;
|
||||||
function packageExtensionTask(extensionName, platform, arch) {
|
|
||||||
var destination = path.join(path.dirname(root), 'azuredatastudio') + (platform ? '-' + platform : '') + (arch ? '-' + arch : '');
|
|
||||||
if (platform === 'darwin') {
|
|
||||||
destination = path.join(destination, 'Azure Data Studio.app', 'Contents', 'Resources', 'app', 'extensions', extensionName);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
destination = path.join(destination, 'resources', 'app', 'extensions', extensionName);
|
|
||||||
}
|
|
||||||
platform = platform || process.platform;
|
|
||||||
return () => {
|
|
||||||
const root = path.resolve(path.join(__dirname, '../..'));
|
|
||||||
const localExtensionDescriptions = glob.sync('extensions/*/package.json')
|
|
||||||
.map(manifestPath => {
|
|
||||||
const extensionPath = path.dirname(path.join(root, manifestPath));
|
|
||||||
const extensionName = path.basename(extensionPath);
|
|
||||||
return { name: extensionName, path: extensionPath };
|
|
||||||
})
|
|
||||||
.filter(({ name }) => extensionName === name);
|
|
||||||
const localExtensions = es.merge(...localExtensionDescriptions.map(extension => {
|
|
||||||
return fromLocal(extension.path);
|
|
||||||
}));
|
|
||||||
let result = localExtensions
|
|
||||||
.pipe(util2.skipDirectories())
|
|
||||||
.pipe(util2.fixWin32DirectoryPermissions())
|
|
||||||
.pipe(filter(['**', '!LICENSE', '!LICENSES.chromium.html', '!version']));
|
|
||||||
return result.pipe(vfs.dest(destination));
|
|
||||||
};
|
|
||||||
}
|
|
||||||
exports.packageExtensionTask = packageExtensionTask;
|
|
||||||
// {{SQL CARBON EDIT}} - End
|
// {{SQL CARBON EDIT}} - End
|
||||||
|
function cleanRebuildExtensions(root) {
|
||||||
|
return Promise.all(rebuildExtensions.map(async (e) => {
|
||||||
|
await util2.rimraf(path.join(root, e))();
|
||||||
|
})).then();
|
||||||
|
}
|
||||||
|
exports.cleanRebuildExtensions = cleanRebuildExtensions;
|
||||||
|
function packageRebuildExtensionsStream() {
|
||||||
|
const extenalExtensionDescriptions = glob.sync('extensions/*/package.json')
|
||||||
|
.map(manifestPath => {
|
||||||
|
const extensionPath = path.dirname(path.join(root, manifestPath));
|
||||||
|
const extensionName = path.basename(extensionPath);
|
||||||
|
return { name: extensionName, path: extensionPath };
|
||||||
|
})
|
||||||
|
.filter(({ name }) => rebuildExtensions.indexOf(name) >= 0);
|
||||||
|
const builtExtensions = extenalExtensionDescriptions.map(extension => {
|
||||||
|
return fromLocal(extension.path)
|
||||||
|
.pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
|
||||||
|
});
|
||||||
|
return es.merge(builtExtensions);
|
||||||
|
}
|
||||||
|
exports.packageRebuildExtensionsStream = packageRebuildExtensionsStream;
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ const util = require('./util');
|
|||||||
const root = path.dirname(path.dirname(__dirname));
|
const root = path.dirname(path.dirname(__dirname));
|
||||||
const commit = util.getVersion(root);
|
const commit = util.getVersion(root);
|
||||||
const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`;
|
const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`;
|
||||||
|
const product = require('../../product.json');
|
||||||
|
|
||||||
function fromLocal(extensionPath: string): Stream {
|
function fromLocal(extensionPath: string): Stream {
|
||||||
const webpackFilename = path.join(extensionPath, 'extension.webpack.config.js');
|
const webpackFilename = path.join(extensionPath, 'extension.webpack.config.js');
|
||||||
@@ -220,14 +221,16 @@ const excludedExtensions = [
|
|||||||
'vscode-test-resolver',
|
'vscode-test-resolver',
|
||||||
'ms-vscode.node-debug',
|
'ms-vscode.node-debug',
|
||||||
'ms-vscode.node-debug2',
|
'ms-vscode.node-debug2',
|
||||||
// {{SQL CARBON EDIT}}
|
'integration-tests', // {{SQL CARBON EDIT}}
|
||||||
'integration-tests'
|
'ms.vscode.js-debug-nightly'
|
||||||
];
|
];
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
const sqlBuiltInExtensions = [
|
const externalExtensions = [
|
||||||
// Add SQL built-in extensions here.
|
// This is the list of SQL extensions which the source code is included in this repository, but
|
||||||
// the extension will be excluded from SQLOps package and will have separate vsix packages
|
// they get packaged separately. Adding extension name here, will make the build to create
|
||||||
|
// a separate vsix package for the extension and the extension will be excluded from the main package.
|
||||||
|
// Any extension not included here will be installed by default.
|
||||||
'admin-tool-ext-win',
|
'admin-tool-ext-win',
|
||||||
'agent',
|
'agent',
|
||||||
'import',
|
'import',
|
||||||
@@ -237,20 +240,27 @@ const sqlBuiltInExtensions = [
|
|||||||
'schema-compare',
|
'schema-compare',
|
||||||
'cms',
|
'cms',
|
||||||
'query-history',
|
'query-history',
|
||||||
'liveshare'
|
'liveshare',
|
||||||
|
'sql-database-projects',
|
||||||
|
'machine-learning-services'
|
||||||
|
];
|
||||||
|
|
||||||
|
// extensions that require a rebuild since they have native parts
|
||||||
|
const rebuildExtensions = [
|
||||||
|
'big-data-cluster',
|
||||||
|
'mssql'
|
||||||
];
|
];
|
||||||
|
|
||||||
interface IBuiltInExtension {
|
interface IBuiltInExtension {
|
||||||
name: string;
|
name: string;
|
||||||
version: string;
|
version: string;
|
||||||
repo: string;
|
repo: string;
|
||||||
|
forQualities?: ReadonlyArray<string>;
|
||||||
metadata: any;
|
metadata: any;
|
||||||
}
|
}
|
||||||
|
|
||||||
const builtInExtensions: IBuiltInExtension[] = process.env['VSCODE_QUALITY'] === 'stable' ? require('../builtInExtensions.json') : require('../builtInExtensions-insiders.json');
|
const builtInExtensions = (<IBuiltInExtension[]>require('../builtInExtensions.json'))
|
||||||
|
.filter(({ forQualities }) => !product.quality || forQualities?.includes?.(product.quality) !== false);
|
||||||
// {{SQL CARBON EDIT}} - End
|
|
||||||
|
|
||||||
|
|
||||||
export function packageLocalExtensionsStream(): NodeJS.ReadWriteStream {
|
export function packageLocalExtensionsStream(): NodeJS.ReadWriteStream {
|
||||||
const localExtensionDescriptions = (<string[]>glob.sync('extensions/*/package.json'))
|
const localExtensionDescriptions = (<string[]>glob.sync('extensions/*/package.json'))
|
||||||
@@ -261,7 +271,7 @@ export function packageLocalExtensionsStream(): NodeJS.ReadWriteStream {
|
|||||||
})
|
})
|
||||||
.filter(({ name }) => excludedExtensions.indexOf(name) === -1)
|
.filter(({ name }) => excludedExtensions.indexOf(name) === -1)
|
||||||
.filter(({ name }) => builtInExtensions.every(b => b.name !== name))
|
.filter(({ name }) => builtInExtensions.every(b => b.name !== name))
|
||||||
.filter(({ name }) => sqlBuiltInExtensions.indexOf(name) === -1); // {{SQL CARBON EDIT}} add aditional filter
|
.filter(({ name }) => externalExtensions.indexOf(name) === -1); // {{SQL CARBON EDIT}} Remove external Extensions with separate package
|
||||||
|
|
||||||
const nodeModules = gulp.src('extensions/node_modules/**', { base: '.' });
|
const nodeModules = gulp.src('extensions/node_modules/**', { base: '.' });
|
||||||
const localExtensions = localExtensionDescriptions.map(extension => {
|
const localExtensions = localExtensionDescriptions.map(extension => {
|
||||||
@@ -283,71 +293,43 @@ export function packageMarketplaceExtensionsStream(): NodeJS.ReadWriteStream {
|
|||||||
.pipe(util2.setExecutableBit(['**/*.sh']));
|
.pipe(util2.setExecutableBit(['**/*.sh']));
|
||||||
}
|
}
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}}
|
export function packageExternalExtensionsStream(): NodeJS.ReadWriteStream {
|
||||||
import * as _ from 'underscore';
|
const extenalExtensionDescriptions = (<string[]>glob.sync('extensions/*/package.json'))
|
||||||
import * as vfs from 'vinyl-fs';
|
|
||||||
|
|
||||||
export function packageBuiltInExtensions() {
|
|
||||||
const sqlBuiltInLocalExtensionDescriptions = glob.sync('extensions/*/package.json')
|
|
||||||
.map(manifestPath => {
|
.map(manifestPath => {
|
||||||
const extensionPath = path.dirname(path.join(root, manifestPath));
|
const extensionPath = path.dirname(path.join(root, manifestPath));
|
||||||
const extensionName = path.basename(extensionPath);
|
const extensionName = path.basename(extensionPath);
|
||||||
return { name: extensionName, path: extensionPath };
|
return { name: extensionName, path: extensionPath };
|
||||||
})
|
})
|
||||||
.filter(({ name }) => excludedExtensions.indexOf(name) === -1)
|
.filter(({ name }) => externalExtensions.indexOf(name) >= 0);
|
||||||
.filter(({ name }) => builtInExtensions.every(b => b.name !== name))
|
|
||||||
.filter(({ name }) => sqlBuiltInExtensions.indexOf(name) >= 0);
|
const builtExtensions = extenalExtensionDescriptions.map(extension => {
|
||||||
const visxDirectory = path.join(path.dirname(root), 'vsix');
|
return fromLocal(extension.path)
|
||||||
try {
|
.pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
|
||||||
if (!fs.existsSync(visxDirectory)) {
|
|
||||||
fs.mkdirSync(visxDirectory);
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
// don't fail the build if the output directory already exists
|
|
||||||
console.warn(err);
|
|
||||||
}
|
|
||||||
sqlBuiltInLocalExtensionDescriptions.forEach(element => {
|
|
||||||
let pkgJson = JSON.parse(fs.readFileSync(path.join(element.path, 'package.json'), { encoding: 'utf8' }));
|
|
||||||
const packagePath = path.join(visxDirectory, `${pkgJson.name}-${pkgJson.version}.vsix`);
|
|
||||||
console.info('Creating vsix for ' + element.path + ' result:' + packagePath);
|
|
||||||
vsce.createVSIX({
|
|
||||||
cwd: element.path,
|
|
||||||
packagePath: packagePath,
|
|
||||||
useYarn: true
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
export function packageExtensionTask(extensionName: string, platform: string, arch: string) {
|
return es.merge(builtExtensions);
|
||||||
var destination = path.join(path.dirname(root), 'azuredatastudio') + (platform ? '-' + platform : '') + (arch ? '-' + arch : '');
|
|
||||||
if (platform === 'darwin') {
|
|
||||||
destination = path.join(destination, 'Azure Data Studio.app', 'Contents', 'Resources', 'app', 'extensions', extensionName);
|
|
||||||
} else {
|
|
||||||
destination = path.join(destination, 'resources', 'app', 'extensions', extensionName);
|
|
||||||
}
|
|
||||||
|
|
||||||
platform = platform || process.platform;
|
|
||||||
|
|
||||||
return () => {
|
|
||||||
const root = path.resolve(path.join(__dirname, '../..'));
|
|
||||||
const localExtensionDescriptions = glob.sync('extensions/*/package.json')
|
|
||||||
.map(manifestPath => {
|
|
||||||
const extensionPath = path.dirname(path.join(root, manifestPath));
|
|
||||||
const extensionName = path.basename(extensionPath);
|
|
||||||
return { name: extensionName, path: extensionPath };
|
|
||||||
})
|
|
||||||
.filter(({ name }) => extensionName === name);
|
|
||||||
|
|
||||||
const localExtensions = es.merge(...localExtensionDescriptions.map(extension => {
|
|
||||||
return fromLocal(extension.path);
|
|
||||||
}));
|
|
||||||
|
|
||||||
let result = localExtensions
|
|
||||||
.pipe(util2.skipDirectories())
|
|
||||||
.pipe(util2.fixWin32DirectoryPermissions())
|
|
||||||
.pipe(filter(['**', '!LICENSE', '!LICENSES.chromium.html', '!version']));
|
|
||||||
|
|
||||||
return result.pipe(vfs.dest(destination));
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
// {{SQL CARBON EDIT}} - End
|
// {{SQL CARBON EDIT}} - End
|
||||||
|
|
||||||
|
export function cleanRebuildExtensions(root: string): Promise<void> {
|
||||||
|
return Promise.all(rebuildExtensions.map(async e => {
|
||||||
|
await util2.rimraf(path.join(root, e))();
|
||||||
|
})).then();
|
||||||
|
}
|
||||||
|
|
||||||
|
export function packageRebuildExtensionsStream(): NodeJS.ReadWriteStream {
|
||||||
|
const extenalExtensionDescriptions = (<string[]>glob.sync('extensions/*/package.json'))
|
||||||
|
.map(manifestPath => {
|
||||||
|
const extensionPath = path.dirname(path.join(root, manifestPath));
|
||||||
|
const extensionName = path.basename(extensionPath);
|
||||||
|
return { name: extensionName, path: extensionPath };
|
||||||
|
})
|
||||||
|
.filter(({ name }) => rebuildExtensions.indexOf(name) >= 0);
|
||||||
|
|
||||||
|
const builtExtensions = extenalExtensionDescriptions.map(extension => {
|
||||||
|
return fromLocal(extension.path)
|
||||||
|
.pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
|
||||||
|
});
|
||||||
|
|
||||||
|
return es.merge(builtExtensions);
|
||||||
|
}
|
||||||
|
|||||||
@@ -30,6 +30,14 @@
|
|||||||
"name": "vs/workbench/api/common",
|
"name": "vs/workbench/api/common",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "vs/workbench/contrib/backup",
|
||||||
|
"project": "vscode-workbench"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "vs/workbench/contrib/bulkEdit",
|
||||||
|
"project": "vscode-workbench"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/cli",
|
"name": "vs/workbench/contrib/cli",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
@@ -42,6 +50,10 @@
|
|||||||
"name": "vs/workbench/contrib/callHierarchy",
|
"name": "vs/workbench/contrib/callHierarchy",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "vs/workbench/contrib/codeActions",
|
||||||
|
"project": "vscode-workbench"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/comments",
|
"name": "vs/workbench/contrib/comments",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
@@ -54,6 +66,10 @@
|
|||||||
"name": "vs/workbench/contrib/emmet",
|
"name": "vs/workbench/contrib/emmet",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "vs/workbench/contrib/experiments",
|
||||||
|
"project": "vscode-workbench"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/extensions",
|
"name": "vs/workbench/contrib/extensions",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
@@ -135,7 +151,7 @@
|
|||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/stats",
|
"name": "vs/workbench/contrib/tags",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -194,6 +210,10 @@
|
|||||||
"name": "vs/workbench/services/actions",
|
"name": "vs/workbench/services/actions",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "vs/workbench/services/authToken",
|
||||||
|
"project": "vscode-workbench"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/services/bulkEdit",
|
"name": "vs/workbench/services/bulkEdit",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
@@ -258,6 +278,10 @@
|
|||||||
"name": "vs/workbench/services/remote",
|
"name": "vs/workbench/services/remote",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "vs/workbench/services/search",
|
||||||
|
"project": "vscode-workbench"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/services/textfile",
|
"name": "vs/workbench/services/textfile",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
@@ -293,6 +317,10 @@
|
|||||||
{
|
{
|
||||||
"name": "vs/workbench/services/userData",
|
"name": "vs/workbench/services/userData",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "vs/workbench/services/userDataSync",
|
||||||
|
"project": "vscode-workbench"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
209
build/lib/layersChecker.js
Normal file
209
build/lib/layersChecker.js
Normal file
@@ -0,0 +1,209 @@
|
|||||||
|
"use strict";
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
const ts = require("typescript");
|
||||||
|
const fs_1 = require("fs");
|
||||||
|
const path_1 = require("path");
|
||||||
|
const minimatch_1 = require("minimatch");
|
||||||
|
//
|
||||||
|
// #############################################################################################
|
||||||
|
//
|
||||||
|
// A custom typescript checker for the specific task of detecting the use of certain types in a
|
||||||
|
// layer that does not allow such use. For example:
|
||||||
|
// - using DOM globals in common/node/electron-main layer (e.g. HTMLElement)
|
||||||
|
// - using node.js globals in common/browser layer (e.g. process)
|
||||||
|
//
|
||||||
|
// Make changes to below RULES to lift certain files from these checks only if absolutely needed
|
||||||
|
//
|
||||||
|
// #############################################################################################
|
||||||
|
//
|
||||||
|
// Types we assume are present in all implementations of JS VMs (node.js, browsers)
|
||||||
|
// Feel free to add more core types as you see needed if present in node.js and browsers
|
||||||
|
const CORE_TYPES = [
|
||||||
|
'require',
|
||||||
|
'atob',
|
||||||
|
'btoa',
|
||||||
|
'setTimeout',
|
||||||
|
'clearTimeout',
|
||||||
|
'setInterval',
|
||||||
|
'clearInterval',
|
||||||
|
'console',
|
||||||
|
'log',
|
||||||
|
'info',
|
||||||
|
'warn',
|
||||||
|
'error',
|
||||||
|
'group',
|
||||||
|
'groupEnd',
|
||||||
|
'table',
|
||||||
|
'Error',
|
||||||
|
'String',
|
||||||
|
'throws',
|
||||||
|
'stack',
|
||||||
|
'captureStackTrace',
|
||||||
|
'stackTraceLimit',
|
||||||
|
'TextDecoder',
|
||||||
|
'TextEncoder',
|
||||||
|
'encode',
|
||||||
|
'decode',
|
||||||
|
'self',
|
||||||
|
'trimLeft',
|
||||||
|
'trimRight'
|
||||||
|
];
|
||||||
|
const RULES = [
|
||||||
|
// Tests: skip
|
||||||
|
{
|
||||||
|
target: '**/{vs,sql}/**/test/**',
|
||||||
|
skip: true // -> skip all test files
|
||||||
|
},
|
||||||
|
// Common: vs/base/common/platform.ts
|
||||||
|
{
|
||||||
|
target: '**/vs/base/common/platform.ts',
|
||||||
|
allowedTypes: [
|
||||||
|
...CORE_TYPES,
|
||||||
|
// Safe access to postMessage() and friends
|
||||||
|
'MessageEvent',
|
||||||
|
'data'
|
||||||
|
],
|
||||||
|
disallowedDefinitions: [
|
||||||
|
'lib.dom.d.ts',
|
||||||
|
'@types/node' // no node.js
|
||||||
|
]
|
||||||
|
},
|
||||||
|
// Common: vs/workbench/api/common/extHostExtensionService.ts
|
||||||
|
{
|
||||||
|
target: '**/vs/workbench/api/common/extHostExtensionService.ts',
|
||||||
|
allowedTypes: [
|
||||||
|
...CORE_TYPES,
|
||||||
|
// Safe access to global
|
||||||
|
'global'
|
||||||
|
],
|
||||||
|
disallowedDefinitions: [
|
||||||
|
'lib.dom.d.ts',
|
||||||
|
'@types/node' // no node.js
|
||||||
|
]
|
||||||
|
},
|
||||||
|
// Common
|
||||||
|
{
|
||||||
|
target: '**/{vs,sql}/**/common/**',
|
||||||
|
allowedTypes: CORE_TYPES,
|
||||||
|
disallowedDefinitions: [
|
||||||
|
'lib.dom.d.ts',
|
||||||
|
'@types/node' // no node.js
|
||||||
|
]
|
||||||
|
},
|
||||||
|
// Browser
|
||||||
|
{
|
||||||
|
target: '**/{vs,sql}/**/browser/**',
|
||||||
|
allowedTypes: CORE_TYPES,
|
||||||
|
disallowedDefinitions: [
|
||||||
|
'@types/node' // no node.js
|
||||||
|
]
|
||||||
|
},
|
||||||
|
// node.js
|
||||||
|
{
|
||||||
|
target: '**/{vs,sql}/**/node/**',
|
||||||
|
allowedTypes: [
|
||||||
|
...CORE_TYPES,
|
||||||
|
// --> types from node.d.ts that duplicate from lib.dom.d.ts
|
||||||
|
'URL',
|
||||||
|
'protocol',
|
||||||
|
'hostname',
|
||||||
|
'port',
|
||||||
|
'pathname',
|
||||||
|
'search',
|
||||||
|
'username',
|
||||||
|
'password'
|
||||||
|
],
|
||||||
|
disallowedDefinitions: [
|
||||||
|
'lib.dom.d.ts' // no DOM
|
||||||
|
]
|
||||||
|
},
|
||||||
|
// Electron (renderer): skip
|
||||||
|
{
|
||||||
|
target: '**/{vs,sql}/**/electron-browser/**',
|
||||||
|
skip: true // -> supports all types
|
||||||
|
},
|
||||||
|
// Electron (main)
|
||||||
|
{
|
||||||
|
target: '**/{vs,sql}/**/electron-main/**',
|
||||||
|
allowedTypes: [
|
||||||
|
...CORE_TYPES,
|
||||||
|
// --> types from electron.d.ts that duplicate from lib.dom.d.ts
|
||||||
|
'Event',
|
||||||
|
'Request'
|
||||||
|
],
|
||||||
|
disallowedDefinitions: [
|
||||||
|
'lib.dom.d.ts' // no DOM
|
||||||
|
]
|
||||||
|
}
|
||||||
|
];
|
||||||
|
const TS_CONFIG_PATH = path_1.join(__dirname, '../../', 'src', 'tsconfig.json');
|
||||||
|
let hasErrors = false;
|
||||||
|
function checkFile(program, sourceFile, rule) {
|
||||||
|
checkNode(sourceFile);
|
||||||
|
function checkNode(node) {
|
||||||
|
var _a;
|
||||||
|
if (node.kind !== ts.SyntaxKind.Identifier) {
|
||||||
|
return ts.forEachChild(node, checkNode); // recurse down
|
||||||
|
}
|
||||||
|
const text = node.getText(sourceFile);
|
||||||
|
if ((_a = rule.allowedTypes) === null || _a === void 0 ? void 0 : _a.some(allowed => allowed === text)) {
|
||||||
|
return; // override
|
||||||
|
}
|
||||||
|
const checker = program.getTypeChecker();
|
||||||
|
const symbol = checker.getSymbolAtLocation(node);
|
||||||
|
if (symbol) {
|
||||||
|
const declarations = symbol.declarations;
|
||||||
|
if (Array.isArray(declarations)) {
|
||||||
|
for (const declaration of declarations) {
|
||||||
|
if (declaration) {
|
||||||
|
const parent = declaration.parent;
|
||||||
|
if (parent) {
|
||||||
|
const parentSourceFile = parent.getSourceFile();
|
||||||
|
if (parentSourceFile) {
|
||||||
|
const definitionFileName = parentSourceFile.fileName;
|
||||||
|
if (rule.disallowedDefinitions) {
|
||||||
|
for (const disallowedDefinition of rule.disallowedDefinitions) {
|
||||||
|
if (definitionFileName.indexOf(disallowedDefinition) >= 0) {
|
||||||
|
const { line, character } = sourceFile.getLineAndCharacterOfPosition(node.getStart());
|
||||||
|
console.log(`[build/lib/layersChecker.ts]: Reference to '${text}' from '${disallowedDefinition}' violates layer '${rule.target}' (${sourceFile.fileName} (${line + 1},${character + 1})`);
|
||||||
|
hasErrors = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function createProgram(tsconfigPath) {
|
||||||
|
const tsConfig = ts.readConfigFile(tsconfigPath, ts.sys.readFile);
|
||||||
|
const configHostParser = { fileExists: fs_1.existsSync, readDirectory: ts.sys.readDirectory, readFile: file => fs_1.readFileSync(file, 'utf8'), useCaseSensitiveFileNames: process.platform === 'linux' };
|
||||||
|
const tsConfigParsed = ts.parseJsonConfigFileContent(tsConfig.config, configHostParser, path_1.resolve(path_1.dirname(tsconfigPath)), { noEmit: true });
|
||||||
|
const compilerHost = ts.createCompilerHost(tsConfigParsed.options, true);
|
||||||
|
return ts.createProgram(tsConfigParsed.fileNames, tsConfigParsed.options, compilerHost);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Create program and start checking
|
||||||
|
//
|
||||||
|
const program = createProgram(TS_CONFIG_PATH);
|
||||||
|
for (const sourceFile of program.getSourceFiles()) {
|
||||||
|
for (const rule of RULES) {
|
||||||
|
if (minimatch_1.match([sourceFile.fileName], rule.target).length > 0) {
|
||||||
|
if (!rule.skip) {
|
||||||
|
checkFile(program, sourceFile, rule);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hasErrors) {
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user