rubygems-update 2.7.6 → 2.7.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -23
  3. data/History.txt +116 -0
  4. data/Manifest.txt +3 -3
  5. data/Rakefile +12 -2
  6. data/bundler/CHANGELOG.md +130 -0
  7. data/bundler/README.md +5 -1
  8. data/bundler/bundler.gemspec +2 -1
  9. data/bundler/lib/bundler.rb +12 -8
  10. data/bundler/lib/bundler/build_metadata.rb +19 -2
  11. data/bundler/lib/bundler/cli.rb +3 -1
  12. data/bundler/lib/bundler/cli/check.rb +1 -1
  13. data/bundler/lib/bundler/cli/exec.rb +4 -4
  14. data/bundler/lib/bundler/cli/gem.rb +5 -2
  15. data/bundler/lib/bundler/cli/init.rb +5 -0
  16. data/bundler/lib/bundler/cli/install.rb +2 -2
  17. data/bundler/lib/bundler/cli/outdated.rb +1 -1
  18. data/bundler/lib/bundler/cli/update.rb +3 -3
  19. data/bundler/lib/bundler/compact_index_client/updater.rb +10 -1
  20. data/bundler/lib/bundler/current_ruby.rb +8 -1
  21. data/bundler/lib/bundler/definition.rb +33 -23
  22. data/bundler/lib/bundler/dep_proxy.rb +2 -2
  23. data/bundler/lib/bundler/dependency.rb +1 -0
  24. data/bundler/lib/bundler/deprecate.rb +2 -1
  25. data/bundler/lib/bundler/endpoint_specification.rb +1 -1
  26. data/bundler/lib/bundler/env.rb +10 -8
  27. data/bundler/lib/bundler/fetcher.rb +3 -3
  28. data/bundler/lib/bundler/fetcher/downloader.rb +10 -5
  29. data/bundler/lib/bundler/fetcher/index.rb +2 -2
  30. data/bundler/lib/bundler/friendly_errors.rb +2 -0
  31. data/bundler/lib/bundler/gem_helper.rb +1 -1
  32. data/bundler/lib/bundler/gem_version_promoter.rb +12 -0
  33. data/bundler/lib/bundler/injector.rb +5 -5
  34. data/bundler/lib/bundler/installer.rb +12 -4
  35. data/bundler/lib/bundler/installer/gem_installer.rb +9 -2
  36. data/bundler/lib/bundler/installer/parallel_installer.rb +1 -1
  37. data/bundler/lib/bundler/lazy_specification.rb +1 -1
  38. data/bundler/lib/bundler/mirror.rb +2 -2
  39. data/bundler/lib/bundler/plugin.rb +2 -2
  40. data/bundler/lib/bundler/plugin/index.rb +7 -2
  41. data/bundler/lib/bundler/process_lock.rb +1 -1
  42. data/bundler/lib/bundler/resolver.rb +10 -9
  43. data/bundler/lib/bundler/resolver/spec_group.rb +0 -5
  44. data/bundler/lib/bundler/ruby_version.rb +1 -1
  45. data/bundler/lib/bundler/rubygems_integration.rb +9 -3
  46. data/bundler/lib/bundler/runtime.rb +2 -2
  47. data/bundler/lib/bundler/shared_helpers.rb +15 -3
  48. data/bundler/lib/bundler/source/git.rb +2 -1
  49. data/bundler/lib/bundler/source/git/git_proxy.rb +6 -1
  50. data/bundler/lib/bundler/source/metadata.rb +1 -1
  51. data/bundler/lib/bundler/source/rubygems.rb +11 -2
  52. data/bundler/lib/bundler/source/rubygems/remote.rb +4 -1
  53. data/bundler/lib/bundler/spec_set.rb +4 -1
  54. data/bundler/lib/bundler/templates/Executable +1 -1
  55. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +8 -2
  56. data/bundler/lib/bundler/templates/newgem/travis.yml.tt +2 -0
  57. data/bundler/lib/bundler/ui/shell.rb +3 -1
  58. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +11 -1
  59. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +7 -2
  60. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  61. data/bundler/lib/bundler/version.rb +1 -1
  62. data/bundler/man/bundle-binstubs.ronn +3 -3
  63. data/bundler/man/bundle-check.ronn +3 -3
  64. data/bundler/man/bundle-config.ronn +13 -9
  65. data/bundler/man/bundle-doctor.ronn +33 -0
  66. data/bundler/man/bundle-exec.ronn +3 -3
  67. data/bundler/man/bundle-gem.ronn +1 -1
  68. data/bundler/man/bundle-init.ronn +15 -4
  69. data/bundler/man/bundle-inject.ronn +3 -3
  70. data/bundler/man/bundle-install.ronn +12 -3
  71. data/bundler/man/bundle-lock.ronn +1 -1
  72. data/bundler/man/bundle-outdated.ronn +1 -1
  73. data/bundler/man/bundle-package.ronn +3 -3
  74. data/bundler/man/bundle-show.ronn +3 -2
  75. data/bundler/man/bundle-update.ronn +18 -14
  76. data/bundler/man/bundle-viz.ronn +1 -1
  77. data/bundler/man/bundle.ronn +27 -27
  78. data/bundler/man/gemfile.5.ronn +24 -9
  79. data/lib/rubygems.rb +24 -11
  80. data/lib/rubygems/bundler_version_finder.rb +9 -22
  81. data/lib/rubygems/command_manager.rb +6 -4
  82. data/lib/rubygems/commands/install_command.rb +7 -0
  83. data/lib/rubygems/commands/owner_command.rb +4 -1
  84. data/lib/rubygems/commands/push_command.rb +37 -4
  85. data/lib/rubygems/commands/setup_command.rb +3 -3
  86. data/lib/rubygems/commands/uninstall_command.rb +1 -1
  87. data/lib/rubygems/commands/unpack_command.rb +1 -1
  88. data/lib/rubygems/core_ext/kernel_require.rb +2 -7
  89. data/lib/rubygems/dependency.rb +1 -0
  90. data/lib/rubygems/dependency_installer.rb +4 -2
  91. data/lib/rubygems/exceptions.rb +5 -1
  92. data/lib/rubygems/gemcutter_utilities.rb +5 -2
  93. data/lib/rubygems/indexer.rb +1 -1
  94. data/lib/rubygems/install_update_options.rb +1 -1
  95. data/lib/rubygems/installer.rb +29 -6
  96. data/lib/rubygems/package.rb +20 -2
  97. data/lib/rubygems/package/tar_header.rb +3 -1
  98. data/lib/rubygems/package/tar_writer.rb +2 -3
  99. data/lib/rubygems/remote_fetcher.rb +1 -1
  100. data/lib/rubygems/request_set.rb +28 -17
  101. data/lib/rubygems/requirement.rb +14 -3
  102. data/lib/rubygems/resolver/api_specification.rb +5 -0
  103. data/lib/rubygems/security.rb +6 -1
  104. data/lib/rubygems/server.rb +3 -3
  105. data/lib/rubygems/source.rb +1 -1
  106. data/lib/rubygems/specification.rb +7 -10
  107. data/lib/rubygems/ssl_certs/{index.rubygems.org → rubygems.org}/GlobalSignRootCA.pem +0 -0
  108. data/lib/rubygems/ssl_certs/rubygems.org/GlobalSignRootCA_R3.pem +21 -0
  109. data/lib/rubygems/test_case.rb +22 -4
  110. data/lib/rubygems/test_utilities.rb +1 -1
  111. data/lib/rubygems/user_interaction.rb +9 -2
  112. data/lib/rubygems/util/licenses.rb +35 -4
  113. data/lib/rubygems/version.rb +7 -1
  114. data/lib/ubygems.rb +3 -0
  115. data/test/rubygems/test_bundled_ca.rb +7 -4
  116. data/test/rubygems/test_gem.rb +45 -10
  117. data/test/rubygems/test_gem_bundler_version_finder.rb +8 -7
  118. data/test/rubygems/test_gem_command_manager.rb +2 -2
  119. data/test/rubygems/test_gem_commands_build_command.rb +2 -0
  120. data/test/rubygems/test_gem_commands_install_command.rb +37 -0
  121. data/test/rubygems/test_gem_commands_push_command.rb +20 -0
  122. data/test/rubygems/test_gem_commands_setup_command.rb +6 -1
  123. data/test/rubygems/test_gem_commands_signin_command.rb +1 -1
  124. data/test/rubygems/test_gem_commands_uninstall_command.rb +1 -1
  125. data/test/rubygems/test_gem_dependency.rb +1 -1
  126. data/test/rubygems/test_gem_ext_rake_builder.rb +0 -4
  127. data/test/rubygems/test_gem_install_update_options.rb +2 -0
  128. data/test/rubygems/test_gem_installer.rb +109 -3
  129. data/test/rubygems/test_gem_package.rb +90 -5
  130. data/test/rubygems/test_gem_package_tar_header.rb +2 -1
  131. data/test/rubygems/test_gem_remote_fetcher.rb +6 -2
  132. data/test/rubygems/test_gem_request.rb +5 -2
  133. data/test/rubygems/test_gem_requirement.rb +6 -0
  134. data/test/rubygems/test_gem_resolver_api_specification.rb +24 -0
  135. data/test/rubygems/test_gem_resolver_installer_set.rb +1 -1
  136. data/test/rubygems/test_gem_security_policy.rb +3 -3
  137. data/test/rubygems/test_gem_server.rb +12 -12
  138. data/test/rubygems/test_gem_specification.rb +27 -13
  139. data/test/rubygems/test_gem_stream_ui.rb +2 -2
  140. data/test/rubygems/test_gem_text.rb +5 -0
  141. data/test/rubygems/test_gem_util.rb +4 -2
  142. data/test/rubygems/test_gem_version.rb +29 -2
  143. data/util/ci +1 -0
  144. data/util/generate_spdx_license_list.rb +15 -6
  145. data/util/update_bundled_ca_certificates.rb +1 -3
  146. metadata +12 -12
  147. data/lib/rubygems/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem +0 -23
  148. data/lib/rubygems/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem +0 -25
