Make Cask commands fail early if a Cask is not found.
This commit is contained in:
		
							parent
							
								
									f3ec40d696
								
							
						
					
					
						commit
						ef67b77d95
					
				@ -116,6 +116,22 @@ module Hbc
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    class FromInstanceLoader
 | 
			
		||||
      attr_reader :cask
 | 
			
		||||
 | 
			
		||||
      def self.can_load?(ref)
 | 
			
		||||
        ref.is_a?(Cask)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def initialize(cask)
 | 
			
		||||
        @cask = cask
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def load
 | 
			
		||||
        cask
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    class NullLoader < FromPathLoader
 | 
			
		||||
      def self.can_load?(*)
 | 
			
		||||
        true
 | 
			
		||||
@ -149,6 +165,7 @@ module Hbc
 | 
			
		||||
 | 
			
		||||
    def self.for(ref)
 | 
			
		||||
      [
 | 
			
		||||
        FromInstanceLoader,
 | 
			
		||||
        FromURILoader,
 | 
			
		||||
        FromTapLoader,
 | 
			
		||||
        FromTapPathLoader,
 | 
			
		||||
 | 
			
		||||
@ -42,41 +42,32 @@ module Hbc
 | 
			
		||||
        @args = process_arguments(*args)
 | 
			
		||||
      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)))
 | 
			
		||||
        end
 | 
			
		||||
        onoe error_message
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      private
 | 
			
		||||
 | 
			
		||||
      def casks(alternative: -> { [] })
 | 
			
		||||
        return to_enum(:casks, alternative: alternative) unless block_given?
 | 
			
		||||
 | 
			
		||||
        count = 0
 | 
			
		||||
 | 
			
		||||
        return @casks if defined?(@casks)
 | 
			
		||||
        casks = args.empty? ? alternative.call : args
 | 
			
		||||
        @casks = casks.map { |cask| CaskLoader.load(cask) }
 | 
			
		||||
      rescue CaskUnavailableError => e
 | 
			
		||||
        reason = [e.reason, suggestion_message(e.token)].join(" ")
 | 
			
		||||
        raise e.class.new(e.token, reason)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
        casks.each do |cask_or_token|
 | 
			
		||||
          begin
 | 
			
		||||
            yield cask_or_token.respond_to?(:token) ? cask_or_token : CaskLoader.load(cask_or_token)
 | 
			
		||||
            count += 1
 | 
			
		||||
          rescue CaskUnavailableError => e
 | 
			
		||||
            cask_token = cask_or_token
 | 
			
		||||
            self.class.warn_unavailable_with_suggestion cask_token, e
 | 
			
		||||
          rescue CaskError => e
 | 
			
		||||
            onoe e.message
 | 
			
		||||
          end
 | 
			
		||||
      def suggestion_message(cask_token)
 | 
			
		||||
        exact_match, partial_matches = Search.search(cask_token)
 | 
			
		||||
 | 
			
		||||
        if exact_match.nil? && partial_matches.count == 1
 | 
			
		||||
          exact_match = partial_matches.first
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        return :empty if casks.length.zero?
 | 
			
		||||
        (count == casks.length) ? :complete : :incomplete
 | 
			
		||||
        if exact_match
 | 
			
		||||
          "Did you mean “#{exact_match}”?"
 | 
			
		||||
        elsif !partial_matches.empty?
 | 
			
		||||
          "Did you mean one of these?\n"
 | 
			
		||||
            .concat(Formatter.columns(partial_matches.take(20)))
 | 
			
		||||
        else
 | 
			
		||||
          ""
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -7,10 +7,6 @@ module Hbc
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def run
 | 
			
		||||
        raise CaskError, "Cat incomplete." if cat_casks == :incomplete
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def cat_casks
 | 
			
		||||
        casks.each do |cask|
 | 
			
		||||
          puts File.open(cask.sourcefile_path, &:read)
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
@ -4,21 +4,18 @@ module Hbc
 | 
			
		||||
      def initialize(*)
 | 
			
		||||
        super
 | 
			
		||||
        raise CaskUnspecifiedError if args.empty?
 | 
			
		||||
        raise ArgumentError, "Only one Cask can be created at a time." if args.count > 1
 | 
			
		||||
        raise ArgumentError, "Only one Cask can be edited at a time." if args.count > 1
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def run
 | 
			
		||||
        cask_token = args.first
 | 
			
		||||
        cask_path = begin
 | 
			
		||||
          CaskLoader.load(cask_token).sourcefile_path
 | 
			
		||||
        rescue CaskUnavailableError => e
 | 
			
		||||
          reason = e.reason.empty? ? "" : "#{e.reason} "
 | 
			
		||||
          reason.concat("Run #{Formatter.identifier("brew cask create #{e.token}")} to create a new Cask.")
 | 
			
		||||
          raise e.class.new(e.token, reason)
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        odebug "Opening editor for Cask #{cask_token}"
 | 
			
		||||
        cask = casks.first
 | 
			
		||||
        cask_path = cask.sourcefile_path
 | 
			
		||||
        odebug "Opening editor for Cask #{cask.token}"
 | 
			
		||||
        exec_editor cask_path
 | 
			
		||||
      rescue CaskUnavailableError => e
 | 
			
		||||
        reason = e.reason.empty? ? "" : "#{e.reason} "
 | 
			
		||||
        reason.concat("Run #{Formatter.identifier("brew cask create #{e.token}")} to create a new Cask.")
 | 
			
		||||
        raise e.class.new(e.token, reason)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def self.help
 | 
			
		||||
 | 
			
		||||
@ -9,10 +9,6 @@ module Hbc
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def run
 | 
			
		||||
        raise CaskError, "Fetch incomplete." if fetch_casks == :incomplete
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def fetch_casks
 | 
			
		||||
        casks.each do |cask|
 | 
			
		||||
          ohai "Downloading external files for Cask #{cask}"
 | 
			
		||||
          downloaded_path = Download.new(cask, force: force?).perform
 | 
			
		||||
 | 
			
		||||
@ -10,10 +10,6 @@ module Hbc
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def run
 | 
			
		||||
        raise CaskError, "Install incomplete." if install_casks == :incomplete
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def install_casks
 | 
			
		||||
        casks.each do |cask|
 | 
			
		||||
          begin
 | 
			
		||||
            Installer.new(cask, binaries:       binaries?,
 | 
			
		||||
 | 
			
		||||
@ -12,7 +12,7 @@ module Hbc
 | 
			
		||||
        if args.all? { |t| t =~ %r{^https?://} && t !~ /\.rb$/ }
 | 
			
		||||
          self.class.appcask_checkpoint_for_url(args)
 | 
			
		||||
        else
 | 
			
		||||
          self.class.appcask_checkpoint(args, calculate?)
 | 
			
		||||
          self.class.appcask_checkpoint(load_casks, calculate?)
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
@ -23,33 +23,27 @@ module Hbc
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def self.appcask_checkpoint(cask_tokens, calculate)
 | 
			
		||||
        count = 0
 | 
			
		||||
 | 
			
		||||
        cask_tokens.each do |cask_token|
 | 
			
		||||
          cask = CaskLoader.load(cask_token)
 | 
			
		||||
 | 
			
		||||
      def self.appcask_checkpoint(casks, calculate)
 | 
			
		||||
        casks.each do |cask|
 | 
			
		||||
          if cask.appcast.nil?
 | 
			
		||||
            opoo "Cask '#{cask}' is missing an `appcast` stanza."
 | 
			
		||||
          else
 | 
			
		||||
            if calculate
 | 
			
		||||
            checkpoint = if calculate
 | 
			
		||||
              result = cask.appcast.calculate_checkpoint
 | 
			
		||||
 | 
			
		||||
              checkpoint = result[:checkpoint]
 | 
			
		||||
              result[:checkpoint]
 | 
			
		||||
            else
 | 
			
		||||
              checkpoint = cask.appcast.checkpoint
 | 
			
		||||
              cask.appcast.checkpoint
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
            if checkpoint.nil?
 | 
			
		||||
            if calculate && checkpoint.nil?
 | 
			
		||||
              onoe "Could not retrieve `appcast` checkpoint for cask '#{cask}': #{result[:command_result].stderr}"
 | 
			
		||||
            elsif casks.count > 1
 | 
			
		||||
              puts "#{checkpoint}  #{cask}"
 | 
			
		||||
            else
 | 
			
		||||
              puts((cask_tokens.count > 1) ? "#{checkpoint}  #{cask}" : checkpoint)
 | 
			
		||||
              count += 1
 | 
			
		||||
              puts checkpoint
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        count == cask_tokens.count
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def self.help
 | 
			
		||||
 | 
			
		||||
@ -7,10 +7,6 @@ module Hbc
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def run
 | 
			
		||||
        raise CaskError, "Dump incomplete." if dump_casks == :incomplete
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def dump_casks
 | 
			
		||||
        casks.each(&:dumpcask)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -46,12 +46,6 @@ module Hbc
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def run
 | 
			
		||||
        return unless print_stanzas == :incomplete
 | 
			
		||||
        exit 1 if quiet?
 | 
			
		||||
        raise CaskError, "Print incomplete."
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def print_stanzas
 | 
			
		||||
        if ARTIFACTS.include?(stanza)
 | 
			
		||||
          artifact_name = stanza
 | 
			
		||||
          @stanza = :artifacts
 | 
			
		||||
 | 
			
		||||
@ -10,8 +10,7 @@ module Hbc
 | 
			
		||||
      end)
 | 
			
		||||
 | 
			
		||||
      def run
 | 
			
		||||
        retval = args.any? ? list : list_installed
 | 
			
		||||
        raise CaskError, "Listing incomplete." if retval == :incomplete
 | 
			
		||||
        args.any? ? list : list_installed
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def list
 | 
			
		||||
@ -46,8 +45,6 @@ module Hbc
 | 
			
		||||
        elsif !installed_casks.empty?
 | 
			
		||||
          puts Formatter.columns(installed_casks.map(&:to_s))
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        installed_casks.empty? ? :empty : :complete
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def self.format_versioned(cask)
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
module Hbc
 | 
			
		||||
  class CLI
 | 
			
		||||
    class Reinstall < Install
 | 
			
		||||
      def install_casks
 | 
			
		||||
      def run
 | 
			
		||||
        casks.each do |cask|
 | 
			
		||||
          Installer.new(cask, binaries:       binaries?,
 | 
			
		||||
                              verbose:        verbose?,
 | 
			
		||||
 | 
			
		||||
@ -9,10 +9,6 @@ module Hbc
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def run
 | 
			
		||||
        raise CaskError, "Uninstall incomplete." if uninstall_casks == :incomplete
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def uninstall_casks
 | 
			
		||||
        casks.each do |cask|
 | 
			
		||||
          odebug "Uninstalling Cask #{cask}"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -9,10 +9,6 @@ module Hbc
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def run
 | 
			
		||||
        raise CaskError, "Zap incomplete." if zap_casks == :incomplete
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def zap_casks
 | 
			
		||||
        casks.each do |cask|
 | 
			
		||||
          odebug "Zapping Cask #{cask}"
 | 
			
		||||
          Installer.new(cask, verbose: verbose?, force: force?).zap
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,10 @@
 | 
			
		||||
describe Hbc::CLI::Audit, :cask do
 | 
			
		||||
  let(:cask) { double("cask", token: nil) }
 | 
			
		||||
  let(:cask) { Hbc::Cask.new(nil) }
 | 
			
		||||
 | 
			
		||||
  describe "selection of Casks to audit" do
 | 
			
		||||
    it "audits all Casks if no tokens are given" do
 | 
			
		||||
      expect(cask).to be_a Hbc::Cask
 | 
			
		||||
 | 
			
		||||
      allow(Hbc).to receive(:all).and_return([cask, cask])
 | 
			
		||||
 | 
			
		||||
      expect(Hbc::Auditor).to receive(:audit).twice.and_return(true)
 | 
			
		||||
 | 
			
		||||
@ -35,8 +35,7 @@ describe Hbc::CLI::Cat, :cask do
 | 
			
		||||
 | 
			
		||||
  it "raises an exception when the Cask does not exist" do
 | 
			
		||||
    expect { Hbc::CLI::Cat.run("notacask") }
 | 
			
		||||
      .to output(/is unavailable/).to_stderr
 | 
			
		||||
      .and raise_error(Hbc::CaskError, "Cat incomplete.")
 | 
			
		||||
      .to raise_error(Hbc::CaskUnavailableError, /is unavailable/)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe "when no Cask is specified" do
 | 
			
		||||
 | 
			
		||||
@ -39,7 +39,7 @@ describe Hbc::CLI::Create, :cask do
 | 
			
		||||
  it "raises an exception when more than one Cask is given" do
 | 
			
		||||
    expect {
 | 
			
		||||
      described_class.run("additional-cask", "another-cask")
 | 
			
		||||
    }.to raise_error(/Only one Cask can be created at a time./)
 | 
			
		||||
    }.to raise_error(/Only one Cask can be created at a time\./)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  it "raises an exception when the Cask already exists" do
 | 
			
		||||
 | 
			
		||||
@ -12,7 +12,7 @@ describe Hbc::CLI::Edit, :cask do
 | 
			
		||||
  it "raises an error when given more than one argument" do
 | 
			
		||||
    expect {
 | 
			
		||||
      described_class.new("local-caffeine", "local-transmission")
 | 
			
		||||
    }.to raise_error(/Only one Cask can be created at a time./)
 | 
			
		||||
    }.to raise_error(/Only one Cask can be edited at a time\./)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  it "raises an exception when the Cask doesnt exist" do
 | 
			
		||||
 | 
			
		||||
@ -42,7 +42,7 @@ describe Hbc::CLI::Fetch, :cask do
 | 
			
		||||
  it "properly handles Casks that are not present" do
 | 
			
		||||
    expect {
 | 
			
		||||
      Hbc::CLI::Fetch.run("notacask")
 | 
			
		||||
    }.to raise_error(Hbc::CaskError, "Fetch incomplete.")
 | 
			
		||||
    }.to raise_error(Hbc::CaskUnavailableError)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe "when no Cask is specified" do
 | 
			
		||||
 | 
			
		||||
@ -56,27 +56,19 @@ describe Hbc::CLI::Install, :cask do
 | 
			
		||||
  it "properly handles Casks that are not present" do
 | 
			
		||||
    expect {
 | 
			
		||||
      Hbc::CLI::Install.run("notacask")
 | 
			
		||||
    }.to raise_error(Hbc::CaskError, "Install incomplete.")
 | 
			
		||||
    }.to raise_error(Hbc::CaskUnavailableError)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  it "returns a suggestion for a misspelled Cask" do
 | 
			
		||||
    expect {
 | 
			
		||||
      begin
 | 
			
		||||
        Hbc::CLI::Install.run("localcaffeine")
 | 
			
		||||
      rescue Hbc::CaskError
 | 
			
		||||
        nil
 | 
			
		||||
      end
 | 
			
		||||
    }.to output(/Cask 'localcaffeine' is unavailable: No Cask with this name exists\. Did you mean:\nlocal-caffeine/).to_stderr
 | 
			
		||||
      Hbc::CLI::Install.run("localcaffeine")
 | 
			
		||||
    }.to raise_error(Hbc::CaskUnavailableError, /Cask 'localcaffeine' is unavailable: No Cask with this name exists\. Did you mean “local-caffeine”?/)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  it "returns multiple suggestions for a Cask fragment" do
 | 
			
		||||
    expect {
 | 
			
		||||
      begin
 | 
			
		||||
        Hbc::CLI::Install.run("local-caf")
 | 
			
		||||
      rescue Hbc::CaskError
 | 
			
		||||
        nil
 | 
			
		||||
      end
 | 
			
		||||
    }.to output(/Cask 'local-caf' is unavailable: No Cask with this name exists\. Did you mean one of:\nlocal-caffeine/).to_stderr
 | 
			
		||||
      Hbc::CLI::Install.run("local")
 | 
			
		||||
    }.to raise_error(Hbc::CaskUnavailableError, /Cask 'local' is unavailable: No Cask with this name exists\. Did you mean one of these\?\nlocal-caffeine\nlocal-transmission/)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe "when no Cask is specified" do
 | 
			
		||||
 | 
			
		||||
