aboutsummaryrefslogtreecommitdiffstats
path: root/lib/rubygems/resolver/conflict.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rubygems/resolver/conflict.rb')
-rw-r--r--lib/rubygems/resolver/conflict.rb102
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
+