diff --git a/xbar/mise-updates.1h.rb b/xbar/mise-updates.1h.rb index d21f133..0415379 100755 --- a/xbar/mise-updates.1h.rb +++ b/xbar/mise-updates.1h.rb @@ -4,7 +4,7 @@ # rubocop:disable Layout/LineLength # Mise Updates -# v0.0.2 +# v0.1.0 # Jim Myhrberg # jimeh # List and manage outdated tools installed with mise @@ -12,7 +12,7 @@ # https://github.com/jimeh/dotfiles/tree/main/xbar # # string(VAR_MISE_PATH=""): Path to "mise" executable. -# string(VAR_EXTRA_ROOTS=""): Comma-separated list of extra paths to process in addition to globals. +# string(VAR_ENVIRONMENT_ROOTS=""): Comma-separated list of extra paths to process in addition to $HOME. # string(VAR_UPGRADE_ALL_EXCLUDE=""): Comma-separated list formulas/casks to exclude from upgrade all operations. # rubocop:enable Layout/LineLength @@ -329,7 +329,7 @@ module Mise def full_name if global? - 'Global' + '~ (Global)' else relative_path(path) end @@ -362,7 +362,8 @@ module Mise if missing?(env) :install elsif outdated?(env) - if !active_in_other?(env, active_version(env)) + active = active_version(env) + if !active.nil? && !desired_in_other?(env, active) :upgrade else :install @@ -401,7 +402,20 @@ module Mise end def active(env) - @active ||= versions(env).find(&:active) + versions(env).find(&:active) + end + + def desired_in_other?(env, version) + @versions.any? do |env_path, vers| + next if env_path == env.path + + outdated = @outdated&.dig(env_path) + if outdated + outdated.requested == version + else + vers.any? { |v| v.active && v.version == version } + end + end end def active_in_other?(env, version) @@ -564,14 +578,11 @@ module Mise printer.item('Settings') printer.sep - printer.item('Extra Root Paths:') - extra_roots = config.as_set('VAR_EXTRA_ROOTS') - if extra_roots.empty? - printer.item('') - else - extra_roots.each do |root| - printer.item(root) - end + extra_roots = config.as_set('VAR_ENVIRONMENT_ROOTS') + printer.item('Environment Root Paths:') + printer.item('~ (Home Directory / Global)') + extra_roots.each do |root| + printer.item(" #{root}") end end @@ -588,9 +599,9 @@ module Mise return unless env_tools.size.positive? printer.sep - printer.item(env.name, alt: env.full_name) + printer.item(env.full_name) - all_tools = env_tools.reject { |f| upgrade_all_exclude?(f.name) } + all_tools = env_tools.reject { |tool| upgrade_all_exclude?(tool.name) } excluded = (env_tools - all_tools) printer.item("Upgrade All (#{all_tools.size})") do |printer| to_install = [] @@ -619,13 +630,13 @@ module Mise end if all_tools.size.positive? - printer.item( - '⬆️ Upgrade', + "⬆️ Upgrade (#{all_tools.size})", terminal: true, refresh: true, shell: cmds ) end + if excluded.size.positive? printer.sep printer.item("Excluded (#{excluded.size}):") @@ -642,47 +653,98 @@ module Mise name = tool.name name += ' ⤫' if upgrade_all_exclude?(name) printer.item(name) do |printer| - if tool.missing?(env) - text = "➡️ Install (#{tool.latest_version(env)})" + mise_operation = tool.upgrade_operation(env) + + if mise_operation == :install + text = "➡️ Install (→ #{tool.latest_version(env)})" else - text = '⬆️ Upgrade' - alt_text = "#{text} " \ - "(#{tool.active_version(env)} → #{tool.latest_version(env)})" + text = "⬆️ Upgrade (↑ #{tool.latest_version(env)})" + alt_text = '⬆️ Upgrade ' \ + "(#{tool.active_version(env)} → " \ + "#{tool.latest_version(env)})" end printer.item( text, alt: alt_text || text, terminal: true, refresh: true, - shell: [mise_path, tool.upgrade_operation(env).to_s, tool.name] + shell: [mise_path, mise_operation.to_s, tool.install_name(env)] ) printer.sep - unless tool.missing?(env) - printer.item("→ Active: #{tool.active_version(env)}") - end + latest_version = tool.latest_version(env) if latest_version printer.item("↑ Latest: #{latest_version}") end + + active_version = tool.active_version(env) + printer.item("→ Active: #{active_version || ''}") + requested_version = tool.requested_version(env) if requested_version printer.item("→ Requested: #{requested_version}") end + + other_envs = envs.select { |e| env != e && tool.for_env?(e) } + if other_envs.size.positive? + printer.sep + printer.item('Other Environments') do |printer| + other_envs.each_with_index do |other_env, index| + printer.item(other_env.full_name) + latest_version = tool.latest_version(other_env) + if latest_version + printer.item("↑ Latest: #{latest_version}") + end + + active_version = tool.active_version(other_env) + printer.item("→ Active: #{active_version || ''}") + + requested_version = tool.requested_version(other_env) + if requested_version + printer.item("→ Requested: #{requested_version}") + end + + printer.sep if index < other_envs.size - 1 + end + end + end + printer.sep printer.item('Installed:') tool.versions(env).each do |v| next unless v.installed - icon = v.active ? '✔️' : '➖' + icon = if v.active + '✔️' + elsif tool.active_in_other?(env, v.version) + '➕' + else + '➖' + end + printer.item("#{icon} #{v.version}") do |printer| printer.item("Active: #{v.active ? 'Yes' : 'No'}") + if v.requested_version + printer.item("Requested: #{v.requested_version}") + end if v.source&.path printer.item("Set by: #{relative_path(v.source.path)}") end - if v.active - printer.item("Requested: #{v.requested_version}") - end printer.item("Path: #{v.install_path}") + + active_envs = envs.select do |e| + active_version = tool.active_version(e) + !active_version.nil? && active_version == v.version + end + + printer.sep + text = ['Active in Environments:'] + text << '' if active_envs.empty? + printer.item(text.join(' ')) + active_envs.each do |e| + printer.item(e.full_name) + end + printer.sep printer.item('🚫 Uninstall') do |printer| printer.item('Are you sure?') @@ -715,7 +777,7 @@ module Mise end def envs - @envs ||= ([ENV['HOME']] + config.as_set('VAR_EXTRA_ROOTS').to_a) + @envs ||= ([ENV['HOME']] + config.as_set('VAR_ENVIRONMENT_ROOTS').to_a) .uniq.map { |p| Env.new(p) } end