bundler 2.1.4 → 2.2.6

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 (210) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1624 -1426
  3. data/README.md +6 -8
  4. data/bundler.gemspec +4 -4
  5. data/exe/bundle +3 -0
  6. data/lib/bundler.rb +32 -8
  7. data/lib/bundler/build_metadata.rb +3 -11
  8. data/lib/bundler/cli.rb +55 -21
  9. data/lib/bundler/cli/add.rb +1 -1
  10. data/lib/bundler/cli/binstubs.rb +6 -2
  11. data/lib/bundler/cli/cache.rb +1 -7
  12. data/lib/bundler/cli/clean.rb +1 -1
  13. data/lib/bundler/cli/common.rb +14 -0
  14. data/lib/bundler/cli/console.rb +1 -1
  15. data/lib/bundler/cli/doctor.rb +1 -1
  16. data/lib/bundler/cli/exec.rb +4 -4
  17. data/lib/bundler/cli/fund.rb +36 -0
  18. data/lib/bundler/cli/gem.rb +86 -11
  19. data/lib/bundler/cli/info.rb +15 -4
  20. data/lib/bundler/cli/init.rb +2 -2
  21. data/lib/bundler/cli/inject.rb +1 -1
  22. data/lib/bundler/cli/install.rb +13 -11
  23. data/lib/bundler/cli/issue.rb +2 -2
  24. data/lib/bundler/cli/list.rb +12 -10
  25. data/lib/bundler/cli/outdated.rb +87 -66
  26. data/lib/bundler/cli/plugin.rb +10 -0
  27. data/lib/bundler/cli/pristine.rb +5 -0
  28. data/lib/bundler/cli/show.rb +1 -1
  29. data/lib/bundler/cli/update.rb +3 -1
  30. data/lib/bundler/compact_index_client.rb +1 -1
  31. data/lib/bundler/compact_index_client/cache.rb +6 -14
  32. data/lib/bundler/compact_index_client/gem_parser.rb +28 -0
  33. data/lib/bundler/compact_index_client/updater.rb +5 -13
  34. data/lib/bundler/definition.rb +66 -82
  35. data/lib/bundler/dep_proxy.rb +16 -9
  36. data/lib/bundler/dependency.rb +3 -10
  37. data/lib/bundler/dsl.rb +5 -9
  38. data/lib/bundler/endpoint_specification.rb +1 -1
  39. data/lib/bundler/env.rb +1 -1
  40. data/lib/bundler/environment_preserver.rb +26 -2
  41. data/lib/bundler/errors.rb +1 -0
  42. data/lib/bundler/feature_flag.rb +0 -3
  43. data/lib/bundler/fetcher.rb +4 -3
  44. data/lib/bundler/fetcher/base.rb +1 -1
  45. data/lib/bundler/fetcher/compact_index.rb +1 -1
  46. data/lib/bundler/fetcher/downloader.rb +1 -1
  47. data/lib/bundler/fetcher/index.rb +3 -4
  48. data/lib/bundler/friendly_errors.rb +22 -13
  49. data/lib/bundler/gem_helper.rb +32 -17
  50. data/lib/bundler/gem_helpers.rb +36 -25
  51. data/lib/bundler/gem_version_promoter.rb +4 -4
  52. data/lib/bundler/graph.rb +1 -1
  53. data/lib/bundler/index.rb +6 -2
  54. data/lib/bundler/injector.rb +22 -4
  55. data/lib/bundler/inline.rb +1 -1
  56. data/lib/bundler/installer.rb +35 -32
  57. data/lib/bundler/installer/gem_installer.rb +3 -3
  58. data/lib/bundler/installer/parallel_installer.rb +10 -10
  59. data/lib/bundler/installer/standalone.rb +2 -2
  60. data/lib/bundler/lazy_specification.rb +35 -11
  61. data/lib/bundler/lockfile_generator.rb +1 -1
  62. data/lib/bundler/lockfile_parser.rb +1 -1
  63. data/lib/bundler/man/.document +1 -0
  64. data/{man → lib/bundler/man}/bundle-add.1 +1 -1
  65. data/{man/bundle-add.ronn → lib/bundler/man/bundle-add.1.ronn} +0 -0
  66. data/{man → lib/bundler/man}/bundle-binstubs.1 +5 -3
  67. data/{man/bundle-binstubs.ronn → lib/bundler/man/bundle-binstubs.1.ronn} +2 -4
  68. data/{man → lib/bundler/man}/bundle-cache.1 +1 -1
  69. data/{man/bundle-cache.ronn → lib/bundler/man/bundle-cache.1.ronn} +0 -0
  70. data/{man → lib/bundler/man}/bundle-check.1 +1 -1
  71. data/{man/bundle-check.ronn → lib/bundler/man/bundle-check.1.ronn} +0 -0
  72. data/{man → lib/bundler/man}/bundle-clean.1 +1 -1
  73. data/{man/bundle-clean.ronn → lib/bundler/man/bundle-clean.1.ronn} +0 -0
  74. data/{man → lib/bundler/man}/bundle-config.1 +16 -25
  75. data/{man/bundle-config.ronn → lib/bundler/man/bundle-config.1.ronn} +19 -30
  76. data/{man → lib/bundler/man}/bundle-doctor.1 +1 -1
  77. data/{man/bundle-doctor.ronn → lib/bundler/man/bundle-doctor.1.ronn} +0 -0
  78. data/{man → lib/bundler/man}/bundle-exec.1 +1 -1
  79. data/{man/bundle-exec.ronn → lib/bundler/man/bundle-exec.1.ronn} +0 -0
  80. data/{man → lib/bundler/man}/bundle-gem.1 +25 -3
  81. data/{man/bundle-gem.ronn → lib/bundler/man/bundle-gem.1.ronn} +30 -7
  82. data/{man → lib/bundler/man}/bundle-info.1 +1 -1
  83. data/{man/bundle-info.ronn → lib/bundler/man/bundle-info.1.ronn} +0 -0
  84. data/{man → lib/bundler/man}/bundle-init.1 +1 -1
  85. data/{man/bundle-init.ronn → lib/bundler/man/bundle-init.1.ronn} +0 -0
  86. data/{man → lib/bundler/man}/bundle-inject.1 +1 -1
  87. data/{man/bundle-inject.ronn → lib/bundler/man/bundle-inject.1.ronn} +0 -0
  88. data/{man → lib/bundler/man}/bundle-install.1 +30 -3
  89. data/{man/bundle-install.ronn → lib/bundler/man/bundle-install.1.ronn} +25 -3
  90. data/{man → lib/bundler/man}/bundle-list.1 +7 -7
  91. data/{man/bundle-list.ronn → lib/bundler/man/bundle-list.1.ronn} +6 -6
  92. data/{man → lib/bundler/man}/bundle-lock.1 +1 -1
  93. data/{man/bundle-lock.ronn → lib/bundler/man/bundle-lock.1.ronn} +0 -0
  94. data/{man → lib/bundler/man}/bundle-open.1 +1 -1
  95. data/{man/bundle-open.ronn → lib/bundler/man/bundle-open.1.ronn} +0 -0
  96. data/{man → lib/bundler/man}/bundle-outdated.1 +1 -1
  97. data/{man/bundle-outdated.ronn → lib/bundler/man/bundle-outdated.1.ronn} +0 -0
  98. data/{man → lib/bundler/man}/bundle-platform.1 +1 -1
  99. data/{man/bundle-platform.ronn → lib/bundler/man/bundle-platform.1.ronn} +0 -0
  100. data/{man → lib/bundler/man}/bundle-pristine.1 +1 -1
  101. data/{man/bundle-pristine.ronn → lib/bundler/man/bundle-pristine.1.ronn} +0 -0
  102. data/{man → lib/bundler/man}/bundle-remove.1 +1 -1
  103. data/{man/bundle-remove.ronn → lib/bundler/man/bundle-remove.1.ronn} +0 -0
  104. data/{man → lib/bundler/man}/bundle-show.1 +1 -1
  105. data/{man/bundle-show.ronn → lib/bundler/man/bundle-show.1.ronn} +0 -0
  106. data/{man → lib/bundler/man}/bundle-update.1 +1 -1
  107. data/{man/bundle-update.ronn → lib/bundler/man/bundle-update.1.ronn} +0 -0
  108. data/{man → lib/bundler/man}/bundle-viz.1 +1 -1
  109. data/{man/bundle-viz.ronn → lib/bundler/man/bundle-viz.1.ronn} +0 -0
  110. data/{man → lib/bundler/man}/bundle.1 +1 -1
  111. data/{man/bundle.ronn → lib/bundler/man/bundle.1.ronn} +0 -0
  112. data/{man → lib/bundler/man}/gemfile.5 +4 -4
  113. data/{man → lib/bundler/man}/gemfile.5.ronn +4 -4
  114. data/{man → lib/bundler/man}/index.txt +0 -0
  115. data/lib/bundler/mirror.rb +2 -2
  116. data/lib/bundler/plugin.rb +30 -5
  117. data/lib/bundler/plugin/api/source.rb +1 -1
  118. data/lib/bundler/plugin/dsl.rb +1 -1
  119. data/lib/bundler/plugin/index.rb +10 -1
  120. data/lib/bundler/plugin/installer.rb +1 -1
  121. data/lib/bundler/plugin/installer/rubygems.rb +1 -1
  122. data/lib/bundler/plugin/source_list.rb +1 -1
  123. data/lib/bundler/psyched_yaml.rb +0 -15
  124. data/lib/bundler/remote_specification.rb +5 -2
  125. data/lib/bundler/resolver.rb +43 -19
  126. data/lib/bundler/resolver/spec_group.rb +39 -24
  127. data/lib/bundler/retry.rb +1 -1
  128. data/lib/bundler/ruby_version.rb +1 -1
  129. data/lib/bundler/rubygems_ext.rb +69 -9
  130. data/lib/bundler/rubygems_gem_installer.rb +3 -9
  131. data/lib/bundler/rubygems_integration.rb +25 -60
  132. data/lib/bundler/runtime.rb +4 -14
  133. data/lib/bundler/settings.rb +49 -46
  134. data/lib/bundler/shared_helpers.rb +2 -2
  135. data/lib/bundler/similarity_detector.rb +1 -1
  136. data/lib/bundler/source.rb +1 -1
  137. data/lib/bundler/source/git.rb +23 -21
  138. data/lib/bundler/source/git/git_proxy.rb +82 -80
  139. data/lib/bundler/source/path.rb +7 -3
  140. data/lib/bundler/source/path/installer.rb +10 -10
  141. data/lib/bundler/source/rubygems.rb +23 -17
  142. data/lib/bundler/source/rubygems/remote.rb +1 -1
  143. data/lib/bundler/source_list.rb +2 -2
  144. data/lib/bundler/spec_set.rb +8 -10
  145. data/lib/bundler/stub_specification.rb +17 -7
  146. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
  147. data/lib/bundler/templates/newgem/Gemfile.tt +9 -1
  148. data/lib/bundler/templates/newgem/README.md.tt +1 -2
  149. data/lib/bundler/templates/newgem/Rakefile.tt +19 -5
  150. data/lib/bundler/templates/newgem/bin/console.tt +1 -0
  151. data/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
  152. data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
  153. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +18 -0
  154. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
  155. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +4 -2
  156. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
  157. data/lib/bundler/templates/newgem/newgem.gemspec.tt +15 -7
  158. data/lib/bundler/templates/newgem/rubocop.yml.tt +13 -0
  159. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
  160. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -1
  161. data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/newgem_test.rb.tt} +2 -0
  162. data/lib/bundler/templates/newgem/test/{test_helper.rb.tt → minitest/test_helper.rb.tt} +2 -0
  163. data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  164. data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  165. data/lib/bundler/ui/shell.rb +5 -5
  166. data/lib/bundler/uri_credentials_filter.rb +3 -1
  167. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -1
  168. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +34 -1
  169. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +2 -2
  170. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +1 -1
  171. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  172. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +48 -46
  173. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +82 -189
  174. data/lib/bundler/vendor/thor/lib/thor.rb +0 -7
  175. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
  176. data/lib/bundler/vendor/thor/lib/thor/base.rb +9 -0
  177. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  178. data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +154 -0
  179. data/lib/bundler/vendored_persistent.rb +0 -7
  180. data/lib/bundler/vendored_tmpdir.rb +4 -0
  181. data/lib/bundler/version.rb +1 -1
  182. data/lib/bundler/worker.rb +1 -1
  183. data/lib/bundler/yaml_serializer.rb +1 -1
  184. metadata +70 -85
  185. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +0 -26
  186. data/man/bundle-add.1.txt +0 -58
  187. data/man/bundle-binstubs.1.txt +0 -48
  188. data/man/bundle-cache.1.txt +0 -78
  189. data/man/bundle-check.1.txt +0 -33
  190. data/man/bundle-clean.1.txt +0 -26
  191. data/man/bundle-config.1.txt +0 -528
  192. data/man/bundle-doctor.1.txt +0 -44
  193. data/man/bundle-exec.1.txt +0 -178
  194. data/man/bundle-gem.1.txt +0 -91
  195. data/man/bundle-info.1.txt +0 -21
  196. data/man/bundle-init.1.txt +0 -34
  197. data/man/bundle-inject.1.txt +0 -32
  198. data/man/bundle-install.1.txt +0 -401
  199. data/man/bundle-list.1.txt +0 -43
  200. data/man/bundle-lock.1.txt +0 -93
  201. data/man/bundle-open.1.txt +0 -29
  202. data/man/bundle-outdated.1.txt +0 -131
  203. data/man/bundle-platform.1.txt +0 -57
  204. data/man/bundle-pristine.1.txt +0 -44
  205. data/man/bundle-remove.1.txt +0 -34
  206. data/man/bundle-show.1.txt +0 -27
  207. data/man/bundle-update.1.txt +0 -390
  208. data/man/bundle-viz.1.txt +0 -39
  209. data/man/bundle.1.txt +0 -116
  210. data/man/gemfile.5.txt +0 -649
