From d13d7b4566d551d027830f7dfc987ba3a8e2dd4f Mon Sep 17 00:00:00 2001 From: Claire Date: Tue, 10 Feb 2026 21:53:43 +0100 Subject: [PATCH] Fix server theme migration (#37810) --- .../20260209142402_migrate_default_theme_setting.rb | 13 +++++-------- lib/tasks/tests.rake | 8 +++++++- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/db/migrate/20260209142402_migrate_default_theme_setting.rb b/db/migrate/20260209142402_migrate_default_theme_setting.rb index d8f6ca310fa..bea6d3d0403 100644 --- a/db/migrate/20260209142402_migrate_default_theme_setting.rb +++ b/db/migrate/20260209142402_migrate_default_theme_setting.rb @@ -7,15 +7,12 @@ class MigrateDefaultThemeSetting < ActiveRecord::Migration[8.0] Setting.reset_column_information setting = Setting.find_by(var: 'theme') - return unless setting.present? && setting.attributes['value'].present? && %w(mastodon-light contrast system).include?(setting.attributes['value']) + return unless setting.present? && setting.attributes['value'].present? - Setting.upsert( - { - var: 'theme', - value: "--- default\n", - }, - unique_by: index_exists?(:settings, [:thing_type, :thing_id, :var]) ? [:thing_type, :thing_id, :var] : :var - ) + theme = YAML.safe_load(setting.attributes['value'], permitted_classes: [ActiveSupport::HashWithIndifferentAccess, Symbol]) + return unless %w(mastodon-light contrast system).include?(theme) + + setting.update_column('value', "--- default\n") end def down; end diff --git a/lib/tasks/tests.rake b/lib/tasks/tests.rake index 0c5c6a09caf..6f41d07955a 100644 --- a/lib/tasks/tests.rake +++ b/lib/tasks/tests.rake @@ -154,6 +154,11 @@ namespace :tests do exit(1) end + unless Setting.theme == 'default' + puts 'Default theme setting not migrated as expected' + exit(1) + end + puts 'No errors found. Database state is consistent with a successful migration process.' end @@ -177,7 +182,8 @@ namespace :tests do (id, thing_type, thing_id, var, value, created_at, updated_at) VALUES (7, NULL, NULL, 'timeline_preview', E'--- false\n', now(), now()), - (8, NULL, NULL, 'trends_as_landing_page', E'--- false\n', now(), now()); + (8, NULL, NULL, 'trends_as_landing_page', E'--- false\n', now(), now()), + (9, NULL, NULL, 'theme', E'--- system', now(), now()); /* Doorkeeper records While the `read:me` scope was technically not valid in 3.3.0,