@@ -96,11 +96,11 @@ module Bundler
96
96
 
97
97
  uri = URI.parse("#{remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}.rz")
98
98
  if uri.scheme == "file"
99
- Bundler.load_marshal Gem.inflate(Gem.read_binary(uri.path))
99
+ Bundler.load_marshal Bundler.rubygems.inflate(Gem.read_binary(uri.path))
100
100
  elsif cached_spec_path = gemspec_cached_path(spec_file_name)
101
101
  Bundler.load_gemspec(cached_spec_path)
102
102
  else
103
- Bundler.load_marshal Gem.inflate(downloader.fetch(uri).body)
103
+ Bundler.load_marshal Bundler.rubygems.inflate(downloader.fetch(uri).body)
104
104
  end
105
105
  rescue MarshalError
106
106
  raise HTTPError, "Gemspec #{spec} contained invalid data.\n" \
@@ -178,7 +178,7 @@ module Bundler
178
178
  # engine_version raises on unknown engines
179
179
  engine_version = begin
180
180
  ruby.engine_versions
181
- rescue
181
+ rescue RuntimeError
182
182
  "???"
183
183
  end
184
184
  agent << " #{ruby.engine}/#{ruby.versions_string(engine_version)}"
@@ -11,10 +11,10 @@ module Bundler
11
11
  @redirect_limit = redirect_limit
