rubygems-update 3.2.14 → 3.2.19

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 (190) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +54 -8
  3. data/CONTRIBUTING.md +2 -2
  4. data/Manifest.txt +3 -0
  5. data/Rakefile +8 -14
  6. data/bundler/CHANGELOG.md +81 -5
  7. data/bundler/bundler.gemspec +2 -3
  8. data/bundler/lib/bundler.rb +1 -0
  9. data/bundler/lib/bundler/build_metadata.rb +2 -2
  10. data/bundler/lib/bundler/cli.rb +16 -35
  11. data/bundler/lib/bundler/cli/common.rb +15 -2
  12. data/bundler/lib/bundler/cli/gem.rb +9 -1
  13. data/bundler/lib/bundler/cli/outdated.rb +8 -11
  14. data/bundler/lib/bundler/compact_index_client/updater.rb +9 -5
  15. data/bundler/lib/bundler/current_ruby.rb +1 -0
  16. data/bundler/lib/bundler/definition.rb +21 -84
  17. data/bundler/lib/bundler/feature_flag.rb +0 -2
  18. data/bundler/lib/bundler/fetcher.rb +2 -1
  19. data/bundler/lib/bundler/fetcher/downloader.rb +8 -4
  20. data/bundler/lib/bundler/friendly_errors.rb +1 -1
  21. data/bundler/lib/bundler/gem_helper.rb +16 -0
  22. data/bundler/lib/bundler/index.rb +1 -2
  23. data/bundler/lib/bundler/injector.rb +2 -2
  24. data/bundler/lib/bundler/inline.rb +1 -1
  25. data/bundler/lib/bundler/installer/parallel_installer.rb +30 -7
  26. data/bundler/lib/bundler/lazy_specification.rb +6 -1
  27. data/bundler/lib/bundler/man/bundle-add.1 +1 -1
  28. data/bundler/lib/bundler/man/bundle-binstubs.1 +1 -1
  29. data/bundler/lib/bundler/man/bundle-cache.1 +1 -1
  30. data/bundler/lib/bundler/man/bundle-check.1 +1 -1
  31. data/bundler/lib/bundler/man/bundle-clean.1 +1 -1
  32. data/bundler/lib/bundler/man/bundle-config.1 +21 -10
  33. data/bundler/lib/bundler/man/bundle-config.1.ronn +21 -11
  34. data/bundler/lib/bundler/man/bundle-doctor.1 +1 -1
  35. data/bundler/lib/bundler/man/bundle-exec.1 +1 -1
  36. data/bundler/lib/bundler/man/bundle-gem.1 +1 -1
  37. data/bundler/lib/bundler/man/bundle-info.1 +1 -1
  38. data/bundler/lib/bundler/man/bundle-init.1 +1 -1
  39. data/bundler/lib/bundler/man/bundle-inject.1 +1 -1
  40. data/bundler/lib/bundler/man/bundle-install.1 +1 -1
  41. data/bundler/lib/bundler/man/bundle-list.1 +1 -1
  42. data/bundler/lib/bundler/man/bundle-lock.1 +1 -1
  43. data/bundler/lib/bundler/man/bundle-open.1 +1 -1
  44. data/bundler/lib/bundler/man/bundle-outdated.1 +1 -1
  45. data/bundler/lib/bundler/man/bundle-platform.1 +1 -1
  46. data/bundler/lib/bundler/man/bundle-pristine.1 +1 -1
  47. data/bundler/lib/bundler/man/bundle-remove.1 +1 -1
  48. data/bundler/lib/bundler/man/bundle-show.1 +1 -1
  49. data/bundler/lib/bundler/man/bundle-update.1 +1 -1
  50. data/bundler/lib/bundler/man/bundle-viz.1 +1 -1
  51. data/bundler/lib/bundler/man/bundle.1 +1 -1
  52. data/bundler/lib/bundler/man/gemfile.5 +1 -1
  53. data/bundler/lib/bundler/plugin.rb +2 -2
  54. data/bundler/lib/bundler/plugin/api/source.rb +14 -0
  55. data/bundler/lib/bundler/resolver.rb +13 -96
  56. data/bundler/lib/bundler/resolver/spec_group.rb +0 -24
  57. data/bundler/lib/bundler/retry.rb +1 -1
  58. data/bundler/lib/bundler/rubygems_ext.rb +2 -2
  59. data/bundler/lib/bundler/settings.rb +74 -12
  60. data/bundler/lib/bundler/source.rb +9 -0
  61. data/bundler/lib/bundler/source/path.rb +3 -1
  62. data/bundler/lib/bundler/source/path/installer.rb +1 -1
  63. data/bundler/lib/bundler/source/rubygems.rb +17 -10
  64. data/bundler/lib/bundler/source/rubygems_aggregate.rb +64 -0
  65. data/bundler/lib/bundler/source_list.rb +29 -10
  66. data/bundler/lib/bundler/source_map.rb +58 -0
  67. data/bundler/lib/bundler/spec_set.rb +18 -7
  68. data/bundler/lib/bundler/templates/Gemfile +1 -1
  69. data/bundler/lib/bundler/templates/gems.rb +1 -1
  70. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +2 -4
  71. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +1 -1
  72. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +1 -1
  73. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +1 -1
  74. data/bundler/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +1 -1
  75. data/bundler/lib/bundler/version.rb +1 -1
  76. data/lib/rubygems.rb +4 -4
  77. data/lib/rubygems/command.rb +2 -0
  78. data/lib/rubygems/commands/build_command.rb +1 -1
  79. data/lib/rubygems/commands/install_command.rb +1 -1
  80. data/lib/rubygems/commands/open_command.rb +1 -1
  81. data/lib/rubygems/commands/update_command.rb +21 -3
  82. data/lib/rubygems/commands/yank_command.rb +1 -1
  83. data/lib/rubygems/defaults.rb +1 -1
  84. data/lib/rubygems/deprecate.rb +3 -1
  85. data/lib/rubygems/ext/ext_conf_builder.rb +4 -4
  86. data/lib/rubygems/indexer.rb +1 -1
  87. data/lib/rubygems/installer.rb +5 -2
  88. data/lib/rubygems/package.rb +1 -8
  89. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb +1 -1
  90. data/lib/rubygems/security/trust_dir.rb +1 -0
  91. data/lib/rubygems/specification.rb +0 -2
  92. data/lib/rubygems/test_case.rb +102 -18
  93. data/lib/rubygems/test_utilities.rb +1 -1
  94. data/rubygems-update.gemspec +1 -1
  95. data/test/rubygems/packages/ascii_binder-0.1.10.1.gem +0 -0
  96. data/test/rubygems/test_bundled_ca.rb +2 -2
  97. data/test/rubygems/test_deprecate.rb +49 -5
  98. data/test/rubygems/test_gem.rb +33 -31
  99. data/test/rubygems/test_gem_bundler_version_finder.rb +2 -2
  100. data/test/rubygems/test_gem_command.rb +13 -1
  101. data/test/rubygems/test_gem_command_manager.rb +5 -5
  102. data/test/rubygems/test_gem_commands_build_command.rb +10 -10
  103. data/test/rubygems/test_gem_commands_cert_command.rb +36 -36
  104. data/test/rubygems/test_gem_commands_check_command.rb +5 -5
  105. data/test/rubygems/test_gem_commands_cleanup_command.rb +24 -24
  106. data/test/rubygems/test_gem_commands_contents_command.rb +3 -3
  107. data/test/rubygems/test_gem_commands_dependency_command.rb +2 -2
  108. data/test/rubygems/test_gem_commands_environment_command.rb +1 -1
  109. data/test/rubygems/test_gem_commands_fetch_command.rb +9 -9
  110. data/test/rubygems/test_gem_commands_help_command.rb +8 -1
  111. data/test/rubygems/test_gem_commands_install_command.rb +60 -60
  112. data/test/rubygems/test_gem_commands_list_command.rb +1 -1
  113. data/test/rubygems/test_gem_commands_lock_command.rb +1 -1
  114. data/test/rubygems/test_gem_commands_open_command.rb +8 -9
  115. data/test/rubygems/test_gem_commands_owner_command.rb +3 -3
  116. data/test/rubygems/test_gem_commands_pristine_command.rb +14 -14
  117. data/test/rubygems/test_gem_commands_push_command.rb +6 -6
  118. data/test/rubygems/test_gem_commands_query_command.rb +7 -7
  119. data/test/rubygems/test_gem_commands_server_command.rb +2 -2
  120. data/test/rubygems/test_gem_commands_setup_command.rb +21 -21
  121. data/test/rubygems/test_gem_commands_signin_command.rb +6 -6
  122. data/test/rubygems/test_gem_commands_sources_command.rb +5 -5
  123. data/test/rubygems/test_gem_commands_specification_command.rb +6 -6
  124. data/test/rubygems/test_gem_commands_uninstall_command.rb +4 -4
  125. data/test/rubygems/test_gem_commands_unpack_command.rb +2 -2
  126. data/test/rubygems/test_gem_commands_update_command.rb +38 -11
  127. data/test/rubygems/test_gem_commands_which_command.rb +3 -3
  128. data/test/rubygems/test_gem_commands_yank_command.rb +1 -1
  129. data/test/rubygems/test_gem_config_file.rb +9 -9
  130. data/test/rubygems/test_gem_dependency.rb +6 -6
  131. data/test/rubygems/test_gem_dependency_installer.rb +4 -4
  132. data/test/rubygems/test_gem_doctor.rb +30 -30
  133. data/test/rubygems/test_gem_ext_builder.rb +20 -20
  134. data/test/rubygems/test_gem_ext_cmake_builder.rb +4 -4
  135. data/test/rubygems/test_gem_ext_configure_builder.rb +4 -4
  136. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +14 -13
  137. data/test/rubygems/test_gem_ext_rake_builder.rb +1 -1
  138. data/test/rubygems/test_gem_gemcutter_utilities.rb +8 -8
  139. data/test/rubygems/test_gem_install_update_options.rb +9 -9
  140. data/test/rubygems/test_gem_installer.rb +162 -140
  141. data/test/rubygems/test_gem_local_remote_options.rb +1 -1
  142. data/test/rubygems/test_gem_package.rb +49 -49
  143. data/test/rubygems/test_gem_package_old.rb +9 -9
  144. data/test/rubygems/test_gem_package_tar_header.rb +5 -5
  145. data/test/rubygems/test_gem_package_tar_reader_entry.rb +8 -8
  146. data/test/rubygems/test_gem_package_tar_writer.rb +18 -20
  147. data/test/rubygems/test_gem_package_task.rb +2 -2
  148. data/test/rubygems/test_gem_path_support.rb +1 -1
  149. data/test/rubygems/test_gem_rdoc.rb +9 -9
  150. data/test/rubygems/test_gem_remote_fetcher.rb +17 -24
  151. data/test/rubygems/test_gem_request.rb +2 -2
  152. data/test/rubygems/test_gem_request_connection_pools.rb +1 -1
  153. data/test/rubygems/test_gem_request_set.rb +15 -14
  154. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +16 -16
  155. data/test/rubygems/test_gem_request_set_lockfile.rb +3 -3
  156. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +3 -3
  157. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +4 -4
  158. data/test/rubygems/test_gem_requirement.rb +13 -13
  159. data/test/rubygems/test_gem_resolver.rb +11 -11
  160. data/test/rubygems/test_gem_resolver_best_set.rb +1 -1
  161. data/test/rubygems/test_gem_resolver_git_set.rb +1 -1
  162. data/test/rubygems/test_gem_resolver_git_specification.rb +2 -2
  163. data/test/rubygems/test_gem_resolver_index_specification.rb +1 -1
  164. data/test/rubygems/test_gem_resolver_installer_set.rb +4 -4
  165. data/test/rubygems/test_gem_resolver_local_specification.rb +1 -1
  166. data/test/rubygems/test_gem_resolver_specification.rb +1 -1
  167. data/test/rubygems/test_gem_resolver_vendor_set.rb +2 -2
  168. data/test/rubygems/test_gem_security.rb +5 -5
  169. data/test/rubygems/test_gem_security_policy.rb +27 -27
  170. data/test/rubygems/test_gem_security_signer.rb +7 -7
  171. data/test/rubygems/test_gem_security_trust_dir.rb +4 -4
  172. data/test/rubygems/test_gem_server.rb +2 -2
  173. data/test/rubygems/test_gem_silent_ui.rb +9 -9
  174. data/test/rubygems/test_gem_source.rb +2 -2
  175. data/test/rubygems/test_gem_source_fetch_problem.rb +1 -1
  176. data/test/rubygems/test_gem_source_git.rb +11 -11
  177. data/test/rubygems/test_gem_source_specific_file.rb +1 -1
  178. data/test/rubygems/test_gem_spec_fetcher.rb +1 -1
  179. data/test/rubygems/test_gem_specification.rb +83 -103
  180. data/test/rubygems/test_gem_stream_ui.rb +1 -1
  181. data/test/rubygems/test_gem_stub_specification.rb +4 -4
  182. data/test/rubygems/test_gem_uninstaller.rb +16 -16
  183. data/test/rubygems/test_gem_util.rb +8 -6
  184. data/test/rubygems/test_gem_version.rb +4 -13
  185. data/test/rubygems/test_kernel.rb +4 -4
  186. data/test/rubygems/test_project_sanity.rb +1 -1
  187. data/test/rubygems/test_remote_fetch_error.rb +1 -1
  188. data/test/rubygems/test_require.rb +13 -13
  189. data/test/test_changelog_generator.rb +1 -2
  190. metadata +6 -3
