Merge vscode source through 1.62 release (#19981)

* Build breaks 1

* Build breaks

* Build breaks

* Build breaks

* More build breaks

* Build breaks (#2512)

* Runtime breaks

* Build breaks

* Fix dialog location break

* Update typescript

* Fix ASAR break issue

* Unit test breaks

* Update distro

* Fix breaks in ADO builds (#2513)

* Bump to node 16

* Fix hygiene errors

* Bump distro

* Remove reference to node type

* Delete vscode specific extension

* Bump to node 16 in CI yaml

* Skip integration tests in CI builds (while fixing)

* yarn.lock update

* Bump moment dependency in remote yarn

* Fix drop-down chevron style

* Bump to node 16

* Remove playwrite from ci.yaml

* Skip building build scripts in hygine check
This commit is contained in:
Karl Burtram
2022-07-11 14:09:32 -07:00
committed by GitHub
parent fa0fcef303
commit 26455e9113
1876 changed files with 72050 additions and 37997 deletions

View File

@@ -24,7 +24,7 @@ import { FileChangesEvent, FileOperationError, FileOperationResult, FileSystemPr
import { getServiceMachineId } from 'vs/platform/serviceMachineId/common/serviceMachineId';
import { IStorageService } from 'vs/platform/storage/common/storage';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { Change, getLastSyncResourceUri, IRemoteUserData, IResourcePreview as IBaseResourcePreview, ISyncData, ISyncResourceHandle, ISyncResourcePreview as IBaseSyncResourcePreview, IUserData, IUserDataInitializer, IUserDataManifest, IUserDataSyncBackupStoreService, IUserDataSyncLogService, IUserDataSyncResourceEnablementService, IUserDataSyncStoreService, IUserDataSyncUtilService, MergeState, PREVIEW_DIR_NAME, SyncResource, SyncStatus, UserDataSyncError, UserDataSyncErrorCode, USER_DATA_SYNC_SCHEME } from 'vs/platform/userDataSync/common/userDataSync';
import { Change, getLastSyncResourceUri, IRemoteUserData, IResourcePreview as IBaseResourcePreview, ISyncData, ISyncResourceHandle, ISyncResourcePreview as IBaseSyncResourcePreview, IUserData, IUserDataInitializer, IUserDataManifest, IUserDataSyncBackupStoreService, IUserDataSyncConfiguration, IUserDataSynchroniser, IUserDataSyncLogService, IUserDataSyncResourceEnablementService, IUserDataSyncStoreService, IUserDataSyncUtilService, MergeState, PREVIEW_DIR_NAME, SyncResource, SyncStatus, UserDataSyncError, UserDataSyncErrorCode, USER_DATA_SYNC_CONFIGURATION_SCOPE, USER_DATA_SYNC_SCHEME } from 'vs/platform/userDataSync/common/userDataSync';
type SyncSourceClassification = {
source?: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true };
@@ -86,7 +86,7 @@ interface ISyncResourcePreview extends IBaseSyncResourcePreview {
readonly resourcePreviews: IEditableResourcePreview[];
}
export abstract class AbstractSynchroniser extends Disposable {
export abstract class AbstractSynchroniser extends Disposable implements IUserDataSynchroniser {
private syncPreviewPromise: CancelablePromise<ISyncResourcePreview> | null = null;
@@ -151,7 +151,7 @@ export abstract class AbstractSynchroniser extends Disposable {
this.logService.info(`${this.syncResourceLogLabel}: In conflicts state and local change detected. Syncing again...`);
const preview = await this.syncPreviewPromise!;
this.syncPreviewPromise = null;
const status = await this.performSync(preview.remoteUserData, preview.lastSyncUserData, true);
const status = await this.performSync(preview.remoteUserData, preview.lastSyncUserData, true, this.getUserDataSyncConfiguration());
this.setStatus(status);
}
@@ -159,7 +159,7 @@ export abstract class AbstractSynchroniser extends Disposable {
else {
this.logService.trace(`${this.syncResourceLogLabel}: Checking for local changes...`);
const lastSyncUserData = await this.getLastSyncUserData();
const hasRemoteChanged = lastSyncUserData ? (await this.doGenerateSyncResourcePreview(lastSyncUserData, lastSyncUserData, true, CancellationToken.None)).resourcePreviews.some(({ remoteChange }) => remoteChange !== Change.None) : true;
const hasRemoteChanged = lastSyncUserData ? (await this.doGenerateSyncResourcePreview(lastSyncUserData, lastSyncUserData, true, this.getUserDataSyncConfiguration(), CancellationToken.None)).resourcePreviews.some(({ remoteChange }) => remoteChange !== Change.None) : true;
if (hasRemoteChanged) {
this._onDidChangeLocal.fire();
}
@@ -183,11 +183,11 @@ export abstract class AbstractSynchroniser extends Disposable {
}
async sync(manifest: IUserDataManifest | null, headers: IHeaders = {}): Promise<void> {
await this._sync(manifest, true, headers);
await this._sync(manifest, true, this.getUserDataSyncConfiguration(), headers);
}
async preview(manifest: IUserDataManifest | null, headers: IHeaders = {}): Promise<ISyncResourcePreview | null> {
return this._sync(manifest, false, headers);
async preview(manifest: IUserDataManifest | null, userDataSyncConfiguration: IUserDataSyncConfiguration, headers: IHeaders = {}): Promise<ISyncResourcePreview | null> {
return this._sync(manifest, false, userDataSyncConfiguration, headers);
}
async apply(force: boolean, headers: IHeaders = {}): Promise<ISyncResourcePreview | null> {
@@ -203,7 +203,7 @@ export abstract class AbstractSynchroniser extends Disposable {
}
}
private async _sync(manifest: IUserDataManifest | null, apply: boolean, headers: IHeaders): Promise<ISyncResourcePreview | null> {
private async _sync(manifest: IUserDataManifest | null, apply: boolean, userDataSyncConfiguration: IUserDataSyncConfiguration, headers: IHeaders): Promise<ISyncResourcePreview | null> {
try {
this.syncHeaders = { ...headers };
@@ -232,7 +232,7 @@ export abstract class AbstractSynchroniser extends Disposable {
try {
const lastSyncUserData = await this.getLastSyncUserData();
const remoteUserData = await this.getLatestRemoteUserData(manifest, lastSyncUserData);
status = await this.performSync(remoteUserData, lastSyncUserData, apply);
status = await this.performSync(remoteUserData, lastSyncUserData, apply, userDataSyncConfiguration);
if (status === SyncStatus.HasConflicts) {
this.logService.info(`${this.syncResourceLogLabel}: Detected conflicts while synchronizing ${this.resource.toLowerCase()}.`);
} else if (status === SyncStatus.Idle) {
@@ -268,7 +268,7 @@ export abstract class AbstractSynchroniser extends Disposable {
const isRemoteDataFromCurrentMachine = await this.isRemoteDataFromCurrentMachine(remoteUserData);
/* use replace sync data */
const resourcePreviewResults = await this.generateSyncPreview({ ref: remoteUserData.ref, syncData }, lastSyncUserData, isRemoteDataFromCurrentMachine, CancellationToken.None);
const resourcePreviewResults = await this.generateSyncPreview({ ref: remoteUserData.ref, syncData }, lastSyncUserData, isRemoteDataFromCurrentMachine, this.getUserDataSyncConfiguration(), CancellationToken.None);
const resourcePreviews: [IResourcePreview, IAcceptResult][] = [];
for (const resourcePreviewResult of resourcePreviewResults) {
@@ -311,7 +311,7 @@ export abstract class AbstractSynchroniser extends Disposable {
return this.getRemoteUserData(lastSyncUserData);
}
private async performSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, apply: boolean): Promise<SyncStatus> {
private async performSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, apply: boolean, userDataSyncConfiguration: IUserDataSyncConfiguration): Promise<SyncStatus> {
if (remoteUserData.syncData && remoteUserData.syncData.version > this.version) {
// current version is not compatible with cloud version
this.telemetryService.publicLog2<{ source: string }, SyncSourceClassification>('sync/incompatible', { source: this.resource });
@@ -319,7 +319,7 @@ export abstract class AbstractSynchroniser extends Disposable {
}
try {
return await this.doSync(remoteUserData, lastSyncUserData, apply);
return await this.doSync(remoteUserData, lastSyncUserData, apply, userDataSyncConfiguration);
} catch (e) {
if (e instanceof UserDataSyncError) {
switch (e.code) {
@@ -327,7 +327,7 @@ export abstract class AbstractSynchroniser extends Disposable {
case UserDataSyncErrorCode.LocalPreconditionFailed:
// Rejected as there is a new local version. Syncing again...
this.logService.info(`${this.syncResourceLogLabel}: Failed to synchronize ${this.syncResourceLogLabel} as there is a new local version available. Synchronizing again...`);
return this.performSync(remoteUserData, lastSyncUserData, apply);
return this.performSync(remoteUserData, lastSyncUserData, apply, userDataSyncConfiguration);
case UserDataSyncErrorCode.Conflict:
case UserDataSyncErrorCode.PreconditionFailed:
@@ -341,18 +341,18 @@ export abstract class AbstractSynchroniser extends Disposable {
// and one of them successfully updated remote and last sync state.
lastSyncUserData = await this.getLastSyncUserData();
return this.performSync(remoteUserData, lastSyncUserData, apply);
return this.performSync(remoteUserData, lastSyncUserData, apply, userDataSyncConfiguration);
}
}
throw e;
}
}
protected async doSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, apply: boolean): Promise<SyncStatus> {
protected async doSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, apply: boolean, userDataSyncConfiguration: IUserDataSyncConfiguration): Promise<SyncStatus> {
try {
// generate or use existing preview
if (!this.syncPreviewPromise) {
this.syncPreviewPromise = createCancelablePromise(token => this.doGenerateSyncResourcePreview(remoteUserData, lastSyncUserData, apply, token));
this.syncPreviewPromise = createCancelablePromise(token => this.doGenerateSyncResourcePreview(remoteUserData, lastSyncUserData, apply, userDataSyncConfiguration, token));
}
const preview = await this.syncPreviewPromise;
@@ -561,9 +561,9 @@ export abstract class AbstractSynchroniser extends Disposable {
} catch (e) { /* ignore */ }
}
private async doGenerateSyncResourcePreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, apply: boolean, token: CancellationToken): Promise<ISyncResourcePreview> {
private async doGenerateSyncResourcePreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, apply: boolean, userDataSyncConfiguration: IUserDataSyncConfiguration, token: CancellationToken): Promise<ISyncResourcePreview> {
const isRemoteDataFromCurrentMachine = await this.isRemoteDataFromCurrentMachine(remoteUserData);
const resourcePreviewResults = await this.generateSyncPreview(remoteUserData, lastSyncUserData, isRemoteDataFromCurrentMachine, token);
const resourcePreviewResults = await this.generateSyncPreview(remoteUserData, lastSyncUserData, isRemoteDataFromCurrentMachine, userDataSyncConfiguration, token);
const resourcePreviews: IEditableResourcePreview[] = [];
for (const resourcePreviewResult of resourcePreviewResults) {
@@ -710,11 +710,18 @@ export abstract class AbstractSynchroniser extends Disposable {
this.logService.info(`${this.syncResourceLogLabel}: Stopped synchronizing ${this.resource.toLowerCase()}.`);
}
private getUserDataSyncConfiguration(): IUserDataSyncConfiguration {
return this.configurationService.getValue(USER_DATA_SYNC_CONFIGURATION_SCOPE);
}
protected abstract readonly version: number;
protected abstract generateSyncPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, isRemoteDataFromCurrentMachine: boolean, token: CancellationToken): Promise<IResourcePreview[]>;
protected abstract generateSyncPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, isRemoteDataFromCurrentMachine: boolean, userDataSyncConfiguration: IUserDataSyncConfiguration, token: CancellationToken): Promise<IResourcePreview[]>;
protected abstract getMergeResult(resourcePreview: IResourcePreview, token: CancellationToken): Promise<IMergeResult>;
protected abstract getAcceptResult(resourcePreview: IResourcePreview, resource: URI, content: string | null | undefined, token: CancellationToken): Promise<IAcceptResult>;
protected abstract applyResult(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, result: [IResourcePreview, IAcceptResult][], force: boolean): Promise<void>;
abstract hasLocalData(): Promise<boolean>;
abstract getAssociatedResources(syncResourceHandle: ISyncResourceHandle): Promise<{ resource: URI, comparableResource: URI }[]>;
}
export interface IFileResourcePreview extends IResourcePreview {
@@ -753,7 +760,7 @@ export abstract class AbstractFileSynchroniser extends AbstractSynchroniser {
try {
if (oldContent) {
// file exists already
await this.fileService.writeFile(this.file, VSBuffer.fromString(newContent), force ? undefined : oldContent);
await this.writeFileContent(newContent, oldContent, force);
} else {
// file does not exist
await this.fileService.createFile(this.file, VSBuffer.fromString(newContent), { overwrite: force });
@@ -768,6 +775,10 @@ export abstract class AbstractFileSynchroniser extends AbstractSynchroniser {
}
}
protected async writeFileContent(newContent: string, oldContent: IFileContent, force: boolean): Promise<void> {
await this.fileService.writeFile(this.file, VSBuffer.fromString(newContent), force ? undefined : oldContent);
}
private onFileChanges(e: FileChangesEvent): void {
if (!e.contains(this.file)) {
return;

View File

@@ -14,7 +14,7 @@ import { compare } from 'vs/base/common/strings';
import { URI } from 'vs/base/common/uri';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
import { IExtensionGalleryService, IExtensionManagementService, IGlobalExtensionEnablementService, ILocalExtension } from 'vs/platform/extensionManagement/common/extensionManagement';
import { IExtensionGalleryService, IExtensionManagementService, IGlobalExtensionEnablementService, ILocalExtension, ExtensionManagementError, ExtensionManagementErrorCode } from 'vs/platform/extensionManagement/common/extensionManagement';
import { areSameExtensions, getExtensionId, getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
import { ExtensionType, IExtensionIdentifier } from 'vs/platform/extensions/common/extensions';
import { IFileService } from 'vs/platform/files/common/files';
@@ -125,7 +125,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse
const skippedExtensions: ISyncExtension[] = lastSyncUserData?.skippedExtensions || [];
const lastSyncExtensions: ISyncExtension[] | null = lastSyncUserData?.syncData ? await parseAndMigrateExtensions(lastSyncUserData.syncData, this.extensionManagementService) : null;
const installedExtensions = await this.extensionManagementService.getInstalled();
const installedExtensions = await this.extensionManagementService.getInstalled(undefined, true);
const localExtensions = this.getLocalExtensions(installedExtensions);
const ignoredExtensions = this.ignoredExtensionsManagementService.getIgnoredExtensions(installedExtensions);
@@ -375,7 +375,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse
}
// User Extension Sync: Install/Update, Enablement & State
const extension = await this.extensionGalleryService.getCompatibleExtension(e.identifier);
const extension = (await this.extensionGalleryService.getExtensions([e.identifier], CancellationToken.None))[0];
/* Update extension state only if
* extension is installed and version is same as synced version or
@@ -416,12 +416,16 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse
}
} catch (error) {
addToSkipped.push(e);
this.logService.error(error);
this.logService.info(`${this.syncResourceLogLabel}: Skipped synchronizing extension`, extension.displayName || extension.identifier.id);
if (error instanceof ExtensionManagementError && error.code === ExtensionManagementErrorCode.Incompatible) {
this.logService.info(`${this.syncResourceLogLabel}: Skipped synchronizing extension because the compatible extension is not found.`, extension.displayName || extension.identifier.id);
} else {
this.logService.error(error);
this.logService.info(`${this.syncResourceLogLabel}: Skipped synchronizing extension`, extension.displayName || extension.identifier.id);
}
}
} else {
this.logService.info(`${this.syncResourceLogLabel}: Skipped synchronizing extension because the compatible extension is not found.`, e.identifier.id);
addToSkipped.push(e);
this.logService.info(`${this.syncResourceLogLabel}: Skipped synchronizing extension because the extension is not found.`, e.identifier.id);
}
}));
}

View File

@@ -6,6 +6,7 @@
import { VSBuffer } from 'vs/base/common/buffer';
import { CancellationToken } from 'vs/base/common/cancellation';
import { IStringDictionary } from 'vs/base/common/collections';
import { getErrorMessage } from 'vs/base/common/errors';
import { Event } from 'vs/base/common/event';
import { parse } from 'vs/base/common/json';
import { applyEdits } from 'vs/base/common/jsonEdit';
@@ -98,14 +99,14 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs
);
}
protected async generateSyncPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, isRemoteDataFromCurrentMachine: boolean, token: CancellationToken): Promise<IGlobalStateResourcePreview[]> {
protected async generateSyncPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, isRemoteDataFromCurrentMachine: boolean): Promise<IGlobalStateResourcePreview[]> {
const remoteGlobalState: IGlobalState = remoteUserData.syncData ? JSON.parse(remoteUserData.syncData.content) : null;
// Use remote data as last sync data if last sync data does not exist and remote data is from same machine
lastSyncUserData = lastSyncUserData === null && isRemoteDataFromCurrentMachine ? remoteUserData : lastSyncUserData;
const lastSyncGlobalState: IGlobalState | null = lastSyncUserData && lastSyncUserData.syncData ? JSON.parse(lastSyncUserData.syncData.content) : null;
const localGloablState = await this.getLocalGlobalState();
const localGlobalState = await this.getLocalGlobalState();
if (remoteGlobalState) {
this.logService.trace(`${this.syncResourceLogLabel}: Merging remote ui state with local ui state...`);
@@ -114,7 +115,7 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs
}
const storageKeys = this.getStorageKeys(lastSyncGlobalState);
const { local, remote } = merge(localGloablState.storage, remoteGlobalState ? remoteGlobalState.storage : null, lastSyncGlobalState ? lastSyncGlobalState.storage : null, storageKeys, this.logService);
const { local, remote } = merge(localGlobalState.storage, remoteGlobalState ? remoteGlobalState.storage : null, lastSyncGlobalState ? lastSyncGlobalState.storage : null, storageKeys, this.logService);
const previewResult: IGlobalStateResourceMergeResult = {
content: null,
local,
@@ -125,8 +126,8 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs
return [{
localResource: this.localResource,
localContent: formatAndStringify(localGloablState),
localUserData: localGloablState,
localContent: formatAndStringify(localGlobalState),
localUserData: localGlobalState,
remoteResource: this.remoteResource,
remoteContent: remoteGlobalState ? formatAndStringify(remoteGlobalState) : null,
previewResource: this.previewResource,
@@ -291,9 +292,13 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs
private async getLocalArgvContent(): Promise<string> {
try {
this.logService.debug('GlobalStateSync#getLocalArgvContent', this.environmentService.argvResource);
const content = await this.fileService.readFile(this.environmentService.argvResource);
this.logService.debug('GlobalStateSync#getLocalArgvContent - Resolved', this.environmentService.argvResource);
return content.value.toString();
} catch (error) { }
} catch (error) {
this.logService.debug(getErrorMessage(error));
}
return '{}';
}

View File

@@ -15,11 +15,12 @@ import { localize } from 'vs/nls';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
import { FileOperationError, FileOperationResult, IFileService } from 'vs/platform/files/common/files';
import { ILogService } from 'vs/platform/log/common/log';
import { IStorageService } from 'vs/platform/storage/common/storage';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { AbstractInitializer, AbstractJsonFileSynchroniser, IAcceptResult, IFileResourcePreview, IMergeResult } from 'vs/platform/userDataSync/common/abstractSynchronizer';
import { merge } from 'vs/platform/userDataSync/common/keybindingsMerge';
import { Change, IRemoteUserData, ISyncResourceHandle, IUserDataSyncBackupStoreService, IUserDataSynchroniser, IUserDataSyncLogService, IUserDataSyncResourceEnablementService, IUserDataSyncStoreService, IUserDataSyncUtilService, SyncResource, UserDataSyncError, UserDataSyncErrorCode, USER_DATA_SYNC_SCHEME } from 'vs/platform/userDataSync/common/userDataSync';
import { Change, IRemoteUserData, ISyncResourceHandle, IUserDataSyncBackupStoreService, IUserDataSyncConfiguration, IUserDataSynchroniser, IUserDataSyncLogService, IUserDataSyncResourceEnablementService, IUserDataSyncStoreService, IUserDataSyncUtilService, SyncResource, UserDataSyncError, UserDataSyncErrorCode, USER_DATA_SYNC_SCHEME } from 'vs/platform/userDataSync/common/userDataSync';
interface ISyncContent {
mac?: string;
@@ -36,18 +37,23 @@ interface ILastSyncUserData extends IRemoteUserData {
platformSpecific?: boolean;
}
export function getKeybindingsContentFromSyncContent(syncContent: string, platformSpecific: boolean): string | null {
const parsed = <ISyncContent>JSON.parse(syncContent);
if (!platformSpecific) {
return isUndefined(parsed.all) ? null : parsed.all;
}
switch (OS) {
case OperatingSystem.Macintosh:
return isUndefined(parsed.mac) ? null : parsed.mac;
case OperatingSystem.Linux:
return isUndefined(parsed.linux) ? null : parsed.linux;
case OperatingSystem.Windows:
return isUndefined(parsed.windows) ? null : parsed.windows;
export function getKeybindingsContentFromSyncContent(syncContent: string, platformSpecific: boolean, logService: ILogService): string | null {
try {
const parsed = <ISyncContent>JSON.parse(syncContent);
if (!platformSpecific) {
return isUndefined(parsed.all) ? null : parsed.all;
}
switch (OS) {
case OperatingSystem.Macintosh:
return isUndefined(parsed.mac) ? null : parsed.mac;
case OperatingSystem.Linux:
return isUndefined(parsed.linux) ? null : parsed.linux;
case OperatingSystem.Windows:
return isUndefined(parsed.windows) ? null : parsed.windows;
}
} catch (e) {
logService.error(e);
return null;
}
}
@@ -76,8 +82,8 @@ export class KeybindingsSynchroniser extends AbstractJsonFileSynchroniser implem
this._register(Event.filter(configurationService.onDidChangeConfiguration, e => e.affectsConfiguration('settingsSync.keybindingsPerPlatform'))(() => this.triggerLocalChange()));
}
protected async generateSyncPreview(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null, isRemoteDataFromCurrentMachine: boolean, token: CancellationToken): Promise<IKeybindingsResourcePreview[]> {
const remoteContent = remoteUserData.syncData ? this.getKeybindingsContentFromSyncContent(remoteUserData.syncData.content) : null;
protected async generateSyncPreview(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null, isRemoteDataFromCurrentMachine: boolean, userDataSyncConfiguration: IUserDataSyncConfiguration): Promise<IKeybindingsResourcePreview[]> {
const remoteContent = remoteUserData.syncData ? getKeybindingsContentFromSyncContent(remoteUserData.syncData.content, userDataSyncConfiguration.keybindingsPerPlatform ?? this.syncKeybindingsPerPlatform(), this.logService) : null;
// Use remote data as last sync data if last sync data does not exist and remote data is from same machine
lastSyncUserData = lastSyncUserData === null && isRemoteDataFromCurrentMachine ? remoteUserData : lastSyncUserData;
@@ -271,7 +277,7 @@ export class KeybindingsSynchroniser extends AbstractJsonFileSynchroniser implem
if (syncData) {
switch (this.extUri.basename(uri)) {
case 'keybindings.json':
return this.getKeybindingsContentFromSyncContent(syncData.content);
return getKeybindingsContentFromSyncContent(syncData.content, this.syncKeybindingsPerPlatform(), this.logService);
}
}
}
@@ -288,16 +294,7 @@ export class KeybindingsSynchroniser extends AbstractJsonFileSynchroniser implem
return null;
}
return this.getKeybindingsContentFromSyncContent(lastSyncUserData.syncData.content);
}
private getKeybindingsContentFromSyncContent(syncContent: string): string | null {
try {
return getKeybindingsContentFromSyncContent(syncContent, this.syncKeybindingsPerPlatform());
} catch (e) {
this.logService.error(e);
return null;
}
return getKeybindingsContentFromSyncContent(lastSyncUserData.syncData.content, this.syncKeybindingsPerPlatform(), this.logService);
}
private toSyncContent(keybindingsContent: string, syncContent?: string): string {
@@ -327,14 +324,6 @@ export class KeybindingsSynchroniser extends AbstractJsonFileSynchroniser implem
}
private syncKeybindingsPerPlatform(): boolean {
let userValue = !!this.configurationService.inspect('settingsSync.keybindingsPerPlatform').userValue;
if (userValue !== undefined) {
return userValue;
}
userValue = !!this.configurationService.inspect('sync.keybindingsPerPlatform').userValue;
if (userValue !== undefined) {
return userValue;
}
return !!this.configurationService.getValue('settingsSync.keybindingsPerPlatform');
}
@@ -380,7 +369,7 @@ export class KeybindingsInitializer extends AbstractInitializer {
private getKeybindingsContentFromSyncContent(syncContent: string): string | null {
try {
return getKeybindingsContentFromSyncContent(syncContent, true);
return getKeybindingsContentFromSyncContent(syncContent, true, this.logService);
} catch (e) {
this.logService.error(e);
return null;

View File

@@ -11,15 +11,17 @@ import { Edit } from 'vs/base/common/jsonFormatter';
import { URI } from 'vs/base/common/uri';
import { localize } from 'vs/nls';
import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { ConfigurationModelParser } from 'vs/platform/configuration/common/configurationModels';
import { IUserConfigurationFileService } from 'vs/platform/configuration/common/userConfigurationFileService';
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
import { IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement';
import { FileOperationError, FileOperationResult, IFileService } from 'vs/platform/files/common/files';
import { FileOperationError, FileOperationResult, IFileContent, IFileService } from 'vs/platform/files/common/files';
import { IStorageService } from 'vs/platform/storage/common/storage';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { AbstractInitializer, AbstractJsonFileSynchroniser, IAcceptResult, IFileResourcePreview, IMergeResult } from 'vs/platform/userDataSync/common/abstractSynchronizer';
import { edit } from 'vs/platform/userDataSync/common/content';
import { getIgnoredSettings, isEmpty, merge, updateIgnoredSettings } from 'vs/platform/userDataSync/common/settingsMerge';
import { Change, CONFIGURATION_SYNC_STORE_KEY, IRemoteUserData, ISyncData, ISyncResourceHandle, IUserDataSyncBackupStoreService, IUserDataSynchroniser, IUserDataSyncLogService, IUserDataSyncResourceEnablementService, IUserDataSyncStoreService, IUserDataSyncUtilService, SyncResource, UserDataSyncError, UserDataSyncErrorCode, USER_DATA_SYNC_SCHEME } from 'vs/platform/userDataSync/common/userDataSync';
import { Change, CONFIGURATION_SYNC_STORE_KEY, IRemoteUserData, ISyncData, ISyncResourceHandle, IUserDataManifest, IUserDataSyncBackupStoreService, IUserDataSyncConfiguration, IUserDataSynchroniser, IUserDataSyncLogService, IUserDataSyncResourceEnablementService, IUserDataSyncStoreService, IUserDataSyncUtilService, SyncResource, UserDataSyncError, UserDataSyncErrorCode, USER_DATA_SYNC_CONFIGURATION_SCOPE, USER_DATA_SYNC_SCHEME } from 'vs/platform/userDataSync/common/userDataSync';
interface ISettingsResourcePreview extends IFileResourcePreview {
previewResult: IMergeResult;
@@ -61,11 +63,23 @@ export class SettingsSynchroniser extends AbstractJsonFileSynchroniser implement
@IUserDataSyncResourceEnablementService userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService,
@ITelemetryService telemetryService: ITelemetryService,
@IExtensionManagementService private readonly extensionManagementService: IExtensionManagementService,
@IUserConfigurationFileService private readonly userConfigurationFileService: IUserConfigurationFileService,
) {
super(environmentService.settingsResource, SyncResource.Settings, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncResourceEnablementService, telemetryService, logService, userDataSyncUtilService, configurationService);
}
protected async generateSyncPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, isRemoteDataFromCurrentMachine: boolean, token: CancellationToken): Promise<ISettingsResourcePreview[]> {
async getRemoteUserDataSyncConfiguration(manifest: IUserDataManifest | null): Promise<IUserDataSyncConfiguration> {
const lastSyncUserData = await this.getLastSyncUserData();
const remoteUserData = await this.getLatestRemoteUserData(manifest, lastSyncUserData);
const remoteSettingsSyncContent = this.getSettingsSyncContent(remoteUserData);
const parser = new ConfigurationModelParser(USER_DATA_SYNC_CONFIGURATION_SCOPE);
if (remoteSettingsSyncContent?.settings) {
parser.parse(remoteSettingsSyncContent.settings);
}
return parser.configurationModel.getValue(USER_DATA_SYNC_CONFIGURATION_SCOPE) || {};
}
protected async generateSyncPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, isRemoteDataFromCurrentMachine: boolean): Promise<ISettingsResourcePreview[]> {
const fileContent = await this.getLocalFileContent();
const formattingOptions = await this.getFormattingOptions();
const remoteSettingsSyncContent = this.getSettingsSyncContent(remoteUserData);
@@ -313,6 +327,10 @@ export class SettingsSynchroniser extends AbstractJsonFileSynchroniser implement
return getIgnoredSettings(defaultIgnoredSettings, this.configurationService, content);
}
protected override async writeFileContent(newContent: string, oldContent: IFileContent, force: boolean): Promise<void> {
await this.userConfigurationFileService.write(VSBuffer.fromString(newContent), force ? undefined : { etag: oldContent.etag, mtime: oldContent.mtime });
}
private validateContent(content: string): void {
if (this.hasErrors(content)) {
throw new UserDataSyncError(localize('errorInvalidSettings', "Unable to sync settings as there are errors/warning in settings file."), UserDataSyncErrorCode.LocalInvalidContent, this.resource);

View File

@@ -49,7 +49,7 @@ export class SnippetsSynchroniser extends AbstractSynchroniser implements IUserD
this._register(Event.filter(this.fileService.onDidFilesChange, e => e.affects(this.snippetsFolder))(() => this.triggerLocalChange()));
}
protected async generateSyncPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, isRemoteDataFromCurrentMachine: boolean, token: CancellationToken): Promise<ISnippetsResourcePreview[]> {
protected async generateSyncPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, isRemoteDataFromCurrentMachine: boolean): Promise<ISnippetsResourcePreview[]> {
const local = await this.getSnippetsFileContents();
const localSnippets = this.toSnippetsContents(local);
const remoteSnippets: IStringDictionary<string> | null = remoteUserData.syncData ? this.parseSnippets(remoteUserData.syncData) : null;

View File

@@ -37,6 +37,14 @@ export function getDefaultIgnoredSettings(): string[] {
return distinct([CONFIGURATION_SYNC_STORE_KEY, ...ignoreSyncSettings, ...machineSettings, ...disallowedSettings]);
}
export const USER_DATA_SYNC_CONFIGURATION_SCOPE = 'settingsSync';
export interface IUserDataSyncConfiguration {
keybindingsPerPlatform?: boolean;
ignoredExtensions?: string[];
ignoredSettings?: string[];
}
export function registerConfiguration(): IDisposable {
const ignoredSettingsSchemaId = 'vscode://schemas/ignoredSettings';
const configurationRegistry = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration);
@@ -382,7 +390,7 @@ export interface IUserDataSynchroniser {
replace(uri: URI): Promise<boolean>;
stop(): Promise<void>;
preview(manifest: IUserDataManifest | null, headers: IHeaders): Promise<ISyncResourcePreview | null>;
preview(manifest: IUserDataManifest | null, userDataSyncConfiguration: IUserDataSyncConfiguration, headers: IHeaders): Promise<ISyncResourcePreview | null>;
accept(resource: URI, content?: string | null): Promise<ISyncResourcePreview | null>;
merge(resource: URI): Promise<ISyncResourcePreview | null>;
discard(resource: URI): Promise<ISyncResourcePreview | null>;

View File

@@ -14,6 +14,7 @@ import { isEqual } from 'vs/base/common/resources';
import { URI } from 'vs/base/common/uri';
import { generateUuid } from 'vs/base/common/uuid';
import { IHeaders } from 'vs/base/parts/request/common/request';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
@@ -22,7 +23,7 @@ import { GlobalStateSynchroniser } from 'vs/platform/userDataSync/common/globalS
import { KeybindingsSynchroniser } from 'vs/platform/userDataSync/common/keybindingsSync';
import { SettingsSynchroniser } from 'vs/platform/userDataSync/common/settingsSync';
import { SnippetsSynchroniser } from 'vs/platform/userDataSync/common/snippetsSync';
import { Change, createSyncHeaders, IManualSyncTask, IResourcePreview, ISyncResourceHandle, ISyncResourcePreview, ISyncTask, IUserDataManifest, IUserDataSynchroniser, IUserDataSyncLogService, IUserDataSyncService, IUserDataSyncStoreManagementService, IUserDataSyncStoreService, MergeState, SyncResource, SyncStatus, UserDataSyncError, UserDataSyncErrorCode, UserDataSyncStoreError } from 'vs/platform/userDataSync/common/userDataSync';
import { Change, createSyncHeaders, IManualSyncTask, IResourcePreview, ISyncResourceHandle, ISyncResourcePreview, ISyncTask, IUserDataManifest, IUserDataSyncConfiguration, IUserDataSynchroniser, IUserDataSyncLogService, IUserDataSyncService, IUserDataSyncStoreManagementService, IUserDataSyncStoreService, MergeState, SyncResource, SyncStatus, UserDataSyncError, UserDataSyncErrorCode, UserDataSyncStoreError, USER_DATA_SYNC_CONFIGURATION_SCOPE } from 'vs/platform/userDataSync/common/userDataSync';
type SyncErrorClassification = {
code: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true };
@@ -77,6 +78,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ
@IUserDataSyncStoreService private readonly userDataSyncStoreService: IUserDataSyncStoreService,
@IUserDataSyncStoreManagementService private readonly userDataSyncStoreManagementService: IUserDataSyncStoreManagementService,
@IInstantiationService private readonly instantiationService: IInstantiationService,
@IConfigurationService private readonly configurationService: IConfigurationService,
@IUserDataSyncLogService private readonly logService: IUserDataSyncLogService,
@ITelemetryService private readonly telemetryService: ITelemetryService,
@IStorageService private readonly storageService: IStorageService,
@@ -153,7 +155,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ
throw userDataSyncError;
}
return new ManualSyncTask(executionId, manifest, syncHeaders, this.synchronisers, this.logService);
return new ManualSyncTask(executionId, manifest, syncHeaders, this.synchronisers, this.configurationService, this.logService);
}
private recoveredSettings: boolean = false;
@@ -445,6 +447,7 @@ class ManualSyncTask extends Disposable implements IManualSyncTask {
readonly manifest: IUserDataManifest | null,
private readonly syncHeaders: IHeaders,
private readonly synchronisers: IUserDataSynchroniser[],
private readonly configurationService: IConfigurationService,
private readonly logService: IUserDataSyncLogService,
) {
super();
@@ -707,11 +710,12 @@ class ManualSyncTask extends Disposable implements IManualSyncTask {
private async getPreviews(token: CancellationToken): Promise<[SyncResource, ISyncResourcePreview][]> {
const result: [SyncResource, ISyncResourcePreview][] = [];
const remoteUserDataSyncConfiguration: IUserDataSyncConfiguration = await this.getUserDataSyncConfiguration();
for (const synchroniser of this.synchronisers) {
if (token.isCancellationRequested) {
return [];
}
const preview = await synchroniser.preview(this.manifest, this.syncHeaders);
const preview = await synchroniser.preview(this.manifest, remoteUserDataSyncConfiguration, this.syncHeaders);
if (preview) {
result.push(this.toSyncResourcePreview(synchroniser.resource, preview));
}
@@ -719,6 +723,12 @@ class ManualSyncTask extends Disposable implements IManualSyncTask {
return result;
}
private async getUserDataSyncConfiguration(): Promise<IUserDataSyncConfiguration> {
const local = this.configurationService.getValue<IUserDataSyncConfiguration>(USER_DATA_SYNC_CONFIGURATION_SCOPE);
const remote = await (<SettingsSynchroniser>this.synchronisers.find(synchronizer => synchronizer instanceof SettingsSynchroniser)).getRemoteUserDataSyncConfiguration(this.manifest);
return { ...local, ...remote };
}
private toSyncResourcePreview(syncResource: SyncResource, preview: ISyncResourcePreview): [SyncResource, ISyncResourcePreview] {
return [
syncResource,

View File

@@ -175,7 +175,6 @@ export class UserDataSyncStoreClient extends Disposable implements IUserDataSync
const headers: IHeaders = {
'X-Client-Name': `${productService.applicationName}${isWeb ? '-web' : ''}`,
'X-Client-Version': productService.version,
'X-Machine-Id': uuid
};
if (productService.commit) {
headers['X-Client-Commit'] = productService.commit;

View File

@@ -8,6 +8,7 @@ import { VSBuffer } from 'vs/base/common/buffer';
import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle';
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
import { IFileService } from 'vs/platform/files/common/files';
import { ILogService } from 'vs/platform/log/common/log';
import { getKeybindingsContentFromSyncContent, KeybindingsSynchroniser } from 'vs/platform/userDataSync/common/keybindingsSync';
import { IUserDataSyncService, IUserDataSyncStoreService, SyncResource } from 'vs/platform/userDataSync/common/userDataSync';
import { UserDataSyncService } from 'vs/platform/userDataSync/common/userDataSyncService';
@@ -70,8 +71,8 @@ suite('KeybindingsSync', () => {
const lastSyncUserData = await testObject.getLastSyncUserData();
const remoteUserData = await testObject.getRemoteUserData(null);
assert.strictEqual(getKeybindingsContentFromSyncContent(lastSyncUserData!.syncData!.content!, true), '[]');
assert.strictEqual(getKeybindingsContentFromSyncContent(remoteUserData!.syncData!.content!, true), '[]');
assert.strictEqual(getKeybindingsContentFromSyncContent(lastSyncUserData!.syncData!.content!, true, client.instantiationService.get(ILogService)), '[]');
assert.strictEqual(getKeybindingsContentFromSyncContent(remoteUserData!.syncData!.content!, true, client.instantiationService.get(ILogService)), '[]');
assert.strictEqual((await fileService.readFile(keybindingsResource)).value.toString(), '');
});
@@ -95,8 +96,8 @@ suite('KeybindingsSync', () => {
const lastSyncUserData = await testObject.getLastSyncUserData();
const remoteUserData = await testObject.getRemoteUserData(null);
assert.strictEqual(getKeybindingsContentFromSyncContent(lastSyncUserData!.syncData!.content!, true), content);
assert.strictEqual(getKeybindingsContentFromSyncContent(remoteUserData!.syncData!.content!, true), content);
assert.strictEqual(getKeybindingsContentFromSyncContent(lastSyncUserData!.syncData!.content!, true, client.instantiationService.get(ILogService)), content);
assert.strictEqual(getKeybindingsContentFromSyncContent(remoteUserData!.syncData!.content!, true, client.instantiationService.get(ILogService)), content);
assert.strictEqual((await fileService.readFile(keybindingsResource)).value.toString(), content);
});
@@ -110,8 +111,8 @@ suite('KeybindingsSync', () => {
const lastSyncUserData = await testObject.getLastSyncUserData();
const remoteUserData = await testObject.getRemoteUserData(null);
assert.strictEqual(getKeybindingsContentFromSyncContent(lastSyncUserData!.syncData!.content!, true), expectedContent);
assert.strictEqual(getKeybindingsContentFromSyncContent(remoteUserData!.syncData!.content!, true), expectedContent);
assert.strictEqual(getKeybindingsContentFromSyncContent(lastSyncUserData!.syncData!.content!, true, client.instantiationService.get(ILogService)), expectedContent);
assert.strictEqual(getKeybindingsContentFromSyncContent(remoteUserData!.syncData!.content!, true, client.instantiationService.get(ILogService)), expectedContent);
assert.strictEqual((await fileService.readFile(keybindingsResource)).value.toString(), expectedContent);
});
@@ -135,8 +136,8 @@ suite('KeybindingsSync', () => {
const lastSyncUserData = await testObject.getLastSyncUserData();
const remoteUserData = await testObject.getRemoteUserData(null);
assert.strictEqual(getKeybindingsContentFromSyncContent(lastSyncUserData!.syncData!.content!, true), content);
assert.strictEqual(getKeybindingsContentFromSyncContent(remoteUserData!.syncData!.content!, true), content);
assert.strictEqual(getKeybindingsContentFromSyncContent(lastSyncUserData!.syncData!.content!, true, client.instantiationService.get(ILogService)), content);
assert.strictEqual(getKeybindingsContentFromSyncContent(remoteUserData!.syncData!.content!, true, client.instantiationService.get(ILogService)), content);
assert.strictEqual((await fileService.readFile(keybindingsResource)).value.toString(), content);
});
@@ -159,8 +160,8 @@ suite('KeybindingsSync', () => {
const lastSyncUserData = await testObject.getLastSyncUserData();
const remoteUserData = await testObject.getRemoteUserData(null);
assert.strictEqual(getKeybindingsContentFromSyncContent(lastSyncUserData!.syncData!.content!, true), content);
assert.strictEqual(getKeybindingsContentFromSyncContent(remoteUserData!.syncData!.content!, true), content);
assert.strictEqual(getKeybindingsContentFromSyncContent(lastSyncUserData!.syncData!.content!, true, client.instantiationService.get(ILogService)), content);
assert.strictEqual(getKeybindingsContentFromSyncContent(remoteUserData!.syncData!.content!, true, client.instantiationService.get(ILogService)), content);
assert.strictEqual((await fileService.readFile(keybindingsResource)).value.toString(), expectedLocalContent);
});
@@ -183,7 +184,7 @@ suite('KeybindingsSync', () => {
const remoteUserData = await testObject.getRemoteUserData(null);
assert.deepStrictEqual(lastSyncUserData!.ref, remoteUserData.ref);
assert.deepStrictEqual(lastSyncUserData!.syncData, remoteUserData.syncData);
assert.strictEqual(getKeybindingsContentFromSyncContent(lastSyncUserData!.syncData!.content!, true), '[]');
assert.strictEqual(getKeybindingsContentFromSyncContent(lastSyncUserData!.syncData!.content!, true, client.instantiationService.get(ILogService)), '[]');
});
test('test apply remote when keybindings file does not exist', async () => {
@@ -193,7 +194,7 @@ suite('KeybindingsSync', () => {
await fileService.del(keybindingsResource);
}
const preview = (await testObject.preview(await client.manifest()))!;
const preview = (await testObject.preview(await client.manifest(), {}))!;
server.reset();
const content = await testObject.resolveContent(preview.resourcePreviews[0].remoteResource);

View File

@@ -536,7 +536,7 @@ suite('SettingsSync - Manual', () => {
}`;
await updateSettings(settingsContent, client);
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
assert.strictEqual(testObject.status, SyncStatus.Syncing);
preview = await testObject.accept(preview!.resourcePreviews[0].previewResource);
preview = await testObject.apply(false);

View File

@@ -677,7 +677,7 @@ suite('SnippetsSync', () => {
await updateSnippet('html.json', htmlSnippet2, testClient);
await updateSnippet('typescript.json', tsSnippet2, testClient);
let preview = await testObject.preview(await testClient.manifest());
let preview = await testObject.preview(await testClient.manifest(), {});
assert.strictEqual(testObject.status, SyncStatus.Syncing);
assertPreviews(preview!.resourcePreviews,
@@ -703,7 +703,7 @@ suite('SnippetsSync', () => {
await updateSnippet('html.json', htmlSnippet2, testClient);
await updateSnippet('typescript.json', tsSnippet2, testClient);
let preview = await testObject.preview(await testClient.manifest());
let preview = await testObject.preview(await testClient.manifest(), {});
assert.strictEqual(testObject.status, SyncStatus.Syncing);
assertPreviews(preview!.resourcePreviews,
@@ -730,7 +730,7 @@ suite('SnippetsSync', () => {
await updateSnippet('html.json', htmlSnippet2, testClient);
await updateSnippet('typescript.json', tsSnippet2, testClient);
let preview = await testObject.preview(await testClient.manifest());
let preview = await testObject.preview(await testClient.manifest(), {});
assert.strictEqual(testObject.status, SyncStatus.Syncing);
assertPreviews(preview!.resourcePreviews,
@@ -757,7 +757,7 @@ suite('SnippetsSync', () => {
await updateSnippet('html.json', htmlSnippet1, testClient);
await updateSnippet('typescript.json', tsSnippet2, testClient);
let preview = await testObject.preview(await testClient.manifest());
let preview = await testObject.preview(await testClient.manifest(), {});
assert.strictEqual(testObject.status, SyncStatus.Syncing);
assertPreviews(preview!.resourcePreviews,
@@ -786,7 +786,7 @@ suite('SnippetsSync', () => {
await updateSnippet('html.json', htmlSnippet1, testClient);
await updateSnippet('typescript.json', tsSnippet2, testClient);
let preview = await testObject.preview(await testClient.manifest());
let preview = await testObject.preview(await testClient.manifest(), {});
assert.strictEqual(testObject.status, SyncStatus.Syncing);
assertPreviews(preview!.resourcePreviews,
@@ -813,7 +813,7 @@ suite('SnippetsSync', () => {
await updateSnippet('html.json', htmlSnippet2, testClient);
await updateSnippet('typescript.json', tsSnippet2, testClient);
let preview = await testObject.preview(await testClient.manifest());
let preview = await testObject.preview(await testClient.manifest(), {});
assert.strictEqual(testObject.status, SyncStatus.Syncing);
assertPreviews(preview!.resourcePreviews,
@@ -846,7 +846,7 @@ suite('SnippetsSync', () => {
await updateSnippet('html.json', htmlSnippet2, testClient);
await updateSnippet('typescript.json', tsSnippet2, testClient);
let preview = await testObject.preview(await testClient.manifest());
let preview = await testObject.preview(await testClient.manifest(), {});
assert.strictEqual(testObject.status, SyncStatus.Syncing);
assertPreviews(preview!.resourcePreviews,
@@ -881,7 +881,7 @@ suite('SnippetsSync', () => {
await updateSnippet('html.json', htmlSnippet2, testClient);
await updateSnippet('typescript.json', tsSnippet2, testClient);
let preview = await testObject.preview(await testClient.manifest());
let preview = await testObject.preview(await testClient.manifest(), {});
assert.strictEqual(testObject.status, SyncStatus.Syncing);
assertPreviews(preview!.resourcePreviews,
@@ -911,7 +911,7 @@ suite('SnippetsSync', () => {
await updateSnippet('html.json', htmlSnippet2, testClient);
await updateSnippet('typescript.json', tsSnippet2, testClient);
let preview = await testObject.preview(await testClient.manifest());
let preview = await testObject.preview(await testClient.manifest(), {});
assert.strictEqual(testObject.status, SyncStatus.Syncing);
assertPreviews(preview!.resourcePreviews,
@@ -942,7 +942,7 @@ suite('SnippetsSync', () => {
await updateSnippet('html.json', htmlSnippet2, testClient);
await updateSnippet('typescript.json', tsSnippet2, testClient);
let preview = await testObject.preview(await testClient.manifest());
let preview = await testObject.preview(await testClient.manifest(), {});
assert.strictEqual(testObject.status, SyncStatus.Syncing);
assertPreviews(preview!.resourcePreviews,

View File

@@ -14,7 +14,7 @@ import { URI } from 'vs/base/common/uri';
import { IFileService } from 'vs/platform/files/common/files';
import { InMemoryFileSystemProvider } from 'vs/platform/files/common/inMemoryFilesystemProvider';
import { AbstractSynchroniser, IAcceptResult, IMergeResult, IResourcePreview } from 'vs/platform/userDataSync/common/abstractSynchronizer';
import { Change, IRemoteUserData, IResourcePreview as IBaseResourcePreview, IUserDataManifest, IUserDataSyncResourceEnablementService, IUserDataSyncStoreService, MergeState, SyncResource, SyncStatus, USER_DATA_SYNC_SCHEME } from 'vs/platform/userDataSync/common/userDataSync';
import { Change, IRemoteUserData, IResourcePreview as IBaseResourcePreview, IUserDataManifest, IUserDataSyncConfiguration, IUserDataSyncResourceEnablementService, IUserDataSyncStoreService, MergeState, SyncResource, SyncStatus, USER_DATA_SYNC_SCHEME } from 'vs/platform/userDataSync/common/userDataSync';
import { UserDataSyncClient, UserDataSyncTestServer } from 'vs/platform/userDataSync/test/common/userDataSyncClient';
interface ITestResourcePreview extends IResourcePreview {
@@ -41,7 +41,7 @@ class TestSynchroniser extends AbstractSynchroniser {
return super.getLatestRemoteUserData(manifest, lastSyncUserData);
}
protected override async doSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, apply: boolean): Promise<SyncStatus> {
protected override async doSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, apply: boolean, userDataSyncConfiguration: IUserDataSyncConfiguration): Promise<SyncStatus> {
this.cancelled = false;
this.onDoSyncCall.fire();
await this.syncBarrier.wait();
@@ -50,10 +50,10 @@ class TestSynchroniser extends AbstractSynchroniser {
return SyncStatus.Idle;
}
return super.doSync(remoteUserData, lastSyncUserData, apply);
return super.doSync(remoteUserData, lastSyncUserData, apply, userDataSyncConfiguration);
}
protected override async generateSyncPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, isRemoteDataFromCurrentMachine: boolean, token: CancellationToken): Promise<ITestResourcePreview[]> {
protected override async generateSyncPreview(remoteUserData: IRemoteUserData): Promise<ITestResourcePreview[]> {
if (this.syncResult.hasError) {
throw new Error('failed');
}
@@ -161,6 +161,8 @@ class TestSynchroniser extends AbstractSynchroniser {
this.onDidTriggerLocalChangeCall.fire();
}
hasLocalData(): Promise<boolean> { throw new Error('not implemented'); }
getAssociatedResources(): Promise<{ resource: URI, comparableResource: URI }[]> { throw new Error('not implemented'); }
}
suite('TestSynchronizer - Auto Sync', () => {
@@ -506,7 +508,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: false, hasError: false };
testObject.syncBarrier.open();
const preview = await testObject.preview(await client.manifest());
const preview = await testObject.preview(await client.manifest(), {});
assert.deepStrictEqual(testObject.status, SyncStatus.Syncing);
assertPreviews(preview!.resourcePreviews, [testObject.localResource]);
@@ -518,7 +520,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: false, hasError: false };
testObject.syncBarrier.open();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.merge(preview!.resourcePreviews[0].previewResource);
assert.deepStrictEqual(testObject.status, SyncStatus.Syncing);
@@ -532,7 +534,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: false, hasError: false };
testObject.syncBarrier.open();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.accept(preview!.resourcePreviews[0].previewResource);
assert.deepStrictEqual(testObject.status, SyncStatus.Syncing);
@@ -546,7 +548,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: false, hasError: false };
testObject.syncBarrier.open();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.merge(preview!.resourcePreviews[0].previewResource);
preview = await testObject.accept(preview!.resourcePreviews[0].localResource);
@@ -563,7 +565,7 @@ suite('TestSynchronizer - Manual Sync', () => {
await testObject.sync(await client.manifest());
const manifest = await client.manifest();
let preview = await testObject.preview(manifest);
let preview = await testObject.preview(manifest, {});
preview = await testObject.merge(preview!.resourcePreviews[0].previewResource);
preview = await testObject.apply(false);
@@ -584,7 +586,7 @@ suite('TestSynchronizer - Manual Sync', () => {
const manifest = await client.manifest();
const expectedContent = manifest!.latest![testObject.resource];
let preview = await testObject.preview(manifest);
let preview = await testObject.preview(manifest, {});
preview = await testObject.accept(preview!.resourcePreviews[0].previewResource);
preview = await testObject.apply(false);
@@ -603,7 +605,7 @@ suite('TestSynchronizer - Manual Sync', () => {
await testObject.sync(await client.manifest());
const expectedContent = (await client.instantiationService.get(IFileService).readFile(testObject.localResource)).value.toString();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.merge(preview!.resourcePreviews[0].previewResource);
preview = await testObject.accept(preview!.resourcePreviews[0].localResource);
preview = await testObject.apply(false);
@@ -621,7 +623,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: false, hasError: false };
testObject.syncBarrier.open();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.accept(preview!.resourcePreviews[0].previewResource);
assert.deepStrictEqual(testObject.status, SyncStatus.Syncing);
@@ -637,7 +639,7 @@ suite('TestSynchronizer - Manual Sync', () => {
const manifest = await client.manifest();
const expectedContent = manifest!.latest![testObject.resource];
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.accept(preview!.resourcePreviews[0].previewResource);
preview = await testObject.apply(false);
@@ -654,7 +656,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: false, hasError: false };
testObject.syncBarrier.open();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.merge(preview!.resourcePreviews[0].previewResource);
preview = await testObject.discard(preview!.resourcePreviews[0].previewResource);
@@ -669,7 +671,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: false, hasError: false };
testObject.syncBarrier.open();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.merge(preview!.resourcePreviews[0].previewResource);
preview = await testObject.discard(preview!.resourcePreviews[0].previewResource);
preview = await testObject.accept(preview!.resourcePreviews[0].remoteResource);
@@ -685,7 +687,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: false, hasError: false };
testObject.syncBarrier.open();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.accept(preview!.resourcePreviews[0].previewResource);
preview = await testObject.discard(preview!.resourcePreviews[0].previewResource);
@@ -700,7 +702,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: false, hasError: false };
testObject.syncBarrier.open();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.accept(preview!.resourcePreviews[0].previewResource);
preview = await testObject.discard(preview!.resourcePreviews[0].previewResource);
preview = await testObject.accept(preview!.resourcePreviews[0].remoteResource);
@@ -716,7 +718,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: false, hasError: false };
testObject.syncBarrier.open();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.accept(preview!.resourcePreviews[0].previewResource);
preview = await testObject.discard(preview!.resourcePreviews[0].previewResource);
preview = await testObject.merge(preview!.resourcePreviews[0].remoteResource);
@@ -732,7 +734,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: false, hasError: false };
testObject.syncBarrier.open();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.merge(preview!.resourcePreviews[0].previewResource);
preview = await testObject.accept(preview!.resourcePreviews[0].remoteResource);
preview = await testObject.discard(preview!.resourcePreviews[0].previewResource);
@@ -750,7 +752,7 @@ suite('TestSynchronizer - Manual Sync', () => {
await testObject.sync(await client.manifest());
const expectedContent = (await client.instantiationService.get(IFileService).readFile(testObject.localResource)).value.toString();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.merge(preview!.resourcePreviews[0].previewResource);
preview = await testObject.discard(preview!.resourcePreviews[0].previewResource);
preview = await testObject.accept(preview!.resourcePreviews[0].localResource);
@@ -770,7 +772,7 @@ suite('TestSynchronizer - Manual Sync', () => {
await testObject.sync(await client.manifest());
const expectedContent = (await client.instantiationService.get(IFileService).readFile(testObject.localResource)).value.toString();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.merge(preview!.resourcePreviews[0].previewResource);
preview = await testObject.accept(preview!.resourcePreviews[0].remoteResource);
preview = await testObject.discard(preview!.resourcePreviews[0].previewResource);
@@ -792,7 +794,7 @@ suite('TestSynchronizer - Manual Sync', () => {
const manifest = await client.manifest();
const expectedContent = manifest!.latest![testObject.resource];
let preview = await testObject.preview(manifest);
let preview = await testObject.preview(manifest, {});
preview = await testObject.merge(preview!.resourcePreviews[0].previewResource);
preview = await testObject.accept(preview!.resourcePreviews[0].remoteResource);
preview = await testObject.discard(preview!.resourcePreviews[0].previewResource);
@@ -812,7 +814,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: true, hasError: false };
testObject.syncBarrier.open();
const preview = await testObject.preview(await client.manifest());
const preview = await testObject.preview(await client.manifest(), {});
assert.deepStrictEqual(testObject.status, SyncStatus.Syncing);
assertPreviews(preview!.resourcePreviews, [testObject.localResource]);
@@ -824,7 +826,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: true, hasError: false };
testObject.syncBarrier.open();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.merge(preview!.resourcePreviews[0].previewResource);
assert.deepStrictEqual(testObject.status, SyncStatus.HasConflicts);
@@ -838,7 +840,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: true, hasError: false };
testObject.syncBarrier.open();
const preview = await testObject.preview(await client.manifest());
const preview = await testObject.preview(await client.manifest(), {});
await testObject.merge(preview!.resourcePreviews[0].previewResource);
await testObject.discard(preview!.resourcePreviews[0].previewResource);
@@ -853,7 +855,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: true, hasError: false };
testObject.syncBarrier.open();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
await testObject.merge(preview!.resourcePreviews[0].previewResource);
const content = await testObject.resolveContent(preview!.resourcePreviews[0].previewResource);
preview = await testObject.accept(preview!.resourcePreviews[0].previewResource, content);
@@ -872,7 +874,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: true, hasError: false };
const manifest = await client.manifest();
const expectedContent = manifest!.latest![testObject.resource];
let preview = await testObject.preview(manifest);
let preview = await testObject.preview(manifest, {});
await testObject.merge(preview!.resourcePreviews[0].previewResource);
preview = await testObject.accept(preview!.resourcePreviews[0].previewResource);
@@ -891,7 +893,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: true, hasError: false };
testObject.syncBarrier.open();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
const content = await testObject.resolveContent(preview!.resourcePreviews[0].previewResource);
preview = await testObject.accept(preview!.resourcePreviews[0].previewResource, content);
@@ -909,7 +911,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: true, hasError: false };
const manifest = await client.manifest();
const expectedContent = manifest!.latest![testObject.resource];
let preview = await testObject.preview(manifest);
let preview = await testObject.preview(manifest, {});
preview = await testObject.accept(preview!.resourcePreviews[0].previewResource);
preview = await testObject.apply(false);
@@ -927,7 +929,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: true, hasError: false };
testObject.syncBarrier.open();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.merge(preview!.resourcePreviews[0].previewResource);
preview = await testObject.discard(preview!.resourcePreviews[0].previewResource);
@@ -942,7 +944,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: true, hasError: false };
testObject.syncBarrier.open();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.merge(preview!.resourcePreviews[0].previewResource);
preview = await testObject.discard(preview!.resourcePreviews[0].previewResource);
preview = await testObject.accept(preview!.resourcePreviews[0].remoteResource);
@@ -958,7 +960,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: true, hasError: false };
testObject.syncBarrier.open();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.accept(preview!.resourcePreviews[0].previewResource);
preview = await testObject.discard(preview!.resourcePreviews[0].previewResource);
@@ -973,7 +975,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: true, hasError: false };
testObject.syncBarrier.open();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.accept(preview!.resourcePreviews[0].previewResource);
preview = await testObject.discard(preview!.resourcePreviews[0].previewResource);
preview = await testObject.accept(preview!.resourcePreviews[0].remoteResource);
@@ -989,7 +991,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: true, hasError: false };
testObject.syncBarrier.open();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.accept(preview!.resourcePreviews[0].previewResource);
preview = await testObject.discard(preview!.resourcePreviews[0].previewResource);
preview = await testObject.merge(preview!.resourcePreviews[0].remoteResource);
@@ -1005,7 +1007,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: true, hasError: false };
testObject.syncBarrier.open();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.merge(preview!.resourcePreviews[0].previewResource);
preview = await testObject.discard(preview!.resourcePreviews[0].previewResource);
preview = await testObject.merge(preview!.resourcePreviews[0].remoteResource);
@@ -1021,7 +1023,7 @@ suite('TestSynchronizer - Manual Sync', () => {
testObject.syncResult = { hasConflicts: false, hasError: false };
testObject.syncBarrier.open();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.merge(preview!.resourcePreviews[0].previewResource);
preview = await testObject.accept(preview!.resourcePreviews[0].remoteResource);
preview = await testObject.discard(preview!.resourcePreviews[0].previewResource);
@@ -1039,7 +1041,7 @@ suite('TestSynchronizer - Manual Sync', () => {
await testObject.sync(await client.manifest());
const expectedContent = (await client.instantiationService.get(IFileService).readFile(testObject.localResource)).value.toString();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.merge(preview!.resourcePreviews[0].previewResource);
preview = await testObject.discard(preview!.resourcePreviews[0].previewResource);
preview = await testObject.accept(preview!.resourcePreviews[0].localResource);
@@ -1059,7 +1061,7 @@ suite('TestSynchronizer - Manual Sync', () => {
await testObject.sync(await client.manifest());
const expectedContent = (await client.instantiationService.get(IFileService).readFile(testObject.localResource)).value.toString();
let preview = await testObject.preview(await client.manifest());
let preview = await testObject.preview(await client.manifest(), {});
preview = await testObject.merge(preview!.resourcePreviews[0].previewResource);
preview = await testObject.accept(preview!.resourcePreviews[0].remoteResource);
preview = await testObject.discard(preview!.resourcePreviews[0].previewResource);

View File

@@ -16,6 +16,7 @@ import { generateUuid } from 'vs/base/common/uuid';
import { IHeaders, IRequestContext, IRequestOptions } from 'vs/base/parts/request/common/request';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { ConfigurationService } from 'vs/platform/configuration/common/configurationService';
import { IUserConfigurationFileService, UserConfigurationFileService } from 'vs/platform/configuration/common/userConfigurationFileService';
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
import { GlobalExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionEnablementService';
import { DidUninstallExtensionEvent, IExtensionGalleryService, IExtensionManagementService, IGlobalExtensionEnablementService, InstallExtensionResult } from 'vs/platform/extensionManagement/common/extensionManagement';
@@ -88,6 +89,7 @@ export class UserDataSyncClient extends Disposable {
const configurationService = this._register(new ConfigurationService(environmentService.settingsResource, fileService));
await configurationService.initialize();
this.instantiationService.stub(IConfigurationService, configurationService);
this.instantiationService.stub(IUserConfigurationFileService, this.instantiationService.createInstance(UserConfigurationFileService));
this.instantiationService.stub(IRequestService, this.testServer);

View File

@@ -12,6 +12,7 @@ import { DisposableStore } from 'vs/base/common/lifecycle';
import { isWeb } from 'vs/base/common/platform';
import { ConfigurationSyncStore } from 'vs/base/common/product';
import { URI } from 'vs/base/common/uri';
import { runWithFakedTimers } from 'vs/base/test/common/timeTravelScheduler';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
import { IFileService } from 'vs/platform/files/common/files';
@@ -88,7 +89,6 @@ suite('UserDataSyncStoreService', () => {
assert.strictEqual(target.requestsWithAllHeaders.length, 1);
assert.strictEqual(target.requestsWithAllHeaders[0].headers!['X-Client-Name'], `${productService.applicationName}${isWeb ? '-web' : ''}`);
assert.strictEqual(target.requestsWithAllHeaders[0].headers!['X-Client-Version'], productService.version);
assert.notStrictEqual(target.requestsWithAllHeaders[0].headers!['X-Machine-Id'], undefined);
assert.notStrictEqual(target.requestsWithAllHeaders[0].headers!['X-Machine-Session-Id'], undefined);
assert.strictEqual(target.requestsWithAllHeaders[0].headers!['X-User-Session-Id'], undefined);
});
@@ -396,19 +396,22 @@ suite('UserDataSyncStoreService', () => {
});
test('test donotMakeRequestsUntil is reset after retry time is finished', async () => {
const client = disposableStore.add(new UserDataSyncClient(new UserDataSyncTestServer(1, 0.25)));
await client.setUp();
const testObject = client.instantiationService.get(IUserDataSyncStoreService);
return runWithFakedTimers({ useFakeTimers: true }, async () => {
const client = disposableStore.add(new UserDataSyncClient(new UserDataSyncTestServer(1, 0.25)));
await client.setUp();
const testObject = client.instantiationService.get(IUserDataSyncStoreService);
await testObject.manifest(null);
try {
await testObject.manifest(null);
} catch (e) { }
try {
await testObject.manifest(null);
assert.fail('should fail');
} catch (e) { }
const promise = Event.toPromise(testObject.onDidChangeDonotMakeRequestsUntil);
await timeout(300);
await promise;
assert.ok(!testObject.donotMakeRequestsUntil);
const promise = Event.toPromise(testObject.onDidChangeDonotMakeRequestsUntil);
await timeout(300);
await promise;
assert.ok(!testObject.donotMakeRequestsUntil);
});
});
test('test donotMakeRequestsUntil is retrieved', async () => {
@@ -426,18 +429,21 @@ suite('UserDataSyncStoreService', () => {
});
test('test donotMakeRequestsUntil is checked and reset after retreived', async () => {
const client = disposableStore.add(new UserDataSyncClient(new UserDataSyncTestServer(1, 0.25)));
await client.setUp();
const testObject = client.instantiationService.get(IUserDataSyncStoreService);
return runWithFakedTimers({ useFakeTimers: true }, async () => {
const client = disposableStore.add(new UserDataSyncClient(new UserDataSyncTestServer(1, 0.25)));
await client.setUp();
const testObject = client.instantiationService.get(IUserDataSyncStoreService);
await testObject.manifest(null);
try {
await testObject.manifest(null);
} catch (e) { }
try {
await testObject.manifest(null);
assert.fail('should fail');
} catch (e) { }
await timeout(300);
const target = disposableStore.add(client.instantiationService.createInstance(UserDataSyncStoreService));
assert.ok(!target.donotMakeRequestsUntil);
await timeout(300);
const target = disposableStore.add(client.instantiationService.createInstance(UserDataSyncStoreService));
assert.ok(!target.donotMakeRequestsUntil);
});
});
test('test read resource request handles 304', async () => {
@@ -479,16 +485,16 @@ suite('UserDataSyncRequestsSession', () => {
});
test('requests are handled after session is expired', async () => {
const testObject = new RequestsSession(1, 500, requestService, new NullLogService());
const testObject = new RequestsSession(1, 100, requestService, new NullLogService());
await testObject.request('url', {}, CancellationToken.None);
await timeout(600);
await timeout(125);
await testObject.request('url', {}, CancellationToken.None);
});
test('too many requests are thrown after session is expired', async () => {
const testObject = new RequestsSession(1, 500, requestService, new NullLogService());
const testObject = new RequestsSession(1, 100, requestService, new NullLogService());
await testObject.request('url', {}, CancellationToken.None);
await timeout(600);
await timeout(125);
await testObject.request('url', {}, CancellationToken.None);
try {