Skip to content

Commit 5a74db5

Browse files
Merge pull request #4806 from NativeScript/fatme/fix-prepare-ready-event
fix: fix issues with Sidekick, cloud builds and multiple projects/devices
2 parents 5262184 + 342307f commit 5a74db5

File tree

3 files changed

+29
-12
lines changed

3 files changed

+29
-12
lines changed

lib/controllers/build-controller.ts

+1-5
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,8 @@ export class BuildController extends EventEmitter implements IBuildController {
8787
const projectData = this.$projectDataService.getProjectData(buildData.projectDir);
8888
const platformData = this.$platformsDataService.getPlatformData(buildData.platform, projectData);
8989
const outputPath = buildData.outputPath || platformData.getBuildOutputPath(buildData);
90-
91-
if (buildData.release && this.$projectChangesService.currentChanges.hasChanges) {
92-
return true;
93-
}
94-
9590
const changesInfo = this.$projectChangesService.currentChanges || await this.$projectChangesService.checkForChanges(platformData, projectData, buildData);
91+
9692
if (changesInfo.changesRequireBuild) {
9793
return true;
9894
}

lib/controllers/run-controller.ts

+26-4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { cache, performanceLog } from "../common/decorators";
44
import { EventEmitter } from "events";
55

66
export class RunController extends EventEmitter implements IRunController {
7+
private prepareReadyEventHandler: any = null;
8+
79
constructor(
810
protected $analyticsService: IAnalyticsService,
911
private $buildController: IBuildController,
@@ -23,6 +25,7 @@ export class RunController extends EventEmitter implements IRunController {
2325
private $prepareController: IPrepareController,
2426
private $prepareDataService: IPrepareDataService,
2527
private $prepareNativePlatformService: IPrepareNativePlatformService,
28+
private $projectChangesService: IProjectChangesService,
2629
protected $projectDataService: IProjectDataService
2730
) {
2831
super();
@@ -45,9 +48,21 @@ export class RunController extends EventEmitter implements IRunController {
4548
this.$hmrStatusService.attachToHmrStatusEvent();
4649
}
4750

48-
this.$prepareController.on(PREPARE_READY_EVENT_NAME, async data => {
49-
await this.syncChangedDataOnDevices(data, projectData, liveSyncInfo, deviceDescriptors);
50-
});
51+
if (!this.prepareReadyEventHandler) {
52+
this.prepareReadyEventHandler = async (data: IFilesChangeEventData) => {
53+
if (data.hasNativeChanges) {
54+
const platformData = this.$platformsDataService.getPlatformData(data.platform, projectData);
55+
const prepareData = this.$prepareDataService.getPrepareData(liveSyncInfo.projectDir, data.platform, { ...liveSyncInfo, watch: !liveSyncInfo.skipWatcher });
56+
const changesInfo = await this.$projectChangesService.checkForChanges(platformData, projectData, prepareData);
57+
if (changesInfo.hasChanges) {
58+
await this.syncChangedDataOnDevices(data, projectData, liveSyncInfo);
59+
}
60+
} else {
61+
await this.syncChangedDataOnDevices(data, projectData, liveSyncInfo);
62+
}
63+
};
64+
this.$prepareController.on(PREPARE_READY_EVENT_NAME, this.prepareReadyEventHandler.bind(this));
65+
}
5166

5267
await this.syncInitialDataOnDevices(projectData, liveSyncInfo, deviceDescriptorsForInitialSync);
5368

@@ -58,6 +73,7 @@ export class RunController extends EventEmitter implements IRunController {
5873
const { projectDir, deviceIdentifiers, stopOptions } = data;
5974
const liveSyncProcessInfo = this.$liveSyncProcessDataService.getPersistedData(projectDir);
6075
if (liveSyncProcessInfo && !liveSyncProcessInfo.isStopped) {
76+
6177
// In case we are coming from error during livesync, the current action is the one that erred (but we are still executing it),
6278
// so we cannot await it as this will cause infinite loop.
6379
const shouldAwaitPendingOperation = !stopOptions || stopOptions.shouldAwaitAllActions;
@@ -94,6 +110,11 @@ export class RunController extends EventEmitter implements IRunController {
94110

95111
liveSyncProcessInfo.deviceDescriptors = [];
96112

113+
if (this.prepareReadyEventHandler) {
114+
this.removeListener(PREPARE_READY_EVENT_NAME, this.prepareReadyEventHandler);
115+
this.prepareReadyEventHandler = null;
116+
}
117+
97118
const projectData = this.$projectDataService.getProjectData(projectDir);
98119
await this.$hooksService.executeAfterHooks('watch', {
99120
hookArgs: {
@@ -313,10 +334,11 @@ export class RunController extends EventEmitter implements IRunController {
313334
await this.addActionToChain(projectData.projectDir, () => this.$devicesService.execute(deviceAction, (device: Mobile.IDevice) => _.some(deviceDescriptors, deviceDescriptor => deviceDescriptor.identifier === device.deviceInfo.identifier)));
314335
}
315336

316-
private async syncChangedDataOnDevices(data: IFilesChangeEventData, projectData: IProjectData, liveSyncInfo: ILiveSyncInfo, deviceDescriptors: ILiveSyncDeviceDescriptor[]): Promise<void> {
337+
private async syncChangedDataOnDevices(data: IFilesChangeEventData, projectData: IProjectData, liveSyncInfo: ILiveSyncInfo): Promise<void> {
317338
const rebuiltInformation: IDictionary<{ packageFilePath: string, platform: string, isEmulator: boolean }> = { };
318339

319340
const deviceAction = async (device: Mobile.IDevice) => {
341+
const deviceDescriptors = this.$liveSyncProcessDataService.getDeviceDescriptors(projectData.projectDir);
320342
const deviceDescriptor = _.find(deviceDescriptors, dd => dd.identifier === device.deviceInfo.identifier);
321343
const platformData = this.$platformsDataService.getPlatformData(data.platform, projectData);
322344
const prepareData = this.$prepareDataService.getPrepareData(liveSyncInfo.projectDir, device.deviceInfo.platform,

lib/services/platform/prepare-native-platform-service.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,11 @@ export class PrepareNativePlatformService implements IPrepareNativePlatformServi
1515
@hook('prepareNativeApp')
1616
public async prepareNativePlatform(platformData: IPlatformData, projectData: IProjectData, prepareData: IPrepareData): Promise<boolean> {
1717
const { nativePrepare, release } = prepareData;
18+
const changesInfo = await this.$projectChangesService.checkForChanges(platformData, projectData, prepareData);
1819
if (nativePrepare && nativePrepare.skipNativePrepare) {
19-
return false;
20+
return changesInfo.hasChanges;
2021
}
2122

22-
const changesInfo = await this.$projectChangesService.checkForChanges(platformData, projectData, prepareData);
23-
2423
const hasNativeModulesChange = !changesInfo || changesInfo.nativeChanged;
2524
const hasConfigChange = !changesInfo || changesInfo.configChanged;
2625
const hasChangesRequirePrepare = !changesInfo || changesInfo.changesRequirePrepare;

0 commit comments

Comments
 (0)