@@ -36,10 +36,15 @@ module Bundler
36
36
  def self.without_groups_message(command)
37
37
  command_in_past_tense = command == :install ? "installed" : "updated"
38
38
  groups = Bundler.settings[:without]
39
+ "Gems in the #{verbalize_groups(groups)} were not #{command_in_past_tense}."
40
+ end
41
+
42
+ def self.verbalize_groups(groups)
43
+ groups.map!{|g| "'#{g}'" }
39
44
  group_list = [groups[0...-1].join(", "), groups[-1..-1]].
40
45
  reject {|s| s.to_s.empty? }.join(" and ")
41
46
  group_str = groups.size == 1 ? "group" : "groups"
42
- "Gems in the #{group_str} #{group_list} were not #{command_in_past_tense}."
47
+ "#{group_str} #{group_list}"
43
48
  end
44
49
 
45
50
  def self.select_spec(name, regex_match = nil)
@@ -53,7 +58,13 @@ module Bundler
53
58
 
54
59
  case specs.count
55
60
  when 0
56
- raise GemNotFound, gem_not_found_message(name, Bundler.definition.dependencies)
61
+ dep_in_other_group = Bundler.definition.current_dependencies.find {|dep|dep.name == name }
62
+
63
+ if dep_in_other_group
64
+ raise GemNotFound, "Could not find gem '#{name}', because it's in the #{verbalize_groups(dep_in_other_group.groups)}, configured to be ignored."
65
+ else
66
+ raise GemNotFound, gem_not_found_message(name, Bundler.definition.dependencies)
67
+ end
57
68
  when 1
