mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-21 18:47:00 -05:00
Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f74080c963 | ||
|
|
32cd41d076 | ||
|
|
0d7d1cf375 | ||
|
|
8b826063b4 | ||
|
|
6a500715a7 | ||
|
|
5e02486ace | ||
|
|
16dbef978e | ||
|
|
f9081773dd | ||
|
|
b3799d4506 | ||
|
|
2ab9e4b861 | ||
|
|
a1d8bae654 | ||
|
|
b265c53f9c | ||
|
|
ac7d19133a | ||
|
|
ab3895a4c2 | ||
|
|
a230e24af0 | ||
|
|
8354ccd76d | ||
|
|
3d60ee9030 | ||
|
|
5faf2d9cb2 |
@@ -1,4 +1,4 @@
|
|||||||
# EditorConfig is awesome: https://EditorConfig.org
|
# EditorConfig is awesome: http://EditorConfig.org
|
||||||
|
|
||||||
# top-most EditorConfig file
|
# top-most EditorConfig file
|
||||||
root = true
|
root = true
|
||||||
@@ -6,6 +6,7 @@ root = true
|
|||||||
# Tab indentation
|
# Tab indentation
|
||||||
[*]
|
[*]
|
||||||
indent_style = tab
|
indent_style = tab
|
||||||
|
indent_size = 4
|
||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
# The indent size used in the `package.json` file cannot be changed
|
# The indent size used in the `package.json` file cannot be changed
|
||||||
|
|||||||
3
.gitattributes
vendored
3
.gitattributes
vendored
@@ -6,5 +6,4 @@ ThirdPartyNotices.txt eol=crlf
|
|||||||
*.bat eol=crlf
|
*.bat eol=crlf
|
||||||
*.cmd eol=crlf
|
*.cmd eol=crlf
|
||||||
*.ps1 eol=lf
|
*.ps1 eol=lf
|
||||||
*.sh eol=lf
|
*.sh eol=lf
|
||||||
*.rtf -text
|
|
||||||
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -2,7 +2,7 @@
|
|||||||
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: ''
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
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: feature request
|
||||||
assignees: ''
|
assignees: ''
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
69
.github/classifier.yml
vendored
69
.github/classifier.yml
vendored
@@ -3,32 +3,47 @@
|
|||||||
alwaysRequireAssignee: false,
|
alwaysRequireAssignee: false,
|
||||||
labelsRequiringAssignee: [],
|
labelsRequiringAssignee: [],
|
||||||
autoAssignees: {
|
autoAssignees: {
|
||||||
Area - Acquisition: [],
|
accessibility: [],
|
||||||
Area - Azure: [],
|
acquisition: [],
|
||||||
Area - Backup\Restore: [],
|
agent: [],
|
||||||
Area - Charting\Insights: [],
|
azure: [],
|
||||||
Area - Connection: [],
|
backup: [],
|
||||||
Area - DacFX: [],
|
bcdr: [],
|
||||||
Area - Dashboard: [],
|
'chart viewer': [],
|
||||||
Area - Data Explorer: [],
|
connection: [],
|
||||||
Area - Edit Data: [],
|
dacfx: [],
|
||||||
Area - Extensibility: [],
|
dashboard: [],
|
||||||
Area - External Table: [],
|
'data explorer': [],
|
||||||
Area - Fundamentals: [],
|
documentation: [],
|
||||||
Area - Language Service: [],
|
'edit data': [],
|
||||||
Area - Localization: [],
|
export: [],
|
||||||
Area - Notebooks: [],
|
extensibility: [],
|
||||||
Area - Performance: [],
|
extensionManager: [],
|
||||||
Area - Query Editor: [ anthonydresser ],
|
globalization: [],
|
||||||
Area - Query Plan: [],
|
grid: [],
|
||||||
Area - Reliability: [],
|
import: [],
|
||||||
Area - Resource Deployment: [],
|
insights: [],
|
||||||
Area - Schema Compare: [],
|
intellisense: [],
|
||||||
Area - Shell: [],
|
localization: [],
|
||||||
Area - SQL Agent: [],
|
'managed instance': [],
|
||||||
Area - SQL Import: [],
|
notebooks: [],
|
||||||
Area - SQL Profiler: [],
|
'object explorer': [],
|
||||||
Area - SQL 2019: [],
|
performance: [],
|
||||||
Area - SSMS Integration: []
|
profiler: [],
|
||||||
|
'query editor': [],
|
||||||
|
'query execution': [],
|
||||||
|
reliability: [],
|
||||||
|
restore: [],
|
||||||
|
scripting: [],
|
||||||
|
'server group': [],
|
||||||
|
settings: [],
|
||||||
|
setup: [],
|
||||||
|
shell: [],
|
||||||
|
showplan: [],
|
||||||
|
snippet: [],
|
||||||
|
sql2019Preview: [],
|
||||||
|
sqldw: [],
|
||||||
|
supportability: [],
|
||||||
|
ux: []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
6
.github/needs_more_info.yml
vendored
6
.github/needs_more_info.yml
vendored
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
daysUntilClose: 7,
|
daysUntilClose: 7,
|
||||||
needsMoreInfoLabel: 'needs more info',
|
needsMoreInfoLabel: 'more info',
|
||||||
perform: true,
|
perform: false,
|
||||||
closeComment: "This issue has been closed automatically because it needs more information and has not had recent activity in the last 7 days. If you have more info to help resolve the issue, leave a comment"
|
closeComment: "This issue has been closed automatically because it needs more information and has not had recent activity. See also our [issue reporting](https://aka.ms/vscodeissuereporting) guidelines.\n\nHappy Coding!"
|
||||||
}
|
}
|
||||||
|
|||||||
9
.github/pull_request_template.md
vendored
9
.github/pull_request_template.md
vendored
@@ -1,9 +0,0 @@
|
|||||||
<!-- Thank you for submitting a Pull Request. Please:
|
|
||||||
* Read our Pull Request guidelines:
|
|
||||||
https://github.com/Microsoft/azuredatastudio/wiki/How-to-Contribute#pull-requests.
|
|
||||||
* Associate an issue with the Pull Request.
|
|
||||||
* Ensure that the code is up-to-date with the `master` branch.
|
|
||||||
* Include a description of the proposed changes and how to test them.
|
|
||||||
-->
|
|
||||||
|
|
||||||
This PR fixes #
|
|
||||||
118
.github/workflows/ci.yml
vendored
118
.github/workflows/ci.yml
vendored
@@ -1,118 +0,0 @@
|
|||||||
name: CI
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
- release/*
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
- release/*
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
linux:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
env:
|
|
||||||
CHILD_CONCURRENCY: "1"
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v1
|
|
||||||
# TODO: rename azure-pipelines/linux/xvfb.init to github-actions
|
|
||||||
- run: |
|
|
||||||
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 cp build/azure-pipelines/linux/xvfb.init /etc/init.d/xvfb
|
|
||||||
sudo chmod +x /etc/init.d/xvfb
|
|
||||||
sudo update-rc.d xvfb defaults
|
|
||||||
sudo service xvfb start
|
|
||||||
name: Setup Build Environment
|
|
||||||
- uses: actions/setup-node@v1
|
|
||||||
with:
|
|
||||||
node-version: 10
|
|
||||||
# TODO: cache node modules
|
|
||||||
- run: yarn --frozen-lockfile
|
|
||||||
name: Install Dependencies
|
|
||||||
- run: yarn electron x64
|
|
||||||
name: Download Electron
|
|
||||||
- run: yarn gulp hygiene --skip-tslint
|
|
||||||
name: Run Hygiene Checks
|
|
||||||
- run: yarn gulp tslint
|
|
||||||
name: Run TSLint Checks
|
|
||||||
- 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
|
|
||||||
# name: Run Monaco Editor Checks
|
|
||||||
- run: yarn compile
|
|
||||||
name: Compile Sources
|
|
||||||
# - run: yarn download-builtin-extensions {{SQL CARBON EDIT}} remove step
|
|
||||||
# name: Download Built-in Extensions
|
|
||||||
- run: DISPLAY=:10 ./scripts/test.sh --tfs "Unit Tests"
|
|
||||||
name: Run Unit Tests
|
|
||||||
# - run: DISPLAY=:10 ./scripts/test-integration.sh --tfs "Integration Tests" {{SQL CARBON EDIT}} remove step
|
|
||||||
# name: Run Integration Tests
|
|
||||||
|
|
||||||
windows:
|
|
||||||
runs-on: windows-2016
|
|
||||||
env:
|
|
||||||
CHILD_CONCURRENCY: "1"
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v1
|
|
||||||
- uses: actions/setup-node@v1
|
|
||||||
with:
|
|
||||||
node-version: 10
|
|
||||||
- uses: actions/setup-python@v1
|
|
||||||
with:
|
|
||||||
python-version: '2.x'
|
|
||||||
- run: yarn --frozen-lockfile
|
|
||||||
name: Install Dependencies
|
|
||||||
- run: yarn electron
|
|
||||||
name: Download Electron
|
|
||||||
- run: yarn gulp hygiene --skip-tslint
|
|
||||||
name: Run Hygiene Checks
|
|
||||||
- run: yarn gulp tslint
|
|
||||||
name: Run TSLint Checks
|
|
||||||
- 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
|
|
||||||
# name: Run Monaco Editor Checks
|
|
||||||
- run: yarn compile
|
|
||||||
name: Compile Sources
|
|
||||||
# - run: yarn download-builtin-extensions {{SQL CARBON EDIT}} remove step
|
|
||||||
# name: Download Built-in Extensions
|
|
||||||
- run: .\scripts\test.bat --tfs "Unit Tests"
|
|
||||||
name: Run Unit Tests
|
|
||||||
# - run: .\scripts\test-integration.bat --tfs "Integration Tests" {{SQL CARBON EDIT}} remove step
|
|
||||||
# name: Run Integration Tests
|
|
||||||
|
|
||||||
darwin:
|
|
||||||
runs-on: macos-latest
|
|
||||||
env:
|
|
||||||
CHILD_CONCURRENCY: "1"
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v1
|
|
||||||
- uses: actions/setup-node@v1
|
|
||||||
with:
|
|
||||||
node-version: 10
|
|
||||||
- run: yarn --frozen-lockfile
|
|
||||||
name: Install Dependencies
|
|
||||||
- run: yarn electron x64
|
|
||||||
name: Download Electron
|
|
||||||
- run: yarn gulp hygiene --skip-tslint
|
|
||||||
name: Run Hygiene Checks
|
|
||||||
- run: yarn gulp tslint
|
|
||||||
name: Run TSLint Checks
|
|
||||||
- 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
|
|
||||||
# name: Run Monaco Editor Checks
|
|
||||||
- run: yarn compile
|
|
||||||
name: Compile Sources
|
|
||||||
# - run: yarn download-builtin-extensions {{SQL CARBON EDIT}} remove step
|
|
||||||
# name: Download Built-in Extensions
|
|
||||||
- run: ./scripts/test.sh --tfs "Unit Tests"
|
|
||||||
name: Run Unit Tests
|
|
||||||
# - run: ./scripts/test-integration.sh --tfs "Integration Tests" {{SQL CARBON EDIT}} remove step
|
|
||||||
# name: Run Integration Tests
|
|
||||||
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'
|
|
||||||
12
.gitignore
vendored
12
.gitignore
vendored
@@ -1,5 +1,4 @@
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
.cache
|
|
||||||
npm-debug.log
|
npm-debug.log
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
node_modules/
|
node_modules/
|
||||||
@@ -15,19 +14,8 @@ out-editor-min/
|
|||||||
out-monaco-editor-core/
|
out-monaco-editor-core/
|
||||||
out-vscode/
|
out-vscode/
|
||||||
out-vscode-min/
|
out-vscode-min/
|
||||||
out-vscode-reh/
|
|
||||||
out-vscode-reh-min/
|
|
||||||
out-vscode-reh-pkg/
|
|
||||||
out-vscode-reh-web/
|
|
||||||
out-vscode-reh-web-min/
|
|
||||||
out-vscode-reh-web-pkg/
|
|
||||||
out-vscode-web/
|
|
||||||
out-vscode-web-min/
|
|
||||||
src/vs/server
|
|
||||||
resources/server
|
|
||||||
build/node_modules
|
build/node_modules
|
||||||
coverage/
|
coverage/
|
||||||
test_data/
|
test_data/
|
||||||
test-results/
|
test-results/
|
||||||
yarn-error.log
|
yarn-error.log
|
||||||
*.vsix
|
|
||||||
|
|||||||
@@ -1,33 +0,0 @@
|
|||||||
/**
|
|
||||||
* @name No floating promises
|
|
||||||
* @kind problem
|
|
||||||
* @problem.severity error
|
|
||||||
* @id js/experimental/floating-promise
|
|
||||||
*/
|
|
||||||
import javascript
|
|
||||||
|
|
||||||
private predicate isEscapingPromise(PromiseDefinition promise) {
|
|
||||||
exists (DataFlow::Node escape | promise.flowsTo(escape) |
|
|
||||||
escape = any(DataFlow::InvokeNode invk).getAnArgument()
|
|
||||||
or
|
|
||||||
escape = any(DataFlow::FunctionNode fun).getAReturn()
|
|
||||||
or
|
|
||||||
escape = any(ThrowStmt t).getExpr().flow()
|
|
||||||
or
|
|
||||||
escape = any(GlobalVariable v).getAnAssignedExpr().flow()
|
|
||||||
or
|
|
||||||
escape = any(DataFlow::PropWrite write).getRhs()
|
|
||||||
or
|
|
||||||
exists(WithStmt with, Assignment assign |
|
|
||||||
with.mayAffect(assign.getLhs()) and
|
|
||||||
assign.getRhs().flow() = escape
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
from PromiseDefinition promise
|
|
||||||
where
|
|
||||||
not exists(promise.getAMethodCall(any(string m | m = "then" or m = "catch" or m = "finally"))) and
|
|
||||||
not exists (AwaitExpr e | promise.flowsTo(e.getOperand().flow())) and
|
|
||||||
not isEscapingPromise(promise)
|
|
||||||
select promise, "This promise appears to be a floating promise"
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"useTabs": true,
|
|
||||||
"printWidth": 120,
|
|
||||||
"semi": true,
|
|
||||||
"singleQuote": true
|
|
||||||
}
|
|
||||||
70
.vscode/cglicenses.schema.json
vendored
70
.vscode/cglicenses.schema.json
vendored
@@ -1,61 +1,23 @@
|
|||||||
{
|
{
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"oneOf": [
|
"type": "object",
|
||||||
{
|
"required": [
|
||||||
"type": "object",
|
"name",
|
||||||
"required": [
|
"licenseDetail"
|
||||||
"name",
|
],
|
||||||
"prependLicenseText"
|
"properties": {
|
||||||
],
|
"name": {
|
||||||
"properties": {
|
"type": "string",
|
||||||
"name": {
|
"description": "The name of the dependency"
|
||||||
"type": "string",
|
|
||||||
"description": "The name of the dependency"
|
|
||||||
},
|
|
||||||
"fullLicenseText": {
|
|
||||||
"type": "array",
|
|
||||||
"description": "The complete license text of the dependency",
|
|
||||||
"items": {
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"prependLicenseText": {
|
|
||||||
"type": "array",
|
|
||||||
"description": "A piece of text to prepend to the auto-detected license text of the dependency",
|
|
||||||
"items": {
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{
|
"licenseDetail": {
|
||||||
"type": "object",
|
"type": "array",
|
||||||
"required": [
|
"description": "The complete license text of the dependency",
|
||||||
"name",
|
"items": {
|
||||||
"fullLicenseText"
|
"type": "string"
|
||||||
],
|
|
||||||
"properties": {
|
|
||||||
"name": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "The name of the dependency"
|
|
||||||
},
|
|
||||||
"fullLicenseText": {
|
|
||||||
"type": "array",
|
|
||||||
"description": "The complete license text of the dependency",
|
|
||||||
"items": {
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"prependLicenseText": {
|
|
||||||
"type": "array",
|
|
||||||
"description": "A piece of text to prepend to the auto-detected license text of the dependency",
|
|
||||||
"items": {
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
1
.vscode/extensions.json
vendored
1
.vscode/extensions.json
vendored
@@ -4,7 +4,6 @@
|
|||||||
"recommendations": [
|
"recommendations": [
|
||||||
"ms-vscode.vscode-typescript-tslint-plugin",
|
"ms-vscode.vscode-typescript-tslint-plugin",
|
||||||
"dbaeumer.vscode-eslint",
|
"dbaeumer.vscode-eslint",
|
||||||
"EditorConfig.EditorConfig",
|
|
||||||
"msjsdiag.debugger-for-chrome"
|
"msjsdiag.debugger-for-chrome"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
127
.vscode/launch.json
vendored
127
.vscode/launch.json
vendored
@@ -16,7 +16,6 @@
|
|||||||
"request": "attach",
|
"request": "attach",
|
||||||
"name": "Attach to Extension Host",
|
"name": "Attach to Extension Host",
|
||||||
"port": 5870,
|
"port": 5870,
|
||||||
"timeout": 30000,
|
|
||||||
"restart": true,
|
"restart": true,
|
||||||
"outFiles": [
|
"outFiles": [
|
||||||
"${workspaceFolder}/out/**/*.js"
|
"${workspaceFolder}/out/**/*.js"
|
||||||
@@ -67,42 +66,23 @@
|
|||||||
"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
|
|
||||||
},
|
},
|
||||||
"env": {
|
|
||||||
"VSCODE_EXTHOST_WILL_SEND_SOCKET": null
|
|
||||||
},
|
|
||||||
"breakOnLoad": false,
|
|
||||||
"urlFilter": "*workbench.html*",
|
"urlFilter": "*workbench.html*",
|
||||||
"runtimeArgs": [
|
"runtimeArgs": [
|
||||||
"--inspect=5875",
|
"--inspect=5875", "--no-cached-data"
|
||||||
"--no-cached-data"
|
|
||||||
],
|
],
|
||||||
"webRoot": "${workspaceFolder}"
|
"skipFiles": [
|
||||||
},
|
"**/winjs*.js"
|
||||||
{
|
|
||||||
"type": "node",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Launch ADS (Main Process)",
|
|
||||||
"runtimeExecutable": "${workspaceFolder}/scripts/sql.sh",
|
|
||||||
"windows": {
|
|
||||||
"runtimeExecutable": "${workspaceFolder}/scripts/sql.bat",
|
|
||||||
},
|
|
||||||
"runtimeArgs": [
|
|
||||||
"--no-cached-data"
|
|
||||||
],
|
],
|
||||||
"outFiles": [
|
"webRoot": "${workspaceFolder}",
|
||||||
"${workspaceFolder}/out/**/*.js"
|
"timeout": 45000
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "chrome",
|
"type": "chrome",
|
||||||
@@ -128,33 +108,6 @@
|
|||||||
"webRoot": "${workspaceFolder}",
|
"webRoot": "${workspaceFolder}",
|
||||||
"timeout": 45000
|
"timeout": 45000
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"type": "chrome",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Launch ADS (Web) (TBD)",
|
|
||||||
"runtimeExecutable": "yarn",
|
|
||||||
"runtimeArgs": [
|
|
||||||
"web"
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "chrome",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Launch ADS (Web, Chrome) (TBD)",
|
|
||||||
"url": "http://localhost:8080",
|
|
||||||
"preLaunchTask": "Run web"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "node",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Git Unit Tests",
|
|
||||||
"program": "${workspaceFolder}/extensions/git/node_modules/mocha/bin/_mocha",
|
|
||||||
"stopOnEntry": false,
|
|
||||||
"cwd": "${workspaceFolder}/extensions/git",
|
|
||||||
"outFiles": [
|
|
||||||
"${workspaceFolder}/extensions/git/out/**/*.js"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "Launch Built-in Extension",
|
"name": "Launch Built-in Extension",
|
||||||
"type": "extensionHost",
|
"type": "extensionHost",
|
||||||
@@ -193,43 +146,8 @@
|
|||||||
"cwd": "${workspaceFolder}",
|
"cwd": "${workspaceFolder}",
|
||||||
"outFiles": [
|
"outFiles": [
|
||||||
"${workspaceFolder}/out/**/*.js"
|
"${workspaceFolder}/out/**/*.js"
|
||||||
],
|
]
|
||||||
"env": {
|
}
|
||||||
"MOCHA_COLORS": "true"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "chrome",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Run Extension Unit Tests",
|
|
||||||
"windows": {
|
|
||||||
"runtimeExecutable": "${workspaceFolder}/scripts/test-extensions-unit.bat"
|
|
||||||
},
|
|
||||||
"osx": {
|
|
||||||
"runtimeExecutable": "${workspaceFolder}/scripts/test-extensions-unit.sh"
|
|
||||||
},
|
|
||||||
"linux": {
|
|
||||||
"runtimeExecutable": "${workspaceFolder}/scripts/test-extensions-unit.sh"
|
|
||||||
},
|
|
||||||
"webRoot": "${workspaceFolder}",
|
|
||||||
"timeout": 45000
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "chrome",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Run Extension Integration Tests",
|
|
||||||
"windows": {
|
|
||||||
"runtimeExecutable": "${workspaceFolder}/scripts/sql-test-integration.bat"
|
|
||||||
},
|
|
||||||
"osx": {
|
|
||||||
"runtimeExecutable": "${workspaceFolder}/scripts/sql-test-integration.sh"
|
|
||||||
},
|
|
||||||
"linux": {
|
|
||||||
"runtimeExecutable": "${workspaceFolder}/scripts/sql-test-integration.sh"
|
|
||||||
},
|
|
||||||
"webRoot": "${workspaceFolder}",
|
|
||||||
"timeout": 45000
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
"compounds": [
|
"compounds": [
|
||||||
{
|
{
|
||||||
@@ -239,20 +157,6 @@
|
|||||||
"Run Unit Tests"
|
"Run Unit Tests"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "Debug Extension Unit Tests",
|
|
||||||
"configurations": [
|
|
||||||
"Attach to Extension Host",
|
|
||||||
"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": [
|
||||||
@@ -261,25 +165,18 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Debug Renderer and search processes",
|
"name": "Search and Renderer processes",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
"Launch azuredatastudio",
|
"Launch azuredatastudio",
|
||||||
"Attach to Search Process"
|
"Attach to Search Process"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Debug Renderer and Extension Host processes",
|
"name": "Renderer and Extension Host processes",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
"Launch azuredatastudio",
|
"Launch azuredatastudio",
|
||||||
"Attach to Extension Host"
|
"Attach to Extension Host"
|
||||||
]
|
]
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Attach Renderer and Extension Host",
|
|
||||||
"configurations": [
|
|
||||||
"Attach to azuredatastudio",
|
|
||||||
"Attach to Extension Host"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
29
.vscode/settings.json
vendored
29
.vscode/settings.json
vendored
@@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"editor.insertSpaces": false,
|
"editor.insertSpaces": false,
|
||||||
|
"files.eol": "\n",
|
||||||
"files.trimTrailingWhitespace": true,
|
"files.trimTrailingWhitespace": true,
|
||||||
"files.exclude": {
|
"files.exclude": {
|
||||||
".git": true,
|
".git": true,
|
||||||
@@ -39,27 +40,15 @@
|
|||||||
],
|
],
|
||||||
"typescript.tsdk": "node_modules/typescript/lib",
|
"typescript.tsdk": "node_modules/typescript/lib",
|
||||||
"npm.exclude": "**/extensions/**",
|
"npm.exclude": "**/extensions/**",
|
||||||
|
"git.ignoreLimitWarning": true,
|
||||||
"emmet.excludeLanguages": [],
|
"emmet.excludeLanguages": [],
|
||||||
"typescript.preferences.importModuleSpecifier": "non-relative",
|
"typescript.preferences.importModuleSpecifier": "non-relative",
|
||||||
"typescript.preferences.quoteStyle": "single",
|
"typescript.preferences.quoteStyle": "single",
|
||||||
"json.schemas": [
|
"json.schemas": [{
|
||||||
{
|
"fileMatch": [ "cgmanifest.json" ],
|
||||||
"fileMatch": [
|
"url": "./.vscode/cgmanifest.schema.json"
|
||||||
"cgmanifest.json"
|
}, {
|
||||||
],
|
"fileMatch": [ "cglicenses.json" ],
|
||||||
"url": "./.vscode/cgmanifest.schema.json"
|
"url": "./.vscode/cglicenses.schema.json"
|
||||||
},
|
}]
|
||||||
{
|
|
||||||
"fileMatch": [
|
|
||||||
"cglicenses.json"
|
|
||||||
],
|
|
||||||
"url": "./.vscode/cglicenses.schema.json"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"git.ignoreLimitWarning": true,
|
|
||||||
"remote.extensionKind": {
|
|
||||||
"msjsdiag.debugger-for-chrome": "workspace"
|
|
||||||
},
|
|
||||||
"gulp.autoDetect": "off",
|
|
||||||
"files.insertFinalNewline": true
|
|
||||||
}
|
}
|
||||||
|
|||||||
2
.vscode/shared.code-snippets
vendored
2
.vscode/shared.code-snippets
vendored
@@ -23,13 +23,11 @@
|
|||||||
"description": "Insert Copyright Statement"
|
"description": "Insert Copyright Statement"
|
||||||
},
|
},
|
||||||
"TS -> Inject Service": {
|
"TS -> Inject Service": {
|
||||||
"scope": "typescript",
|
|
||||||
"description": "Constructor Injection Pattern",
|
"description": "Constructor Injection Pattern",
|
||||||
"prefix": "@inject",
|
"prefix": "@inject",
|
||||||
"body": "@$1 private readonly _$2: ${1},$0"
|
"body": "@$1 private readonly _$2: ${1},$0"
|
||||||
},
|
},
|
||||||
"TS -> Event & Emitter": {
|
"TS -> Event & Emitter": {
|
||||||
"scope": "typescript",
|
|
||||||
"prefix": "emitter",
|
"prefix": "emitter",
|
||||||
"description": "Add emitter and event properties",
|
"description": "Add emitter and event properties",
|
||||||
"body": [
|
"body": [
|
||||||
|
|||||||
49
.vscode/tasks.json
vendored
49
.vscode/tasks.json
vendored
@@ -5,10 +5,7 @@
|
|||||||
"type": "npm",
|
"type": "npm",
|
||||||
"script": "watch",
|
"script": "watch",
|
||||||
"label": "Build VS Code",
|
"label": "Build VS Code",
|
||||||
"group": {
|
"group": "build",
|
||||||
"kind": "build",
|
|
||||||
"isDefault": true
|
|
||||||
},
|
|
||||||
"isBackground": true,
|
"isBackground": true,
|
||||||
"presentation": {
|
"presentation": {
|
||||||
"reveal": "never"
|
"reveal": "never"
|
||||||
@@ -31,20 +28,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"type": "npm",
|
|
||||||
"script": "strict-initialization-watch",
|
|
||||||
"label": "TS - Strict Initialization",
|
|
||||||
"isBackground": true,
|
|
||||||
"presentation": {
|
|
||||||
"reveal": "never"
|
|
||||||
},
|
|
||||||
"problemMatcher": {
|
|
||||||
"base": "$tsc-watch",
|
|
||||||
"owner": "typescript-strict-initialization",
|
|
||||||
"applyTo": "allDocuments"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"type": "npm",
|
"type": "npm",
|
||||||
"script": "strict-null-check-watch",
|
"script": "strict-null-check-watch",
|
||||||
@@ -55,8 +38,11 @@
|
|||||||
},
|
},
|
||||||
"problemMatcher": {
|
"problemMatcher": {
|
||||||
"base": "$tsc-watch",
|
"base": "$tsc-watch",
|
||||||
"owner": "typescript-strict-null-checks",
|
"owner": "typescript-strict-null",
|
||||||
"applyTo": "allDocuments"
|
"applyTo": "allDocuments"
|
||||||
|
},
|
||||||
|
"runOptions": {
|
||||||
|
"runOn": "folderOpen"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -90,33 +76,14 @@
|
|||||||
"problemMatcher": []
|
"problemMatcher": []
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "npm",
|
"type": "gulp",
|
||||||
"script": "electron",
|
"task": "electron",
|
||||||
"label": "Download electron"
|
"label": "Download electron"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "gulp",
|
"type": "gulp",
|
||||||
"task": "hygiene",
|
"task": "hygiene",
|
||||||
"problemMatcher": []
|
"problemMatcher": []
|
||||||
},
|
}
|
||||||
{
|
|
||||||
"type": "shell",
|
|
||||||
"command": "yarn web -- --no-launch",
|
|
||||||
"label": "Run web",
|
|
||||||
"isBackground": true,
|
|
||||||
// This section to make error go away when launching the debug config
|
|
||||||
"problemMatcher": {
|
|
||||||
"pattern": {
|
|
||||||
"regexp": ""
|
|
||||||
},
|
|
||||||
"background": {
|
|
||||||
"beginsPattern": ".*node .*",
|
|
||||||
"endsPattern": "Web UI available at .*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"presentation": {
|
|
||||||
"reveal": "never"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
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 "2.0.12"
|
||||||
runtime "electron"
|
runtime "electron"
|
||||||
|
|||||||
134
CHANGELOG.md
134
CHANGELOG.md
@@ -1,137 +1,5 @@
|
|||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
## Version 1.12.2
|
|
||||||
* Release date: October 11, 2019
|
|
||||||
* Release status: General Availability
|
|
||||||
* Hotfix release (1.12.2): `Disable automatically starting the EH in inspect mode` https://github.com/microsoft/azuredatastudio/commit/c9bef82ace6c67190d0e83820011a2bbd1f793c1
|
|
||||||
|
|
||||||
## Version 1.12.1
|
|
||||||
* Release date: October 7, 2019
|
|
||||||
* Release status: General Availability
|
|
||||||
* Hotfix release: `Notebooks: Ensure quotes and backslashes are escaped properly in text editor model` https://github.com/microsoft/azuredatastudio/pull/7540
|
|
||||||
|
|
||||||
## Version 1.12.0
|
|
||||||
* Release date: October 2, 2019
|
|
||||||
* Release status: General Availability
|
|
||||||
|
|
||||||
## What's new in this version
|
|
||||||
* Announcing the Query History panel
|
|
||||||
* Improved Query Results Grid copy selection support
|
|
||||||
* TempDB page added to Server Reports extension
|
|
||||||
* PowerShell extension update
|
|
||||||
* Resolved [bugs and issues](https://github.com/microsoft/azuredatastudio/milestone/42?closed=1).
|
|
||||||
|
|
||||||
## Version 1.11.0
|
|
||||||
* Release date: September 10, 2019
|
|
||||||
* Release status: General Availability
|
|
||||||
|
|
||||||
## What's new in this version
|
|
||||||
* Resolved [bugs and issues](https://github.com/microsoft/azuredatastudio/milestone/41?closed=1).
|
|
||||||
|
|
||||||
## Version 1.10.0
|
|
||||||
* Release date: August 14, 2019
|
|
||||||
* Release status: General Availability
|
|
||||||
|
|
||||||
## What's new in this version
|
|
||||||
* [SandDance](https://github.com/microsoft/SandDance) integration — A new way to interact with data. Download the extension [here](https://docs.microsoft.com/sql/azure-data-studio/sanddance-extension)
|
|
||||||
* Notebook improvements
|
|
||||||
* Better loading performance
|
|
||||||
* Ability to right click SQL results grid to save your results as CSV, JSON, etc.
|
|
||||||
* Buttons to add code or text cells in-line
|
|
||||||
* [Other fixes and improvements](https://github.com/microsoft/azuredatastudio/issues?q=is%3Aissue+label%3A%22Area%3A+Notebooks%22+milestone%3A%22August+2019+Release%22+is%3Aclosed)
|
|
||||||
* SQL Server Dacpac extension can support Azure Active Directory authentication
|
|
||||||
* Updated SQL Server 2019 extension
|
|
||||||
* Visual Studio Code May Release Merge 1.37 - this includes changes from [1.36](https://code.visualstudio.com/updates/v1_37) and [1.37](https://code.visualstudio.com/updates/v1_37)
|
|
||||||
* Resolved [bugs and issues](https://github.com/microsoft/azuredatastudio/milestone/39?closed=1).
|
|
||||||
|
|
||||||
## Version 1.9.0
|
|
||||||
* Release date: July 11, 2019
|
|
||||||
* Release status: General Availability
|
|
||||||
|
|
||||||
## What's new in this version
|
|
||||||
* Release of [SentryOne Plan Explorer Extension](https://www.sentryone.com/products/sentryone-plan-explorer-extension-azure-data-studio)
|
|
||||||
* **Schema Compare**
|
|
||||||
* Schema Compare File Support (.SCMP)
|
|
||||||
* Cancel support
|
|
||||||
* [Other fixes and improvements](https://github.com/Microsoft/azuredatastudio/issues?q=is%3Aissue+milestone%3A%22July+2019+Release%22+is%3Aclosed+label%3A%22Area%3A+Schema+Compare%22)
|
|
||||||
* **Notebooks**
|
|
||||||
* Plotly Support
|
|
||||||
* Open Notebook from Browser
|
|
||||||
* Python Package Management
|
|
||||||
* Performance & Markdown Enhancements
|
|
||||||
* Improved Keyboard Shortcuts
|
|
||||||
* [Other fixes and improvements](https://github.com/Microsoft/azuredatastudio/issues?q=is%3Aissue+milestone%3A%22July+2019+Release%22+is%3Aclosed+label%3A%22Area%3A+Notebooks%22)
|
|
||||||
* **SQL Server Profiler**
|
|
||||||
* Filtering by Database Name
|
|
||||||
* Copy & Paste Support
|
|
||||||
* Save/Load Filter
|
|
||||||
* SQL Server 2019 Support
|
|
||||||
* New Language Packs Available
|
|
||||||
* Visual Studio Code May Release Merge 1.35 - the latest improvements can be found [here](https://code.visualstudio.com/updates/v1_35)
|
|
||||||
* Resolved [bugs and issues](https://github.com/microsoft/azuredatastudio/milestone/35?closed=1).
|
|
||||||
|
|
||||||
## Version 1.8.0
|
|
||||||
* Release date: June 6, 2019
|
|
||||||
* Release status: General Availability
|
|
||||||
|
|
||||||
## What's new in this version
|
|
||||||
* Initial release of the Database Admin Tool Extensions for Windows *Preview* extension
|
|
||||||
* Initial release of the Central Management Servers extension
|
|
||||||
* **Schema Compare**
|
|
||||||
* Added Exclude/Include Options
|
|
||||||
* Generate Script opens script after being generated
|
|
||||||
* Removed double scroll bars
|
|
||||||
* Formatting and layout improvements
|
|
||||||
* Complete changes can be found [here](https://github.com/microsoft/azuredatastudio/issues?q=is%3Aissue+milestone%3A%22June+2019+Release%22+label%3A%22Area%3A+Schema+Compare%22+is%3Aclosed)
|
|
||||||
* Messages panel moved into results panel - when users ran SQL queries, results and messages were in stacked panels. Now they are in separate tabs in a single panel similar to SSMS.
|
|
||||||
* **Notebook**
|
|
||||||
* Users can now choose to use their own Python 3 or Anaconda installs in notebooks
|
|
||||||
* Multiple Stability + fit/finish fixes
|
|
||||||
* View the full list of improvements and fixes [here](https://github.com/microsoft/azuredatastudio/issues?q=is%3Aissue+milestone%3A%22June+2019+Release%22+is%3Aclosed+label%3A%22Area%3A+Notebooks%22)
|
|
||||||
* Visual Studio Code May Release Merge 1.34 - the latest improvements can be found [here](https://code.visualstudio.com/updates/v1_34)
|
|
||||||
* Resolved [bugs and issues](https://github.com/microsoft/azuredatastudio/milestone/32?closed=1).
|
|
||||||
|
|
||||||
## Version 1.7.0
|
|
||||||
* Release date: May 8, 2019
|
|
||||||
* Release status: General Availability
|
|
||||||
|
|
||||||
## What's new in this version
|
|
||||||
* Announcing Schema Compare *Preview* extension
|
|
||||||
* Tasks Panel UX improvement
|
|
||||||
* Announcing new Welcome page
|
|
||||||
* Resolved [bugs and issues](https://github.com/microsoft/azuredatastudio/milestone/31?closed=1).
|
|
||||||
|
|
||||||
## Contributions and "thank you"
|
|
||||||
We would like to thank all our users who raised issues.
|
|
||||||
|
|
||||||
## Version 1.6.0
|
|
||||||
* Release date: April 18, 2019
|
|
||||||
* Release status: General Availability
|
|
||||||
|
|
||||||
## What's new in this version
|
|
||||||
* Align with latest VS Code editor platform (currently 1.33.1)
|
|
||||||
* Resolved [bugs and issues](https://github.com/Microsoft/azuredatastudio/milestone/26?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:
|
|
||||||
|
|
||||||
* yamatoya for `fix the format (#4899)`
|
|
||||||
|
|
||||||
## Version 1.5.1
|
|
||||||
* Release date: March 18, 2019
|
|
||||||
* Release status: General Availability
|
|
||||||
|
|
||||||
## What's new in this version
|
|
||||||
* Announcing T-SQL Notebooks
|
|
||||||
* Announcing PostgreSQL extension
|
|
||||||
* Announcing SQL Server Dacpac extension
|
|
||||||
* Resolved [bugs and issues](https://github.com/Microsoft/azuredatastudio/milestone/25?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:
|
|
||||||
|
|
||||||
* GeoffYoung for `Fix sqlDropColumn description #4422`
|
|
||||||
|
|
||||||
## Version 1.4.5
|
## Version 1.4.5
|
||||||
* Release date: February 13, 2019
|
* Release date: February 13, 2019
|
||||||
* Release status: General Availability
|
* Release status: General Availability
|
||||||
@@ -225,7 +93,7 @@ We would like to thank all our users who raised issues, and in particular the fo
|
|||||||
|
|
||||||
## What's new in this version
|
## What's new in this version
|
||||||
* Announcing the SQL Server 2019 Preview extension.
|
* Announcing the SQL Server 2019 Preview extension.
|
||||||
* Support for SQL Server 2019 preview features including Big Data Cluster support.
|
* Support for SQL Server 2019 preview features including big data cluster support.
|
||||||
* Azure Data Studio Notebooks
|
* Azure Data Studio Notebooks
|
||||||
* The Azure Resource Explorer viewlets you browse data-related endpoints for your Azure accounts and create connections to them in Object Explorer. In this release Azure SQL Databases and servers are supported.
|
* The Azure Resource Explorer viewlets you browse data-related endpoints for your Azure accounts and create connections to them in Object Explorer. In this release Azure SQL Databases and servers are supported.
|
||||||
* SQL Server Polybase Create External Table Wizard
|
* SQL Server Polybase Create External Table Wizard
|
||||||
|
|||||||
1
CODE_OF_CONDUCT.md
Normal file
1
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
|
||||||
@@ -24,9 +24,7 @@ The built-in tool for reporting an issue, which you can access by using `Report
|
|||||||
|
|
||||||
Please include the following with each issue.
|
Please include the following with each issue.
|
||||||
|
|
||||||
* Version of Azure Data Studio (formerly SQL Operations Studio)
|
* Version of Azure Data Studio (formerly SQL Operations Studio).
|
||||||
|
|
||||||
* Your operating system
|
|
||||||
|
|
||||||
> **Tip:** You can easily create an issue using `Report Issues` from Azure Data Studio Help menu.
|
> **Tip:** You can easily create an issue using `Report Issues` from Azure Data Studio Help menu.
|
||||||
|
|
||||||
|
|||||||
29
README.md
29
README.md
@@ -1,26 +1,25 @@
|
|||||||
# Azure Data Studio
|
# Azure Data Studio
|
||||||
|
|
||||||
[](https://gitter.im/Microsoft/sqlopsstudio?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
[](https://gitter.im/Microsoft/sqlopsstudio?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||||
[](https://dev.azure.com/azuredatastudio/azuredatastudio/_build/latest?definitionId=4&branchName=master)
|
[](https://dev.azure.com/ms/azuredatastudio/_build/latest?definitionId=4)
|
||||||
[](https://twitter.com/azuredatastudio)
|
|
||||||
|
|
||||||
Azure Data Studio is a data management tool that enables you to work with SQL Server, Azure SQL DB and SQL DW from Windows, macOS and Linux.
|
Azure Data Studio is a data management tool that enables you to work with SQL Server, Azure SQL DB and SQL DW from Windows, macOS and Linux.
|
||||||
|
|
||||||
## **Download the latest Azure Data Studio release**
|
**Download the latest Azure Data Studio release**
|
||||||
|
|
||||||
Platform | Link
|
Platform | Link
|
||||||
-- | --
|
-- | --
|
||||||
Windows User Installer | https://go.microsoft.com/fwlink/?linkid=2105135
|
Windows User Installer | https://go.microsoft.com/fwlink/?linkid=2072725
|
||||||
Windows System Installer | https://go.microsoft.com/fwlink/?linkid=2105134
|
Windows System Installer | https://go.microsoft.com/fwlink/?linkid=2072728
|
||||||
Windows ZIP | https://go.microsoft.com/fwlink/?linkid=2104938
|
Windows ZIP | https://go.microsoft.com/fwlink/?linkid=2072354
|
||||||
macOS ZIP | https://go.microsoft.com/fwlink/?linkid=2105133
|
macOS ZIP | https://go.microsoft.com/fwlink/?linkid=2072737
|
||||||
Linux TAR.GZ | https://go.microsoft.com/fwlink/?linkid=2105132
|
Linux TAR.GZ | https://go.microsoft.com/fwlink/?linkid=2072360
|
||||||
Linux RPM | https://go.microsoft.com/fwlink/?linkid=2104937
|
Linux RPM | https://go.microsoft.com/fwlink/?linkid=2072741
|
||||||
Linux DEB | https://go.microsoft.com/fwlink/?linkid=2105131
|
Linux DEB | https://go.microsoft.com/fwlink/?linkid=2072744
|
||||||
|
|
||||||
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.
|
||||||
|
|
||||||
## Try out the latest insiders build from `master`:
|
Try out the latest insiders build from `master`:
|
||||||
- [Windows User Installer - **Insiders build**](https://azuredatastudio-update.azurewebsites.net/latest/win32-x64-user/insider)
|
- [Windows User Installer - **Insiders build**](https://azuredatastudio-update.azurewebsites.net/latest/win32-x64-user/insider)
|
||||||
- [Windows System Installer - **Insiders build**](https://azuredatastudio-update.azurewebsites.net/latest/win32-x64/insider)
|
- [Windows System Installer - **Insiders build**](https://azuredatastudio-update.azurewebsites.net/latest/win32-x64/insider)
|
||||||
- [Windows ZIP - **Insiders build**](https://azuredatastudio-update.azurewebsites.net/latest/win32-x64-archive/insider)
|
- [Windows ZIP - **Insiders build**](https://azuredatastudio-update.azurewebsites.net/latest/win32-x64-archive/insider)
|
||||||
@@ -29,7 +28,7 @@ Go to our [download page](https://aka.ms/azuredatastudio) for more specific inst
|
|||||||
|
|
||||||
See the [change log](https://github.com/Microsoft/azuredatastudio/blob/master/CHANGELOG.md) for additional details of what's in this release.
|
See the [change log](https://github.com/Microsoft/azuredatastudio/blob/master/CHANGELOG.md) for additional details of what's in this release.
|
||||||
|
|
||||||
## **Feature Highlights**
|
**Feature Highlights**
|
||||||
|
|
||||||
- Cross-Platform DB management for Windows, macOS and Linux with simple XCopy deployment
|
- Cross-Platform DB management for Windows, macOS and Linux with simple XCopy deployment
|
||||||
- SQL Server Connection Management with Connection Dialog, Server Groups, Azure Integration and Registered Servers
|
- SQL Server Connection Management with Connection Dialog, Server Groups, Azure Integration and Registered Servers
|
||||||
@@ -69,12 +68,6 @@ 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:
|
||||||
|
|
||||||
* dzsquared for `fix(snippets): ads parenthesis to sqlcreateindex snippet #7020`
|
|
||||||
* devmattrick for `Update row count as updates are received #6642`
|
|
||||||
* mottykohn for `In Message panel onclick scroll to line #6417`
|
|
||||||
* Stevoni for `Corrected Keyboard Shortcut Execution Issue #5480`
|
|
||||||
* yamatoya for `fix the format #4899`
|
|
||||||
* GeoffYoung for `Fix sqlDropColumn description #4422`
|
|
||||||
* AlexFsmn for `Added context menu for DBs in explorer view to backup & restore db. #2277`
|
* AlexFsmn for `Added context menu for DBs in explorer view to backup & restore db. #2277`
|
||||||
* sadedil for `Missing feature request: Save as XML #3729`
|
* sadedil for `Missing feature request: Save as XML #3729`
|
||||||
* gbritton1 for `Removed reference to object explorer #3463`
|
* gbritton1 for `Removed reference to object explorer #3463`
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ expressly granted herein, whether by implication, estoppel or otherwise.
|
|||||||
jquery-ui: https://github.com/jquery/jquery-ui
|
jquery-ui: https://github.com/jquery/jquery-ui
|
||||||
jquery.event.drag: https://github.com/devongovett/jquery.event.drag
|
jquery.event.drag: https://github.com/devongovett/jquery.event.drag
|
||||||
jschardet: https://github.com/aadsm/jschardet
|
jschardet: https://github.com/aadsm/jschardet
|
||||||
jupyter-powershell: https://github.com/vors/jupyter-powershell
|
|
||||||
JupyterLab: https://github.com/jupyterlab/jupyterlab
|
JupyterLab: https://github.com/jupyterlab/jupyterlab
|
||||||
make-error: https://github.com/JsCommunity/make-error
|
make-error: https://github.com/JsCommunity/make-error
|
||||||
minimist: https://github.com/substack/minimist
|
minimist: https://github.com/substack/minimist
|
||||||
@@ -47,6 +46,7 @@ expressly granted herein, whether by implication, estoppel or otherwise.
|
|||||||
node-fetch: https://github.com/bitinn/node-fetch
|
node-fetch: https://github.com/bitinn/node-fetch
|
||||||
node-pty: https://github.com/Tyriar/node-pty
|
node-pty: https://github.com/Tyriar/node-pty
|
||||||
nsfw: https://github.com/Axosoft/nsfw
|
nsfw: https://github.com/Axosoft/nsfw
|
||||||
|
pretty-data: https://github.com/vkiryukhin/pretty-data
|
||||||
primeng: https://github.com/primefaces/primeng
|
primeng: https://github.com/primefaces/primeng
|
||||||
process-nextick-args: https://github.com/calvinmetcalf/process-nextick-args
|
process-nextick-args: https://github.com/calvinmetcalf/process-nextick-args
|
||||||
pty.js: https://github.com/chjj/pty.js
|
pty.js: https://github.com/chjj/pty.js
|
||||||
@@ -343,6 +343,32 @@ END OF emmet NOTICES AND INFORMATION
|
|||||||
=========================================
|
=========================================
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2015 JD Ballard
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
=========================================
|
||||||
|
END OF error-ex NOTICES AND INFORMATION
|
||||||
|
|
||||||
|
%% escape-string-regexp NOTICES AND INFORMATION BEGIN HERE
|
||||||
|
=========================================
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
|
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
@@ -1176,35 +1202,7 @@ That's all there is to it!
|
|||||||
=========================================
|
=========================================
|
||||||
END OF jschardet NOTICES AND INFORMATION
|
END OF jschardet NOTICES AND INFORMATION
|
||||||
|
|
||||||
%% jupyter-powershell NOTICES AND INFORMATION BEGIN HERE
|
|
||||||
=========================================
|
|
||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2016 Sergei Vorobev
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
=========================================
|
|
||||||
END OF jupyter-powershell NOTICES AND INFORMATION
|
|
||||||
|
|
||||||
%% JupyterLab NOTICES AND INFORMATION BEGIN HERE
|
%% JupyterLab NOTICES AND INFORMATION BEGIN HERE
|
||||||
=========================================
|
|
||||||
Copyright (c) 2015 Project Jupyter Contributors
|
Copyright (c) 2015 Project Jupyter Contributors
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
@@ -1448,6 +1446,16 @@ SOFTWARE.
|
|||||||
=========================================
|
=========================================
|
||||||
END OF nsfw NOTICES AND INFORMATION
|
END OF nsfw NOTICES AND INFORMATION
|
||||||
|
|
||||||
|
%% pretty-data NOTICES AND INFORMATION BEGIN HERE
|
||||||
|
=========================================
|
||||||
|
License: Dual licensed under the MIT and GPL licenses:
|
||||||
|
|
||||||
|
http://www.opensource.org/licenses/mit-license.php
|
||||||
|
|
||||||
|
http://www.gnu.org/licenses/gpl.html
|
||||||
|
=========================================
|
||||||
|
END OF pretty-data NOTICES AND INFORMATION
|
||||||
|
|
||||||
%% primeng NOTICES AND INFORMATION BEGIN HERE
|
%% primeng NOTICES AND INFORMATION BEGIN HERE
|
||||||
=========================================
|
=========================================
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
@@ -2432,6 +2440,7 @@ General Public License.
|
|||||||
|
|
||||||
-------------------------------START OF THIRD-PARTY NOTICES-------------------------------------------
|
-------------------------------START OF THIRD-PARTY NOTICES-------------------------------------------
|
||||||
|
|
||||||
|
===================================ExcelDataReader (BEGIN)
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2014 ExcelDataReader
|
Copyright (c) 2014 ExcelDataReader
|
||||||
@@ -2457,4 +2466,4 @@ SOFTWARE.
|
|||||||
|
|
||||||
-------------------------------END OF THIRD-PARTY NOTICES-------------------------------------------
|
-------------------------------END OF THIRD-PARTY NOTICES-------------------------------------------
|
||||||
=========================================
|
=========================================
|
||||||
END OF Microsoft.ProgramSynthesis.Detection NOTICES AND INFORMATION
|
END OF Microsoft.ProgramSynthesis.Detection NOTICES AND INFORMATION
|
||||||
46
azure-pipelines-linux-mac.yml
Normal file
46
azure-pipelines-linux-mac.yml
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
steps:
|
||||||
|
- task: NodeTool@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: '8.x'
|
||||||
|
displayName: 'Install Node.js'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
git submodule update --init --recursive
|
||||||
|
nvm install 8.9.1
|
||||||
|
nvm use 8.9.1
|
||||||
|
npm i -g yarn
|
||||||
|
displayName: 'preinstall'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
export CXX="g++-4.9" CC="gcc-4.9" DISPLAY=:10
|
||||||
|
sudo cp build/azure-pipelines/linux/xvfb.init /etc/init.d/xvfb
|
||||||
|
sudo chmod +x /etc/init.d/xvfb
|
||||||
|
sudo update-rc.d xvfb defaults
|
||||||
|
sudo service xvfb start
|
||||||
|
# sh -e /etc/init.d/xvfb start
|
||||||
|
# sleep 3
|
||||||
|
displayName: 'Linux preinstall'
|
||||||
|
condition: eq(variables['Agent.OS'], 'Linux')
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
yarn
|
||||||
|
displayName: 'Install'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
node_modules/.bin/gulp electron
|
||||||
|
node_modules/.bin/gulp compile --max_old_space_size=4096
|
||||||
|
node_modules/.bin/gulp optimize-vscode --max_old_space_size=4096
|
||||||
|
displayName: 'Scripts'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
DISPLAY=:10 ./scripts/test.sh --reporter mocha-junit-reporter
|
||||||
|
displayName: 'Tests'
|
||||||
|
|
||||||
|
- task: PublishTestResults@2
|
||||||
|
inputs:
|
||||||
|
testResultsFiles: '**/test-results.xml'
|
||||||
|
condition: succeededOrFailed()
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
yarn run tslint
|
||||||
|
displayName: 'Run TSLint'
|
||||||
30
azure-pipelines-windows.yml
Normal file
30
azure-pipelines-windows.yml
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
steps:
|
||||||
|
- task: NodeTool@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: '8.9'
|
||||||
|
displayName: 'Install Node.js'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
yarn
|
||||||
|
displayName: 'Yarn Install'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
.\node_modules\.bin\gulp electron
|
||||||
|
displayName: 'Electron'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
npm run compile
|
||||||
|
displayName: 'Compile'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
.\scripts\test.bat --reporter mocha-junit-reporter
|
||||||
|
displayName: 'Test'
|
||||||
|
|
||||||
|
- task: PublishTestResults@2
|
||||||
|
inputs:
|
||||||
|
testResultsFiles: 'test-results.xml'
|
||||||
|
condition: succeededOrFailed()
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
yarn run tslint
|
||||||
|
displayName: 'Run TSLint'
|
||||||
@@ -1,18 +1,29 @@
|
|||||||
|
trigger:
|
||||||
|
- master
|
||||||
|
- releases/*
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
- job: Windows
|
|
||||||
pool:
|
|
||||||
vmImage: VS2017-Win2016
|
|
||||||
steps:
|
|
||||||
- template: build/azure-pipelines/win32/continuous-build-win32.yml
|
|
||||||
|
|
||||||
- job: Linux
|
# All tasks on Windows
|
||||||
|
- job: build_all_windows
|
||||||
|
displayName: Build all tasks (Windows)
|
||||||
pool:
|
pool:
|
||||||
vmImage: 'Ubuntu-16.04'
|
vmImage: vs2017-win2016
|
||||||
steps:
|
steps:
|
||||||
- template: build/azure-pipelines/linux/continuous-build-linux.yml
|
- template: azure-pipelines-windows.yml
|
||||||
|
|
||||||
- job: macOS
|
# All tasks on Linux
|
||||||
|
- job: build_all_linux
|
||||||
|
displayName: Build all tasks (Linux)
|
||||||
pool:
|
pool:
|
||||||
vmImage: macOS 10.13
|
vmImage: 'Ubuntu 16.04'
|
||||||
steps:
|
steps:
|
||||||
- template: build/azure-pipelines/darwin/continuous-build-darwin.yml
|
- template: azure-pipelines-linux-mac.yml
|
||||||
|
|
||||||
|
# All tasks on macOS
|
||||||
|
- job: build_all_darwin
|
||||||
|
displayName: Build all tasks (macOS)
|
||||||
|
pool:
|
||||||
|
vmImage: macos-10.13
|
||||||
|
steps:
|
||||||
|
- template: azure-pipelines-linux-mac.yml
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
2019-08-30T20:24:23.714Z
|
|
||||||
@@ -1,134 +0,0 @@
|
|||||||
# cleanup rules for native node modules, .gitignore style
|
|
||||||
|
|
||||||
nan/**
|
|
||||||
*/node_modules/nan/**
|
|
||||||
|
|
||||||
fsevents/binding.gyp
|
|
||||||
fsevents/fsevents.cc
|
|
||||||
fsevents/build/**
|
|
||||||
fsevents/src/**
|
|
||||||
fsevents/test/**
|
|
||||||
!fsevents/**/*.node
|
|
||||||
|
|
||||||
vscode-sqlite3/binding.gyp
|
|
||||||
vscode-sqlite3/benchmark/**
|
|
||||||
vscode-sqlite3/cloudformation/**
|
|
||||||
vscode-sqlite3/deps/**
|
|
||||||
vscode-sqlite3/test/**
|
|
||||||
vscode-sqlite3/build/**
|
|
||||||
vscode-sqlite3/src/**
|
|
||||||
!vscode-sqlite3/build/Release/*.node
|
|
||||||
|
|
||||||
oniguruma/binding.gyp
|
|
||||||
oniguruma/build/**
|
|
||||||
oniguruma/src/**
|
|
||||||
oniguruma/deps/**
|
|
||||||
!oniguruma/build/Release/*.node
|
|
||||||
!oniguruma/src/*.js
|
|
||||||
|
|
||||||
windows-mutex/binding.gyp
|
|
||||||
windows-mutex/build/**
|
|
||||||
windows-mutex/src/**
|
|
||||||
!windows-mutex/**/*.node
|
|
||||||
|
|
||||||
native-keymap/binding.gyp
|
|
||||||
native-keymap/build/**
|
|
||||||
native-keymap/src/**
|
|
||||||
native-keymap/deps/**
|
|
||||||
!native-keymap/build/Release/*.node
|
|
||||||
|
|
||||||
native-is-elevated/binding.gyp
|
|
||||||
native-is-elevated/build/**
|
|
||||||
native-is-elevated/src/**
|
|
||||||
native-is-elevated/deps/**
|
|
||||||
!native-is-elevated/build/Release/*.node
|
|
||||||
|
|
||||||
native-watchdog/binding.gyp
|
|
||||||
native-watchdog/build/**
|
|
||||||
native-watchdog/src/**
|
|
||||||
!native-watchdog/build/Release/*.node
|
|
||||||
|
|
||||||
spdlog/binding.gyp
|
|
||||||
spdlog/build/**
|
|
||||||
spdlog/deps/**
|
|
||||||
spdlog/src/**
|
|
||||||
spdlog/test/**
|
|
||||||
!spdlog/build/Release/*.node
|
|
||||||
|
|
||||||
jschardet/dist/**
|
|
||||||
|
|
||||||
windows-foreground-love/binding.gyp
|
|
||||||
windows-foreground-love/build/**
|
|
||||||
windows-foreground-love/src/**
|
|
||||||
!windows-foreground-love/**/*.node
|
|
||||||
|
|
||||||
windows-process-tree/binding.gyp
|
|
||||||
windows-process-tree/build/**
|
|
||||||
windows-process-tree/src/**
|
|
||||||
!windows-process-tree/**/*.node
|
|
||||||
|
|
||||||
keytar/binding.gyp
|
|
||||||
keytar/build/**
|
|
||||||
keytar/src/**
|
|
||||||
keytar/script/**
|
|
||||||
keytar/node_modules/**
|
|
||||||
!keytar/**/*.node
|
|
||||||
|
|
||||||
node-pty/binding.gyp
|
|
||||||
node-pty/build/**
|
|
||||||
node-pty/src/**
|
|
||||||
node-pty/tools/**
|
|
||||||
node-pty/deps/**
|
|
||||||
!node-pty/build/Release/*.exe
|
|
||||||
!node-pty/build/Release/*.dll
|
|
||||||
!node-pty/build/Release/*.node
|
|
||||||
|
|
||||||
emmet/node_modules/**
|
|
||||||
|
|
||||||
pty.js/build/**
|
|
||||||
!pty.js/build/Release/**
|
|
||||||
|
|
||||||
# START SQL Modules
|
|
||||||
|
|
||||||
@angular/**/src/**
|
|
||||||
@angular/**/testing/**
|
|
||||||
|
|
||||||
angular2-grid/components/**
|
|
||||||
angular2-grid/directives/**
|
|
||||||
angular2-grid/interfaces/**
|
|
||||||
angular2-grid/modules/**
|
|
||||||
|
|
||||||
angular2-slickgrid/.vscode/**
|
|
||||||
angular2-slickgrid/components/**
|
|
||||||
angular2-slickgrid/examples/**
|
|
||||||
|
|
||||||
jquery-ui/external/**
|
|
||||||
jquery-ui/demos/**
|
|
||||||
|
|
||||||
slickgrid/node_modules/**
|
|
||||||
slickgrid/examples/**
|
|
||||||
|
|
||||||
# END SQL Modules
|
|
||||||
|
|
||||||
nsfw/binding.gyp
|
|
||||||
nsfw/build/**
|
|
||||||
nsfw/src/**
|
|
||||||
nsfw/openpa/**
|
|
||||||
nsfw/includes/**
|
|
||||||
!nsfw/build/Release/*.node
|
|
||||||
!nsfw/**/*.a
|
|
||||||
|
|
||||||
vsda/build/**
|
|
||||||
vsda/ci/**
|
|
||||||
vsda/src/**
|
|
||||||
vsda/.gitignore
|
|
||||||
vsda/binding.gyp
|
|
||||||
vsda/README.md
|
|
||||||
vsda/targets
|
|
||||||
!vsda/build/Release/vsda.node
|
|
||||||
|
|
||||||
vscode-windows-ca-certs/**/*
|
|
||||||
!vscode-windows-ca-certs/package.json
|
|
||||||
!vscode-windows-ca-certs/**/*.node
|
|
||||||
|
|
||||||
node-addon-api/**/*
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
cd $BUILD_STAGINGDIRECTORY
|
|
||||||
mkdir extraction
|
|
||||||
cd extraction
|
|
||||||
git clone --depth 1 https://github.com/Microsoft/vscode-extension-telemetry.git
|
|
||||||
git clone --depth 1 https://github.com/Microsoft/vscode-chrome-debug-core.git
|
|
||||||
git clone --depth 1 https://github.com/Microsoft/vscode-node-debug2.git
|
|
||||||
git clone --depth 1 https://github.com/Microsoft/vscode-node-debug.git
|
|
||||||
git clone --depth 1 https://github.com/Microsoft/vscode-html-languageservice.git
|
|
||||||
git clone --depth 1 https://github.com/Microsoft/vscode-json-languageservice.git
|
|
||||||
$BUILD_SOURCESDIRECTORY/build/node_modules/.bin/vscode-telemetry-extractor --sourceDir $BUILD_SOURCESDIRECTORY --excludedDir $BUILD_SOURCESDIRECTORY/extensions --outputDir . --applyEndpoints
|
|
||||||
$BUILD_SOURCESDIRECTORY/build/node_modules/.bin/vscode-telemetry-extractor --config $BUILD_SOURCESDIRECTORY/build/azure-pipelines/common/telemetry-config.json -o .
|
|
||||||
mkdir -p $BUILD_SOURCESDIRECTORY/.build/telemetry
|
|
||||||
mv declarations-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-core.json
|
|
||||||
mv config-resolved.json $BUILD_SOURCESDIRECTORY/.build/telemetry/telemetry-extensions.json
|
|
||||||
cd ..
|
|
||||||
rm -rf extraction
|
|
||||||
18
build/azure-pipelines/common/installDistro.ts
Normal file
18
build/azure-pipelines/common/installDistro.ts
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
import * as cp from 'child_process';
|
||||||
|
|
||||||
|
function yarnInstall(packageName: string): void {
|
||||||
|
cp.execSync(`yarn add --no-lockfile ${packageName}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const product = require('../../../product.json');
|
||||||
|
const dependencies = product.dependencies || {} as { [name: string]: string; };
|
||||||
|
|
||||||
|
Object.keys(dependencies).forEach(name => {
|
||||||
|
const url = dependencies[name];
|
||||||
|
yarnInstall(url);
|
||||||
|
});
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -e
|
|
||||||
REPO="$(pwd)"
|
|
||||||
|
|
||||||
# Publish webview contents
|
|
||||||
PACKAGEJSON="$REPO/package.json"
|
|
||||||
VERSION=$(node -p "require(\"$PACKAGEJSON\").version")
|
|
||||||
|
|
||||||
node build/azure-pipelines/common/publish-webview.js "$REPO/src/vs/workbench/contrib/webview/browser/pre/"
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------------------------
|
|
||||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
|
||||||
*--------------------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
import * as azure from 'azure-storage';
|
|
||||||
import * as mime from 'mime';
|
|
||||||
import * as minimist from 'minimist';
|
|
||||||
import { basename, join } from 'path';
|
|
||||||
|
|
||||||
const fileNames = [
|
|
||||||
'fake.html',
|
|
||||||
'host.js',
|
|
||||||
'index.html',
|
|
||||||
'main.js',
|
|
||||||
'service-worker.js'
|
|
||||||
];
|
|
||||||
|
|
||||||
async function assertContainer(blobService: azure.BlobService, container: string): Promise<void> {
|
|
||||||
await new Promise((c, e) => blobService.createContainerIfNotExists(container, { publicAccessLevel: 'blob' }, err => err ? e(err) : c()));
|
|
||||||
}
|
|
||||||
|
|
||||||
async function doesBlobExist(blobService: azure.BlobService, container: string, blobName: string): Promise<boolean | undefined> {
|
|
||||||
const existsResult = await new Promise<azure.BlobService.BlobResult>((c, e) => blobService.doesBlobExist(container, blobName, (err, r) => err ? e(err) : c(r)));
|
|
||||||
return existsResult.exists;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function uploadBlob(blobService: azure.BlobService, container: 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(container, blobName, file, blobOptions, err => err ? e(err) : c()));
|
|
||||||
}
|
|
||||||
|
|
||||||
async function publish(commit: string, files: readonly string[]): Promise<void> {
|
|
||||||
|
|
||||||
console.log('Publishing...');
|
|
||||||
console.log('Commit:', commit);
|
|
||||||
const storageAccount = process.env['AZURE_WEBVIEW_STORAGE_ACCOUNT']!;
|
|
||||||
|
|
||||||
const blobService = azure.createBlobService(storageAccount, process.env['AZURE_WEBVIEW_STORAGE_ACCESS_KEY']!)
|
|
||||||
.withFilter(new azure.ExponentialRetryPolicyFilter(20));
|
|
||||||
|
|
||||||
await assertContainer(blobService, commit);
|
|
||||||
|
|
||||||
for (const file of files) {
|
|
||||||
const blobName = basename(file);
|
|
||||||
const blobExists = await doesBlobExist(blobService, commit, blobName);
|
|
||||||
if (blobExists) {
|
|
||||||
console.log(`Blob ${commit}, ${blobName} already exists, not publishing again.`);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
console.log('Uploading blob to Azure storage...');
|
|
||||||
await uploadBlob(blobService, commit, blobName, file);
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('Blobs successfully uploaded.');
|
|
||||||
}
|
|
||||||
|
|
||||||
function main(): void {
|
|
||||||
const commit = process.env['BUILD_SOURCEVERSION'];
|
|
||||||
|
|
||||||
if (!commit) {
|
|
||||||
console.warn('Skipping publish due to missing BUILD_SOURCEVERSION');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const opts = minimist(process.argv.slice(2));
|
|
||||||
const [directory] = opts._;
|
|
||||||
|
|
||||||
const files = fileNames.map(fileName => join(directory, fileName));
|
|
||||||
|
|
||||||
publish(commit, files).catch(err => {
|
|
||||||
console.error(err);
|
|
||||||
process.exit(1);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (process.argv.length < 3) {
|
|
||||||
console.error('Usage: node publish.js <directory>');
|
|
||||||
process.exit(-1);
|
|
||||||
}
|
|
||||||
main();
|
|
||||||
@@ -6,6 +6,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
|
import { execSync } from 'child_process';
|
||||||
import { Readable } from 'stream';
|
import { Readable } from 'stream';
|
||||||
import * as crypto from 'crypto';
|
import * as crypto from 'crypto';
|
||||||
import * as azure from 'azure-storage';
|
import * as azure from 'azure-storage';
|
||||||
@@ -65,7 +66,8 @@ interface Asset {
|
|||||||
platform: string;
|
platform: string;
|
||||||
type: string;
|
type: string;
|
||||||
url: string;
|
url: string;
|
||||||
mooncakeUrl?: string;
|
// {{SQL CARBON EDIT}}
|
||||||
|
mooncakeUrl: string | undefined;
|
||||||
hash: string;
|
hash: string;
|
||||||
sha256hash: string;
|
sha256hash: string;
|
||||||
size: number;
|
size: number;
|
||||||
@@ -152,6 +154,9 @@ async function publish(commit: string, quality: string, platform: string, type:
|
|||||||
|
|
||||||
const queuedBy = process.env['BUILD_QUEUEDBY']!;
|
const queuedBy = process.env['BUILD_QUEUEDBY']!;
|
||||||
const sourceBranch = process.env['BUILD_SOURCEBRANCH']!;
|
const sourceBranch = process.env['BUILD_SOURCEBRANCH']!;
|
||||||
|
const isReleased = quality === 'insider'
|
||||||
|
&& /^master$|^refs\/heads\/master$/.test(sourceBranch)
|
||||||
|
&& /Project Collection Service Accounts|Microsoft.VisualStudio.Services.TFS/.test(queuedBy);
|
||||||
|
|
||||||
console.log('Publishing...');
|
console.log('Publishing...');
|
||||||
console.log('Quality:', quality);
|
console.log('Quality:', quality);
|
||||||
@@ -161,6 +166,7 @@ async function publish(commit: string, quality: string, platform: string, type:
|
|||||||
console.log('Version:', version);
|
console.log('Version:', version);
|
||||||
console.log('Commit:', commit);
|
console.log('Commit:', commit);
|
||||||
console.log('Is Update:', isUpdate);
|
console.log('Is Update:', isUpdate);
|
||||||
|
console.log('Is Released:', isReleased);
|
||||||
console.log('File:', file);
|
console.log('File:', file);
|
||||||
|
|
||||||
const stat = await new Promise<fs.Stats>((c, e) => fs.stat(file, (err, stat) => err ? e(err) : c(stat)));
|
const stat = await new Promise<fs.Stats>((c, e) => fs.stat(file, (err, stat) => err ? e(err) : c(stat)));
|
||||||
@@ -180,18 +186,56 @@ async function publish(commit: string, quality: string, platform: string, type:
|
|||||||
const blobService = azure.createBlobService(storageAccount, process.env['AZURE_STORAGE_ACCESS_KEY_2']!)
|
const blobService = azure.createBlobService(storageAccount, process.env['AZURE_STORAGE_ACCESS_KEY_2']!)
|
||||||
.withFilter(new azure.ExponentialRetryPolicyFilter(20));
|
.withFilter(new azure.ExponentialRetryPolicyFilter(20));
|
||||||
|
|
||||||
|
// {{SQL CARBON EDIT}}
|
||||||
await assertContainer(blobService, quality);
|
await assertContainer(blobService, quality);
|
||||||
|
|
||||||
const blobExists = await doesAssetExist(blobService, quality, blobName);
|
const blobExists = await doesAssetExist(blobService, quality, blobName);
|
||||||
|
|
||||||
if (blobExists) {
|
const promises = [];
|
||||||
|
|
||||||
|
if (!blobExists) {
|
||||||
|
promises.push(uploadBlob(blobService, quality, blobName, file));
|
||||||
|
}
|
||||||
|
|
||||||
|
// {{SQL CARBON EDIT}}
|
||||||
|
if (process.env['MOONCAKE_STORAGE_ACCESS_KEY']) {
|
||||||
|
const mooncakeBlobService = azure.createBlobService(storageAccount, process.env['MOONCAKE_STORAGE_ACCESS_KEY']!, `${storageAccount}.blob.core.chinacloudapi.cn`)
|
||||||
|
.withFilter(new azure.ExponentialRetryPolicyFilter(20));
|
||||||
|
|
||||||
|
// mooncake is fussy and far away, this is needed!
|
||||||
|
mooncakeBlobService.defaultClientRequestTimeoutInMs = 10 * 60 * 1000;
|
||||||
|
|
||||||
|
await Promise.all([
|
||||||
|
assertContainer(blobService, quality),
|
||||||
|
assertContainer(mooncakeBlobService, quality)
|
||||||
|
]);
|
||||||
|
|
||||||
|
const [blobExists, moooncakeBlobExists] = await Promise.all([
|
||||||
|
doesAssetExist(blobService, quality, blobName),
|
||||||
|
doesAssetExist(mooncakeBlobService, quality, blobName)
|
||||||
|
]);
|
||||||
|
|
||||||
|
const promises: Array<Promise<void>> = [];
|
||||||
|
|
||||||
|
if (!blobExists) {
|
||||||
|
promises.push(uploadBlob(blobService, quality, blobName, file));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!moooncakeBlobExists) {
|
||||||
|
promises.push(uploadBlob(mooncakeBlobService, quality, blobName, file));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log('Skipping Mooncake publishing.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (promises.length === 0) {
|
||||||
console.log(`Blob ${quality}, ${blobName} already exists, not publishing again.`);
|
console.log(`Blob ${quality}, ${blobName} already exists, not publishing again.`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('Uploading blobs to Azure storage...');
|
console.log('Uploading blobs to Azure storage...');
|
||||||
|
|
||||||
await uploadBlob(blobService, quality, blobName, file);
|
await Promise.all(promises);
|
||||||
|
|
||||||
console.log('Blobs successfully uploaded.');
|
console.log('Blobs successfully uploaded.');
|
||||||
|
|
||||||
@@ -203,6 +247,8 @@ async function publish(commit: string, quality: string, platform: string, type:
|
|||||||
platform: platform,
|
platform: platform,
|
||||||
type: type,
|
type: type,
|
||||||
url: `${process.env['AZURE_CDN_URL']}/${quality}/${blobName}`,
|
url: `${process.env['AZURE_CDN_URL']}/${quality}/${blobName}`,
|
||||||
|
// {{SQL CARBON EDIT}}
|
||||||
|
mooncakeUrl: process.env['MOONCAKE_CDN_URL'] ? `${process.env['MOONCAKE_CDN_URL']}/${quality}/${blobName}` : undefined,
|
||||||
hash: sha1hash,
|
hash: sha1hash,
|
||||||
sha256hash,
|
sha256hash,
|
||||||
size
|
size
|
||||||
@@ -215,15 +261,11 @@ async function publish(commit: string, quality: string, platform: string, type:
|
|||||||
|
|
||||||
console.log('Asset:', JSON.stringify(asset, null, ' '));
|
console.log('Asset:', JSON.stringify(asset, null, ' '));
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}}
|
|
||||||
// Insiders: nightly build from master
|
|
||||||
const isReleased = (quality === 'insider' && /^master$|^refs\/heads\/master$/.test(sourceBranch) && /Project Collection Service Accounts|Microsoft.VisualStudio.Services.TFS/.test(queuedBy));
|
|
||||||
|
|
||||||
const release = {
|
const release = {
|
||||||
id: commit,
|
id: commit,
|
||||||
timestamp: (new Date()).getTime(),
|
timestamp: (new Date()).getTime(),
|
||||||
version,
|
version,
|
||||||
isReleased: isReleased,
|
isReleased: config.frozen ? false : isReleased,
|
||||||
sourceBranch,
|
sourceBranch,
|
||||||
queuedBy,
|
queuedBy,
|
||||||
assets: [] as Array<Asset>,
|
assets: [] as Array<Asset>,
|
||||||
@@ -242,10 +284,8 @@ async function publish(commit: string, quality: string, platform: string, type:
|
|||||||
}
|
}
|
||||||
|
|
||||||
function main(): void {
|
function main(): void {
|
||||||
const commit = process.env['BUILD_SOURCEVERSION'];
|
if (process.env['VSCODE_BUILD_SKIP_PUBLISH']) {
|
||||||
|
console.warn('Skipping publish due to VSCODE_BUILD_SKIP_PUBLISH');
|
||||||
if (!commit) {
|
|
||||||
console.warn('Skipping publish due to missing BUILD_SOURCEVERSION');
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -253,7 +293,11 @@ function main(): void {
|
|||||||
boolean: ['upload-only']
|
boolean: ['upload-only']
|
||||||
});
|
});
|
||||||
|
|
||||||
const [quality, platform, type, name, version, _isUpdate, file] = opts._;
|
// {{SQL CARBON EDIT}}
|
||||||
|
let [quality, platform, type, name, version, _isUpdate, file, commit] = opts._;
|
||||||
|
if (!commit) {
|
||||||
|
commit = execSync('git rev-parse HEAD', { encoding: 'utf8' }).trim();
|
||||||
|
}
|
||||||
|
|
||||||
publish(commit, quality, platform, type, name, version, _isUpdate, file, opts).catch(err => {
|
publish(commit, quality, platform, type, name, version, _isUpdate, file, opts).catch(err => {
|
||||||
console.error(err);
|
console.error(err);
|
||||||
|
|||||||
@@ -1,109 +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';
|
|
||||||
|
|
||||||
import { DocumentClient } from 'documentdb';
|
|
||||||
|
|
||||||
interface Config {
|
|
||||||
id: string;
|
|
||||||
frozen: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
function createDefaultConfig(quality: string): Config {
|
|
||||||
return {
|
|
||||||
id: quality,
|
|
||||||
frozen: false
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function getConfig(quality: string): Promise<Config> {
|
|
||||||
const client = new 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<Config>((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] as any as Config);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function doRelease(commit: string, quality: string): Promise<void> {
|
|
||||||
const client = new DocumentClient(process.env['AZURE_DOCUMENTDB_ENDPOINT']!, { masterKey: process.env['AZURE_DOCUMENTDB_MASTERKEY'] });
|
|
||||||
const collection = 'dbs/builds/colls/' + quality;
|
|
||||||
const query = {
|
|
||||||
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, query).toArray((err, results) => {
|
|
||||||
if (err) { return e(err); }
|
|
||||||
if (results.length !== 1) { return e(new Error('No documents')); }
|
|
||||||
|
|
||||||
const release = results[0];
|
|
||||||
release.isReleased = true;
|
|
||||||
|
|
||||||
client.replaceDocument(release._self, release, err => {
|
|
||||||
if (err && err.code === 409 && updateTries < 5) { return c(update()); }
|
|
||||||
if (err) { return e(err); }
|
|
||||||
|
|
||||||
console.log('Build successfully updated.');
|
|
||||||
c();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return update();
|
|
||||||
}
|
|
||||||
|
|
||||||
async function release(commit: string, quality: string): Promise<void> {
|
|
||||||
const config = await getConfig(quality);
|
|
||||||
|
|
||||||
console.log('Quality config:', config);
|
|
||||||
|
|
||||||
if (config.frozen) {
|
|
||||||
console.log(`Skipping release because quality ${quality} is frozen.`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
await doRelease(commit, quality);
|
|
||||||
}
|
|
||||||
|
|
||||||
function env(name: string): string {
|
|
||||||
const result = process.env[name];
|
|
||||||
|
|
||||||
if (!result) {
|
|
||||||
throw new Error(`Skipping release due to missing env: ${name}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function main(): Promise<void> {
|
|
||||||
const commit = env('BUILD_SOURCEVERSION');
|
|
||||||
const quality = env('VSCODE_QUALITY');
|
|
||||||
|
|
||||||
await release(commit, quality);
|
|
||||||
}
|
|
||||||
|
|
||||||
main().catch(err => {
|
|
||||||
console.error(err);
|
|
||||||
process.exit(1);
|
|
||||||
});
|
|
||||||
@@ -36,6 +36,7 @@ export interface IVersionAccessor extends IApplicationAccessor {
|
|||||||
enum Platform {
|
enum Platform {
|
||||||
WIN_32 = 'win32-ia32',
|
WIN_32 = 'win32-ia32',
|
||||||
WIN_64 = 'win32-x64',
|
WIN_64 = 'win32-x64',
|
||||||
|
LINUX_32 = 'linux-ia32',
|
||||||
LINUX_64 = 'linux-x64',
|
LINUX_64 = 'linux-x64',
|
||||||
MAC_OS = 'darwin-x64'
|
MAC_OS = 'darwin-x64'
|
||||||
}
|
}
|
||||||
@@ -146,10 +147,6 @@ async function ensureVersionAndSymbols(options: IOptions) {
|
|||||||
// Check version does not exist
|
// Check version does not exist
|
||||||
console.log(`HockeyApp: checking for existing version ${options.versions.code} (${options.platform})`);
|
console.log(`HockeyApp: checking for existing version ${options.versions.code} (${options.platform})`);
|
||||||
const versions = await getVersions({ accessToken: options.access.hockeyAppToken, appId: options.access.hockeyAppId });
|
const versions = await getVersions({ accessToken: options.access.hockeyAppToken, appId: options.access.hockeyAppId });
|
||||||
if (!Array.isArray(versions.app_versions)) {
|
|
||||||
throw new Error(`Unexpected response: ${JSON.stringify(versions)}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (versions.app_versions.some(v => v.version === options.versions.code)) {
|
if (versions.app_versions.some(v => v.version === options.versions.code)) {
|
||||||
console.log(`HockeyApp: Returning without uploading symbols because version ${options.versions.code} (${options.platform}) was already found`);
|
console.log(`HockeyApp: Returning without uploading symbols because version ${options.versions.code} (${options.platform}) was already found`);
|
||||||
return;
|
return;
|
||||||
@@ -188,17 +185,13 @@ const hockeyAppToken = process.argv[3];
|
|||||||
const is64 = process.argv[4] === 'x64';
|
const is64 = process.argv[4] === 'x64';
|
||||||
const hockeyAppId = process.argv[5];
|
const hockeyAppId = process.argv[5];
|
||||||
|
|
||||||
if (process.argv.length !== 6) {
|
|
||||||
throw new Error(`HockeyApp: Unexpected number of arguments. Got ${process.argv}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
let platform: Platform;
|
let platform: Platform;
|
||||||
if (process.platform === 'darwin') {
|
if (process.platform === 'darwin') {
|
||||||
platform = Platform.MAC_OS;
|
platform = Platform.MAC_OS;
|
||||||
} else if (process.platform === 'win32') {
|
} else if (process.platform === 'win32') {
|
||||||
platform = is64 ? Platform.WIN_64 : Platform.WIN_32;
|
platform = is64 ? Platform.WIN_64 : Platform.WIN_32;
|
||||||
} else {
|
} else {
|
||||||
platform = Platform.LINUX_64;
|
platform = is64 ? Platform.LINUX_64 : Platform.LINUX_32;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create version and upload symbols in HockeyApp
|
// Create version and upload symbols in HockeyApp
|
||||||
@@ -219,9 +212,7 @@ if (repository && codeVersion && electronVersion && (product.quality === 'stable
|
|||||||
}).then(() => {
|
}).then(() => {
|
||||||
console.log('HockeyApp: done');
|
console.log('HockeyApp: done');
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
console.error(`HockeyApp: error ${error} (AppID: ${hockeyAppId})`);
|
console.error(`HockeyApp: error (${error})`);
|
||||||
|
|
||||||
return process.exit(1);
|
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
console.log(`HockeyApp: skipping due to unexpected context (repository: ${repository}, codeVersion: ${codeVersion}, electronVersion: ${electronVersion}, quality: ${product.quality})`);
|
console.log(`HockeyApp: skipping due to unexpected context (repository: ${repository}, codeVersion: ${codeVersion}, electronVersion: ${electronVersion}, quality: ${product.quality})`);
|
||||||
|
|||||||
@@ -1,171 +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';
|
|
||||||
|
|
||||||
import * as url from 'url';
|
|
||||||
import * as azure from 'azure-storage';
|
|
||||||
import * as mime from 'mime';
|
|
||||||
import { DocumentClient, RetrievedDocument } from 'documentdb';
|
|
||||||
|
|
||||||
function log(...args: any[]) {
|
|
||||||
console.log(...[`[${new Date().toISOString()}]`, ...args]);
|
|
||||||
}
|
|
||||||
|
|
||||||
function error(...args: any[]) {
|
|
||||||
console.error(...[`[${new Date().toISOString()}]`, ...args]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (process.argv.length < 3) {
|
|
||||||
error('Usage: node sync-mooncake.js <quality>');
|
|
||||||
process.exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Build extends RetrievedDocument {
|
|
||||||
assets: Asset[];
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Asset {
|
|
||||||
platform: string;
|
|
||||||
type: string;
|
|
||||||
url: string;
|
|
||||||
mooncakeUrl: string;
|
|
||||||
hash: string;
|
|
||||||
sha256hash: string;
|
|
||||||
size: number;
|
|
||||||
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> {
|
|
||||||
log(`Synchronizing Mooncake assets for ${quality}, ${commit}...`);
|
|
||||||
|
|
||||||
const cosmosdb = new DocumentClient(process.env['AZURE_DOCUMENTDB_ENDPOINT']!, { masterKey: process.env['AZURE_DOCUMENTDB_MASTERKEY'] });
|
|
||||||
const collection = `dbs/builds/colls/${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) => {
|
|
||||||
cosmosdb.queryDocuments(collection, query).toArray((err, results) => {
|
|
||||||
if (err) { return e(err); }
|
|
||||||
if (results.length !== 1) { return e(new Error('No documents')); }
|
|
||||||
c(results[0] as Build);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
log(`Found build for ${commit}, with ${build.assets.length} assets`);
|
|
||||||
|
|
||||||
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 mooncakeBlobService = azure.createBlobService(storageAccount, process.env['MOONCAKE_STORAGE_ACCESS_KEY']!, `${storageAccount}.blob.core.chinacloudapi.cn`)
|
|
||||||
.withFilter(new azure.ExponentialRetryPolicyFilter(20));
|
|
||||||
|
|
||||||
// mooncake is fussy and far away, this is needed!
|
|
||||||
blobService.defaultClientRequestTimeoutInMs = 10 * 60 * 1000;
|
|
||||||
mooncakeBlobService.defaultClientRequestTimeoutInMs = 10 * 60 * 1000;
|
|
||||||
|
|
||||||
for (const asset of build.assets) {
|
|
||||||
try {
|
|
||||||
const blobPath = url.parse(asset.url).path;
|
|
||||||
|
|
||||||
if (!blobPath) {
|
|
||||||
throw new Error(`Failed to parse URL: ${asset.url}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
const blobName = blobPath.replace(/^\/\w+\//, '');
|
|
||||||
|
|
||||||
log(`Found ${blobName}`);
|
|
||||||
|
|
||||||
if (asset.mooncakeUrl) {
|
|
||||||
log(` Already in Mooncake ✔️`);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const readStream = blobService.createReadStream(quality, blobName, undefined!);
|
|
||||||
const blobOptions: azure.BlobService.CreateBlockBlobRequestOptions = {
|
|
||||||
contentSettings: {
|
|
||||||
contentType: mime.lookup(blobPath),
|
|
||||||
cacheControl: 'max-age=31536000, public'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const writeStream = mooncakeBlobService.createWriteStreamToBlockBlob(quality, blobName, blobOptions, undefined);
|
|
||||||
|
|
||||||
log(` Uploading to Mooncake...`);
|
|
||||||
await new Promise((c, e) => readStream.pipe(writeStream).on('finish', c).on('error', e));
|
|
||||||
|
|
||||||
log(` Updating build in DB...`);
|
|
||||||
asset.mooncakeUrl = `${process.env['MOONCAKE_CDN_URL']}${blobPath}`;
|
|
||||||
await updateBuild(commit, quality, asset.platform, asset.type, asset);
|
|
||||||
|
|
||||||
log(` Done ✔️`);
|
|
||||||
} catch (err) {
|
|
||||||
error(err);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
log(`All done ✔️`);
|
|
||||||
}
|
|
||||||
|
|
||||||
function main(): void {
|
|
||||||
const commit = process.env['BUILD_SOURCEVERSION'];
|
|
||||||
|
|
||||||
if (!commit) {
|
|
||||||
error('Skipping publish due to missing BUILD_SOURCEVERSION');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const quality = process.argv[2];
|
|
||||||
|
|
||||||
sync(commit, quality).catch(err => {
|
|
||||||
error(err);
|
|
||||||
process.exit(1);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"eventPrefix": "typescript-language-features/",
|
|
||||||
"sourceDirs": [
|
|
||||||
"../../s/extensions/typescript-language-features"
|
|
||||||
],
|
|
||||||
"excludedDirs": [],
|
|
||||||
"applyEndpoints": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"eventPrefix": "git/",
|
|
||||||
"sourceDirs": [
|
|
||||||
"../../s/extensions/git"
|
|
||||||
],
|
|
||||||
"excludedDirs": [],
|
|
||||||
"applyEndpoints": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"eventPrefix": "extension-telemetry/",
|
|
||||||
"sourceDirs": [
|
|
||||||
"vscode-extension-telemetry"
|
|
||||||
],
|
|
||||||
"excludedDirs": [],
|
|
||||||
"applyEndpoints": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"eventPrefix": "vscode-markdown/",
|
|
||||||
"sourceDirs": [
|
|
||||||
"../../s/extensions/markdown-language-features"
|
|
||||||
],
|
|
||||||
"excludedDirs": [],
|
|
||||||
"applyEndpoints": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"eventPrefix": "html-language-features/",
|
|
||||||
"sourceDirs": [
|
|
||||||
"../../s/extensions/html-language-features",
|
|
||||||
"vscode-html-languageservice"
|
|
||||||
],
|
|
||||||
"excludedDirs": [],
|
|
||||||
"applyEndpoints": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"eventPrefix": "json-language-features/",
|
|
||||||
"sourceDirs": [
|
|
||||||
"../../s/extensions/json-language-features",
|
|
||||||
"vscode-json-languageservice"
|
|
||||||
],
|
|
||||||
"excludedDirs": [],
|
|
||||||
"applyEndpoints": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"eventPrefix": "ms-vscode.node2/",
|
|
||||||
"sourceDirs": [
|
|
||||||
"vscode-chrome-debug-core",
|
|
||||||
"vscode-node-debug2"
|
|
||||||
],
|
|
||||||
"excludedDirs": [],
|
|
||||||
"applyEndpoints": true,
|
|
||||||
"patchDebugEvents": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"eventPrefix": "ms-vscode.node/",
|
|
||||||
"sourceDirs": [
|
|
||||||
"vscode-chrome-debug-core",
|
|
||||||
"vscode-node-debug"
|
|
||||||
],
|
|
||||||
"excludedDirs": [],
|
|
||||||
"applyEndpoints": true,
|
|
||||||
"patchDebugEvents": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@@ -1,67 +1,40 @@
|
|||||||
steps:
|
steps:
|
||||||
- task: NodeTool@0
|
- task: NodeTool@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "10.15.1"
|
versionSpec: "8.12.0"
|
||||||
- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
inputs:
|
inputs:
|
||||||
keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
|
versionSpec: "1.10.1"
|
||||||
targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
|
|
||||||
vstsFeed: '$(build-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
|
yarn
|
||||||
displayName: Install Dependencies
|
displayName: Install Dependencies
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: $(GITHUB_TOKEN) # {{SQL CARBON EDIT}} add github token
|
|
||||||
- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
|
|
||||||
inputs:
|
|
||||||
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'
|
|
||||||
vstsFeed: '$(build-cache)' # {{SQL CARBON EDIT}} update build cache
|
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
|
||||||
- script: |
|
- script: |
|
||||||
yarn electron x64
|
yarn gulp 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: |
|
- script: |
|
||||||
yarn gulp tslint
|
yarn monaco-compile-check
|
||||||
displayName: Run TSLint Checks
|
displayName: Run Monaco Editor Checks
|
||||||
- script: | # {{SQL CARBON EDIT}} add step
|
- script: |
|
||||||
yarn strict-null-check
|
yarn strict-null-check
|
||||||
displayName: Run Strict Null Check.
|
displayName: Run Strict Null Checks
|
||||||
- script: | # {{SQL CARBON EDIT}} add step
|
|
||||||
yarn tslint
|
|
||||||
displayName: Run TSLint (gci)
|
|
||||||
# - script: | {{SQL CARBON EDIT}} remove step
|
|
||||||
# yarn monaco-compile-check
|
|
||||||
# displayName: Run Monaco Editor Checks
|
|
||||||
- script: |
|
- script: |
|
||||||
yarn compile
|
yarn compile
|
||||||
displayName: Compile Sources
|
displayName: Compile Sources
|
||||||
# - script: | {{SQL CARBON EDIT}} remove step
|
- script: |
|
||||||
# yarn download-builtin-extensions
|
yarn download-builtin-extensions
|
||||||
# displayName: Download Built-in Extensions
|
displayName: Download Built-in Extensions
|
||||||
- script: |
|
- script: |
|
||||||
./scripts/test.sh --tfs "Unit Tests"
|
./scripts/test.sh --tfs "Unit Tests"
|
||||||
displayName: Run Unit Tests
|
displayName: Run Unit Tests
|
||||||
# - script: | {{SQL CARBON EDIT}} remove step
|
- script: |
|
||||||
# ./scripts/test-integration.sh --tfs "Integration Tests"
|
./scripts/test-integration.sh --tfs "Integration Tests"
|
||||||
# displayName: Run Integration Tests
|
displayName: Run Integration Tests
|
||||||
- task: PublishTestResults@2
|
- task: PublishTestResults@2
|
||||||
displayName: Publish Tests Results
|
displayName: Publish Tests Results
|
||||||
inputs:
|
inputs:
|
||||||
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
|
|
||||||
@@ -1,96 +1,29 @@
|
|||||||
steps:
|
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: 'npm-vscode'
|
|
||||||
platformIndependent: true
|
|
||||||
alias: 'Compilation'
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -e
|
|
||||||
exit 1
|
|
||||||
displayName: Check RestoreCache
|
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
|
||||||
|
|
||||||
- task: NodeTool@0
|
- task: NodeTool@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "10.15.1"
|
versionSpec: "8.12.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:
|
||||||
versionSpec: "1.x"
|
versionSpec: "1.10.1"
|
||||||
|
|
||||||
- task: AzureKeyVault@1
|
|
||||||
displayName: 'Azure Key Vault: Get Secrets'
|
|
||||||
inputs:
|
|
||||||
azureSubscription: 'vscode-builds-subscription'
|
|
||||||
KeyVaultName: vscode
|
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
set -e
|
set -e
|
||||||
|
echo "machine monacotools.visualstudio.com password $(VSO_PAT)" > ~/.netrc
|
||||||
cat << EOF > ~/.netrc
|
yarn
|
||||||
machine github.com
|
yarn gulp -- hygiene
|
||||||
login vscode
|
yarn monaco-compile-check
|
||||||
password $(github-distro-mixin-password)
|
yarn strict-null-check
|
||||||
EOF
|
VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" yarn gulp -- mixin
|
||||||
|
node build/azure-pipelines/common/installDistro.js
|
||||||
git config user.email "vscode@microsoft.com"
|
node build/lib/builtInExtensions.js
|
||||||
git config user.name "VSCode"
|
displayName: Prepare build
|
||||||
displayName: Prepare tooling
|
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
set -e
|
set -e
|
||||||
git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git"
|
VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" \
|
||||||
git fetch distro
|
AZURE_STORAGE_ACCESS_KEY="$(AZURE_STORAGE_ACCESS_KEY)" \
|
||||||
git merge $(node -p "require('./package.json').distro")
|
yarn gulp -- vscode-darwin-min upload-vscode-sourcemaps
|
||||||
displayName: Merge distro
|
|
||||||
|
|
||||||
- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
|
|
||||||
inputs:
|
|
||||||
keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock'
|
|
||||||
targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
|
|
||||||
vstsFeed: 'npm-vscode'
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -e
|
|
||||||
CHILD_CONCURRENCY=1 yarn --frozen-lockfile
|
|
||||||
displayName: Install dependencies
|
|
||||||
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'
|
|
||||||
targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
|
|
||||||
vstsFeed: 'npm-vscode'
|
|
||||||
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
|
|
||||||
VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
|
|
||||||
yarn gulp vscode-darwin-min-ci
|
|
||||||
VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
|
|
||||||
yarn gulp vscode-reh-darwin-min-ci
|
|
||||||
VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
|
|
||||||
yarn gulp vscode-reh-web-darwin-min-ci
|
|
||||||
displayName: Build
|
displayName: Build
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
@@ -99,41 +32,6 @@ steps:
|
|||||||
# APP_NAME="`ls $(agent.builddirectory)/VSCode-darwin | head -n 1`"
|
# APP_NAME="`ls $(agent.builddirectory)/VSCode-darwin | head -n 1`"
|
||||||
# yarn smoketest -- --build "$(agent.builddirectory)/VSCode-darwin/$APP_NAME"
|
# yarn smoketest -- --build "$(agent.builddirectory)/VSCode-darwin/$APP_NAME"
|
||||||
displayName: Run unit tests
|
displayName: Run unit tests
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
# Figure out the full absolute path of the product we just built
|
|
||||||
# including the remote server and configure the integration tests
|
|
||||||
# to run with these builds instead of running out of sources.
|
|
||||||
set -e
|
|
||||||
APP_ROOT=$(agent.builddirectory)/VSCode-darwin
|
|
||||||
APP_NAME="`ls $APP_ROOT | head -n 1`"
|
|
||||||
INTEGRATION_TEST_ELECTRON_PATH="$APP_ROOT/$APP_NAME/Contents/MacOS/Electron" \
|
|
||||||
VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-darwin" \
|
|
||||||
./scripts/test-integration.sh --build --tfs "Integration Tests"
|
|
||||||
displayName: Run integration tests
|
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
|
||||||
|
|
||||||
# Web Smoke Tests disabled due to https://github.com/microsoft/vscode/issues/80308
|
|
||||||
# - script: |
|
|
||||||
# set -e
|
|
||||||
# cd test/smoke
|
|
||||||
# yarn compile
|
|
||||||
# cd -
|
|
||||||
# yarn smoketest --web --headless
|
|
||||||
# continueOnError: true
|
|
||||||
# displayName: Run web smoke tests
|
|
||||||
# condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -e
|
|
||||||
cd test/smoke
|
|
||||||
yarn compile
|
|
||||||
cd -
|
|
||||||
yarn smoketest --web --headless
|
|
||||||
continueOnError: true
|
|
||||||
displayName: Run smoke tests
|
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
set -e
|
set -e
|
||||||
@@ -161,12 +59,31 @@ steps:
|
|||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
set -e
|
set -e
|
||||||
VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
|
|
||||||
AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
|
# remove pkg from archive
|
||||||
AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \
|
zip -d ../VSCode-darwin.zip "*.pkg"
|
||||||
AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \
|
|
||||||
VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \
|
# publish the build
|
||||||
./build/azure-pipelines/darwin/publish.sh
|
PACKAGEJSON=`ls ../VSCode-darwin/*.app/Contents/Resources/app/package.json`
|
||||||
|
VERSION=`node -p "require(\"$PACKAGEJSON\").version"`
|
||||||
|
AZURE_DOCUMENTDB_MASTERKEY="$(AZURE_DOCUMENTDB_MASTERKEY)" \
|
||||||
|
AZURE_STORAGE_ACCESS_KEY_2="$(AZURE_STORAGE_ACCESS_KEY_2)" \
|
||||||
|
MOONCAKE_STORAGE_ACCESS_KEY="$(MOONCAKE_STORAGE_ACCESS_KEY)" \
|
||||||
|
node build/azure-pipelines/common/publish.js \
|
||||||
|
"$(VSCODE_QUALITY)" \
|
||||||
|
darwin \
|
||||||
|
archive \
|
||||||
|
"VSCode-darwin-$(VSCODE_QUALITY).zip" \
|
||||||
|
$VERSION \
|
||||||
|
true \
|
||||||
|
../VSCode-darwin.zip
|
||||||
|
|
||||||
|
# publish hockeyapp symbols
|
||||||
|
node build/azure-pipelines/common/symbols.js "$(VSCODE_MIXIN_PASSWORD)" "$(VSCODE_HOCKEYAPP_TOKEN)" "$(VSCODE_ARCH)" "$(VSCODE_HOCKEYAPP_ID_MACOS)"
|
||||||
|
|
||||||
|
# upload configuration
|
||||||
|
AZURE_STORAGE_ACCESS_KEY="$(AZURE_STORAGE_ACCESS_KEY)" \
|
||||||
|
yarn gulp -- upload-vscode-configuration
|
||||||
displayName: Publish
|
displayName: Publish
|
||||||
|
|
||||||
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
||||||
|
|||||||
@@ -1,36 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# remove pkg from archive
|
|
||||||
zip -d ../VSCode-darwin.zip "*.pkg"
|
|
||||||
|
|
||||||
# publish the build
|
|
||||||
PACKAGEJSON=`ls ../VSCode-darwin/*.app/Contents/Resources/app/package.json`
|
|
||||||
VERSION=`node -p "require(\"$PACKAGEJSON\").version"`
|
|
||||||
node build/azure-pipelines/common/publish.js \
|
|
||||||
"$VSCODE_QUALITY" \
|
|
||||||
darwin \
|
|
||||||
archive \
|
|
||||||
"VSCode-darwin-$VSCODE_QUALITY.zip" \
|
|
||||||
$VERSION \
|
|
||||||
true \
|
|
||||||
../VSCode-darwin.zip
|
|
||||||
|
|
||||||
# package Remote Extension Host
|
|
||||||
pushd .. && mv vscode-reh-darwin vscode-server-darwin && zip -Xry vscode-server-darwin.zip vscode-server-darwin && popd
|
|
||||||
|
|
||||||
# publish Remote Extension Host
|
|
||||||
node build/azure-pipelines/common/publish.js \
|
|
||||||
"$VSCODE_QUALITY" \
|
|
||||||
server-darwin \
|
|
||||||
archive-unsigned \
|
|
||||||
"vscode-server-darwin.zip" \
|
|
||||||
$VERSION \
|
|
||||||
true \
|
|
||||||
../vscode-server-darwin.zip
|
|
||||||
|
|
||||||
# publish hockeyapp symbols
|
|
||||||
node build/azure-pipelines/common/symbols.js "$VSCODE_MIXIN_PASSWORD" "$VSCODE_HOCKEYAPP_TOKEN" x64 "$VSCODE_HOCKEYAPP_ID_MACOS"
|
|
||||||
|
|
||||||
# upload configuration
|
|
||||||
yarn gulp upload-vscode-configuration
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
trigger:
|
|
||||||
branches:
|
|
||||||
include: ['master', 'release/*']
|
|
||||||
pr:
|
|
||||||
branches:
|
|
||||||
include: ['master', 'release/*']
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- task: NodeTool@0
|
|
||||||
inputs:
|
|
||||||
versionSpec: "10.15.1"
|
|
||||||
|
|
||||||
- task: AzureKeyVault@1
|
|
||||||
displayName: 'Azure Key Vault: Get Secrets'
|
|
||||||
inputs:
|
|
||||||
azureSubscription: 'vscode-builds-subscription'
|
|
||||||
KeyVaultName: vscode
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -e
|
|
||||||
|
|
||||||
cat << EOF > ~/.netrc
|
|
||||||
machine github.com
|
|
||||||
login vscode
|
|
||||||
password $(github-distro-mixin-password)
|
|
||||||
EOF
|
|
||||||
|
|
||||||
git config user.email "vscode@microsoft.com"
|
|
||||||
git config user.name "VSCode"
|
|
||||||
|
|
||||||
git remote add distro "https://github.com/$VSCODE_MIXIN_REPO.git"
|
|
||||||
git fetch distro
|
|
||||||
|
|
||||||
# Push master branch into oss/master
|
|
||||||
git push distro origin/master:refs/heads/oss/master
|
|
||||||
|
|
||||||
# Push every release branch into oss/release
|
|
||||||
git for-each-ref --format="%(refname:short)" refs/remotes/origin/release/* | sed 's/^origin\/\(.*\)$/\0:refs\/heads\/oss\/\1/' | xargs git push distro
|
|
||||||
|
|
||||||
git merge $(node -p "require('./package.json').distro")
|
|
||||||
|
|
||||||
displayName: Sync & Merge Distro
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
pool:
|
|
||||||
vmImage: 'Ubuntu-16.04'
|
|
||||||
|
|
||||||
trigger: none
|
|
||||||
pr: none
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- task: NodeTool@0
|
|
||||||
inputs:
|
|
||||||
versionSpec: "10.15.1"
|
|
||||||
|
|
||||||
- task: AzureKeyVault@1
|
|
||||||
displayName: 'Azure Key Vault: Get Secrets'
|
|
||||||
inputs:
|
|
||||||
azureSubscription: 'vscode-builds-subscription'
|
|
||||||
KeyVaultName: vscode
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -e
|
|
||||||
|
|
||||||
cat << EOF > ~/.netrc
|
|
||||||
machine github.com
|
|
||||||
login vscode
|
|
||||||
password $(github-distro-mixin-password)
|
|
||||||
EOF
|
|
||||||
|
|
||||||
git config user.email "vscode@microsoft.com"
|
|
||||||
git config user.name "VSCode"
|
|
||||||
|
|
||||||
git checkout origin/electron-6.0.x
|
|
||||||
git merge origin/master
|
|
||||||
|
|
||||||
# Push master branch into exploration branch
|
|
||||||
git push origin HEAD:electron-6.0.x
|
|
||||||
|
|
||||||
displayName: Sync & Merge Exploration
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
trigger:
|
|
||||||
branches:
|
|
||||||
include: ['master']
|
|
||||||
pr: none
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
- job: ExplorationMerge
|
|
||||||
pool:
|
|
||||||
vmImage: Ubuntu-16.04
|
|
||||||
steps:
|
|
||||||
- task: NodeTool@0
|
|
||||||
inputs:
|
|
||||||
versionSpec: "10.15.1"
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -e
|
|
||||||
|
|
||||||
cat << EOF > ~/.netrc
|
|
||||||
machine mssqltools.visualstudio.com
|
|
||||||
login azuredatastudio
|
|
||||||
password $(DEVOPS_PASSWORD)
|
|
||||||
EOF
|
|
||||||
|
|
||||||
git config user.email "andresse@microsoft.com"
|
|
||||||
git config user.name "AzureDataStudio"
|
|
||||||
|
|
||||||
git remote add explore "$ADS_EXPLORE_REPO"
|
|
||||||
git fetch explore
|
|
||||||
|
|
||||||
git checkout -b merge-branch explore/master
|
|
||||||
|
|
||||||
git merge origin/master
|
|
||||||
|
|
||||||
git push explore HEAD:master
|
|
||||||
|
|
||||||
displayName: Sync & Merge Explore
|
|
||||||
env:
|
|
||||||
ADS_EXPLORE_REPO: $(ADS_EXPLORE_REPO)
|
|
||||||
DEVOPS_PASSWORD: $(DEVOPS_PASSWORD)
|
|
||||||
@@ -2,74 +2,44 @@ steps:
|
|||||||
- script: |
|
- script: |
|
||||||
set -e
|
set -e
|
||||||
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 libgconf-2-4 dbus xvfb libgtk-3-0
|
||||||
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
|
||||||
- task: NodeTool@0
|
- task: NodeTool@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "10.15.1"
|
versionSpec: "8.12.0"
|
||||||
- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
inputs:
|
inputs:
|
||||||
keyfile: '.yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
|
versionSpec: "1.10.1"
|
||||||
targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
|
|
||||||
vstsFeed: '$(build-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
|
yarn
|
||||||
displayName: Install Dependencies
|
displayName: Install Dependencies
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: $(GITHUB_TOKEN) # {{SQL CARBON EDIT}} add github token
|
|
||||||
- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
|
|
||||||
inputs:
|
|
||||||
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'
|
|
||||||
vstsFeed: '$(build-cache)' # {{SQL CARBON EDIT}} update build cache
|
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
|
||||||
- script: |
|
- script: |
|
||||||
yarn electron x64
|
yarn gulp 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: |
|
- script: |
|
||||||
yarn gulp tslint
|
yarn monaco-compile-check
|
||||||
displayName: Run TSLint Checks
|
displayName: Run Monaco Editor Checks
|
||||||
- script: | # {{SQL CARBON EDIT}} add gci checks
|
- script: |
|
||||||
yarn tslint
|
|
||||||
displayName: Run TSLint (gci)
|
|
||||||
- script: | # {{SQL CARBON EDIT}} add strict null check
|
|
||||||
yarn strict-null-check
|
yarn strict-null-check
|
||||||
displayName: Run Strict Null Check
|
displayName: Run Strict Null Checks
|
||||||
# - script: | {{SQL CARBON EDIT}} remove monaco editor checks
|
|
||||||
# yarn monaco-compile-check
|
|
||||||
# displayName: Run Monaco Editor Checks
|
|
||||||
- script: |
|
- script: |
|
||||||
yarn compile
|
yarn compile
|
||||||
displayName: Compile Sources
|
displayName: Compile Sources
|
||||||
# - script: | {{SQL CARBON EDIT}} remove step
|
- script: |
|
||||||
# yarn download-builtin-extensions
|
yarn download-builtin-extensions
|
||||||
# displayName: Download Built-in Extensions
|
displayName: Download Built-in Extensions
|
||||||
- script: |
|
- script: |
|
||||||
DISPLAY=:10 ./scripts/test.sh --tfs "Unit Tests"
|
DISPLAY=:10 ./scripts/test.sh --tfs "Unit Tests"
|
||||||
displayName: Run Unit Tests
|
displayName: Run Unit Tests
|
||||||
# - script: | {{SQL CARBON EDIT}} remove step
|
|
||||||
# DISPLAY=:10 ./scripts/test-integration.sh --tfs "Integration Tests"
|
|
||||||
# displayName: Run Integration Tests
|
|
||||||
- task: PublishTestResults@2
|
- task: PublishTestResults@2
|
||||||
displayName: Publish Tests Results
|
displayName: Publish Tests Results
|
||||||
inputs:
|
inputs:
|
||||||
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
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -e
|
|
||||||
echo 'noop'
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -e
|
|
||||||
echo 'noop'
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -e
|
|
||||||
echo 'noop'
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -e
|
|
||||||
echo 'noop'
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -e
|
|
||||||
echo 'noop'
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -e
|
|
||||||
echo 'noop'
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -e
|
|
||||||
echo 'noop'
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -e
|
|
||||||
echo 'noop'
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -e
|
|
||||||
echo 'noop'
|
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
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: 'npm-vscode'
|
|
||||||
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@2
|
|
||||||
inputs:
|
|
||||||
versionSpec: "1.x"
|
|
||||||
|
|
||||||
- task: AzureKeyVault@1
|
|
||||||
displayName: 'Azure Key Vault: Get Secrets'
|
|
||||||
inputs:
|
|
||||||
azureSubscription: 'vscode-builds-subscription'
|
|
||||||
KeyVaultName: vscode
|
|
||||||
|
|
||||||
- task: Docker@1
|
|
||||||
displayName: 'Pull image'
|
|
||||||
inputs:
|
|
||||||
azureSubscriptionEndpoint: 'vscode-builds-subscription'
|
|
||||||
azureContainerRegistry: vscodehub.azurecr.io
|
|
||||||
command: 'Run an image'
|
|
||||||
imageName: 'vscode-linux-build-agent:$(VSCODE_ARCH)'
|
|
||||||
containerCommand: uname
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -e
|
|
||||||
|
|
||||||
cat << EOF > ~/.netrc
|
|
||||||
machine github.com
|
|
||||||
login vscode
|
|
||||||
password $(github-distro-mixin-password)
|
|
||||||
EOF
|
|
||||||
|
|
||||||
git config user.email "vscode@microsoft.com"
|
|
||||||
git config user.name "VSCode"
|
|
||||||
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'
|
|
||||||
targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
|
|
||||||
vstsFeed: 'npm-vscode'
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -e
|
|
||||||
CHILD_CONCURRENCY=1 yarn --frozen-lockfile
|
|
||||||
displayName: Install dependencies
|
|
||||||
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'
|
|
||||||
targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
|
|
||||||
vstsFeed: 'npm-vscode'
|
|
||||||
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
|
|
||||||
CHILD_CONCURRENCY=1 ./build/azure-pipelines/linux/multiarch/$(VSCODE_ARCH)/prebuild.sh
|
|
||||||
displayName: Prebuild
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -e
|
|
||||||
./build/azure-pipelines/linux/multiarch/$(VSCODE_ARCH)/build.sh
|
|
||||||
displayName: Build
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -e
|
|
||||||
AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
|
|
||||||
AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \
|
|
||||||
VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
|
|
||||||
VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \
|
|
||||||
./build/azure-pipelines/linux/multiarch/$(VSCODE_ARCH)/publish.sh
|
|
||||||
displayName: Publish
|
|
||||||
|
|
||||||
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
|
||||||
displayName: 'Component Detection'
|
|
||||||
continueOnError: true
|
|
||||||
@@ -1,138 +1,112 @@
|
|||||||
steps:
|
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: 'npm-vscode'
|
|
||||||
platformIndependent: true
|
|
||||||
alias: 'Compilation'
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -e
|
|
||||||
exit 1
|
|
||||||
displayName: Check RestoreCache
|
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
|
||||||
|
|
||||||
- task: NodeTool@0
|
- task: NodeTool@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "10.15.1"
|
versionSpec: "8.12.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:
|
||||||
versionSpec: "1.x"
|
versionSpec: "1.10.1"
|
||||||
|
|
||||||
- task: AzureKeyVault@1
|
|
||||||
displayName: 'Azure Key Vault: Get Secrets'
|
|
||||||
inputs:
|
|
||||||
azureSubscription: 'vscode-builds-subscription'
|
|
||||||
KeyVaultName: vscode
|
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
set -e
|
set -e
|
||||||
cat << EOF > ~/.netrc
|
export npm_config_arch="$(VSCODE_ARCH)"
|
||||||
machine github.com
|
if [[ "$(VSCODE_ARCH)" == "ia32" ]]; then
|
||||||
login vscode
|
export PKG_CONFIG_PATH="/usr/lib/i386-linux-gnu/pkgconfig"
|
||||||
password $(github-distro-mixin-password)
|
fi
|
||||||
EOF
|
|
||||||
|
|
||||||
git config user.email "vscode@microsoft.com"
|
echo "machine monacotools.visualstudio.com password $(VSO_PAT)" > ~/.netrc
|
||||||
git config user.name "VSCode"
|
CHILD_CONCURRENCY=1 yarn
|
||||||
displayName: Prepare tooling
|
npm run gulp -- hygiene
|
||||||
|
npm run monaco-compile-check
|
||||||
|
npm run strict-null-check
|
||||||
|
VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- mixin
|
||||||
|
node build/azure-pipelines/common/installDistro.js
|
||||||
|
node build/lib/builtInExtensions.js
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
set -e
|
set -e
|
||||||
git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git"
|
VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- vscode-linux-$(VSCODE_ARCH)-min
|
||||||
git fetch distro
|
name: build
|
||||||
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'
|
|
||||||
targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
|
|
||||||
vstsFeed: 'npm-vscode'
|
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
set -e
|
set -e
|
||||||
CHILD_CONCURRENCY=1 yarn --frozen-lockfile
|
npm run gulp -- "electron-$(VSCODE_ARCH)"
|
||||||
displayName: Install dependencies
|
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
|
||||||
|
|
||||||
- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
|
# xvfb seems to be crashing often, let's make sure it's always up
|
||||||
inputs:
|
|
||||||
keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock'
|
|
||||||
targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
|
|
||||||
vstsFeed: 'npm-vscode'
|
|
||||||
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
|
|
||||||
VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
|
|
||||||
yarn gulp vscode-linux-x64-min-ci
|
|
||||||
VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
|
|
||||||
yarn gulp vscode-reh-linux-x64-min-ci
|
|
||||||
VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
|
|
||||||
yarn gulp vscode-reh-web-linux-x64-min-ci
|
|
||||||
displayName: Build
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -e
|
|
||||||
service xvfb start
|
service xvfb start
|
||||||
displayName: Start xvfb
|
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -e
|
|
||||||
DISPLAY=:10 ./scripts/test.sh --build --tfs "Unit Tests"
|
DISPLAY=:10 ./scripts/test.sh --build --tfs "Unit Tests"
|
||||||
displayName: Run unit tests
|
# yarn smoketest -- --build "$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)"
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
name: test
|
||||||
|
|
||||||
- script: |
|
|
||||||
# Figure out the full absolute path of the product we just built
|
|
||||||
# including the remote server and configure the integration tests
|
|
||||||
# to run with these builds instead of running out of sources.
|
|
||||||
set -e
|
|
||||||
APP_ROOT=$(agent.builddirectory)/VSCode-linux-x64
|
|
||||||
APP_NAME=$(node -p "require(\"$APP_ROOT/resources/app/product.json\").applicationName")
|
|
||||||
INTEGRATION_TEST_ELECTRON_PATH="$APP_ROOT/$APP_NAME" \
|
|
||||||
VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-linux-x64" \
|
|
||||||
DISPLAY=:10 ./scripts/test-integration.sh --build --tfs "Integration Tests"
|
|
||||||
# yarn smoketest -- --build "$(agent.builddirectory)/VSCode-linux-x64"
|
|
||||||
displayName: Run integration tests
|
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
set -e
|
set -e
|
||||||
AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
|
REPO="$(pwd)"
|
||||||
AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \
|
ROOT="$REPO/.."
|
||||||
VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
|
ARCH="$(VSCODE_ARCH)"
|
||||||
VSCODE_HOCKEYAPP_TOKEN="$(vscode-hockeyapp-token)" \
|
|
||||||
./build/azure-pipelines/linux/publish.sh
|
|
||||||
displayName: Publish
|
|
||||||
|
|
||||||
- task: PublishPipelineArtifact@0
|
# Publish tarball
|
||||||
displayName: 'Publish Pipeline Artifact'
|
PLATFORM_LINUX="linux-$(VSCODE_ARCH)"
|
||||||
inputs:
|
[[ "$ARCH" == "ia32" ]] && DEB_ARCH="i386" || DEB_ARCH="amd64"
|
||||||
artifactName: snap-x64
|
[[ "$ARCH" == "ia32" ]] && RPM_ARCH="i386" || RPM_ARCH="x86_64"
|
||||||
targetPath: .build/linux/snap-tarball
|
BUILDNAME="VSCode-$PLATFORM_LINUX"
|
||||||
|
BUILD="$ROOT/$BUILDNAME"
|
||||||
|
BUILD_VERSION="$(date +%s)"
|
||||||
|
[ -z "$VSCODE_QUALITY" ] && TARBALL_FILENAME="code-$BUILD_VERSION.tar.gz" || TARBALL_FILENAME="code-$VSCODE_QUALITY-$BUILD_VERSION.tar.gz"
|
||||||
|
TARBALL_PATH="$ROOT/$TARBALL_FILENAME"
|
||||||
|
PACKAGEJSON="$BUILD/resources/app/package.json"
|
||||||
|
VERSION=$(node -p "require(\"$PACKAGEJSON\").version")
|
||||||
|
|
||||||
|
rm -rf $ROOT/code-*.tar.*
|
||||||
|
(cd $ROOT && tar -czf $TARBALL_PATH $BUILDNAME)
|
||||||
|
|
||||||
|
AZURE_DOCUMENTDB_MASTERKEY="$(AZURE_DOCUMENTDB_MASTERKEY)" \
|
||||||
|
AZURE_STORAGE_ACCESS_KEY_2="$(AZURE_STORAGE_ACCESS_KEY_2)" \
|
||||||
|
MOONCAKE_STORAGE_ACCESS_KEY="$(MOONCAKE_STORAGE_ACCESS_KEY)" \
|
||||||
|
node build/azure-pipelines/common/publish.js "$VSCODE_QUALITY" "$PLATFORM_LINUX" archive-unsigned "$TARBALL_FILENAME" "$VERSION" true "$TARBALL_PATH"
|
||||||
|
|
||||||
|
# Publish hockeyapp symbols
|
||||||
|
node build/azure-pipelines/common/symbols.js "$(VSCODE_MIXIN_PASSWORD)" "$(VSCODE_HOCKEYAPP_TOKEN)" "$(VSCODE_ARCH)" "$(VSCODE_HOCKEYAPP_ID_LINUX64)"
|
||||||
|
|
||||||
|
# Publish DEB
|
||||||
|
npm run gulp -- "vscode-linux-$(VSCODE_ARCH)-build-deb"
|
||||||
|
PLATFORM_DEB="linux-deb-$ARCH"
|
||||||
|
[[ "$ARCH" == "ia32" ]] && DEB_ARCH="i386" || DEB_ARCH="amd64"
|
||||||
|
DEB_FILENAME="$(ls $REPO/.build/linux/deb/$DEB_ARCH/deb/)"
|
||||||
|
DEB_PATH="$REPO/.build/linux/deb/$DEB_ARCH/deb/$DEB_FILENAME"
|
||||||
|
|
||||||
|
AZURE_DOCUMENTDB_MASTERKEY="$(AZURE_DOCUMENTDB_MASTERKEY)" \
|
||||||
|
AZURE_STORAGE_ACCESS_KEY_2="$(AZURE_STORAGE_ACCESS_KEY_2)" \
|
||||||
|
MOONCAKE_STORAGE_ACCESS_KEY="$(MOONCAKE_STORAGE_ACCESS_KEY)" \
|
||||||
|
node build/azure-pipelines/common/publish.js "$VSCODE_QUALITY" "$PLATFORM_DEB" package "$DEB_FILENAME" "$VERSION" true "$DEB_PATH"
|
||||||
|
|
||||||
|
# Publish RPM
|
||||||
|
npm run gulp -- "vscode-linux-$(VSCODE_ARCH)-build-rpm"
|
||||||
|
PLATFORM_RPM="linux-rpm-$ARCH"
|
||||||
|
[[ "$ARCH" == "ia32" ]] && RPM_ARCH="i386" || RPM_ARCH="x86_64"
|
||||||
|
RPM_FILENAME="$(ls $REPO/.build/linux/rpm/$RPM_ARCH/ | grep .rpm)"
|
||||||
|
RPM_PATH="$REPO/.build/linux/rpm/$RPM_ARCH/$RPM_FILENAME"
|
||||||
|
|
||||||
|
AZURE_DOCUMENTDB_MASTERKEY="$(AZURE_DOCUMENTDB_MASTERKEY)" \
|
||||||
|
AZURE_STORAGE_ACCESS_KEY_2="$(AZURE_STORAGE_ACCESS_KEY_2)" \
|
||||||
|
MOONCAKE_STORAGE_ACCESS_KEY="$(MOONCAKE_STORAGE_ACCESS_KEY)" \
|
||||||
|
node build/azure-pipelines/common/publish.js "$VSCODE_QUALITY" "$PLATFORM_RPM" package "$RPM_FILENAME" "$VERSION" true "$RPM_PATH"
|
||||||
|
|
||||||
|
# Publish Snap
|
||||||
|
npm run gulp -- "vscode-linux-$(VSCODE_ARCH)-prepare-snap"
|
||||||
|
|
||||||
|
# Pack snap tarball artifact, in order to preserve file perms
|
||||||
|
mkdir -p $REPO/.build/linux/snap-tarball
|
||||||
|
SNAP_TARBALL_PATH="$REPO/.build/linux/snap-tarball/snap-$(VSCODE_ARCH).tar.gz"
|
||||||
|
rm -rf $SNAP_TARBALL_PATH
|
||||||
|
(cd .build/linux && tar -czf $SNAP_TARBALL_PATH snap)
|
||||||
|
|
||||||
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
||||||
displayName: 'Component Detection'
|
displayName: 'Component Detection'
|
||||||
continueOnError: true
|
continueOnError: true
|
||||||
|
|
||||||
|
- task: PublishPipelineArtifact@0
|
||||||
|
displayName: 'Publish Pipeline Artifact'
|
||||||
|
inputs:
|
||||||
|
artifactName: snap-$(VSCODE_ARCH)
|
||||||
|
targetPath: .build/linux/snap-tarball
|
||||||
|
|||||||
@@ -1,60 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -e
|
|
||||||
REPO="$(pwd)"
|
|
||||||
ROOT="$REPO/.."
|
|
||||||
|
|
||||||
# Publish tarball
|
|
||||||
PLATFORM_LINUX="linux-x64"
|
|
||||||
BUILDNAME="VSCode-$PLATFORM_LINUX"
|
|
||||||
BUILD="$ROOT/$BUILDNAME"
|
|
||||||
BUILD_VERSION="$(date +%s)"
|
|
||||||
[ -z "$VSCODE_QUALITY" ] && TARBALL_FILENAME="code-$BUILD_VERSION.tar.gz" || TARBALL_FILENAME="code-$VSCODE_QUALITY-$BUILD_VERSION.tar.gz"
|
|
||||||
TARBALL_PATH="$ROOT/$TARBALL_FILENAME"
|
|
||||||
PACKAGEJSON="$BUILD/resources/app/package.json"
|
|
||||||
VERSION=$(node -p "require(\"$PACKAGEJSON\").version")
|
|
||||||
|
|
||||||
rm -rf $ROOT/code-*.tar.*
|
|
||||||
(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"
|
|
||||||
|
|
||||||
# Publish Remote Extension Host
|
|
||||||
LEGACY_SERVER_BUILD_NAME="vscode-reh-$PLATFORM_LINUX"
|
|
||||||
SERVER_BUILD_NAME="vscode-server-$PLATFORM_LINUX"
|
|
||||||
SERVER_TARBALL_FILENAME="vscode-server-$PLATFORM_LINUX.tar.gz"
|
|
||||||
SERVER_TARBALL_PATH="$ROOT/$SERVER_TARBALL_FILENAME"
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
node build/azure-pipelines/common/publish.js "$VSCODE_QUALITY" "server-$PLATFORM_LINUX" archive-unsigned "$SERVER_TARBALL_FILENAME" "$VERSION" true "$SERVER_TARBALL_PATH"
|
|
||||||
|
|
||||||
# Publish hockeyapp symbols
|
|
||||||
node build/azure-pipelines/common/symbols.js "$VSCODE_MIXIN_PASSWORD" "$VSCODE_HOCKEYAPP_TOKEN" "x64" "$VSCODE_HOCKEYAPP_ID_LINUX64"
|
|
||||||
|
|
||||||
# Publish DEB
|
|
||||||
yarn gulp "vscode-linux-x64-build-deb"
|
|
||||||
PLATFORM_DEB="linux-deb-x64"
|
|
||||||
DEB_ARCH="amd64"
|
|
||||||
DEB_FILENAME="$(ls $REPO/.build/linux/deb/$DEB_ARCH/deb/)"
|
|
||||||
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"
|
|
||||||
|
|
||||||
# Publish RPM
|
|
||||||
yarn gulp "vscode-linux-x64-build-rpm"
|
|
||||||
PLATFORM_RPM="linux-rpm-x64"
|
|
||||||
RPM_ARCH="x86_64"
|
|
||||||
RPM_FILENAME="$(ls $REPO/.build/linux/rpm/$RPM_ARCH/ | grep .rpm)"
|
|
||||||
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"
|
|
||||||
|
|
||||||
# Publish Snap
|
|
||||||
yarn gulp "vscode-linux-x64-prepare-snap"
|
|
||||||
|
|
||||||
# Pack snap tarball artifact, in order to preserve file perms
|
|
||||||
mkdir -p $REPO/.build/linux/snap-tarball
|
|
||||||
SNAP_TARBALL_PATH="$REPO/.build/linux/snap-tarball/snap-x64.tar.gz"
|
|
||||||
rm -rf $SNAP_TARBALL_PATH
|
|
||||||
(cd .build/linux && tar -czf $SNAP_TARBALL_PATH snap)
|
|
||||||
@@ -1,43 +1,30 @@
|
|||||||
steps:
|
steps:
|
||||||
- task: NodeTool@0
|
- task: NodeTool@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "10.15.1"
|
versionSpec: "8.12.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:
|
||||||
versionSpec: "1.x"
|
versionSpec: "1.10.1"
|
||||||
|
|
||||||
- task: AzureKeyVault@1
|
|
||||||
displayName: 'Azure Key Vault: Get Secrets'
|
|
||||||
inputs:
|
|
||||||
azureSubscription: 'vscode-builds-subscription'
|
|
||||||
KeyVaultName: vscode
|
|
||||||
|
|
||||||
- task: DownloadPipelineArtifact@0
|
- task: DownloadPipelineArtifact@0
|
||||||
displayName: 'Download Pipeline Artifact'
|
displayName: 'Download Pipeline Artifact'
|
||||||
inputs:
|
inputs:
|
||||||
artifactName: snap-x64
|
artifactName: snap-$(VSCODE_ARCH)
|
||||||
targetPath: .build/linux/snap-tarball
|
targetPath: .build/linux/snap-tarball
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
# Get snapcraft version
|
|
||||||
snapcraft --version
|
|
||||||
|
|
||||||
# Make sure we get latest packages
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get upgrade -y
|
|
||||||
|
|
||||||
# Define variables
|
|
||||||
REPO="$(pwd)"
|
REPO="$(pwd)"
|
||||||
SNAP_ROOT="$REPO/.build/linux/snap/x64"
|
ARCH="$(VSCODE_ARCH)"
|
||||||
|
SNAP_ROOT="$REPO/.build/linux/snap/$ARCH"
|
||||||
|
|
||||||
# Install build dependencies
|
# Install build dependencies
|
||||||
(cd build && yarn)
|
(cd build && yarn)
|
||||||
|
|
||||||
# Unpack snap tarball artifact, in order to preserve file perms
|
# Unpack snap tarball artifact, in order to preserve file perms
|
||||||
SNAP_TARBALL_PATH="$REPO/.build/linux/snap-tarball/snap-x64.tar.gz"
|
SNAP_TARBALL_PATH="$REPO/.build/linux/snap-tarball/snap-$ARCH.tar.gz"
|
||||||
(cd .build/linux && tar -xzf $SNAP_TARBALL_PATH)
|
(cd .build/linux && tar -xzf $SNAP_TARBALL_PATH)
|
||||||
|
|
||||||
# Create snap package
|
# Create snap package
|
||||||
@@ -46,9 +33,10 @@ steps:
|
|||||||
PACKAGEJSON="$(ls $SNAP_ROOT/code*/usr/share/code*/resources/app/package.json)"
|
PACKAGEJSON="$(ls $SNAP_ROOT/code*/usr/share/code*/resources/app/package.json)"
|
||||||
VERSION=$(node -p "require(\"$PACKAGEJSON\").version")
|
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-* && snapcraft snap --output "$SNAP_PATH")
|
||||||
|
|
||||||
# Publish snap package
|
# Publish snap package
|
||||||
AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
|
AZURE_DOCUMENTDB_MASTERKEY="$(AZURE_DOCUMENTDB_MASTERKEY)" \
|
||||||
AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \
|
AZURE_STORAGE_ACCESS_KEY_2="$(AZURE_STORAGE_ACCESS_KEY_2)" \
|
||||||
node build/azure-pipelines/common/publish.js "$VSCODE_QUALITY" "linux-snap-x64" package "$SNAP_FILENAME" "$VERSION" true "$SNAP_PATH"
|
MOONCAKE_STORAGE_ACCESS_KEY="$(MOONCAKE_STORAGE_ACCESS_KEY)" \
|
||||||
|
node build/azure-pipelines/common/publish.js "$VSCODE_QUALITY" "linux-snap-$ARCH" package "$SNAP_FILENAME" "$VERSION" true "$SNAP_PATH"
|
||||||
@@ -1,41 +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 json = require('gulp-json-editor');
|
|
||||||
const buffer = require('gulp-buffer');
|
|
||||||
const filter = require('gulp-filter');
|
|
||||||
const es = require('event-stream');
|
|
||||||
const vfs = require('vinyl-fs');
|
|
||||||
const fancyLog = require('fancy-log');
|
|
||||||
const ansiColors = require('ansi-colors');
|
|
||||||
|
|
||||||
function main() {
|
|
||||||
const quality = process.env['VSCODE_QUALITY'];
|
|
||||||
|
|
||||||
if (!quality) {
|
|
||||||
console.log('Missing VSCODE_QUALITY, skipping mixin');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const productJsonFilter = filter('product.json', { restore: true });
|
|
||||||
|
|
||||||
fancyLog(ansiColors.blue('[mixin]'), `Mixing in sources:`);
|
|
||||||
return vfs
|
|
||||||
.src(`quality/${quality}/**`, { base: `quality/${quality}` })
|
|
||||||
.pipe(filter(f => !f.isDirectory()))
|
|
||||||
.pipe(productJsonFilter)
|
|
||||||
.pipe(buffer())
|
|
||||||
.pipe(json(o => Object.assign({}, require('../product.json'), o)))
|
|
||||||
.pipe(productJsonFilter.restore)
|
|
||||||
.pipe(es.mapSync(function (f) {
|
|
||||||
fancyLog(ansiColors.blue('[mixin]'), f.relative, ansiColors.green('✔︎'));
|
|
||||||
return f;
|
|
||||||
}))
|
|
||||||
.pipe(vfs.dest('.'));
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
@@ -1,150 +1,65 @@
|
|||||||
resources:
|
resources:
|
||||||
containers:
|
containers:
|
||||||
- container: vscode-x64
|
- container: vscode-x64
|
||||||
image: vscodehub.azurecr.io/vscode-linux-build-agent:x64
|
image: joaomoreno/vscode-linux-build-agent:x64
|
||||||
endpoint: VSCodeHub
|
- container: vscode-ia32
|
||||||
|
image: joaomoreno/vscode-linux-build-agent:ia32
|
||||||
- container: snapcraft
|
- container: snapcraft
|
||||||
image: snapcore/snapcraft:stable
|
image: snapcore/snapcraft
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
- job: Compile
|
|
||||||
pool:
|
|
||||||
vmImage: 'Ubuntu-16.04'
|
|
||||||
container: vscode-x64
|
|
||||||
steps:
|
|
||||||
- template: product-compile.yml
|
|
||||||
|
|
||||||
- job: Windows
|
- job: Windows
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_WIN32'], 'true'))
|
condition: eq(variables['VSCODE_BUILD_WIN32'], 'true')
|
||||||
pool:
|
pool:
|
||||||
vmImage: VS2017-Win2016
|
vmImage: VS2017-Win2016
|
||||||
variables:
|
variables:
|
||||||
VSCODE_ARCH: x64
|
VSCODE_ARCH: x64
|
||||||
dependsOn:
|
|
||||||
- Compile
|
|
||||||
steps:
|
steps:
|
||||||
- template: win32/product-build-win32.yml
|
- template: win32/product-build-win32.yml
|
||||||
|
|
||||||
- job: Windows32
|
- job: Windows32
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true'))
|
condition: eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true')
|
||||||
pool:
|
pool:
|
||||||
vmImage: VS2017-Win2016
|
vmImage: VS2017-Win2016
|
||||||
variables:
|
variables:
|
||||||
VSCODE_ARCH: ia32
|
VSCODE_ARCH: ia32
|
||||||
dependsOn:
|
|
||||||
- Compile
|
|
||||||
steps:
|
steps:
|
||||||
- template: win32/product-build-win32.yml
|
- template: win32/product-build-win32.yml
|
||||||
|
|
||||||
- job: Linux
|
- job: Linux
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX'], 'true'))
|
condition: eq(variables['VSCODE_BUILD_LINUX'], 'true')
|
||||||
pool:
|
pool:
|
||||||
vmImage: 'Ubuntu-16.04'
|
vmImage: 'Ubuntu-16.04'
|
||||||
|
variables:
|
||||||
|
VSCODE_ARCH: x64
|
||||||
container: vscode-x64
|
container: vscode-x64
|
||||||
dependsOn:
|
|
||||||
- Compile
|
|
||||||
steps:
|
steps:
|
||||||
- template: linux/product-build-linux.yml
|
- template: linux/product-build-linux.yml
|
||||||
|
|
||||||
- job: LinuxSnap
|
- job: LinuxSnap
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX'], 'true'))
|
condition: eq(variables['VSCODE_BUILD_LINUX'], 'true')
|
||||||
pool:
|
pool:
|
||||||
vmImage: 'Ubuntu-16.04'
|
vmImage: 'Ubuntu-16.04'
|
||||||
|
variables:
|
||||||
|
VSCODE_ARCH: x64
|
||||||
container: snapcraft
|
container: snapcraft
|
||||||
dependsOn: Linux
|
dependsOn: Linux
|
||||||
steps:
|
steps:
|
||||||
- template: linux/snap-build-linux.yml
|
- template: linux/snap-build-linux.yml
|
||||||
|
|
||||||
- job: LinuxArmhf
|
- job: Linux32
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'))
|
condition: eq(variables['VSCODE_BUILD_LINUX_32BIT'], 'true')
|
||||||
pool:
|
pool:
|
||||||
vmImage: 'Ubuntu-16.04'
|
vmImage: 'Ubuntu-16.04'
|
||||||
variables:
|
variables:
|
||||||
VSCODE_ARCH: armhf
|
VSCODE_ARCH: ia32
|
||||||
dependsOn:
|
container: vscode-ia32
|
||||||
- Compile
|
|
||||||
steps:
|
steps:
|
||||||
- template: linux/product-build-linux-multiarch.yml
|
- template: linux/product-build-linux.yml
|
||||||
|
|
||||||
- job: LinuxArm64
|
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX_ARM64'], 'true'), ne(variables['VSCODE_QUALITY'], 'stable'))
|
|
||||||
pool:
|
|
||||||
vmImage: 'Ubuntu-16.04'
|
|
||||||
variables:
|
|
||||||
VSCODE_ARCH: arm64
|
|
||||||
dependsOn:
|
|
||||||
- Compile
|
|
||||||
steps:
|
|
||||||
- template: linux/product-build-linux-multiarch.yml
|
|
||||||
|
|
||||||
- job: LinuxAlpine
|
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'))
|
|
||||||
pool:
|
|
||||||
vmImage: 'Ubuntu-16.04'
|
|
||||||
variables:
|
|
||||||
VSCODE_ARCH: alpine
|
|
||||||
dependsOn:
|
|
||||||
- Compile
|
|
||||||
steps:
|
|
||||||
- template: linux/product-build-linux-multiarch.yml
|
|
||||||
|
|
||||||
- job: LinuxWeb
|
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_WEB'], 'true'))
|
|
||||||
pool:
|
|
||||||
vmImage: 'Ubuntu-16.04'
|
|
||||||
variables:
|
|
||||||
VSCODE_ARCH: x64
|
|
||||||
dependsOn:
|
|
||||||
- Compile
|
|
||||||
steps:
|
|
||||||
- template: web/product-build-web.yml
|
|
||||||
|
|
||||||
- job: macOS
|
- job: macOS
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), eq(variables['VSCODE_BUILD_MACOS'], 'true'))
|
condition: eq(variables['VSCODE_BUILD_MACOS'], 'true')
|
||||||
pool:
|
pool:
|
||||||
vmImage: macOS 10.13
|
vmImage: macOS 10.13
|
||||||
dependsOn:
|
|
||||||
- Compile
|
|
||||||
steps:
|
steps:
|
||||||
- template: darwin/product-build-darwin.yml
|
- template: darwin/product-build-darwin.yml
|
||||||
|
|
||||||
- job: Release
|
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), or(eq(variables['VSCODE_RELEASE'], 'true'), and(or(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['VSCODE_QUALITY'], 'exploration')), eq(variables['Build.Reason'], 'Schedule'))))
|
|
||||||
pool:
|
|
||||||
vmImage: 'Ubuntu-16.04'
|
|
||||||
dependsOn:
|
|
||||||
- Windows
|
|
||||||
- Windows32
|
|
||||||
- Linux
|
|
||||||
- LinuxSnap
|
|
||||||
- LinuxArmhf
|
|
||||||
- LinuxAlpine
|
|
||||||
- macOS
|
|
||||||
steps:
|
|
||||||
- template: release.yml
|
|
||||||
|
|
||||||
- job: Mooncake
|
|
||||||
pool:
|
|
||||||
vmImage: 'Ubuntu-16.04'
|
|
||||||
condition: and(succeededOrFailed(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'))
|
|
||||||
dependsOn:
|
|
||||||
- Windows
|
|
||||||
- Windows32
|
|
||||||
- Linux
|
|
||||||
- LinuxSnap
|
|
||||||
- LinuxArmhf
|
|
||||||
- LinuxAlpine
|
|
||||||
- LinuxWeb
|
|
||||||
- macOS
|
|
||||||
steps:
|
|
||||||
- template: sync-mooncake.yml
|
|
||||||
|
|
||||||
trigger: none
|
|
||||||
pr: none
|
|
||||||
|
|
||||||
schedules:
|
|
||||||
- cron: "0 5 * * Mon-Fri"
|
|
||||||
displayName: Mon-Fri at 7:00
|
|
||||||
branches:
|
|
||||||
include:
|
|
||||||
- master
|
|
||||||
@@ -1,133 +0,0 @@
|
|||||||
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: 'npm-vscode'
|
|
||||||
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@2
|
|
||||||
inputs:
|
|
||||||
versionSpec: "1.x"
|
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
|
||||||
|
|
||||||
- task: AzureKeyVault@1
|
|
||||||
displayName: 'Azure Key Vault: Get Secrets'
|
|
||||||
inputs:
|
|
||||||
azureSubscription: 'vscode-builds-subscription'
|
|
||||||
KeyVaultName: vscode
|
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -e
|
|
||||||
cat << EOF > ~/.netrc
|
|
||||||
machine github.com
|
|
||||||
login vscode
|
|
||||||
password $(github-distro-mixin-password)
|
|
||||||
EOF
|
|
||||||
|
|
||||||
git config user.email "vscode@microsoft.com"
|
|
||||||
git config user.name "VSCode"
|
|
||||||
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'
|
|
||||||
targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
|
|
||||||
vstsFeed: 'npm-vscode'
|
|
||||||
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'
|
|
||||||
targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
|
|
||||||
vstsFeed: 'npm-vscode'
|
|
||||||
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 --skip-tslint
|
|
||||||
yarn gulp tslint
|
|
||||||
yarn monaco-compile-check
|
|
||||||
displayName: Run hygiene, tslint and monaco compile checks
|
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -
|
|
||||||
./build/azure-pipelines/common/extract-telemetry.sh
|
|
||||||
displayName: Extract Telemetry
|
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -e
|
|
||||||
AZURE_WEBVIEW_STORAGE_ACCESS_KEY="$(vscode-webview-storage-key)" \
|
|
||||||
./build/azure-pipelines/common/publish-webview.sh
|
|
||||||
displayName: Publish Webview
|
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
|
||||||
|
|
||||||
- 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'))
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -e
|
|
||||||
AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \
|
|
||||||
node build/azure-pipelines/upload-sourcemaps
|
|
||||||
displayName: Upload sourcemaps
|
|
||||||
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: 'npm-vscode'
|
|
||||||
platformIndependent: true
|
|
||||||
alias: 'Compilation'
|
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
node_modules/
|
|
||||||
*.js
|
|
||||||
@@ -1,43 +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';
|
|
||||||
|
|
||||||
import * as cp from 'child_process';
|
|
||||||
|
|
||||||
let tag = '';
|
|
||||||
try {
|
|
||||||
tag = cp
|
|
||||||
.execSync('git describe --tags `git rev-list --tags --max-count=1`')
|
|
||||||
.toString()
|
|
||||||
.trim();
|
|
||||||
|
|
||||||
if (!isValidTag(tag)) {
|
|
||||||
throw Error(`Invalid tag ${tag}`);
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
console.error(err);
|
|
||||||
console.error('Failed to update types');
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
function isValidTag(t: string) {
|
|
||||||
if (t.split('.').length !== 3) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const [major, minor, bug] = t.split('.');
|
|
||||||
|
|
||||||
// Only release for tags like 1.34.0
|
|
||||||
if (bug !== '0') {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (parseInt(major, 10) === NaN || parseInt(minor, 10) === NaN) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
# Publish @types/vscode for each release
|
|
||||||
|
|
||||||
trigger:
|
|
||||||
branches:
|
|
||||||
include: ['refs/tags/*']
|
|
||||||
|
|
||||||
pr: none
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- task: NodeTool@0
|
|
||||||
inputs:
|
|
||||||
versionSpec: "10.15.1"
|
|
||||||
|
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
|
||||||
inputs:
|
|
||||||
versionSpec: "1.x"
|
|
||||||
|
|
||||||
- bash: |
|
|
||||||
TAG_VERSION=$(git describe --tags `git rev-list --tags --max-count=1`)
|
|
||||||
CHANNEL="G1C14HJ2F"
|
|
||||||
|
|
||||||
if [ "$TAG_VERSION" == "1.999.0" ]; then
|
|
||||||
MESSAGE="<!here>. Someone pushed 1.999.0 tag. Please delete it ASAP from remote and local."
|
|
||||||
|
|
||||||
curl -X POST -H "Authorization: Bearer $(SLACK_TOKEN)" \
|
|
||||||
-H 'Content-type: application/json; charset=utf-8' \
|
|
||||||
--data '{"channel":"'"$CHANNEL"'", "link_names": true, "text":"'"$MESSAGE"'"}' \
|
|
||||||
https://slack.com/api/chat.postMessage
|
|
||||||
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
displayName: Check 1.999.0 tag
|
|
||||||
|
|
||||||
- bash: |
|
|
||||||
# Install build dependencies
|
|
||||||
(cd build && yarn)
|
|
||||||
node build/azure-pipelines/publish-types/check-version.js
|
|
||||||
displayName: Check version
|
|
||||||
|
|
||||||
- bash: |
|
|
||||||
git config --global user.email "vscode@microsoft.com"
|
|
||||||
git config --global user.name "VSCode"
|
|
||||||
|
|
||||||
git clone https://$(GITHUB_TOKEN)@github.com/DefinitelyTyped/DefinitelyTyped.git --depth=1
|
|
||||||
node build/azure-pipelines/publish-types/update-types.js
|
|
||||||
|
|
||||||
TAG_VERSION=$(git describe --tags `git rev-list --tags --max-count=1`)
|
|
||||||
|
|
||||||
cd DefinitelyTyped
|
|
||||||
|
|
||||||
git diff --color | cat
|
|
||||||
git add -A
|
|
||||||
git status
|
|
||||||
git checkout -b "vscode-types-$TAG_VERSION"
|
|
||||||
git commit -m "VS Code $TAG_VERSION Extension API"
|
|
||||||
git push origin "vscode-types-$TAG_VERSION"
|
|
||||||
|
|
||||||
displayName: Push update to DefinitelyTyped
|
|
||||||
|
|
||||||
- bash: |
|
|
||||||
TAG_VERSION=$(git describe --tags `git rev-list --tags --max-count=1`)
|
|
||||||
CHANNEL="G1C14HJ2F"
|
|
||||||
|
|
||||||
MESSAGE="DefinitelyTyped/DefinitelyTyped#vscode-types-$TAG_VERSION created. Endgame master, please open this link, examine changes and create a PR:"
|
|
||||||
LINK="https://github.com/DefinitelyTyped/DefinitelyTyped/compare/vscode-types-$TAG_VERSION?quick_pull=1&body=Updating%20VS%20Code%20Extension%20API.%20See%20https%3A%2F%2Fgithub.com%2Fmicrosoft%2Fvscode%2Fissues%2F70175%20for%20details."
|
|
||||||
MESSAGE2="[@octref, @jrieken, @kmaetzel, @egamma]. Please review and merge PR to publish @types/vscode."
|
|
||||||
|
|
||||||
curl -X POST -H "Authorization: Bearer $(SLACK_TOKEN)" \
|
|
||||||
-H 'Content-type: application/json; charset=utf-8' \
|
|
||||||
--data '{"channel":"'"$CHANNEL"'", "link_names": true, "text":"'"$MESSAGE"'"}' \
|
|
||||||
https://slack.com/api/chat.postMessage
|
|
||||||
|
|
||||||
curl -X POST -H "Authorization: Bearer $(SLACK_TOKEN)" \
|
|
||||||
-H 'Content-type: application/json; charset=utf-8' \
|
|
||||||
--data '{"channel":"'"$CHANNEL"'", "link_names": true, "text":"'"$LINK"'"}' \
|
|
||||||
https://slack.com/api/chat.postMessage
|
|
||||||
|
|
||||||
curl -X POST -H "Authorization: Bearer $(SLACK_TOKEN)" \
|
|
||||||
-H 'Content-type: application/json; charset=utf-8' \
|
|
||||||
--data '{"channel":"'"$CHANNEL"'", "link_names": true, "text":"'"$MESSAGE2"'"}' \
|
|
||||||
https://slack.com/api/chat.postMessage
|
|
||||||
|
|
||||||
displayName: Send message on Slack
|
|
||||||
@@ -1,73 +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';
|
|
||||||
|
|
||||||
import * as fs from 'fs';
|
|
||||||
import * as cp from 'child_process';
|
|
||||||
import * as path from 'path';
|
|
||||||
|
|
||||||
let tag = '';
|
|
||||||
try {
|
|
||||||
tag = cp
|
|
||||||
.execSync('git describe --tags `git rev-list --tags --max-count=1`')
|
|
||||||
.toString()
|
|
||||||
.trim();
|
|
||||||
|
|
||||||
const dtsUri = `https://raw.githubusercontent.com/microsoft/vscode/${tag}/src/vs/vscode.d.ts`;
|
|
||||||
const outPath = path.resolve(process.cwd(), 'DefinitelyTyped/types/vscode/index.d.ts');
|
|
||||||
cp.execSync(`curl ${dtsUri} --output ${outPath}`);
|
|
||||||
|
|
||||||
updateDTSFile(outPath, tag);
|
|
||||||
|
|
||||||
console.log(`Done updating vscode.d.ts at ${outPath}`);
|
|
||||||
} catch (err) {
|
|
||||||
console.error(err);
|
|
||||||
console.error('Failed to update types');
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateDTSFile(outPath: string, tag: string) {
|
|
||||||
const oldContent = fs.readFileSync(outPath, 'utf-8');
|
|
||||||
const newContent = getNewFileContent(oldContent, tag);
|
|
||||||
|
|
||||||
fs.writeFileSync(outPath, newContent);
|
|
||||||
}
|
|
||||||
|
|
||||||
function getNewFileContent(content: string, tag: string) {
|
|
||||||
const oldheader = [
|
|
||||||
`/*---------------------------------------------------------------------------------------------`,
|
|
||||||
` * Copyright (c) Microsoft Corporation. All rights reserved.`,
|
|
||||||
` * Licensed under the Source EULA. See License.txt in the project root for license information.`,
|
|
||||||
` *--------------------------------------------------------------------------------------------*/`
|
|
||||||
].join('\n');
|
|
||||||
|
|
||||||
return getNewFileHeader(tag) + content.slice(oldheader.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
function getNewFileHeader(tag: string) {
|
|
||||||
const [major, minor] = tag.split('.');
|
|
||||||
const shorttag = `${major}.${minor}`;
|
|
||||||
|
|
||||||
const header = [
|
|
||||||
`// Type definitions for Visual Studio Code ${shorttag}`,
|
|
||||||
`// Project: https://github.com/microsoft/vscode`,
|
|
||||||
`// Definitions by: Visual Studio Code Team, Microsoft <https://github.com/Microsoft>`,
|
|
||||||
`// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped`,
|
|
||||||
``,
|
|
||||||
`/*---------------------------------------------------------------------------------------------`,
|
|
||||||
` * Copyright (c) Microsoft Corporation. All rights reserved.`,
|
|
||||||
` * Licensed under the Source EULA.`,
|
|
||||||
` * See https://github.com/Microsoft/vscode/blob/master/LICENSE.txt for license information.`,
|
|
||||||
` *--------------------------------------------------------------------------------------------*/`,
|
|
||||||
``,
|
|
||||||
`/**`,
|
|
||||||
` * Type Definition for Visual Studio Code ${shorttag} Extension API`,
|
|
||||||
` * See https://code.visualstudio.com/api for more information`,
|
|
||||||
` */`
|
|
||||||
].join('\n');
|
|
||||||
|
|
||||||
return header;
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
steps:
|
|
||||||
- task: NodeTool@0
|
|
||||||
inputs:
|
|
||||||
versionSpec: "10.x"
|
|
||||||
|
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
|
||||||
inputs:
|
|
||||||
versionSpec: "1.x"
|
|
||||||
|
|
||||||
- task: AzureKeyVault@1
|
|
||||||
displayName: 'Azure Key Vault: Get Secrets'
|
|
||||||
inputs:
|
|
||||||
azureSubscription: 'vscode-builds-subscription'
|
|
||||||
KeyVaultName: vscode
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -e
|
|
||||||
|
|
||||||
(cd build ; yarn)
|
|
||||||
|
|
||||||
AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
|
|
||||||
node build/azure-pipelines/common/release.js
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
steps:
|
|
||||||
- task: NodeTool@0
|
|
||||||
inputs:
|
|
||||||
versionSpec: "10.15.1"
|
|
||||||
|
|
||||||
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
|
||||||
inputs:
|
|
||||||
versionSpec: "1.x"
|
|
||||||
|
|
||||||
- task: AzureKeyVault@1
|
|
||||||
displayName: 'Azure Key Vault: Get Secrets'
|
|
||||||
inputs:
|
|
||||||
azureSubscription: 'vscode-builds-subscription'
|
|
||||||
KeyVaultName: vscode
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -e
|
|
||||||
|
|
||||||
(cd build ; yarn)
|
|
||||||
|
|
||||||
AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
|
|
||||||
AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \
|
|
||||||
MOONCAKE_STORAGE_ACCESS_KEY="$(vscode-mooncake-storage-key)" \
|
|
||||||
node build/azure-pipelines/common/sync-mooncake.js "$VSCODE_QUALITY"
|
|
||||||
@@ -1,57 +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 path = require('path');
|
|
||||||
const es = require('event-stream');
|
|
||||||
const azure = require('gulp-azure-storage');
|
|
||||||
const vfs = require('vinyl-fs');
|
|
||||||
const util = require('../lib/util');
|
|
||||||
const root = path.dirname(path.dirname(__dirname));
|
|
||||||
const commit = util.getVersion(root);
|
|
||||||
|
|
||||||
// optionally allow to pass in explicit base/maps to upload
|
|
||||||
const [, , base, maps] = process.argv;
|
|
||||||
|
|
||||||
const fetch = function (base, maps = `${base}/**/*.map`) {
|
|
||||||
return vfs.src(maps, { base })
|
|
||||||
.pipe(es.mapSync(f => {
|
|
||||||
f.path = `${f.base}/core/${f.relative}`;
|
|
||||||
return f;
|
|
||||||
}));
|
|
||||||
};
|
|
||||||
|
|
||||||
function main() {
|
|
||||||
const sources = [];
|
|
||||||
|
|
||||||
// vscode client maps (default)
|
|
||||||
if (!base) {
|
|
||||||
const vs = fetch('out-vscode-min'); // client source-maps only
|
|
||||||
sources.push(vs);
|
|
||||||
|
|
||||||
const extensionsOut = vfs.src(['.build/extensions/**/*.js.map', '!**/node_modules/**'], { base: '.build' });
|
|
||||||
sources.push(extensionsOut);
|
|
||||||
}
|
|
||||||
|
|
||||||
// specific client base/maps
|
|
||||||
else {
|
|
||||||
sources.push(fetch(base, maps));
|
|
||||||
}
|
|
||||||
|
|
||||||
return es.merge(...sources)
|
|
||||||
.pipe(es.through(function (data) {
|
|
||||||
console.log('Uploading Sourcemap', data.relative); // debug
|
|
||||||
this.emit('data', data);
|
|
||||||
}))
|
|
||||||
.pipe(azure.upload({
|
|
||||||
account: process.env.AZURE_STORAGE_ACCOUNT,
|
|
||||||
key: process.env.AZURE_STORAGE_ACCESS_KEY,
|
|
||||||
container: 'sourcemaps',
|
|
||||||
prefix: commit + '/'
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
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: 'npm-vscode'
|
|
||||||
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@2
|
|
||||||
inputs:
|
|
||||||
versionSpec: "1.x"
|
|
||||||
|
|
||||||
- task: AzureKeyVault@1
|
|
||||||
displayName: 'Azure Key Vault: Get Secrets'
|
|
||||||
inputs:
|
|
||||||
azureSubscription: 'vscode-builds-subscription'
|
|
||||||
KeyVaultName: vscode
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -e
|
|
||||||
cat << EOF > ~/.netrc
|
|
||||||
machine github.com
|
|
||||||
login vscode
|
|
||||||
password $(github-distro-mixin-password)
|
|
||||||
EOF
|
|
||||||
|
|
||||||
git config user.email "vscode@microsoft.com"
|
|
||||||
git config user.name "VSCode"
|
|
||||||
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'
|
|
||||||
# targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
|
|
||||||
# vstsFeed: 'npm-vscode'
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -e
|
|
||||||
CHILD_CONCURRENCY=1 yarn --frozen-lockfile
|
|
||||||
displayName: Install dependencies
|
|
||||||
# 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'
|
|
||||||
# targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
|
|
||||||
# vstsFeed: 'npm-vscode'
|
|
||||||
# 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
|
|
||||||
VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
|
|
||||||
yarn gulp vscode-web-min-ci
|
|
||||||
displayName: Build
|
|
||||||
|
|
||||||
# upload only the workbench.web.api.js source maps because
|
|
||||||
# we just compiled these bits in the previous step and the
|
|
||||||
# general task to upload source maps has already been run
|
|
||||||
- script: |
|
|
||||||
set -e
|
|
||||||
AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \
|
|
||||||
node build/azure-pipelines/upload-sourcemaps out-vscode-web-min out-vscode-web-min/vs/workbench/workbench.web.api.js.map
|
|
||||||
displayName: Upload sourcemaps (Web)
|
|
||||||
|
|
||||||
- script: |
|
|
||||||
set -e
|
|
||||||
AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
|
|
||||||
AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \
|
|
||||||
VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
|
|
||||||
./build/azure-pipelines/web/publish.sh
|
|
||||||
displayName: Publish
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -e
|
|
||||||
REPO="$(pwd)"
|
|
||||||
ROOT="$REPO/.."
|
|
||||||
|
|
||||||
# Publish Web Client
|
|
||||||
WEB_BUILD_NAME="vscode-web"
|
|
||||||
WEB_TARBALL_FILENAME="vscode-web.tar.gz"
|
|
||||||
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.*
|
|
||||||
|
|
||||||
(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"
|
|
||||||
@@ -1,71 +1,44 @@
|
|||||||
steps:
|
steps:
|
||||||
- task: NodeTool@0
|
- task: NodeTool@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "10.15.1"
|
versionSpec: "8.12.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@2
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "1.x"
|
versionSpec: "1.10.1"
|
||||||
- task: UsePythonVersion@0
|
- task: UsePythonVersion@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: '2.x'
|
versionSpec: '2.x'
|
||||||
addToPath: true
|
addToPath: true
|
||||||
- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
|
|
||||||
inputs:
|
|
||||||
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'
|
|
||||||
vstsFeed: '$(build-cache)' # {{SQL CARBON EDIT}} update build cache
|
|
||||||
- powershell: |
|
- powershell: |
|
||||||
yarn --frozen-lockfile
|
yarn
|
||||||
env:
|
|
||||||
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'))
|
|
||||||
- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
|
|
||||||
inputs:
|
|
||||||
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'
|
|
||||||
vstsFeed: '$(build-cache)' # {{SQL CARBON EDIT}} update build cache
|
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
|
||||||
- powershell: |
|
- powershell: |
|
||||||
yarn electron
|
yarn gulp electron
|
||||||
env:
|
displayName: Download Electron
|
||||||
GITHUB_TOKEN: $(GITHUB_TOKEN) # {{SQL CARBON EDIT}} add github token
|
- powershell: |
|
||||||
- script: |
|
yarn gulp hygiene
|
||||||
yarn gulp hygiene --skip-tslint
|
|
||||||
displayName: Run Hygiene Checks
|
displayName: Run Hygiene Checks
|
||||||
|
- powershell: |
|
||||||
|
yarn monaco-compile-check
|
||||||
|
displayName: Run Monaco Editor Checks
|
||||||
- script: |
|
- script: |
|
||||||
yarn gulp tslint
|
|
||||||
displayName: Run TSLint Checks
|
|
||||||
- script: | # {{SQL CARBON EDIT}} add step
|
|
||||||
yarn tslint
|
|
||||||
displayName: Run TSLint (gci)
|
|
||||||
- script: | # {{SQL CARBON EDIT}} add step
|
|
||||||
yarn strict-null-check
|
yarn strict-null-check
|
||||||
displayName: Run Strict Null Check
|
displayName: Run Strict Null Checks
|
||||||
# - powershell: | {{SQL CARBON EDIT}} remove step
|
|
||||||
# yarn monaco-compile-check
|
|
||||||
# displayName: Run Monaco Editor Checks
|
|
||||||
- powershell: |
|
- powershell: |
|
||||||
yarn compile
|
yarn compile
|
||||||
displayName: Compile Sources
|
displayName: Compile Sources
|
||||||
# - powershell: | {{SQL CARBON EDIT}} remove step
|
- powershell: |
|
||||||
# yarn download-builtin-extensions
|
yarn download-builtin-extensions
|
||||||
# displayName: Download Built-in Extensions
|
displayName: Download Built-in Extensions
|
||||||
- powershell: |
|
- powershell: |
|
||||||
.\scripts\test.bat --tfs "Unit Tests"
|
.\scripts\test.bat --tfs "Unit Tests"
|
||||||
displayName: Run Unit Tests
|
displayName: Run Unit Tests
|
||||||
# - powershell: | {{SQL CARBON EDIT}} remove step
|
- powershell: |
|
||||||
# .\scripts\test-integration.bat --tfs "Integration Tests"
|
.\scripts\test-integration.bat --tfs "Integration Tests"
|
||||||
# displayName: Run Integration Tests
|
displayName: Run Integration Tests
|
||||||
- task: PublishTestResults@2
|
- task: PublishTestResults@2
|
||||||
displayName: Publish Tests Results
|
displayName: Publish Tests Results
|
||||||
inputs:
|
inputs:
|
||||||
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
|
|
||||||
|
|||||||
@@ -1,134 +1,52 @@
|
|||||||
steps:
|
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: 'npm-vscode'
|
|
||||||
platformIndependent: true
|
|
||||||
alias: 'Compilation'
|
|
||||||
|
|
||||||
- powershell: |
|
|
||||||
$ErrorActionPreference = "Stop"
|
|
||||||
exit 1
|
|
||||||
displayName: Check RestoreCache
|
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
|
|
||||||
|
|
||||||
- task: NodeTool@0
|
- task: NodeTool@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "10.15.1"
|
versionSpec: "8.12.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:
|
||||||
versionSpec: "1.x"
|
versionSpec: "1.10.1"
|
||||||
|
|
||||||
- task: UsePythonVersion@0
|
- task: UsePythonVersion@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: '2.x'
|
versionSpec: '2.x'
|
||||||
addToPath: true
|
addToPath: true
|
||||||
|
|
||||||
- task: AzureKeyVault@1
|
|
||||||
displayName: 'Azure Key Vault: Get Secrets'
|
|
||||||
inputs:
|
|
||||||
azureSubscription: 'vscode-builds-subscription'
|
|
||||||
KeyVaultName: vscode
|
|
||||||
|
|
||||||
- powershell: |
|
|
||||||
. build/azure-pipelines/win32/exec.ps1
|
|
||||||
$ErrorActionPreference = "Stop"
|
|
||||||
"machine github.com`nlogin vscode`npassword $(github-distro-mixin-password)" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII
|
|
||||||
|
|
||||||
exec { git config user.email "vscode@microsoft.com" }
|
|
||||||
exec { git config user.name "VSCode" }
|
|
||||||
|
|
||||||
mkdir .build -ea 0
|
|
||||||
"$(VSCODE_ARCH)" | Out-File -Encoding ascii -NoNewLine .build\arch
|
|
||||||
displayName: Prepare tooling
|
|
||||||
|
|
||||||
- powershell: |
|
|
||||||
. build/azure-pipelines/win32/exec.ps1
|
|
||||||
$ErrorActionPreference = "Stop"
|
|
||||||
exec { git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" }
|
|
||||||
exec { git fetch distro }
|
|
||||||
exec { git merge $(node -p "require('./package.json').distro") }
|
|
||||||
displayName: Merge distro
|
|
||||||
|
|
||||||
- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
|
|
||||||
inputs:
|
|
||||||
keyfile: 'build/.cachesalt, .build/arch, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock'
|
|
||||||
targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
|
|
||||||
vstsFeed: 'npm-vscode'
|
|
||||||
|
|
||||||
- powershell: |
|
- powershell: |
|
||||||
. build/azure-pipelines/win32/exec.ps1
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
$ErrorActionPreference = "Stop"
|
$ErrorActionPreference = "Stop"
|
||||||
|
"machine monacotools.visualstudio.com password $(VSO_PAT)" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII
|
||||||
$env:npm_config_arch="$(VSCODE_ARCH)"
|
$env:npm_config_arch="$(VSCODE_ARCH)"
|
||||||
$env:CHILD_CONCURRENCY="1"
|
$env:CHILD_CONCURRENCY="1"
|
||||||
exec { yarn --frozen-lockfile }
|
$env:VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)"
|
||||||
displayName: Install dependencies
|
exec { yarn }
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
exec { npm run gulp -- hygiene }
|
||||||
|
exec { npm run monaco-compile-check }
|
||||||
- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
|
exec { npm run strict-null-check }
|
||||||
inputs:
|
exec { npm run gulp -- mixin }
|
||||||
keyfile: 'build/.cachesalt, .build/arch, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock'
|
exec { node build/azure-pipelines/common/installDistro.js }
|
||||||
targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
|
exec { node build/lib/builtInExtensions.js }
|
||||||
vstsFeed: 'npm-vscode'
|
|
||||||
condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
|
|
||||||
|
|
||||||
- powershell: |
|
- powershell: |
|
||||||
. build/azure-pipelines/win32/exec.ps1
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
$ErrorActionPreference = "Stop"
|
$ErrorActionPreference = "Stop"
|
||||||
exec { yarn postinstall }
|
$env:VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)"
|
||||||
displayName: Run postinstall scripts
|
exec { npm run gulp -- "vscode-win32-$(VSCODE_ARCH)-min" }
|
||||||
condition: and(succeeded(), eq(variables['CacheRestored'], 'true'))
|
exec { npm run gulp -- "vscode-win32-$(VSCODE_ARCH)-inno-updater" }
|
||||||
|
name: build
|
||||||
|
|
||||||
- powershell: |
|
- powershell: |
|
||||||
. build/azure-pipelines/win32/exec.ps1
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
$ErrorActionPreference = "Stop"
|
$ErrorActionPreference = "Stop"
|
||||||
exec { node build/azure-pipelines/mixin }
|
exec { npm run gulp -- "electron-$(VSCODE_ARCH)" }
|
||||||
displayName: Mix in quality
|
|
||||||
|
|
||||||
- powershell: |
|
|
||||||
. build/azure-pipelines/win32/exec.ps1
|
|
||||||
$ErrorActionPreference = "Stop"
|
|
||||||
$env:VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)"
|
|
||||||
exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-min-ci" }
|
|
||||||
exec { yarn gulp "vscode-reh-win32-$env:VSCODE_ARCH-min-ci" }
|
|
||||||
exec { yarn gulp "vscode-reh-web-win32-$env:VSCODE_ARCH-min-ci" }
|
|
||||||
exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-code-helper" }
|
|
||||||
exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-inno-updater" }
|
|
||||||
displayName: Build
|
|
||||||
|
|
||||||
- powershell: |
|
|
||||||
. build/azure-pipelines/win32/exec.ps1
|
|
||||||
$ErrorActionPreference = "Stop"
|
|
||||||
exec { yarn electron $(VSCODE_ARCH) }
|
|
||||||
exec { .\scripts\test.bat --build --tfs "Unit Tests" }
|
exec { .\scripts\test.bat --build --tfs "Unit Tests" }
|
||||||
displayName: Run unit tests
|
# yarn smoketest -- --build "$(agent.builddirectory)\VSCode-win32-$(VSCODE_ARCH)"
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
name: test
|
||||||
|
|
||||||
- powershell: |
|
|
||||||
# Figure out the full absolute path of the product we just built
|
|
||||||
# including the remote server and configure the integration tests
|
|
||||||
# to run with these builds instead of running out of sources.
|
|
||||||
. build/azure-pipelines/win32/exec.ps1
|
|
||||||
$ErrorActionPreference = "Stop"
|
|
||||||
$AppRoot = "$(agent.builddirectory)\VSCode-win32-$(VSCODE_ARCH)"
|
|
||||||
$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:VSCODE_REMOTE_SERVER_PATH = "$(agent.builddirectory)\vscode-reh-win32-$(VSCODE_ARCH)"; .\scripts\test-integration.bat --build --tfs "Integration Tests" }
|
|
||||||
displayName: Run integration tests
|
|
||||||
condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
|
|
||||||
|
|
||||||
- task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1
|
- task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1
|
||||||
inputs:
|
inputs:
|
||||||
ConnectedServiceName: 'ESRP CodeSign'
|
ConnectedServiceName: 'ESRP CodeSign'
|
||||||
FolderPath: '$(agent.builddirectory)/VSCode-win32-$(VSCODE_ARCH),$(agent.builddirectory)/vscode-reh-win32-$(VSCODE_ARCH)'
|
FolderPath: '$(agent.builddirectory)/VSCode-win32-$(VSCODE_ARCH)'
|
||||||
Pattern: '*.dll,*.exe,*.node'
|
Pattern: '*.dll,*.exe,*.node'
|
||||||
signConfigType: inlineSignParams
|
signConfigType: inlineSignParams
|
||||||
inlineOperation: |
|
inlineOperation: |
|
||||||
@@ -196,18 +114,38 @@ steps:
|
|||||||
|
|
||||||
- powershell: |
|
- powershell: |
|
||||||
$ErrorActionPreference = "Stop"
|
$ErrorActionPreference = "Stop"
|
||||||
.\build\azure-pipelines\win32\import-esrp-auth-cert.ps1 -AuthCertificateBase64 $(esrp-auth-certificate) -AuthCertificateKey $(esrp-auth-certificate-key)
|
.\build\azure-pipelines\win32\import-esrp-auth-cert.ps1 -AuthCertificateBase64 $(ESRP_AUTH_CERTIFICATE) -AuthCertificateKey $(ESRP_AUTH_CERTIFICATE_KEY)
|
||||||
displayName: Import ESRP Auth Certificate
|
displayName: Import ESRP Auth Certificate
|
||||||
|
|
||||||
- powershell: |
|
- powershell: |
|
||||||
. build/azure-pipelines/win32/exec.ps1
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
$ErrorActionPreference = "Stop"
|
$ErrorActionPreference = "Stop"
|
||||||
$env:AZURE_STORAGE_ACCESS_KEY_2 = "$(vscode-storage-key)"
|
exec { npm run gulp -- "vscode-win32-$(VSCODE_ARCH)-archive" "vscode-win32-$(VSCODE_ARCH)-system-setup" "vscode-win32-$(VSCODE_ARCH)-user-setup" --sign }
|
||||||
$env:AZURE_DOCUMENTDB_MASTERKEY = "$(builds-docdb-key-readwrite)"
|
|
||||||
$env:VSCODE_HOCKEYAPP_TOKEN = "$(vscode-hockeyapp-token)"
|
$Repo = "$(pwd)"
|
||||||
$env:VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)"
|
$Root = "$Repo\.."
|
||||||
.\build\azure-pipelines\win32\publish.ps1
|
$SystemExe = "$Repo\.build\win32-$(VSCODE_ARCH)\system-setup\VSCodeSetup.exe"
|
||||||
displayName: Publish
|
$UserExe = "$Repo\.build\win32-$(VSCODE_ARCH)\user-setup\VSCodeSetup.exe"
|
||||||
|
$Zip = "$Repo\.build\win32-$(VSCODE_ARCH)\archive\VSCode-win32-$(VSCODE_ARCH).zip"
|
||||||
|
$Build = "$Root\VSCode-win32-$(VSCODE_ARCH)"
|
||||||
|
|
||||||
|
# get version
|
||||||
|
$PackageJson = Get-Content -Raw -Path "$Build\resources\app\package.json" | ConvertFrom-Json
|
||||||
|
$Version = $PackageJson.version
|
||||||
|
$Quality = "$env:VSCODE_QUALITY"
|
||||||
|
$env:AZURE_STORAGE_ACCESS_KEY_2 = "$(AZURE_STORAGE_ACCESS_KEY_2)"
|
||||||
|
$env:MOONCAKE_STORAGE_ACCESS_KEY = "$(MOONCAKE_STORAGE_ACCESS_KEY)"
|
||||||
|
$env:AZURE_DOCUMENTDB_MASTERKEY = "$(AZURE_DOCUMENTDB_MASTERKEY)"
|
||||||
|
|
||||||
|
$assetPlatform = if ("$(VSCODE_ARCH)" -eq "ia32") { "win32" } else { "win32-x64" }
|
||||||
|
|
||||||
|
exec { node build/azure-pipelines/common/publish.js $Quality "$global:assetPlatform-archive" archive "VSCode-win32-$(VSCODE_ARCH)-$Version.zip" $Version true $Zip }
|
||||||
|
exec { node build/azure-pipelines/common/publish.js $Quality "$global:assetPlatform" setup "VSCodeSetup-$(VSCODE_ARCH)-$Version.exe" $Version true $SystemExe }
|
||||||
|
exec { node build/azure-pipelines/common/publish.js $Quality "$global:assetPlatform-user" setup "VSCodeUserSetup-$(VSCODE_ARCH)-$Version.exe" $Version true $UserExe }
|
||||||
|
|
||||||
|
# publish hockeyapp symbols
|
||||||
|
$hockeyAppId = if ("$(VSCODE_ARCH)" -eq "ia32") { "$(VSCODE_HOCKEYAPP_ID_WIN32)" } else { "$(VSCODE_HOCKEYAPP_ID_WIN64)" }
|
||||||
|
exec { node build/azure-pipelines/common/symbols.js "$(VSCODE_MIXIN_PASSWORD)" "$(VSCODE_HOCKEYAPP_TOKEN)" "$(VSCODE_ARCH)" $hockeyAppId }
|
||||||
|
|
||||||
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
||||||
displayName: 'Component Detection'
|
displayName: 'Component Detection'
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
. build/azure-pipelines/win32/exec.ps1
|
|
||||||
$ErrorActionPreference = "Stop"
|
|
||||||
|
|
||||||
$Arch = "$env:VSCODE_ARCH"
|
|
||||||
|
|
||||||
exec { yarn gulp "vscode-win32-$Arch-archive" "vscode-win32-$Arch-system-setup" "vscode-win32-$Arch-user-setup" --sign }
|
|
||||||
|
|
||||||
$Repo = "$(pwd)"
|
|
||||||
$Root = "$Repo\.."
|
|
||||||
$SystemExe = "$Repo\.build\win32-$Arch\system-setup\VSCodeSetup.exe"
|
|
||||||
$UserExe = "$Repo\.build\win32-$Arch\user-setup\VSCodeSetup.exe"
|
|
||||||
$Zip = "$Repo\.build\win32-$Arch\archive\VSCode-win32-$Arch.zip"
|
|
||||||
$LegacyServer = "$Root\vscode-reh-win32-$Arch"
|
|
||||||
$ServerName = "vscode-server-win32-$Arch"
|
|
||||||
$Server = "$Root\$ServerName"
|
|
||||||
$ServerZip = "$Repo\.build\vscode-server-win32-$Arch.zip"
|
|
||||||
$Build = "$Root\VSCode-win32-$Arch"
|
|
||||||
|
|
||||||
# Create server archive
|
|
||||||
exec { Rename-Item -Path $LegacyServer -NewName $ServerName }
|
|
||||||
exec { .\node_modules\7zip\7zip-lite\7z.exe a -tzip $ServerZip $Server -r }
|
|
||||||
|
|
||||||
# get version
|
|
||||||
$PackageJson = Get-Content -Raw -Path "$Build\resources\app\package.json" | ConvertFrom-Json
|
|
||||||
$Version = $PackageJson.version
|
|
||||||
$Quality = "$env:VSCODE_QUALITY"
|
|
||||||
|
|
||||||
$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/publish.js $Quality "$AssetPlatform" setup "VSCodeSetup-$Arch-$Version.exe" $Version true $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/publish.js $Quality "server-$AssetPlatform" archive "vscode-server-win32-$Arch.zip" $Version true $ServerZip }
|
|
||||||
|
|
||||||
# publish hockeyapp symbols
|
|
||||||
$hockeyAppId = if ("$Arch" -eq "ia32") { "$env:VSCODE_HOCKEYAPP_ID_WIN32" } else { "$env:VSCODE_HOCKEYAPP_ID_WIN64" }
|
|
||||||
exec { node build/azure-pipelines/common/symbols.js "$env:VSCODE_MIXIN_PASSWORD" "$env:VSCODE_HOCKEYAPP_TOKEN" "$Arch" $hockeyAppId }
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"name": "Microsoft.sqlservernotebook",
|
|
||||||
"version": "0.3.2",
|
|
||||||
"repo": "https://github.com/Microsoft/azuredatastudio"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@@ -1,7 +1,2 @@
|
|||||||
[
|
[
|
||||||
{
|
|
||||||
"name": "Microsoft.sqlservernotebook",
|
|
||||||
"version": "0.3.2",
|
|
||||||
"repo": "https://github.com/Microsoft/azuredatastudio"
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ const path = require('path');
|
|||||||
let window = null;
|
let window = null;
|
||||||
|
|
||||||
app.once('ready', () => {
|
app.once('ready', () => {
|
||||||
window = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true, webviewTag: true } });
|
window = new BrowserWindow({ width: 800, height: 600 });
|
||||||
window.setMenuBarVisibility(false);
|
window.setMenuBarVisibility(false);
|
||||||
window.loadURL(url.format({ pathname: path.join(__dirname, 'index.html'), protocol: 'file:', slashes: true }));
|
window.loadURL(url.format({ pathname: path.join(__dirname, 'index.html'), protocol: 'file:', slashes: true }));
|
||||||
// window.webContents.openDevTools();
|
// window.webContents.openDevTools();
|
||||||
|
|||||||
@@ -1,16 +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');
|
|
||||||
const util = require('./lib/util');
|
|
||||||
const task = require('./lib/task');
|
|
||||||
const compilation = require('./lib/compilation');
|
|
||||||
|
|
||||||
// Full compile, including nls and inline sources in sourcemaps, for build
|
|
||||||
const compileBuildTask = task.define('compile-build', task.series(util.rimraf('out-build'), compilation.compileTask('src', 'out-build', true)));
|
|
||||||
gulp.task(compileBuildTask);
|
|
||||||
exports.compileBuildTask = compileBuildTask;
|
|
||||||
@@ -6,7 +6,6 @@
|
|||||||
const gulp = require('gulp');
|
const gulp = require('gulp');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const util = require('./lib/util');
|
const util = require('./lib/util');
|
||||||
const task = require('./lib/task');
|
|
||||||
const common = require('./lib/optimize');
|
const common = require('./lib/optimize');
|
||||||
const es = require('event-stream');
|
const es = require('event-stream');
|
||||||
const File = require('vinyl');
|
const File = require('vinyl');
|
||||||
@@ -41,7 +40,15 @@ var editorEntryPoints = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
var editorResources = [
|
var editorResources = [
|
||||||
'out-editor-build/vs/base/browser/ui/codiconLabel/**/*.ttf'
|
'out-build/vs/{base,editor}/**/*.{svg,png}',
|
||||||
|
'!out-build/vs/base/browser/ui/splitview/**/*',
|
||||||
|
'!out-build/vs/base/browser/ui/toolbar/**/*',
|
||||||
|
'!out-build/vs/base/browser/ui/octiconLabel/**/*',
|
||||||
|
'!out-build/vs/workbench/**',
|
||||||
|
'!**/test/**'
|
||||||
|
];
|
||||||
|
|
||||||
|
var editorOtherSources = [
|
||||||
];
|
];
|
||||||
|
|
||||||
var BUNDLED_FILE_HEADER = [
|
var BUNDLED_FILE_HEADER = [
|
||||||
@@ -56,7 +63,8 @@ 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', () => {
|
gulp.task('clean-editor-src', util.rimraf('out-editor-src'));
|
||||||
|
gulp.task('extract-editor-src', ['clean-editor-src'], function () {
|
||||||
console.log(`If the build fails, consider tweaking shakeLevel below to a lower value.`);
|
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();
|
||||||
@@ -76,7 +84,6 @@ const extractEditorSrcTask = task.define('extract-editor-src', () => {
|
|||||||
'typings/thenable.d.ts',
|
'typings/thenable.d.ts',
|
||||||
'typings/es6-promise.d.ts',
|
'typings/es6-promise.d.ts',
|
||||||
'typings/require-monaco.d.ts',
|
'typings/require-monaco.d.ts',
|
||||||
"typings/lib.es2018.promise.d.ts",
|
|
||||||
'vs/monaco.d.ts'
|
'vs/monaco.d.ts'
|
||||||
],
|
],
|
||||||
libs: [
|
libs: [
|
||||||
@@ -84,17 +91,24 @@ const extractEditorSrcTask = task.define('extract-editor-src', () => {
|
|||||||
`lib.dom.d.ts`,
|
`lib.dom.d.ts`,
|
||||||
`lib.webworker.importscripts.d.ts`
|
`lib.webworker.importscripts.d.ts`
|
||||||
],
|
],
|
||||||
|
redirects: {
|
||||||
|
'vs/base/browser/ui/octiconLabel/octiconLabel': 'vs/base/browser/ui/octiconLabel/octiconLabel.mock',
|
||||||
|
},
|
||||||
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!/,
|
||||||
destRoot: path.join(root, 'out-editor-src')
|
destRoot: path.join(root, 'out-editor-src')
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
const compileEditorAMDTask = task.define('compile-editor-amd', compilation.compileTask('out-editor-src', 'out-editor-build', true));
|
// Full compile, including nls and inline sources in sourcemaps, for build
|
||||||
|
gulp.task('clean-editor-build', util.rimraf('out-editor-build'));
|
||||||
|
gulp.task('compile-editor-build', ['clean-editor-build', 'extract-editor-src'], compilation.compileTask('out-editor-src', 'out-editor-build', true));
|
||||||
|
|
||||||
const optimizeEditorAMDTask = task.define('optimize-editor-amd', common.optimizeTask({
|
gulp.task('clean-optimized-editor', util.rimraf('out-editor'));
|
||||||
|
gulp.task('optimize-editor', ['clean-optimized-editor', 'compile-editor-build'], common.optimizeTask({
|
||||||
src: 'out-editor-build',
|
src: 'out-editor-build',
|
||||||
entryPoints: editorEntryPoints,
|
entryPoints: editorEntryPoints,
|
||||||
|
otherSources: editorOtherSources,
|
||||||
resources: editorResources,
|
resources: editorResources,
|
||||||
loaderConfig: {
|
loaderConfig: {
|
||||||
paths: {
|
paths: {
|
||||||
@@ -111,9 +125,11 @@ const optimizeEditorAMDTask = task.define('optimize-editor-amd', common.optimize
|
|||||||
languages: languages
|
languages: languages
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const minifyEditorAMDTask = task.define('minify-editor-amd', common.minifyTask('out-editor'));
|
gulp.task('clean-minified-editor', util.rimraf('out-editor-min'));
|
||||||
|
gulp.task('minify-editor', ['clean-minified-editor', 'optimize-editor'], common.minifyTask('out-editor'));
|
||||||
|
|
||||||
const createESMSourcesAndResourcesTask = task.define('extract-editor-esm', () => {
|
gulp.task('clean-editor-esm', util.rimraf('out-editor-esm'));
|
||||||
|
gulp.task('extract-editor-esm', ['clean-editor-esm', 'clean-editor-distro', 'extract-editor-src'], function () {
|
||||||
standalone.createESMSourcesAndResources2({
|
standalone.createESMSourcesAndResources2({
|
||||||
srcFolder: './out-editor-src',
|
srcFolder: './out-editor-src',
|
||||||
outFolder: './out-editor-esm',
|
outFolder: './out-editor-esm',
|
||||||
@@ -135,8 +151,7 @@ const createESMSourcesAndResourcesTask = task.define('extract-editor-esm', () =>
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
gulp.task('compile-editor-esm', ['extract-editor-esm', 'clean-editor-distro'], function () {
|
||||||
const compileEditorESMTask = task.define('compile-editor-esm', () => {
|
|
||||||
if (process.platform === 'win32') {
|
if (process.platform === 'win32') {
|
||||||
const result = cp.spawnSync(`..\\node_modules\\.bin\\tsc.cmd`, {
|
const result = cp.spawnSync(`..\\node_modules\\.bin\\tsc.cmd`, {
|
||||||
cwd: path.join(__dirname, '../out-editor-esm')
|
cwd: path.join(__dirname, '../out-editor-esm')
|
||||||
@@ -187,16 +202,8 @@ function toExternalDTS(contents) {
|
|||||||
return lines.join('\n');
|
return lines.join('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
function filterStream(testFunc) {
|
gulp.task('clean-editor-distro', util.rimraf('out-monaco-editor-core'));
|
||||||
return es.through(function (data) {
|
gulp.task('editor-distro', ['clean-editor-distro', 'compile-editor-esm', 'minify-editor', 'optimize-editor'], function () {
|
||||||
if (!testFunc(data.relative)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.emit('data', data);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const finalEditorResourcesTask = task.define('final-editor-resources', () => {
|
|
||||||
return es.merge(
|
return es.merge(
|
||||||
// other assets
|
// other assets
|
||||||
es.merge(
|
es.merge(
|
||||||
@@ -226,14 +233,6 @@ const finalEditorResourcesTask = task.define('final-editor-resources', () => {
|
|||||||
}))
|
}))
|
||||||
.pipe(gulp.dest('out-monaco-editor-core')),
|
.pipe(gulp.dest('out-monaco-editor-core')),
|
||||||
|
|
||||||
// version.txt
|
|
||||||
gulp.src('build/monaco/version.txt')
|
|
||||||
.pipe(es.through(function (data) {
|
|
||||||
data.contents = Buffer.from(`monaco-editor-core: https://github.com/Microsoft/vscode/tree/${sha1}`);
|
|
||||||
this.emit('data', data);
|
|
||||||
}))
|
|
||||||
.pipe(gulp.dest('out-monaco-editor-core')),
|
|
||||||
|
|
||||||
// README.md
|
// README.md
|
||||||
gulp.src('build/monaco/README-npm.md')
|
gulp.src('build/monaco/README-npm.md')
|
||||||
.pipe(es.through(function (data) {
|
.pipe(es.through(function (data) {
|
||||||
@@ -267,7 +266,7 @@ const finalEditorResourcesTask = task.define('final-editor-resources', () => {
|
|||||||
|
|
||||||
var strContents = data.contents.toString();
|
var strContents = data.contents.toString();
|
||||||
var newStr = '//# sourceMappingURL=' + relativePathToMap.replace(/\\/g, '/');
|
var 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);
|
||||||
this.emit('data', data);
|
this.emit('data', data);
|
||||||
@@ -283,31 +282,59 @@ const finalEditorResourcesTask = task.define('final-editor-resources', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('editor-distro',
|
gulp.task('analyze-editor-distro', function () {
|
||||||
task.series(
|
// @ts-ignore
|
||||||
task.parallel(
|
var bundleInfo = require('../out-editor/bundleInfo.json');
|
||||||
util.rimraf('out-editor-src'),
|
var graph = bundleInfo.graph;
|
||||||
util.rimraf('out-editor-build'),
|
var bundles = bundleInfo.bundles;
|
||||||
util.rimraf('out-editor-esm'),
|
|
||||||
util.rimraf('out-monaco-editor-core'),
|
var inverseGraph = {};
|
||||||
util.rimraf('out-editor'),
|
Object.keys(graph).forEach(function (module) {
|
||||||
util.rimraf('out-editor-min')
|
var dependencies = graph[module];
|
||||||
),
|
dependencies.forEach(function (dep) {
|
||||||
extractEditorSrcTask,
|
inverseGraph[dep] = inverseGraph[dep] || [];
|
||||||
task.parallel(
|
inverseGraph[dep].push(module);
|
||||||
task.series(
|
});
|
||||||
compileEditorAMDTask,
|
});
|
||||||
optimizeEditorAMDTask,
|
|
||||||
minifyEditorAMDTask
|
var detailed = {};
|
||||||
),
|
Object.keys(bundles).forEach(function (entryPoint) {
|
||||||
task.series(
|
var included = bundles[entryPoint];
|
||||||
createESMSourcesAndResourcesTask,
|
var includedMap = {};
|
||||||
compileEditorESMTask
|
included.forEach(function (included) {
|
||||||
)
|
includedMap[included] = true;
|
||||||
),
|
});
|
||||||
finalEditorResourcesTask
|
|
||||||
)
|
var explanation = [];
|
||||||
);
|
included.map(function (included) {
|
||||||
|
if (included.indexOf('!') >= 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var reason = (inverseGraph[included] || []).filter(function (mod) {
|
||||||
|
return !!includedMap[mod];
|
||||||
|
});
|
||||||
|
explanation.push({
|
||||||
|
module: included,
|
||||||
|
reason: reason
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
detailed[entryPoint] = explanation;
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(JSON.stringify(detailed, null, '\t'));
|
||||||
|
});
|
||||||
|
|
||||||
|
function filterStream(testFunc) {
|
||||||
|
return es.through(function (data) {
|
||||||
|
if (!testFunc(data.relative)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.emit('data', data);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//#region monaco type checking
|
//#region monaco type checking
|
||||||
|
|
||||||
@@ -327,7 +354,6 @@ function createTscCompileTask(watch) {
|
|||||||
let errors = [];
|
let errors = [];
|
||||||
let reporter = createReporter();
|
let reporter = createReporter();
|
||||||
let report;
|
let report;
|
||||||
// eslint-disable-next-line no-control-regex
|
|
||||||
let magic = /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g; // https://stackoverflow.com/questions/25245716/remove-all-ansi-colors-styles-from-strings
|
let magic = /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g; // https://stackoverflow.com/questions/25245716/remove-all-ansi-colors-styles-from-strings
|
||||||
|
|
||||||
child.stdout.on('data', data => {
|
child.stdout.on('data', data => {
|
||||||
@@ -361,10 +387,7 @@ function createTscCompileTask(watch) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const monacoTypecheckWatchTask = task.define('monaco-typecheck-watch', createTscCompileTask(true));
|
gulp.task('monaco-typecheck-watch', createTscCompileTask(true));
|
||||||
exports.monacoTypecheckWatchTask = monacoTypecheckWatchTask;
|
gulp.task('monaco-typecheck', createTscCompileTask(false));
|
||||||
|
|
||||||
const monacoTypecheckTask = task.define('monaco-typecheck', createTscCompileTask(false));
|
|
||||||
exports.monacoTypecheckTask = monacoTypecheckTask;
|
|
||||||
|
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ const path = require('path');
|
|||||||
const tsb = require('gulp-tsb');
|
const tsb = require('gulp-tsb');
|
||||||
const es = require('event-stream');
|
const es = require('event-stream');
|
||||||
const filter = require('gulp-filter');
|
const filter = require('gulp-filter');
|
||||||
|
const rimraf = require('rimraf');
|
||||||
const util = require('./lib/util');
|
const util = require('./lib/util');
|
||||||
const task = require('./lib/task');
|
|
||||||
const watcher = require('./lib/watch');
|
const watcher = require('./lib/watch');
|
||||||
const createReporter = require('./lib/reporter').createReporter;
|
const createReporter = require('./lib/reporter').createReporter;
|
||||||
const glob = require('glob');
|
const glob = require('glob');
|
||||||
@@ -21,15 +21,9 @@ const nlsDev = require('vscode-nls-dev');
|
|||||||
const root = path.dirname(__dirname);
|
const root = path.dirname(__dirname);
|
||||||
const commit = util.getVersion(root);
|
const commit = util.getVersion(root);
|
||||||
const plumber = require('gulp-plumber');
|
const plumber = require('gulp-plumber');
|
||||||
const ext = require('./lib/extensions');
|
const _ = require('underscore');
|
||||||
|
|
||||||
const extensionsPath = path.join(path.dirname(__dirname), 'extensions');
|
const extensionsPath = path.join(path.dirname(__dirname), 'extensions');
|
||||||
// {{SQL CARBON EDIT}}
|
|
||||||
const sqlLocalizedExtensions = [
|
|
||||||
'dacpac',
|
|
||||||
'schema-compare'
|
|
||||||
];
|
|
||||||
// {{SQL CARBON EDIT}}
|
|
||||||
|
|
||||||
const compilations = glob.sync('**/tsconfig.json', {
|
const compilations = glob.sync('**/tsconfig.json', {
|
||||||
cwd: extensionsPath,
|
cwd: extensionsPath,
|
||||||
@@ -42,38 +36,48 @@ const tasks = compilations.map(function (tsconfigFile) {
|
|||||||
const absolutePath = path.join(extensionsPath, tsconfigFile);
|
const absolutePath = path.join(extensionsPath, tsconfigFile);
|
||||||
const relativeDirname = path.dirname(tsconfigFile);
|
const relativeDirname = path.dirname(tsconfigFile);
|
||||||
|
|
||||||
const overrideOptions = {};
|
const tsconfig = require(absolutePath);
|
||||||
overrideOptions.sourceMap = true;
|
const tsOptions = _.assign({}, tsconfig.extends ? require(path.join(extensionsPath, relativeDirname, tsconfig.extends)).compilerOptions : {}, tsconfig.compilerOptions);
|
||||||
|
tsOptions.verbose = false;
|
||||||
|
tsOptions.sourceMap = true;
|
||||||
|
|
||||||
const name = relativeDirname.replace(/\//g, '-');
|
const name = relativeDirname.replace(/\//g, '-');
|
||||||
|
|
||||||
|
// Tasks
|
||||||
|
const clean = 'clean-extension:' + name;
|
||||||
|
const compile = 'compile-extension:' + name;
|
||||||
|
const watch = 'watch-extension:' + name;
|
||||||
|
|
||||||
|
// Build Tasks
|
||||||
|
const cleanBuild = 'clean-extension-build:' + name;
|
||||||
|
const compileBuild = 'compile-extension-build:' + name;
|
||||||
|
const watchBuild = 'watch-extension-build:' + name;
|
||||||
|
|
||||||
const root = path.join('extensions', relativeDirname);
|
const root = path.join('extensions', relativeDirname);
|
||||||
const srcBase = path.join(root, 'src');
|
const srcBase = path.join(root, 'src');
|
||||||
const src = path.join(srcBase, '**');
|
const src = path.join(srcBase, '**');
|
||||||
const srcOpts = { cwd: path.dirname(__dirname), base: srcBase };
|
|
||||||
|
|
||||||
const out = path.join(root, 'out');
|
const out = path.join(root, 'out');
|
||||||
const baseUrl = getBaseUrl(out);
|
const baseUrl = getBaseUrl(out);
|
||||||
|
|
||||||
let headerId, headerOut;
|
let headerId, headerOut;
|
||||||
let index = relativeDirname.indexOf('/');
|
let index = relativeDirname.indexOf('/');
|
||||||
if (index < 0) {
|
if (index < 0) {
|
||||||
headerId = 'microsoft.' + relativeDirname; // {{SQL CARBON EDIT}}
|
headerId = 'vscode.' + relativeDirname;
|
||||||
headerOut = 'out';
|
headerOut = 'out';
|
||||||
} else {
|
} else {
|
||||||
headerId = 'microsoft.' + relativeDirname.substr(0, index); // {{SQL CARBON EDIT}}
|
headerId = 'vscode.' + relativeDirname.substr(0, index);
|
||||||
headerOut = relativeDirname.substr(index + 1) + '/out';
|
headerOut = relativeDirname.substr(index + 1) + '/out';
|
||||||
}
|
}
|
||||||
|
|
||||||
function createPipeline(build, emitError) {
|
function createPipeline(build, emitError) {
|
||||||
const reporter = createReporter();
|
const reporter = createReporter();
|
||||||
|
|
||||||
overrideOptions.inlineSources = Boolean(build);
|
tsOptions.inlineSources = !!build;
|
||||||
overrideOptions.base = path.dirname(absolutePath);
|
tsOptions.base = path.dirname(absolutePath);
|
||||||
|
|
||||||
const compilation = tsb.create(absolutePath, overrideOptions, false, err => reporter(err.toString()));
|
const compilation = tsb.create(tsOptions, null, null, err => reporter(err.toString()));
|
||||||
|
|
||||||
const pipeline = function () {
|
return function () {
|
||||||
const input = es.through();
|
const input = es.through();
|
||||||
const tsFilter = filter(['**/*.ts', '!**/lib/lib*.d.ts', '!**/node_modules/**'], { restore: true });
|
const tsFilter = filter(['**/*.ts', '!**/lib/lib*.d.ts', '!**/node_modules/**'], { restore: true });
|
||||||
const output = input
|
const output = input
|
||||||
@@ -103,70 +107,66 @@ const tasks = compilations.map(function (tsconfigFile) {
|
|||||||
|
|
||||||
return es.duplex(input, output);
|
return es.duplex(input, output);
|
||||||
};
|
};
|
||||||
|
|
||||||
// add src-stream for project files
|
|
||||||
pipeline.tsProjectSrc = () => {
|
|
||||||
return compilation.src(srcOpts);
|
|
||||||
};
|
|
||||||
return pipeline;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const cleanTask = task.define(`clean-extension-${name}`, util.rimraf(out));
|
const srcOpts = { cwd: path.dirname(__dirname), base: srcBase };
|
||||||
|
|
||||||
const compileTask = task.define(`compile-extension:${name}`, task.series(cleanTask, () => {
|
gulp.task(clean, cb => rimraf(out, cb));
|
||||||
const pipeline = createPipeline(sqlLocalizedExtensions.includes(name), true); // {{SQL CARBON EDIT}}
|
|
||||||
const input = pipeline.tsProjectSrc();
|
gulp.task(compile, [clean], () => {
|
||||||
|
const pipeline = createPipeline(false, true);
|
||||||
|
const input = gulp.src(src, srcOpts);
|
||||||
|
|
||||||
return input
|
return input
|
||||||
.pipe(pipeline())
|
.pipe(pipeline())
|
||||||
.pipe(gulp.dest(out));
|
.pipe(gulp.dest(out));
|
||||||
}));
|
});
|
||||||
|
|
||||||
const watchTask = task.define(`watch-extension:${name}`, task.series(cleanTask, () => {
|
gulp.task(watch, [clean], () => {
|
||||||
const pipeline = createPipeline(false);
|
const pipeline = createPipeline(false);
|
||||||
const input = pipeline.tsProjectSrc();
|
const input = gulp.src(src, srcOpts);
|
||||||
const watchInput = watcher(src, { ...srcOpts, ...{ readDelay: 200 } });
|
const watchInput = watcher(src, srcOpts);
|
||||||
|
|
||||||
return watchInput
|
return watchInput
|
||||||
.pipe(util.incremental(pipeline, input))
|
.pipe(util.incremental(pipeline, input))
|
||||||
.pipe(gulp.dest(out));
|
.pipe(gulp.dest(out));
|
||||||
}));
|
});
|
||||||
|
|
||||||
const compileBuildTask = task.define(`compile-build-extension-${name}`, task.series(cleanTask, () => {
|
gulp.task(cleanBuild, cb => rimraf(out, cb));
|
||||||
|
|
||||||
|
gulp.task(compileBuild, [clean], () => {
|
||||||
const pipeline = createPipeline(true, true);
|
const pipeline = createPipeline(true, true);
|
||||||
const input = pipeline.tsProjectSrc();
|
const input = gulp.src(src, srcOpts);
|
||||||
|
|
||||||
return input
|
return input
|
||||||
.pipe(pipeline())
|
.pipe(pipeline())
|
||||||
.pipe(gulp.dest(out));
|
.pipe(gulp.dest(out));
|
||||||
}));
|
});
|
||||||
|
|
||||||
// Tasks
|
gulp.task(watchBuild, [clean], () => {
|
||||||
gulp.task(compileTask);
|
const pipeline = createPipeline(true);
|
||||||
gulp.task(watchTask);
|
const input = gulp.src(src, srcOpts);
|
||||||
|
const watchInput = watcher(src, srcOpts);
|
||||||
|
|
||||||
return { compileTask, watchTask, compileBuildTask };
|
return watchInput
|
||||||
|
.pipe(util.incremental(() => pipeline(), input))
|
||||||
|
.pipe(gulp.dest(out));
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
clean: clean,
|
||||||
|
compile: compile,
|
||||||
|
watch: watch,
|
||||||
|
cleanBuild: cleanBuild,
|
||||||
|
compileBuild: compileBuild,
|
||||||
|
watchBuild: watchBuild
|
||||||
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
const compileExtensionsTask = task.define('compile-extensions', task.parallel(...tasks.map(t => t.compileTask)));
|
gulp.task('clean-extensions', tasks.map(t => t.clean));
|
||||||
gulp.task(compileExtensionsTask);
|
gulp.task('compile-extensions', tasks.map(t => t.compile));
|
||||||
exports.compileExtensionsTask = compileExtensionsTask;
|
gulp.task('watch-extensions', tasks.map(t => t.watch));
|
||||||
|
|
||||||
const watchExtensionsTask = task.define('watch-extensions', task.parallel(...tasks.map(t => t.watchTask)));
|
gulp.task('clean-extensions-build', tasks.map(t => t.cleanBuild));
|
||||||
gulp.task(watchExtensionsTask);
|
gulp.task('compile-extensions-build', tasks.map(t => t.compileBuild));
|
||||||
exports.watchExtensionsTask = watchExtensionsTask;
|
gulp.task('watch-extensions-build', tasks.map(t => t.watchBuild));
|
||||||
|
|
||||||
const compileExtensionsBuildLegacyTask = task.define('compile-extensions-build-legacy', task.parallel(...tasks.map(t => t.compileBuildTask)));
|
|
||||||
gulp.task(compileExtensionsBuildLegacyTask);
|
|
||||||
|
|
||||||
// Azure Pipelines
|
|
||||||
|
|
||||||
const cleanExtensionsBuildTask = task.define('clean-extensions-build', util.rimraf('.build/extensions'));
|
|
||||||
const compileExtensionsBuildTask = task.define('compile-extensions-build', task.series(
|
|
||||||
cleanExtensionsBuildTask,
|
|
||||||
task.define('bundle-extensions-build', () => ext.packageLocalExtensionsStream().pipe(gulp.dest('.build'))),
|
|
||||||
task.define('bundle-marketplace-extensions-build', () => ext.packageMarketplaceExtensionsStream().pipe(gulp.dest('.build')))
|
|
||||||
));
|
|
||||||
|
|
||||||
gulp.task(compileExtensionsBuildTask);
|
|
||||||
exports.compileExtensionsBuildTask = compileExtensionsBuildTask;
|
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ const vfs = require('vinyl-fs');
|
|||||||
const path = require('path');
|
const path = require('path');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const pall = require('p-all');
|
const pall = require('p-all');
|
||||||
const task = require('./lib/task');
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hygiene works by creating cascading subsets of all our files and
|
* Hygiene works by creating cascading subsets of all our files and
|
||||||
@@ -43,23 +42,20 @@ const indentationFilter = [
|
|||||||
|
|
||||||
// except specific files
|
// except specific files
|
||||||
'!ThirdPartyNotices.txt',
|
'!ThirdPartyNotices.txt',
|
||||||
'!LICENSE.{txt,rtf}',
|
'!LICENSE.txt',
|
||||||
'!LICENSES.chromium.html',
|
|
||||||
'!**/LICENSE',
|
'!**/LICENSE',
|
||||||
'!src/vs/nls.js',
|
'!src/vs/nls.js',
|
||||||
'!src/vs/nls.build.js',
|
'!src/vs/nls.build.js',
|
||||||
'!src/vs/css.js',
|
'!src/vs/css.js',
|
||||||
'!src/vs/css.build.js',
|
'!src/vs/css.build.js',
|
||||||
'!src/vs/loader.js',
|
'!src/vs/loader.js',
|
||||||
'!src/vs/base/common/insane/insane.js',
|
|
||||||
'!src/vs/base/common/marked/marked.js',
|
'!src/vs/base/common/marked/marked.js',
|
||||||
|
'!src/vs/base/common/winjs.base.js',
|
||||||
'!src/vs/base/node/terminateProcess.sh',
|
'!src/vs/base/node/terminateProcess.sh',
|
||||||
'!src/vs/base/node/cpuUsage.sh',
|
'!src/vs/base/node/cpuUsage.sh',
|
||||||
'!test/assert.js',
|
'!test/assert.js',
|
||||||
'!build/testSetup.js',
|
|
||||||
|
|
||||||
// except specific folders
|
// except specific folders
|
||||||
'!test/automation/out/**',
|
|
||||||
'!test/smoke/out/**',
|
'!test/smoke/out/**',
|
||||||
'!extensions/vscode-api-tests/testWorkspace/**',
|
'!extensions/vscode-api-tests/testWorkspace/**',
|
||||||
'!extensions/vscode-api-tests/testWorkspace2/**',
|
'!extensions/vscode-api-tests/testWorkspace2/**',
|
||||||
@@ -68,12 +64,11 @@ const indentationFilter = [
|
|||||||
|
|
||||||
// except multiple specific files
|
// except multiple specific files
|
||||||
'!**/package.json',
|
'!**/package.json',
|
||||||
'!**/package-lock.json', // {{SQL CARBON EDIT}}
|
|
||||||
'!**/yarn.lock',
|
'!**/yarn.lock',
|
||||||
'!**/yarn-error.log',
|
'!**/yarn-error.log',
|
||||||
|
|
||||||
// except multiple specific folders
|
// except multiple specific folders
|
||||||
'!**/codicon/**',
|
'!**/octicons/**',
|
||||||
'!**/fixtures/**',
|
'!**/fixtures/**',
|
||||||
'!**/lib/**',
|
'!**/lib/**',
|
||||||
'!extensions/**/out/**',
|
'!extensions/**/out/**',
|
||||||
@@ -87,24 +82,14 @@ 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,tslintRules}/**/*.js',
|
||||||
'!build/**/*.sh',
|
'!build/**/*.sh',
|
||||||
'!build/azure-pipelines/**/*.js',
|
'!build/azure-pipelines/**/*.js',
|
||||||
'!build/azure-pipelines/**/*.config',
|
'!build/azure-pipelines/**/*.config',
|
||||||
'!**/Dockerfile',
|
'!**/Dockerfile',
|
||||||
'!**/Dockerfile.*',
|
|
||||||
'!**/*.Dockerfile',
|
'!**/*.Dockerfile',
|
||||||
'!**/*.dockerfile',
|
'!**/*.dockerfile',
|
||||||
'!extensions/markdown-language-features/media/*.js',
|
'!extensions/markdown-language-features/media/*.js'
|
||||||
// {{SQL CARBON EDIT}}
|
|
||||||
'!**/*.{xlf,docx,sql,vsix,bacpac,ipynb}',
|
|
||||||
'!extensions/mssql/sqltoolsservice/**',
|
|
||||||
'!extensions/import/flatfileimportservice/**',
|
|
||||||
'!extensions/admin-tool-ext-win/ssmsmin/**',
|
|
||||||
'!extensions/resource-deployment/notebooks/**',
|
|
||||||
'!extensions/mssql/notebooks/**',
|
|
||||||
'!extensions/big-data-cluster/src/bigDataCluster/controller/apiGenerated.ts',
|
|
||||||
'!extensions/big-data-cluster/src/bigDataCluster/controller/clusterApiGenerated2.ts'
|
|
||||||
];
|
];
|
||||||
|
|
||||||
const copyrightFilter = [
|
const copyrightFilter = [
|
||||||
@@ -125,50 +110,13 @@ const copyrightFilter = [
|
|||||||
'!**/*.opts',
|
'!**/*.opts',
|
||||||
'!**/*.disabled',
|
'!**/*.disabled',
|
||||||
'!**/*.code-workspace',
|
'!**/*.code-workspace',
|
||||||
'!**/promise-polyfill/polyfill.js',
|
|
||||||
'!build/**/*.init',
|
'!build/**/*.init',
|
||||||
'!resources/linux/snap/snapcraft.yaml',
|
'!resources/linux/snap/snapcraft.yaml',
|
||||||
'!resources/linux/snap/electron-launch',
|
'!resources/linux/snap/electron-launch',
|
||||||
'!resources/win32/bin/code.js',
|
'!resources/win32/bin/code.js',
|
||||||
'!resources/completions/**',
|
|
||||||
'!extensions/markdown-language-features/media/highlight.css',
|
'!extensions/markdown-language-features/media/highlight.css',
|
||||||
'!extensions/html-language-features/server/src/modes/typescript/*',
|
'!extensions/html-language-features/server/src/modes/typescript/*',
|
||||||
'!extensions/*/server/bin/*',
|
'!extensions/*/server/bin/*'
|
||||||
'!src/vs/editor/test/node/classification/typescript-test.ts',
|
|
||||||
'!scripts/code-web.js',
|
|
||||||
// {{SQL CARBON EDIT}}
|
|
||||||
'!extensions/notebook/src/intellisense/text.ts',
|
|
||||||
'!extensions/mssql/src/hdfs/webhdfs.ts',
|
|
||||||
'!src/sql/workbench/parts/notebook/browser/outputs/tableRenderers.ts',
|
|
||||||
'!src/sql/workbench/parts/notebook/common/models/url.ts',
|
|
||||||
'!src/sql/workbench/parts/notebook/browser/models/renderMimeInterfaces.ts',
|
|
||||||
'!src/sql/workbench/parts/notebook/browser/models/outputProcessor.ts',
|
|
||||||
'!src/sql/workbench/parts/notebook/browser/models/mimemodel.ts',
|
|
||||||
'!src/sql/workbench/parts/notebook/browser/cellViews/media/*.css',
|
|
||||||
'!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/headerFilter.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/autoSizeColumns.plugin.ts',
|
|
||||||
'!src/sql/workbench/parts/notebook/browser/outputs/sanitizer.ts',
|
|
||||||
'!src/sql/workbench/parts/notebook/browser/outputs/renderers.ts',
|
|
||||||
'!src/sql/workbench/parts/notebook/browser/outputs/registry.ts',
|
|
||||||
'!src/sql/workbench/parts/notebook/browser/outputs/factories.ts',
|
|
||||||
'!src/sql/workbench/parts/notebook/common/models/nbformat.ts',
|
|
||||||
'!extensions/markdown-language-features/media/tomorrow.css',
|
|
||||||
'!src/sql/workbench/browser/modelComponents/media/highlight.css',
|
|
||||||
'!src/sql/workbench/parts/notebook/electron-browser/cellViews/media/highlight.css',
|
|
||||||
'!extensions/mssql/sqltoolsservice/**',
|
|
||||||
'!extensions/import/flatfileimportservice/**',
|
|
||||||
'!extensions/notebook/src/prompts/**',
|
|
||||||
'!extensions/mssql/src/prompts/**',
|
|
||||||
'!extensions/notebook/resources/jupyter_config/**',
|
|
||||||
'!extensions/query-history/images/**',
|
|
||||||
'!**/*.gif',
|
|
||||||
'!**/*.xlf',
|
|
||||||
'!**/*.dacpac',
|
|
||||||
'!**/*.bacpac'
|
|
||||||
];
|
];
|
||||||
|
|
||||||
const eslintFilter = [
|
const eslintFilter = [
|
||||||
@@ -179,82 +127,26 @@ const eslintFilter = [
|
|||||||
'!src/vs/nls.js',
|
'!src/vs/nls.js',
|
||||||
'!src/vs/css.build.js',
|
'!src/vs/css.build.js',
|
||||||
'!src/vs/nls.build.js',
|
'!src/vs/nls.build.js',
|
||||||
'!src/**/insane.js',
|
'!src/**/winjs.base.js',
|
||||||
'!src/**/marked.js',
|
'!src/**/marked.js',
|
||||||
'!**/test/**'
|
'!**/test/**'
|
||||||
];
|
];
|
||||||
|
|
||||||
const tslintBaseFilter = [
|
const tslintFilter = [
|
||||||
|
'src/**/*.ts',
|
||||||
|
'test/**/*.ts',
|
||||||
|
'extensions/**/*.ts',
|
||||||
'!**/fixtures/**',
|
'!**/fixtures/**',
|
||||||
'!**/typings/**',
|
'!**/typings/**',
|
||||||
'!**/node_modules/**',
|
'!**/node_modules/**',
|
||||||
'!extensions/typescript-basics/test/colorize-fixtures/**',
|
'!extensions/typescript/test/colorize-fixtures/**',
|
||||||
'!extensions/vscode-api-tests/testWorkspace/**',
|
'!extensions/vscode-api-tests/testWorkspace/**',
|
||||||
'!extensions/vscode-api-tests/testWorkspace2/**',
|
'!extensions/vscode-api-tests/testWorkspace2/**',
|
||||||
'!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/tokenApiGenerated.ts' // {{SQL CARBON EDIT}},
|
|
||||||
];
|
];
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
const sqlFilter = [
|
|
||||||
'src/sql/**',
|
|
||||||
'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',
|
|
||||||
'!src/**/*.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.',
|
||||||
@@ -271,63 +163,18 @@ gulp.task('eslint', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('tslint', () => {
|
gulp.task('tslint', () => {
|
||||||
return es.merge([
|
// {{SQL CARBON EDIT}}
|
||||||
|
const options = { emitError: false };
|
||||||
|
|
||||||
// Core: include type information (required by certain rules like no-nodejs-globals)
|
return vfs.src(all, { base: '.', follow: true, allowEmpty: true })
|
||||||
vfs.src(all, { base: '.', follow: true, allowEmpty: true })
|
.pipe(filter(tslintFilter))
|
||||||
.pipe(filter(tslintCoreFilter))
|
.pipe(gulptslint.default({ rulesDirectory: 'build/lib/tslint' }))
|
||||||
.pipe(gulptslint.default({ rulesDirectory: 'build/lib/tslint', program: tslint.Linter.createProgram('src/tsconfig.json') }))
|
.pipe(gulptslint.default.report(options));
|
||||||
.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) {
|
|
||||||
const actual = require(path.join(__dirname, '..', actualPath));
|
|
||||||
const rootPackageJSON = require('../package.json');
|
|
||||||
|
|
||||||
for (let depName in actual.dependencies) {
|
|
||||||
const depVersion = actual.dependencies[depName];
|
|
||||||
const rootDepVersion = rootPackageJSON.dependencies[depName];
|
|
||||||
if (!rootDepVersion) {
|
|
||||||
// missing in root is allowed
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (depVersion !== rootDepVersion) {
|
|
||||||
this.emit('error', `The dependency ${depName} in '${actualPath}' (${depVersion}) is different than in the root package.json (${rootDepVersion})`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const checkPackageJSONTask = task.define('check-package-json', () => {
|
|
||||||
return gulp.src('package.json')
|
|
||||||
.pipe(es.through(function() {
|
|
||||||
checkPackageJSON.call(this, 'remote/package.json');
|
|
||||||
checkPackageJSON.call(this, 'remote/web/package.json');
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
gulp.task(checkPackageJSONTask);
|
|
||||||
|
|
||||||
|
|
||||||
function hygiene(some) {
|
function hygiene(some) {
|
||||||
let errorCount = 0;
|
let errorCount = 0;
|
||||||
|
|
||||||
const productJson = es.through(function (file) {
|
|
||||||
// const product = JSON.parse(file.contents.toString('utf8'));
|
|
||||||
|
|
||||||
// if (product.extensionsGallery) { // {{SQL CARBON EDIT}} @todo we need to research on what the point of this is
|
|
||||||
// console.error('product.json: Contains "extensionsGallery"');
|
|
||||||
// errorCount++;
|
|
||||||
// }
|
|
||||||
|
|
||||||
this.emit('data', file);
|
|
||||||
});
|
|
||||||
|
|
||||||
const indentation = es.through(function (file) {
|
const indentation = es.through(function (file) {
|
||||||
const lines = file.contents.toString('utf8').split(/\r\n|\r|\n/);
|
const lines = file.contents.toString('utf8').split(/\r\n|\r|\n/);
|
||||||
file.__lines = lines;
|
file.__lines = lines;
|
||||||
@@ -350,8 +197,8 @@ function hygiene(some) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const copyrights = es.through(function (file) {
|
const copyrights = es.through(function (file) {
|
||||||
|
|
||||||
const lines = file.__lines;
|
const lines = file.__lines;
|
||||||
|
|
||||||
for (let i = 0; i < copyrightHeaderLines.length; i++) {
|
for (let i = 0; i < copyrightHeaderLines.length; i++) {
|
||||||
if (lines[i] !== copyrightHeaderLines[i]) {
|
if (lines[i] !== copyrightHeaderLines[i]) {
|
||||||
console.error(file.relative + ': Missing or bad copyright statement');
|
console.error(file.relative + ': Missing or bad copyright statement');
|
||||||
@@ -383,7 +230,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:', file.relative);
|
||||||
errorCount++;
|
errorCount++;
|
||||||
}
|
}
|
||||||
cb(null, file);
|
cb(null, file);
|
||||||
@@ -393,23 +240,6 @@ 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 tslintConfiguration = tslint.Configuration.findConfiguration('tslint.json', '.');
|
||||||
const tslintOptions = { fix: false, formatter: 'json' };
|
const tslintOptions = { fix: false, formatter: 'json' };
|
||||||
const tsLinter = new tslint.Linter(tslintOptions);
|
const tsLinter = new tslint.Linter(tslintOptions);
|
||||||
@@ -428,90 +258,31 @@ function hygiene(some) {
|
|||||||
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 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(process.env['BUILD_SOURCEVERSION'] ? es.through() : productJson)
|
|
||||||
.pipe(productJsonFilter.restore)
|
|
||||||
.pipe(filter(indentationFilter))
|
.pipe(filter(indentationFilter))
|
||||||
.pipe(indentation)
|
.pipe(indentation)
|
||||||
.pipe(filter(copyrightFilter))
|
.pipe(filter(copyrightFilter));
|
||||||
.pipe(copyrights);
|
// {{SQL CARBON EDIT}}
|
||||||
|
// .pipe(copyrights);
|
||||||
|
|
||||||
let typescript = result
|
const typescript = result
|
||||||
.pipe(filter(tslintHygieneFilter))
|
.pipe(filter(tslintFilter))
|
||||||
.pipe(formatting);
|
.pipe(formatting)
|
||||||
|
.pipe(tsl);
|
||||||
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(eslintFilter))
|
||||||
.pipe(gulpeslint('src/.eslintrc'))
|
.pipe(gulpeslint('src/.eslintrc'))
|
||||||
.pipe(gulpeslint.formatEach('compact'))
|
.pipe(gulpeslint.formatEach('compact'));
|
||||||
.pipe(gulpeslint.failAfterError());
|
// {{SQL CARBON EDIT}}
|
||||||
|
// .pipe(gulpeslint.failAfterError());
|
||||||
|
|
||||||
let count = 0;
|
let count = 0;
|
||||||
return es.merge(typescript, javascript)
|
return es.merge(typescript, javascript)
|
||||||
.pipe(es.through(function (data) {
|
.pipe(es.through(function (data) {
|
||||||
count++;
|
// {{SQL CARBON EDIT}}
|
||||||
if (process.env['TRAVIS'] && count % 10 === 0) {
|
this.emit('end');
|
||||||
process.stdout.write('.');
|
|
||||||
}
|
|
||||||
this.emit('data', data);
|
|
||||||
}, function () {
|
|
||||||
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) {
|
|
||||||
this.emit('error', 'Hygiene failed with ' + errorCount + ' errors. Check \'build/gulpfile.hygiene.js\'.');
|
|
||||||
} else {
|
|
||||||
this.emit('end');
|
|
||||||
}
|
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -529,7 +300,7 @@ function createGitIndexVinyls(paths) {
|
|||||||
return e(err);
|
return e(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
cp.exec(`git show ":${relativePath}"`, { maxBuffer: 2000 * 1024, encoding: 'buffer' }, (err, out) => {
|
cp.exec(`git show :${relativePath}`, { maxBuffer: 2000 * 1024, encoding: 'buffer' }, (err, out) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
return e(err);
|
return e(err);
|
||||||
}
|
}
|
||||||
@@ -548,7 +319,7 @@ function createGitIndexVinyls(paths) {
|
|||||||
.then(r => r.filter(p => !!p));
|
.then(r => r.filter(p => !!p));
|
||||||
}
|
}
|
||||||
|
|
||||||
gulp.task('hygiene', task.series(checkPackageJSONTask, () => hygiene()));
|
gulp.task('hygiene', () => hygiene());
|
||||||
|
|
||||||
// this allows us to run hygiene as a git pre-commit hook
|
// this allows us to run hygiene as a git pre-commit hook
|
||||||
if (require.main === module) {
|
if (require.main === module) {
|
||||||
|
|||||||
@@ -6,13 +6,21 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const gulp = require('gulp');
|
const gulp = require('gulp');
|
||||||
|
const json = require('gulp-json-editor');
|
||||||
|
const buffer = require('gulp-buffer');
|
||||||
|
const filter = require('gulp-filter');
|
||||||
|
const es = require('event-stream');
|
||||||
|
const util = require('./lib/util');
|
||||||
|
const remote = require('gulp-remote-src');
|
||||||
|
const zip = require('gulp-vinyl-zip');
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
const jeditor = require('gulp-json-editor');
|
const jeditor = require('gulp-json-editor');
|
||||||
const product = require('../product.json');
|
|
||||||
|
const pkg = require('../package.json');
|
||||||
|
|
||||||
gulp.task('mixin', function () {
|
gulp.task('mixin', function () {
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
const updateUrl = process.env['SQLOPS_UPDATEURL'];
|
const updateUrl = process.env['SQLOPS_UPDATEURL'];
|
||||||
if (!updateUrl) {
|
if (!updateUrl) {
|
||||||
console.log('Missing SQLOPS_UPDATEURL, skipping mixin');
|
console.log('Missing SQLOPS_UPDATEURL, skipping mixin');
|
||||||
@@ -26,53 +34,19 @@ gulp.task('mixin', function () {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}} - apply ADS insiders values if needed
|
// {{SQL CARBON EDIT}}
|
||||||
|
let serviceUrl = 'https://sqlopsextensions.blob.core.windows.net/marketplace/v1/extensionsGallery.json';
|
||||||
|
if (quality === 'insider') {
|
||||||
|
serviceUrl = `https://sqlopsextensions.blob.core.windows.net/marketplace/v1/extensionsGallery-${quality}.json`;
|
||||||
|
}
|
||||||
let newValues = {
|
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,
|
"updateUrl": updateUrl,
|
||||||
"quality": quality,
|
"quality": quality,
|
||||||
"extensionsGallery": {
|
"extensionsGallery": {
|
||||||
"serviceUrl": 'https://sqlopsextensions.blob.core.windows.net/marketplace/v1/extensionsGallery.json'
|
"serviceUrl": serviceUrl
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
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')
|
return gulp.src('./product.json')
|
||||||
.pipe(jeditor(newValues))
|
.pipe(jeditor(newValues))
|
||||||
.pipe(gulp.dest('.'));
|
.pipe(gulp.dest('.'));
|
||||||
|
|||||||
@@ -1,145 +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');
|
|
||||||
|
|
||||||
const path = require('path');
|
|
||||||
const es = require('event-stream');
|
|
||||||
const util = require('./lib/util');
|
|
||||||
const task = require('./lib/task');
|
|
||||||
const vfs = require('vinyl-fs');
|
|
||||||
const flatmap = require('gulp-flatmap');
|
|
||||||
const gunzip = require('gulp-gunzip');
|
|
||||||
const untar = require('gulp-untar');
|
|
||||||
const File = require('vinyl');
|
|
||||||
const fs = require('fs');
|
|
||||||
const remote = require('gulp-remote-retry-src');
|
|
||||||
const rename = require('gulp-rename');
|
|
||||||
const filter = require('gulp-filter');
|
|
||||||
const cp = require('child_process');
|
|
||||||
|
|
||||||
const REPO_ROOT = path.dirname(__dirname);
|
|
||||||
|
|
||||||
const BUILD_TARGETS = [
|
|
||||||
{ platform: 'win32', arch: 'ia32', pkgTarget: 'node8-win-x86' },
|
|
||||||
{ platform: 'win32', arch: 'x64', pkgTarget: 'node8-win-x64' },
|
|
||||||
{ platform: 'darwin', arch: null, pkgTarget: 'node8-macos-x64' },
|
|
||||||
{ platform: 'linux', arch: 'ia32', pkgTarget: 'node8-linux-x86' },
|
|
||||||
{ platform: 'linux', arch: 'x64', pkgTarget: 'node8-linux-x64' },
|
|
||||||
{ platform: 'linux', arch: 'armhf', pkgTarget: 'node8-linux-armv7' },
|
|
||||||
{ platform: 'linux', arch: 'arm64', pkgTarget: 'node8-linux-arm64' },
|
|
||||||
{ platform: 'linux', arch: 'alpine', pkgTarget: 'node8-linux-alpine' },
|
|
||||||
];
|
|
||||||
|
|
||||||
const noop = () => { return Promise.resolve(); };
|
|
||||||
|
|
||||||
gulp.task('vscode-reh-win32-ia32-min', noop);
|
|
||||||
gulp.task('vscode-reh-win32-x64-min', noop);
|
|
||||||
gulp.task('vscode-reh-darwin-min', noop);
|
|
||||||
gulp.task('vscode-reh-linux-x64-min', noop);
|
|
||||||
gulp.task('vscode-reh-linux-armhf-min', noop);
|
|
||||||
gulp.task('vscode-reh-linux-arm64-min', noop);
|
|
||||||
gulp.task('vscode-reh-linux-alpine-min', noop);
|
|
||||||
|
|
||||||
gulp.task('vscode-reh-web-win32-ia32-min', noop);
|
|
||||||
gulp.task('vscode-reh-web-win32-x64-min', noop);
|
|
||||||
gulp.task('vscode-reh-web-darwin-min', noop);
|
|
||||||
gulp.task('vscode-reh-web-linux-x64-min', noop);
|
|
||||||
gulp.task('vscode-reh-web-linux-alpine-min', noop);
|
|
||||||
|
|
||||||
function getNodeVersion() {
|
|
||||||
const yarnrc = fs.readFileSync(path.join(REPO_ROOT, 'remote', '.yarnrc'), 'utf8');
|
|
||||||
const target = /^target "(.*)"$/m.exec(yarnrc)[1];
|
|
||||||
return target;
|
|
||||||
}
|
|
||||||
|
|
||||||
const nodeVersion = getNodeVersion();
|
|
||||||
|
|
||||||
BUILD_TARGETS.forEach(({ platform, arch }) => {
|
|
||||||
if (platform === 'darwin') {
|
|
||||||
arch = 'x64';
|
|
||||||
}
|
|
||||||
|
|
||||||
gulp.task(task.define(`node-${platform}-${arch}`, () => {
|
|
||||||
const nodePath = path.join('.build', 'node', `v${nodeVersion}`, `${platform}-${arch}`);
|
|
||||||
|
|
||||||
if (!fs.existsSync(nodePath)) {
|
|
||||||
util.rimraf(nodePath);
|
|
||||||
|
|
||||||
return nodejs(platform, arch)
|
|
||||||
.pipe(vfs.dest(nodePath));
|
|
||||||
}
|
|
||||||
|
|
||||||
return Promise.resolve(null);
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
|
|
||||||
const defaultNodeTask = gulp.task(`node-${process.platform}-${process.arch}`);
|
|
||||||
|
|
||||||
if (defaultNodeTask) {
|
|
||||||
gulp.task(task.define('node', defaultNodeTask));
|
|
||||||
}
|
|
||||||
|
|
||||||
function nodejs(platform, arch) {
|
|
||||||
if (arch === 'ia32') {
|
|
||||||
arch = 'x86';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (platform === 'win32') {
|
|
||||||
return remote(`/dist/v${nodeVersion}/win-${arch}/node.exe`, { base: 'https://nodejs.org' })
|
|
||||||
.pipe(rename('node.exe'));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (arch === 'alpine') {
|
|
||||||
const contents = cp.execSync(`docker run --rm node:${nodeVersion}-alpine /bin/sh -c 'cat \`which node\`'`, { maxBuffer: 100 * 1024 * 1024, encoding: 'buffer' });
|
|
||||||
return es.readArray([new File({ path: 'node', contents, stat: { mode: parseInt('755', 8) } })]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (platform === 'darwin') {
|
|
||||||
arch = 'x64';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (arch === 'armhf') {
|
|
||||||
arch = 'armv7l';
|
|
||||||
}
|
|
||||||
|
|
||||||
return remote(`/dist/v${nodeVersion}/node-v${nodeVersion}-${platform}-${arch}.tar.gz`, { base: 'https://nodejs.org' })
|
|
||||||
.pipe(flatmap(stream => stream.pipe(gunzip()).pipe(untar())))
|
|
||||||
.pipe(filter('**/node'))
|
|
||||||
.pipe(util.setExecutableBit('**'))
|
|
||||||
.pipe(rename('node'));
|
|
||||||
}
|
|
||||||
|
|
||||||
function mixinServer(watch) {
|
|
||||||
const packageJSONPath = path.join(path.dirname(__dirname), 'package.json');
|
|
||||||
function exec(cmdLine) {
|
|
||||||
console.log(cmdLine);
|
|
||||||
cp.execSync(cmdLine, { stdio: "inherit" });
|
|
||||||
}
|
|
||||||
function checkout() {
|
|
||||||
const packageJSON = JSON.parse(fs.readFileSync(packageJSONPath).toString());
|
|
||||||
exec('git fetch distro');
|
|
||||||
exec(`git checkout ${packageJSON['distro']} -- src/vs/server resources/server`);
|
|
||||||
exec('git reset HEAD src/vs/server resources/server');
|
|
||||||
}
|
|
||||||
checkout();
|
|
||||||
if (watch) {
|
|
||||||
console.log('Enter watch mode (observing package.json)');
|
|
||||||
const watcher = fs.watch(packageJSONPath);
|
|
||||||
watcher.addListener('change', () => {
|
|
||||||
try {
|
|
||||||
checkout();
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return Promise.resolve();
|
|
||||||
}
|
|
||||||
|
|
||||||
gulp.task(task.define('mixin-server', () => mixinServer(false)));
|
|
||||||
gulp.task(task.define('mixin-server-watch', () => mixinServer(true)));
|
|
||||||
@@ -4,15 +4,12 @@
|
|||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const gulp = require('gulp');
|
const gulp = require('gulp');
|
||||||
const util = require('./lib/util');
|
const util = require('./lib/util');
|
||||||
const tsfmt = require('typescript-formatter');
|
const tsfmt = require('typescript-formatter');
|
||||||
const es = require('event-stream');
|
const es = require('event-stream');
|
||||||
const filter = require('gulp-filter');
|
const filter = require('gulp-filter');
|
||||||
const del = require('del');
|
|
||||||
const serviceDownloader = require('service-downloader').ServiceDownloadProvider;
|
|
||||||
const platformInfo = require('service-downloader/out/platform').PlatformInformation;
|
|
||||||
const path = require('path');
|
|
||||||
|
|
||||||
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'));
|
||||||
@@ -21,117 +18,67 @@ gulp.task('fmt', () => formatStagedFiles());
|
|||||||
const formatFiles = (some) => {
|
const formatFiles = (some) => {
|
||||||
const formatting = es.map(function (file, cb) {
|
const formatting = es.map(function (file, cb) {
|
||||||
|
|
||||||
tsfmt.processString(file.path, file.contents.toString('utf8'), {
|
tsfmt.processString(file.path, file.contents.toString('utf8'), {
|
||||||
replace: true,
|
replace: true,
|
||||||
tsfmt: true,
|
tsfmt: true,
|
||||||
tslint: true,
|
tslint: true,
|
||||||
tsconfig: true
|
tsconfig: true
|
||||||
// verbose: true
|
// verbose: true
|
||||||
}).then(result => {
|
}).then(result => {
|
||||||
console.info('ran formatting on file ' + file.path + ' result: ' + result.message);
|
console.info('ran formatting on file ' + file.path + ' result: ' + result.message);
|
||||||
if (result.error) {
|
if (result.error) {
|
||||||
console.error(result.message);
|
console.error(result.message);
|
||||||
}
|
errorCount++;
|
||||||
cb(null, file);
|
}
|
||||||
|
cb(null, file);
|
||||||
|
|
||||||
}, err => {
|
}, err => {
|
||||||
cb(err);
|
cb(err);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
return gulp.src(some, { base: '.' })
|
||||||
return gulp.src(some, {
|
.pipe(filter(f => !f.stat.isDirectory()))
|
||||||
base: '.'
|
.pipe(formatting);
|
||||||
})
|
|
||||||
.pipe(filter(f => !f.stat.isDirectory()))
|
|
||||||
.pipe(formatting);
|
|
||||||
|
|
||||||
};
|
}
|
||||||
|
|
||||||
const formatStagedFiles = () => {
|
const formatStagedFiles = () => {
|
||||||
const cp = require('child_process');
|
const cp = require('child_process');
|
||||||
cp.exec('git diff --name-only', {
|
cp.exec('git diff --name-only', { maxBuffer: 2000 * 1024 }, (err, out) => {
|
||||||
maxBuffer: 2000 * 1024
|
if (err) {
|
||||||
}, (err, out) => {
|
console.error();
|
||||||
if (err) {
|
console.error(err);
|
||||||
console.error();
|
process.exit(1);
|
||||||
console.error(err);
|
}
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
const some = out
|
const some = out
|
||||||
.split(/\r?\n/)
|
.split(/\r?\n/)
|
||||||
.filter(l => !!l)
|
.filter(l => !!l)
|
||||||
.filter(l => l.match(/.*.ts$/i));
|
.filter(l => l.match(/.*.ts$/i));
|
||||||
|
|
||||||
formatFiles(some).on('error', err => {
|
formatFiles(some).on('error', err => {
|
||||||
console.error();
|
console.error();
|
||||||
console.error(err);
|
console.error(err);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
cp.exec('git diff --cached --name-only', {
|
cp.exec('git diff --cached --name-only', { maxBuffer: 2000 * 1024 }, (err, out) => {
|
||||||
maxBuffer: 2000 * 1024
|
if (err) {
|
||||||
}, (err, out) => {
|
console.error();
|
||||||
if (err) {
|
console.error(err);
|
||||||
console.error();
|
process.exit(1);
|
||||||
console.error(err);
|
}
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
const some = out
|
const some = out
|
||||||
.split(/\r?\n/)
|
.split(/\r?\n/)
|
||||||
.filter(l => !!l)
|
.filter(l => !!l)
|
||||||
.filter(l => l.match(/.*.ts$/i));
|
.filter(l => l.match(/.*.ts$/i));
|
||||||
|
|
||||||
formatFiles(some).on('error', err => {
|
formatFiles(some).on('error', err => {
|
||||||
console.error();
|
console.error();
|
||||||
console.error(err);
|
console.error(err);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
}
|
||||||
};
|
|
||||||
|
|
||||||
function installService() {
|
|
||||||
let config = require('../extensions/mssql/config.json');
|
|
||||||
return platformInfo.getCurrent().then(p => {
|
|
||||||
let runtime = p.runtimeId;
|
|
||||||
// fix path since it won't be correct
|
|
||||||
config.installDirectory = path.join(__dirname, '../extensions/mssql/src', config.installDirectory);
|
|
||||||
var installer = new serviceDownloader(config);
|
|
||||||
let serviceInstallFolder = installer.getInstallDirectory(runtime);
|
|
||||||
console.log('Cleaning up the install folder: ' + serviceInstallFolder);
|
|
||||||
return del(serviceInstallFolder + '/*').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-sqltoolsservice', () => {
|
|
||||||
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', () => {
|
|
||||||
return installSsmsMin();
|
|
||||||
});
|
|
||||||
15
build/gulpfile.test.js
Normal file
15
build/gulpfile.test.js
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* 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');
|
||||||
|
const mocha = require('gulp-mocha');
|
||||||
|
|
||||||
|
gulp.task('test', function () {
|
||||||
|
return gulp.src('test/all.js')
|
||||||
|
.pipe(mocha({ ui: 'tdd', delay: true }))
|
||||||
|
.once('end', function () { process.exit(); });
|
||||||
|
});
|
||||||
@@ -20,7 +20,7 @@ const filter = require('gulp-filter');
|
|||||||
const json = require('gulp-json-editor');
|
const json = require('gulp-json-editor');
|
||||||
const _ = require('underscore');
|
const _ = require('underscore');
|
||||||
const util = require('./lib/util');
|
const util = require('./lib/util');
|
||||||
const task = require('./lib/task');
|
const ext = require('./lib/extensions');
|
||||||
const buildfile = require('../src/buildfile');
|
const buildfile = require('../src/buildfile');
|
||||||
const common = require('./lib/optimize');
|
const common = require('./lib/optimize');
|
||||||
const root = path.dirname(__dirname);
|
const root = path.dirname(__dirname);
|
||||||
@@ -29,14 +29,20 @@ 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}}
|
// {{SQL CARBON EDIT}}
|
||||||
|
const serviceDownloader = require('service-downloader').ServiceDownloadProvider;
|
||||||
|
const platformInfo = require('service-downloader/out/platform').PlatformInformation;
|
||||||
|
const glob = require('glob');
|
||||||
|
// {{SQL CARBON EDIT}} - End
|
||||||
const deps = require('./dependencies');
|
const deps = require('./dependencies');
|
||||||
const { config } = require('./lib/electron');
|
const getElectronVersion = require('./lib/electron').getElectronVersion;
|
||||||
const createAsar = require('./lib/asar').createAsar;
|
const createAsar = require('./lib/asar').createAsar;
|
||||||
const { compileBuildTask } = require('./gulpfile.compile');
|
const minimist = require('minimist');
|
||||||
const { compileExtensionsBuildTask } = require('./gulpfile.extensions');
|
|
||||||
|
|
||||||
const productionDependencies = deps.getProductionDependencies(path.dirname(__dirname));
|
const productionDependencies = deps.getProductionDependencies(path.dirname(__dirname));
|
||||||
|
// @ts-ignore
|
||||||
|
// {{SQL CARBON EDIT}}
|
||||||
|
var del = require('del');
|
||||||
|
|
||||||
const baseModules = Object.keys(process.binding('natives')).filter(n => !/^_|\//.test(n));
|
const baseModules = Object.keys(process.binding('natives')).filter(n => !/^_|\//.test(n));
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
@@ -46,21 +52,16 @@ const nodeModules = [
|
|||||||
'rxjs/Observable',
|
'rxjs/Observable',
|
||||||
'rxjs/Subject',
|
'rxjs/Subject',
|
||||||
'rxjs/Observer',
|
'rxjs/Observer',
|
||||||
'slickgrid/lib/jquery.event.drag-2.3.0',
|
'ng2-charts/ng2-charts']
|
||||||
'slickgrid/lib/jquery-ui-1.9.2',
|
|
||||||
'slickgrid/slick.core',
|
|
||||||
'slickgrid/slick.grid',
|
|
||||||
'slickgrid/slick.editors',
|
|
||||||
'slickgrid/slick.dataview']
|
|
||||||
.concat(Object.keys(product.dependencies || {}))
|
.concat(Object.keys(product.dependencies || {}))
|
||||||
.concat(_.uniq(productionDependencies.map(d => d.name)))
|
.concat(_.uniq(productionDependencies.map(d => d.name)))
|
||||||
.concat(baseModules);
|
.concat(baseModules);
|
||||||
|
|
||||||
// Build
|
// Build
|
||||||
const vscodeEntryPoints = _.flatten([
|
const vscodeEntryPoints = _.flatten([
|
||||||
buildfile.entrypoint('vs/workbench/workbench.desktop.main'),
|
buildfile.entrypoint('vs/workbench/workbench.main'),
|
||||||
buildfile.base,
|
buildfile.base,
|
||||||
buildfile.workbenchDesktop,
|
buildfile.workbench,
|
||||||
buildfile.code
|
buildfile.code
|
||||||
]);
|
]);
|
||||||
|
|
||||||
@@ -73,21 +74,19 @@ const vscodeResources = [
|
|||||||
'out-build/bootstrap-amd.js',
|
'out-build/bootstrap-amd.js',
|
||||||
'out-build/bootstrap-window.js',
|
'out-build/bootstrap-window.js',
|
||||||
'out-build/paths.js',
|
'out-build/paths.js',
|
||||||
'out-build/vs/**/*.{svg,png,html}',
|
'out-build/vs/**/*.{svg,png,cur,html}',
|
||||||
'!out-build/vs/code/browser/**/*.html',
|
|
||||||
'out-build/vs/base/common/performance.js',
|
'out-build/vs/base/common/performance.js',
|
||||||
'out-build/vs/base/node/languagePacks.js',
|
'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh,cpuUsage.sh}',
|
||||||
'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh,cpuUsage.sh,ps.sh}',
|
'out-build/vs/base/browser/ui/octiconLabel/octicons/**',
|
||||||
'out-build/vs/base/browser/ui/codiconLabel/codicon/**',
|
|
||||||
'out-build/vs/workbench/browser/media/*-theme.css',
|
'out-build/vs/workbench/browser/media/*-theme.css',
|
||||||
'out-build/vs/workbench/contrib/debug/**/*.json',
|
'out-build/vs/workbench/parts/debug/**/*.json',
|
||||||
'out-build/vs/workbench/contrib/externalTerminal/**/*.scpt',
|
'out-build/vs/workbench/parts/execution/**/*.scpt',
|
||||||
'out-build/vs/workbench/contrib/webview/browser/pre/*.js',
|
'out-build/vs/workbench/parts/webview/electron-browser/webview-pre.js',
|
||||||
'out-build/vs/workbench/contrib/webview/electron-browser/pre/*.js',
|
|
||||||
'out-build/vs/**/markdown.css',
|
'out-build/vs/**/markdown.css',
|
||||||
'out-build/vs/workbench/contrib/tasks/**/*.json',
|
'out-build/vs/workbench/parts/tasks/**/*.json',
|
||||||
'out-build/vs/platform/files/**/*.exe',
|
'out-build/vs/workbench/parts/welcome/walkThrough/**/*.md',
|
||||||
'out-build/vs/platform/files/**/*.md',
|
'out-build/vs/workbench/services/files/**/*.exe',
|
||||||
|
'out-build/vs/workbench/services/files/**/*.md',
|
||||||
'out-build/vs/code/electron-browser/workbench/**',
|
'out-build/vs/code/electron-browser/workbench/**',
|
||||||
'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',
|
||||||
@@ -100,48 +99,120 @@ const vscodeResources = [
|
|||||||
'out-build/sql/parts/admin/**/*.html',
|
'out-build/sql/parts/admin/**/*.html',
|
||||||
'out-build/sql/parts/connection/connectionDialog/media/*.{gif,png,svg}',
|
'out-build/sql/parts/connection/connectionDialog/media/*.{gif,png,svg}',
|
||||||
'out-build/sql/parts/common/dblist/**/*.html',
|
'out-build/sql/parts/common/dblist/**/*.html',
|
||||||
'out-build/sql/workbench/parts/dashboard/**/*.html',
|
'out-build/sql/parts/dashboard/**/*.html',
|
||||||
'out-build/sql/parts/disasterRecovery/**/*.html',
|
'out-build/sql/parts/disasterRecovery/**/*.html',
|
||||||
'out-build/sql/parts/common/modal/media/**',
|
'out-build/sql/parts/common/modal/media/**',
|
||||||
'out-build/sql/workbench/parts/grid/media/**',
|
'out-build/sql/parts/grid/load/lib/**',
|
||||||
'out-build/sql/workbench/parts/grid/views/**/*.html',
|
'out-build/sql/parts/grid/load/loadJquery.js',
|
||||||
|
'out-build/sql/parts/grid/media/**',
|
||||||
|
'out-build/sql/parts/grid/views/**/*.html',
|
||||||
'out-build/sql/parts/tasks/**/*.html',
|
'out-build/sql/parts/tasks/**/*.html',
|
||||||
'out-build/sql/parts/taskHistory/viewlet/media/**',
|
'out-build/sql/parts/taskHistory/viewlet/media/**',
|
||||||
'out-build/sql/parts/jobManagement/common/media/*.svg',
|
'out-build/sql/parts/jobManagement/common/media/*.svg',
|
||||||
'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/parts/notebook/media/**/*.svg',
|
||||||
'out-build/sql/setup.js',
|
|
||||||
'!**/test/**'
|
'!**/test/**'
|
||||||
];
|
];
|
||||||
|
|
||||||
const optimizeVSCodeTask = task.define('optimize-vscode', task.series(
|
const BUNDLED_FILE_HEADER = [
|
||||||
util.rimraf('out-vscode'),
|
'/*!--------------------------------------------------------',
|
||||||
common.optimizeTask({
|
' * Copyright (C) Microsoft Corporation. All rights reserved.',
|
||||||
src: 'out-build',
|
' *--------------------------------------------------------*/'
|
||||||
entryPoints: vscodeEntryPoints,
|
].join('\n');
|
||||||
resources: vscodeResources,
|
|
||||||
loaderConfig: common.loaderConfig(nodeModules),
|
gulp.task('clean-optimized-vscode', util.rimraf('out-vscode'));
|
||||||
out: 'out-vscode',
|
gulp.task('optimize-vscode', ['clean-optimized-vscode', 'compile-build', 'compile-extensions-build'], common.optimizeTask({
|
||||||
inlineAmdImages: true,
|
src: 'out-build',
|
||||||
bundleInfo: undefined
|
entryPoints: vscodeEntryPoints,
|
||||||
})
|
otherSources: [],
|
||||||
));
|
resources: vscodeResources,
|
||||||
gulp.task(optimizeVSCodeTask);
|
loaderConfig: common.loaderConfig(nodeModules),
|
||||||
|
header: BUNDLED_FILE_HEADER,
|
||||||
|
out: 'out-vscode',
|
||||||
|
bundleInfo: undefined
|
||||||
|
}));
|
||||||
|
|
||||||
|
|
||||||
|
gulp.task('optimize-index-js', ['optimize-vscode'], () => {
|
||||||
|
const fullpath = path.join(process.cwd(), 'out-vscode/vs/code/electron-browser/workbench/workbench.js');
|
||||||
|
const contents = fs.readFileSync(fullpath).toString();
|
||||||
|
const newContents = contents.replace('[/*BUILD->INSERT_NODE_MODULES*/]', JSON.stringify(nodeModules));
|
||||||
|
fs.writeFileSync(fullpath, newContents);
|
||||||
|
});
|
||||||
|
|
||||||
const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`;
|
const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`;
|
||||||
const minifyVSCodeTask = task.define('minify-vscode', task.series(
|
gulp.task('clean-minified-vscode', util.rimraf('out-vscode-min'));
|
||||||
optimizeVSCodeTask,
|
gulp.task('minify-vscode', ['clean-minified-vscode', 'optimize-index-js'], common.minifyTask('out-vscode', `${sourceMappingURLBase}/core`));
|
||||||
util.rimraf('out-vscode-min'),
|
|
||||||
() => {
|
// Package
|
||||||
const fullpath = path.join(process.cwd(), 'out-vscode/bootstrap-window.js');
|
|
||||||
const contents = fs.readFileSync(fullpath).toString();
|
// @ts-ignore JSON checking: darwinCredits is optional
|
||||||
const newContents = contents.replace('[/*BUILD->INSERT_NODE_MODULES*/]', JSON.stringify(nodeModules));
|
const darwinCreditsTemplate = product.darwinCredits && _.template(fs.readFileSync(path.join(root, product.darwinCredits), 'utf8'));
|
||||||
fs.writeFileSync(fullpath, newContents);
|
|
||||||
},
|
function darwinBundleDocumentType(extensions, icon) {
|
||||||
common.minifyTask('out-vscode', `${sourceMappingURLBase}/core`)
|
return {
|
||||||
));
|
name: product.nameLong + ' document',
|
||||||
gulp.task(minifyVSCodeTask);
|
role: 'Editor',
|
||||||
|
ostypes: ["TEXT", "utxt", "TUTX", "****"],
|
||||||
|
extensions: extensions,
|
||||||
|
iconFile: icon
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
version: getElectronVersion(),
|
||||||
|
productAppName: product.nameLong,
|
||||||
|
companyName: 'Microsoft Corporation',
|
||||||
|
copyright: 'Copyright (C) 2018 Microsoft. All rights reserved',
|
||||||
|
darwinIcon: 'resources/darwin/code.icns',
|
||||||
|
darwinBundleIdentifier: product.darwinBundleIdentifier,
|
||||||
|
darwinApplicationCategoryType: 'public.app-category.developer-tools',
|
||||||
|
darwinHelpBookFolder: 'VS Code HelpBook',
|
||||||
|
darwinHelpBookName: 'VS Code HelpBook',
|
||||||
|
darwinBundleDocumentTypes: [
|
||||||
|
// {{SQL CARBON EDIT}} - Remove most document types and replace with ours
|
||||||
|
darwinBundleDocumentType(["csv", "json", "sqlplan", "sql", "xml"], 'resources/darwin/code_file.icns'),
|
||||||
|
],
|
||||||
|
darwinBundleURLTypes: [{
|
||||||
|
role: 'Viewer',
|
||||||
|
name: product.nameLong,
|
||||||
|
urlSchemes: [product.urlProtocol]
|
||||||
|
}],
|
||||||
|
darwinForceDarkModeSupport: true,
|
||||||
|
darwinCredits: darwinCreditsTemplate ? Buffer.from(darwinCreditsTemplate({ commit: commit, date: new Date().toISOString() })) : void 0,
|
||||||
|
linuxExecutableName: product.applicationName,
|
||||||
|
winIcon: 'resources/win32/code.ico',
|
||||||
|
token: process.env['VSCODE_MIXIN_PASSWORD'] || process.env['GITHUB_TOKEN'] || void 0,
|
||||||
|
|
||||||
|
// @ts-ignore JSON checking: electronRepository is optional
|
||||||
|
repo: product.electronRepository || void 0
|
||||||
|
};
|
||||||
|
|
||||||
|
function getElectron(arch) {
|
||||||
|
return () => {
|
||||||
|
const electronOpts = _.extend({}, config, {
|
||||||
|
platform: process.platform,
|
||||||
|
arch,
|
||||||
|
ffmpegChromium: true,
|
||||||
|
keepDefaultApp: true
|
||||||
|
});
|
||||||
|
|
||||||
|
return gulp.src('package.json')
|
||||||
|
.pipe(json({ name: product.nameShort }))
|
||||||
|
.pipe(electron(electronOpts))
|
||||||
|
.pipe(filter(['**', '!**/app/package.json']))
|
||||||
|
.pipe(vfs.dest('.build/electron'));
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
gulp.task('clean-electron', util.rimraf('.build/electron'));
|
||||||
|
gulp.task('electron', ['clean-electron'], getElectron(process.arch));
|
||||||
|
gulp.task('electron-ia32', ['clean-electron'], getElectron('ia32'));
|
||||||
|
gulp.task('electron-x64', ['clean-electron'], getElectron('x64'));
|
||||||
|
gulp.task('electron-arm', ['clean-electron'], getElectron('arm'));
|
||||||
|
gulp.task('electron-arm64', ['clean-electron'], getElectron('arm64'));
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compute checksums for some files.
|
* Compute checksums for some files.
|
||||||
@@ -177,35 +248,39 @@ function computeChecksum(filename) {
|
|||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
function packageTask(platform, arch, sourceFolderName, destinationFolderName, opts) {
|
function packageTask(platform, arch, opts) {
|
||||||
opts = opts || {};
|
opts = opts || {};
|
||||||
|
|
||||||
const destination = path.join(path.dirname(root), destinationFolderName);
|
// {{SQL CARBON EDIT}}
|
||||||
|
const destination = path.join(path.dirname(root), 'azuredatastudio') + (platform ? '-' + platform : '') + (arch ? '-' + arch : '');
|
||||||
platform = platform || process.platform;
|
platform = platform || process.platform;
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
const out = sourceFolderName;
|
const out = opts.minified ? 'out-vscode-min' : 'out-vscode';
|
||||||
|
|
||||||
const checksums = computeChecksums(out, [
|
const checksums = computeChecksums(out, [
|
||||||
'vs/workbench/workbench.desktop.main.js',
|
'vs/workbench/workbench.main.js',
|
||||||
'vs/workbench/workbench.desktop.main.css',
|
'vs/workbench/workbench.main.css',
|
||||||
'vs/code/electron-browser/workbench/workbench.html',
|
'vs/code/electron-browser/workbench/workbench.html',
|
||||||
'vs/code/electron-browser/workbench/workbench.js'
|
'vs/code/electron-browser/workbench/workbench.js'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const src = gulp.src(out + '/**', { base: '.' })
|
const src = gulp.src(out + '/**', { base: '.' })
|
||||||
.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']))
|
||||||
|
.pipe(filter(['**', '!**/*.js.map']));
|
||||||
|
|
||||||
|
const root = path.resolve(path.join(__dirname, '..'));
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
ext.packageBuiltInExtensions();
|
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 sources = es.merge(src, ext.packageExtensionsStream({
|
||||||
|
sourceMappingURLBase: sourceMappingURLBase
|
||||||
const sources = es.merge(src, extensions)
|
}));
|
||||||
.pipe(filter(['**', '!**/*.js.map'], { dot: true }));
|
|
||||||
|
|
||||||
let version = packageJson.version;
|
let version = packageJson.version;
|
||||||
|
// @ts-ignore JSON checking: quality is optional
|
||||||
const quality = product.quality;
|
const quality = product.quality;
|
||||||
|
|
||||||
if (quality && quality !== 'stable') {
|
if (quality && quality !== 'stable') {
|
||||||
@@ -234,39 +309,102 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op
|
|||||||
const productJsonStream = gulp.src(['product.json'], { base: '.' })
|
const productJsonStream = gulp.src(['product.json'], { base: '.' })
|
||||||
.pipe(json(productJsonUpdate));
|
.pipe(json(productJsonUpdate));
|
||||||
|
|
||||||
const license = gulp.src(['LICENSES.chromium.html', product.licenseFileName, 'ThirdPartyNotices.txt', 'licenses/**'], { base: '.', allowEmpty: true });
|
const license = gulp.src(['LICENSES.chromium.html', 'LICENSE.txt', 'ThirdPartyNotices.txt', 'licenses/**'], { base: '.' });
|
||||||
|
|
||||||
|
const watermark = gulp.src(['resources/letterpress.svg', 'resources/letterpress-dark.svg', 'resources/letterpress-hc.svg'], { base: '.' });
|
||||||
|
|
||||||
// TODO the API should be copied to `out` during compile, not here
|
// TODO the API should be copied to `out` during compile, not here
|
||||||
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/vs/data.d.ts').pipe(rename('out/sql/data.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 depsSrc = [
|
||||||
|
..._.flatten(productionDependencies.map(d => path.relative(root, d.path)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`])),
|
||||||
|
// @ts-ignore JSON checking: dependencies is optional
|
||||||
|
..._.flatten(Object.keys(product.dependencies || {}).map(d => [`node_modules/${d}/**`, `!node_modules/${d}/**/{test,tests}/**`]))
|
||||||
|
];
|
||||||
|
|
||||||
const root = path.resolve(path.join(__dirname, '..'));
|
const deps = gulp.src(depsSrc, { base: '.', dot: true })
|
||||||
const dependenciesSrc = _.flatten(productionDependencies.map(d => path.relative(root, d.path)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`]));
|
|
||||||
|
|
||||||
const deps = gulp.src(dependenciesSrc, { base: '.', dot: true })
|
|
||||||
.pipe(filter(['**', '!**/package-lock.json']))
|
.pipe(filter(['**', '!**/package-lock.json']))
|
||||||
.pipe(util.cleanNodeModules(path.join(__dirname, '.nativeignore')))
|
.pipe(util.cleanNodeModule('fsevents', ['binding.gyp', 'fsevents.cc', 'build/**', 'src/**', 'test/**'], ['**/*.node']))
|
||||||
|
.pipe(util.cleanNodeModule('vscode-sqlite3', ['binding.gyp', 'benchmark/**', 'cloudformation/**', 'deps/**', 'test/**', 'build/**', 'src/**'], ['build/Release/*.node']))
|
||||||
|
.pipe(util.cleanNodeModule('oniguruma', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['build/Release/*.node', 'src/*.js']))
|
||||||
|
.pipe(util.cleanNodeModule('windows-mutex', ['binding.gyp', 'build/**', 'src/**'], ['**/*.node']))
|
||||||
|
.pipe(util.cleanNodeModule('native-keymap', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['build/Release/*.node']))
|
||||||
|
.pipe(util.cleanNodeModule('native-is-elevated', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['build/Release/*.node']))
|
||||||
|
.pipe(util.cleanNodeModule('native-watchdog', ['binding.gyp', 'build/**', 'src/**'], ['build/Release/*.node']))
|
||||||
|
.pipe(util.cleanNodeModule('spdlog', ['binding.gyp', 'build/**', 'deps/**', 'src/**', 'test/**'], ['build/Release/*.node']))
|
||||||
|
.pipe(util.cleanNodeModule('jschardet', ['dist/**']))
|
||||||
|
.pipe(util.cleanNodeModule('windows-foreground-love', ['binding.gyp', 'build/**', 'src/**'], ['**/*.node']))
|
||||||
|
.pipe(util.cleanNodeModule('windows-process-tree', ['binding.gyp', 'build/**', 'src/**'], ['**/*.node']))
|
||||||
|
.pipe(util.cleanNodeModule('gc-signals', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['build/Release/*.node', 'src/index.js']))
|
||||||
|
.pipe(util.cleanNodeModule('keytar', ['binding.gyp', 'build/**', 'src/**', 'script/**', 'node_modules/**'], ['**/*.node']))
|
||||||
|
.pipe(util.cleanNodeModule('node-pty', ['binding.gyp', 'build/**', 'src/**', 'tools/**'], ['build/Release/*.exe', 'build/Release/*.dll', 'build/Release/*.node']))
|
||||||
|
// {{SQL CARBON EDIT}}
|
||||||
|
.pipe(util.cleanNodeModule('chart.js', ['node_modules/**'], undefined))
|
||||||
|
.pipe(util.cleanNodeModule('emmet', ['node_modules/**'], undefined))
|
||||||
|
.pipe(util.cleanNodeModule('pty.js', ['build/**'], ['build/Release/**']))
|
||||||
|
.pipe(util.cleanNodeModule('jquery-ui', ['external/**', 'demos/**'], undefined))
|
||||||
|
.pipe(util.cleanNodeModule('core-js', ['**/**'], undefined))
|
||||||
|
.pipe(util.cleanNodeModule('slickgrid', ['node_modules/**', 'examples/**'], undefined))
|
||||||
|
.pipe(util.cleanNodeModule('nsfw', ['binding.gyp', 'build/**', 'src/**', 'openpa/**', 'includes/**'], ['**/*.node', '**/*.a']))
|
||||||
|
.pipe(util.cleanNodeModule('vscode-nsfw', ['binding.gyp', 'build/**', 'src/**', 'openpa/**', 'includes/**'], ['**/*.node', '**/*.a']))
|
||||||
|
// {{SQL CARBON EDIT}} - End
|
||||||
|
.pipe(util.cleanNodeModule('vsda', ['binding.gyp', 'README.md', 'build/**', '*.bat', '*.sh', '*.cpp', '*.h'], ['build/Release/vsda.node']))
|
||||||
.pipe(createAsar(path.join(process.cwd(), 'node_modules'), ['**/*.node', '**/vscode-ripgrep/bin/*', '**/node-pty/build/Release/*'], 'app/node_modules.asar'));
|
.pipe(createAsar(path.join(process.cwd(), 'node_modules'), ['**/*.node', '**/vscode-ripgrep/bin/*', '**/node-pty/build/Release/*'], 'app/node_modules.asar'));
|
||||||
|
|
||||||
|
// {{SQL CARBON EDIT}}
|
||||||
|
let copiedModules = gulp.src([
|
||||||
|
'node_modules/jquery/**/*.*',
|
||||||
|
'node_modules/reflect-metadata/**/*.*',
|
||||||
|
'node_modules/slickgrid/**/*.*',
|
||||||
|
'node_modules/underscore/**/*.*',
|
||||||
|
'node_modules/zone.js/**/*.*',
|
||||||
|
'node_modules/chart.js/**/*.*',
|
||||||
|
], { base: '.', dot: true });
|
||||||
|
|
||||||
let all = es.merge(
|
let all = es.merge(
|
||||||
packageJsonStream,
|
packageJsonStream,
|
||||||
productJsonStream,
|
productJsonStream,
|
||||||
license,
|
license,
|
||||||
|
watermark,
|
||||||
api,
|
api,
|
||||||
|
// {{SQL CARBON EDIT}}
|
||||||
|
copiedModules,
|
||||||
dataApi,
|
dataApi,
|
||||||
sqlopsAPI, // {{SQL CARBON EDIT}}
|
|
||||||
telemetry,
|
|
||||||
sources,
|
sources,
|
||||||
deps
|
deps
|
||||||
);
|
);
|
||||||
|
|
||||||
if (platform === 'win32') {
|
if (platform === 'win32') {
|
||||||
all = es.merge(all, gulp.src([
|
all = es.merge(all, gulp.src([
|
||||||
// {{SQL CARBON EDIT}} remove unused icons
|
'resources/win32/bower.ico',
|
||||||
|
'resources/win32/c.ico',
|
||||||
|
'resources/win32/config.ico',
|
||||||
|
'resources/win32/cpp.ico',
|
||||||
|
'resources/win32/csharp.ico',
|
||||||
|
'resources/win32/css.ico',
|
||||||
|
'resources/win32/default.ico',
|
||||||
|
'resources/win32/go.ico',
|
||||||
|
'resources/win32/html.ico',
|
||||||
|
'resources/win32/jade.ico',
|
||||||
|
'resources/win32/java.ico',
|
||||||
|
'resources/win32/javascript.ico',
|
||||||
|
'resources/win32/json.ico',
|
||||||
|
'resources/win32/less.ico',
|
||||||
|
'resources/win32/markdown.ico',
|
||||||
|
'resources/win32/php.ico',
|
||||||
|
'resources/win32/powershell.ico',
|
||||||
|
'resources/win32/python.ico',
|
||||||
|
'resources/win32/react.ico',
|
||||||
|
'resources/win32/ruby.ico',
|
||||||
|
'resources/win32/sass.ico',
|
||||||
|
'resources/win32/shell.ico',
|
||||||
|
'resources/win32/sql.ico',
|
||||||
|
'resources/win32/typescript.ico',
|
||||||
|
'resources/win32/vue.ico',
|
||||||
|
'resources/win32/xml.ico',
|
||||||
|
'resources/win32/yaml.ico',
|
||||||
'resources/win32/code_70x70.png',
|
'resources/win32/code_70x70.png',
|
||||||
'resources/win32/code_150x150.png'
|
'resources/win32/code_150x150.png'
|
||||||
], { base: '.' }));
|
], { base: '.' }));
|
||||||
@@ -283,20 +421,10 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op
|
|||||||
.pipe(util.skipDirectories())
|
.pipe(util.skipDirectories())
|
||||||
.pipe(util.fixWin32DirectoryPermissions())
|
.pipe(util.fixWin32DirectoryPermissions())
|
||||||
.pipe(electron(_.extend({}, config, { platform, arch, ffmpegChromium: true })))
|
.pipe(electron(_.extend({}, config, { platform, arch, ffmpegChromium: true })))
|
||||||
.pipe(filter(['**', '!LICENSE', '!LICENSES.chromium.html', '!version'], { dot: true }));
|
.pipe(filter(['**', '!LICENSE', '!LICENSES.chromium.html', '!version']));
|
||||||
|
|
||||||
if (platform === 'linux') {
|
|
||||||
result = es.merge(result, gulp.src('resources/completions/bash/code', { base: '.' })
|
|
||||||
.pipe(replace('@@APPNAME@@', product.applicationName))
|
|
||||||
.pipe(rename(function (f) { f.basename = product.applicationName; })));
|
|
||||||
|
|
||||||
result = es.merge(result, gulp.src('resources/completions/zsh/_code', { base: '.' })
|
|
||||||
.pipe(replace('@@APPNAME@@', product.applicationName))
|
|
||||||
.pipe(rename(function (f) { f.basename = '_' + product.applicationName; })));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (platform === 'win32') {
|
if (platform === 'win32') {
|
||||||
result = es.merge(result, gulp.src('resources/win32/bin/code.js', { base: 'resources/win32', allowEmpty: true }));
|
result = es.merge(result, gulp.src('resources/win32/bin/code.js', { base: 'resources/win32' }));
|
||||||
|
|
||||||
result = es.merge(result, gulp.src('resources/win32/bin/code.cmd', { base: 'resources/win32' })
|
result = es.merge(result, gulp.src('resources/win32/bin/code.cmd', { base: 'resources/win32' })
|
||||||
.pipe(replace('@@NAME@@', product.nameShort))
|
.pipe(replace('@@NAME@@', product.nameShort))
|
||||||
@@ -304,19 +432,14 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op
|
|||||||
|
|
||||||
result = es.merge(result, gulp.src('resources/win32/bin/code.sh', { base: 'resources/win32' })
|
result = es.merge(result, gulp.src('resources/win32/bin/code.sh', { base: 'resources/win32' })
|
||||||
.pipe(replace('@@NAME@@', product.nameShort))
|
.pipe(replace('@@NAME@@', product.nameShort))
|
||||||
.pipe(replace('@@PRODNAME@@', product.nameLong))
|
|
||||||
.pipe(replace('@@VERSION@@', version))
|
|
||||||
.pipe(replace('@@COMMIT@@', commit))
|
.pipe(replace('@@COMMIT@@', commit))
|
||||||
.pipe(replace('@@APPNAME@@', product.applicationName))
|
.pipe(replace('@@APPNAME@@', product.applicationName))
|
||||||
.pipe(replace('@@DATAFOLDER@@', product.dataFolderName))
|
|
||||||
.pipe(replace('@@QUALITY@@', quality))
|
|
||||||
.pipe(rename(function (f) { f.basename = product.applicationName; f.extname = ''; })));
|
.pipe(rename(function (f) { f.basename = product.applicationName; f.extname = ''; })));
|
||||||
|
|
||||||
result = es.merge(result, gulp.src('resources/win32/VisualElementsManifest.xml', { base: 'resources/win32' })
|
result = es.merge(result, gulp.src('resources/win32/VisualElementsManifest.xml', { base: 'resources/win32' })
|
||||||
.pipe(rename(product.nameShort + '.VisualElementsManifest.xml')));
|
.pipe(rename(product.nameShort + '.VisualElementsManifest.xml')));
|
||||||
} else if (platform === 'linux') {
|
} else if (platform === 'linux') {
|
||||||
result = es.merge(result, gulp.src('resources/linux/bin/code.sh', { base: '.' })
|
result = es.merge(result, gulp.src('resources/linux/bin/code.sh', { base: '.' })
|
||||||
.pipe(replace('@@PRODNAME@@', product.nameLong))
|
|
||||||
.pipe(replace('@@NAME@@', product.applicationName))
|
.pipe(replace('@@NAME@@', product.applicationName))
|
||||||
.pipe(rename('bin/' + product.applicationName)));
|
.pipe(rename('bin/' + product.applicationName)));
|
||||||
}
|
}
|
||||||
@@ -336,40 +459,38 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op
|
|||||||
|
|
||||||
const buildRoot = path.dirname(root);
|
const buildRoot = path.dirname(root);
|
||||||
|
|
||||||
const BUILD_TARGETS = [
|
// {{SQL CARBON EDIT}}
|
||||||
{ platform: 'win32', arch: 'ia32' },
|
gulp.task('vscode-win32-x64-azurecore', ['optimize-vscode'], ext.packageExtensionTask('azurecore', 'win32', 'x64'));
|
||||||
{ platform: 'win32', arch: 'x64' },
|
gulp.task('vscode-darwin-azurecore', ['optimize-vscode'], ext.packageExtensionTask('azurecore', 'darwin'));
|
||||||
{ platform: 'darwin', arch: null, opts: { stats: true } },
|
gulp.task('vscode-linux-x64-azurecore', ['optimize-vscode'], ext.packageExtensionTask('azurecore', 'linux', 'x64'));
|
||||||
{ platform: 'linux', arch: 'ia32' },
|
|
||||||
{ platform: 'linux', arch: 'x64' },
|
|
||||||
{ platform: 'linux', arch: 'arm' },
|
|
||||||
{ platform: 'linux', arch: 'arm64' },
|
|
||||||
];
|
|
||||||
BUILD_TARGETS.forEach(buildTarget => {
|
|
||||||
const dashed = (str) => (str ? `-${str}` : ``);
|
|
||||||
const platform = buildTarget.platform;
|
|
||||||
const arch = buildTarget.arch;
|
|
||||||
const opts = buildTarget.opts;
|
|
||||||
|
|
||||||
['', 'min'].forEach(minified => {
|
gulp.task('vscode-win32-x64-mssql', ['vscode-linux-x64-azurecore', 'optimize-vscode'], ext.packageExtensionTask('mssql', 'win32', 'x64'));
|
||||||
const sourceFolderName = `out-vscode${dashed(minified)}`;
|
gulp.task('vscode-darwin-mssql', ['vscode-linux-x64-azurecore', 'optimize-vscode'], ext.packageExtensionTask('mssql', 'darwin'));
|
||||||
const destinationFolderName = `azuredatastudio${dashed(platform)}${dashed(arch)}`;
|
gulp.task('vscode-linux-x64-mssql', ['vscode-linux-x64-azurecore', 'optimize-vscode'], ext.packageExtensionTask('mssql', 'linux', 'x64'));
|
||||||
|
|
||||||
const vscodeTaskCI = task.define(`vscode${dashed(platform)}${dashed(arch)}${dashed(minified)}-ci`, task.series(
|
gulp.task('clean-vscode-win32-ia32', util.rimraf(path.join(buildRoot, 'azuredatastudio-win32-ia32')));
|
||||||
util.rimraf(path.join(buildRoot, destinationFolderName)),
|
gulp.task('clean-vscode-win32-x64', util.rimraf(path.join(buildRoot, 'azuredatastudio-win32-x64')));
|
||||||
packageTask(platform, arch, sourceFolderName, destinationFolderName, opts)
|
gulp.task('clean-vscode-darwin', util.rimraf(path.join(buildRoot, 'azuredatastudio-darwin')));
|
||||||
));
|
gulp.task('clean-vscode-linux-ia32', util.rimraf(path.join(buildRoot, 'azuredatastudio-linux-ia32')));
|
||||||
gulp.task(vscodeTaskCI);
|
gulp.task('clean-vscode-linux-x64', util.rimraf(path.join(buildRoot, 'azuredatastudio-linux-x64')));
|
||||||
|
gulp.task('clean-vscode-linux-arm', util.rimraf(path.join(buildRoot, 'azuredatastudio-linux-arm')));
|
||||||
|
gulp.task('clean-vscode-linux-arm64', util.rimraf(path.join(buildRoot, 'azuredatastudio-linux-arm64')));
|
||||||
|
|
||||||
const vscodeTask = task.define(`vscode${dashed(platform)}${dashed(arch)}${dashed(minified)}`, task.series(
|
gulp.task('vscode-win32-ia32', ['optimize-vscode', 'clean-vscode-win32-ia32'], packageTask('win32', 'ia32'));
|
||||||
compileBuildTask,
|
gulp.task('vscode-win32-x64', ['vscode-win32-x64-azurecore', 'vscode-win32-x64-mssql', 'optimize-vscode', 'clean-vscode-win32-x64'], packageTask('win32', 'x64'));
|
||||||
compileExtensionsBuildTask,
|
gulp.task('vscode-darwin', ['vscode-darwin-azurecore', 'vscode-darwin-mssql', 'optimize-vscode', 'clean-vscode-darwin'], packageTask('darwin', null, { stats: true }));
|
||||||
minified ? minifyVSCodeTask : optimizeVSCodeTask,
|
gulp.task('vscode-linux-ia32', ['optimize-vscode', 'clean-vscode-linux-ia32'], packageTask('linux', 'ia32'));
|
||||||
vscodeTaskCI
|
gulp.task('vscode-linux-x64', ['vscode-linux-x64-azurecore', 'vscode-linux-x64-mssql', 'optimize-vscode', 'clean-vscode-linux-x64'], packageTask('linux', 'x64'));
|
||||||
));
|
gulp.task('vscode-linux-arm', ['optimize-vscode', 'clean-vscode-linux-arm'], packageTask('linux', 'arm'));
|
||||||
gulp.task(vscodeTask);
|
gulp.task('vscode-linux-arm64', ['optimize-vscode', 'clean-vscode-linux-arm64'], packageTask('linux', 'arm64'));
|
||||||
});
|
|
||||||
});
|
gulp.task('vscode-win32-ia32-min', ['minify-vscode', 'clean-vscode-win32-ia32'], packageTask('win32', 'ia32', { minified: true }));
|
||||||
|
gulp.task('vscode-win32-x64-min', ['minify-vscode', 'clean-vscode-win32-x64'], packageTask('win32', 'x64', { minified: true }));
|
||||||
|
gulp.task('vscode-darwin-min', ['minify-vscode', 'clean-vscode-darwin'], packageTask('darwin', null, { minified: true, stats: true }));
|
||||||
|
gulp.task('vscode-linux-ia32-min', ['minify-vscode', 'clean-vscode-linux-ia32'], packageTask('linux', 'ia32', { minified: true }));
|
||||||
|
gulp.task('vscode-linux-x64-min', ['minify-vscode', 'clean-vscode-linux-x64'], packageTask('linux', 'x64', { minified: true }));
|
||||||
|
gulp.task('vscode-linux-arm-min', ['minify-vscode', 'clean-vscode-linux-arm'], packageTask('linux', 'arm', { minified: true }));
|
||||||
|
gulp.task('vscode-linux-arm64-min', ['minify-vscode', 'clean-vscode-linux-arm64'], packageTask('linux', 'arm64', { minified: true }));
|
||||||
|
|
||||||
// Transifex Localizations
|
// Transifex Localizations
|
||||||
|
|
||||||
@@ -392,46 +513,30 @@ const apiHostname = process.env.TRANSIFEX_API_URL;
|
|||||||
const apiName = process.env.TRANSIFEX_API_NAME;
|
const apiName = process.env.TRANSIFEX_API_NAME;
|
||||||
const apiToken = process.env.TRANSIFEX_API_TOKEN;
|
const apiToken = process.env.TRANSIFEX_API_TOKEN;
|
||||||
|
|
||||||
gulp.task(task.define(
|
gulp.task('vscode-translations-push', ['optimize-vscode'], function () {
|
||||||
'vscode-translations-push',
|
const pathToMetadata = './out-vscode/nls.metadata.json';
|
||||||
task.series(
|
const pathToExtensions = './extensions/*';
|
||||||
compileBuildTask,
|
const pathToSetup = 'build/win32/**/{Default.isl,messages.en.isl}';
|
||||||
compileExtensionsBuildTask,
|
|
||||||
optimizeVSCodeTask,
|
|
||||||
function () {
|
|
||||||
const pathToMetadata = './out-vscode/nls.metadata.json';
|
|
||||||
const pathToExtensions = '.build/extensions/*';
|
|
||||||
const pathToSetup = 'build/win32/**/{Default.isl,messages.en.isl}';
|
|
||||||
|
|
||||||
return es.merge(
|
return es.merge(
|
||||||
gulp.src(pathToMetadata).pipe(i18n.createXlfFilesForCoreBundle()),
|
gulp.src(pathToMetadata).pipe(i18n.createXlfFilesForCoreBundle()),
|
||||||
gulp.src(pathToSetup).pipe(i18n.createXlfFilesForIsl()),
|
gulp.src(pathToSetup).pipe(i18n.createXlfFilesForIsl()),
|
||||||
gulp.src(pathToExtensions).pipe(i18n.createXlfFilesForExtensions())
|
gulp.src(pathToExtensions).pipe(i18n.createXlfFilesForExtensions())
|
||||||
).pipe(i18n.findObsoleteResources(apiHostname, apiName, apiToken)
|
).pipe(i18n.findObsoleteResources(apiHostname, apiName, apiToken)
|
||||||
).pipe(i18n.pushXlfFiles(apiHostname, apiName, apiToken));
|
).pipe(i18n.pushXlfFiles(apiHostname, apiName, apiToken));
|
||||||
}
|
});
|
||||||
)
|
|
||||||
));
|
|
||||||
|
|
||||||
gulp.task(task.define(
|
gulp.task('vscode-translations-export', ['optimize-vscode'], function () {
|
||||||
'vscode-translations-export',
|
const pathToMetadata = './out-vscode/nls.metadata.json';
|
||||||
task.series(
|
const pathToExtensions = './extensions/*';
|
||||||
compileBuildTask,
|
const pathToSetup = 'build/win32/**/{Default.isl,messages.en.isl}';
|
||||||
compileExtensionsBuildTask,
|
|
||||||
optimizeVSCodeTask,
|
|
||||||
function () {
|
|
||||||
const pathToMetadata = './out-vscode/nls.metadata.json';
|
|
||||||
const pathToExtensions = '.build/extensions/*';
|
|
||||||
const pathToSetup = 'build/win32/**/{Default.isl,messages.en.isl}';
|
|
||||||
|
|
||||||
return es.merge(
|
return es.merge(
|
||||||
gulp.src(pathToMetadata).pipe(i18n.createXlfFilesForCoreBundle()),
|
gulp.src(pathToMetadata).pipe(i18n.createXlfFilesForCoreBundle()),
|
||||||
gulp.src(pathToSetup).pipe(i18n.createXlfFilesForIsl()),
|
gulp.src(pathToSetup).pipe(i18n.createXlfFilesForIsl()),
|
||||||
gulp.src(pathToExtensions).pipe(i18n.createXlfFilesForExtensions())
|
gulp.src(pathToExtensions).pipe(i18n.createXlfFilesForExtensions())
|
||||||
).pipe(vfs.dest('../vscode-translations-export'));
|
).pipe(vfs.dest('../vscode-translations-export'));
|
||||||
}
|
});
|
||||||
)
|
|
||||||
));
|
|
||||||
|
|
||||||
gulp.task('vscode-translations-pull', function () {
|
gulp.task('vscode-translations-pull', function () {
|
||||||
return es.merge([...i18n.defaultLanguages, ...i18n.extraLanguages].map(language => {
|
return es.merge([...i18n.defaultLanguages, ...i18n.extraLanguages].map(language => {
|
||||||
@@ -442,20 +547,91 @@ gulp.task('vscode-translations-pull', function () {
|
|||||||
|
|
||||||
gulp.task('vscode-translations-import', function () {
|
gulp.task('vscode-translations-import', function () {
|
||||||
// {{SQL CARBON EDIT}} - Replace function body with our own
|
// {{SQL CARBON EDIT}} - Replace function body with our own
|
||||||
return new Promise(function(resolve) {
|
[...i18n.defaultLanguages, ...i18n.extraLanguages].forEach(language => {
|
||||||
[...i18n.defaultLanguages, ...i18n.extraLanguages].forEach(language => {
|
gulp.src(`../vscode-localization/${language.id}/build/*/*.xlf`)
|
||||||
let languageId = language.translationId ? language.translationId : language.id;
|
.pipe(i18n.prepareI18nFiles())
|
||||||
gulp.src(`resources/xlf/${languageId}/**/*.xlf`)
|
.pipe(vfs.dest(`./i18n/${language.folderName}`));
|
||||||
.pipe(i18n.prepareI18nFiles())
|
|
||||||
.pipe(vfs.dest(`./i18n/${language.folderName}`));
|
|
||||||
resolve();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
// {{SQL CARBON EDIT}} - End
|
// {{SQL CARBON EDIT}} - End
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Sourcemaps
|
||||||
|
|
||||||
|
gulp.task('upload-vscode-sourcemaps', ['vscode-darwin-min', 'minify-vscode'], () => {
|
||||||
|
const vs = gulp.src('out-vscode-min/**/*.map', { base: 'out-vscode-min' })
|
||||||
|
.pipe(es.mapSync(f => {
|
||||||
|
f.path = `${f.base}/core/${f.relative}`;
|
||||||
|
return f;
|
||||||
|
}));
|
||||||
|
|
||||||
|
const extensionsOut = gulp.src('extensions/**/out/**/*.map', { base: '.' });
|
||||||
|
const extensionsDist = gulp.src('extensions/**/dist/**/*.map', { base: '.' });
|
||||||
|
|
||||||
|
return es.merge(vs, extensionsOut, extensionsDist)
|
||||||
|
.pipe(es.through(function (data) {
|
||||||
|
// debug
|
||||||
|
console.log('Uploading Sourcemap', data.relative);
|
||||||
|
this.emit('data', data);
|
||||||
|
}))
|
||||||
|
.pipe(azure.upload({
|
||||||
|
account: process.env.AZURE_STORAGE_ACCOUNT,
|
||||||
|
key: process.env.AZURE_STORAGE_ACCESS_KEY,
|
||||||
|
container: 'sourcemaps',
|
||||||
|
prefix: commit + '/'
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
|
||||||
|
const allConfigDetailsPath = path.join(os.tmpdir(), 'configuration.json');
|
||||||
|
gulp.task('upload-vscode-configuration', ['generate-vscode-configuration'], () => {
|
||||||
|
if (!shouldSetupSettingsSearch()) {
|
||||||
|
const branch = process.env.BUILD_SOURCEBRANCH;
|
||||||
|
console.log(`Only runs on master and release branches, not ${branch}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!fs.existsSync(allConfigDetailsPath)) {
|
||||||
|
throw new Error(`configuration file at ${allConfigDetailsPath} does not exist`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const settingsSearchBuildId = getSettingsSearchBuildId(packageJson);
|
||||||
|
if (!settingsSearchBuildId) {
|
||||||
|
throw new Error('Failed to compute build number');
|
||||||
|
}
|
||||||
|
|
||||||
|
return gulp.src(allConfigDetailsPath)
|
||||||
|
.pipe(azure.upload({
|
||||||
|
account: process.env.AZURE_STORAGE_ACCOUNT,
|
||||||
|
key: process.env.AZURE_STORAGE_ACCESS_KEY,
|
||||||
|
container: 'configuration',
|
||||||
|
prefix: `${settingsSearchBuildId}/${commit}/`
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
|
||||||
|
function shouldSetupSettingsSearch() {
|
||||||
|
const branch = process.env.BUILD_SOURCEBRANCH;
|
||||||
|
return branch && (/\/master$/.test(branch) || branch.indexOf('/release/') >= 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSettingsSearchBuildId(packageJson) {
|
||||||
|
try {
|
||||||
|
const branch = process.env.BUILD_SOURCEBRANCH;
|
||||||
|
const branchId = branch.indexOf('/release/') >= 0 ? 0 :
|
||||||
|
/\/master$/.test(branch) ? 1 :
|
||||||
|
2; // Some unexpected branch
|
||||||
|
|
||||||
|
const out = cp.execSync(`git rev-list HEAD --count`);
|
||||||
|
const count = parseInt(out.toString());
|
||||||
|
|
||||||
|
// <version number><commit count><branchId (avoid unlikely conflicts)>
|
||||||
|
// 1.25.1, 1,234,567 commits, master = 1250112345671
|
||||||
|
return util.versionStringToNumber(packageJson.version) * 1e8 + count * 10 + branchId;
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error('Could not determine build number: ' + e.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// This task is only run for the MacOS build
|
// This task is only run for the MacOS build
|
||||||
const generateVSCodeConfigurationTask = task.define('generate-vscode-configuration', () => {
|
gulp.task('generate-vscode-configuration', () => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const buildDir = process.env['AGENT_BUILDDIRECTORY'];
|
const buildDir = process.env['AGENT_BUILDDIRECTORY'];
|
||||||
if (!buildDir) {
|
if (!buildDir) {
|
||||||
@@ -492,57 +668,27 @@ const generateVSCodeConfigurationTask = task.define('generate-vscode-configurati
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
const allConfigDetailsPath = path.join(os.tmpdir(), 'configuration.json');
|
// {{SQL CARBON EDIT}}
|
||||||
gulp.task(task.define(
|
// Install service locally before building carbon
|
||||||
'upload-vscode-configuration',
|
|
||||||
task.series(
|
|
||||||
generateVSCodeConfigurationTask,
|
|
||||||
() => {
|
|
||||||
if (!shouldSetupSettingsSearch()) {
|
|
||||||
const branch = process.env.BUILD_SOURCEBRANCH;
|
|
||||||
console.log(`Only runs on master and release branches, not ${branch}`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!fs.existsSync(allConfigDetailsPath)) {
|
function installService() {
|
||||||
throw new Error(`configuration file at ${allConfigDetailsPath} does not exist`);
|
let config = require('../extensions/mssql/src/config.json');
|
||||||
}
|
return platformInfo.getCurrent().then(p => {
|
||||||
|
let runtime = p.runtimeId;
|
||||||
const settingsSearchBuildId = getSettingsSearchBuildId(packageJson);
|
// fix path since it won't be correct
|
||||||
if (!settingsSearchBuildId) {
|
config.installDirectory = path.join(__dirname, '../extensions/mssql/src', config.installDirectory);
|
||||||
throw new Error('Failed to compute build number');
|
var installer = new serviceDownloader(config);
|
||||||
}
|
let serviceInstallFolder = installer.getInstallDirectory(runtime);
|
||||||
|
console.log('Cleaning up the install folder: ' + serviceInstallFolder);
|
||||||
return gulp.src(allConfigDetailsPath)
|
return del(serviceInstallFolder + '/*').then(() => {
|
||||||
.pipe(azure.upload({
|
console.log('Installing the service. Install folder: ' + serviceInstallFolder);
|
||||||
account: process.env.AZURE_STORAGE_ACCOUNT,
|
return installer.installService(runtime);
|
||||||
key: process.env.AZURE_STORAGE_ACCESS_KEY,
|
}, delError => {
|
||||||
container: 'configuration',
|
console.log('failed to delete the install folder error: ' + delError);
|
||||||
prefix: `${settingsSearchBuildId}/${commit}/`
|
});
|
||||||
}));
|
});
|
||||||
}
|
|
||||||
)
|
|
||||||
));
|
|
||||||
|
|
||||||
function shouldSetupSettingsSearch() {
|
|
||||||
const branch = process.env.BUILD_SOURCEBRANCH;
|
|
||||||
return branch && (/\/master$/.test(branch) || branch.indexOf('/release/') >= 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSettingsSearchBuildId(packageJson) {
|
gulp.task('install-sqltoolsservice', () => {
|
||||||
try {
|
return installService();
|
||||||
const branch = process.env.BUILD_SOURCEBRANCH;
|
});
|
||||||
const branchId = branch.indexOf('/release/') >= 0 ? 0 :
|
|
||||||
/\/master$/.test(branch) ? 1 :
|
|
||||||
2; // Some unexpected branch
|
|
||||||
|
|
||||||
const out = cp.execSync(`git rev-list HEAD --count`);
|
|
||||||
const count = parseInt(out.toString());
|
|
||||||
|
|
||||||
// <version number><commit count><branchId (avoid unlikely conflicts)>
|
|
||||||
// 1.25.1, 1,234,567 commits, master = 1250112345671
|
|
||||||
return util.versionStringToNumber(packageJson.version) * 1e8 + count * 10 + branchId;
|
|
||||||
} catch (e) {
|
|
||||||
throw new Error('Could not determine build number: ' + e.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -12,22 +12,18 @@ const shell = require('gulp-shell');
|
|||||||
const es = require('event-stream');
|
const es = require('event-stream');
|
||||||
const vfs = require('vinyl-fs');
|
const vfs = require('vinyl-fs');
|
||||||
const util = require('./lib/util');
|
const util = require('./lib/util');
|
||||||
const task = require('./lib/task');
|
|
||||||
const packageJson = require('../package.json');
|
const packageJson = require('../package.json');
|
||||||
const product = require('../product.json');
|
const product = require('../product.json');
|
||||||
const rpmDependencies = require('../resources/linux/rpm/dependencies.json');
|
const rpmDependencies = require('../resources/linux/rpm/dependencies.json');
|
||||||
const path = require('path');
|
|
||||||
const root = path.dirname(__dirname);
|
|
||||||
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', ia32: 'i386', arm: 'armhf', arm64: "arm64" }[arch];
|
||||||
}
|
}
|
||||||
|
|
||||||
function prepareDebPackage(arch) {
|
function prepareDebPackage(arch) {
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
const binaryDir = '../azuredatastudio-linux-' + arch;
|
const binaryDir = '../azuredatastudio-linux-' + arch;
|
||||||
const debArch = getDebPackageArch(arch);
|
const debArch = getDebPackageArch(arch);
|
||||||
const destination = '.build/linux/deb/' + debArch + '/' + product.applicationName + '-' + debArch;
|
const destination = '.build/linux/deb/' + debArch + '/' + product.applicationName + '-' + debArch;
|
||||||
@@ -43,8 +39,7 @@ function prepareDebPackage(arch) {
|
|||||||
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
||||||
.pipe(replace('@@NAME_SHORT@@', product.nameShort))
|
.pipe(replace('@@NAME_SHORT@@', product.nameShort))
|
||||||
.pipe(replace('@@NAME@@', product.applicationName))
|
.pipe(replace('@@NAME@@', product.applicationName))
|
||||||
.pipe(replace('@@EXEC@@', `/usr/share/${product.applicationName}/${product.applicationName}`))
|
.pipe(replace('@@ICON@@', product.applicationName))
|
||||||
.pipe(replace('@@ICON@@', `/usr/share/pixmaps/${product.linuxIconName}.png`))
|
|
||||||
.pipe(replace('@@URLPROTOCOL@@', product.urlProtocol));
|
.pipe(replace('@@URLPROTOCOL@@', product.urlProtocol));
|
||||||
|
|
||||||
const appdata = gulp.src('resources/linux/code.appdata.xml', { base: '.' })
|
const appdata = gulp.src('resources/linux/code.appdata.xml', { base: '.' })
|
||||||
@@ -54,15 +49,7 @@ function prepareDebPackage(arch) {
|
|||||||
.pipe(rename('usr/share/appdata/' + product.applicationName + '.appdata.xml'));
|
.pipe(rename('usr/share/appdata/' + product.applicationName + '.appdata.xml'));
|
||||||
|
|
||||||
const icon = gulp.src('resources/linux/code.png', { base: '.' })
|
const icon = gulp.src('resources/linux/code.png', { base: '.' })
|
||||||
.pipe(rename('usr/share/pixmaps/' + product.linuxIconName + '.png'));
|
.pipe(rename('usr/share/pixmaps/' + product.applicationName + '.png'));
|
||||||
|
|
||||||
const bash_completion = gulp.src('resources/completions/bash/code')
|
|
||||||
.pipe(replace('@@APPNAME@@', product.applicationName))
|
|
||||||
.pipe(rename('usr/share/bash-completion/completions/' + product.applicationName));
|
|
||||||
|
|
||||||
const zsh_completion = gulp.src('resources/completions/zsh/_code')
|
|
||||||
.pipe(replace('@@APPNAME@@', product.applicationName))
|
|
||||||
.pipe(rename('usr/share/zsh/vendor-completions/_' + product.applicationName));
|
|
||||||
|
|
||||||
const code = gulp.src(binaryDir + '/**/*', { base: binaryDir })
|
const code = gulp.src(binaryDir + '/**/*', { base: binaryDir })
|
||||||
.pipe(rename(function (p) { p.dirname = 'usr/share/' + product.applicationName + '/' + p.dirname; }));
|
.pipe(rename(function (p) { p.dirname = 'usr/share/' + product.applicationName + '/' + p.dirname; }));
|
||||||
@@ -98,7 +85,7 @@ function prepareDebPackage(arch) {
|
|||||||
.pipe(replace('@@UPDATEURL@@', product.updateUrl || '@@UPDATEURL@@'))
|
.pipe(replace('@@UPDATEURL@@', product.updateUrl || '@@UPDATEURL@@'))
|
||||||
.pipe(rename('DEBIAN/postinst'));
|
.pipe(rename('DEBIAN/postinst'));
|
||||||
|
|
||||||
const all = es.merge(control, postinst, postrm, prerm, desktops, appdata, icon, bash_completion, zsh_completion, code);
|
const all = es.merge(control, postinst, postrm, prerm, desktops, appdata, icon, code);
|
||||||
|
|
||||||
return all.pipe(vfs.dest(destination));
|
return all.pipe(vfs.dest(destination));
|
||||||
};
|
};
|
||||||
@@ -118,7 +105,7 @@ function getRpmBuildPath(rpmArch) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getRpmPackageArch(arch) {
|
function getRpmPackageArch(arch) {
|
||||||
return { x64: 'x86_64', arm: 'armhf', arm64: "arm64" }[arch];
|
return { x64: 'x86_64', ia32: 'i386', arm: 'armhf', arm64: "arm64" }[arch];
|
||||||
}
|
}
|
||||||
|
|
||||||
function prepareRpmPackage(arch) {
|
function prepareRpmPackage(arch) {
|
||||||
@@ -137,8 +124,7 @@ function prepareRpmPackage(arch) {
|
|||||||
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
||||||
.pipe(replace('@@NAME_SHORT@@', product.nameShort))
|
.pipe(replace('@@NAME_SHORT@@', product.nameShort))
|
||||||
.pipe(replace('@@NAME@@', product.applicationName))
|
.pipe(replace('@@NAME@@', product.applicationName))
|
||||||
.pipe(replace('@@EXEC@@', `/usr/share/${product.applicationName}/${product.applicationName}`))
|
.pipe(replace('@@ICON@@', product.applicationName))
|
||||||
.pipe(replace('@@ICON@@', product.linuxIconName))
|
|
||||||
.pipe(replace('@@URLPROTOCOL@@', product.urlProtocol));
|
.pipe(replace('@@URLPROTOCOL@@', product.urlProtocol));
|
||||||
|
|
||||||
const appdata = gulp.src('resources/linux/code.appdata.xml', { base: '.' })
|
const appdata = gulp.src('resources/linux/code.appdata.xml', { base: '.' })
|
||||||
@@ -148,15 +134,7 @@ function prepareRpmPackage(arch) {
|
|||||||
.pipe(rename('usr/share/appdata/' + product.applicationName + '.appdata.xml'));
|
.pipe(rename('usr/share/appdata/' + product.applicationName + '.appdata.xml'));
|
||||||
|
|
||||||
const icon = gulp.src('resources/linux/code.png', { base: '.' })
|
const icon = gulp.src('resources/linux/code.png', { base: '.' })
|
||||||
.pipe(rename('BUILD/usr/share/pixmaps/' + product.linuxIconName + '.png'));
|
.pipe(rename('BUILD/usr/share/pixmaps/' + product.applicationName + '.png'));
|
||||||
|
|
||||||
const bash_completion = gulp.src('resources/completions/bash/code')
|
|
||||||
.pipe(replace('@@APPNAME@@', product.applicationName))
|
|
||||||
.pipe(rename('BUILD/usr/share/bash-completion/completions/' + product.applicationName));
|
|
||||||
|
|
||||||
const zsh_completion = gulp.src('resources/completions/zsh/_code')
|
|
||||||
.pipe(replace('@@APPNAME@@', product.applicationName))
|
|
||||||
.pipe(rename('BUILD/usr/share/zsh/site-functions/_' + product.applicationName));
|
|
||||||
|
|
||||||
const code = gulp.src(binaryDir + '/**/*', { base: binaryDir })
|
const code = gulp.src(binaryDir + '/**/*', { base: binaryDir })
|
||||||
.pipe(rename(function (p) { p.dirname = 'BUILD/usr/share/' + product.applicationName + '/' + p.dirname; }));
|
.pipe(rename(function (p) { p.dirname = 'BUILD/usr/share/' + product.applicationName + '/' + p.dirname; }));
|
||||||
@@ -164,7 +142,6 @@ function prepareRpmPackage(arch) {
|
|||||||
const spec = gulp.src('resources/linux/rpm/code.spec.template', { base: '.' })
|
const spec = gulp.src('resources/linux/rpm/code.spec.template', { base: '.' })
|
||||||
.pipe(replace('@@NAME@@', product.applicationName))
|
.pipe(replace('@@NAME@@', product.applicationName))
|
||||||
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
||||||
.pipe(replace('@@ICON@@', product.linuxIconName))
|
|
||||||
.pipe(replace('@@VERSION@@', packageJson.version))
|
.pipe(replace('@@VERSION@@', packageJson.version))
|
||||||
.pipe(replace('@@RELEASE@@', linuxPackageRevision))
|
.pipe(replace('@@RELEASE@@', linuxPackageRevision))
|
||||||
.pipe(replace('@@ARCHITECTURE@@', rpmArch))
|
.pipe(replace('@@ARCHITECTURE@@', rpmArch))
|
||||||
@@ -179,7 +156,7 @@ function prepareRpmPackage(arch) {
|
|||||||
const specIcon = gulp.src('resources/linux/rpm/code.xpm', { base: '.' })
|
const specIcon = gulp.src('resources/linux/rpm/code.xpm', { base: '.' })
|
||||||
.pipe(rename('SOURCES/' + product.applicationName + '.xpm'));
|
.pipe(rename('SOURCES/' + product.applicationName + '.xpm'));
|
||||||
|
|
||||||
const all = es.merge(code, desktops, appdata, icon, bash_completion, zsh_completion, spec, specIcon);
|
const all = es.merge(code, desktops, appdata, icon, spec, specIcon);
|
||||||
|
|
||||||
return all.pipe(vfs.dest(getRpmBuildPath(rpmArch)));
|
return all.pipe(vfs.dest(getRpmBuildPath(rpmArch)));
|
||||||
};
|
};
|
||||||
@@ -203,43 +180,36 @@ function getSnapBuildPath(arch) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function prepareSnapPackage(arch) {
|
function prepareSnapPackage(arch) {
|
||||||
// {{SQL CARBON EDIT}}
|
const binaryDir = '../VSCode-linux-' + arch;
|
||||||
const binaryDir = '../azuredatastudio-linux-' + arch;
|
|
||||||
const destination = getSnapBuildPath(arch);
|
const destination = getSnapBuildPath(arch);
|
||||||
|
|
||||||
return function () {
|
return function () {
|
||||||
// A desktop file that is placed in snap/gui will be placed into meta/gui verbatim.
|
|
||||||
const desktop = gulp.src('resources/linux/code.desktop', { base: '.' })
|
const desktop = gulp.src('resources/linux/code.desktop', { base: '.' })
|
||||||
.pipe(rename(`snap/gui/${product.applicationName}.desktop`));
|
|
||||||
|
|
||||||
// A desktop file that is placed in snap/gui will be placed into meta/gui verbatim.
|
|
||||||
const desktopUrlHandler = gulp.src('resources/linux/code-url-handler.desktop', { base: '.' })
|
|
||||||
.pipe(rename(`snap/gui/${product.applicationName}-url-handler.desktop`));
|
|
||||||
|
|
||||||
const desktops = es.merge(desktop, desktopUrlHandler)
|
|
||||||
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
||||||
.pipe(replace('@@NAME_SHORT@@', product.nameShort))
|
.pipe(replace('@@NAME_SHORT@@', product.nameShort))
|
||||||
.pipe(replace('@@NAME@@', product.applicationName))
|
.pipe(replace('@@NAME@@', product.applicationName))
|
||||||
.pipe(replace('@@EXEC@@', `${product.applicationName} --force-user-env`))
|
.pipe(replace('@@ICON@@', `/usr/share/pixmaps/${product.applicationName}.png`))
|
||||||
.pipe(replace('@@ICON@@', `\${SNAP}/meta/gui/${product.linuxIconName}.png`))
|
.pipe(rename(`usr/share/applications/${product.applicationName}.desktop`));
|
||||||
.pipe(replace('@@URLPROTOCOL@@', product.urlProtocol));
|
|
||||||
|
|
||||||
// An icon that is placed in snap/gui will be placed into meta/gui verbatim.
|
|
||||||
const icon = gulp.src('resources/linux/code.png', { base: '.' })
|
const icon = gulp.src('resources/linux/code.png', { base: '.' })
|
||||||
.pipe(rename(`snap/gui/${product.linuxIconName}.png`));
|
.pipe(rename(`usr/share/pixmaps/${product.applicationName}.png`));
|
||||||
|
|
||||||
const code = gulp.src(binaryDir + '/**/*', { base: binaryDir })
|
const code = gulp.src(binaryDir + '/**/*', { base: binaryDir })
|
||||||
.pipe(rename(function (p) { p.dirname = `usr/share/${product.applicationName}/${p.dirname}`; }));
|
.pipe(rename(function (p) { p.dirname = `usr/share/${product.applicationName}/${p.dirname}`; }));
|
||||||
|
|
||||||
const snapcraft = gulp.src('resources/linux/snap/snapcraft.yaml', { base: '.' })
|
const snapcraft = gulp.src('resources/linux/snap/snapcraft.yaml', { base: '.' })
|
||||||
.pipe(replace('@@NAME@@', product.applicationName))
|
.pipe(replace('@@NAME@@', product.applicationName))
|
||||||
.pipe(replace('@@VERSION@@', commit.substr(0, 8)))
|
.pipe(replace('@@VERSION@@', `${packageJson.version}-${linuxPackageRevision}`))
|
||||||
.pipe(rename('snap/snapcraft.yaml'));
|
.pipe(rename('snap/snapcraft.yaml'));
|
||||||
|
|
||||||
|
const snapUpdate = gulp.src('resources/linux/snap/snapUpdate.sh', { base: '.' })
|
||||||
|
.pipe(replace('@@NAME@@', product.applicationName))
|
||||||
|
.pipe(rename(`usr/share/${product.applicationName}/snapUpdate.sh`));
|
||||||
|
|
||||||
const electronLaunch = gulp.src('resources/linux/snap/electron-launch', { base: '.' })
|
const electronLaunch = gulp.src('resources/linux/snap/electron-launch', { base: '.' })
|
||||||
.pipe(rename('electron-launch'));
|
.pipe(rename('electron-launch'));
|
||||||
|
|
||||||
const all = es.merge(desktops, icon, code, snapcraft, electronLaunch);
|
const all = es.merge(desktop, icon, code, snapcraft, electronLaunch, snapUpdate);
|
||||||
|
|
||||||
return all.pipe(vfs.dest(destination));
|
return all.pipe(vfs.dest(destination));
|
||||||
};
|
};
|
||||||
@@ -247,39 +217,119 @@ function prepareSnapPackage(arch) {
|
|||||||
|
|
||||||
function buildSnapPackage(arch) {
|
function buildSnapPackage(arch) {
|
||||||
const snapBuildPath = getSnapBuildPath(arch);
|
const snapBuildPath = getSnapBuildPath(arch);
|
||||||
// Default target for snapcraft runs: pull, build, stage and prime, and finally assembles the snap.
|
return shell.task(`cd ${snapBuildPath} && snapcraft build`);
|
||||||
return shell.task(`cd ${snapBuildPath} && snapcraft`);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const BUILD_TARGETS = [
|
function getFlatpakArch(arch) {
|
||||||
{ arch: 'x64' },
|
return { x64: 'x86_64', ia32: 'i386', arm: 'arm' }[arch];
|
||||||
{ arch: 'arm' },
|
}
|
||||||
{ arch: 'arm64' },
|
|
||||||
];
|
|
||||||
|
|
||||||
BUILD_TARGETS.forEach((buildTarget) => {
|
function prepareFlatpak(arch) {
|
||||||
const arch = buildTarget.arch;
|
// {{SQL CARBON EDIT}}
|
||||||
|
const binaryDir = '../azuredatastudio-linux-' + arch;
|
||||||
|
const flatpakArch = getFlatpakArch(arch);
|
||||||
|
const destination = '.build/linux/flatpak/' + flatpakArch;
|
||||||
|
|
||||||
{
|
return function () {
|
||||||
const debArch = getDebPackageArch(arch);
|
// This is not imported in the global scope to avoid requiring ImageMagick
|
||||||
const prepareDebTask = task.define(`vscode-linux-${arch}-prepare-deb`, task.series(util.rimraf(`.build/linux/deb/${debArch}`), prepareDebPackage(arch)));
|
// (or GraphicsMagick) when not building building Flatpak bundles.
|
||||||
// gulp.task(prepareDebTask);
|
const imgResize = require('gulp-image-resize');
|
||||||
const buildDebTask = task.define(`vscode-linux-${arch}-build-deb`, task.series(prepareDebTask, buildDebPackage(arch)));
|
|
||||||
gulp.task(buildDebTask);
|
const all = [16, 24, 32, 48, 64, 128, 192, 256, 512].map(function (size) {
|
||||||
|
return gulp.src('resources/linux/code.png', { base: '.' })
|
||||||
|
.pipe(imgResize({ width: size, height: size, format: "png", noProfile: true }))
|
||||||
|
.pipe(rename('share/icons/hicolor/' + size + 'x' + size + '/apps/' + flatpakManifest.appId + '.png'));
|
||||||
|
});
|
||||||
|
|
||||||
|
all.push(gulp.src('resources/linux/code.desktop', { base: '.' })
|
||||||
|
.pipe(replace('Exec=/usr/share/@@NAME@@/@@NAME@@', 'Exec=' + product.applicationName))
|
||||||
|
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
||||||
|
.pipe(replace('@@NAME_SHORT@@', product.nameShort))
|
||||||
|
.pipe(replace('@@NAME@@', product.applicationName))
|
||||||
|
.pipe(rename('share/applications/' + flatpakManifest.appId + '.desktop')));
|
||||||
|
|
||||||
|
all.push(gulp.src('resources/linux/code.appdata.xml', { base: '.' })
|
||||||
|
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
||||||
|
.pipe(replace('@@NAME@@', flatpakManifest.appId))
|
||||||
|
.pipe(replace('@@LICENSE@@', product.licenseName))
|
||||||
|
.pipe(rename('share/appdata/' + flatpakManifest.appId + '.appdata.xml')));
|
||||||
|
|
||||||
|
all.push(gulp.src(binaryDir + '/**/*', { base: binaryDir })
|
||||||
|
.pipe(rename(function (p) {
|
||||||
|
p.dirname = 'share/' + product.applicationName + '/' + p.dirname;
|
||||||
|
})));
|
||||||
|
|
||||||
|
return es.merge(all).pipe(vfs.dest(destination));
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildFlatpak(arch) {
|
||||||
|
const flatpakArch = getFlatpakArch(arch);
|
||||||
|
const manifest = {};
|
||||||
|
for (var k in flatpakManifest) {
|
||||||
|
manifest[k] = flatpakManifest[k];
|
||||||
}
|
}
|
||||||
|
manifest.files = [
|
||||||
{
|
['.build/linux/flatpak/' + flatpakArch, '/'],
|
||||||
const rpmArch = getRpmPackageArch(arch);
|
];
|
||||||
const prepareRpmTask = task.define(`vscode-linux-${arch}-prepare-rpm`, task.series(util.rimraf(`.build/linux/rpm/${rpmArch}`), prepareRpmPackage(arch)));
|
const buildOptions = {
|
||||||
// gulp.task(prepareRpmTask);
|
arch: flatpakArch,
|
||||||
const buildRpmTask = task.define(`vscode-linux-${arch}-build-rpm`, task.series(prepareRpmTask, buildRpmPackage(arch)));
|
subject: product.nameLong + ' ' + packageJson.version + '.' + linuxPackageRevision,
|
||||||
gulp.task(buildRpmTask);
|
};
|
||||||
|
// If requested, use the configured path for the OSTree repository.
|
||||||
|
if (process.env.FLATPAK_REPO) {
|
||||||
|
buildOptions.repoDir = process.env.FLATPAK_REPO;
|
||||||
|
} else {
|
||||||
|
buildOptions.bundlePath = manifest.appId + '-' + flatpakArch + '.flatpak';
|
||||||
}
|
}
|
||||||
|
// Setup PGP signing if requested.
|
||||||
{
|
if (process.env.GPG_KEY_ID !== undefined) {
|
||||||
const prepareSnapTask = task.define(`vscode-linux-${arch}-prepare-snap`, task.series(util.rimraf(`.build/linux/snap/${arch}`), prepareSnapPackage(arch)));
|
buildOptions.gpgSign = process.env.GPG_KEY_ID;
|
||||||
gulp.task(prepareSnapTask);
|
if (process.env.GPG_HOMEDIR) {
|
||||||
const buildSnapTask = task.define(`vscode-linux-${arch}-build-snap`, task.series(prepareSnapTask, buildSnapPackage(arch)));
|
buildOptions.gpgHomedir = process.env.GPG_HOME_DIR;
|
||||||
gulp.task(buildSnapTask);
|
}
|
||||||
}
|
}
|
||||||
});
|
return function (cb) {
|
||||||
|
require('flatpak-bundler').bundle(manifest, buildOptions, cb);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
gulp.task('clean-vscode-linux-ia32-deb', util.rimraf('.build/linux/deb/i386'));
|
||||||
|
gulp.task('clean-vscode-linux-x64-deb', util.rimraf('.build/linux/deb/amd64'));
|
||||||
|
gulp.task('clean-vscode-linux-arm-deb', util.rimraf('.build/linux/deb/armhf'));
|
||||||
|
gulp.task('clean-vscode-linux-arm64-deb', util.rimraf('.build/linux/deb/arm64'));
|
||||||
|
gulp.task('clean-vscode-linux-ia32-rpm', util.rimraf('.build/linux/rpm/i386'));
|
||||||
|
gulp.task('clean-vscode-linux-x64-rpm', util.rimraf('.build/linux/rpm/x86_64'));
|
||||||
|
gulp.task('clean-vscode-linux-arm-rpm', util.rimraf('.build/linux/rpm/armhf'));
|
||||||
|
gulp.task('clean-vscode-linux-arm64-rpm', util.rimraf('.build/linux/rpm/arm64'));
|
||||||
|
gulp.task('clean-vscode-linux-ia32-snap', util.rimraf('.build/linux/snap/x64'));
|
||||||
|
gulp.task('clean-vscode-linux-x64-snap', util.rimraf('.build/linux/snap/x64'));
|
||||||
|
gulp.task('clean-vscode-linux-arm-snap', util.rimraf('.build/linux/snap/x64'));
|
||||||
|
gulp.task('clean-vscode-linux-arm64-snap', util.rimraf('.build/linux/snap/x64'));
|
||||||
|
|
||||||
|
gulp.task('vscode-linux-ia32-prepare-deb', ['clean-vscode-linux-ia32-deb'], prepareDebPackage('ia32'));
|
||||||
|
gulp.task('vscode-linux-x64-prepare-deb', ['clean-vscode-linux-x64-deb'], prepareDebPackage('x64'));
|
||||||
|
gulp.task('vscode-linux-arm-prepare-deb', ['clean-vscode-linux-arm-deb'], prepareDebPackage('arm'));
|
||||||
|
gulp.task('vscode-linux-arm64-prepare-deb', ['clean-vscode-linux-arm64-deb'], prepareDebPackage('arm64'));
|
||||||
|
gulp.task('vscode-linux-ia32-build-deb', ['vscode-linux-ia32-prepare-deb'], buildDebPackage('ia32'));
|
||||||
|
gulp.task('vscode-linux-x64-build-deb', ['vscode-linux-x64-prepare-deb'], buildDebPackage('x64'));
|
||||||
|
gulp.task('vscode-linux-arm-build-deb', ['vscode-linux-arm-prepare-deb'], buildDebPackage('arm'));
|
||||||
|
gulp.task('vscode-linux-arm64-build-deb', ['vscode-linux-arm64-prepare-deb'], buildDebPackage('arm64'));
|
||||||
|
|
||||||
|
gulp.task('vscode-linux-ia32-prepare-rpm', ['clean-vscode-linux-ia32-rpm'], prepareRpmPackage('ia32'));
|
||||||
|
gulp.task('vscode-linux-x64-prepare-rpm', ['clean-vscode-linux-x64-rpm'], prepareRpmPackage('x64'));
|
||||||
|
gulp.task('vscode-linux-arm-prepare-rpm', ['clean-vscode-linux-arm-rpm'], prepareRpmPackage('arm'));
|
||||||
|
gulp.task('vscode-linux-arm64-prepare-rpm', ['clean-vscode-linux-arm64-rpm'], prepareRpmPackage('arm64'));
|
||||||
|
gulp.task('vscode-linux-ia32-build-rpm', ['vscode-linux-ia32-prepare-rpm'], buildRpmPackage('ia32'));
|
||||||
|
gulp.task('vscode-linux-x64-build-rpm', ['vscode-linux-x64-prepare-rpm'], buildRpmPackage('x64'));
|
||||||
|
gulp.task('vscode-linux-arm-build-rpm', ['vscode-linux-arm-prepare-rpm'], buildRpmPackage('arm'));
|
||||||
|
gulp.task('vscode-linux-arm64-build-rpm', ['vscode-linux-arm64-prepare-rpm'], buildRpmPackage('arm64'));
|
||||||
|
|
||||||
|
gulp.task('vscode-linux-ia32-prepare-snap', ['clean-vscode-linux-ia32-snap'], prepareSnapPackage('ia32'));
|
||||||
|
gulp.task('vscode-linux-x64-prepare-snap', ['clean-vscode-linux-x64-snap'], prepareSnapPackage('x64'));
|
||||||
|
gulp.task('vscode-linux-arm-prepare-snap', ['clean-vscode-linux-arm-snap'], prepareSnapPackage('arm'));
|
||||||
|
gulp.task('vscode-linux-arm64-prepare-snap', ['clean-vscode-linux-arm64-snap'], prepareSnapPackage('arm64'));
|
||||||
|
gulp.task('vscode-linux-ia32-build-snap', ['vscode-linux-ia32-prepare-snap'], buildSnapPackage('ia32'));
|
||||||
|
gulp.task('vscode-linux-x64-build-snap', ['vscode-linux-x64-prepare-snap'], buildSnapPackage('x64'));
|
||||||
|
gulp.task('vscode-linux-arm-build-snap', ['vscode-linux-arm-prepare-snap'], buildSnapPackage('arm'));
|
||||||
|
gulp.task('vscode-linux-arm64-build-snap', ['vscode-linux-arm64-prepare-snap'], buildSnapPackage('arm64'));
|
||||||
|
|||||||
@@ -1,16 +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');
|
|
||||||
|
|
||||||
const noop = () => { return Promise.resolve(); };
|
|
||||||
|
|
||||||
gulp.task('minify-vscode-web', noop);
|
|
||||||
gulp.task('vscode-web', noop);
|
|
||||||
gulp.task('vscode-web-min', noop);
|
|
||||||
gulp.task('vscode-web-ci', noop);
|
|
||||||
gulp.task('vscode-web-min-ci', noop);
|
|
||||||
@@ -12,7 +12,6 @@ const assert = require('assert');
|
|||||||
const cp = require('child_process');
|
const cp = require('child_process');
|
||||||
const _7z = require('7zip')['7z'];
|
const _7z = require('7zip')['7z'];
|
||||||
const util = require('./lib/util');
|
const util = require('./lib/util');
|
||||||
const task = require('./lib/task');
|
|
||||||
const pkg = require('../package.json');
|
const pkg = require('../package.json');
|
||||||
const product = require('../product.json');
|
const product = require('../product.json');
|
||||||
const vfs = require('vinyl-fs');
|
const vfs = require('vinyl-fs');
|
||||||
@@ -26,7 +25,7 @@ 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), `VSCode-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-compiler'))), 'bin', 'ISCC.exe');
|
||||||
const signPS1 = path.join(repoPath, 'build', 'azure-pipelines', 'win32', 'sign.ps1');
|
const signPS1 = path.join(repoPath, 'build', 'azure-pipelines', 'win32', 'sign.ps1');
|
||||||
|
|
||||||
function packageInnoSetup(iss, options, cb) {
|
function packageInnoSetup(iss, options, cb) {
|
||||||
@@ -49,8 +48,9 @@ function packageInnoSetup(iss, options, cb) {
|
|||||||
const defs = keys.map(key => `/d${key}=${definitions[key]}`);
|
const defs = keys.map(key => `/d${key}=${definitions[key]}`);
|
||||||
const args = [
|
const args = [
|
||||||
iss,
|
iss,
|
||||||
...defs,
|
...defs
|
||||||
`/sesrp=powershell.exe -ExecutionPolicy bypass ${signPS1} $f`
|
//,
|
||||||
|
//`/sesrp=powershell.exe -ExecutionPolicy bypass ${signPS1} $f`
|
||||||
];
|
];
|
||||||
|
|
||||||
cp.spawn(innoSetupPath, args, { stdio: ['ignore', 'inherit', 'inherit'] })
|
cp.spawn(innoSetupPath, args, { stdio: ['ignore', 'inherit', 'inherit'] })
|
||||||
@@ -107,8 +107,8 @@ function buildWin32Setup(arch, target) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function defineWin32SetupTasks(arch, target) {
|
function defineWin32SetupTasks(arch, target) {
|
||||||
const cleanTask = util.rimraf(setupDir(arch, target));
|
gulp.task(`clean-vscode-win32-${arch}-${target}-setup`, util.rimraf(setupDir(arch, target)));
|
||||||
gulp.task(task.define(`vscode-win32-${arch}-${target}-setup`, task.series(cleanTask, buildWin32Setup(arch, target))));
|
gulp.task(`vscode-win32-${arch}-${target}-setup`, [`clean-vscode-win32-${arch}-${target}-setup`], buildWin32Setup(arch, target));
|
||||||
}
|
}
|
||||||
|
|
||||||
defineWin32SetupTasks('ia32', 'system');
|
defineWin32SetupTasks('ia32', 'system');
|
||||||
@@ -126,8 +126,11 @@ function archiveWin32Setup(arch) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
gulp.task(task.define('vscode-win32-ia32-archive', task.series(util.rimraf(zipDir('ia32')), archiveWin32Setup('ia32'))));
|
gulp.task('clean-vscode-win32-ia32-archive', util.rimraf(zipDir('ia32')));
|
||||||
gulp.task(task.define('vscode-win32-x64-archive', task.series(util.rimraf(zipDir('x64')), archiveWin32Setup('x64'))));
|
gulp.task('vscode-win32-ia32-archive', ['clean-vscode-win32-ia32-archive'], archiveWin32Setup('ia32'));
|
||||||
|
|
||||||
|
gulp.task('clean-vscode-win32-x64-archive', util.rimraf(zipDir('x64')));
|
||||||
|
gulp.task('vscode-win32-x64-archive', ['clean-vscode-win32-x64-archive'], archiveWin32Setup('x64'));
|
||||||
|
|
||||||
function copyInnoUpdater(arch) {
|
function copyInnoUpdater(arch) {
|
||||||
return () => {
|
return () => {
|
||||||
@@ -136,17 +139,15 @@ function copyInnoUpdater(arch) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateIcon(executablePath) {
|
gulp.task('vscode-win32-ia32-copy-inno-updater', copyInnoUpdater('ia32'));
|
||||||
|
gulp.task('vscode-win32-x64-copy-inno-updater', copyInnoUpdater('x64'));
|
||||||
|
|
||||||
|
function patchInnoUpdater(arch) {
|
||||||
return cb => {
|
return cb => {
|
||||||
const icon = path.join(repoPath, 'resources', 'win32', 'code.ico');
|
const icon = path.join(repoPath, 'resources', 'win32', 'code.ico');
|
||||||
rcedit(executablePath, { icon }, cb);
|
rcedit(path.join(buildPath(arch), 'tools', 'inno_updater.exe'), { icon }, cb);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
gulp.task(task.define('vscode-win32-ia32-inno-updater', task.series(copyInnoUpdater('ia32'), updateIcon(path.join(buildPath('ia32'), 'tools', 'inno_updater.exe')))));
|
gulp.task('vscode-win32-ia32-inno-updater', ['vscode-win32-ia32-copy-inno-updater'], patchInnoUpdater('ia32'));
|
||||||
gulp.task(task.define('vscode-win32-x64-inno-updater', task.series(copyInnoUpdater('x64'), updateIcon(path.join(buildPath('x64'), 'tools', 'inno_updater.exe')))));
|
gulp.task('vscode-win32-x64-inno-updater', ['vscode-win32-x64-copy-inno-updater'], patchInnoUpdater('x64'));
|
||||||
|
|
||||||
// CodeHelper.exe icon
|
|
||||||
|
|
||||||
gulp.task(task.define('vscode-win32-ia32-code-helper', task.series(updateIcon(path.join(buildPath('ia32'), 'resources', 'app', 'out', 'vs', 'platform', 'files', 'node', 'watcher', 'win32', 'CodeHelper.exe')))));
|
|
||||||
gulp.task(task.define('vscode-win32-x64-code-helper', task.series(updateIcon(path.join(buildPath('x64'), 'resources', 'app', 'out', 'vs', 'platform', 'files', 'node', 'watcher', 'win32', 'CodeHelper.exe')))));
|
|
||||||
@@ -14,14 +14,10 @@ const es = require('event-stream');
|
|||||||
const rename = require('gulp-rename');
|
const rename = require('gulp-rename');
|
||||||
const vfs = require('vinyl-fs');
|
const vfs = require('vinyl-fs');
|
||||||
const ext = require('./extensions');
|
const ext = require('./extensions');
|
||||||
const fancyLog = require('fancy-log');
|
const util = require('gulp-util');
|
||||||
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');
|
||||||
|
|
||||||
function getExtensionPath(extension) {
|
function getExtensionPath(extension) {
|
||||||
@@ -47,7 +43,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('✔︎'));
|
util.log(util.colors.blue('[marketplace]'), `${extension.name}@${extension.version}`, util.colors.green('✔︎'));
|
||||||
return es.readArray([]);
|
return es.readArray([]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,13 +52,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', () => util.log(util.colors.blue('[marketplace]'), extension.name, util.colors.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));
|
util.log(util.colors.blue('[disabled]'), util.colors.gray(extension.name));
|
||||||
return es.readArray([]);
|
return es.readArray([]);
|
||||||
|
|
||||||
case 'marketplace':
|
case 'marketplace':
|
||||||
@@ -70,15 +66,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.`));
|
util.log(util.colors.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.`));
|
util.log(util.colors.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('✔︎'));
|
util.log(util.colors.blue('[local]'), `${extension.name}: ${util.colors.cyan(controlState)}`, util.colors.green('✔︎'));
|
||||||
return es.readArray([]);
|
return es.readArray([]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -97,8 +93,8 @@ function writeControlFile(control) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function main() {
|
function main() {
|
||||||
fancyLog('Syncronizing built-in extensions...');
|
util.log('Syncronizing built-in extensions...');
|
||||||
fancyLog(`You can manage built-in extensions with the ${ansiColors.cyan('--builtin')} flag`);
|
util.log(`You can manage built-in extensions with the ${util.colors.cyan('--builtin')} flag`);
|
||||||
|
|
||||||
const control = readControlFile();
|
const control = readControlFile();
|
||||||
const streams = [];
|
const streams = [];
|
||||||
|
|||||||
@@ -11,17 +11,24 @@ const bom = require("gulp-bom");
|
|||||||
const sourcemaps = require("gulp-sourcemaps");
|
const sourcemaps = require("gulp-sourcemaps");
|
||||||
const tsb = require("gulp-tsb");
|
const tsb = require("gulp-tsb");
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
|
const _ = require("underscore");
|
||||||
const monacodts = require("../monaco/api");
|
const monacodts = require("../monaco/api");
|
||||||
const nls = require("./nls");
|
const nls = require("./nls");
|
||||||
const reporter_1 = require("./reporter");
|
const reporter_1 = require("./reporter");
|
||||||
const util = require("./util");
|
const util = require("./util");
|
||||||
const fancyLog = require("fancy-log");
|
const util2 = require("gulp-util");
|
||||||
const ansiColors = require("ansi-colors");
|
|
||||||
const watch = require('./watch');
|
const watch = require('./watch');
|
||||||
const reporter = reporter_1.createReporter();
|
const reporter = reporter_1.createReporter();
|
||||||
function getTypeScriptCompilerOptions(src) {
|
function getTypeScriptCompilerOptions(src) {
|
||||||
const rootDir = path.join(__dirname, `../../${src}`);
|
const rootDir = path.join(__dirname, `../../${src}`);
|
||||||
let options = {};
|
const tsconfig = require(`../../${src}/tsconfig.json`);
|
||||||
|
let options;
|
||||||
|
if (tsconfig.extends) {
|
||||||
|
options = Object.assign({}, require(path.join(rootDir, tsconfig.extends)).compilerOptions, tsconfig.compilerOptions);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
options = tsconfig.compilerOptions;
|
||||||
|
}
|
||||||
options.verbose = false;
|
options.verbose = false;
|
||||||
options.sourceMap = true;
|
options.sourceMap = true;
|
||||||
if (process.env['VSCODE_NO_SOURCEMAP']) { // To be used by developers in a hurry
|
if (process.env['VSCODE_NO_SOURCEMAP']) { // To be used by developers in a hurry
|
||||||
@@ -30,14 +37,15 @@ function getTypeScriptCompilerOptions(src) {
|
|||||||
options.rootDir = rootDir;
|
options.rootDir = rootDir;
|
||||||
options.baseUrl = rootDir;
|
options.baseUrl = rootDir;
|
||||||
options.sourceRoot = util.toFileUri(rootDir);
|
options.sourceRoot = util.toFileUri(rootDir);
|
||||||
options.newLine = /\r\n/.test(fs.readFileSync(__filename, 'utf8')) ? 0 : 1;
|
options.newLine = /\r\n/.test(fs.readFileSync(__filename, 'utf8')) ? 'CRLF' : 'LF';
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
function createCompile(src, build, emitError) {
|
function createCompile(src, build, emitError) {
|
||||||
const projectPath = path.join(__dirname, '../../', src, 'tsconfig.json');
|
const opts = _.clone(getTypeScriptCompilerOptions(src));
|
||||||
const overrideOptions = Object.assign(Object.assign({}, getTypeScriptCompilerOptions(src)), { inlineSources: Boolean(build) });
|
opts.inlineSources = !!build;
|
||||||
const compilation = tsb.create(projectPath, overrideOptions, false, err => reporter(err));
|
opts.noFilesystemLookup = true;
|
||||||
function pipeline(token) {
|
const ts = tsb.create(opts, true, undefined, err => reporter(err.toString()));
|
||||||
|
return function (token) {
|
||||||
const utf8Filter = util.filter(data => /(\/|\\)test(\/|\\).*utf8/.test(data.path));
|
const utf8Filter = util.filter(data => /(\/|\\)test(\/|\\).*utf8/.test(data.path));
|
||||||
const tsFilter = util.filter(data => /\.ts$/.test(data.path));
|
const tsFilter = util.filter(data => /\.ts$/.test(data.path));
|
||||||
const noDeclarationsFilter = util.filter(data => !(/\.d\.ts$/.test(data.path)));
|
const noDeclarationsFilter = util.filter(data => !(/\.d\.ts$/.test(data.path)));
|
||||||
@@ -48,28 +56,30 @@ function createCompile(src, build, emitError) {
|
|||||||
.pipe(utf8Filter.restore)
|
.pipe(utf8Filter.restore)
|
||||||
.pipe(tsFilter)
|
.pipe(tsFilter)
|
||||||
.pipe(util.loadSourcemaps())
|
.pipe(util.loadSourcemaps())
|
||||||
.pipe(compilation(token))
|
.pipe(ts(token))
|
||||||
.pipe(noDeclarationsFilter)
|
.pipe(noDeclarationsFilter)
|
||||||
.pipe(build ? nls() : es.through())
|
.pipe(build ? nls() : es.through())
|
||||||
.pipe(noDeclarationsFilter.restore)
|
.pipe(noDeclarationsFilter.restore)
|
||||||
.pipe(sourcemaps.write('.', {
|
.pipe(sourcemaps.write('.', {
|
||||||
addComment: false,
|
addComment: false,
|
||||||
includeContent: !!build,
|
includeContent: !!build,
|
||||||
sourceRoot: overrideOptions.sourceRoot
|
sourceRoot: opts.sourceRoot
|
||||||
}))
|
}))
|
||||||
.pipe(tsFilter.restore)
|
.pipe(tsFilter.restore)
|
||||||
.pipe(reporter.end(!!emitError));
|
.pipe(reporter.end(!!emitError));
|
||||||
return es.duplex(input, output);
|
return es.duplex(input, output);
|
||||||
}
|
|
||||||
pipeline.tsProjectSrc = () => {
|
|
||||||
return compilation.src({ base: src });
|
|
||||||
};
|
};
|
||||||
return pipeline;
|
|
||||||
}
|
}
|
||||||
|
const typesDts = [
|
||||||
|
'node_modules/typescript/lib/*.d.ts',
|
||||||
|
'node_modules/@types/**/*.d.ts',
|
||||||
|
'!node_modules/@types/webpack/**/*',
|
||||||
|
'!node_modules/@types/uglify-js/**/*',
|
||||||
|
];
|
||||||
function compileTask(src, out, build) {
|
function compileTask(src, out, build) {
|
||||||
return function () {
|
return function () {
|
||||||
const compile = createCompile(src, build, true);
|
const compile = createCompile(src, build, true);
|
||||||
const srcPipe = gulp.src(`${src}/**`, { base: `${src}` });
|
const srcPipe = es.merge(gulp.src(`${src}/**`, { base: `${src}` }), gulp.src(typesDts));
|
||||||
let generator = new MonacoGenerator(false);
|
let generator = new MonacoGenerator(false);
|
||||||
if (src === 'src') {
|
if (src === 'src') {
|
||||||
generator.execute();
|
generator.execute();
|
||||||
@@ -84,8 +94,8 @@ exports.compileTask = compileTask;
|
|||||||
function watchTask(out, build) {
|
function watchTask(out, build) {
|
||||||
return function () {
|
return function () {
|
||||||
const compile = createCompile('src', build);
|
const compile = createCompile('src', build);
|
||||||
const src = gulp.src('src/**', { base: 'src' });
|
const src = es.merge(gulp.src('src/**', { base: 'src' }), gulp.src(typesDts));
|
||||||
const watchSrc = watch('src/**', { base: 'src', readDelay: 200 });
|
const watchSrc = watch('src/**', { base: 'src' });
|
||||||
let generator = new MonacoGenerator(true);
|
let generator = new MonacoGenerator(true);
|
||||||
generator.execute();
|
generator.execute();
|
||||||
return watchSrc
|
return watchSrc
|
||||||
@@ -101,6 +111,7 @@ class MonacoGenerator {
|
|||||||
this._executeSoonTimer = null;
|
this._executeSoonTimer = null;
|
||||||
this._isWatch = isWatch;
|
this._isWatch = isWatch;
|
||||||
this.stream = es.through();
|
this.stream = es.through();
|
||||||
|
this._watchers = [];
|
||||||
this._watchedFiles = {};
|
this._watchedFiles = {};
|
||||||
let onWillReadFile = (moduleId, filePath) => {
|
let onWillReadFile = (moduleId, filePath) => {
|
||||||
if (!this._isWatch) {
|
if (!this._isWatch) {
|
||||||
@@ -110,10 +121,12 @@ class MonacoGenerator {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this._watchedFiles[filePath] = true;
|
this._watchedFiles[filePath] = true;
|
||||||
fs.watchFile(filePath, () => {
|
const watcher = fs.watch(filePath);
|
||||||
|
watcher.addListener('change', () => {
|
||||||
this._declarationResolver.invalidateCache(moduleId);
|
this._declarationResolver.invalidateCache(moduleId);
|
||||||
this._executeSoon();
|
this._executeSoon();
|
||||||
});
|
});
|
||||||
|
this._watchers.push(watcher);
|
||||||
};
|
};
|
||||||
this._fsProvider = new class extends monacodts.FSProvider {
|
this._fsProvider = new class extends monacodts.FSProvider {
|
||||||
readFileSync(moduleId, filePath) {
|
readFileSync(moduleId, filePath) {
|
||||||
@@ -123,9 +136,11 @@ class MonacoGenerator {
|
|||||||
};
|
};
|
||||||
this._declarationResolver = new monacodts.DeclarationResolver(this._fsProvider);
|
this._declarationResolver = new monacodts.DeclarationResolver(this._fsProvider);
|
||||||
if (this._isWatch) {
|
if (this._isWatch) {
|
||||||
fs.watchFile(monacodts.RECIPE_PATH, () => {
|
const recipeWatcher = fs.watch(monacodts.RECIPE_PATH);
|
||||||
|
recipeWatcher.addListener('change', () => {
|
||||||
this._executeSoon();
|
this._executeSoon();
|
||||||
});
|
});
|
||||||
|
this._watchers.push(recipeWatcher);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_executeSoon() {
|
_executeSoon() {
|
||||||
@@ -138,6 +153,9 @@ class MonacoGenerator {
|
|||||||
this.execute();
|
this.execute();
|
||||||
}, 20);
|
}, 20);
|
||||||
}
|
}
|
||||||
|
dispose() {
|
||||||
|
this._watchers.forEach(watcher => watcher.close());
|
||||||
|
}
|
||||||
_run() {
|
_run() {
|
||||||
let r = monacodts.run3(this._declarationResolver);
|
let r = monacodts.run3(this._declarationResolver);
|
||||||
if (!r && !this._isWatch) {
|
if (!r && !this._isWatch) {
|
||||||
@@ -147,7 +165,7 @@ class MonacoGenerator {
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
_log(message, ...rest) {
|
_log(message, ...rest) {
|
||||||
fancyLog(ansiColors.cyan('[monaco.d.ts]'), message, ...rest);
|
util2.log(util2.colors.cyan('[monaco.d.ts]'), message, ...rest);
|
||||||
}
|
}
|
||||||
execute() {
|
execute() {
|
||||||
const startTime = Date.now();
|
const startTime = Date.now();
|
||||||
|
|||||||
@@ -12,21 +12,25 @@ import * as bom from 'gulp-bom';
|
|||||||
import * as sourcemaps from 'gulp-sourcemaps';
|
import * as sourcemaps from 'gulp-sourcemaps';
|
||||||
import * as tsb from 'gulp-tsb';
|
import * as tsb from 'gulp-tsb';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
|
import * as _ from 'underscore';
|
||||||
import * as monacodts from '../monaco/api';
|
import * as monacodts from '../monaco/api';
|
||||||
import * as nls from './nls';
|
import * as nls from './nls';
|
||||||
import { createReporter } from './reporter';
|
import { createReporter } from './reporter';
|
||||||
import * as util from './util';
|
import * as util from './util';
|
||||||
import * as fancyLog from 'fancy-log';
|
import * as util2 from 'gulp-util';
|
||||||
import * as ansiColors from 'ansi-colors';
|
|
||||||
import ts = require('typescript');
|
|
||||||
|
|
||||||
const watch = require('./watch');
|
const watch = require('./watch');
|
||||||
|
|
||||||
const reporter = createReporter();
|
const reporter = createReporter();
|
||||||
|
|
||||||
function getTypeScriptCompilerOptions(src: string): ts.CompilerOptions {
|
function getTypeScriptCompilerOptions(src: string) {
|
||||||
const rootDir = path.join(__dirname, `../../${src}`);
|
const rootDir = path.join(__dirname, `../../${src}`);
|
||||||
let options: ts.CompilerOptions = {};
|
const tsconfig = require(`../../${src}/tsconfig.json`);
|
||||||
|
let options: { [key: string]: any };
|
||||||
|
if (tsconfig.extends) {
|
||||||
|
options = Object.assign({}, require(path.join(rootDir, tsconfig.extends)).compilerOptions, tsconfig.compilerOptions);
|
||||||
|
} else {
|
||||||
|
options = tsconfig.compilerOptions;
|
||||||
|
}
|
||||||
options.verbose = false;
|
options.verbose = false;
|
||||||
options.sourceMap = true;
|
options.sourceMap = true;
|
||||||
if (process.env['VSCODE_NO_SOURCEMAP']) { // To be used by developers in a hurry
|
if (process.env['VSCODE_NO_SOURCEMAP']) { // To be used by developers in a hurry
|
||||||
@@ -35,17 +39,18 @@ function getTypeScriptCompilerOptions(src: string): ts.CompilerOptions {
|
|||||||
options.rootDir = rootDir;
|
options.rootDir = rootDir;
|
||||||
options.baseUrl = rootDir;
|
options.baseUrl = rootDir;
|
||||||
options.sourceRoot = util.toFileUri(rootDir);
|
options.sourceRoot = util.toFileUri(rootDir);
|
||||||
options.newLine = /\r\n/.test(fs.readFileSync(__filename, 'utf8')) ? 0 : 1;
|
options.newLine = /\r\n/.test(fs.readFileSync(__filename, 'utf8')) ? 'CRLF' : 'LF';
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
function createCompile(src: string, build: boolean, emitError?: boolean) {
|
function createCompile(src: string, build: boolean, emitError?: boolean): (token?: util.ICancellationToken) => NodeJS.ReadWriteStream {
|
||||||
const projectPath = path.join(__dirname, '../../', src, 'tsconfig.json');
|
const opts = _.clone(getTypeScriptCompilerOptions(src));
|
||||||
const overrideOptions = { ...getTypeScriptCompilerOptions(src), inlineSources: Boolean(build) };
|
opts.inlineSources = !!build;
|
||||||
|
opts.noFilesystemLookup = true;
|
||||||
|
|
||||||
const compilation = tsb.create(projectPath, overrideOptions, false, err => reporter(err));
|
const ts = tsb.create(opts, true, undefined, err => reporter(err.toString()));
|
||||||
|
|
||||||
function pipeline(token?: util.ICancellationToken) {
|
return function (token?: util.ICancellationToken) {
|
||||||
|
|
||||||
const utf8Filter = util.filter(data => /(\/|\\)test(\/|\\).*utf8/.test(data.path));
|
const utf8Filter = util.filter(data => /(\/|\\)test(\/|\\).*utf8/.test(data.path));
|
||||||
const tsFilter = util.filter(data => /\.ts$/.test(data.path));
|
const tsFilter = util.filter(data => /\.ts$/.test(data.path));
|
||||||
@@ -58,31 +63,39 @@ function createCompile(src: string, build: boolean, emitError?: boolean) {
|
|||||||
.pipe(utf8Filter.restore)
|
.pipe(utf8Filter.restore)
|
||||||
.pipe(tsFilter)
|
.pipe(tsFilter)
|
||||||
.pipe(util.loadSourcemaps())
|
.pipe(util.loadSourcemaps())
|
||||||
.pipe(compilation(token))
|
.pipe(ts(token))
|
||||||
.pipe(noDeclarationsFilter)
|
.pipe(noDeclarationsFilter)
|
||||||
.pipe(build ? nls() : es.through())
|
.pipe(build ? nls() : es.through())
|
||||||
.pipe(noDeclarationsFilter.restore)
|
.pipe(noDeclarationsFilter.restore)
|
||||||
.pipe(sourcemaps.write('.', {
|
.pipe(sourcemaps.write('.', {
|
||||||
addComment: false,
|
addComment: false,
|
||||||
includeContent: !!build,
|
includeContent: !!build,
|
||||||
sourceRoot: overrideOptions.sourceRoot
|
sourceRoot: opts.sourceRoot
|
||||||
}))
|
}))
|
||||||
.pipe(tsFilter.restore)
|
.pipe(tsFilter.restore)
|
||||||
.pipe(reporter.end(!!emitError));
|
.pipe(reporter.end(!!emitError));
|
||||||
|
|
||||||
return es.duplex(input, output);
|
return es.duplex(input, output);
|
||||||
}
|
|
||||||
pipeline.tsProjectSrc = () => {
|
|
||||||
return compilation.src({ base: src });
|
|
||||||
};
|
};
|
||||||
return pipeline;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const typesDts = [
|
||||||
|
'node_modules/typescript/lib/*.d.ts',
|
||||||
|
'node_modules/@types/**/*.d.ts',
|
||||||
|
'!node_modules/@types/webpack/**/*',
|
||||||
|
'!node_modules/@types/uglify-js/**/*',
|
||||||
|
];
|
||||||
|
|
||||||
export function compileTask(src: string, out: string, build: boolean): () => NodeJS.ReadWriteStream {
|
export function compileTask(src: string, out: string, build: boolean): () => NodeJS.ReadWriteStream {
|
||||||
|
|
||||||
return function () {
|
return function () {
|
||||||
const compile = createCompile(src, build, true);
|
const compile = createCompile(src, build, true);
|
||||||
const srcPipe = gulp.src(`${src}/**`, { base: `${src}` });
|
|
||||||
|
const srcPipe = es.merge(
|
||||||
|
gulp.src(`${src}/**`, { base: `${src}` }),
|
||||||
|
gulp.src(typesDts),
|
||||||
|
);
|
||||||
|
|
||||||
let generator = new MonacoGenerator(false);
|
let generator = new MonacoGenerator(false);
|
||||||
if (src === 'src') {
|
if (src === 'src') {
|
||||||
generator.execute();
|
generator.execute();
|
||||||
@@ -100,8 +113,11 @@ export function watchTask(out: string, build: boolean): () => NodeJS.ReadWriteSt
|
|||||||
return function () {
|
return function () {
|
||||||
const compile = createCompile('src', build);
|
const compile = createCompile('src', build);
|
||||||
|
|
||||||
const src = gulp.src('src/**', { base: 'src' });
|
const src = es.merge(
|
||||||
const watchSrc = watch('src/**', { base: 'src', readDelay: 200 });
|
gulp.src('src/**', { base: 'src' }),
|
||||||
|
gulp.src(typesDts),
|
||||||
|
);
|
||||||
|
const watchSrc = watch('src/**', { base: 'src' });
|
||||||
|
|
||||||
let generator = new MonacoGenerator(true);
|
let generator = new MonacoGenerator(true);
|
||||||
generator.execute();
|
generator.execute();
|
||||||
@@ -119,6 +135,7 @@ class MonacoGenerator {
|
|||||||
private readonly _isWatch: boolean;
|
private readonly _isWatch: boolean;
|
||||||
public readonly stream: NodeJS.ReadWriteStream;
|
public readonly stream: NodeJS.ReadWriteStream;
|
||||||
|
|
||||||
|
private readonly _watchers: fs.FSWatcher[];
|
||||||
private readonly _watchedFiles: { [filePath: string]: boolean; };
|
private readonly _watchedFiles: { [filePath: string]: boolean; };
|
||||||
private readonly _fsProvider: monacodts.FSProvider;
|
private readonly _fsProvider: monacodts.FSProvider;
|
||||||
private readonly _declarationResolver: monacodts.DeclarationResolver;
|
private readonly _declarationResolver: monacodts.DeclarationResolver;
|
||||||
@@ -126,6 +143,7 @@ class MonacoGenerator {
|
|||||||
constructor(isWatch: boolean) {
|
constructor(isWatch: boolean) {
|
||||||
this._isWatch = isWatch;
|
this._isWatch = isWatch;
|
||||||
this.stream = es.through();
|
this.stream = es.through();
|
||||||
|
this._watchers = [];
|
||||||
this._watchedFiles = {};
|
this._watchedFiles = {};
|
||||||
let onWillReadFile = (moduleId: string, filePath: string) => {
|
let onWillReadFile = (moduleId: string, filePath: string) => {
|
||||||
if (!this._isWatch) {
|
if (!this._isWatch) {
|
||||||
@@ -136,10 +154,12 @@ class MonacoGenerator {
|
|||||||
}
|
}
|
||||||
this._watchedFiles[filePath] = true;
|
this._watchedFiles[filePath] = true;
|
||||||
|
|
||||||
fs.watchFile(filePath, () => {
|
const watcher = fs.watch(filePath);
|
||||||
|
watcher.addListener('change', () => {
|
||||||
this._declarationResolver.invalidateCache(moduleId);
|
this._declarationResolver.invalidateCache(moduleId);
|
||||||
this._executeSoon();
|
this._executeSoon();
|
||||||
});
|
});
|
||||||
|
this._watchers.push(watcher);
|
||||||
};
|
};
|
||||||
this._fsProvider = new class extends monacodts.FSProvider {
|
this._fsProvider = new class extends monacodts.FSProvider {
|
||||||
public readFileSync(moduleId: string, filePath: string): Buffer {
|
public readFileSync(moduleId: string, filePath: string): Buffer {
|
||||||
@@ -150,9 +170,11 @@ class MonacoGenerator {
|
|||||||
this._declarationResolver = new monacodts.DeclarationResolver(this._fsProvider);
|
this._declarationResolver = new monacodts.DeclarationResolver(this._fsProvider);
|
||||||
|
|
||||||
if (this._isWatch) {
|
if (this._isWatch) {
|
||||||
fs.watchFile(monacodts.RECIPE_PATH, () => {
|
const recipeWatcher = fs.watch(monacodts.RECIPE_PATH);
|
||||||
|
recipeWatcher.addListener('change', () => {
|
||||||
this._executeSoon();
|
this._executeSoon();
|
||||||
});
|
});
|
||||||
|
this._watchers.push(recipeWatcher);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,6 +190,10 @@ class MonacoGenerator {
|
|||||||
}, 20);
|
}, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public dispose(): void {
|
||||||
|
this._watchers.forEach(watcher => watcher.close());
|
||||||
|
}
|
||||||
|
|
||||||
private _run(): monacodts.IMonacoDeclarationResult | null {
|
private _run(): monacodts.IMonacoDeclarationResult | null {
|
||||||
let r = monacodts.run3(this._declarationResolver);
|
let r = monacodts.run3(this._declarationResolver);
|
||||||
if (!r && !this._isWatch) {
|
if (!r && !this._isWatch) {
|
||||||
@@ -178,7 +204,7 @@ class MonacoGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private _log(message: any, ...rest: any[]): void {
|
private _log(message: any, ...rest: any[]): void {
|
||||||
fancyLog(ansiColors.cyan('[monaco.d.ts]'), message, ...rest);
|
util2.log(util2.colors.cyan('[monaco.d.ts]'), message, ...rest);
|
||||||
}
|
}
|
||||||
|
|
||||||
public execute(): void {
|
public execute(): void {
|
||||||
|
|||||||
@@ -2,88 +2,29 @@
|
|||||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
const fs = require("fs");
|
const fs = require('fs');
|
||||||
const path = require("path");
|
const path = require('path');
|
||||||
const vfs = require("vinyl-fs");
|
|
||||||
const filter = require("gulp-filter");
|
|
||||||
const json = require("gulp-json-editor");
|
|
||||||
const _ = require("underscore");
|
|
||||||
const util = require("./util");
|
|
||||||
const electron = require('gulp-atom-electron');
|
|
||||||
const root = path.dirname(path.dirname(__dirname));
|
const root = path.dirname(path.dirname(__dirname));
|
||||||
const product = JSON.parse(fs.readFileSync(path.join(root, 'product.json'), 'utf8'));
|
|
||||||
const commit = util.getVersion(root);
|
|
||||||
function getElectronVersion() {
|
function getElectronVersion() {
|
||||||
const yarnrc = fs.readFileSync(path.join(root, '.yarnrc'), 'utf8');
|
const yarnrc = fs.readFileSync(path.join(root, '.yarnrc'), 'utf8');
|
||||||
const target = /^target "(.*)"$/m.exec(yarnrc)[1];
|
// @ts-ignore
|
||||||
return target;
|
const target = /^target "(.*)"$/m.exec(yarnrc)[1];
|
||||||
}
|
|
||||||
exports.getElectronVersion = getElectronVersion;
|
return target;
|
||||||
const darwinCreditsTemplate = product.darwinCredits && _.template(fs.readFileSync(path.join(root, product.darwinCredits), 'utf8'));
|
|
||||||
function darwinBundleDocumentType(extensions, icon) {
|
|
||||||
return {
|
|
||||||
name: product.nameLong + ' document',
|
|
||||||
role: 'Editor',
|
|
||||||
ostypes: ["TEXT", "utxt", "TUTX", "****"],
|
|
||||||
extensions: extensions,
|
|
||||||
iconFile: icon
|
|
||||||
};
|
|
||||||
}
|
|
||||||
exports.config = {
|
|
||||||
version: getElectronVersion(),
|
|
||||||
productAppName: product.nameLong,
|
|
||||||
companyName: 'Microsoft Corporation',
|
|
||||||
copyright: 'Copyright (C) 2019 Microsoft. All rights reserved',
|
|
||||||
darwinIcon: 'resources/darwin/code.icns',
|
|
||||||
darwinBundleIdentifier: product.darwinBundleIdentifier,
|
|
||||||
darwinApplicationCategoryType: 'public.app-category.developer-tools',
|
|
||||||
darwinHelpBookFolder: 'VS Code HelpBook',
|
|
||||||
darwinHelpBookName: 'VS Code HelpBook',
|
|
||||||
darwinBundleDocumentTypes: [
|
|
||||||
darwinBundleDocumentType(["csv", "json", "sqlplan", "sql", "xml"], 'resources/darwin/code_file.icns'),
|
|
||||||
],
|
|
||||||
darwinBundleURLTypes: [{
|
|
||||||
role: 'Viewer',
|
|
||||||
name: product.nameLong,
|
|
||||||
urlSchemes: [product.urlProtocol]
|
|
||||||
}],
|
|
||||||
darwinForceDarkModeSupport: true,
|
|
||||||
darwinCredits: darwinCreditsTemplate ? Buffer.from(darwinCreditsTemplate({ commit: commit, date: new Date().toISOString() })) : undefined,
|
|
||||||
linuxExecutableName: product.applicationName,
|
|
||||||
winIcon: 'resources/win32/code.ico',
|
|
||||||
token: process.env['VSCODE_MIXIN_PASSWORD'] || process.env['GITHUB_TOKEN'] || undefined,
|
|
||||||
repo: product.electronRepository || undefined
|
|
||||||
};
|
|
||||||
function getElectron(arch) {
|
|
||||||
return () => {
|
|
||||||
const electronOpts = _.extend({}, exports.config, {
|
|
||||||
platform: process.platform,
|
|
||||||
arch,
|
|
||||||
ffmpegChromium: true,
|
|
||||||
keepDefaultApp: true
|
|
||||||
});
|
|
||||||
return vfs.src('package.json')
|
|
||||||
.pipe(json({ name: product.nameShort }))
|
|
||||||
.pipe(electron(electronOpts))
|
|
||||||
.pipe(filter(['**', '!**/app/package.json']))
|
|
||||||
.pipe(vfs.dest('.build/electron'));
|
|
||||||
};
|
|
||||||
}
|
|
||||||
async function main(arch = process.arch) {
|
|
||||||
const version = getElectronVersion();
|
|
||||||
const electronPath = path.join(root, '.build', 'electron');
|
|
||||||
const versionFile = path.join(electronPath, 'version');
|
|
||||||
const isUpToDate = fs.existsSync(versionFile) && fs.readFileSync(versionFile, 'utf8') === `${version}`;
|
|
||||||
if (!isUpToDate) {
|
|
||||||
await util.rimraf(electronPath)();
|
|
||||||
await util.streamToPromise(getElectron(arch)());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
module.exports.getElectronVersion = getElectronVersion;
|
||||||
|
|
||||||
|
// returns 0 if the right version of electron is in .build/electron
|
||||||
|
// @ts-ignore
|
||||||
if (require.main === module) {
|
if (require.main === module) {
|
||||||
main(process.argv[2]).catch(err => {
|
const version = getElectronVersion();
|
||||||
console.error(err);
|
const versionFile = path.join(root, '.build', 'electron', 'version');
|
||||||
process.exit(1);
|
const isUpToDate = fs.existsSync(versionFile) && fs.readFileSync(versionFile, 'utf8') === `v${version}`;
|
||||||
});
|
|
||||||
|
process.exit(isUpToDate ? 0 : 1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,100 +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';
|
|
||||||
|
|
||||||
import * as fs from 'fs';
|
|
||||||
import * as path from 'path';
|
|
||||||
import * as vfs from 'vinyl-fs';
|
|
||||||
import * as filter from 'gulp-filter';
|
|
||||||
import * as json from 'gulp-json-editor';
|
|
||||||
import * as _ from 'underscore';
|
|
||||||
import * as util from './util';
|
|
||||||
|
|
||||||
const electron = require('gulp-atom-electron');
|
|
||||||
|
|
||||||
const root = path.dirname(path.dirname(__dirname));
|
|
||||||
const product = JSON.parse(fs.readFileSync(path.join(root, 'product.json'), 'utf8'));
|
|
||||||
const commit = util.getVersion(root);
|
|
||||||
|
|
||||||
export function getElectronVersion(): string {
|
|
||||||
const yarnrc = fs.readFileSync(path.join(root, '.yarnrc'), 'utf8');
|
|
||||||
const target = /^target "(.*)"$/m.exec(yarnrc)![1];
|
|
||||||
return target;
|
|
||||||
}
|
|
||||||
|
|
||||||
const darwinCreditsTemplate = product.darwinCredits && _.template(fs.readFileSync(path.join(root, product.darwinCredits), 'utf8'));
|
|
||||||
|
|
||||||
function darwinBundleDocumentType(extensions: string[], icon: string) {
|
|
||||||
return {
|
|
||||||
name: product.nameLong + ' document',
|
|
||||||
role: 'Editor',
|
|
||||||
ostypes: ["TEXT", "utxt", "TUTX", "****"],
|
|
||||||
extensions: extensions,
|
|
||||||
iconFile: icon
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export const config = {
|
|
||||||
version: getElectronVersion(),
|
|
||||||
productAppName: product.nameLong,
|
|
||||||
companyName: 'Microsoft Corporation',
|
|
||||||
copyright: 'Copyright (C) 2019 Microsoft. All rights reserved',
|
|
||||||
darwinIcon: 'resources/darwin/code.icns',
|
|
||||||
darwinBundleIdentifier: product.darwinBundleIdentifier,
|
|
||||||
darwinApplicationCategoryType: 'public.app-category.developer-tools',
|
|
||||||
darwinHelpBookFolder: 'VS Code HelpBook',
|
|
||||||
darwinHelpBookName: 'VS Code HelpBook',
|
|
||||||
darwinBundleDocumentTypes: [
|
|
||||||
darwinBundleDocumentType(["csv", "json", "sqlplan", "sql", "xml"], 'resources/darwin/code_file.icns'),
|
|
||||||
],
|
|
||||||
darwinBundleURLTypes: [{
|
|
||||||
role: 'Viewer',
|
|
||||||
name: product.nameLong,
|
|
||||||
urlSchemes: [product.urlProtocol]
|
|
||||||
}],
|
|
||||||
darwinForceDarkModeSupport: true,
|
|
||||||
darwinCredits: darwinCreditsTemplate ? Buffer.from(darwinCreditsTemplate({ commit: commit, date: new Date().toISOString() })) : undefined,
|
|
||||||
linuxExecutableName: product.applicationName,
|
|
||||||
winIcon: 'resources/win32/code.ico',
|
|
||||||
token: process.env['VSCODE_MIXIN_PASSWORD'] || process.env['GITHUB_TOKEN'] || undefined,
|
|
||||||
repo: product.electronRepository || undefined
|
|
||||||
};
|
|
||||||
|
|
||||||
function getElectron(arch: string): () => NodeJS.ReadWriteStream {
|
|
||||||
return () => {
|
|
||||||
const electronOpts = _.extend({}, config, {
|
|
||||||
platform: process.platform,
|
|
||||||
arch,
|
|
||||||
ffmpegChromium: true,
|
|
||||||
keepDefaultApp: true
|
|
||||||
});
|
|
||||||
|
|
||||||
return vfs.src('package.json')
|
|
||||||
.pipe(json({ name: product.nameShort }))
|
|
||||||
.pipe(electron(electronOpts))
|
|
||||||
.pipe(filter(['**', '!**/app/package.json']))
|
|
||||||
.pipe(vfs.dest('.build/electron'));
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
async function main(arch = process.arch): Promise<void> {
|
|
||||||
const version = getElectronVersion();
|
|
||||||
const electronPath = path.join(root, '.build', 'electron');
|
|
||||||
const versionFile = path.join(electronPath, 'version');
|
|
||||||
const isUpToDate = fs.existsSync(versionFile) && fs.readFileSync(versionFile, 'utf8') === `${version}`;
|
|
||||||
|
|
||||||
if (!isUpToDate) {
|
|
||||||
await util.rimraf(electronPath)();
|
|
||||||
await util.streamToPromise(getElectron(arch)());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (require.main === module) {
|
|
||||||
main(process.argv[2]).catch(err => {
|
|
||||||
console.error(err);
|
|
||||||
process.exit(1);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
@@ -13,36 +13,83 @@ const File = require("vinyl");
|
|||||||
const vsce = require("vsce");
|
const vsce = require("vsce");
|
||||||
const stats_1 = require("./stats");
|
const stats_1 = require("./stats");
|
||||||
const util2 = require("./util");
|
const util2 = require("./util");
|
||||||
const remote = require("gulp-remote-retry-src");
|
const remote = require("gulp-remote-src");
|
||||||
const vzip = require('gulp-vinyl-zip');
|
const vzip = require('gulp-vinyl-zip');
|
||||||
const filter = require("gulp-filter");
|
const filter = require("gulp-filter");
|
||||||
const rename = require("gulp-rename");
|
const rename = require("gulp-rename");
|
||||||
const fancyLog = require("fancy-log");
|
const util = require('gulp-util');
|
||||||
const ansiColors = require("ansi-colors");
|
|
||||||
const buffer = require('gulp-buffer');
|
const buffer = require('gulp-buffer');
|
||||||
const json = require("gulp-json-editor");
|
const json = require("gulp-json-editor");
|
||||||
const webpack = require('webpack');
|
const webpack = require('webpack');
|
||||||
const webpackGulp = require('webpack-stream');
|
const webpackGulp = require('webpack-stream');
|
||||||
const util = require('./util');
|
const root = path.resolve(path.join(__dirname, '..', '..'));
|
||||||
const root = path.dirname(path.dirname(__dirname));
|
// {{SQL CARBON EDIT}}
|
||||||
const commit = util.getVersion(root);
|
const _ = require("underscore");
|
||||||
const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`;
|
const vfs = require("vinyl-fs");
|
||||||
function fromLocal(extensionPath) {
|
const deps = require('../dependencies');
|
||||||
const webpackFilename = path.join(extensionPath, 'extension.webpack.config.js');
|
const extensionsRoot = path.join(root, 'extensions');
|
||||||
const input = fs.existsSync(webpackFilename)
|
const extensionsProductionDependencies = deps.getProductionDependencies(extensionsRoot);
|
||||||
? fromLocalWebpack(extensionPath)
|
function packageBuiltInExtensions() {
|
||||||
: fromLocalNormal(extensionPath);
|
const sqlBuiltInLocalExtensionDescriptions = glob.sync('extensions/*/package.json')
|
||||||
const tmLanguageJsonFilter = filter('**/*.tmLanguage.json', { restore: true });
|
.map(manifestPath => {
|
||||||
return input
|
const extensionPath = path.dirname(path.join(root, manifestPath));
|
||||||
.pipe(tmLanguageJsonFilter)
|
const extensionName = path.basename(extensionPath);
|
||||||
.pipe(buffer())
|
return { name: extensionName, path: extensionPath };
|
||||||
.pipe(es.mapSync((f) => {
|
})
|
||||||
f.contents = Buffer.from(JSON.stringify(JSON.parse(f.contents.toString('utf8'))));
|
.filter(({ name }) => excludedExtensions.indexOf(name) === -1)
|
||||||
return f;
|
.filter(({ name }) => builtInExtensions.every(b => b.name !== name))
|
||||||
}))
|
.filter(({ name }) => sqlBuiltInExtensions.indexOf(name) >= 0);
|
||||||
.pipe(tmLanguageJsonFilter.restore);
|
sqlBuiltInLocalExtensionDescriptions.forEach(element => {
|
||||||
|
const packagePath = path.join(path.dirname(root), element.name + '.vsix');
|
||||||
|
console.info('Creating vsix for ' + element.path + ' result:' + packagePath);
|
||||||
|
vsce.createVSIX({
|
||||||
|
cwd: element.path,
|
||||||
|
packagePath: packagePath,
|
||||||
|
useYarn: true
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
function fromLocalWebpack(extensionPath) {
|
exports.packageBuiltInExtensions = packageBuiltInExtensions;
|
||||||
|
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
|
||||||
|
function fromLocal(extensionPath, sourceMappingURLBase) {
|
||||||
|
const webpackFilename = path.join(extensionPath, 'extension.webpack.config.js');
|
||||||
|
if (fs.existsSync(webpackFilename)) {
|
||||||
|
return fromLocalWebpack(extensionPath, sourceMappingURLBase);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return fromLocalNormal(extensionPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function fromLocalWebpack(extensionPath, sourceMappingURLBase) {
|
||||||
const result = es.through();
|
const result = es.through();
|
||||||
const packagedDependencies = [];
|
const packagedDependencies = [];
|
||||||
const packageJsonConfig = require(path.join(extensionPath, 'package.json'));
|
const packageJsonConfig = require(path.join(extensionPath, 'package.json'));
|
||||||
@@ -87,9 +134,9 @@ function fromLocalWebpack(extensionPath) {
|
|||||||
return data;
|
return data;
|
||||||
}))
|
}))
|
||||||
.pipe(packageJsonFilter.restore);
|
.pipe(packageJsonFilter.restore);
|
||||||
const webpackStreams = webpackConfigLocations.map(webpackConfigPath => {
|
const webpackStreams = webpackConfigLocations.map(webpackConfigPath => () => {
|
||||||
const webpackDone = (err, stats) => {
|
const webpackDone = (err, stats) => {
|
||||||
fancyLog(`Bundled extension: ${ansiColors.yellow(path.join(path.basename(extensionPath), path.relative(extensionPath, webpackConfigPath)))}...`);
|
util.log(`Bundled extension: ${util.colors.yellow(path.join(path.basename(extensionPath), path.relative(extensionPath, webpackConfigPath)))}...`);
|
||||||
if (err) {
|
if (err) {
|
||||||
result.emit('error', err);
|
result.emit('error', err);
|
||||||
}
|
}
|
||||||
@@ -101,7 +148,7 @@ function fromLocalWebpack(extensionPath) {
|
|||||||
result.emit('error', compilation.warnings.join('\n'));
|
result.emit('error', compilation.warnings.join('\n'));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
const webpackConfig = Object.assign(Object.assign({}, require(webpackConfigPath)), { mode: 'production' });
|
const webpackConfig = Object.assign({}, require(webpackConfigPath), { mode: 'production' });
|
||||||
const relativeOutputPath = path.relative(extensionPath, webpackConfig.output.path);
|
const relativeOutputPath = path.relative(extensionPath, webpackConfig.output.path);
|
||||||
return webpackGulp(webpackConfig, webpack, webpackDone)
|
return webpackGulp(webpackConfig, webpack, webpackDone)
|
||||||
.pipe(es.through(function (data) {
|
.pipe(es.through(function (data) {
|
||||||
@@ -113,14 +160,22 @@ function fromLocalWebpack(extensionPath) {
|
|||||||
// source map handling:
|
// source map handling:
|
||||||
// * rewrite sourceMappingURL
|
// * rewrite sourceMappingURL
|
||||||
// * save to disk so that upload-task picks this up
|
// * save to disk so that upload-task picks this up
|
||||||
const contents = data.contents.toString('utf8');
|
if (sourceMappingURLBase) {
|
||||||
data.contents = Buffer.from(contents.replace(/\n\/\/# sourceMappingURL=(.*)$/gm, function (_m, g1) {
|
const contents = data.contents.toString('utf8');
|
||||||
return `\n//# sourceMappingURL=${sourceMappingURLBase}/extensions/${path.basename(extensionPath)}/${relativeOutputPath}/${g1}`;
|
data.contents = Buffer.from(contents.replace(/\n\/\/# sourceMappingURL=(.*)$/gm, function (_m, g1) {
|
||||||
}), 'utf8');
|
return `\n//# sourceMappingURL=${sourceMappingURLBase}/extensions/${path.basename(extensionPath)}/${relativeOutputPath}/${g1}`;
|
||||||
|
}), 'utf8');
|
||||||
|
if (/\.js\.map$/.test(data.path)) {
|
||||||
|
if (!fs.existsSync(path.dirname(data.path))) {
|
||||||
|
fs.mkdirSync(path.dirname(data.path));
|
||||||
|
}
|
||||||
|
fs.writeFileSync(data.path, data.contents);
|
||||||
|
}
|
||||||
|
}
|
||||||
this.emit('data', data);
|
this.emit('data', data);
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
es.merge(...webpackStreams, patchFilesStream)
|
es.merge(sequence(webpackStreams), patchFilesStream)
|
||||||
// .pipe(es.through(function (data) {
|
// .pipe(es.through(function (data) {
|
||||||
// // debug
|
// // debug
|
||||||
// console.log('out', data.path, data.contents.length);
|
// console.log('out', data.path, data.contents.length);
|
||||||
@@ -157,10 +212,9 @@ const baseHeaders = {
|
|||||||
'X-Market-User-Id': '291C1CD0-051A-4123-9B4B-30D60EF52EE2',
|
'X-Market-User-Id': '291C1CD0-051A-4123-9B4B-30D60EF52EE2',
|
||||||
};
|
};
|
||||||
function fromMarketplace(extensionName, version, metadata) {
|
function fromMarketplace(extensionName, version, metadata) {
|
||||||
// {{SQL CARBON EDIT}}
|
const [publisher, name] = extensionName.split('.');
|
||||||
const [, name] = extensionName.split('.');
|
const url = `https://marketplace.visualstudio.com/_apis/public/gallery/publishers/${publisher}/vsextensions/${name}/${version}/vspackage`;
|
||||||
const url = `https://sqlopsextensions.blob.core.windows.net/extensions/${name}/${name}-${version}.vsix`;
|
util.log('Downloading extension:', util.colors.yellow(`${extensionName}@${version}`), '...');
|
||||||
fancyLog('Downloading extension:', ansiColors.yellow(`${extensionName}@${version}`), '...');
|
|
||||||
const options = {
|
const options = {
|
||||||
base: url,
|
base: url,
|
||||||
requestOptions: {
|
requestOptions: {
|
||||||
@@ -182,7 +236,6 @@ exports.fromMarketplace = fromMarketplace;
|
|||||||
const excludedExtensions = [
|
const excludedExtensions = [
|
||||||
'vscode-api-tests',
|
'vscode-api-tests',
|
||||||
'vscode-colorize-tests',
|
'vscode-colorize-tests',
|
||||||
'vscode-test-resolver',
|
|
||||||
'ms-vscode.node-debug',
|
'ms-vscode.node-debug',
|
||||||
'ms-vscode.node-debug2',
|
'ms-vscode.node-debug2',
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
@@ -192,20 +245,39 @@ const excludedExtensions = [
|
|||||||
const sqlBuiltInExtensions = [
|
const sqlBuiltInExtensions = [
|
||||||
// Add SQL built-in extensions here.
|
// Add SQL built-in extensions here.
|
||||||
// the extension will be excluded from SQLOps package and will have separate vsix packages
|
// the extension will be excluded from SQLOps package and will have separate vsix packages
|
||||||
'admin-tool-ext-win',
|
|
||||||
'agent',
|
'agent',
|
||||||
'import',
|
'import',
|
||||||
'profiler',
|
'profiler',
|
||||||
'admin-pack',
|
'admin-pack',
|
||||||
'dacpac',
|
'big-data-cluster',
|
||||||
'schema-compare',
|
'dacpac'
|
||||||
'cms',
|
|
||||||
'query-history',
|
|
||||||
'liveshare'
|
|
||||||
];
|
];
|
||||||
const builtInExtensions = process.env['VSCODE_QUALITY'] === 'stable' ? require('../builtInExtensions.json') : require('../builtInExtensions-insiders.json');
|
var azureExtensions = ['azurecore', 'mssql'];
|
||||||
// {{SQL CARBON EDIT}} - End
|
const builtInExtensions = require('../builtInExtensions.json');
|
||||||
function packageLocalExtensionsStream() {
|
/**
|
||||||
|
* We're doing way too much stuff at once, with webpack et al. So much stuff
|
||||||
|
* that while downloading extensions from the marketplace, node js doesn't get enough
|
||||||
|
* stack frames to complete the download in under 2 minutes, at which point the
|
||||||
|
* marketplace server cuts off the http request. So, we sequentialize the extensino tasks.
|
||||||
|
*/
|
||||||
|
function sequence(streamProviders) {
|
||||||
|
const result = es.through();
|
||||||
|
function pop() {
|
||||||
|
if (streamProviders.length === 0) {
|
||||||
|
result.emit('end');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const fn = streamProviders.shift();
|
||||||
|
fn()
|
||||||
|
.on('end', function () { setTimeout(pop, 0); })
|
||||||
|
.pipe(result, { end: false });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pop();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
function packageExtensionsStream(optsIn) {
|
||||||
|
const opts = optsIn || {};
|
||||||
const localExtensionDescriptions = glob.sync('extensions/*/package.json')
|
const localExtensionDescriptions = 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));
|
||||||
@@ -213,86 +285,36 @@ function packageLocalExtensionsStream() {
|
|||||||
return { name: extensionName, path: extensionPath };
|
return { name: extensionName, path: extensionPath };
|
||||||
})
|
})
|
||||||
.filter(({ name }) => excludedExtensions.indexOf(name) === -1)
|
.filter(({ name }) => excludedExtensions.indexOf(name) === -1)
|
||||||
|
.filter(({ name }) => opts.desiredExtensions ? opts.desiredExtensions.indexOf(name) >= 0 : true)
|
||||||
.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
|
// {{SQL CARBON EDIT}}
|
||||||
const nodeModules = gulp.src('extensions/node_modules/**', { base: '.' });
|
.filter(({ name }) => sqlBuiltInExtensions.indexOf(name) === -1)
|
||||||
const localExtensions = localExtensionDescriptions.map(extension => {
|
.filter(({ name }) => azureExtensions.indexOf(name) === -1);
|
||||||
return fromLocal(extension.path)
|
const localExtensions = () => sequence([...localExtensionDescriptions.map(extension => () => {
|
||||||
.pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
|
return fromLocal(extension.path, opts.sourceMappingURLBase)
|
||||||
});
|
.pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
|
||||||
return es.merge(nodeModules, ...localExtensions)
|
})]);
|
||||||
.pipe(util2.setExecutableBit(['**/*.sh']));
|
// {{SQL CARBON EDIT}}
|
||||||
|
const extensionDepsSrc = [
|
||||||
|
..._.flatten(extensionsProductionDependencies.map((d) => path.relative(root, d.path)).map((d) => [`${d}/**`, `!${d}/**/{test,tests}/**`])),
|
||||||
|
];
|
||||||
|
const localExtensionDependencies = () => gulp.src(extensionDepsSrc, { base: '.', dot: true })
|
||||||
|
.pipe(filter(['**', '!**/package-lock.json']))
|
||||||
|
.pipe(util2.cleanNodeModule('account-provider-azure', ['node_modules/date-utils/doc/**', 'node_modules/adal_node/node_modules/**'], undefined))
|
||||||
|
.pipe(util2.cleanNodeModule('typescript', ['**/**'], undefined));
|
||||||
|
// Original code commented out here
|
||||||
|
// const localExtensionDependencies = () => gulp.src('extensions/node_modules/**', { base: '.' });
|
||||||
|
// const marketplaceExtensions = () => es.merge(
|
||||||
|
// ...builtInExtensions
|
||||||
|
// .filter(({ name }) => opts.desiredExtensions ? opts.desiredExtensions.indexOf(name) >= 0 : true)
|
||||||
|
// .map(extension => {
|
||||||
|
// return fromMarketplace(extension.name, extension.version, extension.metadata)
|
||||||
|
// .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
|
||||||
|
// })
|
||||||
|
// );
|
||||||
|
return sequence([localExtensions, localExtensionDependencies,])
|
||||||
|
.pipe(util2.setExecutableBit(['**/*.sh']))
|
||||||
|
.pipe(filter(['**', '!**/*.js.map']));
|
||||||
|
// {{SQL CARBON EDIT}} - End
|
||||||
}
|
}
|
||||||
exports.packageLocalExtensionsStream = packageLocalExtensionsStream;
|
exports.packageExtensionsStream = packageExtensionsStream;
|
||||||
function packageMarketplaceExtensionsStream() {
|
|
||||||
const extensions = builtInExtensions.map(extension => {
|
|
||||||
return fromMarketplace(extension.name, extension.version, extension.metadata)
|
|
||||||
.pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
|
|
||||||
});
|
|
||||||
return es.merge(extensions)
|
|
||||||
.pipe(util2.setExecutableBit(['**/*.sh']));
|
|
||||||
}
|
|
||||||
exports.packageMarketplaceExtensionsStream = packageMarketplaceExtensionsStream;
|
|
||||||
const vfs = require("vinyl-fs");
|
|
||||||
function packageBuiltInExtensions() {
|
|
||||||
const sqlBuiltInLocalExtensionDescriptions = 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 }) => excludedExtensions.indexOf(name) === -1)
|
|
||||||
.filter(({ name }) => builtInExtensions.every(b => b.name !== name))
|
|
||||||
.filter(({ name }) => sqlBuiltInExtensions.indexOf(name) >= 0);
|
|
||||||
const visxDirectory = path.join(path.dirname(root), 'vsix');
|
|
||||||
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
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
exports.packageBuiltInExtensions = packageBuiltInExtensions;
|
|
||||||
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
|
|
||||||
|
|||||||
@@ -13,40 +13,90 @@ import * as File from 'vinyl';
|
|||||||
import * as vsce from 'vsce';
|
import * as vsce from 'vsce';
|
||||||
import { createStatsStream } from './stats';
|
import { createStatsStream } from './stats';
|
||||||
import * as util2 from './util';
|
import * as util2 from './util';
|
||||||
import remote = require('gulp-remote-retry-src');
|
import remote = require('gulp-remote-src');
|
||||||
const vzip = require('gulp-vinyl-zip');
|
const vzip = require('gulp-vinyl-zip');
|
||||||
import filter = require('gulp-filter');
|
import filter = require('gulp-filter');
|
||||||
import rename = require('gulp-rename');
|
import rename = require('gulp-rename');
|
||||||
import * as fancyLog from 'fancy-log';
|
const util = require('gulp-util');
|
||||||
import * as ansiColors from 'ansi-colors';
|
|
||||||
const buffer = require('gulp-buffer');
|
const buffer = require('gulp-buffer');
|
||||||
import json = require('gulp-json-editor');
|
import json = require('gulp-json-editor');
|
||||||
const webpack = require('webpack');
|
const webpack = require('webpack');
|
||||||
const webpackGulp = require('webpack-stream');
|
const webpackGulp = require('webpack-stream');
|
||||||
const util = require('./util');
|
|
||||||
const root = path.dirname(path.dirname(__dirname));
|
|
||||||
const commit = util.getVersion(root);
|
|
||||||
const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`;
|
|
||||||
|
|
||||||
function fromLocal(extensionPath: string): Stream {
|
const root = path.resolve(path.join(__dirname, '..', '..'));
|
||||||
const webpackFilename = path.join(extensionPath, 'extension.webpack.config.js');
|
|
||||||
const input = fs.existsSync(webpackFilename)
|
|
||||||
? fromLocalWebpack(extensionPath)
|
|
||||||
: fromLocalNormal(extensionPath);
|
|
||||||
|
|
||||||
const tmLanguageJsonFilter = filter('**/*.tmLanguage.json', { restore: true });
|
// {{SQL CARBON EDIT}}
|
||||||
|
import * as _ from 'underscore';
|
||||||
|
import * as vfs from 'vinyl-fs';
|
||||||
|
const deps = require('../dependencies');
|
||||||
|
const extensionsRoot = path.join(root, 'extensions');
|
||||||
|
const extensionsProductionDependencies = deps.getProductionDependencies(extensionsRoot);
|
||||||
|
|
||||||
return input
|
export function packageBuiltInExtensions() {
|
||||||
.pipe(tmLanguageJsonFilter)
|
const sqlBuiltInLocalExtensionDescriptions = glob.sync('extensions/*/package.json')
|
||||||
.pipe(buffer())
|
.map(manifestPath => {
|
||||||
.pipe(es.mapSync((f: File) => {
|
const extensionPath = path.dirname(path.join(root, manifestPath));
|
||||||
f.contents = Buffer.from(JSON.stringify(JSON.parse(f.contents.toString('utf8'))));
|
const extensionName = path.basename(extensionPath);
|
||||||
return f;
|
return { name: extensionName, path: extensionPath };
|
||||||
}))
|
})
|
||||||
.pipe(tmLanguageJsonFilter.restore);
|
.filter(({ name }) => excludedExtensions.indexOf(name) === -1)
|
||||||
|
.filter(({ name }) => builtInExtensions.every(b => b.name !== name))
|
||||||
|
.filter(({ name }) => sqlBuiltInExtensions.indexOf(name) >= 0);
|
||||||
|
sqlBuiltInLocalExtensionDescriptions.forEach(element => {
|
||||||
|
const packagePath = path.join(path.dirname(root), element.name + '.vsix');
|
||||||
|
console.info('Creating vsix for ' + element.path + ' result:' + packagePath);
|
||||||
|
vsce.createVSIX({
|
||||||
|
cwd: element.path,
|
||||||
|
packagePath: packagePath,
|
||||||
|
useYarn: true
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function fromLocalWebpack(extensionPath: string): Stream {
|
export function packageExtensionTask(extensionName: string, platform: string, arch: string) {
|
||||||
|
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
|
||||||
|
|
||||||
|
function fromLocal(extensionPath: string, sourceMappingURLBase?: string): Stream {
|
||||||
|
const webpackFilename = path.join(extensionPath, 'extension.webpack.config.js');
|
||||||
|
if (fs.existsSync(webpackFilename)) {
|
||||||
|
return fromLocalWebpack(extensionPath, sourceMappingURLBase);
|
||||||
|
} else {
|
||||||
|
return fromLocalNormal(extensionPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function fromLocalWebpack(extensionPath: string, sourceMappingURLBase: string | undefined): Stream {
|
||||||
const result = es.through();
|
const result = es.through();
|
||||||
|
|
||||||
const packagedDependencies: string[] = [];
|
const packagedDependencies: string[] = [];
|
||||||
@@ -102,10 +152,10 @@ function fromLocalWebpack(extensionPath: string): Stream {
|
|||||||
.pipe(packageJsonFilter.restore);
|
.pipe(packageJsonFilter.restore);
|
||||||
|
|
||||||
|
|
||||||
const webpackStreams = webpackConfigLocations.map(webpackConfigPath => {
|
const webpackStreams = webpackConfigLocations.map(webpackConfigPath => () => {
|
||||||
|
|
||||||
const webpackDone = (err: any, stats: any) => {
|
const webpackDone = (err: any, stats: any) => {
|
||||||
fancyLog(`Bundled extension: ${ansiColors.yellow(path.join(path.basename(extensionPath), path.relative(extensionPath, webpackConfigPath)))}...`);
|
util.log(`Bundled extension: ${util.colors.yellow(path.join(path.basename(extensionPath), path.relative(extensionPath, webpackConfigPath)))}...`);
|
||||||
if (err) {
|
if (err) {
|
||||||
result.emit('error', err);
|
result.emit('error', err);
|
||||||
}
|
}
|
||||||
@@ -134,16 +184,24 @@ function fromLocalWebpack(extensionPath: string): Stream {
|
|||||||
// source map handling:
|
// source map handling:
|
||||||
// * rewrite sourceMappingURL
|
// * rewrite sourceMappingURL
|
||||||
// * save to disk so that upload-task picks this up
|
// * save to disk so that upload-task picks this up
|
||||||
const contents = (<Buffer>data.contents).toString('utf8');
|
if (sourceMappingURLBase) {
|
||||||
data.contents = Buffer.from(contents.replace(/\n\/\/# sourceMappingURL=(.*)$/gm, function (_m, g1) {
|
const contents = (<Buffer>data.contents).toString('utf8');
|
||||||
return `\n//# sourceMappingURL=${sourceMappingURLBase}/extensions/${path.basename(extensionPath)}/${relativeOutputPath}/${g1}`;
|
data.contents = Buffer.from(contents.replace(/\n\/\/# sourceMappingURL=(.*)$/gm, function (_m, g1) {
|
||||||
}), 'utf8');
|
return `\n//# sourceMappingURL=${sourceMappingURLBase}/extensions/${path.basename(extensionPath)}/${relativeOutputPath}/${g1}`;
|
||||||
|
}), 'utf8');
|
||||||
|
|
||||||
|
if (/\.js\.map$/.test(data.path)) {
|
||||||
|
if (!fs.existsSync(path.dirname(data.path))) {
|
||||||
|
fs.mkdirSync(path.dirname(data.path));
|
||||||
|
}
|
||||||
|
fs.writeFileSync(data.path, data.contents);
|
||||||
|
}
|
||||||
|
}
|
||||||
this.emit('data', data);
|
this.emit('data', data);
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
|
||||||
es.merge(...webpackStreams, patchFilesStream)
|
es.merge(sequence(webpackStreams), patchFilesStream)
|
||||||
// .pipe(es.through(function (data) {
|
// .pipe(es.through(function (data) {
|
||||||
// // debug
|
// // debug
|
||||||
// console.log('out', data.path, data.contents.length);
|
// console.log('out', data.path, data.contents.length);
|
||||||
@@ -188,11 +246,10 @@ const baseHeaders = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export function fromMarketplace(extensionName: string, version: string, metadata: any): Stream {
|
export function fromMarketplace(extensionName: string, version: string, metadata: any): Stream {
|
||||||
// {{SQL CARBON EDIT}}
|
const [publisher, name] = extensionName.split('.');
|
||||||
const [, name] = extensionName.split('.');
|
const url = `https://marketplace.visualstudio.com/_apis/public/gallery/publishers/${publisher}/vsextensions/${name}/${version}/vspackage`;
|
||||||
const url = `https://sqlopsextensions.blob.core.windows.net/extensions/${name}/${name}-${version}.vsix`;
|
|
||||||
|
|
||||||
fancyLog('Downloading extension:', ansiColors.yellow(`${extensionName}@${version}`), '...');
|
util.log('Downloading extension:', util.colors.yellow(`${extensionName}@${version}`), '...');
|
||||||
|
|
||||||
const options = {
|
const options = {
|
||||||
base: url,
|
base: url,
|
||||||
@@ -214,10 +271,17 @@ export function fromMarketplace(extensionName: string, version: string, metadata
|
|||||||
.pipe(packageJsonFilter.restore);
|
.pipe(packageJsonFilter.restore);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface IPackageExtensionsOptions {
|
||||||
|
/**
|
||||||
|
* Set to undefined to package all of them.
|
||||||
|
*/
|
||||||
|
desiredExtensions?: string[];
|
||||||
|
sourceMappingURLBase?: string;
|
||||||
|
}
|
||||||
|
|
||||||
const excludedExtensions = [
|
const excludedExtensions = [
|
||||||
'vscode-api-tests',
|
'vscode-api-tests',
|
||||||
'vscode-colorize-tests',
|
'vscode-colorize-tests',
|
||||||
'vscode-test-resolver',
|
|
||||||
'ms-vscode.node-debug',
|
'ms-vscode.node-debug',
|
||||||
'ms-vscode.node-debug2',
|
'ms-vscode.node-debug2',
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
@@ -228,17 +292,15 @@ const excludedExtensions = [
|
|||||||
const sqlBuiltInExtensions = [
|
const sqlBuiltInExtensions = [
|
||||||
// Add SQL built-in extensions here.
|
// Add SQL built-in extensions here.
|
||||||
// the extension will be excluded from SQLOps package and will have separate vsix packages
|
// the extension will be excluded from SQLOps package and will have separate vsix packages
|
||||||
'admin-tool-ext-win',
|
|
||||||
'agent',
|
'agent',
|
||||||
'import',
|
'import',
|
||||||
'profiler',
|
'profiler',
|
||||||
'admin-pack',
|
'admin-pack',
|
||||||
'dacpac',
|
'big-data-cluster',
|
||||||
'schema-compare',
|
'dacpac'
|
||||||
'cms',
|
|
||||||
'query-history',
|
|
||||||
'liveshare'
|
|
||||||
];
|
];
|
||||||
|
var azureExtensions = ['azurecore', 'mssql'];
|
||||||
|
// {{SQL CARBON EDIT}} - End
|
||||||
|
|
||||||
interface IBuiltInExtension {
|
interface IBuiltInExtension {
|
||||||
name: string;
|
name: string;
|
||||||
@@ -247,12 +309,35 @@ interface IBuiltInExtension {
|
|||||||
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');
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}} - End
|
/**
|
||||||
|
* We're doing way too much stuff at once, with webpack et al. So much stuff
|
||||||
|
* that while downloading extensions from the marketplace, node js doesn't get enough
|
||||||
|
* stack frames to complete the download in under 2 minutes, at which point the
|
||||||
|
* marketplace server cuts off the http request. So, we sequentialize the extensino tasks.
|
||||||
|
*/
|
||||||
|
function sequence(streamProviders: { (): Stream }[]): Stream {
|
||||||
|
const result = es.through();
|
||||||
|
|
||||||
|
function pop() {
|
||||||
|
if (streamProviders.length === 0) {
|
||||||
|
result.emit('end');
|
||||||
|
} else {
|
||||||
|
const fn = streamProviders.shift()!;
|
||||||
|
fn()
|
||||||
|
.on('end', function () { setTimeout(pop, 0); })
|
||||||
|
.pipe(result, { end: false });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pop();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function packageExtensionsStream(optsIn?: IPackageExtensionsOptions): NodeJS.ReadWriteStream {
|
||||||
|
const opts = optsIn || {};
|
||||||
|
|
||||||
export function packageLocalExtensionsStream(): NodeJS.ReadWriteStream {
|
|
||||||
const localExtensionDescriptions = (<string[]>glob.sync('extensions/*/package.json'))
|
const localExtensionDescriptions = (<string[]>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));
|
||||||
@@ -260,94 +345,41 @@ export function packageLocalExtensionsStream(): NodeJS.ReadWriteStream {
|
|||||||
return { name: extensionName, path: extensionPath };
|
return { name: extensionName, path: extensionPath };
|
||||||
})
|
})
|
||||||
.filter(({ name }) => excludedExtensions.indexOf(name) === -1)
|
.filter(({ name }) => excludedExtensions.indexOf(name) === -1)
|
||||||
|
.filter(({ name }) => opts.desiredExtensions ? opts.desiredExtensions.indexOf(name) >= 0 : true)
|
||||||
.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
|
// {{SQL CARBON EDIT}}
|
||||||
|
.filter(({ name }) => sqlBuiltInExtensions.indexOf(name) === -1)
|
||||||
|
.filter(({ name }) => azureExtensions.indexOf(name) === -1);
|
||||||
|
|
||||||
const nodeModules = gulp.src('extensions/node_modules/**', { base: '.' });
|
const localExtensions = () => sequence([...localExtensionDescriptions.map(extension => () => {
|
||||||
const localExtensions = localExtensionDescriptions.map(extension => {
|
return fromLocal(extension.path, opts.sourceMappingURLBase)
|
||||||
return fromLocal(extension.path)
|
|
||||||
.pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
|
.pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
|
||||||
});
|
})]);
|
||||||
|
|
||||||
return es.merge(nodeModules, ...localExtensions)
|
// {{SQL CARBON EDIT}}
|
||||||
.pipe(util2.setExecutableBit(['**/*.sh']));
|
const extensionDepsSrc = [
|
||||||
|
..._.flatten(extensionsProductionDependencies.map((d: any) => path.relative(root, d.path)).map((d: any) => [`${d}/**`, `!${d}/**/{test,tests}/**`])),
|
||||||
|
];
|
||||||
|
|
||||||
|
const localExtensionDependencies = () => gulp.src(extensionDepsSrc, { base: '.', dot: true })
|
||||||
|
.pipe(filter(['**', '!**/package-lock.json']))
|
||||||
|
.pipe(util2.cleanNodeModule('account-provider-azure', ['node_modules/date-utils/doc/**', 'node_modules/adal_node/node_modules/**'], undefined))
|
||||||
|
.pipe(util2.cleanNodeModule('typescript', ['**/**'], undefined));
|
||||||
|
|
||||||
|
// Original code commented out here
|
||||||
|
// const localExtensionDependencies = () => gulp.src('extensions/node_modules/**', { base: '.' });
|
||||||
|
|
||||||
|
// const marketplaceExtensions = () => es.merge(
|
||||||
|
// ...builtInExtensions
|
||||||
|
// .filter(({ name }) => opts.desiredExtensions ? opts.desiredExtensions.indexOf(name) >= 0 : true)
|
||||||
|
// .map(extension => {
|
||||||
|
// return fromMarketplace(extension.name, extension.version, extension.metadata)
|
||||||
|
// .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
|
||||||
|
// })
|
||||||
|
// );
|
||||||
|
|
||||||
|
return sequence([localExtensions, localExtensionDependencies, /*marketplaceExtensions*/])
|
||||||
|
.pipe(util2.setExecutableBit(['**/*.sh']))
|
||||||
|
.pipe(filter(['**', '!**/*.js.map']));
|
||||||
|
// {{SQL CARBON EDIT}} - End
|
||||||
}
|
}
|
||||||
|
|
||||||
export function packageMarketplaceExtensionsStream(): NodeJS.ReadWriteStream {
|
|
||||||
const extensions = builtInExtensions.map(extension => {
|
|
||||||
return fromMarketplace(extension.name, extension.version, extension.metadata)
|
|
||||||
.pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
|
|
||||||
});
|
|
||||||
|
|
||||||
return es.merge(extensions)
|
|
||||||
.pipe(util2.setExecutableBit(['**/*.sh']));
|
|
||||||
}
|
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}}
|
|
||||||
import * as _ from 'underscore';
|
|
||||||
import * as vfs from 'vinyl-fs';
|
|
||||||
|
|
||||||
export function packageBuiltInExtensions() {
|
|
||||||
const sqlBuiltInLocalExtensionDescriptions = 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 }) => excludedExtensions.indexOf(name) === -1)
|
|
||||||
.filter(({ name }) => builtInExtensions.every(b => b.name !== name))
|
|
||||||
.filter(({ name }) => sqlBuiltInExtensions.indexOf(name) >= 0);
|
|
||||||
const visxDirectory = path.join(path.dirname(root), 'vsix');
|
|
||||||
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
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
export function packageExtensionTask(extensionName: string, platform: string, arch: string) {
|
|
||||||
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
|
|
||||||
|
|||||||
@@ -17,14 +17,14 @@ function getVersion(repo) {
|
|||||||
head = fs.readFileSync(headPath, 'utf8').trim();
|
head = fs.readFileSync(headPath, 'utf8').trim();
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
return undefined;
|
return void 0;
|
||||||
}
|
}
|
||||||
if (/^[0-9a-f]{40}$/i.test(head)) {
|
if (/^[0-9a-f]{40}$/i.test(head)) {
|
||||||
return head;
|
return head;
|
||||||
}
|
}
|
||||||
const refMatch = /^ref: (.*)$/.exec(head);
|
const refMatch = /^ref: (.*)$/.exec(head);
|
||||||
if (!refMatch) {
|
if (!refMatch) {
|
||||||
return undefined;
|
return void 0;
|
||||||
}
|
}
|
||||||
const ref = refMatch[1];
|
const ref = refMatch[1];
|
||||||
const refPath = path.join(git, ref);
|
const refPath = path.join(git, ref);
|
||||||
@@ -40,7 +40,7 @@ function getVersion(repo) {
|
|||||||
refsRaw = fs.readFileSync(packedRefsPath, 'utf8').trim();
|
refsRaw = fs.readFileSync(packedRefsPath, 'utf8').trim();
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
return undefined;
|
return void 0;
|
||||||
}
|
}
|
||||||
const refsRegex = /^([0-9a-f]{40})\s+(.+)$/gm;
|
const refsRegex = /^([0-9a-f]{40})\s+(.+)$/gm;
|
||||||
let refsMatch;
|
let refsMatch;
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ export function getVersion(repo: string): string | undefined {
|
|||||||
try {
|
try {
|
||||||
head = fs.readFileSync(headPath, 'utf8').trim();
|
head = fs.readFileSync(headPath, 'utf8').trim();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return undefined;
|
return void 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (/^[0-9a-f]{40}$/i.test(head)) {
|
if (/^[0-9a-f]{40}$/i.test(head)) {
|
||||||
@@ -28,7 +28,7 @@ export function getVersion(repo: string): string | undefined {
|
|||||||
const refMatch = /^ref: (.*)$/.exec(head);
|
const refMatch = /^ref: (.*)$/.exec(head);
|
||||||
|
|
||||||
if (!refMatch) {
|
if (!refMatch) {
|
||||||
return undefined;
|
return void 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ref = refMatch[1];
|
const ref = refMatch[1];
|
||||||
@@ -46,7 +46,7 @@ export function getVersion(repo: string): string | undefined {
|
|||||||
try {
|
try {
|
||||||
refsRaw = fs.readFileSync(packedRefsPath, 'utf8').trim();
|
refsRaw = fs.readFileSync(packedRefsPath, 'utf8').trim();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return undefined;
|
return void 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const refsRegex = /^([0-9a-f]{40})\s+(.+)$/gm;
|
const refsRegex = /^([0-9a-f]{40})\s+(.+)$/gm;
|
||||||
|
|||||||
@@ -13,16 +13,15 @@ const xml2js = require("xml2js");
|
|||||||
const glob = require("glob");
|
const glob = require("glob");
|
||||||
const https = require("https");
|
const https = require("https");
|
||||||
const gulp = require("gulp");
|
const gulp = require("gulp");
|
||||||
const fancyLog = require("fancy-log");
|
const util = require("gulp-util");
|
||||||
const ansiColors = require("ansi-colors");
|
|
||||||
const iconv = require("iconv-lite");
|
const iconv = require("iconv-lite");
|
||||||
const NUMBER_OF_CONCURRENT_DOWNLOADS = 4;
|
const NUMBER_OF_CONCURRENT_DOWNLOADS = 4;
|
||||||
function log(message, ...rest) {
|
function log(message, ...rest) {
|
||||||
fancyLog(ansiColors.green('[i18n]'), message, ...rest);
|
util.log(util.colors.green('[i18n]'), message, ...rest);
|
||||||
}
|
}
|
||||||
exports.defaultLanguages = [
|
exports.defaultLanguages = [
|
||||||
{ id: 'zh-tw', folderName: 'cht', translationId: 'zh-hant' },
|
{ id: 'zh-tw', folderName: 'cht', transifexId: 'zh-hant' },
|
||||||
{ id: 'zh-cn', folderName: 'chs', translationId: 'zh-hans' },
|
{ id: 'zh-cn', folderName: 'chs', transifexId: 'zh-hans' },
|
||||||
{ id: 'ja', folderName: 'jpn' },
|
{ id: 'ja', folderName: 'jpn' },
|
||||||
{ id: 'ko', folderName: 'kor' },
|
{ id: 'ko', folderName: 'kor' },
|
||||||
{ id: 'de', folderName: 'deu' },
|
{ id: 'de', folderName: 'deu' },
|
||||||
@@ -176,7 +175,6 @@ class XLF {
|
|||||||
this.buffer.push(line.toString());
|
this.buffer.push(line.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
exports.XLF = XLF;
|
|
||||||
XLF.parsePseudo = function (xlfString) {
|
XLF.parsePseudo = function (xlfString) {
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
let parser = new xml2js.Parser();
|
let parser = new xml2js.Parser();
|
||||||
@@ -249,6 +247,7 @@ XLF.parse = function (xlfString) {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
exports.XLF = XLF;
|
||||||
class Limiter {
|
class Limiter {
|
||||||
constructor(maxDegreeOfParalellism) {
|
constructor(maxDegreeOfParalellism) {
|
||||||
this.maxDegreeOfParalellism = maxDegreeOfParalellism;
|
this.maxDegreeOfParalellism = maxDegreeOfParalellism;
|
||||||
@@ -372,11 +371,7 @@ function processCoreBundleFormat(fileHeader, languages, json, emitter) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
let languageDirectory = path.join(__dirname, '..', '..', '..', 'vscode-loc', 'i18n');
|
let languageDirectory = path.join(__dirname, '..', '..', 'i18n');
|
||||||
if (!fs.existsSync(languageDirectory)) {
|
|
||||||
log(`No VS Code localization repository found. Looking at ${languageDirectory}`);
|
|
||||||
log(`To bundle translations please check out the vscode-loc repository as a sibling of the vscode repository.`);
|
|
||||||
}
|
|
||||||
let sortedLanguages = sortLanguages(languages);
|
let sortedLanguages = sortLanguages(languages);
|
||||||
sortedLanguages.forEach((language) => {
|
sortedLanguages.forEach((language) => {
|
||||||
if (process.env['VSCODE_BUILD_VERBOSE']) {
|
if (process.env['VSCODE_BUILD_VERBOSE']) {
|
||||||
@@ -384,25 +379,22 @@ function processCoreBundleFormat(fileHeader, languages, json, emitter) {
|
|||||||
}
|
}
|
||||||
statistics[language.id] = 0;
|
statistics[language.id] = 0;
|
||||||
let localizedModules = Object.create(null);
|
let localizedModules = Object.create(null);
|
||||||
let languageFolderName = language.translationId || language.id;
|
let languageFolderName = language.folderName || language.id;
|
||||||
let i18nFile = path.join(languageDirectory, `vscode-language-pack-${languageFolderName}`, 'translations', 'main.i18n.json');
|
let cwd = path.join(languageDirectory, languageFolderName, 'src');
|
||||||
let allMessages;
|
|
||||||
if (fs.existsSync(i18nFile)) {
|
|
||||||
let content = stripComments(fs.readFileSync(i18nFile, 'utf8'));
|
|
||||||
allMessages = JSON.parse(content);
|
|
||||||
}
|
|
||||||
modules.forEach((module) => {
|
modules.forEach((module) => {
|
||||||
let order = keysSection[module];
|
let order = keysSection[module];
|
||||||
let moduleMessage;
|
let i18nFile = path.join(cwd, module) + '.i18n.json';
|
||||||
if (allMessages) {
|
let messages = null;
|
||||||
moduleMessage = allMessages.contents[module];
|
if (fs.existsSync(i18nFile)) {
|
||||||
|
let content = stripComments(fs.readFileSync(i18nFile, 'utf8'));
|
||||||
|
messages = JSON.parse(content);
|
||||||
}
|
}
|
||||||
if (!moduleMessage) {
|
else {
|
||||||
if (process.env['VSCODE_BUILD_VERBOSE']) {
|
if (process.env['VSCODE_BUILD_VERBOSE']) {
|
||||||
log(`No localized messages found for module ${module}. Using default messages.`);
|
log(`No localized messages found for module ${module}. Using default messages.`);
|
||||||
}
|
}
|
||||||
moduleMessage = defaultMessages[module];
|
messages = defaultMessages[module];
|
||||||
statistics[language.id] = statistics[language.id] + Object.keys(moduleMessage).length;
|
statistics[language.id] = statistics[language.id] + Object.keys(messages).length;
|
||||||
}
|
}
|
||||||
let localizedMessages = [];
|
let localizedMessages = [];
|
||||||
order.forEach((keyInfo) => {
|
order.forEach((keyInfo) => {
|
||||||
@@ -413,7 +405,7 @@ function processCoreBundleFormat(fileHeader, languages, json, emitter) {
|
|||||||
else {
|
else {
|
||||||
key = keyInfo.key;
|
key = keyInfo.key;
|
||||||
}
|
}
|
||||||
let message = moduleMessage[key];
|
let message = messages[key];
|
||||||
if (!message) {
|
if (!message) {
|
||||||
if (process.env['VSCODE_BUILD_VERBOSE']) {
|
if (process.env['VSCODE_BUILD_VERBOSE']) {
|
||||||
log(`No localized message found for key ${key} in module ${module}. Using default message.`);
|
log(`No localized message found for key ${key} in module ${module}. Using default message.`);
|
||||||
@@ -498,7 +490,7 @@ function getResource(sourceFile) {
|
|||||||
else if (/^vs\/code/.test(sourceFile)) {
|
else if (/^vs\/code/.test(sourceFile)) {
|
||||||
return { name: 'vs/code', project: workbenchProject };
|
return { name: 'vs/code', project: workbenchProject };
|
||||||
}
|
}
|
||||||
else if (/^vs\/workbench\/contrib/.test(sourceFile)) {
|
else if (/^vs\/workbench\/parts/.test(sourceFile)) {
|
||||||
resource = sourceFile.split('/', 4).join('/');
|
resource = sourceFile.split('/', 4).join('/');
|
||||||
return { name: resource, project: workbenchProject };
|
return { name: resource, project: workbenchProject };
|
||||||
}
|
}
|
||||||
@@ -586,7 +578,7 @@ function createXlfFilesForExtensions() {
|
|||||||
}
|
}
|
||||||
return _xlf;
|
return _xlf;
|
||||||
}
|
}
|
||||||
gulp.src([`.build/extensions/${extensionName}/package.nls.json`, `.build/extensions/${extensionName}/**/nls.metadata.json`], { allowEmpty: true }).pipe(event_stream_1.through(function (file) {
|
gulp.src([`./extensions/${extensionName}/package.nls.json`, `./extensions/${extensionName}/**/nls.metadata.json`]).pipe(event_stream_1.through(function (file) {
|
||||||
if (file.isBuffer()) {
|
if (file.isBuffer()) {
|
||||||
const buffer = file.contents;
|
const buffer = file.contents;
|
||||||
const basename = path.basename(file.path);
|
const basename = path.basename(file.path);
|
||||||
@@ -609,7 +601,7 @@ function createXlfFilesForExtensions() {
|
|||||||
}
|
}
|
||||||
else if (basename === 'nls.metadata.json') {
|
else if (basename === 'nls.metadata.json') {
|
||||||
const json = JSON.parse(buffer.toString('utf8'));
|
const json = JSON.parse(buffer.toString('utf8'));
|
||||||
const relPath = path.relative(`.build/extensions/${extensionName}`, path.dirname(file.path));
|
const relPath = path.relative(`./extensions/${extensionName}`, path.dirname(file.path));
|
||||||
for (let file in json) {
|
for (let file in json) {
|
||||||
const fileContent = json[file];
|
const fileContent = json[file];
|
||||||
getXlf().addFile(`extensions/${extensionName}/${relPath}/${file}`, fileContent.keys, fileContent.messages);
|
getXlf().addFile(`extensions/${extensionName}/${relPath}/${file}`, fileContent.keys, fileContent.messages);
|
||||||
@@ -912,8 +904,8 @@ function pullCoreAndExtensionsXlfFiles(apiHostname, username, password, language
|
|||||||
_coreAndExtensionResources.push(...json.workbench);
|
_coreAndExtensionResources.push(...json.workbench);
|
||||||
// extensions
|
// extensions
|
||||||
let extensionsToLocalize = Object.create(null);
|
let extensionsToLocalize = Object.create(null);
|
||||||
glob.sync('.build/extensions/**/*.nls.json').forEach(extension => extensionsToLocalize[extension.split('/')[2]] = true);
|
glob.sync('./extensions/**/*.nls.json').forEach(extension => extensionsToLocalize[extension.split('/')[2]] = true);
|
||||||
glob.sync('.build/extensions/*/node_modules/vscode-nls').forEach(extension => extensionsToLocalize[extension.split('/')[2]] = true);
|
glob.sync('./extensions/*/node_modules/vscode-nls').forEach(extension => extensionsToLocalize[extension.split('/')[2]] = true);
|
||||||
Object.keys(extensionsToLocalize).forEach(extension => {
|
Object.keys(extensionsToLocalize).forEach(extension => {
|
||||||
_coreAndExtensionResources.push({ name: extension, project: extensionsProject });
|
_coreAndExtensionResources.push({ name: extension, project: extensionsProject });
|
||||||
});
|
});
|
||||||
@@ -963,7 +955,7 @@ function retrieveResource(language, resource, apiHostname, credentials) {
|
|||||||
return limiter.queue(() => new Promise((resolve, reject) => {
|
return limiter.queue(() => new Promise((resolve, reject) => {
|
||||||
const slug = resource.name.replace(/\//g, '_');
|
const slug = resource.name.replace(/\//g, '_');
|
||||||
const project = resource.project;
|
const project = resource.project;
|
||||||
let transifexLanguageId = language.id === 'ps' ? 'en' : language.translationId || language.id;
|
let transifexLanguageId = language.id === 'ps' ? 'en' : language.transifexId || language.id;
|
||||||
const options = {
|
const options = {
|
||||||
hostname: apiHostname,
|
hostname: apiHostname,
|
||||||
path: `/api/2/project/${project}/resource/${slug}/translation/${transifexLanguageId}?file&mode=onlyreviewed`,
|
path: `/api/2/project/${project}/resource/${slug}/translation/${transifexLanguageId}?file&mode=onlyreviewed`,
|
||||||
@@ -1046,7 +1038,7 @@ function prepareI18nPackFiles(externalExtensions, resultingTranslationPaths, pse
|
|||||||
let extensionsPacks = {};
|
let extensionsPacks = {};
|
||||||
let errors = [];
|
let errors = [];
|
||||||
return event_stream_1.through(function (xlf) {
|
return event_stream_1.through(function (xlf) {
|
||||||
let project = path.basename(path.dirname(xlf.relative));
|
let project = path.dirname(xlf.relative);
|
||||||
let resource = path.basename(xlf.relative, '.xlf');
|
let resource = path.basename(xlf.relative, '.xlf');
|
||||||
let contents = xlf.contents.toString();
|
let contents = xlf.contents.toString();
|
||||||
let parsePromise = pseudo ? XLF.parsePseudo(contents) : XLF.parse(contents);
|
let parsePromise = pseudo ? XLF.parsePseudo(contents) : XLF.parse(contents);
|
||||||
@@ -1086,7 +1078,7 @@ function prepareI18nPackFiles(externalExtensions, resultingTranslationPaths, pse
|
|||||||
resultingTranslationPaths.push({ id: 'vscode', resourceName: 'main.i18n.json' });
|
resultingTranslationPaths.push({ id: 'vscode', resourceName: 'main.i18n.json' });
|
||||||
this.queue(translatedMainFile);
|
this.queue(translatedMainFile);
|
||||||
for (let extension in extensionsPacks) {
|
for (let extension in extensionsPacks) {
|
||||||
const translatedExtFile = createI18nFile(`extensions/${extension}`, extensionsPacks[extension]);
|
const translatedExtFile = createI18nFile(`./extensions/${extension}`, extensionsPacks[extension]);
|
||||||
this.queue(translatedExtFile);
|
this.queue(translatedExtFile);
|
||||||
const externalExtensionId = externalExtensions[extension];
|
const externalExtensionId = externalExtensions[extension];
|
||||||
if (externalExtensionId) {
|
if (externalExtensionId) {
|
||||||
|
|||||||
@@ -27,167 +27,135 @@
|
|||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/api/common",
|
"name": "vs/workbench/parts/cli",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/cli",
|
"name": "vs/workbench/parts/codeEditor",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/codeEditor",
|
"name": "vs/workbench/parts/comments",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/callHierarchy",
|
"name": "vs/workbench/parts/debug",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/comments",
|
"name": "vs/workbench/parts/emmet",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/debug",
|
"name": "vs/workbench/parts/execution",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/emmet",
|
"name": "vs/workbench/parts/extensions",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/extensions",
|
"name": "vs/workbench/parts/feedback",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/externalTerminal",
|
"name": "vs/workbench/parts/files",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/feedback",
|
"name": "vs/workbench/parts/html",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/files",
|
"name": "vs/workbench/parts/markers",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/html",
|
"name": "vs/workbench/parts/localizations",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/issue",
|
"name": "vs/workbench/parts/logs",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/markers",
|
"name": "vs/workbench/parts/output",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/localizations",
|
"name": "vs/workbench/parts/performance",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/logs",
|
"name": "vs/workbench/parts/preferences",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/output",
|
"name": "vs/workbench/parts/quickopen",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/performance",
|
"name": "vs/workbench/parts/relauncher",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/preferences",
|
"name": "vs/workbench/parts/scm",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/quickopen",
|
"name": "vs/workbench/parts/search",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/userData",
|
"name": "vs/workbench/parts/snippets",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/remote",
|
"name": "vs/workbench/parts/stats",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/relauncher",
|
"name": "vs/workbench/parts/surveys",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/scm",
|
"name": "vs/workbench/parts/tasks",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/search",
|
"name": "vs/workbench/parts/terminal",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/snippets",
|
"name": "vs/workbench/parts/themes",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/format",
|
"name": "vs/workbench/parts/trust",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/stats",
|
"name": "vs/workbench/parts/update",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/surveys",
|
"name": "vs/workbench/parts/url",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/tasks",
|
"name": "vs/workbench/parts/watermark",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/terminal",
|
"name": "vs/workbench/parts/webview",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/themes",
|
"name": "vs/workbench/parts/welcome",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/contrib/trust",
|
"name": "vs/workbench/parts/outline",
|
||||||
"project": "vscode-workbench"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "vs/workbench/contrib/update",
|
|
||||||
"project": "vscode-workbench"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "vs/workbench/contrib/url",
|
|
||||||
"project": "vscode-workbench"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "vs/workbench/contrib/watermark",
|
|
||||||
"project": "vscode-workbench"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "vs/workbench/contrib/webview",
|
|
||||||
"project": "vscode-workbench"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "vs/workbench/contrib/customEditor",
|
|
||||||
"project": "vscode-workbench"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "vs/workbench/contrib/welcome",
|
|
||||||
"project": "vscode-workbench"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "vs/workbench/contrib/outline",
|
|
||||||
"project": "vscode-workbench"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "vs/workbench/contrib/userDataSync",
|
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -227,25 +195,17 @@
|
|||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/services/extensionManagement",
|
"name": "vs/workbench/services/jsonschemas",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/services/files",
|
"name": "vs/workbench/services/files",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "vs/workbench/services/integrity",
|
|
||||||
"project": "vscode-workbench"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/services/keybinding",
|
"name": "vs/workbench/services/keybinding",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "vs/workbench/services/lifecycle",
|
|
||||||
"project": "vscode-workbench"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/services/mode",
|
"name": "vs/workbench/services/mode",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
@@ -271,28 +231,16 @@
|
|||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/services/workspaces",
|
"name": "vs/workbench/services/workspace",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/services/decorations",
|
"name": "vs/workbench/services/decorations",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "vs/workbench/services/label",
|
|
||||||
"project": "vscode-workbench"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/services/preferences",
|
"name": "vs/workbench/services/preferences",
|
||||||
"project": "vscode-preferences"
|
"project": "vscode-preferences"
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "vs/workbench/services/notification",
|
|
||||||
"project": "vscode-workbench"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "vs/workbench/services/userData",
|
|
||||||
"project": "vscode-workbench"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user