bundler 2.2.18 → 2.2.23

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of bundler might be problematic. Click here for more details.

Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -0
  3. data/bundler.gemspec +1 -1
  4. data/lib/bundler.rb +5 -6
  5. data/lib/bundler/build_metadata.rb +2 -2
  6. data/lib/bundler/cli/check.rb +4 -2
  7. data/lib/bundler/cli/doctor.rb +11 -1
  8. data/lib/bundler/cli/install.rb +7 -8
  9. data/lib/bundler/cli/lock.rb +5 -1
  10. data/lib/bundler/cli/outdated.rb +2 -0
  11. data/lib/bundler/cli/update.rb +8 -3
  12. data/lib/bundler/current_ruby.rb +4 -4
  13. data/lib/bundler/definition.rb +27 -55
  14. data/lib/bundler/dsl.rb +19 -31
  15. data/lib/bundler/feature_flag.rb +0 -2
  16. data/lib/bundler/fetcher/compact_index.rb +1 -1
  17. data/lib/bundler/fetcher/downloader.rb +1 -2
  18. data/lib/bundler/fetcher/index.rb +0 -1
  19. data/lib/bundler/friendly_errors.rb +1 -3
  20. data/lib/bundler/index.rb +1 -5
  21. data/lib/bundler/installer.rb +5 -12
  22. data/lib/bundler/lockfile_parser.rb +2 -20
  23. data/lib/bundler/man/bundle-add.1 +1 -1
  24. data/lib/bundler/man/bundle-binstubs.1 +1 -1
  25. data/lib/bundler/man/bundle-cache.1 +1 -1
  26. data/lib/bundler/man/bundle-check.1 +1 -1
  27. data/lib/bundler/man/bundle-clean.1 +1 -1
  28. data/lib/bundler/man/bundle-config.1 +1 -4
  29. data/lib/bundler/man/bundle-config.1.ronn +0 -3
  30. data/lib/bundler/man/bundle-doctor.1 +1 -1
  31. data/lib/bundler/man/bundle-exec.1 +1 -1
  32. data/lib/bundler/man/bundle-gem.1 +1 -1
  33. data/lib/bundler/man/bundle-info.1 +1 -1
  34. data/lib/bundler/man/bundle-init.1 +1 -1
  35. data/lib/bundler/man/bundle-inject.1 +1 -1
  36. data/lib/bundler/man/bundle-install.1 +1 -1
  37. data/lib/bundler/man/bundle-list.1 +1 -1
  38. data/lib/bundler/man/bundle-lock.1 +1 -1
  39. data/lib/bundler/man/bundle-open.1 +1 -1
  40. data/lib/bundler/man/bundle-outdated.1 +1 -1
  41. data/lib/bundler/man/bundle-platform.1 +1 -1
  42. data/lib/bundler/man/bundle-pristine.1 +1 -1
  43. data/lib/bundler/man/bundle-remove.1 +1 -1
  44. data/lib/bundler/man/bundle-show.1 +1 -1
  45. data/lib/bundler/man/bundle-update.1 +4 -4
  46. data/lib/bundler/man/bundle-update.1.ronn +3 -3
  47. data/lib/bundler/man/bundle-viz.1 +1 -1
  48. data/lib/bundler/man/bundle.1 +1 -1
  49. data/lib/bundler/man/gemfile.5 +1 -1
  50. data/lib/bundler/plugin/installer.rb +1 -1
  51. data/lib/bundler/resolver.rb +3 -1
  52. data/lib/bundler/rubygems_ext.rb +22 -6
  53. data/lib/bundler/rubygems_integration.rb +4 -3
  54. data/lib/bundler/settings.rb +23 -9
  55. data/lib/bundler/source.rb +2 -0
  56. data/lib/bundler/source/rubygems.rb +10 -21
  57. data/lib/bundler/source_list.rb +44 -21
  58. data/lib/bundler/spec_set.rb +3 -7
  59. data/lib/bundler/templates/newgem/newgem.gemspec.tt +1 -1
  60. data/lib/bundler/version.rb +1 -1
  61. metadata +4 -7
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-OPEN" "1" "May 2021" "" ""
4
+ .TH "BUNDLE\-OPEN" "1" "June 2021" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-open\fR \- Opens the source directory for a gem in your bundle
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-OUTDATED" "1" "May 2021" "" ""
4
+ .TH "BUNDLE\-OUTDATED" "1" "June 2021" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-outdated\fR \- List installed gems with newer versions available
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-PLATFORM" "1" "May 2021" "" ""
4
+ .TH "BUNDLE\-PLATFORM" "1" "June 2021" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-platform\fR \- Displays platform compatibility information
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-PRISTINE" "1" "May 2021" "" ""
4
+ .TH "BUNDLE\-PRISTINE" "1" "June 2021" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-pristine\fR \- Restores installed gems to their pristine condition
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-REMOVE" "1" "May 2021" "" ""
4
+ .TH "BUNDLE\-REMOVE" "1" "June 2021" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-remove\fR \- Removes gems from the Gemfile
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-SHOW" "1" "May 2021" "" ""
4
+ .TH "BUNDLE\-SHOW" "1" "June 2021" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-show\fR \- Shows all the gems in your bundle, or the path to a gem
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-UPDATE" "1" "May 2021" "" ""
4
+ .TH "BUNDLE\-UPDATE" "1" "June 2021" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-update\fR \- Update your gems to the latest available versions
@@ -79,7 +79,7 @@ Do not allow any gem to be updated past latest \fB\-\-patch\fR | \fB\-\-minor\fR
79
79
  .