58
69
  specs.first
59
70
  else
@@ -83,6 +94,8 @@ module Bundler
83
94
  end
84
95
 
85
96
  def self.ensure_all_gems_in_lockfile!(names, locked_gems = Bundler.locked_gems)
97
+ return unless locked_gems
98
+
86
99
  locked_names = locked_gems.specs.map(&:name).uniq
87
100
  names.-(locked_names).each do |g|
88
101
  raise GemNotFound, gem_not_found_message(g, locked_names)
@@ -42,9 +42,17 @@ module Bundler
42
42
  use_git = Bundler.git_present? && options[:git]
43
43
 
44
44
  git_author_name = use_git ? `git config user.name`.chomp : ""
45
- github_username = use_git ? `git config github.user`.chomp : ""
45
+ git_username = use_git ? `git config github.user`.chomp : ""
46
46
  git_user_email = use_git ? `git config user.email`.chomp : ""
47
47
 
48
+ github_username = if options[:github_username].nil?
49
+ git_username
50
+ elsif options[:github_username] == false
51
+ ""
52
+ else
53
+ options[:github_username]
54
+ end
55
+
48
56
  config = {
49
57
  :name => name,
50
58
  :underscored_name => underscored_name,
@@ -72,7 +72,7 @@ module Bundler
72
72
  gemfile_specs + dependency_specs
73
73
  end
74
74
 
75
- specs.sort_by(&:name).each do |current_spec|
75
+ specs.sort_by(&:name).uniq(&:name).each do |current_spec|
76
76
  next unless gems.empty? || gems.include?(current_spec.name)
77
77
 
78
78
  active_spec = retrieve_active_spec(definition, current_spec)
@@ -146,17 +146,14 @@ module Bundler
146
146
  end
147
147
 
148
148
  def retrieve_active_spec(definition, current_spec)
149
- if strict
150
- active_spec = definition.find_resolved_spec(current_spec)
151
- else
152
- active_specs = definition.find_indexed_specs(current_spec)
153
- if !current_spec.version.prerelease? && !options[:pre] && active_specs.size > 1
154
- active_specs.delete_if {|b| b.respond_to?(:version) && b.version.prerelease? }
155
- end
156
- active_spec = active_specs.last
157
- end
149
+ active_spec = definition.resolve.find_by_name_and_platform(current_spec.name, current_spec.platform)
150
+ return active_spec if strict
158
151
 
159
- active_spec
152
+ active_specs = active_spec.source.specs.search(current_spec.name).select {|spec| spec.match_platform(current_spec.platform) }.sort_by(&:version)
153
+ if !current_spec.version.prerelease? && !options[:pre] && active_specs.size > 1
154
+ active_specs.delete_if {|b| b.respond_to?(:version) && b.version.prerelease? }
155
+ end
156
+ active_specs.last
160
157
  end
161
158
 
162
159
  def print_gems(gems_list)
@@ -50,16 +50,20 @@ module Bundler
50
50
 
51
51
  content = response.body
52
52
 
53
- SharedHelpers.filesystem_access(local_temp_path) do
53
+ etag = (response["ETag"] || "").gsub(%r{\AW/}, "")
54
+ correct_response = SharedHelpers.filesystem_access(local_temp_path) do
54
55
  if response.is_a?(Net::HTTPPartialContent) && local_temp_path.size.nonzero?
55
56
  local_temp_path.open("a") {|f| f << slice_body(content, 1..-1) }
57
+
58
+ etag_for(local_temp_path) == etag
56
59
  else
57
60
  local_temp_path.open("wb") {|f| f << content }
61
+
62
+ etag.length.zero? || etag_for(local_temp_path) == etag
58
63
  end
59
64
  end
60
65
 
61
- etag = (response["ETag"] || "").gsub(%r{\AW/}, "")
62
- if etag.length.zero? || etag_for(local_temp_path) == etag
66
+ if correct_response
63
67
  SharedHelpers.filesystem_access(local_path) do
64
68
  FileUtils.mv(local_temp_path, local_path)
65
69
  end
@@ -92,11 +96,11 @@ module Bundler
92
96
 
93
97
  def checksum_for_file(path)
94
98
  return nil unless path.file?
95
- # This must use IO.read instead of Digest.file().hexdigest
99
+ # This must use File.read instead of Digest.file().hexdigest
96
100
  # because we need to preserve \n line endings on windows when calculating
97
101
  # the checksum
98
102
  SharedHelpers.filesystem_access(path, :read) do
99
- SharedHelpers.digest(:MD5).hexdigest(IO.read(path))
103
+ SharedHelpers.digest(:MD5).hexdigest(File.read(path))
100
104
  end
101
105
  end
102
106
  end
@@ -20,6 +20,7 @@ module Bundler
20
20
  2.5
21
21
  2.6
22
22
  2.7
23
+ 3.0
23
24
  ].freeze
