diff --git a/dconfig-center/dde-dconfig-daemon/dconfig_global.h b/dconfig-center/dde-dconfig-daemon/dconfig_global.h index a9ea532..5fabc36 100644 --- a/dconfig-center/dde-dconfig-daemon/dconfig_global.h +++ b/dconfig-center/dde-dconfig-daemon/dconfig_global.h @@ -96,7 +96,9 @@ inline ConfigureId getMetaConfigureId(const QString &path) ConfigureId info; // /usr/share/dsg/configs/[$appid]/[$subpath]/$resource.json // Use negative lookahead (?!overrides/) to exclude override paths which should be handled by getOverrideConfigureId - static QRegularExpression usrReg(R"(/configs/(?!overrides/)(?([a-z0-9\s\-_\@\-\^!#$%&.]+\/)?)(?([a-z0-9\s\-_\@\-\^!#$%&.]+\/)*)(?[a-z0-9\s\-_\@\-\^!#$%&.]+).json$)"); + static QRegularExpression usrReg( + R"(/configs/(?!overrides/)(?(?>[a-zA-Z0-9\s_@^!#$%&.\-]+)\/)?(?(?:(?>[a-zA-Z0-9\s_@^!#$%&.\-]+)\/)*)(?[a-zA-Z0-9\s_@^!#$%&.\-]+)\.json$)" + ); QRegularExpressionMatch match; match = usrReg.match(path); @@ -114,10 +116,14 @@ inline ConfigureId getOverrideConfigureId(const QString &path) { ConfigureId info; // /usr/share/dsg/configs/overrides/[$appid]/$resource/[$subpath]/$override_id.json - static QRegularExpression usrReg(R"(/configs/overrides/(?([a-z0-9\s\-_\@\-\^!#$%&.]+\/)?)(?[a-z0-9\s\-_\@\-\^!#$%&.]+)/(?([a-z0-9\s\-_\@\-\^!#$%&.]+\/)*)(?[a-z0-9\s\-_\@\-\^!#$%&.]+).json$)"); + static QRegularExpression usrReg( + R"(/configs/overrides/(?(?>[a-zA-Z0-9\s_@^!#$%&.\-]+)\/)?(?(?>[a-zA-Z0-9\s_@^!#$%&.\-]+))/(?(?:(?>[a-zA-Z0-9\s_@^!#$%&.\-]+)\/)*)(?[a-zA-Z0-9\s_@^!#$%&.\-]+)\.json$)" + ); // /etc/dsg/configs/overrides/[$appid]/$resource/[$subpath]/$override_id.json - static QRegularExpression etcReg(R"(^/etc/dsg/configs/overrides/(?([a-z0-9\s\-_\@\-\^!#$%&.]+\/)?)(?[a-z0-9\s\-_\@\-\^!#$%&.]+)/(?([a-z0-9\s\-_\@\-\^!#$%&.]+\/)*)(?[a-z0-9\s\-_\@\-\^!#$%&.]+).json$)"); + static QRegularExpression etcReg( + R"(^/etc/dsg/configs/overrides/(?(?>[a-zA-Z0-9\s_@^!#$%&.\-]+)\/)?(?(?>[a-zA-Z0-9\s_@^!#$%&.\-]+))/(?(?:(?>[a-zA-Z0-9\s_@^!#$%&.\-]+)\/)*)(?[a-zA-Z0-9\s_@^!#$%&.\-]+)\.json$)" + ); QRegularExpressionMatch match; match = usrReg.match(path); diff --git a/dconfig-center/dde-dconfig-daemon/dconfigserver.cpp b/dconfig-center/dde-dconfig-daemon/dconfigserver.cpp index 44efd78..ad9f68d 100644 --- a/dconfig-center/dde-dconfig-daemon/dconfigserver.cpp +++ b/dconfig-center/dde-dconfig-daemon/dconfigserver.cpp @@ -435,7 +435,7 @@ bool DSGConfigServer::isConfigurePath(const QString &path, const QString &appId) 当描述文件被修改或override目录新增、移除、修改文件时,需要重新解析对应的文件内容, 提供刷新服务,由配置工具调用来运行时刷新提供的文件访问信息。 */ -void DSGConfigServer::update(const QString &path) +std::optional DSGConfigServer::updateInternal(const QString &path) { qCInfo(cfLog()) << "Update resource:" << path; @@ -445,15 +445,9 @@ void DSGConfigServer::update(const QString &path) qPrintable(configureInfo.subpath), qPrintable(configureInfo.resource)); if (configureInfo.isInValid()) { - QString errorMsg = QString("It's illegal resource [%1].").arg(path); - if (calledFromDBus()) { - sendErrorReply(QDBusError::Failed, errorMsg); - } - qWarning() << errorMsg; - return; + return QString("It's illegal resource [%1].").arg(path); } - const GenericResourceKey resourceKey = getGenericResourceKey(configureInfo.resource, configureInfo.subpath); if (auto resource = resourceObject(resourceKey)) { qCInfo(cfLog, "Updated the resouce:[%s], for the appid:[%s].", @@ -461,11 +455,19 @@ void DSGConfigServer::update(const QString &path) qPrintable(configureInfo.appid)); const auto &innerAppid = outerAppidToInner(configureInfo.appid); if (!resource->reparse(innerAppid)) { - QString errorMsg = QString("Update the resource path[%1] error.").arg(path); - if (calledFromDBus()) { - sendErrorReply(QDBusError::Failed, errorMsg); - } - qWarning() << qPrintable(errorMsg); + return QString("Update the resource path[%1] error.").arg(path); + } + } + return std::nullopt; +} + +void DSGConfigServer::update(const QString &path) +{ + const auto errorMsg = updateInternal(path); + if (errorMsg) { + qWarning() << *errorMsg; + if (calledFromDBus()) { + sendErrorReply(QDBusError::Failed, *errorMsg); } } } @@ -557,12 +559,23 @@ void DSGConfigServer::reload() changedFiles.removeDuplicates(); + if (changedFiles.isEmpty()) { + qCInfo(cfLog()) << "Reload completed, no files changed"; + return; + } + // Process changed files + int failedCount = 0; for (const auto &file : std::as_const(changedFiles)) { - update(file); + const auto errorMsg = updateInternal(file); + if (errorMsg) { + qCWarning(cfLog()) << "Reload failed to update file:" << file << ", reason:" << *errorMsg; + ++failedCount; + } } - qCInfo(cfLog()) << "Reload completed, processed" << changedFiles.size() << "files"; + qCInfo(cfLog()) << "Reload completed, processed" << changedFiles.size() << "files," + << failedCount << "failed"; } // Get all configuration file signatures diff --git a/dconfig-center/dde-dconfig-daemon/dconfigserver.h b/dconfig-center/dde-dconfig-daemon/dconfigserver.h index 8c3af3f..f4127da 100644 --- a/dconfig-center/dde-dconfig-daemon/dconfigserver.h +++ b/dconfig-center/dde-dconfig-daemon/dconfigserver.h @@ -5,6 +5,7 @@ #pragma once #include "dconfig_global.h" +#include #include #include #include @@ -83,6 +84,9 @@ private Q_SLOTS: ConfigureId getConfigureIdByPath(const QString &path); bool isConfigurePath(const QString &path, const QString& appId) const; + + std::optional updateInternal(const QString &path); + // Reload interface related structures and methods struct FileSignature { qint64 size;