80
80
  .TP
81
81
  \fB\-\-conservative\fR
82
- Use bundle install conservative update behavior and do not allow shared dependencies to be updated\.
82
+ Use bundle install conservative update behavior and do not allow indirect dependencies to be updated\.
83
83
  .
84
84
  .SH "UPDATING ALL GEMS"
85
85
  If you run \fBbundle update \-\-all\fR, bundler will ignore any previously installed gems and resolve all dependencies again based on the latest versions of all gems available in the sources\.
@@ -208,13 +208,13 @@ In this case, the two gems have their own set of dependencies, but they share \f
208
208
  In short, by default, when you update a gem using \fBbundle update\fR, bundler will update all dependencies of that gem, including those that are also dependencies of another gem\.
209
209
  .
210
210
  .P
211
- To prevent updating shared dependencies, prior to version 1\.14 the only option was the \fBCONSERVATIVE UPDATING\fR behavior in bundle install(1) \fIbundle\-install\.1\.html\fR:
211
+ To prevent updating indirect dependencies, prior to version 1\.14 the only option was the \fBCONSERVATIVE UPDATING\fR behavior in bundle install(1) \fIbundle\-install\.1\.html\fR:
212
212
  .
213
213
  .P
214
214
  In this scenario, updating the \fBthin\fR version manually in the Gemfile(5), and then running bundle install(1) \fIbundle\-install\.1\.html\fR will only update \fBdaemons\fR and \fBeventmachine\fR, but not \fBrack\fR\. For more information, see the \fBCONSERVATIVE UPDATING\fR section of bundle install(1) \fIbundle\-install\.1\.html\fR\.
215
215
  .
216
216
  .P
217
- Starting with 1\.14, specifying the \fB\-\-conservative\fR option will also prevent shared dependencies from being updated\.
217
+ Starting with 1\.14, specifying the \fB\-\-conservative\fR option will also prevent indirect dependencies from being updated\.
218
218
  .
219
219
  .SH "PATCH LEVEL OPTIONS"
220
220
  Version 1\.14 introduced 4 patch\-level options that will influence how gem versions are resolved\. One of the following options can be used: \fB\-\-patch\fR, \fB\-\-minor\fR or \fB\-\-major\fR\. \fB\-\-strict\fR can be added to further influence resolution\.
@@ -80,7 +80,7 @@ gem.
80
80
  Do not allow any gem to be updated past latest `--patch` | `--minor` | `--major`.
81
81
 