12
12
  end
13
13
 
14
- def fetch(uri, options = {}, counter = 0)
14
+ def fetch(uri, headers = {}, counter = 0)
15
15
  raise HTTPError, "Too many redirects" if counter >= redirect_limit
16
16
 
17
- response = request(uri, options)
17
+ response = request(uri, headers)
18
18
  Bundler.ui.debug("HTTP #{response.code} #{response.message} #{uri}")
19
19
 
20
20
  case response
@@ -26,7 +26,12 @@ module Bundler
26
26
  new_uri.user = uri.user
27
27
  new_uri.password = uri.password
28
28
  end
29
- fetch(new_uri, options, counter + 1)
29
+ fetch(new_uri, headers, counter + 1)
30
+ when Net::HTTPRequestedRangeNotSatisfiable
31
+ new_headers = headers.dup
32
+ new_headers.delete("Range")
33
+ new_headers["Accept-Encoding"] = "gzip"
34
+ fetch(uri, new_headers)
30
35
  when Net::HTTPRequestEntityTooLarge
31
36
  raise FallbackError, response.body
32
37
  when Net::HTTPUnauthorized
@@ -38,11 +43,11 @@ module Bundler
38
43
  end
39
44
  end
40
45
 
41
- def request(uri, options)
46
+ def request(uri, headers)
42
47
  validate_uri_scheme!(uri)
43
48
 
44
49
  Bundler.ui.debug "HTTP GET #{uri}"
