converge_locked_specs()
private
Remove elements from the locked
specs that are expired. This
will most commonly happen if the Gemfile has changed since the lockfile was
last generated
Show source
def converge_locked_specs
deps = []
@dependencies.each do |dep|
locked_dep = @locked_deps[dep.name]
locked_dep = nil unless locked_dep == dep
if in_locked_deps?(dep, locked_dep) || satisfies_locked_spec?(dep)
deps << dep
elsif dep.source.is_a?(Source::Path) && dep.current_platform? && (!locked_dep || dep.source != locked_dep.source)
@locked_specs.each do |s|
@unlock[:gems] << s.name if s.source == dep.source
end
dep.source.unlock! if dep.source.respond_to?(:unlock!)
dep.source.specs.each {|s| @unlock[:gems] << s.name }
end
end
unlock_source_unlocks_spec = Bundler.feature_flag.unlock_source_unlocks_spec?
converged = []
@locked_specs.each do |s|
dep = @dependencies.find {|d| s.satisfies?(d) }
s.source = (dep && dep.source) || sources.get(s.source)
next if s.source.nil?
next if @unlock[:sources].include?(s.source.name)
next if unlock_source_unlocks_spec && @unlock[:sources].include?(s.name)
if s.source.instance_of?(Source::Path) || s.source.instance_of?(Source::Gemspec)
other_sources_specs = begin
s.source.specs
rescue PathError, GitError
next if @locked_specs.
for(requested_dependencies, [], false, true, false).
none? {|locked_spec| locked_spec.source == s.source }
raise
end
other = other_sources_specs[s].first
next unless other
deps2 = other.dependencies.select {|d| d.type != :development }
runtime_dependencies = s.dependencies.select {|d| d.type != :development }
next unless runtime_dependencies.sort == deps2.sort
end
converged << s
end
resolve = SpecSet.new(converged)
expanded_deps = expand_dependencies(deps, true)
@locked_specs_incomplete_for_platform = !resolve.for(expanded_deps, @unlock[:gems], true, true)
resolve = resolve.for(expanded_deps, @unlock[:gems], false, false, false)
diff = nil
sources.all_sources.each do |source|
next unless source.respond_to?(:unlock!)
unless resolve.any? {|s| s.source == source }
diff ||= @locked_specs.to_a - resolve.to_a
source.unlock! if diff.any? {|s| s.source == source }
end
end
resolve
end