2020-01-04 16:39:25 +03:00
|
|
|
#include "qif.h"
|
2020-01-05 14:55:57 +03:00
|
|
|
#include "quasarapp.h"
|
2020-01-13 18:25:03 +03:00
|
|
|
#include "deploycore.h"
|
|
|
|
#include "deployconfig.h"
|
2020-01-04 16:39:25 +03:00
|
|
|
|
2020-01-14 15:48:35 +03:00
|
|
|
#include <QDateTime>
|
2020-01-15 18:31:09 +03:00
|
|
|
#include <QProcess>
|
2020-08-15 14:38:03 +03:00
|
|
|
#include <packagecontrol.h>
|
2020-01-16 15:25:36 +03:00
|
|
|
#include <pathutils.h>
|
2020-01-14 15:48:35 +03:00
|
|
|
|
2020-01-15 18:31:09 +03:00
|
|
|
QIF::QIF(FileManager *fileManager)
|
|
|
|
:iDistribution(fileManager){
|
|
|
|
|
2020-08-14 17:47:34 +03:00
|
|
|
setLocation("tmp QIF");
|
2020-01-15 18:31:09 +03:00
|
|
|
};
|
2020-01-04 16:39:25 +03:00
|
|
|
|
2020-01-16 11:10:16 +03:00
|
|
|
Envirement QIF::toolKitEnv() const {
|
2020-01-05 14:55:57 +03:00
|
|
|
Envirement result;
|
2020-01-15 18:31:09 +03:00
|
|
|
|
2020-06-10 11:44:38 +03:00
|
|
|
if (QuasarAppUtils::Params::isEndable("qifFromSystem")) {
|
|
|
|
result.addEnv(QProcessEnvironment::systemEnvironment().value("PATH"));
|
2020-01-15 18:31:09 +03:00
|
|
|
|
2020-08-15 19:29:17 +03:00
|
|
|
// BASE
|
2020-06-10 11:44:38 +03:00
|
|
|
const DeployConfig *cfg = DeployCore::_config;
|
|
|
|
auto basePATH = cfg->qtDir.getBins() + "/../../../Tools/QtInstallerFramework/";
|
|
|
|
QDir QifDir(basePATH);
|
|
|
|
auto list = QifDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
|
|
|
|
|
|
|
|
QMap<double, QString> sortedItems;
|
|
|
|
for (const auto& i : list) {
|
|
|
|
sortedItems.insert(i.toDouble(), i);
|
|
|
|
}
|
2020-01-15 18:31:09 +03:00
|
|
|
|
2020-06-10 11:44:38 +03:00
|
|
|
if (sortedItems.size()) {
|
|
|
|
basePATH += ("/" + sortedItems.last() + "/bin");
|
|
|
|
result.addEnv(basePATH);
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
2020-01-15 18:31:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-06-10 11:44:38 +03:00
|
|
|
|
2020-08-15 19:29:17 +03:00
|
|
|
// SNAP
|
2020-01-04 16:39:25 +03:00
|
|
|
|
2020-01-05 14:55:57 +03:00
|
|
|
QString AppPath = QuasarAppUtils::Params::getStrArg("appPath", "");
|
2020-01-22 16:26:59 +03:00
|
|
|
result.addEnv(AppPath + "/../QIF/");
|
2020-01-05 14:55:57 +03:00
|
|
|
|
2020-08-15 19:29:17 +03:00
|
|
|
//Installer
|
2020-01-22 16:26:59 +03:00
|
|
|
result.addEnvRec(AppPath + "/../../QIF/", 2);
|
2020-01-05 14:55:57 +03:00
|
|
|
|
|
|
|
return result;
|
2020-01-04 16:39:25 +03:00
|
|
|
}
|
|
|
|
|
2020-01-16 11:10:16 +03:00
|
|
|
QString QIF::runCmd() {
|
|
|
|
QString base = "binarycreator";
|
|
|
|
|
|
|
|
if (binarycreator.isEmpty())
|
2020-01-28 13:51:00 +03:00
|
|
|
binarycreator = DeployCore::findProcess(toolKitEnv().concatEnv(), base);
|
2020-01-16 11:10:16 +03:00
|
|
|
|
2020-02-27 20:37:05 +03:00
|
|
|
if (binarycreator.isEmpty())
|
|
|
|
return base;
|
|
|
|
|
2020-01-16 11:10:16 +03:00
|
|
|
return binarycreator;
|
2020-01-04 16:39:25 +03:00
|
|
|
}
|
|
|
|
|
2020-08-15 14:38:03 +03:00
|
|
|
bool QIF::deployTemplate(PackageControl &pkg) {
|
2020-01-05 14:55:57 +03:00
|
|
|
auto customTemplate = QuasarAppUtils::Params::getStrArg("qif", "");
|
2020-01-13 18:25:03 +03:00
|
|
|
const DeployConfig *cfg = DeployCore::_config;
|
|
|
|
|
2020-01-19 13:26:47 +03:00
|
|
|
QStringList sufixes = {
|
|
|
|
"js", "qs", "xml"
|
|
|
|
};
|
|
|
|
|
2020-09-06 19:12:17 +03:00
|
|
|
QString defaultPackageTempalte = ":/Templates/QIF/Distributions/Templates/qif/packages/default";
|
|
|
|
QString defaultConfigCustomDesigne = ":/Templates/QIF/Distributions/Templates/qif/config custom designe/";
|
|
|
|
QString defaultConfig = ":/Templates/QIF/Distributions/Templates/qif/config/";
|
|
|
|
QHash<QString, QString> pakcagesTemplates;
|
2020-01-13 18:25:03 +03:00
|
|
|
|
2020-09-06 19:12:17 +03:00
|
|
|
if (!customTemplate.isEmpty()) {
|
|
|
|
QuasarAppUtils::Params::log("Using custom template for installer: " + customTemplate,
|
|
|
|
QuasarAppUtils::Info);
|
2020-01-13 18:25:03 +03:00
|
|
|
|
2020-09-07 14:38:23 +03:00
|
|
|
auto availablePacakages = QDir(customTemplate + "/packages").entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
|
2020-08-15 19:29:17 +03:00
|
|
|
|
2020-09-06 19:12:17 +03:00
|
|
|
for (const auto& pkg: availablePacakages) {
|
|
|
|
pakcagesTemplates.insert(pkg.fileName(), pkg.absoluteFilePath());
|
2020-01-15 11:50:30 +03:00
|
|
|
}
|
|
|
|
|
2020-09-06 19:12:17 +03:00
|
|
|
defaultConfigCustomDesigne = customTemplate + "/config";
|
|
|
|
defaultConfig = customTemplate + "/config";
|
|
|
|
}
|
2020-03-04 17:35:12 +03:00
|
|
|
|
2020-09-06 19:12:17 +03:00
|
|
|
for (auto it = cfg->packages().begin();
|
|
|
|
it != cfg->packages().end(); ++it) {
|
2020-03-04 17:35:12 +03:00
|
|
|
|
2020-09-06 19:12:17 +03:00
|
|
|
if (!deployPackage(it, cfg, sufixes, pakcagesTemplates, defaultPackageTempalte, pkg)) {
|
2020-01-15 11:50:30 +03:00
|
|
|
return false;
|
2020-01-14 15:48:35 +03:00
|
|
|
}
|
2020-09-06 19:12:17 +03:00
|
|
|
}
|
2020-01-14 15:48:35 +03:00
|
|
|
|
2020-09-06 19:12:17 +03:00
|
|
|
auto configLocation = cfg->getTargetDir() + "/" + getLocation() + "/config/";
|
2020-03-04 17:35:12 +03:00
|
|
|
|
2020-09-06 19:12:17 +03:00
|
|
|
auto qifStyle = getStyle(QuasarAppUtils::Params::getStrArg("qifStyle", ""));
|
|
|
|
auto qifBanner = QuasarAppUtils::Params::getStrArg("qifBanner", "");
|
|
|
|
auto qifLogo = QuasarAppUtils::Params::getStrArg("qifLogo", "");
|
2020-03-04 17:35:12 +03:00
|
|
|
|
2020-09-06 19:12:17 +03:00
|
|
|
auto configTemplate = defaultConfig;
|
|
|
|
if (qifStyle.size() || qifBanner.size() || qifLogo.size()) {
|
|
|
|
configTemplate = defaultConfigCustomDesigne;
|
|
|
|
}
|
2020-01-15 11:50:30 +03:00
|
|
|
|
2020-09-06 19:12:17 +03:00
|
|
|
if (!unpackDir(configTemplate,
|
|
|
|
configLocation, generalInfo, sufixes)) {
|
|
|
|
return false;
|
2020-01-05 14:55:57 +03:00
|
|
|
}
|
2020-01-14 15:48:35 +03:00
|
|
|
|
2020-09-06 19:12:17 +03:00
|
|
|
if (qifStyle.size() && !copyFile(qifStyle, configLocation + "/style.css", true)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (qifBanner.size() && !copyFile(qifBanner, configLocation + "/banner.png", true)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (qifLogo.size() && !copyFile(qifLogo, configLocation + "/logo.png", true)) {
|
|
|
|
return false;
|
|
|
|
}
|
2020-01-14 15:48:35 +03:00
|
|
|
|
|
|
|
return true;
|
2020-01-05 13:58:38 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
QStringList QIF::runArg() const {
|
2020-01-16 15:25:36 +03:00
|
|
|
|
|
|
|
auto location = DeployCore::_config->getTargetDir() + "/" + getLocation();
|
|
|
|
|
|
|
|
return {
|
|
|
|
"-c", location + "/config/config.xml",
|
2020-08-15 19:29:17 +03:00
|
|
|
"-p", location + "/packages/",
|
|
|
|
"-v",
|
|
|
|
installerFile()
|
2020-01-16 15:25:36 +03:00
|
|
|
};
|
2020-01-05 13:58:38 +03:00
|
|
|
}
|
|
|
|
|
2020-01-15 11:50:30 +03:00
|
|
|
bool QIF::removeTemplate() const {
|
|
|
|
auto customTemplate = QuasarAppUtils::Params::getStrArg("qif", "");
|
|
|
|
const DeployConfig *cfg = DeployCore::_config;
|
|
|
|
|
2020-03-08 13:52:26 +03:00
|
|
|
registerOutFiles();
|
2020-09-06 19:12:17 +03:00
|
|
|
return QDir(cfg->getTargetDir() + "/" + getLocation()).removeRecursively();
|
2020-01-15 11:50:30 +03:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2020-01-16 11:10:16 +03:00
|
|
|
QProcessEnvironment QIF::processEnvirement() const {
|
|
|
|
return QProcessEnvironment::systemEnvironment();
|
|
|
|
}
|
|
|
|
|
2020-03-08 13:52:26 +03:00
|
|
|
QStringList QIF::outPutFiles() const {
|
|
|
|
return {installerFile()};
|
|
|
|
}
|
|
|
|
|
2020-03-04 17:35:12 +03:00
|
|
|
QString QIF::getStyle(const QString& input) const {
|
|
|
|
QDir resurces(":/Styles/Distributions/Templates/qif/Styles");
|
|
|
|
auto list = resurces.entryInfoList(QDir::Files);
|
|
|
|
for (const auto& style : list) {
|
|
|
|
if (input == style.baseName()) {
|
|
|
|
return style.absoluteFilePath();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
QFileInfo f(input);
|
|
|
|
|
|
|
|
if (f.isFile()) {
|
|
|
|
return f.absoluteFilePath();
|
|
|
|
}
|
|
|
|
|
2020-04-04 15:43:46 +03:00
|
|
|
QuasarAppUtils::Params::log(input + " not exits",
|
2020-08-15 19:29:17 +03:00
|
|
|
QuasarAppUtils::Error);
|
2020-03-04 17:35:12 +03:00
|
|
|
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
2020-03-08 13:52:26 +03:00
|
|
|
QString QIF::installerFile() const {
|
|
|
|
#ifdef Q_OS_LINUX
|
|
|
|
QString sufix = ".run";
|
|
|
|
#else
|
|
|
|
QString sufix = ".exe";
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return DeployCore::_config->getTargetDir() + "/Installer" + generalInfo.Name + sufix;
|
|
|
|
}
|
|
|
|
|
2020-09-06 19:12:17 +03:00
|
|
|
bool QIF::deployPackage(const QHash<QString, DistroModule>::const_iterator& it,
|
|
|
|
const DeployConfig * cfg,
|
|
|
|
const QStringList sufixes,
|
|
|
|
const QHash<QString, QString>& pakcagesTemplates,
|
|
|
|
const QString& defaultPackageTempalte,
|
|
|
|
PackageControl &pkg) {
|
|
|
|
auto package = it.value();
|
|
|
|
|
|
|
|
TemplateInfo info;
|
|
|
|
info.Name = PathUtils::stripPath(it.key());
|
|
|
|
bool fDefaultPakcage = cfg->getDefaultPackage() == info.Name;
|
|
|
|
|
|
|
|
if (fDefaultPakcage) {
|
|
|
|
QFileInfo targetInfo(*package.targets().begin());
|
|
|
|
info.Name = targetInfo.baseName();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!package.name().isEmpty()) {
|
|
|
|
info.Name = package.name();
|
|
|
|
}
|
|
|
|
|
|
|
|
auto location = cfg->getTargetDir() + "/" + getLocation() + "/packages/" + info.Name;
|
|
|
|
auto locationData = location + "/data";
|
|
|
|
if (cfg->getDefaultPackage() != info.Name) {
|
|
|
|
locationData += "/" + info.Name;
|
|
|
|
}
|
|
|
|
|
|
|
|
info.Description = "This package contains the " + info.Name;
|
|
|
|
if (!package.description().isEmpty())
|
|
|
|
info.Description = package.description();
|
|
|
|
|
|
|
|
info.Version = "1.0";
|
|
|
|
if (!package.version().isEmpty())
|
|
|
|
info.Version = package.version();
|
|
|
|
|
|
|
|
info.ReleaseData = QDate::currentDate().toString("yyyy-MM-dd");
|
|
|
|
if (!package.releaseData().isEmpty())
|
|
|
|
info.ReleaseData = package.releaseData();
|
|
|
|
|
|
|
|
info.Icon = "icons/Icon.png";
|
|
|
|
if (package.icon().isEmpty()) {
|
|
|
|
if (!copyFile(":/Templates/QIF/Distributions/Templates/qif/Icon.png",
|
|
|
|
locationData + "/icons/", false)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
QFileInfo iconInfo(package.icon());
|
|
|
|
info.Icon = info.Name + "/icons/" + iconInfo.fileName();
|
|
|
|
if (!copyFile(package.icon(), locationData + "/icons/", false)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
info.Publisher = "Company";
|
|
|
|
if (!package.publisher().isEmpty())
|
|
|
|
info.Publisher = package.publisher();
|
|
|
|
|
|
|
|
QString cmdArray = "[";
|
|
|
|
int initSize = cmdArray.size();
|
|
|
|
for (const auto &target :package.targets()) {
|
|
|
|
auto fileinfo = QFileInfo(target);
|
|
|
|
if (fileinfo.suffix().compare("exe", ONLY_WIN_CASE_INSENSIATIVE) == 0 || fileinfo.suffix().isEmpty()) {
|
|
|
|
if (cmdArray.size() > initSize) {
|
|
|
|
cmdArray += ",";
|
|
|
|
}
|
|
|
|
cmdArray += "\"" + info.Name + "/" + fileinfo.fileName() + "\"";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
cmdArray += "]";
|
|
|
|
|
|
|
|
info.Custom = {{"[\"array\", \"of\", \"cmds\"]", cmdArray},
|
|
|
|
{"$LOCAL_ICON", info.Name + "/icons/" + QFileInfo(info.Icon).fileName()}};
|
|
|
|
|
|
|
|
|
|
|
|
if (info.Name.isEmpty()) {
|
|
|
|
info.Name = "Application";
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!unpackDir(pakcagesTemplates.value(package.name(), defaultPackageTempalte),
|
|
|
|
location, info, sufixes)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!pkg.movePackage(it.key(), locationData)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (fDefaultPakcage)
|
|
|
|
generalInfo = info;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|