@@ -21,12 +21,13 @@ import { localize } from 'vs/nls';
21
21
import { IConfigurationService } from 'vs/platform/configuration/common/configuration' ;
22
22
import { IEnvironmentService } from 'vs/platform/environment/common/environment' ;
23
23
import { FileChangesEvent , FileOperationError , FileOperationResult , IFileContent , IFileService , toFileOperationResult } from 'vs/platform/files/common/files' ;
24
+ import { ILogService } from 'vs/platform/log/common/log' ;
24
25
import { getServiceMachineId } from 'vs/platform/externalServices/common/serviceMachineId' ;
25
26
import { IStorageService , StorageScope , StorageTarget } from 'vs/platform/storage/common/storage' ;
26
27
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry' ;
27
28
import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity' ;
28
- import { Change , getLastSyncResourceUri , IRemoteUserData , IResourcePreview as IBaseResourcePreview , ISyncData , IUserDataSyncResourcePreview as IBaseSyncResourcePreview , IUserData , IUserDataSyncBackupStoreService , IUserDataSyncConfiguration , IUserDataSynchroniser , IUserDataSyncLogService , IUserDataSyncEnablementService , IUserDataSyncStoreService , IUserDataSyncUtilService , MergeState , PREVIEW_DIR_NAME , SyncResource , SyncStatus , UserDataSyncError , UserDataSyncErrorCode , USER_DATA_SYNC_CONFIGURATION_SCOPE , USER_DATA_SYNC_SCHEME , IUserDataResourceManifest , getPathSegments , IUserDataSyncResourceConflicts , IUserDataSyncResource } from 'vs/platform/userDataSync/common/userDataSync' ;
29
- import { IUserDataProfile } from 'vs/platform/userDataProfile/common/userDataProfile' ;
29
+ import { Change , getLastSyncResourceUri , IRemoteUserData , IResourcePreview as IBaseResourcePreview , ISyncData , IUserDataSyncResourcePreview as IBaseSyncResourcePreview , IUserData , IUserDataInitializer , IUserDataSyncBackupStoreService , IUserDataSyncConfiguration , IUserDataSynchroniser , IUserDataSyncLogService , IUserDataSyncEnablementService , IUserDataSyncStoreService , IUserDataSyncUtilService , MergeState , PREVIEW_DIR_NAME , SyncResource , SyncStatus , UserDataSyncError , UserDataSyncErrorCode , USER_DATA_SYNC_CONFIGURATION_SCOPE , USER_DATA_SYNC_SCHEME , IUserDataResourceManifest , getPathSegments , IUserDataSyncResourceConflicts , IUserDataSyncResource } from 'vs/platform/userDataSync/common/userDataSync' ;
30
+ import { IUserDataProfile , IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile' ;
30
31
31
32
type IncompatibleSyncSourceClassification = {
32
33
owner : 'sandy081' ;
@@ -913,3 +914,71 @@ export abstract class AbstractJsonFileSynchroniser extends AbstractFileSynchroni
913
914
}
914
915
915
916
}
917
+
918
+ export abstract class AbstractInitializer implements IUserDataInitializer {
919
+
920
+ protected readonly extUri : IExtUri ;
921
+ private readonly lastSyncResource : URI ;
922
+
923
+ constructor (
924
+ readonly resource : SyncResource ,
925
+ @IUserDataProfilesService protected readonly userDataProfilesService : IUserDataProfilesService ,
926
+ @IEnvironmentService protected readonly environmentService : IEnvironmentService ,
927
+ @ILogService protected readonly logService : ILogService ,
928
+ @IFileService protected readonly fileService : IFileService ,
929
+ @IStorageService protected readonly storageService : IStorageService ,
930
+ @IUriIdentityService uriIdentityService : IUriIdentityService ,
931
+ ) {
932
+ this . extUri = uriIdentityService . extUri ;
933
+ this . lastSyncResource = getLastSyncResourceUri ( undefined , this . resource , environmentService , this . extUri ) ;
934
+ }
935
+
936
+ async initialize ( { ref, content } : IUserData ) : Promise < void > {
937
+ if ( ! content ) {
938
+ this . logService . info ( 'Remote content does not exist.' , this . resource ) ;
939
+ return ;
940
+ }
941
+
942
+ const syncData = this . parseSyncData ( content ) ;
943
+ if ( ! syncData ) {
944
+ return ;
945
+ }
946
+
947
+ try {
948
+ await this . doInitialize ( { ref, syncData } ) ;
949
+ } catch ( error ) {
950
+ this . logService . error ( error ) ;
951
+ }
952
+ }
953
+
954
+ private parseSyncData ( content : string ) : ISyncData | undefined {
955
+ try {
956
+ const syncData : ISyncData = JSON . parse ( content ) ;
957
+ if ( isSyncData ( syncData ) ) {
958
+ return syncData ;
959
+ }
960
+ } catch ( error ) {
961
+ this . logService . error ( error ) ;
962
+ }
963
+ this . logService . info ( 'Cannot parse sync data as it is not compatible with the current version.' , this . resource ) ;
964
+ return undefined ;
965
+ }
966
+
967
+ protected async updateLastSyncUserData ( lastSyncRemoteUserData : IRemoteUserData , additionalProps : IStringDictionary < any > = { } ) : Promise < void > {
968
+ if ( additionalProps [ 'ref' ] || additionalProps [ 'version' ] ) {
969
+ throw new Error ( 'Cannot have core properties as additional' ) ;
970
+ }
971
+
972
+ const lastSyncUserDataState : ILastSyncUserDataState = {
973
+ ref : lastSyncRemoteUserData . ref ,
974
+ version : undefined ,
975
+ ...additionalProps
976
+ } ;
977
+
978
+ this . storageService . store ( `${ this . resource } .lastSyncUserData` , JSON . stringify ( lastSyncUserDataState ) , StorageScope . APPLICATION , StorageTarget . MACHINE ) ;
979
+ await this . fileService . writeFile ( this . lastSyncResource , VSBuffer . fromString ( JSON . stringify ( lastSyncRemoteUserData ) ) ) ;
980
+ }
981
+
982
+ protected abstract doInitialize ( remoteUserData : IRemoteUserData ) : Promise < void > ;
983
+
984
+ }
0 commit comments