discourse/app/services/themes_install_task.rb

95 lines
2.5 KiB
Ruby

# frozen_string_literal: true
class ThemesInstallTask
def self.install(themes)
counts = { installed: 0, updated: 0, errors: 0, skipped: 0 }
log = []
themes.each do |name, val|
installer = new(val)
next if installer.url.nil?
if installer.theme_exists?
if installer.options.fetch(:skip_update, nil)
log << "#{name}: is already installed. Skipping update."
counts[:skipped] += 1
elsif installer.update
log << "#{name}: is already installed. Updating from remote."
counts[:updated] += 1
else
log << "#{name}: is already installed, but there was an error updating from remote."
counts[:errors] += 1
end
else
begin
installer.install
log << "#{name}: installed from #{installer.url}"
counts[:installed] += 1
rescue RemoteTheme::ImportError, Discourse::InvalidParameters => err
log << "#{name}: #{err.message}"
counts[:errors] += 1
end
end
end
[log, counts]
end
attr_reader :url, :options
def initialize(url_or_options = nil)
if url_or_options.is_a?(Hash)
url_or_options.deep_symbolize_keys!
@url = url_or_options.fetch(:url, nil)
@options = url_or_options
else
@url = url_or_options
@options = {}
end
end
def repo_name
@url.gsub(Regexp.union("git@github.com:", "https://github.com/", ".git"), "")
end
def theme_exists?
@remote_theme =
RemoteTheme
.where("remote_url like ?", "%#{repo_name}%")
.where(branch: @options.fetch(:branch, nil))
.first
@theme = @remote_theme&.theme
@theme.present?
end
def install
@theme =
RemoteTheme.import_theme(
@url,
Discourse.system_user,
private_key: @options[:private_key],
branch: @options[:branch],
)
@theme.set_default! if @options.fetch(:default, false)
add_component_to_all_themes
end
def update
@remote_theme.update_from_remote(raise_if_theme_save_fails: false)
add_component_to_all_themes
@remote_theme.last_error_text.nil?
end
def add_component_to_all_themes
return if (!@options.fetch(:add_to_all_themes, false) || !@theme.component)
Theme
.where(component: false)
.each do |parent_theme|
if ChildTheme.where(parent_theme_id: parent_theme.id, child_theme_id: @theme.id).exists?
next
end
parent_theme.add_relative_theme!(:child, @theme)
end
end
end