Skip to content
Snippets Groups Projects
install.rb 2.12 KiB
Newer Older
module Hbc
  class CLI
    class Install < AbstractCommand
Markus Reiter's avatar
Markus Reiter committed
      option "--force",          :force,          false
      option "--skip-cask-deps", :skip_cask_deps, false
      option "--require-sha",    :require_sha,    false

      def initialize(*)
        super
        raise CaskUnspecifiedError if args.empty?
Markus Reiter's avatar
Markus Reiter committed
      end

      def run
        retval = install_casks
        # retval is ternary: true/false/nil
AnastasiaSulyagina's avatar
AnastasiaSulyagina committed

        raise CaskError, "nothing to install" if retval.nil?
        raise CaskError, "install incomplete" unless retval
      end
AnastasiaSulyagina's avatar
AnastasiaSulyagina committed

Markus Reiter's avatar
Markus Reiter committed
      def install_casks
Markus Reiter's avatar
Markus Reiter committed
        args.each do |cask_token|
            cask = CaskLoader.load(cask_token)
Markus Reiter's avatar
Markus Reiter committed
            Installer.new(cask, binaries:       binaries?,
                                verbose: verbose?,
Markus Reiter's avatar
Markus Reiter committed
                                force:          force?,
                                skip_cask_deps: skip_cask_deps?,
                                require_sha:    require_sha?).install
            count += 1
          rescue CaskAlreadyInstalledError => e
            opoo e.message
            count += 1
          rescue CaskAlreadyInstalledAutoUpdatesError => e
            opoo e.message
            count += 1
          rescue CaskUnavailableError => e
Markus Reiter's avatar
Markus Reiter committed
            self.class.warn_unavailable_with_suggestion cask_token, e
          rescue CaskNoShasumError => e
            opoo e.message
            count += 1
          rescue CaskError => e
            onoe e.message
Markus Reiter's avatar
Markus Reiter committed
        count.zero? ? nil : count == args.length
AnastasiaSulyagina's avatar
AnastasiaSulyagina committed
      end

      def self.warn_unavailable_with_suggestion(cask_token, e)
        exact_match, partial_matches = Search.search(cask_token)
        error_message = e.message
        if exact_match
          error_message.concat(". Did you mean:\n#{exact_match}")
        elsif !partial_matches.empty?
          error_message.concat(". Did you mean one of:\n")
                       .concat(Formatter.columns(partial_matches.take(20)))
AnastasiaSulyagina's avatar
AnastasiaSulyagina committed

      def self.help
        "installs the given Cask"
      end
AnastasiaSulyagina's avatar
AnastasiaSulyagina committed

      def self.needs_init?
        true
      end
    end
AnastasiaSulyagina's avatar
AnastasiaSulyagina committed
  end
end