diff options
Diffstat (limited to 'lib/rubygems/resolver/conflict.rb')
-rw-r--r-- | lib/rubygems/resolver/conflict.rb | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/lib/rubygems/resolver/conflict.rb b/lib/rubygems/resolver/conflict.rb new file mode 100644 index 0000000000..b081972658 --- /dev/null +++ b/lib/rubygems/resolver/conflict.rb @@ -0,0 +1,102 @@ +## +# Used internally to indicate that a dependency conflicted +# with a spec that would be activated. + +class Gem::Resolver::Conflict + + attr_reader :activated + + attr_reader :dependency + + attr_reader :failed_dep # :nodoc: + + def initialize(dependency, activated, failed_dep=dependency) + @dependency = dependency + @activated = activated + @failed_dep = failed_dep + end + + def == other + self.class === other and + @dependency == other.dependency and + @activated == other.activated and + @failed_dep == other.failed_dep + end + + def explain + "<Conflict wanted: #{@failed_dep}, had: #{activated.spec.full_name}>" + end + + ## + # Return the 2 dependency objects that conflicted + + def conflicting_dependencies + [@failed_dep.dependency, @activated.request.dependency] + end + + ## + # Explanation of the conflict used by exceptions to print useful messages + + def explanation + activated = @activated.spec.full_name + requirement = @failed_dep.dependency.requirement + + " Activated %s instead of (%s) via:\n %s\n" % [ + activated, requirement, request_path.join(', ') + ] + end + + def for_spec?(spec) + @dependency.name == spec.name + end + + def pretty_print q # :nodoc: + q.group 2, '[Dependency conflict: ', ']' do + q.breakable + + q.text 'activated ' + q.pp @activated + + q.breakable + q.text ' dependency ' + q.pp @dependency + + q.breakable + if @dependency == @failed_dep then + q.text ' failed' + else + q.text ' failed dependency ' + q.pp @failed_dep + end + end + end + + ## + # Path of specifications that requested this dependency + + def request_path + current = requester + path = [] + + while current do + path << current.spec.full_name + + current = current.request.requester + end + + path = ['user request (gem command or Gemfile)'] if path.empty? + + path + end + + ## + # Return the Specification that listed the dependency + + def requester + @failed_dep.requester + end + +end + +Gem::Resolver::DependencyConflict = Gem::Resolver::Conflict + |