From 6c58f1407df82d08bb4fb9d42d3d1bae3923d008 Mon Sep 17 00:00:00 2001 From: Vlad G Date: Sun, 21 Nov 2021 01:33:38 +0200 Subject: [PATCH 1/2] Test if compatible now --- src/bin/patchmanager-daemon/patchmanagerobject.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/bin/patchmanager-daemon/patchmanagerobject.cpp b/src/bin/patchmanager-daemon/patchmanagerobject.cpp index 47b99d831..f3f97fd1d 100644 --- a/src/bin/patchmanager-daemon/patchmanagerobject.cpp +++ b/src/bin/patchmanager-daemon/patchmanagerobject.cpp @@ -2400,6 +2400,7 @@ void PatchManagerObject::requestCheckForUpdates() QString latestVersion = patchVersion; + QStringList compatibleNow{}; // Used to detect changes in 'compatible' field. const QVariantList files = project.value("files").toList(); for (const QVariant &fileVar : files) { const QVariantMap file = fileVar.toMap(); @@ -2407,12 +2408,21 @@ void PatchManagerObject::requestCheckForUpdates() if (!compatible.contains(m_osRelease)) { continue; } + compatibleNow = compatible; const QString version = file.value("version").toString(); latestVersion = PatchManagerObject::maxVersion(latestVersion, version); } if (latestVersion == patchVersion) { qDebug() << Q_FUNC_INFO << projectName << "versions match"; + if (compatibleNow.length()) { + if (m_metadata[projectName][COMPATIBLE_KEY] != compatibleNow) { + qDebug() << Q_FUNC_INFO << projectName << "update the compatibility to " << compatibleNow; + m_metadata[projectName][COMPATIBLE_KEY] = compatibleNow; + } + // This only marks the flag in-memory. The patch.json file is not re-downloaded. + m_metadata[projectName][ISCOMPATIBLE_KEY] = compatibleNow.contains(m_osRelease); + } return; } qDebug() << Q_FUNC_INFO << "available:" << projectName << "version:" << latestVersion; From 3f756c04485b971bdacc055f032487fb68cbbf16 Mon Sep 17 00:00:00 2001 From: Vlad G Date: Sun, 21 Nov 2021 19:40:06 +0200 Subject: [PATCH 2/2] update only compatibility in patch.json --- .../patchmanagerobject.cpp | 55 +++++++++++++++++-- .../patchmanager-daemon/patchmanagerobject.h | 1 + 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/src/bin/patchmanager-daemon/patchmanagerobject.cpp b/src/bin/patchmanager-daemon/patchmanagerobject.cpp index f3f97fd1d..c94ed6bf9 100644 --- a/src/bin/patchmanager-daemon/patchmanagerobject.cpp +++ b/src/bin/patchmanager-daemon/patchmanagerobject.cpp @@ -214,6 +214,54 @@ bool PatchManagerObject::makePatch(const QDir &root, const QString &patchPath, Q return true; } +void PatchManagerObject::updatePatchCompatibility(const QString &projectName, const QStringList compatibility) +{ + auto& json = m_metadata[projectName]; + if (json[COMPATIBLE_KEY] != compatibility) { + qInfo() << Q_FUNC_INFO << projectName << " updating the compatibility to " << compatibility; + // In memory + json[COMPATIBLE_KEY] = compatibility; + json[ISCOMPATIBLE_KEY] = compatibility.contains(m_osRelease); + + // Read patch.json + auto patchPath = json[PATCH_KEY].toString(); + auto patchDir = QDir(PATCHES_DIR); + if (!patchDir.cd(patchPath)) { + qWarning() << Q_FUNC_INFO << "Cannot cd to " << patchDir.path(); + return; + } + + QFile file(patchDir.absoluteFilePath(PATCH_FILE)); + if (!file.open(QIODevice::ReadOnly)) { + qWarning() << Q_FUNC_INFO << "Cannot find " << file.fileName() << " in " << patchDir.path(); + return; + } + + + QJsonParseError error; + QJsonDocument document = QJsonDocument::fromJson(file.readAll(), &error); + QJsonObject jsonObject = document.object(); + file.close(); + + // Write patch.json + jsonObject[COMPATIBLE_KEY] = QJsonArray::fromStringList(compatibility); + + if (error.error != QJsonParseError::NoError) { + qWarning() << Q_FUNC_INFO << error.errorString(); + return; + } + + if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { + qWarning() << Q_FUNC_INFO << "Cannot write " << file.fileName() << " in " << patchDir.path(); + return; + } + + file.write(QJsonDocument(jsonObject).toJson()); + + } +} + + void PatchManagerObject::notify(const QString &patch, NotifyAction action) { qDebug() << Q_FUNC_INFO << patch << action; @@ -2416,12 +2464,7 @@ void PatchManagerObject::requestCheckForUpdates() if (latestVersion == patchVersion) { qDebug() << Q_FUNC_INFO << projectName << "versions match"; if (compatibleNow.length()) { - if (m_metadata[projectName][COMPATIBLE_KEY] != compatibleNow) { - qDebug() << Q_FUNC_INFO << projectName << "update the compatibility to " << compatibleNow; - m_metadata[projectName][COMPATIBLE_KEY] = compatibleNow; - } - // This only marks the flag in-memory. The patch.json file is not re-downloaded. - m_metadata[projectName][ISCOMPATIBLE_KEY] = compatibleNow.contains(m_osRelease); + updatePatchCompatibility(projectName, compatibleNow); } return; } diff --git a/src/bin/patchmanager-daemon/patchmanagerobject.h b/src/bin/patchmanager-daemon/patchmanagerobject.h index 272a550b7..e2e7d95b3 100644 --- a/src/bin/patchmanager-daemon/patchmanagerobject.h +++ b/src/bin/patchmanager-daemon/patchmanagerobject.h @@ -211,6 +211,7 @@ private slots: QList listPatchesFromDir(const QString &dir, QSet &existingPatches, bool existing = true); bool makePatch(const QDir &root, const QString &patchPath, QVariantMap &patch, bool available); + void updatePatchCompatibility(const QString &projectName, const QStringList compatibility); void notify(const QString &patch, PatchManagerObject::NotifyAction action); QSet getAppliedPatches() const;