24
25
 
25
26
  KNOWN_MAJOR_VERSIONS = KNOWN_MINOR_VERSIONS.map {|v| v.split(".", 2).first }.uniq.freeze
@@ -161,16 +161,14 @@ module Bundler
161
161
  end
162
162
 
163
163
  def resolve_with_cache!
164
- raise "Specs already loaded" if @specs
165
164
  sources.cached!
166
- specs
165
+ resolve
167
166
  end
168
167
 
169
168
  def resolve_remotely!
170
- return if @specs
171
169
  @remote = true
172
170
  sources.remote!
173
- specs
171
+ resolve
174
172
  end
175
173
 
176
174
  # For given dependency list returns a SpecSet with Gemspec of all the required
@@ -187,10 +185,10 @@ module Bundler
187
185
  gem_name, gem_version = extract_gem_info(e)
188
186
  locked_gem = @locked_specs[gem_name].last
189
187
  raise if locked_gem.nil? || locked_gem.version.to_s != gem_version || !@remote
190
- raise GemNotFound, "Your bundle is locked to #{locked_gem}, but that version could not " \
191
- "be found in any of the sources listed in your Gemfile. If you haven't changed sources, " \
192
- "that means the author of #{locked_gem} has removed it. You'll need to update your bundle " \
193
- "to a version other than #{locked_gem} that hasn't been removed in order to install."
188
+ raise GemNotFound, "Your bundle is locked to #{locked_gem} from #{locked_gem.source}, but that version can " \
189
+ "no longer be found in that source. That means the author of #{locked_gem} has removed it. " \
190
+ "You'll need to update your bundle to a version other than #{locked_gem} that hasn't been " \
191
+ "removed in order to install."
194
192
  end
