From 5bdb90de36863ae2fdfbc424e34800f4e4eb484a Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 23 Jan 2018 16:40:41 +0100 Subject: [PATCH] scripts/code.sh picks up marketplace built-in extensions automatically --- build/builtInExtensions.json | 4 +++ build/gulpfile.vscode.js | 26 ++++++++++++--- build/lib/builtInExtensions.js | 32 ++++++++++++++++++ extensions/ms-vscode.node-debug/package.json | 4 +-- extensions/ms-vscode.node-debug2/package.json | 4 +-- scripts/code.sh | 3 ++ .../electron-browser/extensionPoints.ts | 4 +++ .../electron-browser/extensionService.ts | 33 ++++++++++++++++++- 8 files changed, 100 insertions(+), 10 deletions(-) create mode 100644 build/builtInExtensions.json create mode 100644 build/lib/builtInExtensions.js diff --git a/build/builtInExtensions.json b/build/builtInExtensions.json new file mode 100644 index 00000000000..4921d2a27c7 --- /dev/null +++ b/build/builtInExtensions.json @@ -0,0 +1,4 @@ +[ + { "name": "ms-vscode.node-debug", "version": "1.20.3" }, + { "name": "ms-vscode.node-debug2", "version": "1.20.1" } +] \ No newline at end of file diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 15b95986668..b0ff0a2a732 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -44,14 +44,13 @@ const nodeModules = ['electron', 'original-fs'] // Build -const builtInExtensions = [ - { name: 'ms-vscode.node-debug', version: '1.20.3' }, - { name: 'ms-vscode.node-debug2', version: '1.20.1' } -]; +const builtInExtensions = require('./builtInExtensions'); const excludedExtensions = [ 'vscode-api-tests', - 'vscode-colorize-tests' + 'vscode-colorize-tests', + 'ms-vscode.node-debug', + 'ms-vscode.node-debug2', ]; const vscodeEntryPoints = _.flatten([ @@ -584,3 +583,20 @@ gulp.task('generate-vscode-configuration', () => { console.error(e.toString()); }); }); + +//#region Built-In Extensions +gulp.task('clean-builtInExtensions', util.rimraf('.build/builtInExtensions')); + +gulp.task('builtInExtensions', ['clean-builtInExtensions'], function() { + const marketplaceExtensions = es.merge(...builtInExtensions.map(extension => { + return ext.fromMarketplace(extension.name, extension.version) + .pipe(rename(p => p.dirname = `${extension.name}/${p.dirname}`)); + })); + + return ( + marketplaceExtensions + .pipe(util.setExecutableBit(['**/*.sh'])) + .pipe(vfs.dest('.build/builtInExtensions')) + ); +}); +//#endregion diff --git a/build/lib/builtInExtensions.js b/build/lib/builtInExtensions.js new file mode 100644 index 00000000000..0a78f4ccffd --- /dev/null +++ b/build/lib/builtInExtensions.js @@ -0,0 +1,32 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const root = path.dirname(path.dirname(__dirname)); + +function isUpToDate(extension) { + const packagePath = path.join(root, '.build', 'builtInExtensions', extension.name, 'package.json'); + if (!fs.existsSync(packagePath)) { + return false; + } + const packageContents = fs.readFileSync(packagePath); + try { + const diskVersion = JSON.parse(packageContents).version; + return (diskVersion === extension.version); + } catch(err) { + return false; + } +} + +const builtInExtensions = require('../builtInExtensions'); +builtInExtensions.forEach((extension) => { + if (!isUpToDate(extension)) { + process.exit(1); + } +}); +process.exit(0); diff --git a/extensions/ms-vscode.node-debug/package.json b/extensions/ms-vscode.node-debug/package.json index 87569809e43..9d065dd4a5c 100644 --- a/extensions/ms-vscode.node-debug/package.json +++ b/extensions/ms-vscode.node-debug/package.json @@ -1,7 +1,7 @@ { - "name": "node-debug-placeholder", + "name": "node-debug", "version": "1.6.0", - "publisher": "vscode", + "publisher": "ms-vscode", "engines": { "vscode": "1.6.x" } diff --git a/extensions/ms-vscode.node-debug2/package.json b/extensions/ms-vscode.node-debug2/package.json index 26777f7dae6..96c454263b3 100644 --- a/extensions/ms-vscode.node-debug2/package.json +++ b/extensions/ms-vscode.node-debug2/package.json @@ -1,7 +1,7 @@ { - "name": "node-debug2-placeholder", + "name": "node-debug2", "version": "0.0.3", - "publisher": "vscode", + "publisher": "ms-vscode", "engines": { "vscode": "1.6.x" } diff --git a/scripts/code.sh b/scripts/code.sh index 6339ad06bd4..089d380c1b5 100755 --- a/scripts/code.sh +++ b/scripts/code.sh @@ -24,6 +24,9 @@ function code() { # Get electron node build/lib/electron.js || ./node_modules/.bin/gulp electron + # Get built-in extensions + node build/lib/builtInExtensions.js || ./node_modules/.bin/gulp builtInExtensions + # Build test -d out || ./node_modules/.bin/gulp compile diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionPoints.ts b/src/vs/workbench/services/extensions/electron-browser/extensionPoints.ts index b0b0f300177..1ce6fdca2c2 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionPoints.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionPoints.ts @@ -334,6 +334,10 @@ export class ExtensionScanner { } const rawFolders = await pfs.readDirsInDir(absoluteFolderPath); + + // Ensure the same extension order + rawFolders.sort(); + let folders: string[] = null; if (isBuiltin) { folders = rawFolders; diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts index 8abc3ff6140..4d51f56bd85 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts @@ -44,6 +44,7 @@ import * as strings from 'vs/base/common/strings'; import { RPCProtocol } from 'vs/workbench/services/extensions/node/rpcProtocol'; const SystemExtensionsRoot = path.normalize(path.join(URI.parse(require.toUrl('')).fsPath, '..', 'extensions')); +const ExtraDevSystemExtensionsRoot = path.normalize(path.join(URI.parse(require.toUrl('')).fsPath, '..', '.build', 'builtInExtensions')); // Enable to see detailed message communication between window and extension host const logExtensionHostCommunication = false; @@ -624,6 +625,36 @@ export class ExtensionService extends Disposable implements IExtensionService { log ); + let finalBuiltinExtensions: TPromise = builtinExtensions; + + if (devMode) { + const extraBuiltinExtensions = ExtensionScanner.scanExtensions(new ExtensionScannerInput(version, commit, locale, devMode, ExtraDevSystemExtensionsRoot, true), log); + finalBuiltinExtensions = TPromise.join([builtinExtensions, extraBuiltinExtensions]).then(([builtinExtensions, extraBuiltinExtensions]) => { + let resultMap: { [id: string]: IExtensionDescription; } = Object.create(null); + for (let i = 0, len = builtinExtensions.length; i < len; i++) { + resultMap[builtinExtensions[i].id] = builtinExtensions[i]; + } + // Overwrite with extensions found in extra + for (let i = 0, len = extraBuiltinExtensions.length; i < len; i++) { + resultMap[extraBuiltinExtensions[i].id] = extraBuiltinExtensions[i]; + } + + let resultArr = Object.keys(resultMap).map((id) => resultMap[id]); + resultArr.sort((a, b) => { + const aLastSegment = path.basename(a.extensionFolderPath); + const bLastSegment = path.basename(b.extensionFolderPath); + if (aLastSegment < bLastSegment) { + return -1; + } + if (aLastSegment > bLastSegment) { + return 1; + } + return 0; + }); + return resultArr; + }); + } + const userExtensions = ( environmentService.disableExtensions || !environmentService.extensionsPath ? TPromise.as([]) @@ -646,7 +677,7 @@ export class ExtensionService extends Disposable implements IExtensionService { : TPromise.as([]) ); - return TPromise.join([builtinExtensions, userExtensions, developedExtensions]) + return TPromise.join([finalBuiltinExtensions, userExtensions, developedExtensions]) .then((extensionDescriptions: IExtensionDescription[][]) => { const system = extensionDescriptions[0]; const user = extensionDescriptions[1];