82
82
  * `--conservative`:
83
- Use bundle install conservative update behavior and do not allow shared dependencies to be updated.
83
+ Use bundle install conservative update behavior and do not allow indirect dependencies to be updated.
84
84
 
85
85
  ## UPDATING ALL GEMS
86
86
 
@@ -195,7 +195,7 @@ In short, by default, when you update a gem using `bundle update`, bundler will
195
195
  update all dependencies of that gem, including those that are also dependencies
196
196
  of another gem.
197
197
 
198
- To prevent updating shared dependencies, prior to version 1.14 the only option
198
+ To prevent updating indirect dependencies, prior to version 1.14 the only option
199
199
  was the `CONSERVATIVE UPDATING` behavior in [bundle install(1)](bundle-install.1.html):
200
200
 
201
201
  In this scenario, updating the `thin` version manually in the Gemfile(5),
@@ -203,7 +203,7 @@ and then running [bundle install(1)](bundle-install.1.html) will only update `da
203
203
  but not `rack`. For more information, see the `CONSERVATIVE UPDATING` section
204
204
  of [bundle install(1)](bundle-install.1.html).
205
205
 
206
- Starting with 1.14, specifying the `--conservative` option will also prevent shared
206
+ Starting with 1.14, specifying the `--conservative` option will also prevent indirect
207
207
  dependencies from being updated.
208
208
 
209
209
  ## PATCH LEVEL OPTIONS
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-VIZ" "1" "May 2021" "" ""
4
+ .TH "BUNDLE\-VIZ" "1" "June 2021" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-viz\fR \- Generates a visual dependency graph for your Gemfile
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE" "1" "May 2021" "" ""
4
+ .TH "BUNDLE" "1" "June 2021" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\fR \- Ruby Dependency Management
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "GEMFILE" "5" "May 2021" "" ""
4
+ .TH "GEMFILE" "5" "June 2021" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBGemfile\fR \- A format for describing gem dependencies for Ruby programs
@@ -77,7 +77,7 @@ module Bundler
77
77
  source_list = SourceList.new
78
78
 
79
79
  source_list.add_git_source(git_source_options) if git_source_options
80
- source_list.global_rubygems_source = rubygems_source if rubygems_source
80
+ Array(rubygems_source).each {|remote| source_list.add_global_rubygems_remote(remote) } if rubygems_source
81
81
 
82
82
  deps = names.map {|name| Dependency.new name, version }
83
83
 
@@ -21,7 +21,7 @@ module Bundler
21
21
  base = SpecSet.new(base) unless base.is_a?(SpecSet)
22
22
  resolver = new(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms)
23
23
  result = resolver.start(requirements)
24
- SpecSet.new(result).for(requirements.reject{|dep| dep.name.end_with?("\0") })
24
+ SpecSet.new(SpecSet.new(result).for(requirements.reject{|dep| dep.name.end_with?("\0") }))
25
25
  end
26
26
 
27
27
  def initialize(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms)
@@ -30,8 +30,10 @@ module Bundler
30
30
  @resolver = Molinillo::Resolver.new(self, self)
31
31
  @search_for = {}
32
32
  @base_dg = Molinillo::DependencyGraph.new
33
+ aggregate_global_source = @source_requirements[:default].is_a?(Source::RubygemsAggregate)
33
34
  @base.each do |ls|
34
35
  dep = Dependency.new(ls.name, ls.version)
36
+ ls.source = source_for(ls.name) unless aggregate_global_source
35
37
  @base_dg.add_vertex(ls.name, DepProxy.get_proxy(dep, ls.platform), true)
36
38
  end
37
39
  additional_base_requirements.each {|d| @base_dg.add_vertex(d.name, d) }
@@ -174,20 +174,36 @@ module Gem
174
174
  end
175
175
  end
176
176
 
177
+ require "rubygems/platform"
178
+
177
179
  class Platform
178
180
  JAVA = Gem::Platform.new("java") unless defined?(JAVA)
179
181
  MSWIN = Gem::Platform.new("mswin32") unless defined?(MSWIN)
180
182
  MSWIN64 = Gem::Platform.new("mswin64") unless defined?(MSWIN64)
181
183
  MINGW = Gem::Platform.new("x86-mingw32") unless defined?(MINGW)
182
184
  X64_MINGW = Gem::Platform.new("x64-mingw32") unless defined?(X64_MINGW)
185
+ end
183
186
 
184
- undef_method :hash if method_defined? :hash
185
- def hash
186
- @cpu.hash ^ @os.hash ^ @version.hash
187
- end
187
+ Platform.singleton_class.module_eval do
188
+ unless Platform.singleton_methods.include?(:match_spec?)
189
+ def match_spec?(spec)
190
+ match_gem?(spec.platform, spec.name)
191
+ end
188
192
 
189
- undef_method :eql? if method_defined? :eql?
190
- alias_method :eql?, :==
193
+ def match_gem?(platform, gem_name)
194
+ match_platforms?(platform, Gem.platforms)
195
+ end
196
+
197
+ private
198
+
199
+ def match_platforms?(platform, platforms)
200
+ platforms.any? do |local_platform|
201
+ platform.nil? ||
202
+ local_platform == platform ||
203
+ (local_platform != Gem::Platform::RUBY && local_platform =~ platform)
204
+ end
205
+ end
206
+ end
191
207
  end
192
208
 
193
209
  require "rubygems/util"
@@ -526,13 +526,14 @@ module Bundler
526
526
  Bundler::Retry.new("download gem from #{uri}").attempts do
527
527
  fetcher.download(spec, uri, path)
528
528
  end
529
+ rescue Gem::RemoteFetcher::FetchError => e
530
+ raise Bundler::HTTPError, "Could not download gem from #{uri} due to underlying error <#{e.message}>"
529
531
  end
530
532
 
531
533
  def gem_remote_fetcher
532
- require "resolv"
534
+ require "rubygems/remote_fetcher"
533
535
  proxy = configuration[:http_proxy]
534
- dns = Resolv::DNS.new
535
- Gem::RemoteFetcher.new(proxy, dns)
536
+ Gem::RemoteFetcher.new(proxy)
536
537
  end
537
538
 
538
539
  def gem_from_path(path, policy = nil)
@@ -16,7 +16,6 @@ module Bundler
16
16
  clean
17
17
  default_install_uses_path
18
18
  deployment
19
- deployment_means_frozen
20
19
  disable_checksum_validation
21
20
  disable_exec_load
22
21
  disable_local_branch_check
@@ -45,7 +44,6 @@ module Bundler
45
44
  silence_deprecations
46
45
  silence_root_warning
47
46
  suppress_install_using_messages
48
- unlock_source_unlocks_spec
49
47
  update_requires_all_flag
50
48
  use_gem_version_promoter_for_major_updates
51
49
  ].freeze
@@ -210,6 +208,13 @@ module Bundler
210
208
  locations
211
209
  end
212
210
 
211
+ def processor_count
212
+ require "etc"
213
+ Etc.nprocessors
214
+ rescue StandardError
215
+ 1
216
+ end
217
+
213
218
  # for legacy reasons, in Bundler 2, we do not respect :disable_shared_gems
214
219
  def path
215
220
  configs.each do |_level, settings|
@@ -423,12 +428,8 @@ module Bundler
423
428
  def global_config_file
424
429
  if ENV["BUNDLE_CONFIG"] && !ENV["BUNDLE_CONFIG"].empty?
425
430
  Pathname.new(ENV["BUNDLE_CONFIG"])
426
- else
427
- begin
428
- Bundler.user_bundle_path("config")
429
- rescue PermissionError, GenericSystemCallError
430
- nil
431
- end
431
+ elsif Bundler.rubygems.user_home && !Bundler.rubygems.user_home.empty?
432
+ Pathname.new(Bundler.rubygems.user_home).join(".bundle/config")
432
433
  end
433
434
  end
434
435
 
@@ -442,7 +443,20 @@ module Bundler
442
443
  valid_file = file.exist? && !file.size.zero?
443
444
  return {} unless valid_file
444
445
  require_relative "yaml_serializer"
445
- YAMLSerializer.load file.read
446
+ YAMLSerializer.load(file.read).inject({}) do |config, (k, v)|
447
+ new_k = k
448
+
449
+ if k.include?("-")
450
+ Bundler.ui.warn "Your #{file} config includes `#{k}`, which contains the dash character (`-`).\n" \
451
+ "This is deprecated, because configuration through `ENV` should be possible, but `ENV` keys cannot include dashes.\n" \
452
+ "Please edit #{file} and replace any dashes in configuration keys with a triple underscore (`___`)."
453
+
454
+ new_k = k.gsub("-", "___")
455
+ end
456
+
457
+ config[new_k] = v
458
+ config
459
+ end
446
460
  end
