Exception: ChecksumMismatchError Private

Inherits:
RuntimeError
  • Object
show all
Defined in:
exceptions.rb

Overview

This class is part of a private API. This class may only be used in the Homebrew/brew repository. Third parties should avoid using this class if possible, as it may be removed or changed without warning.

Raised by Pathname#verify_checksum when verification fails.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path, expected, actual) ⇒ void

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:



923
924
925
926
927
928
929
930
931
932
933
# File 'exceptions.rb', line 923

def initialize(path, expected, actual)
  @expected = expected

  super <<~EOS
    SHA-256 mismatch
    Expected: #{Formatter.success(expected.to_s)}
      Actual: #{Formatter.error(actual.to_s)}
        File: #{path}
    To retry an incomplete download, remove the file above.#{ChecksumMismatchError.html_hint(path)}
  EOS
end

Instance Attribute Details

#expectedChecksum (readonly)

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



920
921
922
# File 'exceptions.rb', line 920

def expected
  @expected
end

Class Method Details

.html_hint(path) ⇒ String

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Detect downloads that are HTML pages (bot-protection challenges, rate-limit or error pages served as text/html) rather than the expected binary artifact. Returns an extra hint for the error message, or an empty string.

Parameters:

Returns:



939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
# File 'exceptions.rb', line 939

def self.html_hint(path)
  return "" unless path.is_a?(Pathname)
  return "" unless path.file?

  head = path.binread(512).to_s
  return "" unless head.match?(/\A\s*(?:<!doctype\s+html|<html|<\?xml[^>]*\?>\s*<html)/i)

  rm_command = if path.to_s.start_with?("#{HOMEBREW_CACHE}/")
    relative = path.relative_path_from(HOMEBREW_CACHE)
    %Q(rm "$(brew --cache)/#{relative}")
  else
    %Q(rm "#{path}")
  end

  <<~EOS

    The start of the downloaded file is HTML/XML, not a binary.
    The server may have returned a bot-protection, rate-limit or
    error page instead. Delete the file and retry:
      #{rm_command}
  EOS
rescue SystemCallError
  ""
end