@@ -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" "January 2020" "" ""
4
+ .TH "BUNDLE\-VIZ" "1" "November 2020" "" ""
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" "January 2020" "" ""
4
+ .TH "BUNDLE" "1" "November 2020" "" ""
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" "January 2020" "" ""
4
+ .TH "GEMFILE" "5" "November 2020" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBGemfile\fR \- A format for describing gem dependencies for Ruby programs
@@ -150,7 +150,7 @@ gem "RedCloth", ">= 4\.1\.0", "< 4\.2\.0"
150
150
  .IP "" 0
151
151
  .
152
152
  .SS "REQUIRE AS"
153
- Each \fIgem\fR \fBMAY\fR specify files that should be used when autorequiring via \fBBundler\.require\fR\. You may pass an array with multiple files or \fBtrue\fR if file you want \fBrequired\fR has same name as \fIgem\fR or \fBfalse\fR to prevent any file from being autorequired\.
153
+ Each \fIgem\fR \fBMAY\fR specify files that should be used when autorequiring via \fBBundler\.require\fR\. You may pass an array with multiple files or \fBtrue\fR if the file you want \fBrequired\fR has the same name as \fIgem\fR or \fBfalse\fR to prevent any file from being autorequired\.
154
154
  .
155
155
  .IP "" 4
