From ab8b35b4cff220dbc5b48b55318bf64b76a7ef37 Mon Sep 17 00:00:00 2001 From: Dimitar Kerezov Date: Thu, 22 Feb 2018 13:35:09 +0200 Subject: [PATCH] fix(livesync): delete files during livesync --- lib/definitions/livesync.d.ts | 2 +- lib/definitions/platform.d.ts | 12 ++++++++-- lib/services/app-files-updater.ts | 29 ++++++++++++++++------- lib/services/livesync/livesync-service.ts | 5 +++- lib/services/platform-service.ts | 4 +++- lib/services/prepare-platform-service.ts | 11 ++++++--- 6 files changed, 46 insertions(+), 17 deletions(-) diff --git a/lib/definitions/livesync.d.ts b/lib/definitions/livesync.d.ts index 7d4c9bd7e5..c051909688 100644 --- a/lib/definitions/livesync.d.ts +++ b/lib/definitions/livesync.d.ts @@ -152,7 +152,7 @@ interface IProjectDataComposition { /** * Desribes object that can be passed to ensureLatestAppPackageIsInstalledOnDevice method. */ -interface IEnsureLatestAppPackageIsInstalledOnDeviceOptions extends IProjectDataComposition, IEnvOptions, IBundle, IRelease, ISkipNativeCheckOptional { +interface IEnsureLatestAppPackageIsInstalledOnDeviceOptions extends IProjectDataComposition, IEnvOptions, IBundle, IRelease, ISkipNativeCheckOptional, IOptionalFilesToRemove, IOptionalFilesToSync { device: Mobile.IDevice; preparedPlatforms: string[]; rebuiltInformation: ILiveSyncBuildInfo[]; diff --git a/lib/definitions/platform.d.ts b/lib/definitions/platform.d.ts index 1dd12ce554..59147db578 100644 --- a/lib/definitions/platform.d.ts +++ b/lib/definitions/platform.d.ts @@ -296,7 +296,7 @@ interface IPlatformDataComposition { platformData: IPlatformData; } -interface ICopyAppFilesData extends IProjectDataComposition, IAppFilesUpdaterOptionsComposition, IPlatformDataComposition, IOptionalFilesToSync { } +interface ICopyAppFilesData extends IProjectDataComposition, IAppFilesUpdaterOptionsComposition, IPlatformDataComposition, IOptionalFilesToSync, IOptionalFilesToRemove { } interface IPreparePlatformService { addPlatform(info: IAddPlatformInfo): Promise; @@ -329,10 +329,18 @@ interface IOptionalFilesToSync { filesToSync?: string[]; } -interface IPreparePlatformInfoBase extends IPlatform, IAppFilesUpdaterOptionsComposition, IProjectDataComposition, IEnvOptions, IOptionalFilesToSync { +interface IOptionalFilesToRemove { + filesToRemove?: string[]; +} + +interface IPreparePlatformInfoBase extends IPlatform, IAppFilesUpdaterOptionsComposition, IProjectDataComposition, IEnvOptions, IOptionalFilesToSync, IOptionalFilesToRemove { nativePrepare?: INativePrepare; } interface IDeployPlatformInfo extends IPlatform, IAppFilesUpdaterOptionsComposition, IProjectDataComposition, IPlatformConfig, IEnvOptions { deployOptions: IDeployPlatformOptions } + +interface IUpdateAppOptions extends IOptionalFilesToSync, IOptionalFilesToRemove { + beforeCopyAction: (sourceFiles: string[]) => void; +} diff --git a/lib/services/app-files-updater.ts b/lib/services/app-files-updater.ts index a9762ea664..885da78f20 100644 --- a/lib/services/app-files-updater.ts +++ b/lib/services/app-files-updater.ts @@ -11,20 +11,31 @@ export class AppFilesUpdater { ) { } - public updateApp(beforeCopyAction: (sourceFiles: string[]) => void, filesToSync?: string[]): void { - const sourceFiles = filesToSync || this.resolveAppSourceFiles(); + public updateApp(updateAppOptions: IUpdateAppOptions): void { + this.cleanDestinationApp(updateAppOptions); + const sourceFiles = updateAppOptions.filesToSync || this.resolveAppSourceFiles(); - beforeCopyAction(sourceFiles); + updateAppOptions.beforeCopyAction(sourceFiles); this.copyAppSourceFiles(sourceFiles); } - public cleanDestinationApp(): void { - // Delete the destination app in order to prevent EEXIST errors when symlinks are used. - let destinationAppContents = this.readDestinationDir(); - destinationAppContents = destinationAppContents.filter( - (directoryName: string) => directoryName !== constants.TNS_MODULES_FOLDER_NAME); + public cleanDestinationApp(updateAppOptions?: IUpdateAppOptions): void { + let itemsToRemove: string[]; - _(destinationAppContents).each((directoryItem: string) => { + if (updateAppOptions && updateAppOptions.filesToRemove) { + // We get here during LiveSync - we only want to get rid of files, that the file system watcher detected were deleted + itemsToRemove = updateAppOptions.filesToRemove.map(fileToRemove => path.relative(this.appSourceDirectoryPath, fileToRemove)); + } else { + // We get here during the initial sync before the file system watcher is even started + // delete everything and prepare everything anew just to be sure + // Delete the destination app in order to prevent EEXIST errors when symlinks are used. + itemsToRemove = this.readDestinationDir(); + itemsToRemove = itemsToRemove.filter( + (directoryName: string) => directoryName !== constants.TNS_MODULES_FOLDER_NAME); + + } + + _(itemsToRemove).each((directoryItem: string) => { this.deleteDestinationItem(directoryItem); }); } diff --git a/lib/services/livesync/livesync-service.ts b/lib/services/livesync/livesync-service.ts index 4376947f15..5967b988d5 100644 --- a/lib/services/livesync/livesync-service.ts +++ b/lib/services/livesync/livesync-service.ts @@ -368,7 +368,8 @@ export class LiveSyncService extends EventEmitter implements IDebugLiveSyncServi projectData: options.projectData, env: options.env, nativePrepare: nativePrepare, - filesToSync: options.modifiedFiles, + filesToSync: options.filesToSync, + filesToRemove: options.filesToRemove, platformTemplate: null, skipModulesNativeCheck: options.skipModulesNativeCheck, config: platformSpecificOptions @@ -568,6 +569,8 @@ export class LiveSyncService extends EventEmitter implements IDebugLiveSyncServi deviceBuildInfoDescriptor, settings: latestAppPackageInstalledSettings, modifiedFiles: allModifiedFiles, + filesToRemove: currentFilesToRemove, + filesToSync: currentFilesToSync, bundle: liveSyncData.bundle, release: liveSyncData.release, env: liveSyncData.env, diff --git a/lib/services/platform-service.ts b/lib/services/platform-service.ts index ad0d3797f7..3542c4f7dc 100644 --- a/lib/services/platform-service.ts +++ b/lib/services/platform-service.ts @@ -209,6 +209,7 @@ export class PlatformService extends EventEmitter implements IPlatformService { platformInfo.env, changesInfo, platformInfo.filesToSync, + platformInfo.filesToRemove, platformInfo.nativePrepare, ); this.$projectChangesService.savePrepareInfo(platformInfo.platform, platformInfo.projectData); @@ -269,7 +270,7 @@ export class PlatformService extends EventEmitter implements IPlatformService { /* Hooks are expected to use "filesToSync" parameter, as to give plugin authors additional information about the sync process.*/ @helpers.hook('prepare') - private async preparePlatformCore(platform: string, appFilesUpdaterOptions: IAppFilesUpdaterOptions, projectData: IProjectData, platformSpecificData: IPlatformSpecificData, env: Object, changesInfo?: IProjectChangesInfo, filesToSync?: string[], nativePrepare?: INativePrepare): Promise { + private async preparePlatformCore(platform: string, appFilesUpdaterOptions: IAppFilesUpdaterOptions, projectData: IProjectData, platformSpecificData: IPlatformSpecificData, env: Object, changesInfo?: IProjectChangesInfo, filesToSync?: string[], filesToRemove?: string[], nativePrepare?: INativePrepare): Promise { this.$logger.out("Preparing project..."); const platformData = this.$platformsData.getPlatformData(platform, projectData); @@ -283,6 +284,7 @@ export class PlatformService extends EventEmitter implements IPlatformService { platformSpecificData, changesInfo, filesToSync, + filesToRemove, env }); diff --git a/lib/services/prepare-platform-service.ts b/lib/services/prepare-platform-service.ts index 7726a89f85..3b6de480a3 100644 --- a/lib/services/prepare-platform-service.ts +++ b/lib/services/prepare-platform-service.ts @@ -23,8 +23,13 @@ export class PreparePlatformService { const appSourceDirectoryPath = path.join(copyAppFilesData.projectData.projectDir, constants.APP_FOLDER_NAME); const appUpdater = new AppFilesUpdater(appSourceDirectoryPath, appDestinationDirectoryPath, copyAppFilesData.appFilesUpdaterOptions, this.$fs); - appUpdater.updateApp(sourceFiles => { - this.$xmlValidator.validateXmlFiles(sourceFiles); - }, copyAppFilesData.filesToSync); + const appUpdaterOptions: IUpdateAppOptions = { + beforeCopyAction: sourceFiles => { + this.$xmlValidator.validateXmlFiles(sourceFiles); + }, + filesToSync: copyAppFilesData.filesToSync, + filesToRemove: copyAppFilesData.filesToRemove + }; + appUpdater.updateApp(appUpdaterOptions); } }