diff --git a/xbar/brew-updates.1h.rb b/xbar/brew-updates.1h.rb index 898b39a..20f0914 100755 --- a/xbar/brew-updates.1h.rb +++ b/xbar/brew-updates.1h.rb @@ -4,7 +4,7 @@ # rubocop:disable Layout/LineLength # Brew Updates -# v2.5.0 +# v2.5.1 # Jim Myhrberg # jimeh # List and manage outdated Homebrew formulas and casks @@ -27,8 +27,35 @@ require 'open3' require 'json' +require 'set' module Xbar + class CommandError < StandardError; end + + module Service + private + + def config + @config ||= Xbar::Config.new + end + + def printer + @printer ||= ::Xbar::Printer.new + end + + def cmd(*args) + out, err, s = Open3.capture3(*args) + if s.exitstatus != 0 + msg = "Command failed: #{args.join(' ')}" + msg += ": #{err}" unless err.empty? + + raise CommandError, msg + end + + out + end + end + class Runner attr_reader :service @@ -53,6 +80,12 @@ module Xbar merge!(JSON.parse(File.read(filename))) end + def as_set(name) + values = self[name]&.to_s&.split(',')&.map(&:strip)&.reject(&:empty?) + + ::Set.new(values || []) + end + def filename @filename ||= "#{__FILE__}.vars.json" end @@ -147,9 +180,9 @@ module Xbar end module Brew - class CommandError < StandardError; end - class Common + include Xbar::Service + def self.prefix(value = nil) return @prefix if value.nil? || value == '' @@ -162,17 +195,6 @@ module Brew self.class.prefix end - def default_printer - @default_printer ||= ::Xbar::Printer.new - end - - def cmd(*args) - out, err, s = Open3.capture3(*args) - raise CommandError, "#{args.join(' ')}: #{err}" if s.exitstatus != 0 - - out - end - def brew_path @brew_path ||= brew_path_from_env || brew_path_from_which || @@ -181,9 +203,12 @@ module Brew end def brew_path_from_env - return if ENV['VAR_BREW_PATH'].to_s == '' + env_value = config['VAR_BREW_PATH']&.to_s&.strip || '' - ENV['VAR_BREW_PATH'] + return if env_value == '' + return unless File.exist?(env_value) + + env_value end def brew_path_from_which @@ -191,6 +216,8 @@ module Brew return if detect == '' detect + rescue Xbar::CommandError + nil end def brew_path_from_fs_check @@ -217,13 +244,6 @@ module Brew exit 0 end - - def brew_update - cmd(brew_path, 'update') - rescue CommandError - # Continue as if nothing happened when brew update fails, as it likely - # to be due to another update process is already running. - end end class Formula @@ -259,8 +279,6 @@ module Brew prefix ':beers:' def run - printer = default_printer - brew_check(printer) brew_update @@ -338,23 +356,28 @@ module Brew end def add_greedy(*args) - vals = config['VAR_GREEDY']&.split(',') || [] - vals += args - config['VAR_GREEDY'] = vals.uniq.sort.join(',') + vals = greedy_types.clone + vals += args.map(&:strip).reject(&:empty?) + + config['VAR_GREEDY'] = vals.sort.join(',') config.save end def remove_greedy(*args) - vals = config['VAR_GREEDY']&.split(',') || [] - vals -= args - config['VAR_GREEDY'] = vals.uniq.sort.join(',') + vals = greedy_types.clone + vals -= args.map(&:strip).reject(&:empty?) + + config['VAR_GREEDY'] = vals.sort.join(',') config.save end private - def config - @config ||= Xbar::Config.new + def brew_update + cmd(brew_path, 'update') + rescue Xbar::CommandError + # Continue as if nothing happened when brew update fails, as it likely + # to be due to another update process is already running. end def status_label @@ -487,15 +510,15 @@ module Brew end def greedy_types - config['VAR_GREEDY']&.split(',')&.map(&:to_sym) || [] + @greedy_types ||= config.as_set('VAR_GREEDY') end def greedy_latest? - greedy_types.include?(:latest) + @greedy_latest ||= greedy_types.include?('latest') end def greedy_auto_updates? - greedy_types.include?(:auto_updates) + @greedy_auto_updates ||= greedy_types.include?('auto_updates') end def greedy_args @@ -516,11 +539,19 @@ module Brew end begin - updates = Brew::FormulaUpdates.new - Xbar::Runner.new(updates).run(ARGV) + services = Brew::FormulaUpdates.new + Xbar::Runner.new(services).run(ARGV) rescue StandardError => e - puts "ERROR: #{e.message}:\n\t#{e.backtrace.join("\n\t")}" - exit 1 + puts ":warning: #{File.basename(__FILE__)}" + puts '---' + puts 'exit status 1' + puts '---' + puts 'Error:' + puts e.message.to_s + e.backtrace.each do |line| + puts "--#{line}" + end + exit 0 end # rubocop:enable Style/IfUnlessModifier