mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 10:58:30 -05:00
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:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -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 '{}';
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user