195
193
  unless specs["bundler"].any?
196
194
  bundler = sources.metadata_source.specs.search(Gem::Dependency.new("bundler", VERSION)).last
@@ -221,7 +219,6 @@ module Bundler
221
219
  Bundler.ui.debug "The definition is missing #{missing.map(&:full_name)}"
222
220
  true
223
221
  rescue BundlerError => e
224
- @index = nil
225
222
  @resolve = nil
226
223
  @specs = nil
227
224
  @gem_version_promoter = nil
@@ -284,50 +281,6 @@ module Bundler
284
281
  end
285
282
  end
286
283
 
287
- def index
288
- @index ||= Index.build do |idx|
289
- dependency_names = @dependencies.map(&:name)
290
-
291
- sources.all_sources.each do |source|
292
- source.dependency_names = dependency_names - pinned_spec_names(source)
293
- idx.add_source source.specs
294
- dependency_names.concat(source.unmet_deps).uniq!
295
- end
296
-
297
- double_check_for_index(idx, dependency_names)
298
- end
299
- end
300
-
301
- # Suppose the gem Foo depends on the gem Bar. Foo exists in Source A. Bar has some versions that exist in both
302
- # sources A and B. At this point, the API request will have found all the versions of Bar in source A,
303
- # but will not have found any versions of Bar from source B, which is a problem if the requested version
304
- # of Foo specifically depends on a version of Bar that is only found in source B. This ensures that for
305
- # each spec we found, we add all possible versions from all sources to the index.
306
- def double_check_for_index(idx, dependency_names)
307
- pinned_names = pinned_spec_names
308
- loop do
309
- idxcount = idx.size
310
-
311
- names = :names # do this so we only have to traverse to get dependency_names from the index once
312
- unmet_dependency_names = lambda do
313
- return names unless names == :names
314
- new_names = sources.all_sources.map(&:dependency_names_to_double_check)
315
- return names = nil if new_names.compact!
316
- names = new_names.flatten(1).concat(dependency_names)
317
- names.uniq!
318
- names -= pinned_names
319
- names
320
- end
321
-
322
- sources.all_sources.each do |source|
323
- source.double_check_for(unmet_dependency_names)
324
- end
325
-
326
- break if idxcount == idx.size
327
- end
328
- end
329
- private :double_check_for_index
330
-
331
284
  def has_rubygems_remotes?