156
156
  .
@@ -227,8 +227,8 @@ To specify multiple groups to ignore, specify a list of groups separated by spac
227
227
  .
228
228
  .nf
229
229
 
230
- bundle config set without test
231
- bundle config set without development test
230
+ bundle config set \-\-local without test
231
+ bundle config set \-\-local without development test
232
232
  .
233
233
  .fi
234
234
  .
@@ -120,8 +120,8 @@ Each _gem_ `MAY` have one or more version specifiers.
120
120
  ### REQUIRE AS
121
121
 
122
122
  Each _gem_ `MAY` specify files that should be used when autorequiring via
123
- `Bundler.require`. You may pass an array with multiple files or `true` if file
124
- you want `required` has same name as _gem_ or `false` to
123
+ `Bundler.require`. You may pass an array with multiple files or `true` if the file
124
+ you want `required` has the same name as _gem_ or `false` to
125
125
  prevent any file from being autorequired.
126
126
 
127
127
  gem "redis", :require => ["redis/connection/hiredis", "redis"]
@@ -163,8 +163,8 @@ not install with the `without` configuration.
163
163
 
164
164
  To specify multiple groups to ignore, specify a list of groups separated by spaces.
165
165
 
166
- bundle config set without test
167
- bundle config set without development test
166
+ bundle config set --local without test
167
+ bundle config set --local without development test
168
168
 
