aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Port <benjamin.port@enioka.com>2020-03-17 15:13:11 +0100
committerBenjamin Port <benjamin.port@enioka.com>2020-04-17 14:48:42 +0200
commitbe28e096c5337b61a5e2f6e048ea297b2cc4b916 (patch)
treef3aac7a7d8ed5b8e90f65a86f44bb2e7e5e8057b
parent65cc12ab3ec8ca313d0e9d9b6d506e9fa9042bc1 (diff)
downloadkconfig-be28e096c5337b61a5e2f6e048ea297b2cc4b916.tar.gz
kconfig-be28e096c5337b61a5e2f6e048ea297b2cc4b916.tar.bz2
Add force save behavior to KEntryMap
Summary: Fix the following bug, if an entry is set on HOME/.config/kdeglobals and on a specific config file like kcmfonts When you hit restore defaults button and apply, value will be not wrote on the specific file, but then the value is the one from kdeglobals This patch ensure we write the key to the specific configuration file on those case with an empty value. KConfig will take default value automatically Test Plan: Added a test to ensure flag is working Tested using some KCM to ensure all is working fine Reviewers: ervin, dfaure, meven, crossi, hchain Reviewed By: ervin, dfaure, meven Subscribers: kde-frameworks-devel Tags: #frameworks Differential Revision: https://phabricator.kde.org/D28128
-rw-r--r--autotests/kconfigtest.cpp27
-rw-r--r--autotests/kconfigtest.h2
-rw-r--r--src/core/kconfigdata.cpp4
-rw-r--r--src/core/kconfigdata.h7
-rw-r--r--src/core/kconfigini.cpp5
5 files changed, 43 insertions, 2 deletions
diff --git a/autotests/kconfigtest.cpp b/autotests/kconfigtest.cpp
index 736274c6..4d38b150 100644
--- a/autotests/kconfigtest.cpp
+++ b/autotests/kconfigtest.cpp
@@ -1949,3 +1949,30 @@ void KConfigTest::testNotify()
QCOMPARE(otherWatcherSpy[0][0].value<KConfigGroup>().name(), QStringLiteral("TopLevelGroup"));
QCOMPARE(otherWatcherSpy[0][1].value<QByteArrayList>(), QByteArrayList({"someGlobalEntry"}));
}
+
+void KConfigTest::testKdeglobalsVsDefault()
+{
+ // Add testRestore key with global value in kdeglobals
+ KConfig glob(QStringLiteral("kdeglobals"));
+ KConfigGroup generalGlob(&glob, "General");
+ generalGlob.writeEntry("testRestore", "global");
+ QVERIFY(glob.sync());
+
+ KConfig local(QStringLiteral(TEST_SUBDIR "restorerc"));
+ KConfigGroup generalLocal(&local, "General");
+ // Check if we get global and not the default value from cpp (defaultcpp) when reading data from restorerc
+ QCOMPARE(generalLocal.readEntry("testRestore", "defaultcpp"), "global");
+
+ // Add test restore key with restore value in restorerc file
+ generalLocal.writeEntry("testRestore", "restore");
+ QVERIFY(local.sync());
+ local.reparseConfiguration();
+ // We expect to get the value from restorerc file
+ QCOMPARE(generalLocal.readEntry("testRestore", "defaultcpp"), "restore");
+
+ // Revert to default testRestore key and we expect to get default value and not the global one
+ generalLocal.revertToDefault("testRestore");
+ local.sync();
+ local.reparseConfiguration();
+ QCOMPARE(generalLocal.readEntry("testRestore", "defaultcpp"), "defaultcpp");
+}
diff --git a/autotests/kconfigtest.h b/autotests/kconfigtest.h
index e97e4a5d..7617d0e7 100644
--- a/autotests/kconfigtest.h
+++ b/autotests/kconfigtest.h
@@ -73,6 +73,8 @@ private Q_SLOTS:
void testThreads();
+ void testKdeglobalsVsDefault();
+
// should be last
void testSyncOnExit();
};
diff --git a/src/core/kconfigdata.cpp b/src/core/kconfigdata.cpp
index bfa662a0..5ead8167 100644
--- a/src/core/kconfigdata.cpp
+++ b/src/core/kconfigdata.cpp
@@ -100,6 +100,10 @@ bool KEntryMap::setEntry(const QByteArray &group, const QByteArray &key, const Q
k = it.key();
e = *it;
//qDebug() << "found existing entry for key" << k;
+ // If overridden entry is global and not default. And it's overridden by a non global
+ if (e.bGlobal && !(options & EntryGlobal) && !k.bDefault) {
+ e.bOverridesGlobal = true;
+ }
} else {
// make sure the group marker is in the map
KEntryMap const *that = this;
diff --git a/src/core/kconfigdata.h b/src/core/kconfigdata.h
index d92076d9..2f36b1bb 100644
--- a/src/core/kconfigdata.h
+++ b/src/core/kconfigdata.h
@@ -24,7 +24,7 @@ struct KEntry {
KEntry()
: mValue(), bDirty(false),
bGlobal(false), bImmutable(false), bDeleted(false), bExpand(false), bReverted(false),
- bLocalizedCountry(false), bNotify(false) {}
+ bLocalizedCountry(false), bNotify(false), bOverridesGlobal(false) {}
/** @internal */
QByteArray mValue;
/**
@@ -58,6 +58,11 @@ struct KEntry {
bool bLocalizedCountry: 1;
bool bNotify: 1;
+
+ /**
+ * Entry will need to be written on a non global file even if it matches default value
+ */
+ bool bOverridesGlobal: 1;
};
// These operators are used to check whether an entry which is about
diff --git a/src/core/kconfigini.cpp b/src/core/kconfigini.cpp
index 2cea7338..9601d036 100644
--- a/src/core/kconfigini.cpp
+++ b/src/core/kconfigini.cpp
@@ -429,7 +429,10 @@ bool KConfigIniBackend::writeConfig(const QByteArray &locale, KEntryMap &entryMa
// only write entries that have the same "globality" as the file
if (it->bGlobal == bGlobal) {
- if (it->bReverted) {
+ if (it->bReverted && it->bOverridesGlobal) {
+ it->bDeleted = true;
+ writeMap[key] = *it;
+ } else if (it->bReverted) {
writeMap.remove(key);
} else if (!it->bDeleted) {
writeMap[key] = *it;