447
461
  end
448
462
 
@@ -36,6 +36,8 @@ module Bundler
36
36
 
37
37
  def local!; end
38
38
 
39
+ def local_only!; end
40
+
39
41
  def cached!; end
40
42
 
41
43
  def remote!; end
@@ -26,6 +26,12 @@ module Bundler
26
26
  Array(options["remotes"]).reverse_each {|r| add_remote(r) }
27
27
  end
28
28
 
29
+ def local_only!
30
+ @specs = nil
31
+ @allow_local = true
32
+ @allow_remote = false
33
+ end
34
+
29
35
  def local!
30
36
  return if @allow_local
31
37
 
@@ -61,13 +67,13 @@ module Bundler
61
67
  o.is_a?(Rubygems) && (o.credless_remotes - credless_remotes).empty?
62
68
  end
63
69
 
64
- def disable_multisource?
65
- @remotes.size <= 1
70
+ def multiple_remotes?
71
+ @remotes.size > 1
66
72
  end
67
73
 
68
74
  def can_lock?(spec)
69
- return super if disable_multisource?
70
- spec.source.is_a?(Rubygems)
75
+ return super unless multiple_remotes?
76
+ include?(spec.source)
71
77
  end
72
78
 
73
79
  def options
@@ -246,19 +252,6 @@ module Bundler
246
252
  other_remotes.map(&method(:remove_auth)) == @remotes.map(&method(:remove_auth))
