Skip to content

Commit f10898d

Browse files
authored
1 parent 6e37770 commit f10898d

File tree

5 files changed

+37
-11
lines changed

5 files changed

+37
-11
lines changed

src/vs/server/node/remoteExtensionsScanner.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ export class RemoteExtensionsScannerService implements IRemoteExtensionsScannerS
133133
this._scanDevelopedExtensions(language, extensionDevelopmentPath)
134134
]);
135135

136-
return dedupExtensions(builtinExtensions, [...installedExtensions, ...workspaceInstalledExtensions], developedExtensions, this._logService);
136+
return dedupExtensions(builtinExtensions, installedExtensions, workspaceInstalledExtensions, developedExtensions, this._logService);
137137
}
138138

139139
private async _scanDevelopedExtensions(language: string, extensionDevelopmentPaths?: string[]): Promise<IExtensionDescription[]> {

src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -690,11 +690,28 @@ class Extensions extends Disposable {
690690
all.push(...await this.workbenchExtensionManagementService.getInstalledWorkspaceExtensions(true));
691691
}
692692

693-
// dedup user and system extensions by giving priority to user extensions.
693+
// dedup workspace, user and system extensions by giving priority to workspace first and then to user extension.
694694
const installed = groupByExtension(all, r => r.identifier).reduce((result, extensions) => {
695-
const extension = extensions.length === 1 ? extensions[0]
696-
: extensions.find(e => e.type === ExtensionType.User) || extensions.find(e => e.type === ExtensionType.System);
697-
result.push(extension!);
695+
if (extensions.length === 1) {
696+
result.push(extensions[0]);
697+
} else {
698+
let workspaceExtension: ILocalExtension | undefined,
699+
userExtension: ILocalExtension | undefined,
700+
systemExtension: ILocalExtension | undefined;
701+
for (const extension of extensions) {
702+
if (extension.isWorkspaceScoped) {
703+
workspaceExtension = extension;
704+
} else if (extension.type === ExtensionType.User) {
705+
userExtension = extension;
706+
} else {
707+
systemExtension = extension;
708+
}
709+
}
710+
const extension = workspaceExtension ?? userExtension ?? systemExtension;
711+
if (extension) {
712+
result.push(extension);
713+
}
714+
}
698715
return result;
699716
}, []);
700717

@@ -1300,7 +1317,9 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension
13001317

13011318
if (isUninstalled) {
13021319
const canRemoveRunningExtension = runningExtension && this.extensionService.canRemoveExtension(runningExtension);
1303-
const isSameExtensionRunning = runningExtension && (!extension.server || extension.server === this.extensionManagementServerService.getExtensionManagementServer(toExtension(runningExtension)));
1320+
const isSameExtensionRunning = runningExtension
1321+
&& (!extension.server || extension.server === this.extensionManagementServerService.getExtensionManagementServer(toExtension(runningExtension)))
1322+
&& (!extension.resourceExtension || this.uriIdentityService.extUri.isEqual(extension.resourceExtension.location, runningExtension.extensionLocation));
13041323
if (!canRemoveRunningExtension && isSameExtensionRunning && !runningExtension.isUnderDevelopment) {
13051324
return { action: reloadAction, reason: nls.localize('postUninstallTooltip', "Please {0} to complete the uninstallation of this extension.", reloadActionLabel) };
13061325
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ export class ExtensionService extends AbstractExtensionService implements IExten
141141
} catch (error) {
142142
this._logService.error(error);
143143
}
144-
return dedupExtensions(system, user, development, this._logService);
144+
return dedupExtensions(system, user, [], development, this._logService);
145145
}
146146

147147
protected async _resolveExtensionsDefault() {

src/vs/workbench/services/extensions/common/extensionsUtil.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { ILogService } from 'vs/platform/log/common/log';
99
import * as semver from 'vs/base/common/semver/semver';
1010

1111
// TODO: @sandy081 merge this with deduping in extensionsScannerService.ts
12-
export function dedupExtensions(system: IExtensionDescription[], user: IExtensionDescription[], development: IExtensionDescription[], logService: ILogService): IExtensionDescription[] {
12+
export function dedupExtensions(system: IExtensionDescription[], user: IExtensionDescription[], workspace: IExtensionDescription[], development: IExtensionDescription[], logService: ILogService): IExtensionDescription[] {
1313
const result = new ExtensionIdentifierMap<IExtensionDescription>();
1414
system.forEach((systemExtension) => {
1515
const extension = result.get(systemExtension.identifier);
@@ -37,6 +37,13 @@ export function dedupExtensions(system: IExtensionDescription[], user: IExtensio
3737
}
3838
result.set(userExtension.identifier, userExtension);
3939
});
40+
workspace.forEach(workspaceExtension => {
41+
const extension = result.get(workspaceExtension.identifier);
42+
if (extension) {
43+
logService.warn(localize('overwritingWithWorkspaceExtension', "Overwriting {0} with Workspace Extension {1}.", extension.extensionLocation.fsPath, workspaceExtension.extensionLocation.fsPath));
44+
}
45+
result.set(workspaceExtension.identifier, workspaceExtension);
46+
});
4047
development.forEach(developedExtension => {
4148
logService.info(localize('extensionUnderDevelopment', "Loading development extension at {0}", developedExtension.extensionLocation.fsPath));
4249
const extension = result.get(developedExtension.identifier);

src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,10 @@ export class CachedExtensionScanner {
9999
}
100100

101101
const system = scannedSystemExtensions.map(e => toExtensionDescriptionFromScannedExtension(e, false));
102-
const userGlobal = scannedUserExtensions.map(e => toExtensionDescriptionFromScannedExtension(e, false));
103-
const userWorkspace = workspaceExtensions.map(e => toExtensionDescription(e, false));
102+
const user = scannedUserExtensions.map(e => toExtensionDescriptionFromScannedExtension(e, false));
103+
const workspace = workspaceExtensions.map(e => toExtensionDescription(e, false));
104104
const development = scannedDevelopedExtensions.map(e => toExtensionDescriptionFromScannedExtension(e, true));
105-
const r = dedupExtensions(system, [...userGlobal, ...userWorkspace], development, this._logService);
105+
const r = dedupExtensions(system, user, workspace, development, this._logService);
106106

107107
if (!hasErrors) {
108108
const disposable = this._extensionsScannerService.onDidChangeCache(() => {

0 commit comments

Comments
 (0)