45
- req = Net::HTTP::Get.new uri.request_uri, options
50
+ req = Net::HTTP::Get.new uri.request_uri, headers
46
51
  if uri.user
47
52
  user = CGI.unescape(uri.user)
48
53
  password = uri.password ? CGI.unescape(uri.password) : nil
@@ -29,11 +29,11 @@ module Bundler
29
29
 
30
30
  uri = URI.parse("#{remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}.rz")
31
31
  if uri.scheme == "file"
32
- Bundler.load_marshal Gem.inflate(Gem.read_binary(uri.path))
32
+ Bundler.load_marshal Bundler.rubygems.inflate(Gem.read_binary(uri.path))
33
33
  elsif cached_spec_path = gemspec_cached_path(spec_file_name)
34
34
  Bundler.load_gemspec(cached_spec_path)
35
35
  else
36
- Bundler.load_marshal Gem.inflate(downloader.fetch(uri).body)
36
+ Bundler.load_marshal Bundler.rubygems.inflate(downloader.fetch(uri).body)
37
37
  end
38
38
  rescue MarshalError
39
39
  raise HTTPError, "Gemspec #{spec} contained invalid data.\n" \
@@ -45,6 +45,8 @@ module Bundler
45
45
  "Alternatively, you can increase the amount of memory the JVM is able to use by running Bundler with jruby -J-Xmx1024m -S bundle (JRuby defaults to 500MB)."
46
46
  else request_issue_report_for(error)
47
47
  end
48
+ rescue
49
+ raise error
48
50
  end
49
51
 
50
52
  def exit_status(error)
@@ -153,7 +153,7 @@ module Bundler
153
153
  sh "git tag -m \"Version #{version}\" #{version_tag}"
154
154
  Bundler.ui.confirm "Tagged #{version_tag}."
155
155
  yield if block_given?
156
- rescue
156
+ rescue RuntimeError
157
157
  Bundler.ui.error "Untagging #{version_tag} due to error."
158
158
  sh_with_code "git tag -d #{version_tag}"
159
159
  raise
@@ -22,6 +22,8 @@ module Bundler
22
22
  # existing in the referenced source.
23
23
  attr_accessor :strict
24
24
 
25
+ attr_accessor :prerelease_specified
26
+
25
27
  # Given a list of locked_specs and a list of gems to unlock creates a
26
28
  # GemVersionPromoter instance.
27
29
  #
@@ -37,6 +39,7 @@ module Bundler
37
39
  @locked_specs = locked_specs
38
40
  @unlock_gems = unlock_gems
39
41
  @sort_versions = {}
42
+ @prerelease_specified = {}
40
43
  end
41
44
 
42
45
  # @param value [Symbol] One of three Symbols: :major, :minor or :patch.
@@ -121,6 +124,15 @@ module Bundler
121
124
  result = spec_groups.sort do |a, b|
122
125
  @a_ver = a.version
123
126
  @b_ver = b.version
127
+
128
+ unless @prerelease_specified[@gem_name]
129
+ a_pre = @a_ver.prerelease?
130
+ b_pre = @b_ver.prerelease?
131
+
132
+ next -1 if a_pre && !b_pre
133
+ next 1 if b_pre && !a_pre
134
+ end
135
+
124
136
  if major?
125
137
  @a_ver <=> @b_ver
126
138
  elsif either_version_older_than_locked
@@ -12,8 +12,11 @@ module Bundler
12
12
  @options = options
13
13
  end
14
14
 
15
+ # @param [Pathname] gemfile_path The Gemfile in which to inject the new dependency.
16
+ # @param [Pathname] lockfile_path The lockfile in which to inject the new dependency.
17
+ # @return [Array]
15
18
  def inject(gemfile_path, lockfile_path)
16
- if Bundler.frozen?
19
+ if Bundler.frozen_bundle?
17
20
  # ensure the lock and Gemfile are synced
18
21
  Bundler.definition.ensure_equivalent_gemfile_and_lockfile(true)
19
22
  end
@@ -72,7 +75,7 @@ module Bundler
72
75
  end
73
76
 
74
77
  if d.groups != Array(:default)
75
- group = d.groups.size == 1 ? ", :group => #{d.groups.inspect}" : ", :groups => #{d.groups.inspect}"
78
+ group = d.groups.size == 1 ? ", :group => #{d.groups.first.inspect}" : ", :groups => #{d.groups.inspect}"
76
79
  end
77
80
 
