Skip to content

Commit e482d14

Browse files
Merge pull request #3388 from NativeScript/kerezov/fix-livesync-delete
fix(livesync): delete files during livesync
2 parents 27e937b + ab8b35b commit e482d14

File tree

6 files changed

+46
-17
lines changed

6 files changed

+46
-17
lines changed

lib/definitions/livesync.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ interface IProjectDataComposition {
152152
/**
153153
* Desribes object that can be passed to ensureLatestAppPackageIsInstalledOnDevice method.
154154
*/
155-
interface IEnsureLatestAppPackageIsInstalledOnDeviceOptions extends IProjectDataComposition, IEnvOptions, IBundle, IRelease, ISkipNativeCheckOptional {
155+
interface IEnsureLatestAppPackageIsInstalledOnDeviceOptions extends IProjectDataComposition, IEnvOptions, IBundle, IRelease, ISkipNativeCheckOptional, IOptionalFilesToRemove, IOptionalFilesToSync {
156156
device: Mobile.IDevice;
157157
preparedPlatforms: string[];
158158
rebuiltInformation: ILiveSyncBuildInfo[];

lib/definitions/platform.d.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ interface IPlatformDataComposition {
296296
platformData: IPlatformData;
297297
}
298298

299-
interface ICopyAppFilesData extends IProjectDataComposition, IAppFilesUpdaterOptionsComposition, IPlatformDataComposition, IOptionalFilesToSync { }
299+
interface ICopyAppFilesData extends IProjectDataComposition, IAppFilesUpdaterOptionsComposition, IPlatformDataComposition, IOptionalFilesToSync, IOptionalFilesToRemove { }
300300

301301
interface IPreparePlatformService {
302302
addPlatform(info: IAddPlatformInfo): Promise<void>;
@@ -329,10 +329,18 @@ interface IOptionalFilesToSync {
329329
filesToSync?: string[];
330330
}
331331

332-
interface IPreparePlatformInfoBase extends IPlatform, IAppFilesUpdaterOptionsComposition, IProjectDataComposition, IEnvOptions, IOptionalFilesToSync {
332+
interface IOptionalFilesToRemove {
333+
filesToRemove?: string[];
334+
}
335+
336+
interface IPreparePlatformInfoBase extends IPlatform, IAppFilesUpdaterOptionsComposition, IProjectDataComposition, IEnvOptions, IOptionalFilesToSync, IOptionalFilesToRemove {
333337
nativePrepare?: INativePrepare;
334338
}
335339

336340
interface IDeployPlatformInfo extends IPlatform, IAppFilesUpdaterOptionsComposition, IProjectDataComposition, IPlatformConfig, IEnvOptions {
337341
deployOptions: IDeployPlatformOptions
338342
}
343+
344+
interface IUpdateAppOptions extends IOptionalFilesToSync, IOptionalFilesToRemove {
345+
beforeCopyAction: (sourceFiles: string[]) => void;
346+
}

lib/services/app-files-updater.ts

+20-9
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,31 @@ export class AppFilesUpdater {
1111
) {
1212
}
1313

14-
public updateApp(beforeCopyAction: (sourceFiles: string[]) => void, filesToSync?: string[]): void {
15-
const sourceFiles = filesToSync || this.resolveAppSourceFiles();
14+
public updateApp(updateAppOptions: IUpdateAppOptions): void {
15+
this.cleanDestinationApp(updateAppOptions);
16+
const sourceFiles = updateAppOptions.filesToSync || this.resolveAppSourceFiles();
1617

17-
beforeCopyAction(sourceFiles);
18+
updateAppOptions.beforeCopyAction(sourceFiles);
1819
this.copyAppSourceFiles(sourceFiles);
1920
}
2021

21-
public cleanDestinationApp(): void {
22-
// Delete the destination app in order to prevent EEXIST errors when symlinks are used.
23-
let destinationAppContents = this.readDestinationDir();
24-
destinationAppContents = destinationAppContents.filter(
25-
(directoryName: string) => directoryName !== constants.TNS_MODULES_FOLDER_NAME);
22+
public cleanDestinationApp(updateAppOptions?: IUpdateAppOptions): void {
23+
let itemsToRemove: string[];
2624

27-
_(destinationAppContents).each((directoryItem: string) => {
25+
if (updateAppOptions && updateAppOptions.filesToRemove) {
26+
// We get here during LiveSync - we only want to get rid of files, that the file system watcher detected were deleted
27+
itemsToRemove = updateAppOptions.filesToRemove.map(fileToRemove => path.relative(this.appSourceDirectoryPath, fileToRemove));
28+
} else {
29+
// We get here during the initial sync before the file system watcher is even started
30+
// delete everything and prepare everything anew just to be sure
31+
// Delete the destination app in order to prevent EEXIST errors when symlinks are used.
32+
itemsToRemove = this.readDestinationDir();
33+
itemsToRemove = itemsToRemove.filter(
34+
(directoryName: string) => directoryName !== constants.TNS_MODULES_FOLDER_NAME);
35+
36+
}
37+
38+
_(itemsToRemove).each((directoryItem: string) => {
2839
this.deleteDestinationItem(directoryItem);
2940
});
3041
}

lib/services/livesync/livesync-service.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,8 @@ export class LiveSyncService extends EventEmitter implements IDebugLiveSyncServi
368368
projectData: options.projectData,
369369
env: options.env,
370370
nativePrepare: nativePrepare,
371-
filesToSync: options.modifiedFiles,
371+
filesToSync: options.filesToSync,
372+
filesToRemove: options.filesToRemove,
372373
platformTemplate: null,
373374
skipModulesNativeCheck: options.skipModulesNativeCheck,
374375
config: platformSpecificOptions
@@ -568,6 +569,8 @@ export class LiveSyncService extends EventEmitter implements IDebugLiveSyncServi
568569
deviceBuildInfoDescriptor,
569570
settings: latestAppPackageInstalledSettings,
570571
modifiedFiles: allModifiedFiles,
572+
filesToRemove: currentFilesToRemove,
573+
filesToSync: currentFilesToSync,
571574
bundle: liveSyncData.bundle,
572575
release: liveSyncData.release,
573576
env: liveSyncData.env,

lib/services/platform-service.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ export class PlatformService extends EventEmitter implements IPlatformService {
209209
platformInfo.env,
210210
changesInfo,
211211
platformInfo.filesToSync,
212+
platformInfo.filesToRemove,
212213
platformInfo.nativePrepare,
213214
);
214215
this.$projectChangesService.savePrepareInfo(platformInfo.platform, platformInfo.projectData);
@@ -269,7 +270,7 @@ export class PlatformService extends EventEmitter implements IPlatformService {
269270

270271
/* Hooks are expected to use "filesToSync" parameter, as to give plugin authors additional information about the sync process.*/
271272
@helpers.hook('prepare')
272-
private async preparePlatformCore(platform: string, appFilesUpdaterOptions: IAppFilesUpdaterOptions, projectData: IProjectData, platformSpecificData: IPlatformSpecificData, env: Object, changesInfo?: IProjectChangesInfo, filesToSync?: string[], nativePrepare?: INativePrepare): Promise<void> {
273+
private async preparePlatformCore(platform: string, appFilesUpdaterOptions: IAppFilesUpdaterOptions, projectData: IProjectData, platformSpecificData: IPlatformSpecificData, env: Object, changesInfo?: IProjectChangesInfo, filesToSync?: string[], filesToRemove?: string[], nativePrepare?: INativePrepare): Promise<void> {
273274
this.$logger.out("Preparing project...");
274275

275276
const platformData = this.$platformsData.getPlatformData(platform, projectData);
@@ -283,6 +284,7 @@ export class PlatformService extends EventEmitter implements IPlatformService {
283284
platformSpecificData,
284285
changesInfo,
285286
filesToSync,
287+
filesToRemove,
286288
env
287289
});
288290

lib/services/prepare-platform-service.ts

+8-3
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,13 @@ export class PreparePlatformService {
2323
const appSourceDirectoryPath = path.join(copyAppFilesData.projectData.projectDir, constants.APP_FOLDER_NAME);
2424

2525
const appUpdater = new AppFilesUpdater(appSourceDirectoryPath, appDestinationDirectoryPath, copyAppFilesData.appFilesUpdaterOptions, this.$fs);
26-
appUpdater.updateApp(sourceFiles => {
27-
this.$xmlValidator.validateXmlFiles(sourceFiles);
28-
}, copyAppFilesData.filesToSync);
26+
const appUpdaterOptions: IUpdateAppOptions = {
27+
beforeCopyAction: sourceFiles => {
28+
this.$xmlValidator.validateXmlFiles(sourceFiles);
29+
},
30+
filesToSync: copyAppFilesData.filesToSync,
31+
filesToRemove: copyAppFilesData.filesToRemove
32+
};
33+
appUpdater.updateApp(appUpdaterOptions);
2934
}
3035
}

0 commit comments

Comments
 (0)