From ed7cd841afa09766477e3bd03ff1700321d2540c Mon Sep 17 00:00:00 2001 From: Shane Synan Date: Sun, 13 May 2018 23:53:57 -0500 Subject: [PATCH] client: Migrate old highlight Channels to RegEx Add new settings minor version 8 to migrate existing local highlight rules to the new format. Specifically, any highlight rule with a specified "Channel" filter is adapted into a regular-expression rule. > Before Name: a word RegEx: disabled Channel: (ChannelA|AnotherPlace) > After Name: (^|\W)a word(\W|$) RegEx: enabled Channel: (ChannelA|AnotherPlace) This way RegEx channel rules will work by default now that the RegEx flag controls wildcard vs. reg-ex for channel names, too. And this specific migration is backwards-compatible with previous client versions, so downgrading won't break highlight rules. (Functionality changed in other migration steps might break on downgrade, however.) --- src/qtui/qtuiapplication.cpp | 50 +++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/src/qtui/qtuiapplication.cpp b/src/qtui/qtuiapplication.cpp index 974a28d3..568cbc11 100644 --- a/src/qtui/qtuiapplication.cpp +++ b/src/qtui/qtuiapplication.cpp @@ -219,7 +219,7 @@ bool QtUiApplication::migrateSettings() // // NOTE: If you increase the minor version, you MUST ALSO add new version upgrade logic in // applySettingsMigration()! Otherwise, settings upgrades will fail. - const uint VERSION_MINOR_CURRENT = 7; + const uint VERSION_MINOR_CURRENT = 8; // Stored minor version uint versionMinor = s.versionMinor(); @@ -284,6 +284,54 @@ bool QtUiApplication::applySettingsMigration(QtUiSettings settings, const uint n // saved. Exceptions will be noted below. // NOTE: If you add new upgrade logic here, you MUST ALSO increase VERSION_MINOR_CURRENT in // migrateSettings()! Otherwise, your upgrade logic won't ever be called. + case 8: + { + // New default changes: RegEx checkbox now toggles Channel regular expressions, too + // + // This only affects local highlights. Core-side highlights weren't released in stable when + // this change was made, so no need to migrate those. + + // -------- + // NotificationSettings + NotificationSettings notificationSettings; + + // Check each highlight rule for a "Channel" field. If one exists, convert to RegEx mode. + // This might be more efficient with std::transform() or such. It /is/ only run once... + auto highlightList = notificationSettings.highlightList(); + bool changesMade = false; + for (int index = 0; index < highlightList.count(); ++index) + { + // Load the highlight rule... + auto highlightRule = highlightList[index].toMap(); + + // Check if "Channel" has anything set and RegEx is disabled + if (!highlightRule["Channel"].toString().isEmpty() + && highlightRule["RegEx"].toBool() == false) { + // We have a rule to convert + + // Mark as a regular expression, allowing the Channel filtering to work the same as + // before the upgrade + highlightRule["RegEx"] = true; + + // Convert the main rule to regular expression, mirroring the conversion to wildcard + // format from QtUiMessageProcessor::checkForHighlight() + highlightRule["Name"] = + "(^|\\W)" + QRegExp::escape(highlightRule["Name"].toString()) + "(\\W|$)"; + + // Save the rule back + highlightList[index] = highlightRule; + changesMade = true; + } + } + + // Save the modified rules if any changes were made + if (changesMade) { + notificationSettings.setHighlightList(highlightList); + } + // -------- + + // Migration complete! + } case 7: { // New default changes: UseProxy is no longer used in CoreAccountSettings -- 2.20.1