@@ -138,13 +138,13 @@ def initialize(lockfile, dependencies, sources, unlock, ruby_version = nil, opti
138138 @unlock [ :gems ] ||= @dependencies . map ( &:name )
139139 else
140140 eager_unlock = expand_dependencies ( @unlock [ :gems ] || [ ] , true )
141- @unlock [ :gems ] = @locked_specs . for ( eager_unlock , false , false ) . map ( &:name )
141+ @unlock [ :gems ] = @locked_specs . for ( eager_unlock , false , platforms ) . map ( &:name )
142142 end
143143
144144 @dependency_changes = converge_dependencies
145145 @local_changes = converge_locals
146146
147- @locked_specs_incomplete_for_platform = ! @locked_specs . for ( requested_dependencies & expand_dependencies ( locked_dependencies ) , true , true )
147+ @reresolve = nil
148148
149149 @requires = compute_requires
150150 end
@@ -279,11 +279,8 @@ def resolve
279279 end
280280 end
281281 else
282- last_resolve = converge_locked_specs
283- # Run a resolve against the locally available gems
284282 Bundler . ui . debug ( "Found changes from the lockfile, re-resolving dependencies because #{ change_reason } " )
285- expanded_dependencies = expand_dependencies ( dependencies + metadata_dependencies , true )
286- Resolver . resolve ( expanded_dependencies , source_requirements , last_resolve , gem_version_promoter , additional_base_requirements_for_resolve , platforms )
283+ @reresolve = reresolve
287284 end
288285 end
289286
@@ -468,7 +465,7 @@ def most_specific_locked_platform
468465 private :sources
469466
470467 def nothing_changed?
471- !@source_changes && !@dependency_changes && !@new_platform && !@path_changes && !@local_changes && ! @locked_specs_incomplete_for_platform
468+ !@source_changes && !@dependency_changes && !@new_platform && !@path_changes && !@local_changes
472469 end
473470
474471 def unlocking?
@@ -477,8 +474,14 @@ def unlocking?
477474
478475 private
479476
477+ def reresolve
478+ last_resolve = converge_locked_specs
479+ expanded_dependencies = expand_dependencies ( dependencies + metadata_dependencies , true )
480+ Resolver . resolve ( expanded_dependencies , source_requirements , last_resolve , gem_version_promoter , additional_base_requirements_for_resolve , platforms )
481+ end
482+
480483 def filter_specs ( specs , deps )
481- SpecSet . new ( specs ) . for ( expand_dependencies ( deps , true ) , false , false )
484+ SpecSet . new ( specs ) . for ( expand_dependencies ( deps , true ) , false , platforms )
482485 end
483486
484487 def materialize ( dependencies )
@@ -502,6 +505,17 @@ def materialize(dependencies)
502505 raise GemNotFound , "Could not find #{ missing_specs_list . join ( " nor " ) } "
503506 end
504507
508+ if @reresolve . nil?
509+ incomplete_specs = specs . incomplete_specs
510+
511+ if incomplete_specs . any?
512+ Bundler . ui . debug ( "The lockfile does not have all gems needed for the current platform though, Bundler will still re-resolve dependencies" )
513+ @unlock [ :gems ] . concat ( incomplete_specs . map ( &:name ) )
514+ @resolve = reresolve
515+ specs = resolve . materialize ( dependencies )
516+ end
517+ end
518+
505519 unless specs [ "bundler" ] . any?
506520 bundler = sources . metadata_source . specs . search ( Gem ::Dependency . new ( "bundler" , VERSION ) ) . last
507521 specs [ "bundler" ] = bundler
@@ -549,7 +563,6 @@ def change_reason
549563 [ @new_platform , "you added a new platform to your gemfile" ] ,
550564 [ @path_changes , "the gemspecs for path gems changed" ] ,
551565 [ @local_changes , "the gemspecs for git local gems changed" ] ,
552- [ @locked_specs_incomplete_for_platform , "the lockfile does not have all gems needed for the current platform" ] ,
553566 ] . select ( &:first ) . map ( &:last ) . join ( ", " )
554567 end
555568
@@ -725,7 +738,7 @@ def converge_specs(specs)
725738 # if we won't need the source (according to the lockfile),
726739 # don't error if the path/git source isn't available
727740 next if specs .
728- for ( requested_dependencies , false , true ) .
741+ for ( requested_dependencies , false ) .
729742 none? { |locked_spec | locked_spec . source == s . source }
730743
731744 raise
0 commit comments