From 7b05194e777c65edf55bb5ea19b0a3296ba9cd70 Mon Sep 17 00:00:00 2001 From: Charles Gagnon Date: Wed, 5 Oct 2022 14:42:23 -0700 Subject: [PATCH] Add app quality to extension API (#20731) * Add app quality to extension API * Comment * Special case rc1 to stable --- extensions/mssql/src/utils.ts | 7 +------ .../query-history/src/queryHistoryProvider.ts | 5 ++++- src/sql/azdata.proposed.d.ts | 17 +++++++++++++++++ .../workbench/api/common/sqlExtHost.api.impl.ts | 12 +++++++++++- src/sql/workbench/api/common/sqlExtHostTypes.ts | 11 +++++++++++ src/vs/workbench/api/common/extHost.protocol.ts | 1 + .../browser/webWorkerExtensionHost.ts | 1 + .../extensions/common/remoteExtensionHost.ts | 1 + .../localProcessExtensionHost.ts | 1 + 9 files changed, 48 insertions(+), 8 deletions(-) diff --git a/extensions/mssql/src/utils.ts b/extensions/mssql/src/utils.ts index 2d09e4cbeb..f4f5b5dcbe 100644 --- a/extensions/mssql/src/utils.ts +++ b/extensions/mssql/src/utils.ts @@ -128,11 +128,10 @@ export async function getParallelMessageProcessingConfig(): Promise { if (!config) { return false; } - const quality = await getProductQuality(); const setting = config.inspect(parallelMessageProcessingConfig); // For dev environment, we want to enable the feature by default unless it is set explicitely. // Note: the quality property is not set for dev environment, we can use this to determine whether it is dev environment. - return (quality === undefined && setting.globalValue === undefined && setting.workspaceValue === undefined) ? true : config[parallelMessageProcessingConfig]; + return (azdata.env.quality === azdata.env.AppQuality.dev && setting.globalValue === undefined && setting.workspaceValue === undefined) ? true : config[parallelMessageProcessingConfig]; } export function getLogFileName(prefix: string, pid: number): string { @@ -396,7 +395,3 @@ export async function getOrDownloadServer(config: IConfig, handleServerEvent?: ( return serverdownloader.getOrDownloadServer(); } -async function getProductQuality(): Promise { - const content = await fs.readFile(path.join(vscode.env.appRoot, 'product.json')); - return JSON.parse(content?.toString())?.quality; -} diff --git a/extensions/query-history/src/queryHistoryProvider.ts b/extensions/query-history/src/queryHistoryProvider.ts index 210d5af2a3..0670242646 100644 --- a/extensions/query-history/src/queryHistoryProvider.ts +++ b/extensions/query-history/src/queryHistoryProvider.ts @@ -16,7 +16,10 @@ import { sendSettingChangedEvent, TelemetryActions, TelemetryReporter, Telemetry const STORAGE_IV_KEY = 'queryHistory.storage-iv'; const STORAGE_KEY_KEY = 'queryHistory.storage-key'; -const HISTORY_STORAGE_FILE_NAME = 'queryHistory.bin'; +// We use a different file for every flavor of ADS because the secret storage is unique per-flavor and so we will have +// a different key/IV pair for each flavor with no easy way to transfer/read them. This means that each flavor of ADS +// will have its own unique history - even if they're all stored in the same location. +const HISTORY_STORAGE_FILE_NAME = azdata.env.quality === azdata.env.AppQuality.stable ? 'queryHistory.bin' : `queryHistory.${azdata.env.quality}.bin`; const STORAGE_ENCRYPTION_ALGORITHM = 'aes-256-ctr'; const HISTORY_DEBOUNCE_MS = 10000; const DEFAULT_CAPTURE_ENABLED = true; diff --git a/src/sql/azdata.proposed.d.ts b/src/sql/azdata.proposed.d.ts index 97f7308cb2..7c3f4da427 100644 --- a/src/sql/azdata.proposed.d.ts +++ b/src/sql/azdata.proposed.d.ts @@ -8,6 +8,23 @@ import * as vscode from 'vscode'; declare module 'azdata' { + + export namespace env { + /** + * Well-known app quality values + */ + export enum AppQuality { + stable = 'stable', + insider = 'insider', + dev = 'dev' + } + + /** + * The version of Azure Data Studio this is currently running as - such as `stable`, or `insider` + */ + export const quality: AppQuality | string | undefined; + } + export namespace nb { export interface NotebookDocument { /** diff --git a/src/sql/workbench/api/common/sqlExtHost.api.impl.ts b/src/sql/workbench/api/common/sqlExtHost.api.impl.ts index 9ab606f436..74f74acf3d 100644 --- a/src/sql/workbench/api/common/sqlExtHost.api.impl.ts +++ b/src/sql/workbench/api/common/sqlExtHost.api.impl.ts @@ -606,6 +606,15 @@ export function createAdsApiFactory(accessor: ServicesAccessor): IAdsExtensionAp ExecutionPlanGraphElementPropertyBetterValue: sqlExtHostTypes.executionPlan.ExecutionPlanGraphElementPropertyBetterValue }; + // Dev/OSS builds don't have a quality set - give it a value here so it's more clear + let quality = initData.quality || 'dev'; + // Special case rc1 quality, that should be treated as stable by extensions + quality = quality === 'rc1' ? 'stable' : quality; + const env: typeof azdata.env = { + AppQuality: sqlExtHostTypes.env.AppQuality, + quality + }; + return { version: initData.version, accounts, @@ -658,7 +667,8 @@ export function createAdsApiFactory(accessor: ServicesAccessor): IAdsExtensionAp sqlAssessment, TextType: sqlExtHostTypes.TextType, designers: designers, - executionPlan: executionPlan + executionPlan: executionPlan, + env }; }, extHostNotebook: extHostNotebook, diff --git a/src/sql/workbench/api/common/sqlExtHostTypes.ts b/src/sql/workbench/api/common/sqlExtHostTypes.ts index fa8e84a650..e76ae20309 100644 --- a/src/sql/workbench/api/common/sqlExtHostTypes.ts +++ b/src/sql/workbench/api/common/sqlExtHostTypes.ts @@ -1058,3 +1058,14 @@ export namespace executionPlan { None = 4 } } + +export namespace env { + /** + * Well-known app quality values + */ + export enum AppQuality { + stable = 'stable', + insider = 'insider', + dev = 'dev' + } +} diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 5d23558768..45fac3185f 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -102,6 +102,7 @@ export interface IWorkspaceData extends IStaticWorkspaceData { export interface IInitData { version: string; vscodeVersion: string; // {{SQL CARBON EDIT}} add vscodeVersion + quality?: string; // {{SQL CARBON EDIT}} add quality commit?: string; parentPid: number; environment: IEnvironment; diff --git a/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts b/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts index aad85cfb47..8163c69e28 100644 --- a/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts +++ b/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts @@ -384,6 +384,7 @@ export class WebWorkerExtensionHost extends Disposable implements IExtensionHost commit: this._productService.commit, version: this._productService.version, vscodeVersion: this._productService.vscodeVersion, // {{SQL CARBON EDIT}} add vscode version + quality: this._productService.quality, // {{SQL CARBON EDIT}} Add quality parentPid: -1, environment: { isExtensionDevelopmentDebug: this._environmentService.debugRenderer, diff --git a/src/vs/workbench/services/extensions/common/remoteExtensionHost.ts b/src/vs/workbench/services/extensions/common/remoteExtensionHost.ts index 4b461e92db..5bf619e818 100644 --- a/src/vs/workbench/services/extensions/common/remoteExtensionHost.ts +++ b/src/vs/workbench/services/extensions/common/remoteExtensionHost.ts @@ -227,6 +227,7 @@ export class RemoteExtensionHost extends Disposable implements IExtensionHost { commit: this._productService.commit, version: this._productService.version, vscodeVersion: this._productService.vscodeVersion, // {{SQL CARBON EDIT}} add vscode version + quality: this._productService.quality, // {{SQL CARBON EDIT}} Add quality parentPid: remoteInitData.pid, environment: { isExtensionDevelopmentDebug, diff --git a/src/vs/workbench/services/extensions/electron-browser/localProcessExtensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/localProcessExtensionHost.ts index dd1b7ce107..fa743295ee 100644 --- a/src/vs/workbench/services/extensions/electron-browser/localProcessExtensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/localProcessExtensionHost.ts @@ -550,6 +550,7 @@ export class LocalProcessExtensionHost implements IExtensionHost { commit: this._productService.commit, version: this._productService.version, vscodeVersion: this._productService.vscodeVersion, // {{SQL CARBON EDIT}} add vscode version + quality: this._productService.quality, // {{SQL CARBON EDIT}} Add quality parentPid: process.pid, environment: { isExtensionDevelopmentDebug: this._isExtensionDevDebug,