mobile-cli-lib
Version:
common lib used by different CLI
131 lines (130 loc) • 7.21 kB
JavaScript
;
var path = require("path");
var temp = require("temp");
var android_device_hash_service_1 = require("./android-device-hash-service");
var Future = require("fibers/future");
var AndroidDeviceFileSystem = (function () {
function AndroidDeviceFileSystem(adb, identifier, $fs, $logger, $mobileHelper, $injector, $options) {
this.adb = adb;
this.identifier = identifier;
this.$fs = $fs;
this.$logger = $logger;
this.$mobileHelper = $mobileHelper;
this.$injector = $injector;
this.$options = $options;
this._deviceHashServices = Object.create(null);
}
AndroidDeviceFileSystem.prototype.listFiles = function (devicePath, appIdentifier) {
var listCommandArgs = ["ls", "-a", devicePath];
if (appIdentifier) {
listCommandArgs = ["run-as", appIdentifier].concat(listCommandArgs);
}
return this.adb.executeShellCommand(listCommandArgs);
};
AndroidDeviceFileSystem.prototype.getFile = function (deviceFilePath) {
return Future.fromResult();
};
AndroidDeviceFileSystem.prototype.putFile = function (localFilePath, deviceFilePath) {
return Future.fromResult();
};
AndroidDeviceFileSystem.prototype.transferFiles = function (deviceAppData, localToDevicePaths) {
var _this = this;
return (function () {
_(localToDevicePaths)
.filter(function (localToDevicePathData) { return _this.$fs.getFsStats(localToDevicePathData.getLocalPath()).wait().isFile(); })
.each(function (localToDevicePathData) {
return _this.adb.executeCommand(["push", localToDevicePathData.getLocalPath(), localToDevicePathData.getDevicePath()]).wait();
});
_(localToDevicePaths)
.filter(function (localToDevicePathData) { return _this.$fs.getFsStats(localToDevicePathData.getLocalPath()).wait().isDirectory(); })
.each(function (localToDevicePathData) {
return _this.adb.executeShellCommand(["chmod", "0777", localToDevicePathData.getDevicePath()]).wait();
});
var deviceHashService = _this.getDeviceHashService(deviceAppData.appIdentifier);
if (!deviceHashService.updateHashes(localToDevicePaths).wait()) {
_this.$logger.trace("Unable to find hash file on device. The next livesync command will create it.");
}
}).future()();
};
AndroidDeviceFileSystem.prototype.transferDirectory = function (deviceAppData, localToDevicePaths, projectFilesPath) {
var _this = this;
return (function () {
var devicePaths = [], currentShasums = {};
localToDevicePaths.forEach(function (localToDevicePathData) {
var localPath = localToDevicePathData.getLocalPath();
var stats = _this.$fs.getFsStats(localPath).wait();
if (stats.isFile()) {
var fileShasum = _this.$fs.getFileShasum(localPath).wait();
currentShasums[localPath] = fileShasum;
}
devicePaths.push("\"" + localToDevicePathData.getDevicePath() + "\"");
});
var commandsDeviceFilePath = _this.$mobileHelper.buildDevicePath(deviceAppData.deviceProjectRootPath, "nativescript.commands.sh");
var deviceHashService = _this.getDeviceHashService(deviceAppData.appIdentifier);
var filesToChmodOnDevice = devicePaths;
if (_this.$options.force) {
_this.adb.executeShellCommand(["rm", "-rf", deviceHashService.hashFileDevicePath]).wait();
_this.adb.executeCommand(["push", projectFilesPath, deviceAppData.deviceProjectRootPath]).wait();
}
else {
var oldShasums_1 = deviceHashService.getShasumsFromDevice().wait();
if (oldShasums_1) {
var changedShasums = _.omitBy(currentShasums, function (hash, pathToFile) { return !!_.find(oldShasums_1, function (oldHash, oldPath) { return pathToFile === oldPath && hash === oldHash; }); });
_this.$logger.trace("Changed file hashes are:", changedShasums);
filesToChmodOnDevice = [];
var futures = _(changedShasums)
.map(function (hash, filePath) { return _.find(localToDevicePaths, function (ldp) { return ldp.getLocalPath() === filePath; }); })
.map(function (localToDevicePathData) {
filesToChmodOnDevice.push("\"" + localToDevicePathData.getDevicePath() + "\"");
return _this.transferFile(localToDevicePathData.getLocalPath(), localToDevicePathData.getDevicePath());
})
.value();
Future.wait(futures);
}
else {
_this.adb.executeCommand(["push", projectFilesPath, deviceAppData.deviceProjectRootPath]).wait();
}
}
if (filesToChmodOnDevice.length) {
_this.createFileOnDevice(commandsDeviceFilePath, "chmod 0777 " + filesToChmodOnDevice.join(" ")).wait();
_this.adb.executeShellCommand([commandsDeviceFilePath]).wait();
}
deviceHashService.uploadHashFileToDevice(currentShasums).wait();
}).future()();
};
AndroidDeviceFileSystem.prototype.transferFile = function (localPath, devicePath) {
var _this = this;
return (function () {
_this.$logger.trace("Transfering " + localPath + " to " + devicePath);
var stats = _this.$fs.getFsStats(localPath).wait();
if (stats.isDirectory()) {
_this.adb.executeShellCommand(["mkdir", path.dirname(devicePath)]).wait();
}
else {
_this.adb.executeCommand(["push", localPath, devicePath]).wait();
}
}).future()();
};
AndroidDeviceFileSystem.prototype.createFileOnDevice = function (deviceFilePath, fileContent) {
var _this = this;
return (function () {
var hostTmpDir = _this.getTempDir();
var commandsFileHostPath = path.join(hostTmpDir, "temp.commands.file");
_this.$fs.writeFile(commandsFileHostPath, fileContent).wait();
_this.transferFile(commandsFileHostPath, deviceFilePath).wait();
_this.adb.executeShellCommand(["chmod", "0777", deviceFilePath]).wait();
}).future()();
};
AndroidDeviceFileSystem.prototype.getTempDir = function () {
temp.track();
return temp.mkdirSync("application-");
};
AndroidDeviceFileSystem.prototype.getDeviceHashService = function (appIdentifier) {
if (!this._deviceHashServices[appIdentifier]) {
this._deviceHashServices[appIdentifier] = this.$injector.resolve(android_device_hash_service_1.AndroidDeviceHashService, { adb: this.adb, appIdentifier: appIdentifier });
}
return this._deviceHashServices[appIdentifier];
};
return AndroidDeviceFileSystem;
}());
exports.AndroidDeviceFileSystem = AndroidDeviceFileSystem;