diff --git a/xbar/brew-services.10m.rb b/xbar/brew-services.10m.rb index 075d994..9c70202 100755 --- a/xbar/brew-services.10m.rb +++ b/xbar/brew-services.10m.rb @@ -2,7 +2,7 @@ # frozen_string_literal: true # Brew Services -# v2.2.2 +# v2.3.0 # Jim Myhrberg # jimeh # List and manage Homebrew Services @@ -44,6 +44,9 @@ module Xbar private def print_item(text, **props) + props = props.dup + alt = props.delete(:alt) + output = [text] unless props.empty? props = normalize_props(props) @@ -53,6 +56,10 @@ module Xbar $stdout.print(SUB_STR * nested_level, output.join(' ')) $stdout.puts + + return if alt.nil? || alt.empty? + + print_item(alt, **props.merge(alternate: true)) end def plugin_refresh_uri @@ -141,37 +148,22 @@ module Brew end class Service - attr_reader :name, :status, :user + attr_reader :name, :status, :user, :file, :exit_code - def self.from_line(line) - parts = line.split - name = parts[0] - if %w[started stopped error unknown].include?(parts[1]) - status = parts[1] - user = parts[2] - else - # Some services (dbus and logrotate for example) don't show a status - # when running "brew services list" at the moment. Instead they only - # show the service name and the user. So we work around this issue. - status = 'unknown' - user = parts[1] - end - - new(name: name, status: status, user: user) - end - - def initialize(name:, status:, user: nil) - @name = name - @status = status - @user = user + def initialize(args = {}) + @name = args.key?('name') ? args['name'] : args[:name] + @status = args.key?('status') ? args['status'] : args[:status] + @user = args.key?('user') ? args['user'] : args[:user] + @file = args.key?('file') ? args['file'] : args[:file] + @exit_code = args.key?('exit_code') ? args['exit_code'] : args[:exit_code] end def started? - @started ||= @status.downcase == 'started' + @started ||= %w[started scheduled].include?(@status.downcase) end def stopped? - @stopped ||= @status.downcase == 'stopped' + @stopped ||= %w[stopped none].include?(@status.downcase) end def error? @@ -331,8 +323,11 @@ module Brew end printer.sep - printer.item("State: #{service.status}") + printer.item("Status: #{service.status}") printer.item("User: #{service.user || ''}") + if !service.exit_code.nil? && !service.started? + printer.item("Exit code: #{service.exit_code}") + end if service.stopped? printer.sep @@ -368,17 +363,11 @@ module Brew def services return @services if @services - found = false - @services = cmd( - brew_path, 'services', 'list' - ).each_line.each_with_object([]) do |line, memo| - # Ignore header line and everything before it. - unless found - found = line.strip.match(/^Name\s+Status\s+User\s+(File|Plist)$/) - next - end + output = cmd(brew_path, 'services', 'list', '--json') + data = JSON.parse(output) - memo.push(Service.from_line(line)) + @services = data.each_with_object([]) do |item, memo| + memo.push(Service.new(item)) end end end