78
81
  source = ", :source => \"#{d.source}\"" unless d.source.nil?
@@ -84,9 +87,6 @@ module Bundler
84
87
  def append_to(gemfile_path, new_gem_lines)
85
88
  gemfile_path.open("a") do |f|
86
89
  f.puts
87
- if @options["timestamp"] || @options["timestamp"].nil?
88
- f.puts "# Added at #{Time.now} by #{`whoami`.chomp}:"
89
- end
90
90
  f.puts new_gem_lines
91
91
  end
92
92
  end
@@ -70,7 +70,7 @@ module Bundler
70
70
  create_bundle_path
71
71
 
72
72
  ProcessLock.lock do
73
- if Bundler.frozen?
73
+ if Bundler.frozen_bundle?
74
74
  @definition.ensure_equivalent_gemfile_and_lockfile(options[:deployment])
75
75
  end
76
76
 
@@ -90,7 +90,7 @@ module Bundler
90
90
  end
91
91
  install(options)
92
92
 
93
- lock unless Bundler.frozen?
93
+ lock unless Bundler.frozen_bundle?
94
94
  Standalone.new(options[:standalone], @definition).generate if options[:standalone]
95
95
  end
96
96
  end
@@ -135,7 +135,11 @@ module Bundler
135
135
  end
136
136
 
137
137
  File.open(binstub_path, "w", 0o777 & ~File.umask) do |f|
138
- f.puts ERB.new(template, nil, "-").result(binding)
138
+ if RUBY_VERSION >= "2.6"
139
+ f.puts ERB.new(template, :trim_mode => "-").result(binding)
140
+ else
141
+ f.puts ERB.new(template, nil, "-").result(binding)
142
+ end
139
143
  end
140
144
  end
141
145
 
@@ -171,7 +175,11 @@ module Bundler
171
175
  executable_path = Pathname(spec.full_gem_path).join(spec.bindir, executable).relative_path_from(bin_path)
172
176
  executable_path = executable_path
173
177
  File.open "#{bin_path}/#{executable}", "w", 0o755 do |f|
174
- f.puts ERB.new(template, nil, "-").result(binding)
178
+ if RUBY_VERSION >= "2.6"
179
+ f.puts ERB.new(template, :trim_mode => "-").result(binding)
180
+ else
181
+ f.puts ERB.new(template, nil, "-").result(binding)
182
+ end
175
183
  end
176
184
  end
177
185
  end
@@ -21,7 +21,7 @@ module Bundler
21
21
  raise
22
22
  rescue Errno::ENOSPC
23
23
  return false, out_of_space_message
24
- rescue => e
24
+ rescue StandardError => e
25
25
  return false, specific_failure_message(e)
26
26
  end
27
27
 
@@ -44,7 +44,14 @@ module Bundler
44
44
  end
45
45
 
46
46
  def gem_install_message
47
- "Make sure that `gem install #{spec.name} -v '#{spec.version}'` succeeds before bundling."
47
+ source = spec.source
48
+ return unless source.respond_to?(:remotes)
49
+
50
+ if source.remotes.size == 1
51
+ "Make sure that `gem install #{spec.name} -v '#{spec.version}' --source '#{source.remotes.first}'` succeeds before bundling."
52
+ else
53
+ "Make sure that `gem install #{spec.name} -v '#{spec.version}'` succeeds before bundling."
54
+ end
48
55
  end
49
56
 
50
57
  def spec_settings
@@ -160,7 +160,7 @@ module Bundler
160
160
  )
161
161
  success, message = begin
162
162
  gem_installer.install_from_spec
163
- rescue => e
163
+ rescue RuntimeError => e
164
164
  raise e, "#{e}\n\n#{require_tree_for_spec(spec_install.spec)}"
165
165
  end
166
166
  if success
@@ -80,7 +80,7 @@ module Bundler
80
80
  "To use the platform-specific version of the gem, run `bundle config specific_platform true` and install again."
81
81
  search = source.specs.search(self).last
82
82
  end
83
- search.dependencies = dependencies if search.is_a?(RemoteSpecification) || search.is_a?(EndpointSpecification)
83
+ search.dependencies = dependencies if search && (search.is_a?(RemoteSpecification) || search.is_a?(EndpointSpecification))
84
84
  search
85
85
  end
86
86
  end
@@ -152,7 +152,7 @@ module Bundler
152
152
  socket.connect_nonblock(address)
