Skip to content

Commit 3c77120

Browse files
committed
Fixes microsoft#75284: Run a real search when enabling/installing an extension with workspaceContains
1 parent d432126 commit 3c77120

3 files changed

Lines changed: 59 additions & 23 deletions

File tree

src/vs/workbench/api/browser/mainThreadWorkspace.ts

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { INotificationService } from 'vs/platform/notification/common/notificati
2424
import { withNullAsUndefined } from 'vs/base/common/types';
2525
import { IFileService } from 'vs/platform/files/common/files';
2626
import { IRequestService } from 'vs/platform/request/common/request';
27+
import { checkGlobFileExists } from 'vs/workbench/api/common/shared/workspaceContains';
2728

2829
@extHostNamedCustomer(MainContext.MainThreadWorkspace)
2930
export class MainThreadWorkspace implements MainThreadWorkspaceShape {
@@ -189,25 +190,7 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape {
189190
}
190191

191192
$checkExists(folders: readonly UriComponents[], includes: string[], token: CancellationToken): Promise<boolean> {
192-
const queryBuilder = this._instantiationService.createInstance(QueryBuilder);
193-
const query = queryBuilder.file(folders.map(folder => toWorkspaceFolder(URI.revive(folder))), {
194-
_reason: 'checkExists',
195-
includePattern: includes.join(', '),
196-
expandPatterns: true,
197-
exists: true
198-
});
199-
200-
return this._searchService.fileSearch(query, token).then(
201-
result => {
202-
return !!result.limitHit;
203-
},
204-
err => {
205-
if (!isPromiseCanceledError(err)) {
206-
return Promise.reject(err);
207-
}
208-
209-
return false;
210-
});
193+
return this._instantiationService.invokeFunction((accessor) => checkGlobFileExists(accessor, folders, includes, token));
211194
}
212195

213196
// --- save & edit resources ---

src/vs/workbench/api/common/shared/workspaceContains.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ import { URI, UriComponents } from 'vs/base/common/uri';
88
import { CancellationTokenSource, CancellationToken } from 'vs/base/common/cancellation';
99
import * as errors from 'vs/base/common/errors';
1010
import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions';
11+
import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
12+
import { QueryBuilder } from 'vs/workbench/contrib/search/common/queryBuilder';
13+
import { ISearchService } from 'vs/workbench/services/search/common/search';
14+
import { toWorkspaceFolder } from 'vs/platform/workspace/common/workspace';
1115

1216
const WORKSPACE_CONTAINS_TIMEOUT = 7000;
1317

@@ -103,3 +107,32 @@ async function _activateIfGlobPatterns(host: IExtensionActivationHost, extension
103107
activate(`workspaceContains:${globPatterns.join(',')}`);
104108
}
105109
}
110+
111+
export function checkGlobFileExists(
112+
accessor: ServicesAccessor,
113+
folders: readonly UriComponents[],
114+
includes: string[],
115+
token: CancellationToken,
116+
): Promise<boolean> {
117+
const instantiationService = accessor.get(IInstantiationService);
118+
const searchService = accessor.get(ISearchService);
119+
const queryBuilder = instantiationService.createInstance(QueryBuilder);
120+
const query = queryBuilder.file(folders.map(folder => toWorkspaceFolder(URI.revive(folder))), {
121+
_reason: 'checkExists',
122+
includePattern: includes.join(', '),
123+
expandPatterns: true,
124+
exists: true
125+
});
126+
127+
return searchService.fileSearch(query, token).then(
128+
result => {
129+
return !!result.limitHit;
130+
},
131+
err => {
132+
if (!errors.isPromiseCanceledError(err)) {
133+
return Promise.reject(err);
134+
}
135+
136+
return false;
137+
});
138+
}

src/vs/workbench/services/extensions/electron-browser/extensionService.ts

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/wor
4141
import { getRemoteName } from 'vs/platform/remote/common/remoteHosts';
4242
import { IRemoteAgentEnvironment } from 'vs/platform/remote/common/remoteAgentEnvironment';
4343
import { WebWorkerExtensionHost } from 'vs/workbench/services/extensions/browser/webWorkerExtensionHost';
44+
import { IExtensionActivationHost as IWorkspaceContainsActivationHost, checkGlobFileExists, checkActivateWorkspaceContainsExtension } from 'vs/workbench/api/common/shared/workspaceContains';
45+
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
46+
import { exists } from 'vs/base/node/pfs';
4447

4548
class DeltaExtensionsQueueItem {
4649
constructor(
@@ -75,6 +78,7 @@ export class ExtensionService extends AbstractExtensionService implements IExten
7578
@IHostService private readonly _hostService: IHostService,
7679
@IRemoteExplorerService private readonly _remoteExplorerService: IRemoteExplorerService,
7780
@IExtensionGalleryService private readonly _extensionGalleryService: IExtensionGalleryService,
81+
@IWorkspaceContextService private readonly _contextService: IWorkspaceContextService,
7882
) {
7983
super(
8084
instantiationService,
@@ -308,6 +312,7 @@ export class ExtensionService extends AbstractExtensionService implements IExten
308312

309313
let shouldActivate = false;
310314
let shouldActivateReason: string | null = null;
315+
let hasWorkspaceContains = false;
311316
if (Array.isArray(extensionDescription.activationEvents)) {
312317
for (let activationEvent of extensionDescription.activationEvents) {
313318
// TODO@joao: there's no easy way to contribute this
@@ -329,10 +334,7 @@ export class ExtensionService extends AbstractExtensionService implements IExten
329334
}
330335

331336
if (/^workspaceContains/.test(activationEvent)) {
332-
// do not trigger a search, just activate in this case...
333-
shouldActivate = true;
334-
shouldActivateReason = activationEvent;
335-
break;
337+
hasWorkspaceContains = true;
336338
}
337339

338340
if (activationEvent === 'onStartupFinished') {
@@ -347,6 +349,24 @@ export class ExtensionService extends AbstractExtensionService implements IExten
347349
await Promise.all(
348350
this._extensionHostManagers.map(extHostManager => extHostManager.activate(extensionDescription.identifier, { startup: false, extensionId: extensionDescription.identifier, activationEvent: shouldActivateReason! }))
349351
).then(() => { });
352+
} else if (hasWorkspaceContains) {
353+
const workspace = await this._contextService.getCompleteWorkspace();
354+
const forceUsingSearch = !!this._environmentService.configuration.remoteAuthority;
355+
const host: IWorkspaceContainsActivationHost = {
356+
folders: workspace.folders.map(folder => folder.uri),
357+
forceUsingSearch: forceUsingSearch,
358+
exists: (path) => exists(path),
359+
checkExists: (folders, includes, token) => this._instantiationService.invokeFunction((accessor) => checkGlobFileExists(accessor, folders, includes, token))
360+
};
361+
362+
const result = await checkActivateWorkspaceContainsExtension(host, extensionDescription);
363+
if (!result) {
364+
return;
365+
}
366+
367+
await Promise.all(
368+
this._extensionHostManagers.map(extHostManager => extHostManager.activate(extensionDescription.identifier, { startup: false, extensionId: extensionDescription.identifier, activationEvent: result.activationEvent }))
369+
).then(() => { });
350370
}
351371
}
352372

0 commit comments

Comments
 (0)