mirror of
https://github.com/Microsoft/vscode
synced 2024-10-04 02:14:06 +00:00
Add vscode-test-resolver
This commit is contained in:
parent
6f9faafd4a
commit
90cfe12a63
2
extensions/vscode-test-resolver/.gitignore
vendored
Normal file
2
extensions/vscode-test-resolver/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
out
|
||||||
|
node_modules
|
22
extensions/vscode-test-resolver/.vscode/launch.json
vendored
Normal file
22
extensions/vscode-test-resolver/.vscode/launch.json
vendored
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
// A launch configuration that compiles the extension and then opens it inside a new window
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Extension",
|
||||||
|
"type": "extensionHost",
|
||||||
|
"request": "launch",
|
||||||
|
"runtimeExecutable": "${execPath}",
|
||||||
|
"args": [
|
||||||
|
"--extensionDevelopmentPath=${workspaceFolder}",
|
||||||
|
"--remote=test+test"
|
||||||
|
],
|
||||||
|
"outFiles": [
|
||||||
|
"${workspaceFolder}/out/**/*.js"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
6
extensions/vscode-test-resolver/.vscodeignore
Normal file
6
extensions/vscode-test-resolver/.vscodeignore
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
.vscode/**
|
||||||
|
typings/**
|
||||||
|
**/*.ts
|
||||||
|
**/*.map
|
||||||
|
.gitignore
|
||||||
|
tsconfig.json
|
89
extensions/vscode-test-resolver/package.json
Normal file
89
extensions/vscode-test-resolver/package.json
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
{
|
||||||
|
"name": "vscode-test-resolver",
|
||||||
|
"description": "Test resolver for VS Code",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"publisher": "vscode",
|
||||||
|
"enableProposedApi": true,
|
||||||
|
"private": true,
|
||||||
|
"engines": {
|
||||||
|
"vscode": "^1.25.0"
|
||||||
|
},
|
||||||
|
"extensionKind": "ui",
|
||||||
|
"scripts": {
|
||||||
|
"compile": "node ./node_modules/vscode/bin/compile -watch -p ./",
|
||||||
|
"vscode:prepublish": "node ../../node_modules/gulp/bin/gulp.js --gulpfile ../../build/gulpfile.extensions.js compile-extension:vscode-test-resolver ./tsconfig.json"
|
||||||
|
},
|
||||||
|
"activationEvents": [
|
||||||
|
"onResolveRemoteAuthority:test",
|
||||||
|
"onCommand:vscode-testresolver.newWindow",
|
||||||
|
"onCommand:vscode-testresolver.newWindowWithError",
|
||||||
|
"onCommand:vscode-testresolver.showLog"
|
||||||
|
],
|
||||||
|
"main": "./out/extension",
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^10.12.21",
|
||||||
|
"vscode": "1.1.5"
|
||||||
|
},
|
||||||
|
"contributes": {
|
||||||
|
"resourceLabelFormatters": [
|
||||||
|
{
|
||||||
|
"scheme": "vscode-remote",
|
||||||
|
"authority": "test+*",
|
||||||
|
"formatting": {
|
||||||
|
"label": "${path}",
|
||||||
|
"separator": "/",
|
||||||
|
"tildify": true,
|
||||||
|
"workspaceSuffix": "TestResolver"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"commands": [
|
||||||
|
{
|
||||||
|
"title": "New Window",
|
||||||
|
"category": "Remote-TestResolver",
|
||||||
|
"command": "vscode-testresolver.newWindow"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "New Window with Error",
|
||||||
|
"category": "Remote-TestResolver",
|
||||||
|
"command": "vscode-testresolver.newWindowWithError"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Show Log",
|
||||||
|
"category": "Remote-TestResolver",
|
||||||
|
"command": "vscode-testresolver.showLog"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"menus": {
|
||||||
|
"statusBar/windowIndicator": [
|
||||||
|
{
|
||||||
|
"command": "vscode-testresolver.newWindow",
|
||||||
|
"when": "!remoteAuthority",
|
||||||
|
"group": "9_local_testresolver@2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": "vscode-testresolver.newWindowWithError",
|
||||||
|
"when": "!remoteAuthority",
|
||||||
|
"group": "9_local_testresolver@3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": "vscode-testresolver.showLog",
|
||||||
|
"when": "remoteAuthority =~ /^test\\+.*$/",
|
||||||
|
"group": "1_remote_testresolver_open@3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": "vscode-testresolver.newWindow",
|
||||||
|
"when": "remoteAuthority =~ /^test\\+.*$/",
|
||||||
|
"group": "1_remote_testresolver_open@1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"command": "vscode-testresolver.newWindowWithError",
|
||||||
|
"when": "remoteAuthority =~ /^test\\+.*$/",
|
||||||
|
"group": "1_remote_testresolver_open@2"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
117
extensions/vscode-test-resolver/src/download.ts
Normal file
117
extensions/vscode-test-resolver/src/download.ts
Normal file
|
@ -0,0 +1,117 @@
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
import * as https from 'https';
|
||||||
|
import * as fs from 'fs';
|
||||||
|
import * as path from 'path';
|
||||||
|
import * as cp from 'child_process';
|
||||||
|
import { parse as parseUrl } from 'url';
|
||||||
|
|
||||||
|
function ensureFolderExists(loc: string) {
|
||||||
|
if (!fs.existsSync(loc)) {
|
||||||
|
const parent = path.dirname(loc);
|
||||||
|
if (parent) {
|
||||||
|
ensureFolderExists(parent);
|
||||||
|
}
|
||||||
|
fs.mkdirSync(loc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDownloadUrl(updateUrl: string, commit: string, platform: string, quality: string): string {
|
||||||
|
return `${updateUrl}/commit:${commit}/server-${platform}/${quality}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function downloadVSCodeServerArchive(updateUrl: string, commit: string, quality: string, destDir: string): Promise<string> {
|
||||||
|
ensureFolderExists(destDir);
|
||||||
|
|
||||||
|
const platform = process.platform === 'win32' ? 'win32-x64' : process.platform === 'darwin' ? 'darwin' : 'linux-x64';
|
||||||
|
const downloadUrl = getDownloadUrl(updateUrl, commit, platform, quality);
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
console.log(`Downloading VS Code Server from: ${downloadUrl}`);
|
||||||
|
const requestOptions: https.RequestOptions = parseUrl(downloadUrl);
|
||||||
|
|
||||||
|
https.get(requestOptions, res => {
|
||||||
|
if (res.statusCode !== 302) {
|
||||||
|
reject('Failed to get VS Code server archive location');
|
||||||
|
}
|
||||||
|
const archiveUrl = res.headers.location;
|
||||||
|
if (!archiveUrl) {
|
||||||
|
reject('Failed to get VS Code server archive location');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const archiveRequestOptions: https.RequestOptions = parseUrl(archiveUrl);
|
||||||
|
if (archiveUrl.endsWith('.zip')) {
|
||||||
|
const archivePath = path.resolve(destDir, `vscode-server-${commit}.zip`);
|
||||||
|
const outStream = fs.createWriteStream(archivePath);
|
||||||
|
outStream.on('close', () => {
|
||||||
|
resolve(archivePath);
|
||||||
|
});
|
||||||
|
https.get(archiveRequestOptions, res => {
|
||||||
|
res.pipe(outStream);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const zipPath = path.resolve(destDir, `vscode-server-${commit}.tgz`);
|
||||||
|
const outStream = fs.createWriteStream(zipPath);
|
||||||
|
https.get(archiveRequestOptions, res => {
|
||||||
|
res.pipe(outStream);
|
||||||
|
});
|
||||||
|
outStream.on('close', () => {
|
||||||
|
resolve(zipPath);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unzip a .zip or .tar.gz VS Code archive
|
||||||
|
*/
|
||||||
|
function unzipVSCodeServer(vscodeArchivePath: string, extractDir: string) {
|
||||||
|
if (vscodeArchivePath.endsWith('.zip')) {
|
||||||
|
const tempDir = fs.mkdtempSync('vscode-server');
|
||||||
|
if (process.platform === 'win32') {
|
||||||
|
cp.spawnSync('powershell.exe', [
|
||||||
|
'-NoProfile',
|
||||||
|
'-ExecutionPolicy', 'Bypass',
|
||||||
|
'-NonInteractive',
|
||||||
|
'-NoLogo',
|
||||||
|
'-Command',
|
||||||
|
`Microsoft.PowerShell.Archive\\Expand-Archive -Path "${vscodeArchivePath}" -DestinationPath "${tempDir}"`
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
|
cp.spawnSync('unzip', [vscodeArchivePath, '-d', `${tempDir}`]);
|
||||||
|
}
|
||||||
|
fs.renameSync(path.join(tempDir, process.platform === 'win32' ? 'vscode-server-win32-x64' : 'vscode-server-darwin'), extractDir);
|
||||||
|
} else {
|
||||||
|
// tar does not create extractDir by default
|
||||||
|
if (!fs.existsSync(extractDir)) {
|
||||||
|
fs.mkdirSync(extractDir);
|
||||||
|
}
|
||||||
|
cp.spawnSync('tar', ['-xzf', vscodeArchivePath, '-C', extractDir, '--strip-components', '1']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function downloadAndUnzipVSCodeServer(updateUrl: string, commit: string, quality: string = 'stable', destDir: string): Promise<string> {
|
||||||
|
|
||||||
|
const extractDir = path.join(destDir, commit);
|
||||||
|
if (fs.existsSync(extractDir)) {
|
||||||
|
console.log(`Found ${extractDir}. Skipping download.`);
|
||||||
|
} else {
|
||||||
|
console.log(`Downloading VS Code Server ${quality} - ${commit} into ${extractDir}.`);
|
||||||
|
try {
|
||||||
|
const vscodeArchivePath = await downloadVSCodeServerArchive(updateUrl, commit, quality, destDir);
|
||||||
|
if (fs.existsSync(vscodeArchivePath)) {
|
||||||
|
unzipVSCodeServer(vscodeArchivePath, extractDir);
|
||||||
|
// Remove archive
|
||||||
|
fs.unlinkSync(vscodeArchivePath);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
throw Error(`Failed to download and unzip VS Code ${quality} - ${commit}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Promise.resolve(extractDir);
|
||||||
|
}
|
190
extensions/vscode-test-resolver/src/extension.ts
Normal file
190
extensions/vscode-test-resolver/src/extension.ts
Normal file
|
@ -0,0 +1,190 @@
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
import * as vscode from 'vscode';
|
||||||
|
import * as cp from 'child_process';
|
||||||
|
import * as path from 'path';
|
||||||
|
import * as fs from 'fs';
|
||||||
|
import * as os from 'os';
|
||||||
|
import { downloadAndUnzipVSCodeServer } from './download';
|
||||||
|
|
||||||
|
let startPromise: Thenable<vscode.ResolvedAuthority> | undefined = void 0;
|
||||||
|
let extHostProcess: cp.ChildProcess | undefined;
|
||||||
|
const enum CharCode {
|
||||||
|
Backspace = 8,
|
||||||
|
LineFeed = 10
|
||||||
|
}
|
||||||
|
|
||||||
|
let outputChannel: vscode.OutputChannel;
|
||||||
|
|
||||||
|
export function activate(context: vscode.ExtensionContext) {
|
||||||
|
|
||||||
|
function doResolve(_authority: string, progress: vscode.Progress<{ message?: string; increment?: number }>): Promise<vscode.ResolvedAuthority> {
|
||||||
|
return new Promise(async (res, rej) => {
|
||||||
|
progress.report({ message: 'Starting Test Resolver' });
|
||||||
|
outputChannel = vscode.window.createOutputChannel('TestResolver');
|
||||||
|
|
||||||
|
let isStarted = false;
|
||||||
|
async function processError(message: string) {
|
||||||
|
outputChannel.appendLine(message);
|
||||||
|
if (!isStarted) {
|
||||||
|
outputChannel.show();
|
||||||
|
|
||||||
|
const result = await vscode.window.showErrorMessage(message, { modal: true }, ...getActions());
|
||||||
|
if (result) {
|
||||||
|
await result.execute();
|
||||||
|
}
|
||||||
|
rej(vscode.RemoteAuthorityResolverError.NotAvailable(message, true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let lastProgressLine = '';
|
||||||
|
function processOutput(output: string) {
|
||||||
|
outputChannel.append(output);
|
||||||
|
for (let i = 0; i < output.length; i++) {
|
||||||
|
const chr = output.charCodeAt(i);
|
||||||
|
if (chr === CharCode.LineFeed) {
|
||||||
|
const match = lastProgressLine.match(/Extension host agent listening on (\d+)/);
|
||||||
|
if (match) {
|
||||||
|
isStarted = true;
|
||||||
|
res(new vscode.ResolvedAuthority('localhost', parseInt(match[1], 10))); // success!
|
||||||
|
}
|
||||||
|
lastProgressLine = '';
|
||||||
|
} else if (chr === CharCode.Backspace) {
|
||||||
|
lastProgressLine = lastProgressLine.substr(0, lastProgressLine.length - 1);
|
||||||
|
} else {
|
||||||
|
lastProgressLine += output.charAt(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_authority === 'test+error' || vscode.workspace.getConfiguration('testresolver').get('error') === true) {
|
||||||
|
processError('Unable to start the Test Resolver.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const { updateUrl, commit, quality } = getProductConfiguration();
|
||||||
|
if (!commit) { // dev mode
|
||||||
|
const vscodePath = path.resolve(path.join(context.extensionPath, '..', '..'));
|
||||||
|
const nodeExec = process.platform === 'win32' ? 'node.exe' : 'node';
|
||||||
|
const nodePath = path.join(vscodePath, '.build', 'node-remote', nodeExec);
|
||||||
|
|
||||||
|
if (!fs.existsSync(nodePath)) {
|
||||||
|
try {
|
||||||
|
progress.report({ message: 'Installing node' });
|
||||||
|
outputChannel.appendLine(`Installing node at ${nodePath}`);
|
||||||
|
cp.execSync(`node ${path.join(vscodePath, 'node_modules/gulp/bin/gulp.js')} node-remote`);
|
||||||
|
} catch (e) {
|
||||||
|
processError(`Problem downloading node: ${e.message}`);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
outputChannel.appendLine(`Using node at ${nodePath}`);
|
||||||
|
|
||||||
|
const env = getNewEnv();
|
||||||
|
env['PATH'] = path.join(vscodePath, 'resources', 'server', 'bin') + path.delimiter + env['PATH']; // allow calling code-dev.sh
|
||||||
|
|
||||||
|
outputChannel.appendLine(env['PATH'] || '');
|
||||||
|
|
||||||
|
extHostProcess = cp.spawn(nodePath, [path.join('out', 'remoteExtensionHostAgent'), '--port=0'], { cwd: vscodePath, env });
|
||||||
|
} else {
|
||||||
|
const serverBin = path.resolve(os.homedir(), '.vscode-remote', 'bin');
|
||||||
|
progress.report({ message: 'Installing VSCode Server' });
|
||||||
|
const serverLocation = await downloadAndUnzipVSCodeServer(updateUrl, commit, quality, serverBin);
|
||||||
|
outputChannel.appendLine(`Using server build at ${serverLocation}`);
|
||||||
|
|
||||||
|
const commandArgs = ['--port=0', '--disable-telemetry'];
|
||||||
|
|
||||||
|
const env = getNewEnv();
|
||||||
|
env['PATH'] = path.join(serverLocation, 'bin') + path.delimiter + env['PATH']; // code command for the terminal
|
||||||
|
|
||||||
|
extHostProcess = cp.spawn(path.join(serverLocation, 'server.sh'), commandArgs, { env, cwd: serverLocation });
|
||||||
|
}
|
||||||
|
extHostProcess.stdout.on('data', (data: Buffer) => processOutput(data.toString()));
|
||||||
|
extHostProcess.stderr.on('data', (data: Buffer) => processOutput(data.toString()));
|
||||||
|
extHostProcess.on('error', (error: Error) => processError(`remoteExtensionHostAgent failed with error:\n${error.message}`));
|
||||||
|
extHostProcess.on('close', (code: number) => processError(`remoteExtensionHostAgent closed unexpectedly.\nError code: ${code}`));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
vscode.workspace.registerRemoteAuthorityResolver('test', {
|
||||||
|
resolve(_authority: string): Thenable<vscode.ResolvedAuthority> {
|
||||||
|
if (!startPromise) {
|
||||||
|
startPromise = vscode.window.withProgress({
|
||||||
|
location: vscode.ProgressLocation.Notification,
|
||||||
|
title: 'Open TestResolver Remote ([details](command:remote-testresolver.showLog))',
|
||||||
|
cancellable: false
|
||||||
|
}, (progress) => doResolve(_authority, progress));
|
||||||
|
}
|
||||||
|
return startPromise;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
vscode.commands.registerCommand('vscode-testresolver.newWindow', () => {
|
||||||
|
return vscode.commands.executeCommand('vscode.newWindow', { remoteAuthority: 'test+test' });
|
||||||
|
});
|
||||||
|
vscode.commands.registerCommand('vscode-testresolver.newWindowWithError', () => {
|
||||||
|
return vscode.commands.executeCommand('vscode.newWindow', { remoteAuthority: 'test+error' });
|
||||||
|
});
|
||||||
|
vscode.commands.registerCommand('vscode-testresolver.showLog', () => {
|
||||||
|
if (outputChannel) {
|
||||||
|
outputChannel.show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
type ActionItem = (vscode.MessageItem & { execute: () => void; });
|
||||||
|
|
||||||
|
function getActions(): ActionItem[] {
|
||||||
|
const actions: ActionItem[] = [];
|
||||||
|
const isDirty = vscode.workspace.textDocuments.some(d => d.isDirty) || vscode.workspace.workspaceFile && vscode.workspace.workspaceFile.scheme === 'untitled';
|
||||||
|
|
||||||
|
actions.push({
|
||||||
|
title: 'Retry',
|
||||||
|
execute: async () => {
|
||||||
|
await vscode.commands.executeCommand('workbench.action.reloadWindow');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (!isDirty) {
|
||||||
|
actions.push({
|
||||||
|
title: 'Close Remote',
|
||||||
|
execute: async () => {
|
||||||
|
await vscode.commands.executeCommand('vscode.newWindow', { reuseWindow: true });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
actions.push({
|
||||||
|
title: 'Ignore',
|
||||||
|
isCloseAffordance: true,
|
||||||
|
execute: async () => {
|
||||||
|
vscode.commands.executeCommand('vscode-testresolver.showLog'); // no need to wait
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return actions;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IProductConfiguration {
|
||||||
|
updateUrl: string;
|
||||||
|
commit: string;
|
||||||
|
quality: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getProductConfiguration(): IProductConfiguration {
|
||||||
|
const content = fs.readFileSync(path.join(vscode.env.appRoot, 'product.json')).toString();
|
||||||
|
return JSON.parse(content) as IProductConfiguration;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getNewEnv(): { [x: string]: string | undefined } {
|
||||||
|
const env = { ...process.env };
|
||||||
|
delete env['ELECTRON_RUN_AS_NODE'];
|
||||||
|
return env;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function deactivate() {
|
||||||
|
if (extHostProcess) {
|
||||||
|
extHostProcess.kill();
|
||||||
|
}
|
||||||
|
}
|
8
extensions/vscode-test-resolver/src/typings/ref.d.ts
vendored
Normal file
8
extensions/vscode-test-resolver/src/typings/ref.d.ts
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/// <reference path="../../../../src/vs/vscode.d.ts" />
|
||||||
|
/// <reference path="../../../../src/vs/vscode.proposed.d.ts" />
|
||||||
|
/// <reference types='@types/node'/>
|
9
extensions/vscode-test-resolver/tsconfig.json
Normal file
9
extensions/vscode-test-resolver/tsconfig.json
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"extends": "../shared.tsconfig.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"outDir": "./out"
|
||||||
|
},
|
||||||
|
"include": [
|
||||||
|
"src/**/*"
|
||||||
|
]
|
||||||
|
}
|
1879
extensions/vscode-test-resolver/yarn.lock
Normal file
1879
extensions/vscode-test-resolver/yarn.lock
Normal file
File diff suppressed because it is too large
Load diff
|
@ -6,9 +6,11 @@
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import * as cp from 'child_process';
|
import * as cp from 'child_process';
|
||||||
import * as os from 'os';
|
import * as os from 'os';
|
||||||
|
import * as fs from 'fs';
|
||||||
import { tmpName } from 'tmp';
|
import { tmpName } from 'tmp';
|
||||||
import { IDriver, connect as connectDriver, IDisposable, IElement, Thenable } from './driver';
|
import { IDriver, connect as connectDriver, IDisposable, IElement, Thenable } from './driver';
|
||||||
import { Logger } from '../logger';
|
import { Logger } from '../logger';
|
||||||
|
import { ncp } from 'ncp';
|
||||||
|
|
||||||
const repoPath = path.join(__dirname, '../../../..');
|
const repoPath = path.join(__dirname, '../../../..');
|
||||||
|
|
||||||
|
@ -128,6 +130,15 @@ export async function spawn(options: SpawnOptions): Promise<Code> {
|
||||||
`--${options.workspacePath.endsWith('.code-workspace') ? 'file' : 'folder'}-uri`,
|
`--${options.workspacePath.endsWith('.code-workspace') ? 'file' : 'folder'}-uri`,
|
||||||
`vscode-remote://test+test${options.workspacePath}`,
|
`vscode-remote://test+test${options.workspacePath}`,
|
||||||
);
|
);
|
||||||
|
if (codePath) {
|
||||||
|
// running against a build: copy the test resolver extension
|
||||||
|
const testResolverExtPath = path.join(options.extensionsPath, 'vscode-test-resolver');
|
||||||
|
if (!fs.existsSync(testResolverExtPath)) {
|
||||||
|
const orig = path.join(repoPath, 'extensions', 'vscode-test-resolver');
|
||||||
|
await new Promise((c, e) => ncp(orig, testResolverExtPath, err => err ? e(err) : c()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
args.push('--enable-proposed-api=vscode.vscode-test-resolver');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!codePath) {
|
if (!codePath) {
|
||||||
|
|
Loading…
Reference in a new issue