332
285
  sources.rubygems_sources.any? {|s| s.remotes.any? }
333
286
  end
@@ -534,14 +487,6 @@ module Bundler
534
487
  end
535
488
  end
536
489
 
537
- def find_resolved_spec(current_spec)
538
- specs.find_by_name_and_platform(current_spec.name, current_spec.platform)
539
- end
540
-
541
- def find_indexed_specs(current_spec)
542
- index[current_spec.name].select {|spec| spec.match_platform(current_spec.platform) }.sort_by(&:version)
543
- end
544
-
545
490
  attr_reader :sources
546
491
  private :sources
547
492
 
@@ -558,6 +503,10 @@ module Bundler
558
503
 
559
504
  private
560
505
 
506
+ def precompute_source_requirements_for_indirect_dependencies?
507
+ sources.non_global_rubygems_sources.all?(&:dependency_api_available?) && sources.no_aggregate_global_source?
508
+ end
509
+
561
510
  def current_ruby_platform_locked?
562
511
  return false unless generic_local_platform == Gem::Platform::RUBY
563
512
 
@@ -683,9 +632,9 @@ module Bundler
683
632
  changes = false
684
633
 
685
634
  # If there is a RubyGems source in both
686
- locked_gem_sources.each do |locked_gem|
635
+ locked_gem_sources.each do |locked_gem_source|
687
636
  # Merge the remotes from the Gemfile into the Gemfile.lock
688
- changes |= locked_gem.replace_remotes(actual_remotes, Bundler.settings[:allow_deployment_source_credential_changes])
637
+ changes |= locked_gem_source.replace_remotes(actual_remotes, Bundler.settings[:allow_deployment_source_credential_changes])
689
638
  end
690
639
 
691
640
  changes
@@ -904,26 +853,22 @@ module Bundler
904
853
  end
