Skip to content

Commit cbb76d1

Browse files
authored
Make sure to check for 'files' when creating file watchers (#20006)
Fixes #20005 Root cause is roots coming from liveshare. Liveshare gives a workspaceFolder of `vsls:/`.
1 parent 643dced commit cbb76d1

File tree

3 files changed

+23
-7
lines changed

3 files changed

+23
-7
lines changed

src/client/pythonEnvironments/base/locators/common/resourceBasedLocator.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { IDisposable } from '../../../../common/types';
55
import { createDeferred, Deferred } from '../../../../common/utils/async';
66
import { Disposables } from '../../../../common/utils/resourceLifecycle';
77
import { traceError } from '../../../../logging';
8-
import { arePathsSame } from '../../../common/externalDependencies';
8+
import { arePathsSame, isVirtualWorkspace } from '../../../common/externalDependencies';
99
import { getEnvPath } from '../../info/env';
1010
import { BasicEnvInfo, IPythonEnvsIterator, Locator, PythonLocatorQuery } from '../../locator';
1111

@@ -123,10 +123,14 @@ export abstract class LazyResourceBasedLocator extends Locator<BasicEnvInfo> imp
123123
return;
124124
}
125125
this.watchersReady = createDeferred<void>();
126-
await this.initWatchers().catch((ex) => {
127-
traceError(ex);
128-
this.watchersReady?.reject(ex);
129-
});
126+
127+
// Don't create any file watchers in a virtual workspace.
128+
if (!(await isVirtualWorkspace())) {
129+
await this.initWatchers().catch((ex) => {
130+
traceError(ex);
131+
this.watchersReady?.reject(ex);
132+
});
133+
}
130134
this.watchersReady.resolve();
131135
}
132136
}

src/client/pythonEnvironments/common/externalDependencies.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import * as fsapi from 'fs-extra';
55
import * as path from 'path';
66
import * as vscode from 'vscode';
7+
import { IWorkspaceService } from '../../common/application/types';
78
import { ExecutionResult, IProcessServiceFactory, ShellOptions, SpawnOptions } from '../../common/process/types';
89
import { IDisposable, IConfigurationService } from '../../common/types';
910
import { chain, iterable } from '../../common/utils/async';
@@ -27,6 +28,13 @@ export async function exec(file: string, args: string[], options: SpawnOptions =
2728
return service.exec(file, args, options);
2829
}
2930

31+
// Workspace
32+
33+
export async function isVirtualWorkspace(): Promise<boolean> {
34+
const service = internalServiceContainer.get<IWorkspaceService>(IWorkspaceService);
35+
return service.isVirtualWorkspace;
36+
}
37+
3038
// filesystem
3139

3240
export function pathExists(absPath: string): Promise<boolean> {

src/test/pythonEnvironments/base/locators/envTestUtils.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,12 @@ export function assertEnvsEqual(
7878
}
7979

8080
export function assertBasicEnvsEqual(actualEnvs: BasicEnvInfo[], expectedEnvs: BasicEnvInfo[]): void {
81-
actualEnvs = actualEnvs.sort((a, b) => a.executablePath.localeCompare(b.executablePath));
82-
expectedEnvs = expectedEnvs.sort((a, b) => a.executablePath.localeCompare(b.executablePath));
81+
actualEnvs = actualEnvs
82+
.sort((a, b) => a.executablePath.localeCompare(b.executablePath))
83+
.map((c) => ({ ...c, executablePath: c.executablePath.toLowerCase() }));
84+
expectedEnvs = expectedEnvs
85+
.sort((a, b) => a.executablePath.localeCompare(b.executablePath))
86+
.map((c) => ({ ...c, executablePath: c.executablePath.toLowerCase() }));
8387
assert.deepStrictEqual(actualEnvs.length, expectedEnvs.length, 'Number of envs');
8488
zip(actualEnvs, expectedEnvs).forEach((value) => {
8589
const [actual, expected] = value;

0 commit comments

Comments
 (0)