From ac48156a187df3d1b2183a9b044f1a3fad2e3f0a Mon Sep 17 00:00:00 2001 From: Jim Myhrberg Date: Tue, 9 Nov 2021 12:08:17 +0000 Subject: [PATCH] fix(xbar/brew-updates): refresh xbar plugin after update in terminal completes Previously the xbar plugin would refresh as soon as you clicked on an update, but since brew upgrades takes much longer to run in the popped up terminal window. This now uses the xbar:// URI scheme to trigger a plugin refresh after the brew commands have run in the terminal. --- xbar/brew-updates.1h.rb | 66 +++++++++++++++++++++++++++++------------ 1 file changed, 47 insertions(+), 19 deletions(-) diff --git a/xbar/brew-updates.1h.rb b/xbar/brew-updates.1h.rb index 6dfcb7d..c398e14 100755 --- a/xbar/brew-updates.1h.rb +++ b/xbar/brew-updates.1h.rb @@ -2,7 +2,7 @@ # frozen_string_literal: true # Brew Updates -# v2.1.0 +# v2.2.0 # Jim Myhrberg # jimeh # List and manage outdated Homebrew formulas and casks @@ -45,6 +45,7 @@ module Xbar def print_item(text, **props) output = [text] unless props.empty? + props = normalize_props(props) output << PARAM_SEP output += props.map { |k, v| "#{k}=\"#{v}\"" } end @@ -53,6 +54,35 @@ module Xbar $stdout.puts end + def plugin_refresh_uri + @plugin_refresh_uri ||= 'xbar://app.xbarapp.com/refreshPlugin' \ + "?path=#{File.basename(__FILE__)}" + end + + def normalize_props(props = {}) + props = props.dup + + if props[:shell].is_a?(Array) + cmd = props[:shell] + props[:shell] = cmd[0] + cmd[1..-1].each_with_index do |c, i| + props["param#{i + 1}".to_sym] = c + end + end + + # Refresh Xbar after shell command has run in terminal + if props[:terminal] && props[:refresh] && props[:shell] + props[:refresh] = false + i = 1 + i += 1 while props.key?("param#{i}".to_sym) + props["param#{i}".to_sym] = ';' + props["param#{i + 1}".to_sym] = 'open' + props["param#{i + 2}".to_sym] = "'#{plugin_refresh_uri}'" + end + + props + end + def sub_printer @sub_printer || self.class.new(nested_level + 1) end @@ -163,21 +193,21 @@ module Brew if formulas.size.positive? && casks.size.positive? printer.item( "Upgrade All (#{formulas.size + casks.size})", - terminal: true, refresh: true, shell: brew_path, param1: 'upgrade' + terminal: true, refresh: true, shell: [brew_path, 'upgrade'] ) end if formulas.size.positive? printer.item( "Upgrade All Formulas (#{formulas.size})", - terminal: true, refresh: true, shell: brew_path, param1: 'upgrade', - param2: '--formula' + terminal: true, refresh: true, + shell: [brew_path, 'upgrade', '--formula'] ) end if casks.size.positive? printer.item( "Upgrade All Casks (#{casks.size})", - terminal: true, refresh: true, shell: brew_path, param1: 'upgrade', - param2: '--cask' + terminal: true, refresh: true, + shell: [brew_path, 'upgrade', '--cask'] ) end end @@ -210,12 +240,12 @@ module Brew printer.item( 'Upgrade', terminal: true, refresh: true, - shell: brew_path, param1: 'upgrade', param2: formula.name + shell: [brew_path, 'upgrade', formula.name] ) printer.item( "Upgrade (#{formula.current_version} → #{formula.latest_version})", alternate: true, terminal: true, refresh: true, - shell: brew_path, param1: 'upgrade', param2: formula.name + shell: [brew_path, 'upgrade', formula.name] ) printer.sep printer.item("Installed: #{formula.installed_versions.join(', ')}") @@ -224,19 +254,19 @@ module Brew printer.item( 'Pin', terminal: false, refresh: true, - shell: brew_path, param1: 'pin', param2: formula.name + shell: [brew_path, 'pin', formula.name] ) printer.item( "Pin (to #{formula.current_version})", alternate: true, terminal: false, refresh: true, - shell: brew_path, param1: 'pin', param2: formula.name + shell: [brew_path, 'pin', formula.name] ) printer.item('Uninstall') do |printer| printer.item('Are you sure?') printer.item( 'Yes', terminal: true, refresh: true, - shell: brew_path, param1: 'uninstall', param2: formula.name + shell: [brew_path, 'uninstall', formula.name] ) end end @@ -252,14 +282,13 @@ module Brew printer.item(cask.name) do |printer| printer.item( 'Upgrade', - terminal: true, refresh: true, shell: brew_path, - param1: 'upgrade', param2: '--cask', param3: cask.name + terminal: true, refresh: true, + shell: [brew_path, 'upgrade', '--cask', cask.name] ) printer.item( "Upgrade (#{cask.current_version} → #{cask.latest_version})", alternate: true, terminal: true, refresh: true, - shell: brew_path, param1: 'upgrade', param2: '--cask', - param3: cask.name + shell: [brew_path, 'upgrade', '--cask', cask.name] ) printer.sep printer.item("Installed: #{cask.installed_version}") @@ -271,8 +300,7 @@ module Brew printer.item( 'Yes', terminal: true, refresh: true, - shell: brew_path, param1: 'uninstall', - param2: '--cask', param3: cask.name + shell: [brew_path, 'uninstall', '--cask', cask.name] ) end end @@ -301,14 +329,14 @@ module Brew printer.item( 'Unpin', terminal: false, refresh: true, - shell: brew_path, param1: 'unpin', param2: formula.name + shell: [brew_path, 'unpin', formula.name] ) printer.item('Uninstall') do |printer| printer.item('Are you sure?') printer.item( 'Yes', terminal: true, refresh: true, - shell: brew_path, param1: 'uninstall', param2: formula.name + shell: [brew_path, 'uninstall', formula.name] ) end end