Skip to content
Snippets Groups Projects
list.rb 2.32 KiB
Newer Older
module Hbc
  class CLI
    class List < AbstractCommand
Markus Reiter's avatar
Markus Reiter committed
      option "-1", :one, false
      option "--versions", :versions, false
Markus Reiter's avatar
Markus Reiter committed
      option "-l", (lambda do |*|
        one = true # rubocop:disable Lint/UselessAssignment
Markus Reiter's avatar
Markus Reiter committed
        opoo "Option -l is obsolete! Implying option -1."
Markus Reiter's avatar
Markus Reiter committed
      end)
AnastasiaSulyagina's avatar
AnastasiaSulyagina committed

Markus Reiter's avatar
Markus Reiter committed
      def run
Markus Reiter's avatar
Markus Reiter committed
        retval = args.any? ? list : list_installed
        # retval is ternary: true/false/nil
        if retval.nil? && args.none?
          opoo "nothing to list" # special case: avoid exit code
        elsif retval.nil?
          raise CaskError, "nothing to list"
        elsif !retval
          raise CaskError, "listing incomplete"
        end
      end
AnastasiaSulyagina's avatar
AnastasiaSulyagina committed

Markus Reiter's avatar
Markus Reiter committed
      def list
AnastasiaSulyagina's avatar
AnastasiaSulyagina committed

Markus Reiter's avatar
Markus Reiter committed
        args.each do |cask_token|
          odebug "Listing files for Cask #{cask_token}"
          begin
            cask = CaskLoader.load(cask_token)
AnastasiaSulyagina's avatar
AnastasiaSulyagina committed

            if cask.installed?
Markus Reiter's avatar
Markus Reiter committed
              if one?
                puts cask.token
Markus Reiter's avatar
Markus Reiter committed
              elsif versions?
Markus Reiter's avatar
Markus Reiter committed
                puts self.class.format_versioned(cask)
                cask = CaskLoader.load_from_file(cask.installed_caskfile)
Markus Reiter's avatar
Markus Reiter committed
                self.class.list_artifacts(cask)
AnastasiaSulyagina's avatar
AnastasiaSulyagina committed

              count += 1
            else
              opoo "#{cask} is not installed"
            end
          rescue CaskUnavailableError => e
            onoe e
          end
AnastasiaSulyagina's avatar
AnastasiaSulyagina committed
        end

Markus Reiter's avatar
Markus Reiter committed
        count.zero? ? nil : count == args.length
AnastasiaSulyagina's avatar
AnastasiaSulyagina committed

      def self.list_artifacts(cask)
        Artifact.for_cask(cask).each do |artifact|
          summary = artifact.summary
          ohai summary[:english_description], summary[:contents] unless summary.empty?
        end
      end
AnastasiaSulyagina's avatar
AnastasiaSulyagina committed

Markus Reiter's avatar
Markus Reiter committed
      def list_installed
        installed_casks = Hbc.installed
AnastasiaSulyagina's avatar
AnastasiaSulyagina committed

Markus Reiter's avatar
Markus Reiter committed
        if one?
          puts installed_casks.map(&:to_s)
Markus Reiter's avatar
Markus Reiter committed
        elsif versions?
Markus Reiter's avatar
Markus Reiter committed
          puts installed_casks.map(&self.class.method(:format_versioned))
        elsif !installed_casks.empty?
          puts Formatter.columns(installed_casks.map(&:to_s))
AnastasiaSulyagina's avatar
AnastasiaSulyagina committed

        installed_casks.empty? ? nil : true
      end
AnastasiaSulyagina's avatar
AnastasiaSulyagina committed

      def self.format_versioned(cask)
        cask.to_s.concat(cask.versions.map(&:to_s).join(" ").prepend(" "))
      end
AnastasiaSulyagina's avatar
AnastasiaSulyagina committed

      def self.help
        "with no args, lists installed Casks; given installed Casks, lists staged files"
      end
      def self.needs_init?
Markus Reiter's avatar
Markus Reiter committed
        true
AnastasiaSulyagina's avatar
AnastasiaSulyagina committed
end