feat(xbar/mise-updates): add mise self version check

This commit is contained in:
2025-08-22 13:20:10 +01:00
parent 94887fe5f1
commit e835afbd05

View File

@@ -536,12 +536,19 @@ module Mise
printer.sep
printer.item('Mise Updates') do |printer|
printer.item('⏳ Refresh', alt: '⏳ Refresh (⌘R)', refresh: true)
printer.item('⬆️ Self-Update (mise)', terminal: true, refresh: true,
shell: [mise_path, 'self-update'])
printer.sep
print_settings(printer)
end
# Show mise version status and, if outdated, a self-update action.
if mise_outdated?
printer.item(
"⬆️ Update mise (#{mise_current_version}#{mise_latest_version})",
terminal: true, refresh: true,
shell: [mise_path, 'self-update', '--yes']
)
end
print_tools(printer)
printer.sep
end
@@ -565,7 +572,11 @@ module Mise
private
def outdated_count
@outdated_count ||= tools.sum(&:outdated_count)
@outdated_count ||= begin
count = tools.sum(&:outdated_count)
count += 1 if mise_outdated?
count
end
end
def upgrade_all_exclude?(name)
@@ -584,6 +595,56 @@ module Mise
label.join(', ')
end
def mise_version_info
@mise_version_info ||= JSON.parse(
cmd(mise_path, 'version', '--json')
)
rescue StandardError
{}
end
def mise_current_version
version = mise_version_info['version'].to_s
version.split(' ').first
end
def mise_current_version_label
mise_version_info['version'].to_s
end
def mise_latest_version
mise_version_info['latest'].to_s
end
def mise_outdated?
current = mise_current_version
latest = mise_latest_version
return false if current.nil? || current == ''
return false if latest.nil? || latest == ''
version_greater?(latest, current)
end
def version_segments(version_str)
dotted = version_str.to_s[/\A\d+(?:\.\d+)*/]
return [] if dotted.nil? || dotted.empty?
dotted.split('.').map { |s| s.to_i }
end
def version_greater?(a_str, b_str)
a = version_segments(a_str)
b = version_segments(b_str)
max = [a.size, b.size].max
(0...max).each do |i|
ai = a[i] || 0
bi = b[i] || 0
return true if ai > bi
return false if ai < bi
end
false
end
def print_settings(printer)
printer.item('Settings')
printer.sep