From 53ef270682b25c234e345e91b726ae03a02de63d Mon Sep 17 00:00:00 2001 From: Don Jayamanne Date: Thu, 6 Jun 2019 13:26:58 -0700 Subject: [PATCH 1/3] Fixes to activation of Conda environments (#5934) --- news/2 Fixes/5929.md | 1 + src/client/common/terminal/helper.ts | 8 ++---- src/client/common/terminal/types.ts | 2 +- src/client/interpreter/activation/service.ts | 18 ++++++------- src/test/common/terminals/helper.unit.test.ts | 9 ++++--- .../activation/service.unit.test.ts | 25 +++++++++---------- 6 files changed, 30 insertions(+), 33 deletions(-) create mode 100644 news/2 Fixes/5929.md diff --git a/news/2 Fixes/5929.md b/news/2 Fixes/5929.md new file mode 100644 index 000000000000..9b78f02d77af --- /dev/null +++ b/news/2 Fixes/5929.md @@ -0,0 +1 @@ +Fixes to activation of Conda environments diff --git a/src/client/common/terminal/helper.ts b/src/client/common/terminal/helper.ts index e09283e45a14..8720a89aef3a 100644 --- a/src/client/common/terminal/helper.ts +++ b/src/client/common/terminal/helper.ts @@ -52,12 +52,8 @@ export class TerminalHelper implements ITerminalHelper { this.sendTelemetry(resource, terminalShellType, EventName.PYTHON_INTERPRETER_ACTIVATION_FOR_TERMINAL, promise).ignoreErrors(); return promise; } - public async getEnvironmentActivationShellCommands(resource: Resource, interpreter?: PythonInterpreter): Promise { - if (this.platform.osType === OSType.Unknown){ - return; - } - const shell = this.shellDetector.identifyTerminalShell(); - if (!shell) { + public async getEnvironmentActivationShellCommands(resource: Resource, shell: TerminalShellType, interpreter?: PythonInterpreter): Promise { + if (this.platform.osType === OSType.Unknown) { return; } const providers = [this.bashCShellFish, this.commandPromptAndPowerShell]; diff --git a/src/client/common/terminal/types.ts b/src/client/common/terminal/types.ts index ec92bdc1e7f8..362d6d7d90d9 100644 --- a/src/client/common/terminal/types.ts +++ b/src/client/common/terminal/types.ts @@ -57,7 +57,7 @@ export interface ITerminalHelper { identifyTerminalShell(terminal?: Terminal): TerminalShellType; buildCommandForTerminal(terminalShellType: TerminalShellType, command: string, args: string[]): string; getEnvironmentActivationCommands(terminalShellType: TerminalShellType, resource?: Uri): Promise; - getEnvironmentActivationShellCommands(resource: Resource, interpreter?: PythonInterpreter): Promise; + getEnvironmentActivationShellCommands(resource: Resource, shell: TerminalShellType, interpreter?: PythonInterpreter): Promise; } export const ITerminalActivator = Symbol('ITerminalActivator'); diff --git a/src/client/interpreter/activation/service.ts b/src/client/interpreter/activation/service.ts index bb5e05440865..15b6e4dfa79d 100644 --- a/src/client/interpreter/activation/service.ts +++ b/src/client/interpreter/activation/service.ts @@ -9,7 +9,7 @@ import * as path from 'path'; import { LogOptions, traceDecorators, traceError, traceVerbose } from '../../common/logger'; import { IPlatformService } from '../../common/platform/types'; import { IProcessServiceFactory } from '../../common/process/types'; -import { ITerminalHelper } from '../../common/terminal/types'; +import { ITerminalHelper, TerminalShellType } from '../../common/terminal/types'; import { ICurrentProcess, IDisposable, Resource } from '../../common/types'; import { cacheResourceSpecificInterpreterData, @@ -29,9 +29,9 @@ const getEnvironmentTimeout = 30000; // The shell under which we'll execute activation scripts. const defaultShells = { - [OSType.Windows]: 'cmd', - [OSType.OSX]: 'bash', - [OSType.Linux]: 'bash', + [OSType.Windows]: { shell: 'cmd', shellType: TerminalShellType.commandPrompt }, + [OSType.OSX]: { shell: 'bash', shellType: TerminalShellType.bash }, + [OSType.Linux]: { shell: 'bash', shellType: TerminalShellType.bash }, [OSType.Unknown]: undefined }; @@ -54,14 +54,14 @@ export class EnvironmentActivationService implements IEnvironmentActivationServi @captureTelemetry(EventName.PYTHON_INTERPRETER_ACTIVATION_ENVIRONMENT_VARIABLES, { failed: false }, true) @cacheResourceSpecificInterpreterData('ActivatedEnvironmentVariables', cacheDuration) public async getActivatedEnvironmentVariables(resource: Resource, interpreter?: PythonInterpreter, allowExceptions?: boolean): Promise { - const shell = defaultShells[this.platform.osType]; - if (!shell) { + const shellInfo = defaultShells[this.platform.osType]; + if (!shellInfo) { return; } try { - const activationCommands = await this.helper.getEnvironmentActivationShellCommands(resource, interpreter); - traceVerbose(`Activation Commands received ${activationCommands}`); + const activationCommands = await this.helper.getEnvironmentActivationShellCommands(resource, shellInfo.shellType, interpreter); + traceVerbose(`Activation Commands received ${activationCommands} for shell ${shellInfo.shell}`); if (!activationCommands || !Array.isArray(activationCommands) || activationCommands.length === 0) { return; } @@ -84,7 +84,7 @@ export class EnvironmentActivationService implements IEnvironmentActivationServi // See the discussion from hidesoon in this issue: https://github.com/Microsoft/vscode-python/issues/4424 // His issue is conda never finishing during activate. This is a conda issue, but we // should at least tell the user. - const result = await processService.shellExec(command, { env, shell, timeout: getEnvironmentTimeout, maxBuffer: 1000 * 1000 }); + const result = await processService.shellExec(command, { env, shell: shellInfo.shell, timeout: getEnvironmentTimeout, maxBuffer: 1000 * 1000 }); if (result.stderr && result.stderr.length > 0) { throw new Error(`StdErr from ShellExec, ${result.stderr}`); } diff --git a/src/test/common/terminals/helper.unit.test.ts b/src/test/common/terminals/helper.unit.test.ts index 3d53c41a9ecf..f6cbba997709 100644 --- a/src/test/common/terminals/helper.unit.test.ts +++ b/src/test/common/terminals/helper.unit.test.ts @@ -315,9 +315,10 @@ suite('Terminal Service helpers', () => { test('Activation command for Shell must be empty for unknown os', async () => { when(platformService.osType).thenReturn(OSType.Unknown); - const cmd = await helper.getEnvironmentActivationShellCommands(resource, interpreter); - - expect(cmd).to.equal(undefined, 'Command must be undefined'); + for (const item of getNamesAndValues(TerminalShellType)) { + const cmd = await helper.getEnvironmentActivationShellCommands(resource, item.value, interpreter); + expect(cmd).to.equal(undefined, 'Command must be undefined'); + } }); }); [undefined, pythonInterpreter].forEach(interpreter => { @@ -332,7 +333,7 @@ suite('Terminal Service helpers', () => { when(bashActivationProvider.isShellSupported(shellToExpect)).thenReturn(false); when(cmdActivationProvider.isShellSupported(shellToExpect)).thenReturn(false); - const cmd = await helper.getEnvironmentActivationShellCommands(resource, interpreter); + const cmd = await helper.getEnvironmentActivationShellCommands(resource, shellToExpect, interpreter); expect(cmd).to.equal(undefined, 'Command must be undefined'); verify(pythonSettings.terminal).once(); diff --git a/src/test/interpreters/activation/service.unit.test.ts b/src/test/interpreters/activation/service.unit.test.ts index 8b9db1c5e26d..35e31b9d86b8 100644 --- a/src/test/interpreters/activation/service.unit.test.ts +++ b/src/test/interpreters/activation/service.unit.test.ts @@ -9,7 +9,6 @@ import { SemVer } from 'semver'; import { anything, capture, instance, mock, verify, when } from 'ts-mockito'; import * as typemoq from 'typemoq'; import { Uri, workspace as workspaceType, WorkspaceConfiguration } from 'vscode'; - import { PlatformService } from '../../../client/common/platform/platformService'; import { IPlatformService } from '../../../client/common/platform/types'; import { CurrentProcess } from '../../../client/common/process/currentProcess'; @@ -111,19 +110,19 @@ suite('Interprters Activation - Python Environment Variables', () => { setup(initSetup); test('getEnvironmentActivationShellCommands will be invoked', async () => { when(platform.osType).thenReturn(osType.value); - when(helper.getEnvironmentActivationShellCommands(resource, interpreter)).thenResolve(); + when(helper.getEnvironmentActivationShellCommands(resource, anything(), interpreter)).thenResolve(); const env = await service.getActivatedEnvironmentVariables(resource, interpreter); verify(platform.osType).once(); expect(env).to.equal(undefined, 'Should not have any variables'); - verify(helper.getEnvironmentActivationShellCommands(resource, interpreter)).once(); + verify(helper.getEnvironmentActivationShellCommands(resource, anything(), interpreter)).once(); }); test('Validate command used to activation and printing env vars', async () => { const cmd = ['1', '2']; const envVars = { one: '1', two: '2' }; when(platform.osType).thenReturn(osType.value); - when(helper.getEnvironmentActivationShellCommands(resource, interpreter)).thenResolve(cmd); + when(helper.getEnvironmentActivationShellCommands(resource, anything(), interpreter)).thenResolve(cmd); when(processServiceFactory.create(resource)).thenResolve(instance(processService)); when(envVarsService.getEnvironmentVariables(resource)).thenResolve(envVars); @@ -131,7 +130,7 @@ suite('Interprters Activation - Python Environment Variables', () => { verify(platform.osType).once(); expect(env).to.equal(undefined, 'Should not have any variables'); - verify(helper.getEnvironmentActivationShellCommands(resource, interpreter)).once(); + verify(helper.getEnvironmentActivationShellCommands(resource, anything(), interpreter)).once(); verify(processServiceFactory.create(resource)).once(); verify(envVarsService.getEnvironmentVariables(resource)).once(); verify(processService.shellExec(anything(), anything())).once(); @@ -147,7 +146,7 @@ suite('Interprters Activation - Python Environment Variables', () => { const cmd = ['1', '2']; const envVars = { one: '1', two: '2' }; when(platform.osType).thenReturn(osType.value); - when(helper.getEnvironmentActivationShellCommands(resource, interpreter)).thenResolve(cmd); + when(helper.getEnvironmentActivationShellCommands(resource, anything(), interpreter)).thenResolve(cmd); when(processServiceFactory.create(resource)).thenResolve(instance(processService)); when(envVarsService.getEnvironmentVariables(resource)).thenResolve(envVars); @@ -155,7 +154,7 @@ suite('Interprters Activation - Python Environment Variables', () => { verify(platform.osType).once(); expect(env).to.equal(undefined, 'Should not have any variables'); - verify(helper.getEnvironmentActivationShellCommands(resource, interpreter)).once(); + verify(helper.getEnvironmentActivationShellCommands(resource, anything(), interpreter)).once(); verify(processServiceFactory.create(resource)).once(); verify(envVarsService.getEnvironmentVariables(resource)).once(); verify(processService.shellExec(anything(), anything())).once(); @@ -169,7 +168,7 @@ suite('Interprters Activation - Python Environment Variables', () => { const cmd = ['1', '2']; const envVars = { one: '1', two: '2' }; when(platform.osType).thenReturn(osType.value); - when(helper.getEnvironmentActivationShellCommands(resource, interpreter)).thenResolve(cmd); + when(helper.getEnvironmentActivationShellCommands(resource, anything(), interpreter)).thenResolve(cmd); when(processServiceFactory.create(resource)).thenResolve(instance(processService)); when(envVarsService.getEnvironmentVariables(resource)).thenResolve({}); when(currentProcess.env).thenReturn(envVars); @@ -178,7 +177,7 @@ suite('Interprters Activation - Python Environment Variables', () => { verify(platform.osType).once(); expect(env).to.equal(undefined, 'Should not have any variables'); - verify(helper.getEnvironmentActivationShellCommands(resource, interpreter)).once(); + verify(helper.getEnvironmentActivationShellCommands(resource, anything(), interpreter)).once(); verify(processServiceFactory.create(resource)).once(); verify(envVarsService.getEnvironmentVariables(resource)).once(); verify(processService.shellExec(anything(), anything())).once(); @@ -193,7 +192,7 @@ suite('Interprters Activation - Python Environment Variables', () => { const cmd = ['1', '2']; const envVars = { one: '1', two: '2' }; when(platform.osType).thenReturn(osType.value); - when(helper.getEnvironmentActivationShellCommands(resource, interpreter)).thenResolve(cmd); + when(helper.getEnvironmentActivationShellCommands(resource, anything(), interpreter)).thenResolve(cmd); when(processServiceFactory.create(resource)).thenResolve(instance(processService)); when(envVarsService.getEnvironmentVariables(resource)).thenResolve(envVars); when(processService.shellExec(anything(), anything())).thenReject(new Error('kaboom')); @@ -202,7 +201,7 @@ suite('Interprters Activation - Python Environment Variables', () => { verify(platform.osType).once(); expect(env).to.equal(undefined, 'Should not have any variables'); - verify(helper.getEnvironmentActivationShellCommands(resource, interpreter)).once(); + verify(helper.getEnvironmentActivationShellCommands(resource, anything(), interpreter)).once(); verify(processServiceFactory.create(resource)).once(); verify(envVarsService.getEnvironmentVariables(resource)).once(); verify(processService.shellExec(anything(), anything())).once(); @@ -213,7 +212,7 @@ suite('Interprters Activation - Python Environment Variables', () => { const varsFromEnv = { one: '11', two: '22', HELLO: 'xxx' }; const stdout = `${getEnvironmentPrefix}${EOL}${JSON.stringify(varsFromEnv)}`; when(platform.osType).thenReturn(osType.value); - when(helper.getEnvironmentActivationShellCommands(resource, interpreter)).thenResolve(cmd); + when(helper.getEnvironmentActivationShellCommands(resource, anything(), interpreter)).thenResolve(cmd); when(processServiceFactory.create(resource)).thenResolve(instance(processService)); when(envVarsService.getEnvironmentVariables(resource)).thenResolve(envVars); when(processService.shellExec(anything(), anything())).thenResolve({ stdout: stdout }); @@ -222,7 +221,7 @@ suite('Interprters Activation - Python Environment Variables', () => { verify(platform.osType).once(); expect(env).to.deep.equal(varsFromEnv); - verify(helper.getEnvironmentActivationShellCommands(resource, interpreter)).once(); + verify(helper.getEnvironmentActivationShellCommands(resource, anything(), interpreter)).once(); verify(processServiceFactory.create(resource)).once(); verify(envVarsService.getEnvironmentVariables(resource)).once(); verify(processService.shellExec(anything(), anything())).once(); From d5857145cd64afb7fdf09d1d5a2d1be34ddff9a3 Mon Sep 17 00:00:00 2001 From: Don Jayamanne Date: Thu, 6 Jun 2019 14:10:34 -0700 Subject: [PATCH 2/3] Disable quoting paths sent to the debugger as args (#5936) * Disable quoting paths sent to the debugger as args * Remove unnecessary class * Fix typo * Fixes to tests --- news/2 Fixes/5861.md | 1 + src/client/api.ts | 4 +- .../DebugClients/launcherProvider.ts | 13 ++++-- .../launcherProvider.unit.test.ts | 42 +++++++++++++------ 4 files changed, 43 insertions(+), 17 deletions(-) create mode 100644 news/2 Fixes/5861.md diff --git a/news/2 Fixes/5861.md b/news/2 Fixes/5861.md new file mode 100644 index 000000000000..5bff0305615a --- /dev/null +++ b/news/2 Fixes/5861.md @@ -0,0 +1 @@ +Disable quoting of paths sent to the debugger as arguments. \ No newline at end of file diff --git a/src/client/api.ts b/src/client/api.ts index 71c857e6e903..177dc997397d 100644 --- a/src/client/api.ts +++ b/src/client/api.ts @@ -4,7 +4,7 @@ 'use strict'; import { traceError } from './common/logger'; -import { RemoteDebuggerLauncherScriptProvider } from './debugger/debugAdapter/DebugClients/launcherProvider'; +import { RemoteDebuggerExternalLauncherScriptProvider } from './debugger/debugAdapter/DebugClients/launcherProvider'; /* * Do not introduce any breaking changes to this API. @@ -42,7 +42,7 @@ export function buildApi(ready: Promise) { }), debug: { async getRemoteLauncherCommand(host: string, port: number, waitUntilDebuggerAttaches: boolean = true): Promise { - return new RemoteDebuggerLauncherScriptProvider().getLauncherArgs({ host, port, waitUntilDebuggerAttaches }); + return new RemoteDebuggerExternalLauncherScriptProvider().getLauncherArgs({ host, port, waitUntilDebuggerAttaches }); } } }; diff --git a/src/client/debugger/debugAdapter/DebugClients/launcherProvider.ts b/src/client/debugger/debugAdapter/DebugClients/launcherProvider.ts index 455db85cde63..466c1f1707fd 100644 --- a/src/client/debugger/debugAdapter/DebugClients/launcherProvider.ts +++ b/src/client/debugger/debugAdapter/DebugClients/launcherProvider.ts @@ -15,7 +15,7 @@ export class NoDebugLauncherScriptProvider implements IDebugLauncherScriptProvid constructor(@optional() private script: string = pathToScript) { } public getLauncherArgs(options: LocalDebugOptions): string[] { const customDebugger = options.customDebugger ? '--custom' : '--default'; - return [this.script.fileToCommandArgument(), customDebugger, '--nodebug', '--client', '--host', options.host, '--port', options.port.toString()]; + return [this.script, customDebugger, '--nodebug', '--client', '--host', options.host, '--port', options.port.toString()]; } } @@ -23,11 +23,18 @@ export class DebuggerLauncherScriptProvider implements IDebugLauncherScriptProvi constructor(@optional() private script: string = pathToScript) { } public getLauncherArgs(options: LocalDebugOptions): string[] { const customDebugger = options.customDebugger ? '--custom' : '--default'; - return [this.script.fileToCommandArgument(), customDebugger, '--client', '--host', options.host, '--port', options.port.toString()]; + return [this.script, customDebugger, '--client', '--host', options.host, '--port', options.port.toString()]; } } -export class RemoteDebuggerLauncherScriptProvider implements IRemoteDebugLauncherScriptProvider { +/** + * This class is used to provide the launch scripts so external code can launch the debugger. + * As we're passing command arguments, we need to ensure the file paths are quoted. + * @export + * @class RemoteDebuggerExternalLauncherScriptProvider + * @implements {IRemoteDebugLauncherScriptProvider} + */ +export class RemoteDebuggerExternalLauncherScriptProvider implements IRemoteDebugLauncherScriptProvider { constructor(@optional() private script: string = pathToScript) { } public getLauncherArgs(options: RemoteDebugOptions): string[] { const waitArgs = options.waitUntilDebuggerAttaches ? ['--wait'] : []; diff --git a/src/test/debugger/debugAdapter/debugClients/launcherProvider.unit.test.ts b/src/test/debugger/debugAdapter/debugClients/launcherProvider.unit.test.ts index a3f67e3c22dd..8aeeed217b0a 100644 --- a/src/test/debugger/debugAdapter/debugClients/launcherProvider.unit.test.ts +++ b/src/test/debugger/debugAdapter/debugClients/launcherProvider.unit.test.ts @@ -7,7 +7,7 @@ import { expect } from 'chai'; import * as fs from 'fs-extra'; import * as path from 'path'; import { EXTENSION_ROOT_DIR } from '../../../../client/common/constants'; -import { DebuggerLauncherScriptProvider, NoDebugLauncherScriptProvider, RemoteDebuggerLauncherScriptProvider } from '../../../../client/debugger/debugAdapter/DebugClients/launcherProvider'; +import { DebuggerLauncherScriptProvider, NoDebugLauncherScriptProvider, RemoteDebuggerExternalLauncherScriptProvider } from '../../../../client/debugger/debugAdapter/DebugClients/launcherProvider'; const expectedPath = path.join(EXTENSION_ROOT_DIR, 'pythonFiles', 'ptvsd_launcher.py'); @@ -21,12 +21,12 @@ suite('Debugger - Launcher Script Provider', () => { { testName: 'When path to ptvsd launcher does not contains spaces', path: path.join('path', 'to', 'ptvsd_launcher'), - expectedPath: 'path/to/ptvsd_launcher' + expectedPath: path.join('path', 'to', 'ptvsd_launcher') }, { testName: 'When path to ptvsd launcher contains spaces', path: path.join('path', 'to', 'ptvsd_launcher', 'with spaces'), - expectedPath: '"path/to/ptvsd_launcher/with spaces"' + expectedPath: path.join('path', 'to', 'ptvsd_launcher', 'with spaces') } ]; @@ -52,15 +52,33 @@ suite('Debugger - Launcher Script Provider', () => { const expectedArgs = [testParams.expectedPath, '--custom', '--nodebug', '--client', '--host', 'something', '--port', '1234']; expect(args).to.be.deep.equal(expectedArgs); }); - test('Test remote debug launcher args (and do not wait for debugger to attach)', async () => { - const args = new RemoteDebuggerLauncherScriptProvider(testParams.path).getLauncherArgs({ host: 'something', port: 1234, waitUntilDebuggerAttaches: false }); - const expectedArgs = [testParams.expectedPath, '--default', '--host', 'something', '--port', '1234']; - expect(args).to.be.deep.equal(expectedArgs); - }); - test('Test remote debug launcher args (and wait for debugger to attach)', async () => { - const args = new RemoteDebuggerLauncherScriptProvider(testParams.path).getLauncherArgs({ host: 'something', port: 1234, waitUntilDebuggerAttaches: true }); - const expectedArgs = [testParams.expectedPath, '--default', '--host', 'something', '--port', '1234', '--wait']; - expect(args).to.be.deep.equal(expectedArgs); + }); + }); + + suite('External Debug Launcher', () => { + [ + { + testName: 'When path to ptvsd launcher does not contains spaces', + path: path.join('path', 'to', 'ptvsd_launcher'), + expectedPath: 'path/to/ptvsd_launcher' + }, + { + testName: 'When path to ptvsd launcher contains spaces', + path: path.join('path', 'to', 'ptvsd_launcher', 'with spaces'), + expectedPath: '"path/to/ptvsd_launcher/with spaces"' + } + ].forEach(testParams => { + suite(testParams.testName, async () => { + test('Test remote debug launcher args (and do not wait for debugger to attach)', async () => { + const args = new RemoteDebuggerExternalLauncherScriptProvider(testParams.path).getLauncherArgs({ host: 'something', port: 1234, waitUntilDebuggerAttaches: false }); + const expectedArgs = [testParams.expectedPath, '--default', '--host', 'something', '--port', '1234']; + expect(args).to.be.deep.equal(expectedArgs); + }); + test('Test remote debug launcher args (and wait for debugger to attach)', async () => { + const args = new RemoteDebuggerExternalLauncherScriptProvider(testParams.path).getLauncherArgs({ host: 'something', port: 1234, waitUntilDebuggerAttaches: true }); + const expectedArgs = [testParams.expectedPath, '--default', '--host', 'something', '--port', '1234', '--wait']; + expect(args).to.be.deep.equal(expectedArgs); + }); }); }); }); From bc1666c1ab590600d72e3cceb478a73cd0927cc0 Mon Sep 17 00:00:00 2001 From: Don Jayamanne Date: Thu, 6 Jun 2019 14:18:32 -0700 Subject: [PATCH 3/3] Update version for new point release --- CHANGELOG.md | 11 ++++++++++- news/2 Fixes/5861.md | 1 - news/2 Fixes/5929.md | 1 - package-lock.json | 2 +- package.json | 2 +- 5 files changed, 12 insertions(+), 5 deletions(-) delete mode 100644 news/2 Fixes/5861.md delete mode 100644 news/2 Fixes/5929.md diff --git a/CHANGELOG.md b/CHANGELOG.md index eb66dd0b4fc5..59df2720e224 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,15 @@ # Changelog -## 2019.5.3 (5 June 2019) +## 2019.5.4 (6 June 2019) + +### Fixes + +1. Disable quoting of paths sent to the debugger as arguments. + ([#5861](https://github.com/microsoft/vscode-python/issues/5861)) +1. Fixes to activation of Conda environments. + ([#5929](https://github.com/microsoft/vscode-python/issues/5929)) + +## 2019.5.18678 (5 June 2019) ### Fixes diff --git a/news/2 Fixes/5861.md b/news/2 Fixes/5861.md deleted file mode 100644 index 5bff0305615a..000000000000 --- a/news/2 Fixes/5861.md +++ /dev/null @@ -1 +0,0 @@ -Disable quoting of paths sent to the debugger as arguments. \ No newline at end of file diff --git a/news/2 Fixes/5929.md b/news/2 Fixes/5929.md deleted file mode 100644 index 9b78f02d77af..000000000000 --- a/news/2 Fixes/5929.md +++ /dev/null @@ -1 +0,0 @@ -Fixes to activation of Conda environments diff --git a/package-lock.json b/package-lock.json index 6ad5859de0a8..3ddcc6d123b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "python", - "version": "2019.5.3", + "version": "2019.5.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index fc92de68b9f0..618859191d4b 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "python", "displayName": "Python", "description": "Linting, Debugging (multi-threaded, remote), Intellisense, code formatting, refactoring, unit tests, snippets, and more.", - "version": "2019.5.3", + "version": "2019.5.4", "languageServerVersion": "0.2.82", "publisher": "ms-python", "author": {