Directly install missing provider extensions (#20771)

* Directly install missing provider extensions

* Update interface
This commit is contained in:
Charles Gagnon
2022-10-10 13:04:07 -07:00
committed by GitHub
parent 5d63f0d229
commit 93008b51c4
3 changed files with 19 additions and 6 deletions

View File

@@ -23,6 +23,8 @@ export const clientCapabilities = {
/**
* The map containing the connection provider names and the owning extensions.
* This is to workaround the issue that we don't have the ability to store and query the information from extension gallery.
* IMPORTANT : Every extension in this list is assumed to be directly installable (not 3rd party). If that changes then
* handleUnsupportedProvider needs to be updated to handle those cases.
*/
export const ConnectionProviderAndExtensionMap = new Map<string, string>([
['PGSQL', 'microsoft.azuredatastudio-postgresql'],

View File

@@ -324,10 +324,10 @@ export interface IConnectionManagementService {
/**
* Handle the unsupported provider scenario.
* @param providerName The provider name.
* @param providerId The provider ID
* @returns Promise with a boolean value indicating whether the user has accepted the suggestion.
*/
handleUnsupportedProvider(providerName: string): Promise<boolean>;
handleUnsupportedProvider(providerId: string): Promise<boolean>;
}
export enum RunQueryOnConnectionMode {

View File

@@ -1658,17 +1658,28 @@ export class ConnectionManagementService extends Disposable implements IConnecti
return connections;
}
async handleUnsupportedProvider(providerName: string): Promise<boolean> {
const extensionId = ConnectionProviderAndExtensionMap.get(providerName);
public async handleUnsupportedProvider(providerId: string): Promise<boolean> {
const extensionId = ConnectionProviderAndExtensionMap.get(providerId);
const message = extensionId ? nls.localize('connection.extensionNotInstalled', "The extension '{0}' is required in order to connect to this resource. Do you want to install it?", extensionId) :
nls.localize('connectionDialog.connectionProviderNotSupported', "The extension that supports provider type '{0}' is not currently installed. Do you want to view the extensions?", providerName);
nls.localize('connectionDialog.connectionProviderNotSupported', "The extension that supports provider type '{0}' is not currently installed. Do you want to view the extensions?", providerId);
const result = await this._dialogService.confirm({
message: message,
type: 'question'
});
if (result.confirmed) {
if (extensionId) {
await this._commandService.executeCommand('extension.open', extensionId);
const providerRegistered = new Promise<void>(resolve => {
const eventHandler = this._capabilitiesService.onCapabilitiesRegistered(e => {
if (e.id === providerId) {
resolve();
eventHandler.dispose();
}
});
});
// Install the extension and then wait for the provider to be registered to ensure that everything is ready for the caller to use
await this._commandService.executeCommand('workbench.extensions.installExtension', extensionId);
await providerRegistered;
} else {
await this._paneCompositePartService.openPaneComposite(ExtensionsViewletID, ViewContainerLocation.Sidebar);
}