Skip to content

fix: temporary files created by CLI are not deleted in some cases #5238

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Feb 5, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions lib/bootstrap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -236,3 +236,4 @@ $injector.require("ipService", "./services/ip-service");
$injector.require("jsonFileSettingsService", "./common/services/json-file-settings-service");
$injector.require("markingModeService", "./services/marking-mode-service");
$injector.require("metadataFilteringService", "./services/metadata-filtering-service");
$injector.require("tempService", "./services/temp-service");
8 changes: 4 additions & 4 deletions lib/commands/plugin/build-plugin.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { EOL } from "os";
import * as path from "path";
import * as constants from "../../constants";
import * as temp from "temp";

export class BuildPluginCommand implements ICommand {
public allowedParameters: ICommandParameter[] = [];
public pluginProjectPath: string;
Expand All @@ -10,7 +10,8 @@ export class BuildPluginCommand implements ICommand {
private $errors: IErrors,
private $logger: ILogger,
private $fs: IFileSystem,
private $options: IOptions) {
private $options: IOptions,
private $tempService: ITempService) {

this.pluginProjectPath = path.resolve(this.$options.path || ".");
}
Expand All @@ -29,8 +30,7 @@ export class BuildPluginCommand implements ICommand {
}
}

temp.track();
const tempAndroidProject = temp.mkdirSync("android-project");
const tempAndroidProject = await this.$tempService.mkdirSync("android-project");

