allow multi package nodejs install
This commit is contained in:
parent
d21520f28a
commit
1389a86083
7 changed files with 90 additions and 52 deletions
|
@ -847,20 +847,19 @@ void Application::parseCmdArgumentsFromMyInstance() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::onNodeJsPackageUpdateError(const NodeJs::PackageMetadata& pkg, const QString& error) {
|
void Application::onNodeJsPackageUpdateError(const QList<NodeJs::PackageMetadata>& pkgs, const QString& error) {
|
||||||
qApp->showGuiMessage(Notification::Event::NodePackageUpdated,
|
qApp->showGuiMessage(Notification::Event::NodePackageUpdated,
|
||||||
{ {},
|
{ {},
|
||||||
tr("Package %1 was NOT updated to version %2 because of error: %3.").arg(pkg.m_name,
|
tr("Packages %1 were NOT updated because of error: %3.").arg(NodeJs::packagesToString(pkgs),
|
||||||
pkg.m_version,
|
error),
|
||||||
error),
|
|
||||||
QSystemTrayIcon::MessageIcon::Critical });
|
QSystemTrayIcon::MessageIcon::Critical });
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::onNodeJsPackageInstalled(const NodeJs::PackageMetadata& pkg, bool already_up_to_date) {
|
void Application::onNodeJsPackageInstalled(const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date) {
|
||||||
if (!already_up_to_date) {
|
if (!already_up_to_date) {
|
||||||
qApp->showGuiMessage(Notification::Event::NodePackageUpdated,
|
qApp->showGuiMessage(Notification::Event::NodePackageUpdated,
|
||||||
{ {},
|
{ {},
|
||||||
tr("Package %1 was updated to version %2.").arg(pkg.m_name, pkg.m_version),
|
tr("Packages %1 were updated.").arg(NodeJs::packagesToString(pkgs)),
|
||||||
QSystemTrayIcon::MessageIcon::Information });
|
QSystemTrayIcon::MessageIcon::Information });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -172,8 +172,8 @@ class RSSGUARD_DLLSPEC Application : public SingleApplication {
|
||||||
void parseCmdArgumentsFromMyInstance();
|
void parseCmdArgumentsFromMyInstance();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onNodeJsPackageUpdateError(const NodeJs::PackageMetadata& pkg, const QString& error);
|
void onNodeJsPackageUpdateError(const QList<NodeJs::PackageMetadata>& pkgs, const QString& error);
|
||||||
void onNodeJsPackageInstalled(const NodeJs::PackageMetadata& pkg, bool already_up_to_date);
|
void onNodeJsPackageInstalled(const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date);
|
||||||
void onCommitData(QSessionManager& manager);
|
void onCommitData(QSessionManager& manager);
|
||||||
void onSaveState(QSessionManager& manager);
|
void onSaveState(QSessionManager& manager);
|
||||||
void onAboutToQuit();
|
void onAboutToQuit();
|
||||||
|
|
|
@ -94,66 +94,94 @@ NodeJs::PackageStatus NodeJs::packageStatus(const PackageMetadata& pkg) const {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NodeJs::installUpdatePackage(const PackageMetadata& pkg) {
|
void NodeJs::installUpdatePackages(const QList<PackageMetadata>& pkgs) {
|
||||||
auto pkg_status = packageStatus(pkg);
|
QList<PackageMetadata> to_install;
|
||||||
|
QStringList desc;
|
||||||
|
|
||||||
switch (pkg_status) {
|
for (const PackageMetadata& mt : pkgs) {
|
||||||
case PackageStatus::NotInstalled:
|
auto pkg_status = packageStatus(mt);
|
||||||
case PackageStatus::OutOfDate:
|
|
||||||
installPackage(pkg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PackageStatus::UpToDate:
|
switch (pkg_status) {
|
||||||
qDebugNN << LOGSEC_NODEJS << "Package" << QUOTE_W_SPACE(pkg.m_name) << "is up-to-date.";
|
case PackageStatus::NotInstalled:
|
||||||
|
case PackageStatus::OutOfDate:
|
||||||
|
to_install.append(mt);
|
||||||
|
break;
|
||||||
|
|
||||||
emit packageInstalledUpdated(pkg, true);
|
default:
|
||||||
|
desc << QSL("%1@%2").arg(mt.m_name, mt.m_version);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
if (to_install.isEmpty()) {
|
||||||
|
qDebugNN << LOGSEC_NODEJS << "Packages" << QUOTE_W_SPACE(desc.join(QL1S(", "))) << "are up-to-date.";
|
||||||
|
|
||||||
|
emit packageInstalledUpdated(pkgs, true);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
installPackages(pkgs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NodeJs::installPackage(const PackageMetadata& pkg) {
|
QString NodeJs::packagesToString(const QList<PackageMetadata>& pkgs) {
|
||||||
|
QStringList desc;
|
||||||
|
|
||||||
|
for (const PackageMetadata& mt : pkgs) {
|
||||||
|
desc << QSL("%1@%2").arg(mt.m_name, mt.m_version);
|
||||||
|
}
|
||||||
|
|
||||||
|
return desc.join(QL1S(", "));
|
||||||
|
}
|
||||||
|
|
||||||
|
void NodeJs::installPackages(const QList<PackageMetadata>& pkgs) {
|
||||||
|
QStringList to_install;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
for (const PackageMetadata& mt : pkgs) {
|
||||||
|
to_install.append(QSL("%1@%2").arg(mt.m_name, mt.m_version));
|
||||||
|
}
|
||||||
|
|
||||||
QProcess* proc = new QProcess();
|
QProcess* proc = new QProcess();
|
||||||
|
|
||||||
connect(proc, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [pkg, this](int exit_code,
|
connect(proc, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
|
||||||
QProcess::ExitStatus status) {
|
this, [pkgs, this](int exit_code,
|
||||||
|
QProcess::ExitStatus status) {
|
||||||
QProcess* sndr = qobject_cast<QProcess*>(sender());
|
QProcess* sndr = qobject_cast<QProcess*>(sender());
|
||||||
|
|
||||||
if (exit_code != EXIT_SUCCESS || status == QProcess::ExitStatus::CrashExit) {
|
if (exit_code != EXIT_SUCCESS || status == QProcess::ExitStatus::CrashExit) {
|
||||||
qCriticalNN << LOGSEC_NODEJS << "Error when installing package" << QUOTE_W_SPACE_DOT(pkg.m_name)
|
qCriticalNN << LOGSEC_NODEJS << "Error when installing packages" << QUOTE_W_SPACE_DOT(packagesToString(pkgs))
|
||||||
<< " Exit code:" << QUOTE_W_SPACE_DOT(exit_code)
|
<< " Exit code:" << QUOTE_W_SPACE_DOT(exit_code)
|
||||||
<< " Message:" << QUOTE_W_SPACE_DOT(sndr->readAllStandardError());
|
<< " Message:" << QUOTE_W_SPACE_DOT(sndr->readAllStandardError());
|
||||||
|
|
||||||
emit packageError(pkg, sndr->errorString());
|
emit packageError(pkgs, sndr->errorString());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
qDebugNN << LOGSEC_NODEJS << "Installed/updated package" << QUOTE_W_SPACE(pkg.m_name)
|
qDebugNN << LOGSEC_NODEJS << "Installed/updated packages" << QUOTE_W_SPACE(packagesToString(pkgs));
|
||||||
<< "with version" << QUOTE_W_SPACE_DOT(pkg.m_version);
|
emit packageInstalledUpdated(pkgs, false);
|
||||||
emit packageInstalledUpdated(pkg, false);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
connect(proc, &QProcess::errorOccurred, this, [pkg, this](QProcess::ProcessError error) {
|
connect(proc, &QProcess::errorOccurred, this, [pkgs, this](QProcess::ProcessError error) {
|
||||||
QProcess* sndr = qobject_cast<QProcess*>(sender());
|
QProcess* sndr = qobject_cast<QProcess*>(sender());
|
||||||
|
|
||||||
qCriticalNN << LOGSEC_NODEJS << "Error when installing package" << QUOTE_W_SPACE_DOT(pkg.m_name)
|
qCriticalNN << LOGSEC_NODEJS << "Error when installing packages" << QUOTE_W_SPACE_DOT(packagesToString(pkgs))
|
||||||
<< " Message:" << QUOTE_W_SPACE_DOT(error);
|
<< " Message:" << QUOTE_W_SPACE_DOT(error);
|
||||||
|
|
||||||
emit packageError(pkg, sndr->errorString());
|
emit packageError(pkgs, sndr->errorString());
|
||||||
});
|
});
|
||||||
|
|
||||||
qDebugNN << LOGSEC_NODEJS << "Installing package" << QUOTE_W_SPACE_DOT(pkg.m_name);
|
qDebugNN << LOGSEC_NODEJS << "Installing packages" << QUOTE_W_SPACE_DOT(packagesToString(pkgs));
|
||||||
|
|
||||||
IOFactory::startProcess(proc,
|
to_install.prepend(QSL("--production"));
|
||||||
npmExecutable(),
|
to_install.prepend(QSL("install"));
|
||||||
{ QSL("install"), QSL("--production"),
|
to_install.append(QSL("--prefix"));
|
||||||
QSL("%1@%2").arg(pkg.m_name, pkg.m_version),
|
to_install.append(processedPackageFolder());
|
||||||
QSL("--prefix"), processedPackageFolder() });
|
|
||||||
|
IOFactory::startProcess(proc, npmExecutable(), to_install);
|
||||||
}
|
}
|
||||||
catch (const ProcessException& ex) {
|
catch (const ProcessException& ex) {
|
||||||
qCriticalNN << LOGSEC_NODEJS << "Package" << QUOTE_W_SPACE(pkg.m_name)
|
qCriticalNN << LOGSEC_NODEJS << "Packages" << QUOTE_W_SPACE(to_install)
|
||||||
"was not installed, error:" << QUOTE_W_SPACE_DOT(ex.message());
|
<< "were not installed, error:" << QUOTE_W_SPACE_DOT(ex.message());
|
||||||
|
|
||||||
emit packageError(pkg, ex.message());
|
emit packageError(pkgs, ex.message());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,14 +62,16 @@ class NodeJs : public QObject {
|
||||||
// If package IS installed but out-of-date, it is updated to desired versions.
|
// If package IS installed but out-of-date, it is updated to desired versions.
|
||||||
//
|
//
|
||||||
// NOTE: https://docs.npmjs.com/cli/v8/commands/npm-install
|
// NOTE: https://docs.npmjs.com/cli/v8/commands/npm-install
|
||||||
void installUpdatePackage(const PackageMetadata& pkg);
|
void installUpdatePackages(const QList<PackageMetadata>& pkgs);
|
||||||
|
|
||||||
|
static QString packagesToString(const QList<PackageMetadata>& pkgs);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void packageError(const PackageMetadata& pkg, const QString& error);
|
void packageError(const QList<PackageMetadata>& pkgs, const QString& error);
|
||||||
void packageInstalledUpdated(const PackageMetadata& pkg, bool already_up_to_date);
|
void packageInstalledUpdated(const QList<PackageMetadata>& pkgs, bool already_up_to_date);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void installPackage(const PackageMetadata& pkg);
|
void installPackages(const QList<PackageMetadata>& pkgs);
|
||||||
|
|
||||||
Settings* m_settings;
|
Settings* m_settings;
|
||||||
};
|
};
|
||||||
|
|
|
@ -146,10 +146,10 @@ QString Notification::nameForEvent(Notification::Event event) {
|
||||||
return QObject::tr("Miscellaneous events");
|
return QObject::tr("Miscellaneous events");
|
||||||
|
|
||||||
case Notification::Event::NodePackageUpdated:
|
case Notification::Event::NodePackageUpdated:
|
||||||
return QObject::tr("Node.js - package updated");
|
return QObject::tr("Node.js - package(s) updated");
|
||||||
|
|
||||||
case Notification::Event::NodePackageFailedToUpdate:
|
case Notification::Event::NodePackageFailedToUpdate:
|
||||||
return QObject::tr("Node.js - package failed to updated");
|
return QObject::tr("Node.js - package(s) failed to updated");
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return QObject::tr("Unknown event");
|
return QObject::tr("Unknown event");
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include "network-web/adblock/adblockmanager.h"
|
#include "network-web/adblock/adblockmanager.h"
|
||||||
|
|
||||||
|
#include "3rd-party/boolinq/boolinq.h"
|
||||||
#include "exceptions/applicationexception.h"
|
#include "exceptions/applicationexception.h"
|
||||||
#include "exceptions/networkexception.h"
|
#include "exceptions/networkexception.h"
|
||||||
#include "miscellaneous/application.h"
|
#include "miscellaneous/application.h"
|
||||||
|
@ -103,7 +104,7 @@ void AdBlockManager::setEnabled(bool enabled) {
|
||||||
if (m_enabled) {
|
if (m_enabled) {
|
||||||
if (!m_installing) {
|
if (!m_installing) {
|
||||||
m_installing = true;
|
m_installing = true;
|
||||||
qApp->nodejs()->installUpdatePackage({ QSL(CLIQZ_ADBLOCKED_PACKAGE), QSL(CLIQZ_ADBLOCKED_VERSION) });
|
qApp->nodejs()->installUpdatePackages({ { QSL(CLIQZ_ADBLOCKED_PACKAGE), QSL(CLIQZ_ADBLOCKED_VERSION) } });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -175,10 +176,14 @@ void AdBlockManager::showDialog() {
|
||||||
AdBlockDialog(qApp->mainFormWidget()).exec();
|
AdBlockDialog(qApp->mainFormWidget()).exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdBlockManager::onPackageReady(const NodeJs::PackageMetadata& pkg, bool already_up_to_date) {
|
void AdBlockManager::onPackageReady(const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date) {
|
||||||
Q_UNUSED(already_up_to_date)
|
Q_UNUSED(already_up_to_date)
|
||||||
|
|
||||||
if (pkg.m_name == QSL(CLIQZ_ADBLOCKED_PACKAGE)) {
|
bool concerns_adblock = boolinq::from(pkgs).any([](const NodeJs::PackageMetadata& pkg) {
|
||||||
|
return pkg.m_name == QSL(CLIQZ_ADBLOCKED_PACKAGE);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (concerns_adblock) {
|
||||||
m_installing = false;
|
m_installing = false;
|
||||||
|
|
||||||
if (m_enabled) {
|
if (m_enabled) {
|
||||||
|
@ -197,8 +202,12 @@ void AdBlockManager::onPackageReady(const NodeJs::PackageMetadata& pkg, bool alr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdBlockManager::onPackageError(const NodeJs::PackageMetadata& pkg, const QString& error) {
|
void AdBlockManager::onPackageError(const QList<NodeJs::PackageMetadata>& pkgs, const QString& error) {
|
||||||
if (pkg.m_name == QSL(CLIQZ_ADBLOCKED_PACKAGE)) {
|
bool concerns_adblock = boolinq::from(pkgs).any([](const NodeJs::PackageMetadata& pkg) {
|
||||||
|
return pkg.m_name == QSL(CLIQZ_ADBLOCKED_PACKAGE);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (concerns_adblock) {
|
||||||
m_installing = false;
|
m_installing = false;
|
||||||
m_enabled = false;
|
m_enabled = false;
|
||||||
|
|
||||||
|
|
|
@ -71,8 +71,8 @@ class AdBlockManager : public QObject {
|
||||||
void processTerminated();
|
void processTerminated();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onPackageReady(const NodeJs::PackageMetadata& pkg, bool already_up_to_date);
|
void onPackageReady(const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date);
|
||||||
void onPackageError(const NodeJs::PackageMetadata& pkg, const QString& error);
|
void onPackageError(const QList<NodeJs::PackageMetadata>& pkgs, const QString& error);
|
||||||
void onServerProcessFinished(int exit_code, QProcess::ExitStatus exit_status);
|
void onServerProcessFinished(int exit_code, QProcess::ExitStatus exit_status);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
Loading…
Add table
Reference in a new issue