summaryrefslogtreecommitdiff
path: root/lib/bundler
diff options
context:
space:
mode:
Diffstat (limited to 'lib/bundler')
-rw-r--r--lib/bundler/dependency.rb5
-rw-r--r--lib/bundler/dsl.rb6
-rw-r--r--lib/bundler/resolver.rb9
-rw-r--r--lib/bundler/rubygems_ext.rb4
4 files changed, 22 insertions, 2 deletions
diff --git a/lib/bundler/dependency.rb b/lib/bundler/dependency.rb
index d2bac66cdb..1c37769e0a 100644
--- a/lib/bundler/dependency.rb
+++ b/lib/bundler/dependency.rb
@@ -88,6 +88,7 @@ module Bundler
@should_include = options.fetch("should_include", true)
@autorequire = Array(options["require"] || []) if options.key?("require")
+ @force_version = options.fetch("force_version", false)
end
def gem_platforms(valid_platforms)
@@ -106,6 +107,10 @@ module Bundler
@should_include && current_env? && current_platform?
end
+ def force_version?
+ @force_version
+ end
+
def current_env?
return true unless @env
if @env.is_a?(Hash)
diff --git a/lib/bundler/dsl.rb b/lib/bundler/dsl.rb
index c368c533fe..ef5aff09e4 100644
--- a/lib/bundler/dsl.rb
+++ b/lib/bundler/dsl.rb
@@ -15,7 +15,7 @@ module Bundler
VALID_PLATFORMS = Bundler::Dependency::PLATFORM_MAP.keys.freeze
VALID_KEYS = %w[group groups git path glob name branch ref tag require submodules
- platform platforms type source install_if].freeze
+ platform platforms type source install_if force_version].freeze
attr_reader :gemspecs
attr_accessor :dependencies
@@ -376,6 +376,10 @@ repo_name ||= user_name
opts["source"] = @sources.add_rubygems_source("remotes" => source)
end
+ if opts.key?("force_version") && (r = Gem::Requirement.new(version)) && !r.exact?
+ raise GemfileError, "Cannot use force_version for inexact version requirement `#{r}`"
+ end
+
git_name = (git_names & opts.keys).last
if @git_sources[git_name]
opts["git"] = @git_sources[git_name].call(opts[git_name])
diff --git a/lib/bundler/resolver.rb b/lib/bundler/resolver.rb
index 8bdeae275f..1fa343e6f0 100644
--- a/lib/bundler/resolver.rb
+++ b/lib/bundler/resolver.rb
@@ -354,7 +354,7 @@ module Bundler
end
def requirement_satisfied_by?(requirement, activated, spec)
- return false unless requirement.matches_spec?(spec) || spec.source.is_a?(Source::Gemspec)
+ return false unless requirement.matches_spec?(spec) || allows_conflicts?(requirement, activated, spec)
spec.activate_platform!(requirement.__platform) if !@platforms || @platforms.include?(requirement.__platform)
true
end
@@ -456,5 +456,12 @@ module Bundler
end
version_platform_strs.join(", ")
end
+
+ def allows_conflicts?(requirement, activated, spec)
+ return true if spec.source.is_a?(Source::Gemspec)
+ return false if requirement.force_version?
+ return true if activated.vertex_named(spec.name).requirements.any?(&:force_version?)
+ false
+ end
end
end
diff --git a/lib/bundler/rubygems_ext.rb b/lib/bundler/rubygems_ext.rb
index 0d282a8fcc..a35d3fb599 100644
--- a/lib/bundler/rubygems_ext.rb
+++ b/lib/bundler/rubygems_ext.rb
@@ -166,6 +166,10 @@ module Gem
requirement.satisfied_by?(spec.version)
end unless allocate.respond_to?(:matches_spec?)
+
+ def force_version?
+ false
+ end
end
class Requirement