2016-02-01 07:43:26 -05:00
|
|
|
# frozen_string_literal: true
|
2012-11-29 01:52:18 -05:00
|
|
|
|
2018-05-17 21:39:13 -04:00
|
|
|
require 'rubygems/deprecate'
|
2021-01-03 20:09:05 -05:00
|
|
|
require 'rubygems/unknown_command_spell_checker'
|
2018-05-17 21:39:13 -04:00
|
|
|
|
2007-11-10 02:48:56 -05:00
|
|
|
##
|
|
|
|
# Base exception class for RubyGems. All exception raised by RubyGems are a
|
|
|
|
# subclass of this one.
|
2020-01-31 21:14:04 -05:00
|
|
|
class Gem::Exception < RuntimeError; end
|
2007-11-10 02:48:56 -05:00
|
|
|
|
|
|
|
class Gem::CommandLineError < Gem::Exception; end
|
|
|
|
|
2021-01-03 20:09:05 -05:00
|
|
|
class Gem::UnknownCommandError < Gem::Exception
|
|
|
|
attr_reader :unknown_command
|
|
|
|
|
|
|
|
def initialize(unknown_command)
|
|
|
|
self.class.attach_correctable
|
|
|
|
|
|
|
|
@unknown_command = unknown_command
|
|
|
|
super("Unknown command #{unknown_command}")
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.attach_correctable
|
|
|
|
return if defined?(@attached)
|
|
|
|
|
|
|
|
if defined?(DidYouMean::SPELL_CHECKERS) && defined?(DidYouMean::Correctable)
|
|
|
|
DidYouMean::SPELL_CHECKERS['Gem::UnknownCommandError'] =
|
|
|
|
Gem::UnknownCommandSpellChecker
|
|
|
|
|
|
|
|
prepend DidYouMean::Correctable
|
|
|
|
end
|
|
|
|
|
|
|
|
@attached = true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2007-11-10 02:48:56 -05:00
|
|
|
class Gem::DependencyError < Gem::Exception; end
|
|
|
|
|
|
|
|
class Gem::DependencyRemovalException < Gem::Exception; end
|
|
|
|
|
2013-09-14 04:59:02 -04:00
|
|
|
##
|
2013-11-18 19:34:13 -05:00
|
|
|
# Raised by Gem::Resolver when a Gem::Dependency::Conflict reaches the
|
2013-09-14 04:59:02 -04:00
|
|
|
# toplevel. Indicates which dependencies were incompatible through #conflict
|
|
|
|
# and #conflicting_dependencies
|
|
|
|
|
2014-09-13 23:30:02 -04:00
|
|
|
class Gem::DependencyResolutionError < Gem::DependencyError
|
2013-09-14 04:59:02 -04:00
|
|
|
attr_reader :conflict
|
|
|
|
|
2018-11-21 05:20:47 -05:00
|
|
|
def initialize(conflict)
|
2013-09-14 04:59:02 -04:00
|
|
|
@conflict = conflict
|
|
|
|
a, b = conflicting_dependencies
|
|
|
|
|
2013-11-10 12:51:40 -05:00
|
|
|
super "conflicting dependencies #{a} and #{b}\n#{@conflict.explanation}"
|
2013-09-14 04:59:02 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def conflicting_dependencies
|
|
|
|
@conflict.conflicting_dependencies
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2008-02-10 03:00:19 -05:00
|
|
|
##
|
|
|
|
# Raised when attempting to uninstall a gem that isn't in GEM_HOME.
|
2008-03-31 18:40:06 -04:00
|
|
|
|
|
|
|
class Gem::GemNotInHomeException < Gem::Exception
|
|
|
|
attr_accessor :spec
|
|
|
|
end
|
2008-02-10 03:00:19 -05:00
|
|
|
|
2018-05-30 09:01:35 -04:00
|
|
|
###
|
|
|
|
# Raised when removing a gem with the uninstall command fails
|
|
|
|
|
|
|
|
class Gem::UninstallError < Gem::Exception
|
|
|
|
attr_accessor :spec
|
|
|
|
end
|
|
|
|
|
2007-11-10 02:48:56 -05:00
|
|
|
class Gem::DocumentError < Gem::Exception; end
|
2008-02-10 03:00:19 -05:00
|
|
|
|
2007-11-10 02:48:56 -05:00
|
|
|
##
|
|
|
|
# Potentially raised when a specification is validated.
|
|
|
|
class Gem::EndOfYAMLException < Gem::Exception; end
|
|
|
|
|
|
|
|
##
|
|
|
|
# Signals that a file permission error is preventing the user from
|
2012-11-29 01:52:18 -05:00
|
|
|
# operating on the given directory.
|
|
|
|
|
2007-11-10 02:48:56 -05:00
|
|
|
class Gem::FilePermissionError < Gem::Exception
|
2012-11-29 01:52:18 -05:00
|
|
|
attr_reader :directory
|
|
|
|
|
2018-11-21 05:20:47 -05:00
|
|
|
def initialize(directory)
|
2012-11-29 01:52:18 -05:00
|
|
|
@directory = directory
|
|
|
|
|
|
|
|
super "You don't have write permissions for the #{directory} directory."
|
2007-11-10 02:48:56 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
##
|
|
|
|
# Used to raise parsing and loading errors
|
|
|
|
class Gem::FormatException < Gem::Exception
|
|
|
|
attr_accessor :file_path
|
|
|
|
end
|
|
|
|
|
2012-11-29 01:52:18 -05:00
|
|
|
class Gem::GemNotFoundException < Gem::Exception; end
|
|
|
|
|
2013-10-19 21:33:19 -04:00
|
|
|
##
|
|
|
|
# Raised by the DependencyInstaller when a specific gem cannot be found
|
|
|
|
|
2012-11-29 01:52:18 -05:00
|
|
|
class Gem::SpecificGemNotFoundException < Gem::GemNotFoundException
|
2013-10-19 21:33:19 -04:00
|
|
|
##
|
|
|
|
# Creates a new SpecificGemNotFoundException for a gem with the given +name+
|
|
|
|
# and +version+. Any +errors+ encountered when attempting to find the gem
|
|
|
|
# are also stored.
|
|
|
|
|
2012-11-29 01:52:18 -05:00
|
|
|
def initialize(name, version, errors=nil)
|
|
|
|
super "Could not find a valid gem '#{name}' (#{version}) locally or in a repository"
|
|
|
|
|
2010-04-22 04:24:42 -04:00
|
|
|
@name = name
|
|
|
|
@version = version
|
|
|
|
@errors = errors
|
|
|
|
end
|
|
|
|
|
2013-10-19 21:33:19 -04:00
|
|
|
##
|
|
|
|
# The name of the gem that could not be found.
|
|
|
|
|
|
|
|
attr_reader :name
|
|
|
|
|
|
|
|
##
|
|
|
|
# The version of the gem that could not be found.
|
|
|
|
|
|
|
|
attr_reader :version
|
|
|
|
|
|
|
|
##
|
|
|
|
# Errors encountered attempting to find the gem.
|
|
|
|
|
|
|
|
attr_reader :errors
|
2010-04-22 04:24:42 -04:00
|
|
|
end
|
2007-11-10 02:48:56 -05:00
|
|
|
|
2013-09-14 04:59:02 -04:00
|
|
|
##
|
2013-11-18 19:34:13 -05:00
|
|
|
# Raised by Gem::Resolver when dependencies conflict and create the
|
2013-09-14 04:59:02 -04:00
|
|
|
# inability to find a valid possible spec for a request.
|
|
|
|
|
|
|
|
class Gem::ImpossibleDependenciesError < Gem::Exception
|
|
|
|
attr_reader :conflicts
|
|
|
|
attr_reader :request
|
|
|
|
|
2018-11-21 05:20:47 -05:00
|
|
|
def initialize(request, conflicts)
|
2013-09-14 04:59:02 -04:00
|
|
|
@request = request
|
|
|
|
@conflicts = conflicts
|
|
|
|
|
|
|
|
super build_message
|
|
|
|
end
|
|
|
|
|
|
|
|
def build_message # :nodoc:
|
|
|
|
requester = @request.requester
|
|
|
|
requester = requester ? requester.spec.full_name : 'The user'
|
|
|
|
dependency = @request.dependency
|
|
|
|
|
2016-02-01 07:43:26 -05:00
|
|
|
message = "#{requester} requires #{dependency} but it conflicted:\n".dup
|
2013-09-14 04:59:02 -04:00
|
|
|
|
|
|
|
@conflicts.each do |_, conflict|
|
|
|
|
message << conflict.explanation
|
|
|
|
end
|
|
|
|
|
|
|
|
message
|
|
|
|
end
|
|
|
|
|
|
|
|
def dependency
|
|
|
|
@request.dependency
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2007-11-10 02:48:56 -05:00
|
|
|
class Gem::InstallError < Gem::Exception; end
|
2017-10-07 21:32:18 -04:00
|
|
|
class Gem::RuntimeRequirementNotMetError < Gem::InstallError
|
|
|
|
attr_accessor :suggestion
|
|
|
|
def message
|
|
|
|
[suggestion, super].compact.join("\n\t")
|
|
|
|
end
|
|
|
|
end
|
2007-11-10 02:48:56 -05:00
|
|
|
|
|
|
|
##
|
|
|
|
# Potentially raised when a specification is validated.
|
|
|
|
class Gem::InvalidSpecificationException < Gem::Exception; end
|
|
|
|
|
|
|
|
class Gem::OperationNotSupportedError < Gem::Exception; end
|
|
|
|
|
|
|
|
##
|
|
|
|
# Signals that a remote operation cannot be conducted, probably due to not
|
|
|
|
# being connected (or just not finding host).
|
|
|
|
#--
|
|
|
|
# TODO: create a method that tests connection to the preferred gems server.
|
|
|
|
# All code dealing with remote operations will want this. Failure in that
|
|
|
|
# method should raise this error.
|
|
|
|
class Gem::RemoteError < Gem::Exception; end
|
|
|
|
|
|
|
|
class Gem::RemoteInstallationCancelled < Gem::Exception; end
|
|
|
|
|
|
|
|
class Gem::RemoteInstallationSkipped < Gem::Exception; end
|
|
|
|
|
|
|
|
##
|
|
|
|
# Represents an error communicating via HTTP.
|
|
|
|
class Gem::RemoteSourceException < Gem::Exception; end
|
|
|
|
|
2013-10-16 22:08:53 -04:00
|
|
|
##
|
|
|
|
# Raised when a gem dependencies file specifies a ruby version that does not
|
|
|
|
# match the current version.
|
|
|
|
|
|
|
|
class Gem::RubyVersionMismatch < Gem::Exception; end
|
|
|
|
|
2013-10-19 21:33:19 -04:00
|
|
|
##
|
|
|
|
# Raised by Gem::Validator when something is not right in a gem.
|
|
|
|
|
2007-11-10 02:48:56 -05:00
|
|
|
class Gem::VerificationError < Gem::Exception; end
|
|
|
|
|
2008-03-31 18:40:06 -04:00
|
|
|
##
|
|
|
|
# Raised to indicate that a system exit should occur with the specified
|
|
|
|
# exit_code
|
|
|
|
|
|
|
|
class Gem::SystemExitException < SystemExit
|
2013-10-19 21:33:19 -04:00
|
|
|
##
|
|
|
|
# The exit code for the process
|
|
|
|
|
2008-03-31 18:40:06 -04:00
|
|
|
attr_accessor :exit_code
|
|
|
|
|
2013-10-19 21:33:19 -04:00
|
|
|
##
|
|
|
|
# Creates a new SystemExitException with the given +exit_code+
|
|
|
|
|
2008-03-31 18:40:06 -04:00
|
|
|
def initialize(exit_code)
|
|
|
|
@exit_code = exit_code
|
|
|
|
|
|
|
|
super "Exiting RubyGems with exit_code #{exit_code}"
|
|
|
|
end
|
|
|
|
end
|
2012-11-29 01:52:18 -05:00
|
|
|
|
2013-09-14 04:59:02 -04:00
|
|
|
##
|
2013-11-18 19:34:13 -05:00
|
|
|
# Raised by Resolver when a dependency requests a gem for which
|
2013-09-14 04:59:02 -04:00
|
|
|
# there is no spec.
|
|
|
|
|
2014-09-13 23:30:02 -04:00
|
|
|
class Gem::UnsatisfiableDependencyError < Gem::DependencyError
|
2013-10-19 21:33:19 -04:00
|
|
|
##
|
|
|
|
# The unsatisfiable dependency. This is a
|
2013-11-18 19:34:13 -05:00
|
|
|
# Gem::Resolver::DependencyRequest, not a Gem::Dependency
|
2013-10-19 21:33:19 -04:00
|
|
|
|
2013-09-14 04:59:02 -04:00
|
|
|
attr_reader :dependency
|
|
|
|
|
2014-09-13 23:30:02 -04:00
|
|
|
##
|
|
|
|
# Errors encountered which may have contributed to this exception
|
|
|
|
|
|
|
|
attr_accessor :errors
|
|
|
|
|
2013-10-19 21:33:19 -04:00
|
|
|
##
|
2013-11-21 18:27:30 -05:00
|
|
|
# Creates a new UnsatisfiableDependencyError for the unsatisfiable
|
2013-11-18 19:34:13 -05:00
|
|
|
# Gem::Resolver::DependencyRequest +dep+
|
2013-10-19 21:33:19 -04:00
|
|
|
|
2018-11-21 05:20:47 -05:00
|
|
|
def initialize(dep, platform_mismatch=nil)
|
2013-11-10 12:51:40 -05:00
|
|
|
if platform_mismatch and !platform_mismatch.empty?
|
2020-06-10 13:46:05 -04:00
|
|
|
plats = platform_mismatch.map {|x| x.platform.to_s }.sort.uniq
|
2013-11-10 12:51:40 -05:00
|
|
|
super "Unable to resolve dependency: No match for '#{dep}' on this platform. Found: #{plats.join(', ')}"
|
|
|
|
else
|
|
|
|
if dep.explicit?
|
|
|
|
super "Unable to resolve dependency: user requested '#{dep}'"
|
|
|
|
else
|
|
|
|
super "Unable to resolve dependency: '#{dep.request_context}' requires '#{dep}'"
|
|
|
|
end
|
|
|
|
end
|
2013-09-14 04:59:02 -04:00
|
|
|
|
|
|
|
@dependency = dep
|
2014-09-13 23:30:02 -04:00
|
|
|
@errors = []
|
|
|
|
end
|
|
|
|
|
|
|
|
##
|
|
|
|
# The name of the unresolved dependency
|
|
|
|
|
|
|
|
def name
|
|
|
|
@dependency.name
|
|
|
|
end
|
|
|
|
|
|
|
|
##
|
|
|
|
# The Requirement of the unresolved dependency (not Version).
|
|
|
|
|
|
|
|
def version
|
|
|
|
@dependency.requirement
|
2013-09-14 04:59:02 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
##
|
|
|
|
# Backwards compatible typo'd exception class for early RubyGems 2.0.x
|
|
|
|
|
|
|
|
Gem::UnsatisfiableDepedencyError = Gem::UnsatisfiableDependencyError # :nodoc:
|