const options: IPluginBuildOptions = {
aarOutputDir: platformsAndroidPath,
Expand Down
12 changes: 3 additions & 9 deletions lib/common/mobile/android/android-device-file-system.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import * as path from "path";
import * as semver from "semver";
import * as temp from "temp";
import { AndroidDeviceHashService } from "./android-device-hash-service";
import { executeActionByChunks } from "../../helpers";
import { DEFAULT_CHUNK_SIZE } from '../../constants';
Expand All @@ -12,6 +11,7 @@ export class AndroidDeviceFileSystem implements Mobile.IDeviceFileSystem {
private $fs: IFileSystem,
private $logger: ILogger,
private $mobileHelper: Mobile.IMobileHelper,
private $tempService: ITempService,
private $injector: IInjector) { }

public async listFiles(devicePath: string, appIdentifier?: string): Promise<any> {
Expand All @@ -27,8 +27,7 @@ export class AndroidDeviceFileSystem implements Mobile.IDeviceFileSystem {
const stdout = !outputPath;

if (stdout) {
temp.track();
outputPath = temp.path({ prefix: "sync", suffix: ".tmp" });
outputPath = await this.$tempService.path({ prefix: "sync", suffix: ".tmp" });
}

await this.adb.executeCommand(["pull", deviceFilePath, outputPath]);
Expand Down Expand Up @@ -134,7 +133,7 @@ export class AndroidDeviceFileSystem implements Mobile.IDeviceFileSystem {
}

public async createFileOnDevice(deviceFilePath: string, fileContent: string): Promise<void> {
const hostTmpDir = this.getTempDir();
const hostTmpDir = await this.$tempService.mkdirSync("application-");
const commandsFileHostPath = path.join(hostTmpDir, "temp.commands.file");
this.$fs.writeFile(commandsFileHostPath, fileContent);

Expand All @@ -159,9 +158,4 @@ export class AndroidDeviceFileSystem implements Mobile.IDeviceFileSystem {

return this._deviceHashServices[appIdentifier];
}

private getTempDir(): string {
temp.track();
return temp.mkdirSync("application-");
}
}
25 changes: 13 additions & 12 deletions lib/common/mobile/android/android-device-hash-service.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import * as path from "path";
import * as temp from "temp";
import { cache } from "../../decorators";
import { executeActionByChunks } from "../../helpers";
import { DEFAULT_CHUNK_SIZE, LiveSyncPaths } from "../../constants";
Expand All @@ -10,7 +9,8 @@ export class AndroidDeviceHashService implements Mobile.IAndroidDeviceHashServic
constructor(private adb: Mobile.IDeviceAndroidDebugBridge,
private appIdentifier: string,
private $fs: IFileSystem,
private $mobileHelper: Mobile.IMobileHelper) {
private $mobileHelper: Mobile.IMobileHelper,
private $tempService: ITempService) {
}

@cache()
Expand All @@ -34,8 +34,9 @@ export class AndroidDeviceHashService implements Mobile.IAndroidDeviceHashServic
}

public async uploadHashFileToDevice(data: IStringDictionary): Promise<void> {
this.$fs.writeJson(this.hashFileLocalPath, data);
await this.adb.pushFile(this.hashFileLocalPath, this.hashFileDevicePath);
const hashFileLocalPath = await this.getHashFileLocalPath();
this.$fs.writeJson(hashFileLocalPath, data);
await this.adb.pushFile(hashFileLocalPath, this.hashFileDevicePath);
}

public async updateHashes(localToDevicePaths: Mobile.ILocalToDevicePathData[]): Promise<void> {
Expand Down Expand Up @@ -86,20 +87,20 @@ export class AndroidDeviceHashService implements Mobile.IAndroidDeviceHashServic
}

@cache()
private get hashFileLocalPath(): string {
return path.join(this.tempDir, AndroidDeviceHashService.HASH_FILE_NAME);
private async getHashFileLocalPath(): Promise<string> {
return path.join(await this.getTempDir(), AndroidDeviceHashService.HASH_FILE_NAME);
}

@cache()
private get tempDir(): string {
temp.track();
return temp.mkdirSync(`android-device-hash-service-${this.appIdentifier}`);
private getTempDir(): Promise<string> {
return this.$tempService.mkdirSync(`android-device-hash-service-${this.appIdentifier}`);
}

private async downloadHashFileFromDevice(): Promise<string> {
if (!this.$fs.exists(this.hashFileLocalPath)) {
await this.adb.executeCommand(["pull", this.hashFileDevicePath, this.tempDir]);
const hashFileLocalPath = await this.getHashFileLocalPath();
if (!this.$fs.exists(hashFileLocalPath)) {
await this.adb.executeCommand(["pull", this.hashFileDevicePath, await this.getTempDir()]);
}
return this.hashFileLocalPath;
return hashFileLocalPath;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import { hook, getPidFromiOSSimulatorLogs } from "../../../helpers";
import { cache } from "../../../decorators";
import { IOS_LOG_PREDICATE } from "../../../constants";
import * as path from "path";
import * as temp from "temp";
import * as log4js from "log4js";

export class IOSSimulatorApplicationManager extends ApplicationManagerBase {
Expand All @@ -16,6 +15,7 @@ export class IOSSimulatorApplicationManager extends ApplicationManagerBase {
private $options: IOptions,
private $fs: IFileSystem,
protected $deviceLogProvider: Mobile.IDeviceLogProvider,
private $tempService: ITempService,
$logger: ILogger,
$hooksService: IHooksService) {
super($logger, $hooksService, $deviceLogProvider);
Expand All @@ -28,8 +28,7 @@ export class IOSSimulatorApplicationManager extends ApplicationManagerBase {
@hook('install')
public async installApplication(packageFilePath: string): Promise<void> {
if (this.$fs.exists(packageFilePath) && path.extname(packageFilePath) === ".zip") {
temp.track();
const dir = temp.mkdirSync("simulatorPackage");
const dir = await this.$tempService.mkdirSync("simulatorPackage");
await this.$fs.unzip(packageFilePath, dir);
const app = _.find(this.$fs.readDirectory(dir), directory => path.extname(directory) === ".app");
if (app) {
Expand Down
7 changes: 3 additions & 4 deletions lib/common/mobile/mobile-helper.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import * as helpers from "../helpers";
import * as shell from "shelljs";
import * as temp from "temp";

export class MobileHelper implements Mobile.IMobileHelper {
private static DEVICE_PATH_SEPARATOR = "/";

constructor(private $errors: IErrors,
private $fs: IFileSystem,
private $devicePlatformsConstants: Mobile.IDevicePlatformsConstants) { }
private $devicePlatformsConstants: Mobile.IDevicePlatformsConstants,
private $tempService: ITempService) { }

public get platformNames(): string[] {
return [this.$devicePlatformsConstants.iOS, this.$devicePlatformsConstants.Android];
Expand Down Expand Up @@ -58,8 +58,7 @@ export class MobileHelper implements Mobile.IMobileHelper {
}

public async getDeviceFileContent(device: Mobile.IDevice, deviceFilePath: string, projectData: IProjectData): Promise<string> {
temp.track();
const uniqueFilePath = temp.path({ suffix: ".tmp" });
const uniqueFilePath = await this.$tempService.path({ suffix: ".tmp" });
const platform = device.deviceInfo.platform.toLowerCase();
try {
await device.fileSystem.getFile(deviceFilePath, projectData.projectIdentifiers[platform], uniqueFilePath);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { DevicePlatformsConstants } from "../../../mobile/device-platforms-const
import * as path from "path";
import { assert } from "chai";
import { LiveSyncPaths } from "../../../constants";
import { TempServiceStub } from "../../../../../test/stubs";

const myTestAppIdentifier = "org.nativescript.myApp";
let isAdbPushExecuted = false;
Expand Down Expand Up @@ -64,7 +65,7 @@ function createTestInjector(): IInjector {
injector.register("errors", Errors);
injector.register("devicePlatformsConstants", DevicePlatformsConstants);
injector.register("projectFilesManager", {});

injector.register("tempService", TempServiceStub);
return injector;
}

Expand Down
4 changes: 2 additions & 2 deletions lib/common/test/unit-tests/mobile/ios-simulator-discovery.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { assert } from "chai";
import { DeviceDiscoveryEventNames, CONNECTED_STATUS } from "../../../constants";
import { DevicePlatformsConstants } from "../../../mobile/device-platforms-constants";
import { ErrorsStub, CommonLoggerStub, HooksServiceStub, LockServiceStub } from "../stubs";
import { FileSystemStub, ChildProcessStub } from "../../../../../test/stubs";
import { FileSystemStub, ChildProcessStub, TempServiceStub } from "../../../../../test/stubs";
import { DeviceConnectionType } from "../../../../constants";

let currentlyRunningSimulators: Mobile.IiSimDevice[];
Expand Down Expand Up @@ -45,7 +45,7 @@ function createTestInjector(): IInjector {
injector.register("options", {});
injector.register("hooksService", HooksServiceStub);
injector.register("logger", CommonLoggerStub);

injector.register("tempService", TempServiceStub);
return injector;
}

Expand Down
2 changes: 2 additions & 0 deletions lib/common/test/unit-tests/mobile/project-files-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { ProjectFilesProviderBase } from "../../../services/project-files-provid

import temp = require("temp");
import { LiveSyncPaths } from "../../../constants";
import { TempServiceStub } from "../../../../../test/stubs";
temp.track();

const testedApplicationIdentifier = "com.telerik.myApp";
Expand Down Expand Up @@ -49,6 +50,7 @@ function createTestInjector(): IInjector {
});
testInjector.register("logger", Logger);
testInjector.register("config", {});
testInjector.register("tempService", TempServiceStub);
return testInjector;
}

Expand Down
4 changes: 2 additions & 2 deletions lib/definitions/ios.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ declare global {
}

interface IExportOptionsPlistService {
createDevelopmentExportOptionsPlist(archivePath: string, projectData: IProjectData, buildConfig: IBuildConfig): IExportOptionsPlistOutput;
createDistributionExportOptionsPlist(projectRoot: string, projectData: IProjectData, buildConfig: IBuildConfig): IExportOptionsPlistOutput;
createDevelopmentExportOptionsPlist(archivePath: string, projectData: IProjectData, buildConfig: IBuildConfig): Promise<IExportOptionsPlistOutput>;
createDistributionExportOptionsPlist(projectRoot: string, projectData: IProjectData, buildConfig: IBuildConfig): Promise<IExportOptionsPlistOutput>;
}

interface IExportOptionsPlistOutput {
Expand Down
7 changes: 7 additions & 0 deletions lib/definitions/temp-service.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/**
* Declares wrapped functions of temp module
*/
interface ITempService {
mkdirSync(affixes: string): Promise<string>;
path(options: ITempPathOptions): Promise<string>;
}
4 changes: 2 additions & 2 deletions lib/device-sockets/ios/app-debug-socket-proxy-factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import { EventEmitter } from "events";
import { CONNECTION_ERROR_EVENT_NAME } from "../../constants";
import * as net from "net";
import * as ws from "ws";
import temp = require("temp");
import { MessageUnpackStream } from "ios-device-lib";

export class AppDebugSocketProxyFactory extends EventEmitter implements IAppDebugSocketProxyFactory {
Expand All @@ -13,6 +12,7 @@ export class AppDebugSocketProxyFactory extends EventEmitter implements IAppDebu
private $errors: IErrors,
private $lockService: ILockService,
private $options: IOptions,
private $tempService: ITempService,
private $net: INet) {
super();
}
Expand Down Expand Up @@ -72,7 +72,7 @@ export class AppDebugSocketProxyFactory extends EventEmitter implements IAppDebu
frontendSocket.resume();
});

const socketFileLocation = temp.path({ suffix: ".sock" });
const socketFileLocation = await this.$tempService.path({ suffix: ".sock" });
server.listen(socketFileLocation);
if (!this.$options.client) {
this.$logger.info("socket-file-location: " + socketFileLocation);
Expand Down
6 changes: 3 additions & 3 deletions lib/helpers/platform-command-helper.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import * as path from "path";
import * as semver from "semver";
import * as temp from "temp";
import * as constants from "../constants";
import { PlatformController } from "../controllers/platform-controller";
import { PlatformValidationService } from "../services/platform/platform-validation-service";
Expand All @@ -17,7 +16,8 @@ export class PlatformCommandHelper implements IPlatformCommandHelper {
private $platformsDataService: IPlatformsDataService,
private $platformValidationService: PlatformValidationService,
private $projectChangesService: IProjectChangesService,
private $projectDataService: IProjectDataService
private $projectDataService: IProjectDataService,
private $tempService: ITempService
) { }

public async addPlatforms(platforms: string[], projectData: IProjectData, frameworkPath: string): Promise<void> {
Expand Down Expand Up @@ -147,7 +147,7 @@ export class PlatformCommandHelper implements IPlatformCommandHelper {
const data = this.$projectDataService.getNSValue(projectData.projectDir, platformData.frameworkPackageName);
const currentVersion = data && data.version ? data.version : "0.2.0";

const installedModuleDir = temp.mkdirSync("runtime-to-update");
const installedModuleDir = await this.$tempService.mkdirSync("runtime-to-update");
let newVersion = version === constants.PackageVersion.NEXT ?
await this.$packageInstallationManager.getNextVersion(platformData.frameworkPackageName) :
version || await this.$packageInstallationManager.getLatestCompatibleVersion(platformData.frameworkPackageName);
Expand Down
7 changes: 3 additions & 4 deletions lib/services/ios-project-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import { attachAwaitDetach } from "../common/helpers";
import * as projectServiceBaseLib from "./platform-project-service-base";
import { PlistSession, Reporter } from "plist-merge-patch";
import { EOL } from "os";
import * as temp from "temp";
import * as plist from "plist";
import { IOSProvisionService } from "./ios-provision-service";
import { IOSEntitlementsService } from "./ios-entitlements-service";
Expand Down Expand Up @@ -55,7 +54,8 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ
private $iOSExtensionsService: IIOSExtensionsService,
private $iOSWatchAppService: IIOSWatchAppService,
private $iOSNativeTargetService: IIOSNativeTargetService,
private $sysInfo: ISysInfo) {
private $sysInfo: ISysInfo,
private $tempService: ITempService) {
super($fs, $projectDataService);
}

Expand Down Expand Up @@ -814,8 +814,7 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ
// Set Entitlements Property to point to default file if not set explicitly by the user.
const entitlementsPropertyValue = this.$xcconfigService.readPropertyValue(pluginsXcconfigFilePath, constants.CODE_SIGN_ENTITLEMENTS);
if (entitlementsPropertyValue === null && this.$fs.exists(this.$iOSEntitlementsService.getPlatformsEntitlementsPath(projectData))) {
temp.track();
const tempEntitlementsDir = temp.mkdirSync("entitlements");
const tempEntitlementsDir = await this.$tempService.mkdirSync("entitlements");
const tempEntitlementsFilePath = path.join(tempEntitlementsDir, "set-entitlements.xcconfig");
const entitlementsRelativePath = this.$iOSEntitlementsService.getPlatformsEntitlementsRelativePath(projectData);
this.$fs.writeFile(tempEntitlementsFilePath, `CODE_SIGN_ENTITLEMENTS = ${entitlementsRelativePath}${EOL}`);
Expand Down
14 changes: 6 additions & 8 deletions lib/services/ios/export-options-plist-service.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import * as path from "path";
import * as temp from "temp";
import * as mobileProvisionFinder from "ios-mobileprovision-finder";

export class ExportOptionsPlistService implements IExportOptionsPlistService {
constructor(private $fs: IFileSystem) { }
constructor(private $fs: IFileSystem,
private $tempService: ITempService) { }

public createDevelopmentExportOptionsPlist(archivePath: string, projectData: IProjectData, buildConfig: IBuildConfig): IExportOptionsPlistOutput {
public async createDevelopmentExportOptionsPlist(archivePath: string, projectData: IProjectData, buildConfig: IBuildConfig): Promise<IExportOptionsPlistOutput> {
const exportOptionsMethod = this.getExportOptionsMethod(projectData, archivePath);
const provision = buildConfig.provision || buildConfig.mobileProvisionIdentifier;
const iCloudContainerEnvironment = buildConfig.iCloudContainerEnvironment;
Expand Down Expand Up @@ -37,8 +37,7 @@ export class ExportOptionsPlistService implements IExportOptionsPlistService {
</plist>`;

// Save the options...
temp.track();
const exportOptionsPlistFilePath = temp.path({ prefix: "export-", suffix: ".plist" });
const exportOptionsPlistFilePath = await this.$tempService.path({ prefix: "export-", suffix: ".plist" });
this.$fs.writeFile(exportOptionsPlistFilePath, plistTemplate);

// The xcodebuild exportPath expects directory and writes the <project-name>.ipa at that directory.
Expand All @@ -48,7 +47,7 @@ export class ExportOptionsPlistService implements IExportOptionsPlistService {
return { exportFileDir, exportFilePath, exportOptionsPlistFilePath };
}

public createDistributionExportOptionsPlist(archivePath: string, projectData: IProjectData, buildConfig: IBuildConfig): IExportOptionsPlistOutput {
public async createDistributionExportOptionsPlist(archivePath: string, projectData: IProjectData, buildConfig: IBuildConfig): Promise<IExportOptionsPlistOutput> {
const provision = buildConfig.provision || buildConfig.mobileProvisionIdentifier;
const teamId = buildConfig.teamId;
let plistTemplate = `<?xml version="1.0" encoding="UTF-8"?>
Expand Down Expand Up @@ -80,8 +79,7 @@ export class ExportOptionsPlistService implements IExportOptionsPlistService {
</plist>`;

// Save the options...
temp.track();
const exportOptionsPlistFilePath = temp.path({ prefix: "export-", suffix: ".plist" });
const exportOptionsPlistFilePath = await this.$tempService.path({ prefix: "export-", suffix: ".plist" });
this.$fs.writeFile(exportOptionsPlistFilePath, plistTemplate);

const exportFileDir = path.resolve(path.dirname(archivePath));
Expand Down
4 changes: 2 additions & 2 deletions lib/services/ios/xcodebuild-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ export class XcodebuildService implements IXcodebuildService {

private async createDevelopmentArchive(platformData: IPlatformData, projectData: IProjectData, buildConfig: IBuildConfig): Promise<string> {
const archivePath = path.join(platformData.getBuildOutputPath(buildConfig), projectData.projectName + ".xcarchive");
const output = this.$exportOptionsPlistService.createDevelopmentExportOptionsPlist(archivePath, projectData, buildConfig);
const output = await this.$exportOptionsPlistService.createDevelopmentExportOptionsPlist(archivePath, projectData, buildConfig);
const args = [
"-exportArchive",
"-archivePath", archivePath,
Expand All @@ -42,7 +42,7 @@ export class XcodebuildService implements IXcodebuildService {

private async createDistributionArchive(platformData: IPlatformData, projectData: IProjectData, buildConfig: IBuildConfig): Promise<string> {
const archivePath = path.join(platformData.getBuildOutputPath(buildConfig), projectData.projectName + ".xcarchive");
const output = this.$exportOptionsPlistService.createDistributionExportOptionsPlist(archivePath, projectData, buildConfig);
const output = await this.$exportOptionsPlistService.createDistributionExportOptionsPlist(archivePath, projectData, buildConfig);
const args = [
"-exportArchive",
"-archivePath", archivePath,
Expand Down
Loading