@ -16,14 +16,12 @@ describe Hbc::CLI::Uninstall, :cask do
 | 
			
		||||
 | 
			
		||||
  it "shows an error when a bad Cask is provided" do
 | 
			
		||||
    expect { Hbc::CLI::Uninstall.run("notacask") }
 | 
			
		||||
      .to output(/is unavailable/).to_stderr
 | 
			
		||||
      .and raise_error(Hbc::CaskError, "Uninstall incomplete.")
 | 
			
		||||
      .to raise_error(Hbc::CaskUnavailableError, /is unavailable/)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  it "shows an error when a Cask is provided that's not installed" do
 | 
			
		||||
    expect { Hbc::CLI::Uninstall.run("local-caffeine") }
 | 
			
		||||
    .to output(/is not installed/).to_stderr
 | 
			
		||||
    .and raise_error(Hbc::CaskError, "Uninstall incomplete.")
 | 
			
		||||
    .to raise_error(Hbc::CaskNotInstalledError, /is not installed/)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  it "tries anyway on a non-present Cask when --force is given" do
 | 
			
		||||
@ -76,8 +74,7 @@ describe Hbc::CLI::Uninstall, :cask do
 | 
			
		||||
    Hbc.appdir.join("MyFancyApp.app").rmtree
 | 
			
		||||
 | 
			
		||||
    expect { Hbc::CLI::Uninstall.run("with-uninstall-script-app") }
 | 
			
		||||
    .to output(/does not exist/).to_stderr
 | 
			
		||||
    .and raise_error(Hbc::CaskError, "Uninstall incomplete.")
 | 
			
		||||
    .to raise_error(Hbc::CaskError, /uninstall script .* does not exist/)
 | 
			
		||||
 | 
			
		||||
    expect(cask).to be_installed
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,7 @@
 | 
			
		||||
describe Hbc::CLI::Zap, :cask do
 | 
			
		||||
  it "shows an error when a bad Cask is provided" do
 | 
			
		||||
    expect { Hbc::CLI::Zap.run("notacask") }
 | 
			
		||||
      .to output(/is unavailable/).to_stderr
 | 
			
		||||
      .and raise_error(Hbc::CaskError, "Zap incomplete.")
 | 
			
		||||
      .to raise_error(Hbc::CaskUnavailableError, /is unavailable/)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  it "can zap and unlink multiple Casks at once" do
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user