905
854
 
906
855
  def source_requirements
907
- # Load all specs from remote sources
908
- index
909
-
910
856
  # Record the specs available in each gem's source, so that those
911
857
  # specs will be available later when the resolver knows where to
912
858
  # look for that gemspec (or its dependencies)
913
- source_requirements = { :default => sources.default_source }.merge(dependency_source_requirements)
859
+ source_requirements = if precompute_source_requirements_for_indirect_dependencies?
860
+ { :default => sources.default_source }.merge(source_map.all_requirements)
861
+ else
862
+ { :default => Source::RubygemsAggregate.new(sources, source_map) }.merge(source_map.direct_requirements)
863
+ end
914
864
  metadata_dependencies.each do |dep|
915
865
  source_requirements[dep.name] = sources.metadata_source
916
866
  end
917
- source_requirements[:global] = index unless Bundler.feature_flag.disable_multisource?
918
- source_requirements[:default_bundler] = source_requirements["bundler"] || source_requirements[:default]
867
+ source_requirements[:default_bundler] = source_requirements["bundler"] || sources.default_source
919
868
  source_requirements["bundler"] = sources.metadata_source # needs to come last to override
920
869
  source_requirements
921
870
  end
922
871
 
923
- def pinned_spec_names(skip = nil)
924
- dependency_source_requirements.reject {|_, source| source == skip }.keys
925
- end
926
-
927
872
  def requested_groups
928
873
  groups - Bundler.settings[:without] - @optional_groups + Bundler.settings[:with]
929
874
  end
@@ -959,7 +904,7 @@ module Bundler
959
904
  end
960
905
 
961
906
  def additional_base_requirements_for_resolve
962
- return [] unless @locked_gems && Bundler.feature_flag.only_update_to_newer_versions?
907
+ return [] unless @locked_gems
963
908
  dependencies_by_name = dependencies.inject({}) {|memo, dep| memo.update(dep.name => dep) }
964
909
  @locked_gems.specs.reduce({}) do |requirements, locked_spec|
965
910
  name = locked_spec.name
@@ -979,16 +924,8 @@ module Bundler
979
924
  Bundler.settings[:allow_deployment_source_credential_changes] && source.equivalent_remotes?(sources.rubygems_remotes)
980
925
  end
981
926
 
982
- def dependency_source_requirements
983
- @dependency_source_requirements ||= begin
984
- source_requirements = {}
985
- default = sources.default_source
986
- dependencies.each do |dep|
987
- dep_source = dep.source || default
988
- source_requirements[dep.name] = dep_source
989
- end
990
- source_requirements
991
- end
927
+ def source_map
928
+ @source_map ||= SourceMap.new(sources, dependencies)
992
929
  end
993
930
  end
994
931
  end
@@ -32,10 +32,8 @@ module Bundler
32
32
  settings_flag(:cache_all) { bundler_3_mode? }
33
33
  settings_flag(:default_install_uses_path) { bundler_3_mode? }
34
34
  settings_flag(:deployment_means_frozen) { bundler_3_mode? }
35
- settings_flag(:disable_multisource) { bundler_3_mode? }
36
35
  settings_flag(:forget_cli_options) { bundler_3_mode? }
37
36
  settings_flag(:global_gem_cache) { bundler_3_mode? }
38
- settings_flag(:only_update_to_newer_versions) { bundler_3_mode? }
39
37
  settings_flag(:path_relative_to_cwd) { bundler_3_mode? }
40
38
  settings_flag(:plugins) { @bundler_version >= Gem::Version.new("1.14") }
41
39
  settings_flag(:print_only_version_number) { bundler_3_mode? }
@@ -47,7 +47,8 @@ module Bundler
47
47
  remote_uri = filter_uri(remote_uri)
48
48
  super "Authentication is required for #{remote_uri}.\n" \
49
49
  "Please supply credentials for this source. You can do this by running:\n" \
50
- " bundle config set --global #{remote_uri} username:password"
50
+ "`bundle config set --global #{remote_uri} username:password`\n" \
51
+ "or by storing the credentials in the `#{Settings.key_for(remote_uri)}` environment variable"
51
52
  end
52
53
  end
53
54
  # This error is raised if HTTP authentication is provided, but incorrect.
@@ -14,8 +14,10 @@ module Bundler
14
14
  def fetch(uri, headers = {}, counter = 0)
