nodejs can install/update packages

This commit is contained in:
Martin Rotter 2022-02-07 15:20:01 +01:00
parent 43c611fcc0
commit d9d9541d71
7 changed files with 83 additions and 7 deletions

View File

@ -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)

View File

@ -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());

View File

@ -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,

View File

@ -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 = {},

View File

@ -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<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [pkg, this](int exit_code,
QProcess::ExitStatus status) {
QProcess* sndr = qobject_cast<QProcess*>(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<QProcess*>(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
}

View File

@ -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);

View File

@ -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);