client: Migrate old highlight Channels to RegEx
authorShane Synan <digitalcircuit36939@gmail.com>
Mon, 14 May 2018 04:53:57 +0000 (23:53 -0500)
committerManuel Nickschas <sputnick@quassel-irc.org>
Wed, 6 Jun 2018 17:15:14 +0000 (19:15 +0200)
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

index 974a28d..568cbc1 100644 (file)
@@ -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.
     //
     // 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();
 
     // 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.
     // 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
     case 7:
     {
         // New default changes: UseProxy is no longer used in CoreAccountSettings