15
15
  raise HTTPError, "Too many redirects" if counter >= redirect_limit
16
16
 
17
+ filtered_uri = URICredentialsFilter.credential_filtered_uri(uri)
18
+
17
19
  response = request(uri, headers)
18
- Bundler.ui.debug("HTTP #{response.code} #{response.message} #{uri}")
20
+ Bundler.ui.debug("HTTP #{response.code} #{response.message} #{filtered_uri}")
19
21
 
20
22
  case response
21
23
  when Net::HTTPSuccess, Net::HTTPNotModified
@@ -40,7 +42,7 @@ module Bundler
40
42
  raise BadAuthenticationError, uri.host if uri.userinfo
41
43
  raise AuthenticationRequiredError, uri.host
42
44
  when Net::HTTPNotFound
43
- raise FallbackError, "Net::HTTPNotFound: #{URICredentialsFilter.credential_filtered_uri(uri)}"
45
+ raise FallbackError, "Net::HTTPNotFound: #{filtered_uri}"
44
46
  else
45
47
  raise HTTPError, "#{response.class}#{": #{response.body}" unless response.body.empty?}"
46
48
  end
@@ -49,7 +51,9 @@ module Bundler
49
51
  def request(uri, headers)
50
52
  validate_uri_scheme!(uri)
51
53
 
52
- Bundler.ui.debug "HTTP GET #{uri}"
54
+ filtered_uri = URICredentialsFilter.credential_filtered_uri(uri)
55
+
56
+ Bundler.ui.debug "HTTP GET #{filtered_uri}"
53
57
  req = Net::HTTP::Get.new uri.request_uri, headers
54
58
  if uri.user
55
59
  user = CGI.unescape(uri.user)
@@ -69,7 +73,7 @@ module Bundler
69
73
  raise NetworkDownError, "Could not reach host #{uri.host}. Check your network " \
70
74
  "connection and try again."
71
75
  else
72
- raise HTTPError, "Network error while fetching #{URICredentialsFilter.credential_filtered_uri(uri)}" \
76
+ raise HTTPError, "Network error while fetching #{filtered_uri}" \
73
77
  " (#{e})"
74
78
  end
75
79
  end
@@ -112,7 +112,7 @@ module Bundler
112
112
  #{issues_url(e)}
113
113
 
114
114
  If there aren't any reports for this error yet, please create copy and paste the report template above into a new issue. Don't forget to anonymize any private data! The new issue form is located at:
115
- https://github.com/rubygems/rubygems/issues/new?labels=Bundler
115
+ https://github.com/rubygems/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md
116
116
  EOS
117
117
  end
118
118
 
@@ -47,6 +47,11 @@ module Bundler
47
47
  built_gem_path = build_gem
48
48
  end
49
49
 
50
+ desc "Generate SHA512 checksum if #{name}-#{version}.gem into the checksums directory."
51
+ task "build:checksum" => "build" do
52
+ build_checksum(built_gem_path)
53
+ end
54
+
50
55
  desc "Build and install #{name}-#{version}.gem into system gems."
51
56
  task "install" => "build" do
52
57
  install_gem(built_gem_path)
@@ -100,6 +105,17 @@ module Bundler
100
105
  Bundler.ui.confirm "#{name} (#{version}) installed."
101
106
  end
102
107
 
108
+ def build_checksum(built_gem_path = nil)
109
+ built_gem_path ||= build_gem
110
+ SharedHelpers.filesystem_access(File.join(base, "checksums")) {|p| FileUtils.mkdir_p(p) }
111
+ file_name = "#{File.basename(built_gem_path)}.sha512"
112
+ require "digest/sha2"
113
+ checksum = Digest::SHA512.new.hexdigest(built_gem_path.to_s)
114
+ target = File.join(base, "checksums", file_name)
115
+ File.write(target, checksum)
116
+ Bundler.ui.confirm "#{name} #{version} checksum written to checksums/#{file_name}."
117
+ end
118
+
103
119
  protected
104
120
 
105
121
  def rubygem_push(path)
@@ -122,10 +122,9 @@ module Bundler
122
122
  names
123
123
  end
124
124
 
125
- # returns a list of the dependencies
126
125
  def unmet_dependency_names
127
126
  dependency_names.select do |name|
128
- name != "bundler" && search(name).empty?
127
+ search(name).empty?
129
128
  end
130
129
  end
131
130