diff options
author | Samuel Giddins <segiddins@segiddins.me> | 2017-08-30 13:44:06 -0500 |
---|---|---|
committer | Samuel Giddins <segiddins@segiddins.me> | 2017-08-30 20:47:59 -0500 |
commit | 789974c1d3e08830b49d7517b943d33d24ed2192 (patch) | |
tree | 184360ac140851f3ee312006c80965636d4d69a0 /lib/bundler/resolver.rb | |
parent | 570012724216e8a4f8cd2ffe9eb8acdfc94be133 (diff) | |
download | bundler-789974c1d3e08830b49d7517b943d33d24ed2192.tar.gz |
[Resolver] Error when it is ambigous which transitive source a gem should come fromseg-multisource-error
Diffstat (limited to 'lib/bundler/resolver.rb')
-rw-r--r-- | lib/bundler/resolver.rb | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/lib/bundler/resolver.rb b/lib/bundler/resolver.rb index 0cf2da007a..8794b6909b 100644 --- a/lib/bundler/resolver.rb +++ b/lib/bundler/resolver.rb @@ -43,9 +43,12 @@ module Bundler def start(requirements) verify_gemfile_dependencies_are_found!(requirements) dg = @resolver.resolve(requirements, @base_dg) - dg.map(&:payload). + dg. + tap {|resolved| validate_resolved_specs!(resolved) }. + map(&:payload). reject {|sg| sg.name.end_with?("\0") }. - map(&:to_specs).flatten + map(&:to_specs). + flatten rescue Molinillo::VersionConflict => e message = version_conflict_message(e) raise VersionConflict.new(e.conflicts.keys.uniq, message) @@ -353,5 +356,29 @@ module Bundler :version_for_spec => lambda {|spec| spec.version } ) end + + def validate_resolved_specs!(resolved_specs) + resolved_specs.each do |v| + name = v.name + next unless sources = relevant_sources_for_vertex(v) + sources.compact! + if default_index = sources.index(@source_requirements[:default]) + sources.delete_at(default_index) + end + sources.reject! {|s| s.specs[name].empty? } + sources.uniq! + next if sources.size <= 1 + + multisource_disabled = Bundler.feature_flag.disable_multisource? + + msg = ["The gem '#{name}' was found in multiple relevant sources."] + msg.concat sources.map {|s| " * #{s}" }.sort + msg << "You #{multisource_disabled ? :must : :should} add this gem to the source block for the source you wish it to be installed from." + msg = msg.join("\n") + + raise SecurityError, msg if multisource_disabled + Bundler.ui.error "Warning: #{msg}" + end + end end end |