Class: Pindo::VersionCheck

Inherits:
Object
  • Object
show all
Defined in:
lib/pindo/version.rb

Constant Summary collapse

RUBYGEMS_API =
'https://rubygems.org/api/v1/gems/pindo.json'
VERSION_INFO_FILE =
File.expand_path('~/.pindo/version_info.yml')
CHECK_INTERVAL =

5小时检查一次

5 * 60 * 60

Class Method Summary collapse

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
      show_force_update_message(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)
        show_force_update_message(latest, Pindo::VERSION)
        exit(1)
      end
    end

    # 检查配置文件中的强制更新(兼容原有逻辑)
    check_pindo_force_upgrade

  rescue SystemExit
    raise  # 重新抛出 exit
  rescue => e
    puts "  ⚠️  强制更新检查失败: #{e.message}".yellow if ENV['PINDO_DEBUG']
  end
end

.check_pindo_force_upgradeObject

原有的强制升级检查(从配置文件)



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.expand_path(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_versionObject

主版本检查方法(保持向后兼容)



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.message}".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