Class: Pindo::VersionCheck
- Inherits:
-
Object
- Object
- Pindo::VersionCheck
- Defined in:
- lib/pindo/version.rb
Constant Summary collapse
- RUBYGEMS_API =
'https://rubygems.org/api/v1/gems/pindo.json'
- VERSION_INFO_FILE =
File.('~/.pindo/version_info.yml')
- CHECK_INTERVAL =
5小时检查一次
5 * 60 * 60
Class Method Summary collapse
-
.check_force_update! ⇒ Object
强制更新检查.
-
.check_pindo_force_upgrade ⇒ Object
原有的强制升级检查(从配置文件).
-
.check_pindo_new_version ⇒ Object
主版本检查方法(保持向后兼容).
-
.version_greater_than(version_string1: nil, version_string2: nil) ⇒ Object
版本比较方法(保持原有实现).
Class Method Details
.check_force_update! ⇒ Object
强制更新检查
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/pindo/version.rb', line 47 def check_force_update! return if ENV['PINDO_SKIP_FORCE_UPDATE'] # 紧急跳过选项 puts " 📌 执行强制更新检查...".green if ENV['PINDO_DEBUG'] begin # 检查缓存中是否有强制更新标记 if require_force_update_from_cache? cache = load_cache (cache['latest_version'], Pindo::VERSION) exit(1) end # 如果缓存过期,立即检查 if should_check_immediately? puts " 🌐 正在从 RubyGems 获取最新版本...".green if ENV['PINDO_DEBUG'] latest = fetch_latest_version_from_api if latest && needs_major_or_minor_update?(latest, Pindo::VERSION) # 更新缓存并退出 save_force_update_cache(latest) (latest, Pindo::VERSION) exit(1) end end # 检查配置文件中的强制更新(兼容原有逻辑) check_pindo_force_upgrade rescue SystemExit raise # 重新抛出 exit rescue => e puts " ⚠️ 强制更新检查失败: #{e.}".yellow if ENV['PINDO_DEBUG'] end end |
.check_pindo_force_upgrade ⇒ Object
原有的强制升级检查(从配置文件)
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
# File 'lib/pindo/version.rb', line 84 def check_pindo_force_upgrade begin pindo_dir = File.(ENV['PINDO_DIR'] || '~/.pindo') pindo_common_configdir = File.join(pindo_dir, "pindo_common_config") pindo_common_configfile_fullname = File.join(pindo_common_configdir, "pindo_config.json") return unless File.exist?(pindo_common_configfile_fullname) pindo_common_config_json = JSON.parse(File.read(pindo_common_configfile_fullname)) pindo_latest_version = pindo_common_config_json["pindo_latest_version"] pindo_mini_version = pindo_common_config_json["pindo_mini_version"] pindo_force_upgrade = pindo_common_config_json["pindo_force_upgrade"] pindo_current_version = Pindo::VERSION if pindo_force_upgrade compare_num = version_greater_than(version_string1:pindo_current_version, version_string2:pindo_mini_version) if compare_num < 0 puts "当前pindo版本 #{Pindo::VERSION}" puts "最新版本 #{pindo_latest_version}" puts "要求最低版本 #{pindo_mini_version}" raise Informative, "请使用 gem install pindo 升级!" end end rescue JSON::ParserError, Errno::ENOENT => e # 配置文件不存在或解析失败,忽略 rescue Informative raise # 重新抛出 Informative 错误 rescue => e raise Informative, "有异常错误,请确认是否执行pindo setup 拉取最新配置, 更新配置任然有错误请执行gem install pindo 更新" end end |
.check_pindo_new_version ⇒ Object
主版本检查方法(保持向后兼容)
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/pindo/version.rb', line 18 def check_pindo_new_version begin return if ENV['PINDO_NO_UPDATE_CHECK'] # 允许用户禁用 puts " 🔄 执行版本检查...".green if ENV['PINDO_DEBUG'] # 检查是否应该执行版本检查 return unless should_check? # 优先尝试从 RubyGems API 获取版本 latest_version = fetch_latest_version_from_api if latest_version puts " ✅ 从 RubyGems 获取最新版本: #{latest_version}".green if ENV['PINDO_DEBUG'] check_and_notify_with_version(latest_version) else puts " ⚠️ RubyGems API 请求失败,使用配置文件检查".yellow if ENV['PINDO_DEBUG'] # 回退到配置文件检查 check_from_config_file end rescue => e puts " ❌ 版本检查出错: #{e.}".red if ENV['PINDO_DEBUG'] puts e.backtrace.join("\n") if ENV['PINDO_DEBUG'] # 静默失败,不影响主程序 end end |
.version_greater_than(version_string1: nil, version_string2: nil) ⇒ Object
版本比较方法(保持原有实现)
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
# File 'lib/pindo/version.rb', line 119 def version_greater_than(version_string1: nil, version_string2: nil) return 0 if version_string1.nil? && version_string2.nil? return -1 if version_string1.nil? return 1 if version_string2.nil? version_string1_array = version_string1.split('.') || [] version_string2_array = version_string2.split('.') || [] array_max_length = [version_string1_array.size, version_string2_array.size].max version_string1_array += ['0'] * (array_max_length - version_string1_array.size) version_string2_array += ['0'] * (array_max_length - version_string2_array.size) compare_num = 0 (0..array_max_length).each do |i| if version_string1_array[i] == version_string2_array[i] compare_num = 0 elsif version_string1_array[i].to_i > version_string2_array[i].to_i compare_num = 1 break else compare_num = -1 break end end compare_num end |