2
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2025-10-04 17:32:34 +08:00

DEV: remove deduplicate horizon script (#33595)

The Horizon theme is now in core, and the remote Horizon repo is
deprecated. This script is not needed anymore.
This commit is contained in:
Krzysztof Kotlarek 2025-07-14 14:34:47 +08:00 committed by GitHub
parent a3cff97b48
commit d164351458
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 0 additions and 297 deletions

View file

@ -292,122 +292,3 @@ task "themes:qunit_all_official" => :environment do |task, args|
Rake::Task["themes:qunit"].reenable
Rake::Task["themes:qunit"].invoke("ids", theme_ids_with_qunit_tests.join("|"))
end

HORIZON_REMOTE_PATHS = %w[
github.com/discourse-org/horizon
github.com/discourse-org/nextgen-theme
github.com/discourse/horizon
]

def get_horizon_themes
Theme.joins(:remote_theme).where(<<~SQL)
remote_themes.remote_url LIKE ANY (ARRAY[#{HORIZON_REMOTE_PATHS.map { |path| "'%#{path}%'" }.join(", ")}])
SQL
end

desc "Remove duplicated Horizon themes"
task "themes:deduplicate_horizon" => :environment do |task, args|
horizon_themes = get_horizon_themes

abort("🟩 No Horizon themes found") if horizon_themes.empty?

# v0 will handle only one horizon theme
abort("⭕ More than one horizon theme installed") if horizon_themes.count > 1

remote_horizon_theme = horizon_themes.first
system_horizon_theme = Theme.horizon_theme

Theme.transaction do
# Enable hidden horizon theme if it is not enabled
if !SiteSetting.experimental_system_themes_map.include?("horizon")
SiteSetting.experimental_system_themes =
(SiteSetting.experimental_system_themes_map << "horizon").join("|")
end
puts "Horizon is enabled"

# Make the system horizon selectable if remote horizon is selectable
system_horizon_theme.update!(user_selectable: remote_horizon_theme.user_selectable)
puts "User selectable is updated"

# Move all components of the remote horizon theme to the system horizon theme
ChildTheme
.where(parent_theme_id: remote_horizon_theme.id)
.where.not(child_theme_id: system_horizon_theme.child_themes.pluck(:id))
.find_each { |child_theme| child_theme.update!(parent_theme_id: system_horizon_theme.id) }
puts "Components is moved"

# Update user options to point to the system horizon theme
UserOption
.where(theme_ids: [remote_horizon_theme.id])
.find_each { |user_option| user_option.update!(theme_ids: [system_horizon_theme.id]) }
puts "User options theme id is updated"

# Move color palettes
color_schemes_map =
remote_horizon_theme
.color_schemes
.reduce({}) do |map, color_scheme|
map[color_scheme.id] = {
id: system_horizon_theme.color_schemes.find_by(name: color_scheme.name).id,
user_selectable: color_scheme.user_selectable,
}
map
end
system_horizon_theme.color_schemes.find_each do |color_scheme|
color_scheme.update!(
user_selectable:
!!color_schemes_map
.values
.find { |scheme| scheme[:id] == color_scheme.id }
&.dig(:user_selectable),
)
end
if remote_horizon_theme.color_scheme.theme_id == remote_horizon_theme.id
system_horizon_theme.update!(
color_scheme_id: color_schemes_map[remote_horizon_theme.color_scheme_id][:id],
)
elsif remote_horizon_theme.color_scheme_id
system_horizon_theme.update!(color_scheme_id: remote_horizon_theme.color_scheme_id)
end
system_horizon_theme.color_scheme.update!(user_selectable: true)
puts "Theme color palette is updated"
UserOption
.where(color_scheme_id: color_schemes_map.keys)
.find_each do |user_option|
user_option.update!(color_scheme_id: color_schemes_map[user_option.color_scheme_id][:id])
end
UserOption
.where(dark_scheme_id: color_schemes_map.keys)
.find_each do |user_option|
user_option.update!(dark_scheme_id: color_schemes_map[user_option.dark_scheme_id][:id])
end
puts "User option color schemes are updated"

# Move theme settings
ThemeSetting
.where(theme_id: remote_horizon_theme.id)
.find_each { |theme_setting| theme_setting.update!(theme_id: system_horizon_theme.id) }
puts "Theme settings are moved"

# Move theme translations
ThemeTranslationOverride
.where(theme_id: remote_horizon_theme.id)
.find_each { |translation| translation.update!(theme_id: system_horizon_theme.id) }
puts "Theme translations are moved"

# Change default theme to system horizon theme if remote horizon theme is default
SiteSetting.default_theme_id = system_horizon_theme.id if remote_horizon_theme.default?
puts "Default theme is updated to system horizon theme"

# Delete the remote horizon theme and color palettes
remote_horizon_theme.color_schemes.map(&:destroy!)
puts "Remote horizon theme color palettes are deleted"

StaffActionLogger.new(Discourse.system_user).log_theme_destroy(remote_horizon_theme)
remote_horizon_theme.destroy!
puts "Remote horizon theme is deleted"

Theme.expire_site_cache!
puts "Site cache is expired"
end
end

View file

@ -118,182 +118,4 @@ RSpec.describe "tasks/themes" do
expect(theme.remote_theme.local_version).to eq(original_local_version)
end
end

describe "themes:deduplicate_horizon" do
fab!(:user)
fab!(:remote_theme) do
RemoteTheme.create!(
remote_url: "https://github.com/discourse-org/horizon.git",
minimum_discourse_version: "2.5.0",
)
end
fab!(:remote_horizon_theme) do
Fabricate(
:theme,
user: user,
name: "Remote Horizon",
remote_theme: remote_theme,
user_selectable: true,
)
end
fab!(:child_component) do
Fabricate(:theme, user: user, component: true, name: "Child Component")
end
fab!(:theme_setting) do
ThemeSetting.create!(
theme: remote_horizon_theme,
data_type: ThemeSetting.types[:bool],
name: "enable_welcome_banner",
value: "false",
)
end
fab!(:remote_color_scheme) do
remote_horizon_theme.color_schemes.create!(
name: "Lily Dark",
theme_id: remote_horizon_theme.id,
user_selectable: false,
)
end
fab!(:remote_color_scheme_2) do
remote_horizon_theme.color_schemes.create!(
name: "Violet Dark",
theme_id: remote_horizon_theme.id,
user_selectable: true,
)
end
fab!(:theme_translation_override) do
ThemeTranslationOverride.create!(
theme: remote_horizon_theme,
locale: "en",
translation_key: "test.key",
value: "Test Value",
)
end

let!(:system_horizon_theme) { Theme.horizon_theme }
let!(:system_color_scheme) { system_horizon_theme.color_schemes.where(name: "Lily Dark").first }
let!(:system_color_scheme_2) do
system_horizon_theme.color_schemes.where(name: "Violet Dark").first
end

before do
remote_horizon_theme.update!(color_scheme: remote_color_scheme)
remote_horizon_theme.add_relative_theme!(:child, child_component)
remote_horizon_theme.save!
user.user_option.update!(
theme_ids: [remote_horizon_theme.id],
color_scheme_id: remote_color_scheme.id,
dark_scheme_id: remote_color_scheme.id,
)
SiteSetting.default_theme_id = remote_horizon_theme.id
end

context "when no horizon themes exist" do
before do
remote_horizon_theme.remote_theme&.destroy!
remote_horizon_theme.destroy!
end

it "aborts with no themes message" do
output =
capture_stderr do
expect { invoke_rake_task("themes:deduplicate_horizon") }.to raise_error(SystemExit)
end
expect(output).to include("🟩 No Horizon themes found")
end
end

context "when multiple horizon themes exist" do
fab!(:remote_theme_2) do
RemoteTheme.create!(
remote_url: "https://github.com/discourse/horizon.git",
minimum_discourse_version: "2.5.0",
)
end
fab!(:remote_horizon_theme_2) do
Fabricate(:theme, user: user, name: "Second Horizon", remote_theme: remote_theme_2)
end

it "aborts with multiple themes message" do
output =
capture_stderr do
expect { invoke_rake_task("themes:deduplicate_horizon") }.to raise_error(SystemExit)
end
expect(output).to include("⭕ More than one horizon theme installed")
end
end

context "when exactly one horizon theme exists" do
it "successfully migrates theme data" do
expect(system_horizon_theme.user_selectable).to be false
expect(SiteSetting.default_theme_id).to eq(remote_horizon_theme.id)
expect(system_horizon_theme.child_themes).to eq([])
expect(system_horizon_theme.theme_settings.pluck(:name)).to eq([])
expect(system_horizon_theme.theme_translation_overrides.pluck(:translation_key)).to eq([])
expect(system_horizon_theme.color_scheme.name).to eq("Horizon")
expect {
capture_stdout { invoke_rake_task("themes:deduplicate_horizon") }
}.not_to raise_error

expect { remote_horizon_theme.reload }.to raise_error(ActiveRecord::RecordNotFound)

system_horizon_theme.reload
expect(system_horizon_theme.user_selectable).to be true
expect(SiteSetting.default_theme_id).to eq(system_horizon_theme.id)
expect(system_horizon_theme.child_themes).to include(child_component)
expect(system_horizon_theme.theme_settings.pluck(:name)).to include(theme_setting.name)
expect(system_horizon_theme.theme_translation_overrides.pluck(:translation_key)).to include(
"test.key",
)
expect(system_horizon_theme.color_scheme).to eq(system_color_scheme)
expect(system_color_scheme.reload.user_selectable).to be true
expect(system_color_scheme_2.reload.user_selectable).to be true
end

it "logs that remote theme was deleted" do
expect {
capture_stderr { capture_stdout { invoke_rake_task("themes:deduplicate_horizon") } }
}.to change { UserHistory.count }

expect(UserHistory.last.action).to eq(UserHistory.actions[:delete_theme])
expect(UserHistory.last.subject).to eq("Remote Horizon")
end

it "updates user theme and color scheme" do
expect(user.user_option.theme_ids).to eq([remote_horizon_theme.id])
expect(user.user_option.color_scheme_id).to eq(remote_color_scheme.id)
expect(user.user_option.dark_scheme_id).to eq(remote_color_scheme.id)

capture_stdout { invoke_rake_task("themes:deduplicate_horizon") }

user.user_option.reload
expect(user.user_option.theme_ids).to eq([system_horizon_theme.id])
expect(user.user_option.color_scheme_id).to eq(system_color_scheme.id)
expect(user.user_option.dark_scheme_id).to eq(system_color_scheme.id)
end

it "does not update user color scheme if custom" do
custom_color_scheme = Fabricate(:color_scheme)
user.user_option.update!(color_scheme_id: custom_color_scheme.id)

expect { capture_stdout { invoke_rake_task("themes:deduplicate_horizon") } }.not_to change {
user.user_option.color_scheme_id
}
end

it "enables system horizon theme if not already enabled" do
SiteSetting.experimental_system_themes = "foundation"

capture_stdout { invoke_rake_task("themes:deduplicate_horizon") }
expect(SiteSetting.experimental_system_themes_map).to eq(%w[foundation horizon])
end

it "does not modify system themes setting if horizon already enabled" do
SiteSetting.experimental_system_themes = "horizon"

capture_stdout { invoke_rake_task("themes:deduplicate_horizon") }
expect(SiteSetting.experimental_system_themes_map).to eq(%w[horizon])
end
end
end
end