169
169
  Also, calling `Bundler.setup` with no parameters, or calling `require "bundler/setup"`
170
170
  will setup all groups except for the ones you excluded via `--without` (since they
File without changes
@@ -43,7 +43,7 @@ module Bundler
43
43
  config.update_mirror(mirror)
44
44
  end
45
45
 
46
- private
46
+ private
47
47
 
48
48
  def fetch_valid_mirror_for(uri)
49
49
  downcased = uri.to_s.downcase
@@ -158,7 +158,7 @@ module Bundler
158
158
  end
159
159
  end
160
160
 
161
- private
161
+ private
162
162
 
163
163
  def wait_for_writtable_socket(socket, address, timeout)
164
164
  if IO.select(nil, [socket], nil, timeout)
@@ -16,7 +16,7 @@ module Bundler
16
16
 
17
17
  PLUGIN_FILE_NAME = "plugins.rb".freeze
18
18
 
19
- module_function
19
+ module_function
20
20
 
21
21
  def reset!
22
22
  instance_variables.each {|i| remove_instance_variable(i) }
@@ -39,12 +39,37 @@ module Bundler
39
39
 
40
40
  save_plugins names, specs
41
41
  rescue PluginError => e
42
- if specs
43
- specs_to_delete = Hash[specs.select {|k, _v| names.include?(k) && !index.commands.values.include?(k) }]
44
- specs_to_delete.values.each {|spec| Bundler.rm_rf(spec.full_gem_path) }
42
+ specs_to_delete = specs.select {|k, _v| names.include?(k) && !index.commands.values.include?(k) }
43
+ specs_to_delete.each_value {|spec| Bundler.rm_rf(spec.full_gem_path) }
44
+
45
+ names_list = names.map {|name| "`#{name}`" }.join(", ")
46
+ Bundler.ui.error "Failed to install the following plugins: #{names_list}. The underlying error was: #{e.message}.\n #{e.backtrace.join("\n ")}"
47
+ end
48
+
49
+ # Uninstalls plugins by the given names
50
+ #
51
+ # @param [Array<String>] names the names of plugins to be uninstalled
52
+ def uninstall(names, options)
53
+ if names.empty? && !options[:all]
54
+ Bundler.ui.error "No plugins to uninstall. Specify at least 1 plugin to uninstall.\n"\
55
+ "Use --all option to uninstall all the installed plugins."
56
+ return
45
57
  end
46
58
 
47
- Bundler.ui.error "Failed to install plugin #{name}: #{e.message}\n #{e.backtrace.join("\n ")}"
59
+ names = index.installed_plugins if options[:all]
60
+ if names.any?
61
+ names.each do |name|
62
+ if index.installed?(name)
63
+ Bundler.rm_rf(index.plugin_path(name))
64
+ index.unregister_plugin(name)
65
+ Bundler.ui.info "Uninstalled plugin #{name}"
66
+ else
67
+ Bundler.ui.error "Plugin #{name} is not installed \n"
68
+ end
69
+ end
70
+ else
71
+ Bundler.ui.info "No plugins installed"
72
+ end
48
73
  end
49
74
 
50
75
  # List installed plugins and commands
@@ -260,7 +260,7 @@ module Bundler
260
260
  end
261
261
 
262
262
  def to_s
263
- "plugin source for #{options[:type]} with uri #{uri}"
263
+ "plugin source for #{@type} with uri #{@uri}"
264
264
  end
265
265
 
266
266
  # Note: Do not override if you don't know what you are doing.
@@ -10,7 +10,7 @@ module Bundler
10
10
  # So that we don't have to override all there methods to dummy ones
11
11
  # explicitly.
12
12
  # They will be handled by method_missing
13
- [:gemspec, :gem, :path, :install_if, :platforms, :env].each {|m| undef_method m }
13
+ [:gemspec, :gem, :install_if, :platforms, :env].each {|m| undef_method m }
14
14
 
15
15
  # This lists the plugins that was added automatically and not specified by
16
16
  # the user.
@@ -71,6 +71,15 @@ module Bundler
71
71
  raise
72
72
  end
73
73
 
74
+ def unregister_plugin(name)
75
+ @commands.delete_if {|_, v| v == name }
76
+ @sources.delete_if {|_, v| v == name }
77
+ @hooks.each {|_, plugin_names| plugin_names.delete(name) }
78
+ @plugin_paths.delete(name)
79
+ @load_paths.delete(name)
80
+ save_index
81
+ end
82
+
74
83
  # Path of default index file
75
84
  def index_file
76
85
  Plugin.root.join("index")
@@ -124,7 +133,7 @@ module Bundler
124
133
  @hooks[event] || []
125
134
  end
126
135
 
127
- private
136
+ private
128
137
 
129
138
  # Reads the index file from the directory and initializes the instance
130
139
  # variables.
@@ -41,7 +41,7 @@ module Bundler
41
41
  install_from_specs specs
42
42
  end
43
43
 
44
- private
44
+ private
45
45
 
46
46
  def check_sources_consistency!(options)
47
47
  if options.key?(:git) && options.key?(:local_git)
@@ -8,7 +8,7 @@ module Bundler
8
8
  "#{spec.name} #{spec.version}"
9
9
  end
10
10
 
11
- private
11
+ private
12
12
 
13
13
  def requires_sudo?
14
14
  false # Will change on implementation of project level plugins
@@ -17,7 +17,7 @@ module Bundler
17
17
  path_sources + git_sources + rubygems_sources + [metadata_source]
18
18
  end
19
19
 
20
- private
20
+ private
21
21
 
22
22
  def rubygems_aggregate_class
23
23
  Plugin::Installer::Rubygems
@@ -1,11 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Psych could be a gem, so try to ask for it
4
- begin
5
- gem "psych"
6
- rescue LoadError
7
- end if defined?(gem)
8
-
9
3
  # Psych could be in the stdlib
10
4
  # but it's too late if Syck is already loaded
11
5
  begin
@@ -26,12 +20,3 @@ module Bundler
26
20
  YamlLibrarySyntaxError = ::ArgumentError
27
21
  end
28
22
  end
29
-
30
- require_relative "deprecate"
31
- begin
32
- Bundler::Deprecate.skip_during do
33
- require "rubygems/safe_yaml"
34
- end
35
- rescue LoadError
36
- # it's OK if the file isn't there
37
- end
@@ -50,6 +50,8 @@ module Bundler
50
50
  # once the remote gem is downloaded, the backend specification will
51
51
  # be swapped out.
52
52
  def __swap__(spec)
53
+ raise APIResponseInvalidDependenciesError unless spec.dependencies.all? {|d| d.is_a?(Gem::Dependency) }
54
+
53
55
  SharedHelpers.ensure_same_dependencies(self, dependencies, spec.dependencies)
54
56
  @_remote_specification = spec
55
57
  end
@@ -76,7 +78,8 @@ module Bundler
76
78
  deps = method_missing(:dependencies)
77
79
 
78
80
  # allow us to handle when the specs dependencies are an array of array of string
79
- # see https://github.com/bundler/bundler/issues/5797
81
+ # in order to delay the crash to `#__swap__` where it results in a friendlier error
82
+ # see https://github.com/rubygems/bundler/issues/5797
80
83
  deps = deps.map {|d| d.is_a?(Gem::Dependency) ? d : Gem::Dependency.new(*d) }
81
84
 
82
85
  deps
@@ -88,7 +91,7 @@ module Bundler
88
91
  " #{source.revision[0..6]}"
89
92
  end
90
93
 
91
- private
94
+ private
92
95
 
93
96
  def to_ary
94
97
  nil
@@ -32,7 +32,7 @@ module Bundler
32
32
  @base_dg = Molinillo::DependencyGraph.new
33
33
  @base.each do |ls|
34
34
  dep = Dependency.new(ls.name, ls.version)
35
- @base_dg.add_vertex(ls.name, DepProxy.new(dep, ls.platform), true)
35
+ @base_dg.add_vertex(ls.name, DepProxy.get_proxy(dep, ls.platform), true)
36
36
  end
37
37
  additional_base_requirements.each {|d| @base_dg.add_vertex(d.name, d) }
38
38
  @platforms = platforms
@@ -75,12 +75,17 @@ module Bundler
75
75
  return unless debug?
76
76
  debug_info = yield
77
77
  debug_info = debug_info.inspect unless debug_info.is_a?(String)
78
- warn debug_info.split("\n").map {|s| " " * depth + s }
78
+ puts debug_info.split("\n").map {|s| depth == 0 ? "BUNDLER: #{s}" : "BUNDLER(#{depth}): #{s}" }
79
79
  end
80
80
 
81
81
  def debug?
82
82
  return @debug_mode if defined?(@debug_mode)
83
- @debug_mode = ENV["DEBUG_RESOLVER"] || ENV["DEBUG_RESOLVER_TREE"] || false
83
+ @debug_mode =
84
+ ENV["BUNDLER_DEBUG_RESOLVER"] ||
85
+ ENV["BUNDLER_DEBUG_RESOLVER_TREE"] ||
86
+ ENV["DEBUG_RESOLVER"] ||
87
+ ENV["DEBUG_RESOLVER_TREE"] ||
88
+ false
84
89
  end
85
90
 
86
91
  def before_resolution
@@ -101,18 +106,19 @@ module Bundler
101
106
  specification.dependencies_for_activated_platforms
102
107
  end
103
108
 
104
- def search_for(dependency)
105
- platform = dependency.__platform
106
- dependency = dependency.dep unless dependency.is_a? Gem::Dependency
107
- search = @search_for[dependency] ||= begin
109
+ def search_for(dependency_proxy)
110
+ platform = dependency_proxy.__platform
111
+ dependency = dependency_proxy.dep
112
+ @search_for[dependency_proxy] ||= begin
113
+ name = dependency.name
108
114
  index = index_for(dependency)
109
- results = index.search(dependency, @base[dependency.name])
115
+ results = index.search(dependency, @base[name])
110
116
 
111
- if vertex = @base_dg.vertex_named(dependency.name)
117
+ if vertex = @base_dg.vertex_named(name)
112
118
  locked_requirement = vertex.payload.requirement
113
119
  end
114
120
 
115
- if !@prerelease_specified[dependency.name] && (!@use_gvp || locked_requirement.nil?)
121
+ if !@prerelease_specified[name] && (!@use_gvp || locked_requirement.nil?)
116
122
  # Move prereleases to the beginning of the list, so they're considered
117
123
  # last during resolution.
118
124
  pre, results = results.partition {|spec| spec.version.prerelease? }
@@ -140,13 +146,32 @@ module Bundler
140
146
  end
141
147
  # GVP handles major itself, but it's still a bit risky to trust it with it
142
148
  # until we get it settled with new behavior. For 2.x it can take over all cases.
143
- if !@use_gvp
149
+ search = if !@use_gvp
144
150
  spec_groups
145
151
  else
146
152
  @gem_version_promoter.sort_versions(dependency, spec_groups)
147
153
  end
154
+ selected_sgs = []
155
+ search.each do |sg|
156
+ next unless sg.for?(platform)
157
+ sg_all_platforms = sg.copy_for(self.class.sort_platforms(@platforms).reverse)
158
+ next unless sg_all_platforms
159
+
160
+ selected_sgs << sg_all_platforms
161
+
162
+ next if sg_all_platforms.activated_platforms == [Gem::Platform::RUBY]
163
+ # Add a spec group for "non platform specific spec" as the fallback
164
+ # spec group.
165
+ sg_ruby = sg.copy_for([Gem::Platform::RUBY])
166
+ next unless sg_ruby
167
+
168
+ sg_ruby_deps = sg_ruby.dependencies_for_activated_platforms.map(&:dep)
169
+ sg_all_platforms_deps = sg_all_platforms.dependencies_for_activated_platforms.map(&:dep)
170
+
171
+ selected_sgs.insert(-2, sg_ruby) if sg_ruby_deps != sg_all_platforms_deps
172
+ end
173
+ selected_sgs
148
174
  end
149
- search.select {|sg| sg.for?(platform) }.each {|sg| sg.activate_platform!(platform) }
150
175
  end
151
176
 
152
177
  def index_for(dependency)
@@ -183,9 +208,7 @@ module Bundler
183
208
  end
184
209
 
185
210
  def requirement_satisfied_by?(requirement, activated, spec)
186
- return false unless requirement.matches_spec?(spec) || spec.source.is_a?(Source::Gemspec)
187
- spec.activate_platform!(requirement.__platform) if !@platforms || @platforms.include?(requirement.__platform)
188
- true
211
+ requirement.matches_spec?(spec) || spec.source.is_a?(Source::Gemspec)
189
212
  end
190
213
 
191
214
  def relevant_sources_for_vertex(vertex)
@@ -223,11 +246,12 @@ module Bundler
223
246
  end
224
247
 
225
248
  def self.platform_sort_key(platform)
226
- return ["", "", ""] if Gem::Platform::RUBY == platform
227
- platform.to_a.map {|part| part || "" }
249
+ # Prefer specific platform to not specific platform
250
+ return ["99-LAST", "", "", ""] if Gem::Platform::RUBY == platform
251
+ ["00", *platform.to_a.map {|part| part || "" }]
228
252
  end
229
253
 
230
- private
254
+ private
231
255
 
232
256
  # returns an integer \in (-\infty, 0]
233
257
  # a number closer to 0 means the dependency is less constraining
@@ -279,7 +303,7 @@ module Bundler
279
303
  versions_with_platforms = specs.map {|s| [s.version, s.platform] }
280
304
  message = String.new("Could not find gem '#{SharedHelpers.pretty_dependency(requirement)}' in #{source}#{cache_message}.\n")
281
305
  message << if versions_with_platforms.any?
282
- "The source contains '#{name}' at: #{formatted_versions_with_platforms(versions_with_platforms)}"
306
+ "The source contains the following versions of '#{name}': #{formatted_versions_with_platforms(versions_with_platforms)}"
283
307
  else
284
308
  "The source does not contain any versions of '#{name}'"
285
309
  end
@@ -6,9 +6,10 @@ module Bundler
6
6
  include GemHelpers
7
7
 
8
8
  attr_accessor :name, :version, :source
9
- attr_accessor :ignores_bundler_dependencies
9
+ attr_accessor :ignores_bundler_dependencies, :activated_platforms
10
10
 
11
11
  def initialize(all_specs)
12
+ @all_specs = all_specs
12
13
  raise ArgumentError, "cannot initialize with an empty value" unless exemplary_spec = all_specs.first
13
14
  @name = exemplary_spec.name
14
15
  @version = exemplary_spec.version
@@ -24,32 +25,40 @@ module Bundler
24
25
 
25
26
  def to_specs
26
27
  @activated_platforms.map do |p|
27
- next unless s = @specs[p]
28
- lazy_spec = LazySpecification.new(name, version, s.platform, source)
29
- lazy_spec.dependencies.replace s.dependencies
30
- lazy_spec
31
- end.compact
28
+ specs = @specs[p]
29
+ next unless specs.any?
30
+
31
+ specs.map do |s|
32
+ lazy_spec = LazySpecification.new(name, version, s.platform, source)
33
+ lazy_spec.dependencies.replace s.dependencies
34
+ lazy_spec
35
+ end
36
+ end.flatten.compact.uniq
32
37
  end
33
38
 
34
- def activate_platform!(platform)
35
- return unless for?(platform)
36
- return if @activated_platforms.include?(platform)
37
- @activated_platforms << platform
39
+ def copy_for(platforms)
40
+ platforms.select! {|p| for?(p) }
41
+ return unless platforms.any?
42
+
43
+ copied_sg = self.class.new(@all_specs)
44
+ copied_sg.ignores_bundler_dependencies = @ignores_bundler_dependencies
45
+ copied_sg.activated_platforms = platforms
46
+ copied_sg
38
47
  end
39
48
 
40
49
  def for?(platform)
41
- spec = @specs[platform]
42
- !spec.nil?
50
+ @specs[platform].any?
43
51
  end
44
52
 
45
53
  def to_s
46
- @to_s ||= "#{name} (#{version})"
54
+ activated_platforms_string = sorted_activated_platforms.join(", ")
55
+ "#{name} (#{version}) (#{activated_platforms_string})"
47
56
  end
48
57
 
49
58
  def dependencies_for_activated_platforms
50
59
  dependencies = @activated_platforms.map {|p| __dependencies[p] }
51
60
  metadata_dependencies = @activated_platforms.map do |platform|
52
- metadata_dependencies(@specs[platform], platform)
61
+ metadata_dependencies(@specs[platform].first, platform)
53
62
  end
54
63
  dependencies.concat(metadata_dependencies).flatten
55
64
  end
@@ -58,6 +67,7 @@ module Bundler
58
67
  return unless other.is_a?(SpecGroup)
59
68
  name == other.name &&
60
69
  version == other.version &&
70
+ sorted_activated_platforms == other.sorted_activated_platforms &&
61
71
  source == other.source
62
72
  end
63
73
 
@@ -65,23 +75,31 @@ module Bundler
65
75
  return unless other.is_a?(SpecGroup)
66
76
  name.eql?(other.name) &&
67
77
  version.eql?(other.version) &&
78
+ sorted_activated_platforms.eql?(other.sorted_activated_platforms) &&
68
79
  source.eql?(other.source)
69
80
  end
70
81
 
71
82
  def hash
72
- to_s.hash ^ source.hash
83
+ name.hash ^ version.hash ^ sorted_activated_platforms.hash ^ source.hash
84
+ end
85
+
86
+ protected
87
+
88
+ def sorted_activated_platforms
89
+ @activated_platforms.sort_by(&:to_s)
73
90
  end
74
91
 
75
- private
92
+ private
76
93
 
77
94
  def __dependencies
78
95
  @dependencies = Hash.new do |dependencies, platform|
79
96
  dependencies[platform] = []
80
- if spec = @specs[platform]
97
+ specs = @specs[platform]
98
+ if spec = specs.first
81
99
  spec.dependencies.each do |dep|
82
100
  next if dep.type == :development
83
101
  next if @ignores_bundler_dependencies && dep.name == "bundler".freeze
84
- dependencies[platform] << DepProxy.new(dep, platform)
102
+ dependencies[platform] << DepProxy.get_proxy(dep, platform)
85
103
  end
86
104
  end
87
105
  dependencies[platform]
@@ -89,16 +107,13 @@ module Bundler
89
107
  end
90
108
 
91
109
  def metadata_dependencies(spec, platform)
92
- return [] unless spec
93
- # Only allow endpoint specifications since they won't hit the network to
94
- # fetch the full gemspec when calling required_ruby_version
95
- return [] if !spec.is_a?(EndpointSpecification) && !spec.is_a?(Gem::Specification)
110
+ return [] unless spec && spec.is_a?(Gem::Specification)
96
111
  dependencies = []
97
112
  if !spec.required_ruby_version.nil? && !spec.required_ruby_version.none?
98
- dependencies << DepProxy.new(Gem::Dependency.new("Ruby\0", spec.required_ruby_version), platform)
113
+ dependencies << DepProxy.get_proxy(Gem::Dependency.new("Ruby\0", spec.required_ruby_version), platform)
99
114
  end
100
115
  if !spec.required_rubygems_version.nil? && !spec.required_rubygems_version.none?
101
- dependencies << DepProxy.new(Gem::Dependency.new("RubyGems\0", spec.required_rubygems_version), platform)
116
+ dependencies << DepProxy.get_proxy(Gem::Dependency.new("RubyGems\0", spec.required_rubygems_version), platform)
102
117
  end
103
118
  dependencies
104
119
  end