2019-05-03 06:17:27 +08:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2013-02-06 03:16:51 +08:00
|
|
|
module Discourse
|
2020-07-10 02:57:27 +08:00
|
|
|
VERSION_REGEXP ||= /\A\d+\.\d+\.\d+(\.beta\d+)?\z/
|
|
|
|
VERSION_COMPATIBILITY_FILENAME ||= ".discourse-compatibility"
|
2020-07-07 05:48:00 +08:00
|
|
|
|
2013-08-08 06:47:04 +08:00
|
|
|
# work around reloader
|
|
|
|
unless defined?(::Discourse::VERSION)
|
2013-03-13 11:06:58 +08:00
|
|
|
module VERSION #:nodoc:
|
2023-01-03 14:29:26 +08:00
|
|
|
MAJOR = 3
|
|
|
|
MINOR = 0
|
2023-04-18 16:14:45 +08:00
|
|
|
TINY = 3
|
2023-01-11 13:17:04 +08:00
|
|
|
PRE = nil
|
2013-02-06 03:16:51 +08:00
|
|
|
|
2013-03-13 11:06:58 +08:00
|
|
|
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
|
|
|
|
end
|
2013-02-06 03:16:51 +08:00
|
|
|
end
|
2015-04-28 01:06:53 +08:00
|
|
|
|
2020-10-13 00:25:06 +08:00
|
|
|
class InvalidVersionListError < StandardError
|
|
|
|
end
|
|
|
|
|
2015-04-28 01:06:53 +08:00
|
|
|
def self.has_needed_version?(current, needed)
|
2020-06-29 15:52:33 +08:00
|
|
|
Gem::Version.new(current) >= Gem::Version.new(needed)
|
2015-04-28 01:06:53 +08:00
|
|
|
end
|
2020-07-07 05:48:00 +08:00
|
|
|
|
|
|
|
# lookup an external resource (theme/plugin)'s best compatible version
|
|
|
|
# compatible resource files are YAML, in the format:
|
|
|
|
# `discourse_version: plugin/theme git reference.` For example:
|
|
|
|
# 2.5.0.beta6: c4a6c17
|
|
|
|
# 2.5.0.beta4: d1d2d3f
|
|
|
|
# 2.5.0.beta2: bbffee
|
|
|
|
# 2.4.4.beta6: some-other-branch-ref
|
|
|
|
# 2.4.2.beta1: v1-tag
|
2020-07-10 02:57:27 +08:00
|
|
|
def self.find_compatible_resource(version_list, version = ::Discourse::VERSION::STRING)
|
2022-02-23 16:44:37 +08:00
|
|
|
return unless version_list.present?
|
2020-07-07 05:48:00 +08:00
|
|
|
|
2020-10-13 00:25:06 +08:00
|
|
|
begin
|
|
|
|
version_list = YAML.safe_load(version_list)
|
|
|
|
rescue Psych::SyntaxError, Psych::DisallowedClass => e
|
|
|
|
end
|
|
|
|
|
|
|
|
raise InvalidVersionListError unless version_list.is_a?(Hash)
|
|
|
|
|
|
|
|
version_list = version_list.sort_by { |v, pin| Gem::Version.new(v) }.reverse
|
2020-07-07 05:48:00 +08:00
|
|
|
|
|
|
|
# If plugin compat version is listed as less than current Discourse version, take the version/hash listed before.
|
|
|
|
checkout_version = nil
|
|
|
|
version_list.each do |core_compat, target|
|
2020-07-10 02:57:27 +08:00
|
|
|
if Gem::Version.new(core_compat) == Gem::Version.new(version) # Exact version match - return it
|
2020-07-07 05:48:00 +08:00
|
|
|
checkout_version = target
|
|
|
|
break
|
2020-07-10 02:57:27 +08:00
|
|
|
elsif Gem::Version.new(core_compat) < Gem::Version.new(version) # Core is on a higher version than listed, use a later version
|
2020-07-07 05:48:00 +08:00
|
|
|
break
|
|
|
|
end
|
|
|
|
checkout_version = target
|
|
|
|
end
|
|
|
|
|
2021-04-14 22:32:47 +08:00
|
|
|
return if checkout_version.nil?
|
|
|
|
|
|
|
|
begin
|
|
|
|
Discourse::Utils.execute_command "git",
|
|
|
|
"check-ref-format",
|
|
|
|
"--allow-onelevel",
|
|
|
|
checkout_version
|
|
|
|
rescue RuntimeError
|
|
|
|
raise InvalidVersionListError, "Invalid ref name: #{checkout_version}"
|
|
|
|
end
|
|
|
|
|
2020-07-07 05:48:00 +08:00
|
|
|
checkout_version
|
|
|
|
end
|
|
|
|
|
|
|
|
# Find a compatible resource from a git repo
|
|
|
|
def self.find_compatible_git_resource(path)
|
|
|
|
return unless File.directory?("#{path}/.git")
|
|
|
|
compat_resource, std_error, s =
|
|
|
|
Open3.capture3(
|
|
|
|
"git -C '#{path}' show HEAD@{upstream}:#{Discourse::VERSION_COMPATIBILITY_FILENAME}",
|
|
|
|
)
|
|
|
|
Discourse.find_compatible_resource(compat_resource) if s.success?
|
2020-10-13 00:25:06 +08:00
|
|
|
rescue InvalidVersionListError => e
|
|
|
|
$stderr.puts "Invalid version list in #{path}"
|
2020-07-07 05:48:00 +08:00
|
|
|
end
|
2013-03-13 11:06:58 +08:00
|
|
|
end
|