247
253
  end
248
254
 
249
- def replace_remotes(other_remotes, allow_equivalent = false)
250
- return false if other_remotes == @remotes
251
-
252
- equivalent = allow_equivalent && equivalent_remotes?(other_remotes)
253
-
254
- @remotes = []
255
- other_remotes.reverse_each do |r|
256
- add_remote r.to_s
257
- end
258
-
259
- !equivalent
260
- end
261
-
262
255
  def spec_names
263
256
  if @allow_remote && dependency_api_available?
264
257
  remote_specs.spec_names
@@ -398,10 +391,6 @@ module Bundler
398
391
  next if gemfile =~ /^bundler\-[\d\.]+?\.gem/
399
392
  s ||= Bundler.rubygems.spec_from_gem(gemfile)
400
393
  s.source = self
401
- if Bundler.rubygems.spec_missing_extensions?(s, false)
402
- Bundler.ui.debug "Source #{self} is ignoring #{s} because it is missing extensions"
403
- next
404
- end
405
394
  idx << s
406
395
  end
407
396
 
@@ -28,12 +28,13 @@ module Bundler
28
28
  @merged_gem_lockfile_sections
29
29
  end
30
30
 
31
- def merged_gem_lockfile_sections!
31
+ def merged_gem_lockfile_sections!(replacement_source)
32
32
  @merged_gem_lockfile_sections = true
33
+ @global_rubygems_source = replacement_source
33
34
  end
34
35
 
35
- def no_aggregate_global_source?
36
- global_rubygems_source.remotes.size <= 1
36
+ def aggregate_global_source?
37
+ global_rubygems_source.multiple_remotes?
37
38
  end
38
39
 
39
40
  def add_path_source(options = {})