153
153
  rescue Errno::EINPROGRESS
154
154
  wait_for_writtable_socket(socket, address, timeout)
155
- rescue # Connection failed somehow, again
155
+ rescue RuntimeError # Connection failed somehow, again
156
156
  false
157
157
  end
158
158
  end
@@ -172,7 +172,7 @@ module Bundler
172
172
  socket.connect_nonblock(address)
173
173
  rescue Errno::EISCONN
174
174
  true
175
- rescue # Connection failed
175
+ rescue StandardError # Connection failed
176
176
  false
177
177
  end
178
178
  end
@@ -66,7 +66,7 @@ module Bundler
66
66
  installed_specs = Installer.new.install_definition(definition)
67
67
 
68
68
  save_plugins plugins, installed_specs, builder.inferred_plugins
69
- rescue => e
69
+ rescue RuntimeError => e
70
70
  unless e.is_a?(GemfileError)
71
71
  Bundler.ui.error "Failed to install plugin: #{e.message}\n #{e.backtrace[0]}"
72
72
  end
@@ -264,7 +264,7 @@ module Bundler
264
264
  load path.join(PLUGIN_FILE_NAME)
265
265
 
266
266
  @loaded_plugin_names << name
267
- rescue => e
267
+ rescue RuntimeError => e
268
268
  Bundler.ui.error "Failed loading plugin #{name}: #{e.message}"
269
269
  raise
270
270
  end
@@ -29,7 +29,12 @@ module Bundler
29
29
  @hooks = {}
30
30
  @load_paths = {}
31
31
 
32
- load_index(global_index_file, true)
32
+ begin
33
+ load_index(global_index_file, true)
34
+ rescue GenericSystemCallError
35
+ # no need to fail when on a read-only FS, for example
36
+ nil
37
+ end
33
38
  load_index(local_index_file) if SharedHelpers.in_bundle?
34
39
  end
35
40
 
@@ -58,7 +63,7 @@ module Bundler
58
63
  @plugin_paths[name] = path
59
64
  @load_paths[name] = load_paths
60
65
  save_index
61
- rescue
66
+ rescue StandardError
62
67
  @commands = old_commands
63
68
  raise
64
69
  end
@@ -12,7 +12,7 @@ module Bundler
12
12
  yield
13
13
  f.flock(File::LOCK_UN)
14
14
  end
15
- rescue Errno::EACCES, Errno::ENOLCK
15
+ rescue Errno::EACCES, Errno::ENOLCK, *[SharedHelpers.const_get_safely(:ENOTSUP, Errno)].compact
16
16
  # In the case the user does not have access to
17
17
  # create the lock file or is using NFS where
18
18
  # locks are not available we skip locking.
@@ -39,10 +39,11 @@ module Bundler
39
39
  @gem_version_promoter = gem_version_promoter
40
40
  @allow_bundler_dependency_conflicts = Bundler.feature_flag.allow_bundler_dependency_conflicts?
41
41
  @lockfile_uses_separate_rubygems_sources = Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
42
+ @use_gvp = !@gem_version_promoter.major?
42
43
  end
43
44
 
44
45
  def start(requirements)
45
- @prerelease_specified = {}
46
+ @gem_version_promoter.prerelease_specified = @prerelease_specified = {}
46
47
  requirements.each {|dep| @prerelease_specified[dep.name] ||= dep.prerelease? }
47
48
 
48
49
  verify_gemfile_dependencies_are_found!(requirements)
@@ -104,16 +105,17 @@ module Bundler
104
105
  index = index_for(dependency)
105
106
  results = index.search(dependency, @base[dependency.name])
106
107
 
107
- unless @prerelease_specified[dependency.name]
108
+ if vertex = @base_dg.vertex_named(dependency.name)
109
+ locked_requirement = vertex.payload.requirement
110
+ end
111
+
112
+ if !@prerelease_specified[dependency.name] && (!@use_gvp || locked_requirement.nil?)
108
113
  # Move prereleases to the beginning of the list, so they're considered
109
114
  # last during resolution.
110
115
  pre, results = results.partition {|spec| spec.version.prerelease? }
111
116
  results = pre + results
112
117
  end
113
118
 
114
- if vertex = @base_dg.vertex_named(dependency.name)
115
- locked_requirement = vertex.payload.requirement
116
- end
117
119
  spec_groups = if results.any?
