diff --git a/src/librssguard/gui/dialogs/formmain.cpp b/src/librssguard/gui/dialogs/formmain.cpp index 490791de1..577537ec8 100644 --- a/src/librssguard/gui/dialogs/formmain.cpp +++ b/src/librssguard/gui/dialogs/formmain.cpp @@ -251,7 +251,7 @@ void FormMain::prepareMenus() { m_trayMenu->addAction(m_ui->m_actionSettings); m_trayMenu->addAction(m_ui->m_actionQuit); - qDebugNN << LOGSEC_MESSAGEMODEL << "Creating tray icon menu."; + qDebugNN << LOGSEC_GUI << "Creating tray icon menu."; } #if !defined(USE_WEBENGINE) diff --git a/src/librssguard/miscellaneous/application.cpp b/src/librssguard/miscellaneous/application.cpp index 83db3db54..bbfdcd0e6 100644 --- a/src/librssguard/miscellaneous/application.cpp +++ b/src/librssguard/miscellaneous/application.cpp @@ -141,6 +141,8 @@ Application::Application(const QString& id, int& argc, char** argv) QTimer::singleShot(1000, system(), &SystemFactory::checkForUpdatesOnStartup); + //nodejs()->installUpdatePackage({ "@cliqz/adblocker", ">=1.0.0 <2.0.0" }); + qDebugNN << LOGSEC_CORE << "OpenSSL version:" << QUOTE_W_SPACE_DOT(QSslSocket::sslLibraryVersionString()); diff --git a/src/librssguard/miscellaneous/iofactory.cpp b/src/librssguard/miscellaneous/iofactory.cpp index 6a6fe76e3..ea723e197 100644 --- a/src/librssguard/miscellaneous/iofactory.cpp +++ b/src/librssguard/miscellaneous/iofactory.cpp @@ -94,6 +94,26 @@ bool IOFactory::startProcessDetached(const QString& program, const QStringList& return process.startDetached(nullptr); } +void IOFactory::startProcess(QProcess* const proc, + const QString& executable, + const QStringList& arguments, + const QProcessEnvironment& pe, + const QString& working_directory) { + proc->setProgram(executable); + proc->setArguments(arguments); + + QProcessEnvironment system_pe = QProcessEnvironment::systemEnvironment(); + + system_pe.insert(pe); + proc->setProcessEnvironment(system_pe); + + if (!working_directory.isEmpty()) { + proc->setWorkingDirectory(working_directory); + } + + proc->start(); +} + QString IOFactory::startProcessGetOutput(const QString& executable, const QStringList& arguments, const QProcessEnvironment& pe, diff --git a/src/librssguard/miscellaneous/iofactory.h b/src/librssguard/miscellaneous/iofactory.h index 872e90b3e..c23594a18 100644 --- a/src/librssguard/miscellaneous/iofactory.h +++ b/src/librssguard/miscellaneous/iofactory.h @@ -32,6 +32,11 @@ class IOFactory { const QStringList& arguments, const QString& native_arguments = {}, const QString& working_directory = {}); + static void startProcess(QProcess* const proc, + const QString& executable, + const QStringList& arguments = {}, + const QProcessEnvironment& pe = {}, + const QString& working_directory = {}); static QString startProcessGetOutput(const QString& executable, const QStringList& arguments = {}, const QProcessEnvironment& pe = {}, diff --git a/src/librssguard/miscellaneous/nodejs.cpp b/src/librssguard/miscellaneous/nodejs.cpp index 4fcc8071c..a7155a1b3 100644 --- a/src/librssguard/miscellaneous/nodejs.cpp +++ b/src/librssguard/miscellaneous/nodejs.cpp @@ -3,6 +3,7 @@ #include "miscellaneous/nodejs.h" #include "exceptions/applicationexception.h" +#include "exceptions/processexception.h" #include "miscellaneous/application.h" #include "miscellaneous/iofactory.h" #include "miscellaneous/settings.h" @@ -73,7 +74,14 @@ NodeJs::PackageStatus NodeJs::packageStatus(const PackageMetadata& pkg) const { QJsonDocument json = QJsonDocument::fromJson(npm_ls.toUtf8()); QJsonObject deps = json.object()["dependencies"].toObject(); - return {}; + if (deps.contains(pkg.m_name)) { + QString vers = deps[pkg.m_name].toObject()["version"].toString(); + + return vers == pkg.m_version ? PackageStatus::UpToDate : PackageStatus::OutOfDate; + } + else { + return PackageStatus::NotInstalled; + } } void NodeJs::installUpdatePackage(const PackageMetadata& pkg) { @@ -81,12 +89,13 @@ void NodeJs::installUpdatePackage(const PackageMetadata& pkg) { switch (pkg_status) { case PackageStatus::NotInstalled: - break; - case PackageStatus::OutOfDate: + installPackage(pkg); break; case PackageStatus::UpToDate: + emit packageInstalledUpdated(pkg); + break; } } @@ -94,11 +103,47 @@ void NodeJs::installUpdatePackage(const PackageMetadata& pkg) { void NodeJs::installPackage(const PackageMetadata& pkg) { // npm install --prefix "." @cliqz/adblocker@">=1.0.0 <2.0.0" --production --save-exact //https://docs.npmjs.com/cli/v8/commands/npm-install + try { + QProcess* proc = new QProcess(); + connect(proc, QOverload::of(&QProcess::finished), this, [pkg, this](int exit_code, + QProcess::ExitStatus status) { + QProcess* sndr = qobject_cast(sender()); + + if (exit_code != EXIT_SUCCESS || status == QProcess::ExitStatus::CrashExit) { + qCriticalNN << LOGSEC_NODEJS << "Error when installing package" << QUOTE_W_SPACE_DOT(pkg.m_name) + << " Exit code:" << QUOTE_W_SPACE_DOT(exit_code) + << " Message:" << QUOTE_W_SPACE_DOT(sndr->readAllStandardError()); + + emit packageError(pkg, sndr->errorString()); + } + else { + qDebugNN << LOGSEC_NODEJS << "Installed/updated package" << QUOTE_W_SPACE(pkg.m_name) + << "with version" << QUOTE_W_SPACE_DOT(pkg.m_version); + emit packageInstalledUpdated(pkg); + } + }); + connect(proc, &QProcess::errorOccurred, this, [pkg, this](QProcess::ProcessError error) { + QProcess* sndr = qobject_cast(sender()); + + qCriticalNN << LOGSEC_NODEJS << "Error when installing package" << QUOTE_W_SPACE_DOT(pkg.m_name) + << " Message:" << QUOTE_W_SPACE_DOT(error); + + emit packageError(pkg, sndr->errorString()); + }); + + IOFactory::startProcess(proc, + npmExecutable(), + { QSL("install"), QSL("--production"), + QSL("%1@%2").arg(pkg.m_name, pkg.m_version), + QSL("--prefix"), processedPackageFolder() }); + } + catch (const ProcessException& ex) { + emit packageError(pkg, ex.message()); + } } -void NodeJs::updatePackage(const PackageMetadata& pkg) -{ +void NodeJs::updatePackage(const PackageMetadata& pkg) { // npm update --prefix "." @cliqz/adblocker@">=1.0.0 <2.0.0" --production --save-exact //https://docs.npmjs.com/cli/v8/commands/npm-update } diff --git a/src/librssguard/miscellaneous/nodejs.h b/src/librssguard/miscellaneous/nodejs.h index 4ab704703..326e4d702 100644 --- a/src/librssguard/miscellaneous/nodejs.h +++ b/src/librssguard/miscellaneous/nodejs.h @@ -61,6 +61,10 @@ class NodeJs : public QObject { // NOTE: https://docs.npmjs.com/cli/v8/commands/npm-install void installUpdatePackage(const PackageMetadata& pkg); + signals: + void packageError(const PackageMetadata& pkg, const QString& error); + void packageInstalledUpdated(const PackageMetadata& pkg); + private: void installPackage(const PackageMetadata& pkg); void updatePackage(const PackageMetadata& pkg); diff --git a/src/librssguard/services/greader/greadernetwork.cpp b/src/librssguard/services/greader/greadernetwork.cpp index 46d3f6a3e..f753c05e3 100644 --- a/src/librssguard/services/greader/greadernetwork.cpp +++ b/src/librssguard/services/greader/greadernetwork.cpp @@ -150,7 +150,7 @@ void GreaderNetwork::prepareFeedFetching(GreaderServiceRoot* root, qDebugNN << LOGSEC_GREADER << "Percentage of feeds for fetching:" - << QUOTE_W_SPACE_DOT(perc_of_fetching); + << QUOTE_W_SPACE_DOT(perc_of_fetching * 100.0); auto remote_starred_ids_list = itemIds(QSL(GREADER_API_FULL_STATE_IMPORTANT), false, proxy, -1, m_newerThanFilter);