Skip to content

Commit 7f3b2e5

Browse files
committed
microsoft#104626 Use extUri for resource functions
1 parent 264d2d2 commit 7f3b2e5

6 files changed

Lines changed: 116 additions & 117 deletions

File tree

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

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { Disposable } from 'vs/base/common/lifecycle';
7-
import { IFileService, IFileContent, FileChangesEvent, FileOperationResult, FileOperationError } from 'vs/platform/files/common/files';
7+
import { IFileService, IFileContent, FileChangesEvent, FileOperationResult, FileOperationError, FileSystemProviderCapabilities } from 'vs/platform/files/common/files';
88
import { VSBuffer } from 'vs/base/common/buffer';
99
import { URI } from 'vs/base/common/uri';
1010
import {
@@ -13,7 +13,7 @@ import {
1313
IUserDataManifest, ISyncData, IRemoteUserData, PREVIEW_DIR_NAME, IResourcePreview as IBaseResourcePreview, Change, MergeState, IUserDataInitializer
1414
} from 'vs/platform/userDataSync/common/userDataSync';
1515
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
16-
import { joinPath, dirname, isEqual, basename } from 'vs/base/common/resources';
16+
import { IExtUri, extUri, extUriIgnorePathCase } from 'vs/base/common/resources';
1717
import { CancelablePromise, RunOnceScheduler, createCancelablePromise } from 'vs/base/common/async';
1818
import { Emitter, Event } from 'vs/base/common/event';
1919
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
@@ -53,8 +53,8 @@ function isSyncData(thing: any): thing is ISyncData {
5353
return false;
5454
}
5555

56-
function getLastSyncResourceUri(syncResource: SyncResource, environmentService: IEnvironmentService): URI {
57-
return joinPath(environmentService.userDataSyncHome, syncResource, `lastSync${syncResource}.json`);
56+
function getLastSyncResourceUri(syncResource: SyncResource, environmentService: IEnvironmentService, extUri: IExtUri): URI {
57+
return extUri.joinPath(environmentService.userDataSyncHome, syncResource, `lastSync${syncResource}.json`);
5858
}
5959

6060
export interface IResourcePreview {
@@ -100,6 +100,7 @@ export abstract class AbstractSynchroniser extends Disposable {
100100

101101
protected readonly syncFolder: URI;
102102
protected readonly syncPreviewFolder: URI;
103+
protected readonly extUri: IExtUri;
103104
private readonly currentMachineIdPromise: Promise<string>;
104105

105106
private _status: SyncStatus = SyncStatus.Idle;
@@ -135,9 +136,10 @@ export abstract class AbstractSynchroniser extends Disposable {
135136
) {
136137
super();
137138
this.syncResourceLogLabel = uppercaseFirstLetter(this.resource);
138-
this.syncFolder = joinPath(environmentService.userDataSyncHome, resource);
139-
this.syncPreviewFolder = joinPath(this.syncFolder, PREVIEW_DIR_NAME);
140-
this.lastSyncResource = getLastSyncResourceUri(resource, environmentService);
139+
this.extUri = this.fileService.hasCapability(environmentService.userDataSyncHome, FileSystemProviderCapabilities.PathCaseSensitive) ? extUri : extUriIgnorePathCase;
140+
this.syncFolder = this.extUri.joinPath(environmentService.userDataSyncHome, resource);
141+
this.syncPreviewFolder = this.extUri.joinPath(this.syncFolder, PREVIEW_DIR_NAME);
142+
this.lastSyncResource = getLastSyncResourceUri(resource, environmentService, this.extUri);
141143
this.currentMachineIdPromise = getServiceMachineId(environmentService, fileService, storageService);
142144
}
143145

@@ -423,7 +425,7 @@ export abstract class AbstractSynchroniser extends Disposable {
423425

424426
let preview = await this.syncPreviewPromise;
425427
const index = preview.resourcePreviews.findIndex(({ localResource, remoteResource, previewResource }) =>
426-
isEqual(localResource, resource) || isEqual(remoteResource, resource) || isEqual(previewResource, resource));
428+
this.extUri.isEqual(localResource, resource) || this.extUri.isEqual(remoteResource, resource) || this.extUri.isEqual(previewResource, resource));
427429
if (index === -1) {
428430
return;
429431
}
@@ -483,7 +485,7 @@ export abstract class AbstractSynchroniser extends Disposable {
483485

484486
private updateConflicts(resourcePreviews: IEditableResourcePreview[]): void {
485487
const conflicts = resourcePreviews.filter(({ mergeState }) => mergeState === MergeState.Conflict);
486-
if (!equals(this._conflicts, conflicts, (a, b) => isEqual(a.previewResource, b.previewResource))) {
488+
if (!equals(this._conflicts, conflicts, (a, b) => this.extUri.isEqual(a.previewResource, b.previewResource))) {
487489
this._conflicts = conflicts;
488490
this._onDidChangeConflicts.fire(conflicts);
489491
}
@@ -513,8 +515,8 @@ export abstract class AbstractSynchroniser extends Disposable {
513515
}
514516

515517
async getMachineId({ uri }: ISyncResourceHandle): Promise<string | undefined> {
516-
const ref = basename(uri);
517-
if (isEqual(uri, this.toRemoteBackupResource(ref))) {
518+
const ref = this.extUri.basename(uri);
519+
if (this.extUri.isEqual(uri, this.toRemoteBackupResource(ref))) {
518520
const { content } = await this.getUserData(ref);
519521
if (content) {
520522
const syncData = this.parseSyncData(content);
@@ -525,12 +527,12 @@ export abstract class AbstractSynchroniser extends Disposable {
525527
}
526528

527529
async resolveContent(uri: URI): Promise<string | null> {
528-
const ref = basename(uri);
529-
if (isEqual(uri, this.toRemoteBackupResource(ref))) {
530+
const ref = this.extUri.basename(uri);
531+
if (this.extUri.isEqual(uri, this.toRemoteBackupResource(ref))) {
530532
const { content } = await this.getUserData(ref);
531533
return content;
532534
}
533-
if (isEqual(uri, this.toLocalBackupResource(ref))) {
535+
if (this.extUri.isEqual(uri, this.toLocalBackupResource(ref))) {
534536
return this.userDataSyncBackupStoreService.resolveContent(this.resource, ref);
535537
}
536538
return null;
@@ -540,13 +542,13 @@ export abstract class AbstractSynchroniser extends Disposable {
540542
const syncPreview = this.syncPreviewPromise ? await this.syncPreviewPromise : null;
541543
if (syncPreview) {
542544
for (const resourcePreview of syncPreview.resourcePreviews) {
543-
if (isEqual(resourcePreview.acceptedResource, uri)) {
545+
if (this.extUri.isEqual(resourcePreview.acceptedResource, uri)) {
544546
return resourcePreview.acceptResult ? resourcePreview.acceptResult.content : null;
545547
}
546-
if (isEqual(resourcePreview.remoteResource, uri)) {
548+
if (this.extUri.isEqual(resourcePreview.remoteResource, uri)) {
547549
return resourcePreview.remoteContent;
548550
}
549-
if (isEqual(resourcePreview.localResource, uri)) {
551+
if (this.extUri.isEqual(resourcePreview.localResource, uri)) {
550552
return resourcePreview.localContent;
551553
}
552554
}
@@ -727,7 +729,7 @@ export abstract class AbstractFileSynchroniser extends AbstractSynchroniser {
727729
@IConfigurationService configurationService: IConfigurationService,
728730
) {
729731
super(resource, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncResourceEnablementService, telemetryService, logService, configurationService);
730-
this._register(this.fileService.watch(dirname(file)));
732+
this._register(this.fileService.watch(this.extUri.dirname(file)));
731733
this._register(this.fileService.onDidFilesChange(e => this.onFileChanges(e)));
732734
}
733735

@@ -804,6 +806,7 @@ export abstract class AbstractJsonFileSynchroniser extends AbstractFileSynchroni
804806

805807
export abstract class AbstractInitializer implements IUserDataInitializer {
806808

809+
protected readonly extUri: IExtUri;
807810
private readonly lastSyncResource: URI;
808811

809812
constructor(
@@ -812,7 +815,8 @@ export abstract class AbstractInitializer implements IUserDataInitializer {
812815
@IUserDataSyncLogService protected readonly logService: IUserDataSyncLogService,
813816
@IFileService protected readonly fileService: IFileService,
814817
) {
815-
this.lastSyncResource = getLastSyncResourceUri(this.resource, environmentService);
818+
this.extUri = this.fileService.hasCapability(environmentService.userDataSyncHome, FileSystemProviderCapabilities.PathCaseSensitive) ? extUri : extUriIgnorePathCase;
819+
this.lastSyncResource = getLastSyncResourceUri(this.resource, environmentService, extUri);
816820
}
817821

818822
async initialize({ ref, content }: IUserData): Promise<void> {

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

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import { merge, getIgnoredExtensions } from 'vs/platform/userDataSync/common/ext
1818
import { AbstractInitializer, AbstractSynchroniser, IAcceptResult, IMergeResult, IResourcePreview } from 'vs/platform/userDataSync/common/abstractSynchronizer';
1919
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
2020
import { URI } from 'vs/base/common/uri';
21-
import { joinPath, dirname, basename, isEqual } from 'vs/base/common/resources';
2221
import { format } from 'vs/base/common/jsonFormatter';
2322
import { applyEdits } from 'vs/base/common/jsonEdit';
2423
import { compare } from 'vs/base/common/strings';
@@ -82,7 +81,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse
8281
protected readonly version: number = 4;
8382

8483
protected isEnabled(): boolean { return super.isEnabled() && this.extensionGalleryService.isEnabled(); }
85-
private readonly previewResource: URI = joinPath(this.syncPreviewFolder, 'extensions.json');
84+
private readonly previewResource: URI = this.extUri.joinPath(this.syncPreviewFolder, 'extensions.json');
8685
private readonly localResource: URI = this.previewResource.with({ scheme: USER_DATA_SYNC_SCHEME, authority: 'local' });
8786
private readonly remoteResource: URI = this.previewResource.with({ scheme: USER_DATA_SYNC_SCHEME, authority: 'remote' });
8887
private readonly acceptedResource: URI = this.previewResource.with({ scheme: USER_DATA_SYNC_SCHEME, authority: 'accepted' });
@@ -183,17 +182,17 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse
183182
protected async getAcceptResult(resourcePreview: IExtensionResourcePreview, resource: URI, content: string | null | undefined, token: CancellationToken): Promise<IExtensionResourceMergeResult> {
184183

185184
/* Accept local resource */
186-
if (isEqual(resource, this.localResource)) {
185+
if (this.extUri.isEqual(resource, this.localResource)) {
187186
return this.acceptLocal(resourcePreview);
188187
}
189188

190189
/* Accept remote resource */
191-
if (isEqual(resource, this.remoteResource)) {
190+
if (this.extUri.isEqual(resource, this.remoteResource)) {
192191
return this.acceptRemote(resourcePreview);
193192
}
194193

195194
/* Accept preview resource */
196-
if (isEqual(resource, this.previewResource)) {
195+
if (this.extUri.isEqual(resource, this.previewResource)) {
197196
return resourcePreview.previewResult;
198197
}
199198

@@ -272,18 +271,18 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse
272271
}
273272

274273
async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI, comparableResource: URI }[]> {
275-
return [{ resource: joinPath(uri, 'extensions.json'), comparableResource: ExtensionsSynchroniser.EXTENSIONS_DATA_URI }];
274+
return [{ resource: this.extUri.joinPath(uri, 'extensions.json'), comparableResource: ExtensionsSynchroniser.EXTENSIONS_DATA_URI }];
276275
}
277276

278277
async resolveContent(uri: URI): Promise<string | null> {
279-
if (isEqual(uri, ExtensionsSynchroniser.EXTENSIONS_DATA_URI)) {
278+
if (this.extUri.isEqual(uri, ExtensionsSynchroniser.EXTENSIONS_DATA_URI)) {
280279
const installedExtensions = await this.extensionManagementService.getInstalled();
281280
const ignoredExtensions = getIgnoredExtensions(installedExtensions, this.configurationService);
282281
const localExtensions = this.getLocalExtensions(installedExtensions).filter(e => !ignoredExtensions.some(id => areSameExtensions({ id }, e.identifier)));
283282
return this.format(localExtensions);
284283
}
285284

286-
if (isEqual(this.remoteResource, uri) || isEqual(this.localResource, uri) || isEqual(this.acceptedResource, uri)) {
285+
if (this.extUri.isEqual(this.remoteResource, uri) || this.extUri.isEqual(this.localResource, uri) || this.extUri.isEqual(this.acceptedResource, uri)) {
287286
return this.resolvePreviewContent(uri);
288287
}
289288

@@ -292,11 +291,11 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse
292291
return content;
293292
}
294293

295-
content = await super.resolveContent(dirname(uri));
294+
content = await super.resolveContent(this.extUri.dirname(uri));
296295
if (content) {
297296
const syncData = this.parseSyncData(content);
298297
if (syncData) {
299-
switch (basename(uri)) {
298+
switch (this.extUri.basename(uri)) {
300299
case 'extensions.json':
301300
return this.format(this.parseExtensions(syncData));
302301
}

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

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {
1010
import { VSBuffer } from 'vs/base/common/buffer';
1111
import { Event } from 'vs/base/common/event';
1212
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
13-
import { dirname, joinPath, basename, isEqual } from 'vs/base/common/resources';
1413
import { IFileService } from 'vs/platform/files/common/files';
1514
import { IStringDictionary } from 'vs/base/common/collections';
1615
import { edit } from 'vs/platform/userDataSync/common/content';
@@ -49,7 +48,7 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs
4948

5049
private static readonly GLOBAL_STATE_DATA_URI = URI.from({ scheme: USER_DATA_SYNC_SCHEME, authority: 'globalState', path: `/globalState.json` });
5150
protected readonly version: number = 1;
52-
private readonly previewResource: URI = joinPath(this.syncPreviewFolder, 'globalState.json');
51+
private readonly previewResource: URI = this.extUri.joinPath(this.syncPreviewFolder, 'globalState.json');
5352
private readonly localResource: URI = this.previewResource.with({ scheme: USER_DATA_SYNC_SCHEME, authority: 'local' });
5453
private readonly remoteResource: URI = this.previewResource.with({ scheme: USER_DATA_SYNC_SCHEME, authority: 'remote' });
5554
private readonly acceptedResource: URI = this.previewResource.with({ scheme: USER_DATA_SYNC_SCHEME, authority: 'accepted' });
@@ -67,7 +66,7 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs
6766
@IStorageKeysSyncRegistryService private readonly storageKeysSyncRegistryService: IStorageKeysSyncRegistryService,
6867
) {
6968
super(SyncResource.GlobalState, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncResourceEnablementService, telemetryService, logService, configurationService);
70-
this._register(this.fileService.watch(dirname(this.environmentService.argvResource)));
69+
this._register(this.fileService.watch(this.extUri.dirname(this.environmentService.argvResource)));
7170
this._register(
7271
Event.any(
7372
/* Locale change */
@@ -123,17 +122,17 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs
123122
protected async getAcceptResult(resourcePreview: IGlobalStateResourcePreview, resource: URI, content: string | null | undefined, token: CancellationToken): Promise<IGlobalStateResourceMergeResult> {
124123

125124
/* Accept local resource */
126-
if (isEqual(resource, this.localResource)) {
125+
if (this.extUri.isEqual(resource, this.localResource)) {
127126
return this.acceptLocal(resourcePreview);
128127
}
129128

130129
/* Accept remote resource */
131-
if (isEqual(resource, this.remoteResource)) {
130+
if (this.extUri.isEqual(resource, this.remoteResource)) {
132131
return this.acceptRemote(resourcePreview);
133132
}
134133

135134
/* Accept preview resource */
136-
if (isEqual(resource, this.previewResource)) {
135+
if (this.extUri.isEqual(resource, this.previewResource)) {
137136
return resourcePreview.previewResult;
138137
}
139138

@@ -205,16 +204,16 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs
205204
}
206205

207206
async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI, comparableResource: URI }[]> {
208-
return [{ resource: joinPath(uri, 'globalState.json'), comparableResource: GlobalStateSynchroniser.GLOBAL_STATE_DATA_URI }];
207+
return [{ resource: this.extUri.joinPath(uri, 'globalState.json'), comparableResource: GlobalStateSynchroniser.GLOBAL_STATE_DATA_URI }];
209208
}
210209

211210
async resolveContent(uri: URI): Promise<string | null> {
212-
if (isEqual(uri, GlobalStateSynchroniser.GLOBAL_STATE_DATA_URI)) {
211+
if (this.extUri.isEqual(uri, GlobalStateSynchroniser.GLOBAL_STATE_DATA_URI)) {
213212
const localGlobalState = await this.getLocalGlobalState();
214213
return this.format(localGlobalState);
215214
}
216215

217-
if (isEqual(this.remoteResource, uri) || isEqual(this.localResource, uri) || isEqual(this.acceptedResource, uri)) {
216+
if (this.extUri.isEqual(this.remoteResource, uri) || this.extUri.isEqual(this.localResource, uri) || this.extUri.isEqual(this.acceptedResource, uri)) {
218217
return this.resolvePreviewContent(uri);
219218
}
220219

@@ -223,11 +222,11 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs
223222
return content;
224223
}
225224

226-
content = await super.resolveContent(dirname(uri));
225+
content = await super.resolveContent(this.extUri.dirname(uri));
227226
if (content) {
228227
const syncData = this.parseSyncData(content);
229228
if (syncData) {
230-
switch (basename(uri)) {
229+
switch (this.extUri.basename(uri)) {
231230
case 'globalState.json':
232231
return this.format(JSON.parse(syncData.content));
233232
}

0 commit comments

Comments
 (0)