118
120
  nested = []
119
121
  results.each do |spec|
@@ -179,10 +181,6 @@ module Bundler
179
181
 
180
182
  def requirement_satisfied_by?(requirement, activated, spec)
181
183
  return false unless requirement.matches_spec?(spec) || spec.source.is_a?(Source::Gemspec)
182
- if spec.version.prerelease? && !requirement.prerelease? && search_for(requirement).any? {|sg| !sg.version.prerelease? }
183
- vertex = activated.vertex_named(spec.name)
184
- return false if vertex.requirements.none?(&:prerelease?)
185
- end
186
184
  spec.activate_platform!(requirement.__platform) if !@platforms || @platforms.include?(requirement.__platform)
187
185
  true
188
186
  end
@@ -306,6 +304,9 @@ module Bundler
306
304
  :solver_name => "Bundler",
307
305
  :possibility_type => "gem",
308
306
  :reduce_trees => lambda do |trees|
307
+ # called first, because we want to reduce the amount of work required to find maximal empty sets
308
+ trees = trees.uniq {|t| t.flatten.map {|dep| [dep.name, dep.requirement] } }
309
+
309
310
  # bail out if tree size is too big for Array#combination to make any sense
310
311
  return trees if trees.size > 15
311
312
  maximal = 1.upto(trees.size).map do |size|
@@ -14,7 +14,6 @@ module Bundler
14
14
  @version = exemplary_spec.version
15
15
  @source = exemplary_spec.source
16
16
 
17
- @required_by = []
18
17
  @activated_platforms = []
19
18
  @dependencies = nil
20
19
  @specs = Hash.new do |specs, platform|
@@ -55,10 +54,6 @@ module Bundler
55
54
  dependencies.concat(metadata_dependencies).flatten
56
55
  end
57
56
 
58
- def platforms_for_dependency_named(dependency)
59
- __dependencies.select {|_, deps| deps.map(&:name).include? dependency }.keys
60
- end
61
-
62
57
  def ==(other)
63
58
  return unless other.is_a?(SpecGroup)
64
59
  name == other.name &&
@@ -118,7 +118,7 @@ module Bundler
118
118
  when "jruby"
119
119
  JRUBY_VERSION.dup
120
120
  else
121
- raise BundlerError, "RUBY_ENGINE value #{RUBY_ENGINE} is not recognized"
121
+ RUBY_ENGINE_VERSION.dup
122
122
  end
123
123
  patchlevel = RUBY_PATCHLEVEL.to_s
124
124
 
@@ -132,7 +132,11 @@ module Bundler
132
132
  end
133
133
 
134
134
  def inflate(obj)
135
- Gem.inflate(obj)
135
+ if defined?(Gem::Util)
136
+ Gem::Util.inflate(obj)
137
+ else
138
+ Gem.inflate(obj)
139
+ end
136
140
  end
137
141
 
138
142
  def sources=(val)
@@ -570,8 +574,10 @@ module Bundler
570
574
  @replaced_methods.each do |(sym, klass), method|
571
575
  redefine_method(klass, sym, method)
572
576
  end
573
- post_reset_hooks.reject! do |proc|
574
- proc.binding.eval("__FILE__") == __FILE__
577
+ if Binding.public_method_defined?(:source_location)
578
+ post_reset_hooks.reject! {|proc| proc.binding.source_location[0] == __FILE__ }
579
+ else
580
+ post_reset_hooks.reject! {|proc| proc.binding.eval("__FILE__") == __FILE__ }
575
581
  end
576
582
  @replaced_methods.clear
577
583
  end
@@ -10,7 +10,7 @@ module Bundler
10
10
  end
11
11
 
12
12
  def setup(*groups)
13
- @definition.ensure_equivalent_gemfile_and_lockfile if Bundler.frozen?
13
+ @definition.ensure_equivalent_gemfile_and_lockfile if Bundler.frozen_bundle?
14
14
 
15
15
  groups.map!(&:to_sym)
16
16
 
@@ -79,7 +79,7 @@ module Bundler
79
79
  required_file = file
80
80
  begin
81
81
  Kernel.require file
82
- rescue => e
82
+ rescue RuntimeError => e
83
83
  raise e if e.is_a?(LoadError) # we handle this a little later
84
84
  raise Bundler::GemRequireError.new e,
85
85
  "There was an error while trying to load the gem '#{file}'."