提交 ef210f22 编写于 作者: S Sandeep Somavarapu

get store details from settings

上级 afb02170
...@@ -102,12 +102,6 @@ export interface IProductConfiguration { ...@@ -102,12 +102,6 @@ export interface IProductConfiguration {
readonly msftInternalDomains?: string[]; readonly msftInternalDomains?: string[];
readonly linkProtectionTrustedDomains?: readonly string[]; readonly linkProtectionTrustedDomains?: readonly string[];
readonly settingsSyncStore?: {
url: string;
name: string;
account: string;
};
} }
export interface IExeBasedExtensionTip { export interface IExeBasedExtensionTip {
......
...@@ -14,8 +14,12 @@ import { IDisposable } from 'vs/base/common/lifecycle'; ...@@ -14,8 +14,12 @@ import { IDisposable } from 'vs/base/common/lifecycle';
import { IJSONContributionRegistry, Extensions as JSONExtensions } from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import { IJSONContributionRegistry, Extensions as JSONExtensions } from 'vs/platform/jsonschemas/common/jsonContributionRegistry';
import { IJSONSchema } from 'vs/base/common/jsonSchema'; import { IJSONSchema } from 'vs/base/common/jsonSchema';
import { ILogService } from 'vs/platform/log/common/log'; import { ILogService } from 'vs/platform/log/common/log';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
const CONFIGURATION_SYNC_STORE_KEY = 'configurationSync.store';
export const DEFAULT_IGNORED_SETTINGS = [ export const DEFAULT_IGNORED_SETTINGS = [
CONFIGURATION_SYNC_STORE_KEY,
'configurationSync.enable', 'configurationSync.enable',
'configurationSync.enableSettings', 'configurationSync.enableSettings',
'configurationSync.enableExtensions', 'configurationSync.enableExtensions',
...@@ -98,12 +102,23 @@ export class UserDataSyncStoreError extends Error { ...@@ -98,12 +102,23 @@ export class UserDataSyncStoreError extends Error {
} }
export interface IUserDataSyncStore {
url: string;
name: string;
account: string;
}
export function getUserDataSyncStore(configurationService: IConfigurationService): IUserDataSyncStore | undefined {
const value = configurationService.getValue<IUserDataSyncStore>(CONFIGURATION_SYNC_STORE_KEY);
return value && value.url && value.name && value.account ? value : undefined;
}
export const IUserDataSyncStoreService = createDecorator<IUserDataSyncStoreService>('IUserDataSyncStoreService'); export const IUserDataSyncStoreService = createDecorator<IUserDataSyncStoreService>('IUserDataSyncStoreService');
export interface IUserDataSyncStoreService { export interface IUserDataSyncStoreService {
_serviceBrand: undefined; _serviceBrand: undefined;
readonly enabled: boolean; readonly userDataSyncStore: IUserDataSyncStore | undefined;
read(key: string, oldValue: IUserData | null): Promise<IUserData>; read(key: string, oldValue: IUserData | null): Promise<IUserData>;
write(key: string, content: string, ref: string | null): Promise<string>; write(key: string, content: string, ref: string | null): Promise<string>;
......
...@@ -44,7 +44,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ ...@@ -44,7 +44,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ
this.synchronisers = [this.settingsSynchroniser, this.extensionsSynchroniser]; this.synchronisers = [this.settingsSynchroniser, this.extensionsSynchroniser];
this.updateStatus(); this.updateStatus();
if (this.userDataSyncStoreService.enabled) { if (this.userDataSyncStoreService.userDataSyncStore) {
this._register(Event.any(...this.synchronisers.map(s => Event.map(s.onDidChangeStatus, () => undefined)))(() => this.updateStatus())); this._register(Event.any(...this.synchronisers.map(s => Event.map(s.onDidChangeStatus, () => undefined)))(() => this.updateStatus()));
this._register(authTokenService.onDidChangeStatus(() => this.onDidChangeAuthTokenStatus())); this._register(authTokenService.onDidChangeStatus(() => this.onDidChangeAuthTokenStatus()));
} }
...@@ -53,7 +53,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ ...@@ -53,7 +53,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ
} }
async sync(_continue?: boolean): Promise<boolean> { async sync(_continue?: boolean): Promise<boolean> {
if (!this.userDataSyncStoreService.enabled) { if (!this.userDataSyncStoreService.userDataSyncStore) {
throw new Error('Not enabled'); throw new Error('Not enabled');
} }
if (this.authTokenService.status === AuthTokenStatus.SignedOut) { if (this.authTokenService.status === AuthTokenStatus.SignedOut) {
...@@ -68,7 +68,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ ...@@ -68,7 +68,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ
} }
stop(): void { stop(): void {
if (!this.userDataSyncStoreService.enabled) { if (!this.userDataSyncStoreService.userDataSyncStore) {
throw new Error('Not enabled'); throw new Error('Not enabled');
} }
for (const synchroniser of this.synchronisers) { for (const synchroniser of this.synchronisers) {
...@@ -93,7 +93,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ ...@@ -93,7 +93,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ
} }
private computeStatus(): SyncStatus { private computeStatus(): SyncStatus {
if (!this.userDataSyncStoreService.enabled) { if (!this.userDataSyncStoreService.userDataSyncStore) {
return SyncStatus.Uninitialized; return SyncStatus.Uninitialized;
} }
if (this.synchronisers.some(s => s.status === SyncStatus.HasConflicts)) { if (this.synchronisers.some(s => s.status === SyncStatus.HasConflicts)) {
......
...@@ -4,35 +4,36 @@ ...@@ -4,35 +4,36 @@
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import { Disposable, } from 'vs/base/common/lifecycle'; import { Disposable, } from 'vs/base/common/lifecycle';
import { IUserData, IUserDataSyncStoreService, UserDataSyncStoreErrorCode, UserDataSyncStoreError } from 'vs/platform/userDataSync/common/userDataSync'; import { IUserData, IUserDataSyncStoreService, UserDataSyncStoreErrorCode, UserDataSyncStoreError, IUserDataSyncStore, getUserDataSyncStore } from 'vs/platform/userDataSync/common/userDataSync';
import { IProductService } from 'vs/platform/product/common/productService';
import { IRequestService, asText, isSuccess } from 'vs/platform/request/common/request'; import { IRequestService, asText, isSuccess } from 'vs/platform/request/common/request';
import { URI } from 'vs/base/common/uri'; import { URI } from 'vs/base/common/uri';
import { joinPath } from 'vs/base/common/resources'; import { joinPath } from 'vs/base/common/resources';
import { CancellationToken } from 'vs/base/common/cancellation'; import { CancellationToken } from 'vs/base/common/cancellation';
import { IHeaders, IRequestOptions, IRequestContext } from 'vs/base/parts/request/common/request'; import { IHeaders, IRequestOptions, IRequestContext } from 'vs/base/parts/request/common/request';
import { IAuthTokenService } from 'vs/platform/auth/common/auth'; import { IAuthTokenService } from 'vs/platform/auth/common/auth';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
export class UserDataSyncStoreService extends Disposable implements IUserDataSyncStoreService { export class UserDataSyncStoreService extends Disposable implements IUserDataSyncStoreService {
_serviceBrand: any; _serviceBrand: any;
get enabled(): boolean { return !!this.productService.settingsSyncStore; } readonly userDataSyncStore: IUserDataSyncStore | undefined;
constructor( constructor(
@IProductService private readonly productService: IProductService, @IConfigurationService configurationService: IConfigurationService,
@IRequestService private readonly requestService: IRequestService, @IRequestService private readonly requestService: IRequestService,
@IAuthTokenService private readonly authTokenService: IAuthTokenService, @IAuthTokenService private readonly authTokenService: IAuthTokenService,
) { ) {
super(); super();
this.userDataSyncStore = getUserDataSyncStore(configurationService);
} }
async read(key: string, oldValue: IUserData | null): Promise<IUserData> { async read(key: string, oldValue: IUserData | null): Promise<IUserData> {
if (!this.enabled) { if (!this.userDataSyncStore) {
throw new Error('No settings sync store url configured.'); throw new Error('No settings sync store url configured.');
} }
const url = joinPath(URI.parse(this.productService.settingsSyncStore!.url), 'resource', key, 'latest').toString(); const url = joinPath(URI.parse(this.userDataSyncStore.url), 'resource', key, 'latest').toString();
const headers: IHeaders = {}; const headers: IHeaders = {};
if (oldValue) { if (oldValue) {
headers['If-None-Match'] = oldValue.ref; headers['If-None-Match'] = oldValue.ref;
...@@ -58,11 +59,11 @@ export class UserDataSyncStoreService extends Disposable implements IUserDataSyn ...@@ -58,11 +59,11 @@ export class UserDataSyncStoreService extends Disposable implements IUserDataSyn
} }
async write(key: string, data: string, ref: string | null): Promise<string> { async write(key: string, data: string, ref: string | null): Promise<string> {
if (!this.enabled) { if (!this.userDataSyncStore) {
throw new Error('No settings sync store url configured.'); throw new Error('No settings sync store url configured.');
} }
const url = joinPath(URI.parse(this.productService.settingsSyncStore!.url), 'resource', key).toString(); const url = joinPath(URI.parse(this.userDataSyncStore.url), 'resource', key).toString();
const headers: IHeaders = { 'Content-Type': 'text/plain' }; const headers: IHeaders = { 'Content-Type': 'text/plain' };
if (ref) { if (ref) {
headers['If-Match'] = ref; headers['If-Match'] = ref;
......
...@@ -22,7 +22,6 @@ import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; ...@@ -22,7 +22,6 @@ import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle';
import { isWeb } from 'vs/base/common/platform'; import { isWeb } from 'vs/base/common/platform';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { LogsDataCleaner } from 'vs/workbench/contrib/logs/common/logsDataCleaner'; import { LogsDataCleaner } from 'vs/workbench/contrib/logs/common/logsDataCleaner';
import { IProductService } from 'vs/platform/product/common/productService';
const workbenchActionsRegistry = Registry.as<IWorkbenchActionRegistry>(WorkbenchActionExtensions.WorkbenchActions); const workbenchActionsRegistry = Registry.as<IWorkbenchActionRegistry>(WorkbenchActionExtensions.WorkbenchActions);
const devCategory = nls.localize('developer', "Developer"); const devCategory = nls.localize('developer', "Developer");
...@@ -35,7 +34,6 @@ class LogOutputChannels extends Disposable implements IWorkbenchContribution { ...@@ -35,7 +34,6 @@ class LogOutputChannels extends Disposable implements IWorkbenchContribution {
@ILogService private readonly logService: ILogService, @ILogService private readonly logService: ILogService,
@IFileService private readonly fileService: IFileService, @IFileService private readonly fileService: IFileService,
@IInstantiationService private readonly instantiationService: IInstantiationService, @IInstantiationService private readonly instantiationService: IInstantiationService,
@IProductService private readonly productService: IProductService
) { ) {
super(); super();
this.registerCommonContributions(); this.registerCommonContributions();
...@@ -47,9 +45,7 @@ class LogOutputChannels extends Disposable implements IWorkbenchContribution { ...@@ -47,9 +45,7 @@ class LogOutputChannels extends Disposable implements IWorkbenchContribution {
} }
private registerCommonContributions(): void { private registerCommonContributions(): void {
if (this.productService.settingsSyncStore) { this.registerLogChannel(Constants.userDataSyncLogChannelId, nls.localize('userDataSyncLog', "Configuration Sync"), this.environmentService.userDataSyncLogResource);
this.registerLogChannel(Constants.userDataSyncLogChannelId, nls.localize('userDataSyncLog', "Configuration Sync"), this.environmentService.userDataSyncLogResource);
}
this.registerLogChannel(Constants.rendererLogChannelId, nls.localize('rendererLog', "Window"), this.environmentService.logFile); this.registerLogChannel(Constants.rendererLogChannelId, nls.localize('rendererLog', "Window"), this.environmentService.logFile);
} }
......
...@@ -3,42 +3,10 @@ ...@@ -3,42 +3,10 @@
* Licensed under the MIT License. See License.txt in the project root for license information. * Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions';
import { registerConfiguration } from 'vs/platform/userDataSync/common/userDataSync';
import { Disposable } from 'vs/base/common/lifecycle';
import { Registry } from 'vs/platform/registry/common/platform'; import { Registry } from 'vs/platform/registry/common/platform';
import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { isWeb } from 'vs/base/common/platform';
import { UserDataAutoSync } from 'vs/platform/userDataSync/common/userDataSyncService';
import { IProductService } from 'vs/platform/product/common/productService';
import { UserDataSyncWorkbenchContribution } from 'vs/workbench/contrib/userDataSync/browser/userDataSync'; import { UserDataSyncWorkbenchContribution } from 'vs/workbench/contrib/userDataSync/browser/userDataSync';
class UserDataSyncConfigurationContribution implements IWorkbenchContribution {
constructor(
@IProductService productService: IProductService
) {
if (productService.settingsSyncStore) {
registerConfiguration();
}
}
}
class UserDataAutoSyncContribution extends Disposable implements IWorkbenchContribution {
constructor(
@IInstantiationService instantiationService: IInstantiationService
) {
super();
if (isWeb) {
instantiationService.createInstance(UserDataAutoSync);
}
}
}
const workbenchRegistry = Registry.as<IWorkbenchContributionsRegistry>(WorkbenchExtensions.Workbench); const workbenchRegistry = Registry.as<IWorkbenchContributionsRegistry>(WorkbenchExtensions.Workbench);
workbenchRegistry.registerWorkbenchContribution(UserDataSyncConfigurationContribution, LifecyclePhase.Starting); workbenchRegistry.registerWorkbenchContribution(UserDataSyncWorkbenchContribution, LifecyclePhase.Ready);
workbenchRegistry.registerWorkbenchContribution(UserDataSyncWorkbenchContribution, LifecyclePhase.Restored);
workbenchRegistry.registerWorkbenchContribution(UserDataAutoSyncContribution, LifecyclePhase.Restored);
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions';
import { IUserDataSyncService, SyncStatus, SyncSource, CONTEXT_SYNC_STATE } from 'vs/platform/userDataSync/common/userDataSync'; import { IUserDataSyncService, SyncStatus, SyncSource, CONTEXT_SYNC_STATE, IUserDataSyncStore, registerConfiguration, getUserDataSyncStore } from 'vs/platform/userDataSync/common/userDataSync';
import { localize } from 'vs/nls'; import { localize } from 'vs/nls';
import { Disposable, MutableDisposable, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { Disposable, MutableDisposable, toDisposable, DisposableStore } from 'vs/base/common/lifecycle';
import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { CommandsRegistry } from 'vs/platform/commands/common/commands';
...@@ -29,7 +29,9 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; ...@@ -29,7 +29,9 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs';
import { FalseContext } from 'vs/platform/contextkey/common/contextkeys'; import { FalseContext } from 'vs/platform/contextkey/common/contextkeys';
import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage';
import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput';
import { IProductService } from 'vs/platform/product/common/productService'; import { isWeb } from 'vs/base/common/platform';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { UserDataAutoSync } from 'vs/platform/userDataSync/common/userDataSyncService';
const CONTEXT_AUTH_TOKEN_STATE = new RawContextKey<string>('authTokenStatus', AuthTokenStatus.SignedOut); const CONTEXT_AUTH_TOKEN_STATE = new RawContextKey<string>('authTokenStatus', AuthTokenStatus.SignedOut);
const SYNC_PUSH_LIGHT_ICON_URI = URI.parse(registerAndGetAmdImageURL(`vs/workbench/contrib/userDataSync/browser/media/check-light.svg`)); const SYNC_PUSH_LIGHT_ICON_URI = URI.parse(registerAndGetAmdImageURL(`vs/workbench/contrib/userDataSync/browser/media/check-light.svg`));
...@@ -39,6 +41,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo ...@@ -39,6 +41,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo
private static readonly ENABLEMENT_SETTING = 'configurationSync.enable'; private static readonly ENABLEMENT_SETTING = 'configurationSync.enable';
private readonly userDataSyncStore: IUserDataSyncStore | undefined;
private readonly syncStatusContext: IContextKey<string>; private readonly syncStatusContext: IContextKey<string>;
private readonly authTokenContext: IContextKey<string>; private readonly authTokenContext: IContextKey<string>;
private readonly badgeDisposable = this._register(new MutableDisposable()); private readonly badgeDisposable = this._register(new MutableDisposable());
...@@ -59,18 +62,26 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo ...@@ -59,18 +62,26 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo
@IDialogService private readonly dialogService: IDialogService, @IDialogService private readonly dialogService: IDialogService,
@IStorageService private readonly storageService: IStorageService, @IStorageService private readonly storageService: IStorageService,
@IQuickInputService private readonly quickInputService: IQuickInputService, @IQuickInputService private readonly quickInputService: IQuickInputService,
@IProductService private readonly productService: IProductService, @IInstantiationService instantiationService: IInstantiationService,
) { ) {
super(); super();
this.userDataSyncStore = getUserDataSyncStore(configurationService);
this.syncStatusContext = CONTEXT_SYNC_STATE.bindTo(contextKeyService); this.syncStatusContext = CONTEXT_SYNC_STATE.bindTo(contextKeyService);
this.authTokenContext = CONTEXT_AUTH_TOKEN_STATE.bindTo(contextKeyService); this.authTokenContext = CONTEXT_AUTH_TOKEN_STATE.bindTo(contextKeyService);
this.onDidChangeAuthTokenStatus(this.authTokenService.status); if (this.userDataSyncStore) {
this.onDidChangeSyncStatus(this.userDataSyncService.status); registerConfiguration();
this._register(Event.debounce(authTokenService.onDidChangeStatus, () => undefined, 500)(() => this.onDidChangeAuthTokenStatus(this.authTokenService.status))); this.onDidChangeAuthTokenStatus(this.authTokenService.status);
this._register(Event.debounce(userDataSyncService.onDidChangeStatus, () => undefined, 500)(() => this.onDidChangeSyncStatus(this.userDataSyncService.status))); this.onDidChangeSyncStatus(this.userDataSyncService.status);
this._register(Event.filter(this.configurationService.onDidChangeConfiguration, e => e.affectsConfiguration(UserDataSyncWorkbenchContribution.ENABLEMENT_SETTING))(() => this.onDidChangeEnablement())); this._register(Event.debounce(authTokenService.onDidChangeStatus, () => undefined, 500)(() => this.onDidChangeAuthTokenStatus(this.authTokenService.status)));
this.registerActions(); this._register(Event.debounce(userDataSyncService.onDidChangeStatus, () => undefined, 500)(() => this.onDidChangeSyncStatus(this.userDataSyncService.status)));
this._register(Event.filter(this.configurationService.onDidChangeConfiguration, e => e.affectsConfiguration(UserDataSyncWorkbenchContribution.ENABLEMENT_SETTING))(() => this.onDidChangeEnablement()));
this.registerActions();
if (isWeb) {
this._register(instantiationService.createInstance(UserDataAutoSync));
}
}
} }
private onDidChangeAuthTokenStatus(status: AuthTokenStatus) { private onDidChangeAuthTokenStatus(status: AuthTokenStatus) {
...@@ -112,7 +123,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo ...@@ -112,7 +123,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo
const enabled = this.configurationService.getValue<boolean>(UserDataSyncWorkbenchContribution.ENABLEMENT_SETTING); const enabled = this.configurationService.getValue<boolean>(UserDataSyncWorkbenchContribution.ENABLEMENT_SETTING);
if (enabled) { if (enabled) {
if (this.authTokenService.status === AuthTokenStatus.SignedOut) { if (this.authTokenService.status === AuthTokenStatus.SignedOut) {
const handle = this.notificationService.prompt(Severity.Info, localize('ask to sign in', "Please sign in with your {0} account to sync configuration across all your machines", this.productService.settingsSyncStore!.account), const handle = this.notificationService.prompt(Severity.Info, localize('ask to sign in', "Please sign in with your {0} account to sync configuration across all your machines", this.userDataSyncStore!.account),
[ [
{ {
label: localize('Sign in', "Sign in"), label: localize('Sign in', "Sign in"),
...@@ -154,8 +165,8 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo ...@@ -154,8 +165,8 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo
if (this.authTokenService.status === AuthTokenStatus.SignedOut) { if (this.authTokenService.status === AuthTokenStatus.SignedOut) {
const result = await this.dialogService.confirm({ const result = await this.dialogService.confirm({
type: 'info', type: 'info',
message: localize('sign in to account', "Sign in to {0}", this.productService.settingsSyncStore!.name), message: localize('sign in to account', "Sign in to {0}", this.userDataSyncStore!.name),
detail: localize('ask to sign in', "Please sign in with your {0} account to sync configuration across all your machines", this.productService.settingsSyncStore!.account), detail: localize('ask to sign in', "Please sign in with your {0} account to sync configuration across all your machines", this.userDataSyncStore!.account),
primaryButton: localize('Sign in', "Sign in") primaryButton: localize('Sign in', "Sign in")
}); });
if (!result.confirmed) { if (!result.confirmed) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册