@@ -53,18 +54,17 @@ module Bundler
53
54
  end
54
55
 
55
56
  def add_rubygems_source(options = {})
56
- add_source_to_list Source::Rubygems.new(options), @rubygems_sources
57
+ new_source = Source::Rubygems.new(options)
58
+ return @global_rubygems_source if @global_rubygems_source == new_source
59
+
60
+ add_source_to_list new_source, @rubygems_sources
57
61
  end
58
62
 
59
63
  def add_plugin_source(source, options = {})
60
64
  add_source_to_list Plugin.source(source).new(options), @plugin_sources
61
65
  end
62
66
 
63
- def global_rubygems_source=(uri)
64
- @global_rubygems_source ||= rubygems_aggregate_class.new("remotes" => uri, "allow_local" => true)
65
- end
66
-
67
- def add_rubygems_remote(uri)
67
+ def add_global_rubygems_remote(uri)
68
68
  global_rubygems_source.add_remote(uri)
69
69
  global_rubygems_source
70
70
  end
@@ -109,27 +109,30 @@ module Bundler
109
109
  if merged_gem_lockfile_sections?
110
110
  [combine_rubygems_sources]
111
111
  else
112
- rubygems_sources.sort_by(&:to_s).uniq
112
+ rubygems_sources.sort_by(&:to_s)
113
113
  end
114
114
  end
115
115
 
116
116
  # Returns true if there are changes
117
117
  def replace_sources!(replacement_sources)
118
- return true if replacement_sources.empty?
118
+ return false if replacement_sources.empty?
119
119
 
120
- [path_sources, git_sources, plugin_sources].each do |source_list|
121
- source_list.map! do |source|
122
- replacement_sources.find {|s| s == source } || source
123
- end
124
- end
120
+ @path_sources, @git_sources, @plugin_sources = map_sources(replacement_sources)
125
121
 
126
- replacement_rubygems = merged_gem_lockfile_sections? &&
127
- replacement_sources.detect {|s| s.is_a?(Source::Rubygems) }
128
- @global_rubygems_source = replacement_rubygems if replacement_rubygems
122
+ different_sources?(lock_sources, replacement_sources)
123
+ end
124
+
125
+ # Returns true if there are changes
126
+ def expired_sources?(replacement_sources)
127
+ return false if replacement_sources.empty?
129
128
 
130
- return true if !equal_sources?(lock_sources, replacement_sources) && !equivalent_sources?(lock_sources, replacement_sources)
129
+ lock_sources = dup_with_replaced_sources(replacement_sources).lock_sources
130
+
131
+ different_sources?(lock_sources, replacement_sources)
132
+ end
131
133
 
132
- false
134
+ def local_only!
135
+ all_sources.each(&:local_only!)
133
136
  end
134
137
 
135
138
  def cached!
@@ -142,6 +145,24 @@ module Bundler
142
145
 
143
146
  private
144
147
 
148
+ def dup_with_replaced_sources(replacement_sources)
149
+ new_source_list = dup
150
+ new_source_list.replace_sources!(replacement_sources)
151
+ new_source_list
152
+ end
153
+
154
+ def map_sources(replacement_sources)
155
+ [path_sources, git_sources, plugin_sources].map do |sources|
156
+ sources.map do |source|
157
+ replacement_sources.find {|s| s == source } || source
158
+ end
159
+ end
160
+ end
161
+
162
+ def different_sources?(lock_sources, replacement_sources)
163
+ !equal_sources?(lock_sources, replacement_sources) && !equivalent_sources?(lock_sources, replacement_sources)
164
+ end
165
+
145
166
  def rubygems_aggregate_class
146
167
  Source::Rubygems
147
168
  end
@@ -181,6 +202,8 @@ module Bundler
181
202
  end
182
203
 
183
204
  def equal_source?(source, other_source)
205
+ return source.include?(other_source) if source.is_a?(Source::Rubygems) && other_source.is_a?(Source::Rubygems) && !merged_gem_lockfile_sections?
206
+
184
207
  source == other_source
185
208
  end
186
209