Skip to content

Commit 71bb111

Browse files
committed
microsoft#93960 Ability to compare globalState with current state
1 parent 5deb015 commit 71bb111

2 files changed

Lines changed: 23 additions & 6 deletions

File tree

src/vs/platform/userDataSync/common/extensionsSync.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ interface ILastSyncUserData extends IRemoteUserData {
3939

4040
export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUserDataSynchroniser {
4141

42-
private static readonly EXTENSIONS_DATA_URI = URI.from({ scheme: USER_DATA_SYNC_SCHEME, authority: 'extensions', path: `/data.json` });
42+
private static readonly EXTENSIONS_DATA_URI = URI.from({ scheme: USER_DATA_SYNC_SCHEME, authority: 'extensions', path: `/current.json` });
4343
protected readonly version: number = 2;
4444
protected isEnabled(): boolean { return super.isEnabled() && this.extensionGalleryService.isEnabled(); }
4545

src/vs/platform/userDataSync/common/globalStateSync.ts

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { SyncStatus, IUserDataSyncStoreService, IUserDataSyncLogService, IGlobalState, SyncResource, IUserDataSynchroniser, IUserDataSyncEnablementService, IUserDataSyncBackupStoreService, ISyncResourceHandle, IStorageValue, ISyncPreviewResult } from 'vs/platform/userDataSync/common/userDataSync';
6+
import { SyncStatus, IUserDataSyncStoreService, IUserDataSyncLogService, IGlobalState, SyncResource, IUserDataSynchroniser, IUserDataSyncEnablementService, IUserDataSyncBackupStoreService, ISyncResourceHandle, IStorageValue, ISyncPreviewResult, USER_DATA_SYNC_SCHEME } from 'vs/platform/userDataSync/common/userDataSync';
77
import { VSBuffer } from 'vs/base/common/buffer';
88
import { Event } from 'vs/base/common/event';
99
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
10-
import { dirname, joinPath, basename } from 'vs/base/common/resources';
10+
import { dirname, joinPath, basename, isEqual } from 'vs/base/common/resources';
1111
import { IFileService } from 'vs/platform/files/common/files';
1212
import { IStringDictionary } from 'vs/base/common/collections';
1313
import { edit } from 'vs/platform/userDataSync/common/content';
@@ -41,6 +41,7 @@ interface ILastSyncUserData extends IRemoteUserData {
4141

4242
export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUserDataSynchroniser {
4343

44+
private static readonly GLOBAL_STATE_DATA_URI = URI.from({ scheme: USER_DATA_SYNC_SCHEME, authority: 'globalState', path: `/current.json` });
4445
protected readonly version: number = 1;
4546

4647
constructor(
@@ -139,28 +140,44 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs
139140
async stop(): Promise<void> { }
140141

141142
async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI, comparableResource?: URI }[]> {
142-
return [{ resource: joinPath(uri, 'globalState.json') }];
143+
return [{ resource: joinPath(uri, 'globalState.json'), comparableResource: GlobalStateSynchroniser.GLOBAL_STATE_DATA_URI }];
143144
}
144145

145146
async resolveContent(uri: URI): Promise<string | null> {
147+
if (isEqual(uri, GlobalStateSynchroniser.GLOBAL_STATE_DATA_URI)) {
148+
const localGlobalState = await this.getLocalGlobalState();
149+
return this.format(localGlobalState);
150+
}
151+
146152
let content = await super.resolveContent(uri);
147153
if (content) {
148154
return content;
149155
}
156+
150157
content = await super.resolveContent(dirname(uri));
151158
if (content) {
152159
const syncData = this.parseSyncData(content);
153160
if (syncData) {
154161
switch (basename(uri)) {
155162
case 'globalState.json':
156-
const edits = format(syncData.content, undefined, {});
157-
return applyEdits(syncData.content, edits);
163+
return this.format(JSON.parse(syncData.content));
158164
}
159165
}
160166
}
167+
161168
return null;
162169
}
163170

171+
private format(globalState: IGlobalState): string {
172+
const storageKeys = Object.keys(globalState.storage).sort();
173+
const storage: IStringDictionary<IStorageValue> = {};
174+
storageKeys.forEach(key => storage[key] = globalState.storage[key]);
175+
globalState.storage = storage;
176+
const content = JSON.stringify(globalState);
177+
const edits = format(content, undefined, {});
178+
return applyEdits(content, edits);
179+
}
180+
164181
async acceptConflict(conflict: URI, content: string): Promise<void> {
165182
throw new Error(`${this.syncResourceLogLabel}: Conflicts should not occur`);
166183
}

0 commit comments

Comments
 (0)