bundler 1.13.6 → 1.17.3

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 (323) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +554 -9
  3. data/README.md +28 -5
  4. data/bundler.gemspec +40 -11
  5. data/exe/bundle +4 -8
  6. data/exe/bundle_ruby +4 -3
  7. data/lib/bundler.rb +162 -68
  8. data/lib/bundler/build_metadata.rb +53 -0
  9. data/lib/bundler/capistrano.rb +5 -0
  10. data/lib/bundler/cli.rb +360 -118
  11. data/lib/bundler/cli/add.rb +35 -0
  12. data/lib/bundler/cli/binstubs.rb +18 -10
  13. data/lib/bundler/cli/cache.rb +6 -5
  14. data/lib/bundler/cli/check.rb +4 -6
  15. data/lib/bundler/cli/clean.rb +6 -7
  16. data/lib/bundler/cli/common.rb +47 -1
  17. data/lib/bundler/cli/config.rb +26 -7
  18. data/lib/bundler/cli/console.rb +2 -1
  19. data/lib/bundler/cli/doctor.rb +63 -18
  20. data/lib/bundler/cli/exec.rb +12 -5
  21. data/lib/bundler/cli/gem.rb +59 -21
  22. data/lib/bundler/cli/info.rb +50 -0
  23. data/lib/bundler/cli/init.rb +21 -7
  24. data/lib/bundler/cli/inject.rb +13 -4
  25. data/lib/bundler/cli/install.rb +72 -101
  26. data/lib/bundler/cli/issue.rb +40 -0
  27. data/lib/bundler/cli/list.rb +58 -0
  28. data/lib/bundler/cli/lock.rb +9 -6
  29. data/lib/bundler/cli/open.rb +4 -3
  30. data/lib/bundler/cli/outdated.rb +175 -60
  31. data/lib/bundler/cli/package.rb +9 -6
  32. data/lib/bundler/cli/platform.rb +2 -1
  33. data/lib/bundler/cli/plugin.rb +1 -0
  34. data/lib/bundler/cli/pristine.rb +47 -0
  35. data/lib/bundler/cli/remove.rb +18 -0
  36. data/lib/bundler/cli/show.rb +2 -2
  37. data/lib/bundler/cli/update.rb +44 -34
  38. data/lib/bundler/cli/viz.rb +5 -1
  39. data/lib/bundler/compact_index_client.rb +109 -0
  40. data/lib/bundler/compact_index_client/cache.rb +118 -0
  41. data/lib/bundler/compact_index_client/updater.rb +116 -0
  42. data/lib/bundler/compatibility_guard.rb +14 -0
  43. data/lib/bundler/constants.rb +1 -0
  44. data/lib/bundler/current_ruby.rb +17 -8
  45. data/lib/bundler/definition.rb +353 -182
  46. data/lib/bundler/dep_proxy.rb +3 -1
  47. data/lib/bundler/dependency.rb +22 -10
  48. data/lib/bundler/deployment.rb +1 -1
  49. data/lib/bundler/deprecate.rb +15 -3
  50. data/lib/bundler/dsl.rb +122 -64
  51. data/lib/bundler/endpoint_specification.rb +13 -3
  52. data/lib/bundler/env.rb +110 -38
  53. data/lib/bundler/environment_preserver.rb +27 -6
  54. data/lib/bundler/errors.rb +24 -0
  55. data/lib/bundler/feature_flag.rb +74 -0
  56. data/lib/bundler/fetcher.rb +18 -11
  57. data/lib/bundler/fetcher/base.rb +1 -0
  58. data/lib/bundler/fetcher/compact_index.rb +7 -5
  59. data/lib/bundler/fetcher/dependency.rb +3 -2
  60. data/lib/bundler/fetcher/downloader.rb +25 -7
  61. data/lib/bundler/fetcher/index.rb +3 -2
  62. data/lib/bundler/friendly_errors.rb +33 -7
  63. data/lib/bundler/gem_helper.rb +25 -11
  64. data/lib/bundler/gem_helpers.rb +70 -1
  65. data/lib/bundler/gem_remote_fetcher.rb +1 -0
  66. data/lib/bundler/gem_tasks.rb +1 -0
  67. data/lib/bundler/gem_version_promoter.rb +17 -2
  68. data/lib/bundler/gemdeps.rb +29 -0
  69. data/lib/bundler/graph.rb +1 -0
  70. data/lib/bundler/index.rb +28 -15
  71. data/lib/bundler/injector.rb +216 -33
  72. data/lib/bundler/inline.rb +12 -12
  73. data/lib/bundler/installer.rb +139 -53
  74. data/lib/bundler/installer/gem_installer.rb +15 -5
  75. data/lib/bundler/installer/parallel_installer.rb +113 -28
  76. data/lib/bundler/installer/standalone.rb +1 -0
  77. data/lib/bundler/lazy_specification.rb +31 -3
  78. data/lib/bundler/lockfile_generator.rb +95 -0
  79. data/lib/bundler/lockfile_parser.rb +50 -37
  80. data/lib/bundler/match_platform.rb +13 -3
  81. data/lib/bundler/mirror.rb +10 -5
  82. data/lib/bundler/plugin.rb +22 -8
  83. data/lib/bundler/plugin/api.rb +2 -1
  84. data/lib/bundler/plugin/api/source.rb +17 -4
  85. data/lib/bundler/plugin/events.rb +61 -0
  86. data/lib/bundler/plugin/index.rb +9 -2
  87. data/lib/bundler/plugin/installer.rb +7 -6
  88. data/lib/bundler/plugin/source_list.rb +7 -8
  89. data/lib/bundler/process_lock.rb +24 -0
  90. data/lib/bundler/psyched_yaml.rb +10 -0
  91. data/lib/bundler/remote_specification.rb +30 -1
  92. data/lib/bundler/resolver.rb +187 -194
  93. data/lib/bundler/resolver/spec_group.rb +106 -0
  94. data/lib/bundler/retry.rb +5 -1
  95. data/lib/bundler/ruby_dsl.rb +1 -0
  96. data/lib/bundler/ruby_version.rb +12 -2
  97. data/lib/bundler/rubygems_ext.rb +23 -8
  98. data/lib/bundler/rubygems_gem_installer.rb +90 -0
  99. data/lib/bundler/rubygems_integration.rb +193 -70
  100. data/lib/bundler/runtime.rb +39 -22
  101. data/lib/bundler/settings.rb +245 -85
  102. data/lib/bundler/settings/validator.rb +102 -0
  103. data/lib/bundler/setup.rb +4 -7
  104. data/lib/bundler/shared_helpers.rb +183 -40
  105. data/lib/bundler/similarity_detector.rb +1 -0
  106. data/lib/bundler/source.rb +58 -1
  107. data/lib/bundler/source/gemspec.rb +1 -0
  108. data/lib/bundler/source/git.rb +52 -23
  109. data/lib/bundler/source/git/git_proxy.rb +30 -14
  110. data/lib/bundler/source/metadata.rb +62 -0
  111. data/lib/bundler/source/path.rb +42 -16
  112. data/lib/bundler/source/path/installer.rb +4 -2
  113. data/lib/bundler/source/rubygems.rb +171 -82
  114. data/lib/bundler/source/rubygems/remote.rb +12 -2
  115. data/lib/bundler/source_list.rb +75 -15
  116. data/lib/bundler/spec_set.rb +67 -32
  117. data/lib/bundler/ssl_certs/certificate_manager.rb +2 -1
  118. data/lib/bundler/stub_specification.rb +86 -2
  119. data/lib/bundler/templates/.document +1 -0
  120. data/lib/bundler/templates/Executable +13 -1
  121. data/lib/bundler/templates/Executable.bundler +105 -0
  122. data/lib/bundler/templates/Executable.standalone +5 -5
  123. data/lib/bundler/templates/Gemfile +3 -0
  124. data/lib/bundler/templates/gems.rb +8 -0
  125. data/lib/bundler/templates/newgem/Gemfile.tt +4 -2
  126. data/lib/bundler/templates/newgem/LICENSE.txt.tt +1 -1
  127. data/lib/bundler/templates/newgem/README.md.tt +14 -8
  128. data/lib/bundler/templates/newgem/Rakefile.tt +5 -5
  129. data/lib/bundler/templates/newgem/bin/console.tt +1 -1
  130. data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +4 -4
  131. data/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +3 -3
  132. data/lib/bundler/templates/newgem/gitignore.tt +5 -1
  133. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +7 -6
  134. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +4 -4
  135. data/lib/bundler/templates/newgem/newgem.gemspec.tt +21 -12
  136. data/lib/bundler/templates/newgem/rspec.tt +1 -0
  137. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +1 -3
  138. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +13 -1
  139. data/lib/bundler/templates/newgem/test/newgem_test.rb.tt +1 -1
  140. data/lib/bundler/templates/newgem/test/test_helper.rb.tt +3 -3
  141. data/lib/bundler/templates/newgem/{.travis.yml.tt → travis.yml.tt} +2 -0
  142. data/lib/bundler/ui.rb +1 -0
  143. data/lib/bundler/ui/rg_proxy.rb +1 -0
  144. data/lib/bundler/ui/shell.rb +30 -10
  145. data/lib/bundler/ui/silent.rb +21 -1
  146. data/lib/bundler/uri_credentials_filter.rb +1 -0
  147. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1638 -0
  148. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +2 -0
  149. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +26 -0
  150. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +7 -0
  151. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +1 -0
  152. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +26 -6
  153. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +2 -1
  154. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +12 -4
  155. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +3 -2
  156. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +63 -0
  157. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +11 -3
  158. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +13 -1
  159. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +3 -2
  160. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +3 -2
  161. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +18 -5
  162. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +75 -7
  163. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +2 -1
  164. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +1 -0
  165. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +3 -1
  166. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +499 -128
  167. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +1 -0
  168. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +8 -4
  169. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/faster.rb +1 -0
  170. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/persistent.rb +27 -24
  171. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/persistent/ssl_reuse.rb +2 -1
  172. data/lib/bundler/vendor/thor/lib/thor.rb +46 -21
  173. data/lib/bundler/vendor/thor/lib/thor/actions.rb +24 -22
  174. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +2 -1
  175. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
  176. data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +2 -2
  177. data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +16 -8
  178. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +66 -18
  179. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +17 -15
  180. data/lib/bundler/vendor/thor/lib/thor/base.rb +55 -32
  181. data/lib/bundler/vendor/thor/lib/thor/command.rb +13 -11
  182. data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +21 -1
  183. data/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +7 -5
  184. data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +94 -63
  185. data/lib/bundler/vendor/thor/lib/thor/error.rb +3 -3
  186. data/lib/bundler/vendor/thor/lib/thor/group.rb +13 -13
  187. data/lib/bundler/vendor/thor/lib/thor/invocation.rb +4 -5
  188. data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +2 -0
  189. data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +4 -7
  190. data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +16 -16
  191. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +42 -21
  192. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +13 -10
  193. data/lib/bundler/vendor/thor/lib/thor/runner.rb +31 -29
  194. data/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
  195. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +49 -33
  196. data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +1 -1
  197. data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +4 -4
  198. data/lib/bundler/vendor/thor/lib/thor/util.rb +8 -7
  199. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  200. data/lib/bundler/vendored_fileutils.rb +9 -0
  201. data/lib/bundler/vendored_molinillo.rb +1 -0
  202. data/lib/bundler/vendored_persistent.rb +43 -3
  203. data/lib/bundler/vendored_thor.rb +6 -2
  204. data/lib/bundler/version.rb +19 -2
  205. data/lib/bundler/version_ranges.rb +76 -0
  206. data/lib/bundler/vlad.rb +5 -0
  207. data/lib/bundler/worker.rb +30 -6
  208. data/lib/bundler/yaml_serializer.rb +4 -4
  209. data/man/bundle-add.1 +58 -0
  210. data/man/bundle-add.1.txt +52 -0
  211. data/man/bundle-add.ronn +40 -0
  212. data/{lib/bundler/man/bundle-binstubs → man/bundle-binstubs.1} +11 -1
  213. data/man/bundle-binstubs.1.txt +48 -0
  214. data/man/bundle-binstubs.ronn +15 -1
  215. data/man/bundle-check.1 +31 -0
  216. data/man/bundle-check.1.txt +33 -0
  217. data/man/bundle-check.ronn +26 -0
  218. data/man/bundle-clean.1 +24 -0
  219. data/man/bundle-clean.1.txt +26 -0
  220. data/man/bundle-clean.ronn +18 -0
  221. data/man/bundle-config.1 +497 -0
  222. data/man/bundle-config.1.txt +529 -0
  223. data/man/bundle-config.ronn +233 -61
  224. data/man/bundle-doctor.1 +44 -0
  225. data/man/bundle-doctor.1.txt +44 -0
  226. data/man/bundle-doctor.ronn +33 -0
  227. data/{lib/bundler/man/bundle-exec → man/bundle-exec.1} +6 -3
  228. data/man/bundle-exec.1.txt +178 -0
  229. data/man/bundle-exec.ronn +10 -3
  230. data/{lib/bundler/man/bundle-gem → man/bundle-gem.1} +4 -4
  231. data/man/bundle-gem.1.txt +91 -0
  232. data/man/bundle-gem.ronn +3 -2
  233. data/man/bundle-info.1 +20 -0
  234. data/man/bundle-info.1.txt +21 -0
  235. data/man/bundle-info.ronn +17 -0
  236. data/man/bundle-init.1 +25 -0
  237. data/man/bundle-init.1.txt +34 -0
  238. data/man/bundle-init.ronn +29 -0
  239. data/man/bundle-inject.1 +33 -0
  240. data/man/bundle-inject.1.txt +32 -0
  241. data/man/bundle-inject.ronn +22 -0
  242. data/{lib/bundler/man/bundle-install → man/bundle-install.1} +32 -29
  243. data/man/bundle-install.1.txt +396 -0
  244. data/man/bundle-install.ronn +45 -36
  245. data/man/bundle-list.1 +50 -0
  246. data/man/bundle-list.1.txt +43 -0
  247. data/man/bundle-list.ronn +33 -0
  248. data/{lib/bundler/man/bundle-lock → man/bundle-lock.1} +43 -2
  249. data/man/bundle-lock.1.txt +93 -0
  250. data/man/bundle-lock.ronn +47 -0
  251. data/man/bundle-open.1 +32 -0
  252. data/man/bundle-open.1.txt +29 -0
  253. data/man/bundle-open.ronn +19 -0
  254. data/man/bundle-outdated.1 +155 -0
  255. data/man/bundle-outdated.1.txt +131 -0
  256. data/man/bundle-outdated.ronn +111 -0
  257. data/{lib/bundler/man/bundle-package → man/bundle-package.1} +6 -3
  258. data/man/bundle-package.1.txt +79 -0
  259. data/man/bundle-package.ronn +7 -2
  260. data/{lib/bundler/man/bundle-platform → man/bundle-platform.1} +1 -1
  261. data/man/bundle-platform.1.txt +57 -0
  262. data/man/bundle-pristine.1 +34 -0
  263. data/man/bundle-pristine.1.txt +44 -0
  264. data/man/bundle-pristine.ronn +34 -0
  265. data/man/bundle-remove.1 +31 -0
  266. data/man/bundle-remove.1.txt +34 -0
  267. data/man/bundle-remove.ronn +23 -0
  268. data/man/bundle-show.1 +23 -0
  269. data/man/bundle-show.1.txt +27 -0
  270. data/man/bundle-show.ronn +21 -0
  271. data/man/bundle-update.1 +394 -0
  272. data/man/bundle-update.1.txt +391 -0
  273. data/man/bundle-update.ronn +172 -16
  274. data/man/bundle-viz.1 +39 -0
  275. data/man/bundle-viz.1.txt +39 -0
  276. data/man/bundle-viz.ronn +30 -0
  277. data/{lib/bundler/man/bundle → man/bundle.1} +44 -28
  278. data/man/bundle.1.txt +116 -0
  279. data/man/bundle.ronn +39 -27
  280. data/{lib/bundler/man → man}/gemfile.5 +67 -84
  281. data/man/gemfile.5.ronn +77 -55
  282. data/man/gemfile.5.txt +653 -0
  283. data/man/index.txt +25 -8
  284. metadata +118 -58
  285. data/.codeclimate.yml +0 -25
  286. data/.gitignore +0 -16
  287. data/.rspec +0 -3
  288. data/.rubocop.yml +0 -128
  289. data/.rubocop_todo.yml +0 -248
  290. data/.travis.yml +0 -108
  291. data/CODE_OF_CONDUCT.md +0 -42
  292. data/CONTRIBUTING.md +0 -36
  293. data/DEVELOPMENT.md +0 -148
  294. data/ISSUES.md +0 -100
  295. data/Rakefile +0 -333
  296. data/bin/rake +0 -19
  297. data/bin/rspec +0 -15
  298. data/bin/rubocop +0 -17
  299. data/bin/with_rubygems +0 -39
  300. data/lib/bundler/man/bundle-binstubs.txt +0 -33
  301. data/lib/bundler/man/bundle-config +0 -254
  302. data/lib/bundler/man/bundle-config.txt +0 -282
  303. data/lib/bundler/man/bundle-exec.txt +0 -171
  304. data/lib/bundler/man/bundle-gem.txt +0 -90
  305. data/lib/bundler/man/bundle-install.txt +0 -385
  306. data/lib/bundler/man/bundle-lock.txt +0 -52
  307. data/lib/bundler/man/bundle-package.txt +0 -74
  308. data/lib/bundler/man/bundle-platform.txt +0 -57
  309. data/lib/bundler/man/bundle-update +0 -221
  310. data/lib/bundler/man/bundle-update.txt +0 -227
  311. data/lib/bundler/man/bundle.txt +0 -104
  312. data/lib/bundler/man/gemfile.5.txt +0 -636
  313. data/lib/bundler/postit_trampoline.rb +0 -68
  314. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client.rb +0 -79
  315. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client/cache.rb +0 -112
  316. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client/updater.rb +0 -80
  317. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client/version.rb +0 -4
  318. data/lib/bundler/vendor/postit/lib/postit.rb +0 -15
  319. data/lib/bundler/vendor/postit/lib/postit/environment.rb +0 -44
  320. data/lib/bundler/vendor/postit/lib/postit/installer.rb +0 -28
  321. data/lib/bundler/vendor/postit/lib/postit/parser.rb +0 -21
  322. data/lib/bundler/vendor/postit/lib/postit/setup.rb +0 -12
  323. data/lib/bundler/vendor/postit/lib/postit/version.rb +0 -3
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler
3
4
  class Standalone
4
5
  def initialize(groups, definition)
@@ -1,11 +1,25 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "uri"
3
- require "rubygems/spec_fetcher"
4
4
  require "bundler/match_platform"
5
5
 
6
6
  module Bundler
7
7
  class LazySpecification
8
8
  Identifier = Struct.new(:name, :version, :source, :platform, :dependencies)
9
+ class Identifier
10
+ include Comparable
11
+ def <=>(other)
12
+ return unless other.is_a?(Identifier)
13
+ [name, version, platform_string] <=> [other.name, other.version, other.platform_string]
14
+ end
15
+
16
+ protected
17
+
18
+ def platform_string
19
+ platform_string = platform.to_s
20
+ platform_string == Index::RUBY ? Index::NULL : platform_string
21
+ end
22
+ end
9
23
 
10
24
  include MatchPlatform
11
25
 
@@ -16,7 +30,7 @@ module Bundler
16
30
  @name = name
17
31
  @version = version
18
32
  @dependencies = []
19
- @platform = platform
33
+ @platform = platform || Gem::Platform::RUBY
20
34
  @source = source
21
35
  @specification = nil
22
36
  end
@@ -55,10 +69,19 @@ module Bundler
55
69
  end
56
70
 
57
71
  def __materialize__
72
+ search_object = Bundler.feature_flag.specific_platform? || Bundler.settings[:force_ruby_platform] ? self : Dependency.new(name, version)
58
73
  @specification = if source.is_a?(Source::Gemspec) && source.gemspec.name == name
59
74
  source.gemspec.tap {|s| s.source = source }
60
75
  else
61
- source.specs.search(Gem::Dependency.new(name, version)).last
76
+ search = source.specs.search(search_object).last
77
+ if search && Gem::Platform.new(search.platform) != Gem::Platform.new(platform) && !search.runtime_dependencies.-(dependencies.reject {|d| d.type == :development }).empty?
78
+ Bundler.ui.warn "Unable to use the platform-specific (#{search.platform}) version of #{name} (#{version}) " \
79
+ "because it has different dependencies from the #{platform} version. " \
80
+ "To use the platform-specific version of the gem, run `bundle config specific_platform true` and install again."
81
+ search = source.specs.search(self).last
82
+ end
83
+ search.dependencies = dependencies if search && (search.is_a?(RemoteSpecification) || search.is_a?(EndpointSpecification))
84
+ search
62
85
  end
63
86
  end
64
87
 
@@ -78,6 +101,11 @@ module Bundler
78
101
  @__identifier ||= Identifier.new(name, version, source, platform, dependencies)
79
102
  end
80
103
 
104
+ def git_version
105
+ return unless source.is_a?(Bundler::Source::Git)
106
+ " #{source.revision[0..6]}"
107
+ end
108
+
81
109
  private
82
110
 
83
111
  def to_ary
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class LockfileGenerator
5
+ attr_reader :definition
6
+ attr_reader :out
7
+
8
+ # @private
9
+ def initialize(definition)
10
+ @definition = definition
11
+ @out = String.new
12
+ end
13
+
14
+ def self.generate(definition)
15
+ new(definition).generate!
16
+ end
17
+
18
+ def generate!
19
+ add_sources
20
+ add_platforms
21
+ add_dependencies
22
+ add_locked_ruby_version
23
+ add_bundled_with
24
+
25
+ out
26
+ end
27
+
28
+ private
29
+
30
+ def add_sources
31
+ definition.send(:sources).lock_sources.each_with_index do |source, idx|
32
+ out << "\n" unless idx.zero?
33
+
34
+ # Add the source header
35
+ out << source.to_lock
36
+
37
+ # Find all specs for this source
38
+ specs = definition.resolve.select {|s| source.can_lock?(s) }
39
+ add_specs(specs)
40
+ end
41
+ end
42
+
43
+ def add_specs(specs)
44
+ # This needs to be sorted by full name so that
45
+ # gems with the same name, but different platform
46
+ # are ordered consistently
47
+ specs.sort_by(&:full_name).each do |spec|
48
+ next if spec.name == "bundler".freeze
49
+ out << spec.to_lock
50
+ end
51
+ end
52
+
53
+ def add_platforms
54
+ add_section("PLATFORMS", definition.platforms)
55
+ end
56
+
57
+ def add_dependencies
58
+ out << "\nDEPENDENCIES\n"
59
+
60
+ handled = []
61
+ definition.dependencies.sort_by(&:to_s).each do |dep|
62
+ next if handled.include?(dep.name)
63
+ out << dep.to_lock
64
+ handled << dep.name
65
+ end
66
+ end
67
+
68
+ def add_locked_ruby_version
69
+ return unless locked_ruby_version = definition.locked_ruby_version
70
+ add_section("RUBY VERSION", locked_ruby_version.to_s)
71
+ end
72
+
73
+ def add_bundled_with
74
+ add_section("BUNDLED WITH", definition.locked_bundler_version.to_s)
75
+ end
76
+
77
+ def add_section(name, value)
78
+ out << "\n#{name}\n"
79
+ case value
80
+ when Array
81
+ value.map(&:to_s).sort.each do |val|
82
+ out << " #{val}\n"
83
+ end
84
+ when Hash
85
+ value.to_a.sort_by {|k, _| k.to_s }.each do |key, val|
86
+ out << " #{key}: #{val}\n"
87
+ end
88
+ when String
89
+ out << " #{value}\n"
90
+ else
91
+ raise ArgumentError, "#{value.inspect} can't be serialized in a lockfile"
92
+ end
93
+ end
94
+ end
95
+ end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- require "strscan"
3
2
 
4
3
  # Some versions of the Bundler 1.1 RC series introduced corrupted
5
4
  # lockfiles. There were two major problems:
@@ -62,7 +61,7 @@ module Bundler
62
61
  def initialize(lockfile)
63
62
  @platforms = []
64
63
  @sources = []
65
- @dependencies = []
64
+ @dependencies = {}
66
65
  @state = nil
67
66
  @specs = {}
68
67
 
@@ -91,8 +90,8 @@ module Bundler
91
90
  send("parse_#{@state}", line)
92
91
  end
93
92
  end
94
- @sources << @rubygems_aggregate
95
- @specs = @specs.values
93
+ @sources << @rubygems_aggregate unless Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
94
+ @specs = @specs.values.sort_by(&:identifier)
96
95
  warn_for_outdated_bundler_version
97
96
  rescue ArgumentError => e
98
97
  Bundler.ui.debug(e)
@@ -142,10 +141,16 @@ module Bundler
142
141
  @sources << @current_source
143
142
  end
144
143
  when GEM
145
- Array(@opts["remote"]).each do |url|
146
- @rubygems_aggregate.add_remote(url)
144
+ if Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
145
+ @opts["remotes"] = @opts.delete("remote")
146
+ @current_source = TYPES[@type].from_lock(@opts)
147
+ @sources << @current_source
148
+ else
149
+ Array(@opts["remote"]).each do |url|
150
+ @rubygems_aggregate.add_remote(url)
151
+ end
152
+ @current_source = @rubygems_aggregate
147
153
  end
148
- @current_source = @rubygems_aggregate
149
154
  when PLUGIN
150
155
  @current_source = Plugin.source_from_lock(@opts)
151
156
  @sources << @current_source
@@ -172,43 +177,53 @@ module Bundler
172
177
  end
173
178
  end
174
179
 
175
- NAME_VERSION = '(?! )(.*?)(?: \(([^-]*)(?:-(.*))?\))?'.freeze
176
- NAME_VERSION_2 = /^ {2}#{NAME_VERSION}(!)?$/
177
- NAME_VERSION_4 = /^ {4}#{NAME_VERSION}$/
178
- NAME_VERSION_6 = /^ {6}#{NAME_VERSION}$/
180
+ space = / /
181
+ NAME_VERSION = /
182
+ ^(#{space}{2}|#{space}{4}|#{space}{6})(?!#{space}) # Exactly 2, 4, or 6 spaces at the start of the line
183
+ (.*?) # Name
184
+ (?:#{space}\(([^-]*) # Space, followed by version
185
+ (?:-(.*))?\))? # Optional platform
186
+ (!)? # Optional pinned marker
187
+ $ # Line end
188
+ /xo
179
189
 
180
190
  def parse_dependency(line)
181
- if line =~ NAME_VERSION_2
182
- name = $1
183
- version = $2
184
- pinned = $4
185
- version = version.split(",").map(&:strip) if version
191
+ return unless line =~ NAME_VERSION
192
+ spaces = $1
193
+ return unless spaces.size == 2
194
+ name = $2
195
+ version = $3
196
+ pinned = $5
186
197
 
187
- dep = Bundler::Dependency.new(name, version)
198
+ version = version.split(",").map(&:strip) if version
188
199
 
189
- if pinned && dep.name != "bundler"
190
- spec = @specs.find {|_, v| v.name == dep.name }
191
- dep.source = spec.last.source if spec
200
+ dep = Bundler::Dependency.new(name, version)
192
201
 
193
- # Path sources need to know what the default name / version
194
- # to use in the case that there are no gemspecs present. A fake
195
- # gemspec is created based on the version set on the dependency
196
- # TODO: Use the version from the spec instead of from the dependency
197
- if version && version.size == 1 && version.first =~ /^\s*= (.+)\s*$/ && dep.source.is_a?(Bundler::Source::Path)
198
- dep.source.name = name
199
- dep.source.version = $1
200
- end
201
- end
202
+ if pinned && dep.name != "bundler"
203
+ spec = @specs.find {|_, v| v.name == dep.name }
204
+ dep.source = spec.last.source if spec
202
205
 
203
- @dependencies << dep
206
+ # Path sources need to know what the default name / version
207
+ # to use in the case that there are no gemspecs present. A fake
208
+ # gemspec is created based on the version set on the dependency
209
+ # TODO: Use the version from the spec instead of from the dependency
210
+ if version && version.size == 1 && version.first =~ /^\s*= (.+)\s*$/ && dep.source.is_a?(Bundler::Source::Path)
211
+ dep.source.name = name
212
+ dep.source.version = $1
213
+ end
204
214
  end
215
+
216
+ @dependencies[dep.name] = dep
205
217
  end
206
218
 
207
219
  def parse_spec(line)
208
- if line =~ NAME_VERSION_4
209
- name = $1
210
- version = $2
211
- platform = $3
220
+ return unless line =~ NAME_VERSION
221
+ spaces = $1
222
+ name = $2
223
+ version = $3
224
+ platform = $4
225
+
226
+ if spaces.size == 4
212
227
  version = Gem::Version.new(version)
213
228
  platform = platform ? Gem::Platform.new(platform) : Gem::Platform::RUBY
214
229
  @current_spec = LazySpecification.new(name, version, platform)
@@ -217,9 +232,7 @@ module Bundler
217
232
  # Avoid introducing multiple copies of the same spec (caused by
218
233
  # duplicate GIT sections)
219
234
  @specs[@current_spec.identifier] ||= @current_spec
220
- elsif line =~ NAME_VERSION_6
221
- name = $1
222
- version = $2
235
+ elsif spaces.size == 6
223
236
  version = version.split(",").map(&:strip) if version
224
237
  dep = Gem::Dependency.new(name, version)
225
238
  @current_spec.dependencies << dep
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "bundler/gem_helpers"
3
4
 
4
5
  module Bundler
@@ -6,9 +7,18 @@ module Bundler
6
7
  include GemHelpers
7
8
 
8
9
  def match_platform(p)
9
- Gem::Platform::RUBY == platform ||
10
- platform.nil? || p == platform ||
11
- generic(Gem::Platform.new(platform)) === p
10
+ MatchPlatform.platforms_match?(platform, p)
11
+ end
12
+
13
+ def self.platforms_match?(gemspec_platform, local_platform)
14
+ return true if gemspec_platform.nil?
15
+ return true if Gem::Platform::RUBY == gemspec_platform
16
+ return true if local_platform == gemspec_platform
17
+ gemspec_platform = Gem::Platform.new(gemspec_platform)
18
+ return true if GemHelpers.generic(gemspec_platform) === local_platform
19
+ return true if gemspec_platform === local_platform
20
+
21
+ false
12
22
  end
13
23
  end
14
24
  end
@@ -1,4 +1,7 @@
1
1
  # frozen_string_literal: true
2
+
3
+ require "socket"
4
+
2
5
  module Bundler
3
6
  class Settings
4
7
  # Class used to build the mirror set and then find a mirror for a given URI
@@ -35,7 +38,7 @@ module Bundler
35
38
  mirror = if config.all?
36
39
  @all
37
40
  else
38
- (@mirrors[config.uri] = @mirrors[config.uri] || Mirror.new)
41
+ @mirrors[config.uri] ||= Mirror.new
39
42
  end
40
43
  config.update_mirror(mirror)
41
44
  end
@@ -43,7 +46,9 @@ module Bundler
43
46
  private
44
47
 
45
48
  def fetch_valid_mirror_for(uri)
46
- mirror = (@mirrors[URI(uri.to_s.downcase)] || @mirrors[URI(uri.to_s).host] || Mirror.new(uri)).validate!(@prober)
49
+ downcased = uri.to_s.downcase
50
+ mirror = @mirrors[downcased] || @mirrors[URI(downcased).host] || Mirror.new(uri)
51
+ mirror.validate!(@prober)
47
52
  mirror = Mirror.new(uri) unless mirror.valid?
48
53
  mirror
49
54
  end
@@ -115,7 +120,7 @@ module Bundler
115
120
 
116
121
  def initialize(config_line, value)
117
122
  uri, fallback =
118
- config_line.match(%r{^mirror\.(all|.+?)(\.fallback_timeout)?\/?$}).captures
123
+ config_line.match(%r{\Amirror\.(all|.+?)(\.fallback_timeout)?\/?\z}).captures
119
124
  @fallback = !fallback.nil?
120
125
  @all = false
121
126
  if uri == "all"
@@ -147,7 +152,7 @@ module Bundler
147
152
  socket.connect_nonblock(address)
148
153
  rescue Errno::EINPROGRESS
149
154
  wait_for_writtable_socket(socket, address, timeout)
150
- rescue # Connection failed somehow, again
155
+ rescue RuntimeError # Connection failed somehow, again
151
156
  false
152
157
  end
153
158
  end
@@ -167,7 +172,7 @@ module Bundler
167
172
  socket.connect_nonblock(address)
168
173
  rescue Errno::EISCONN
169
174
  true
170
- rescue # Connection failed
175
+ rescue StandardError # Connection failed
171
176
  false
172
177
  end
173
178
  end
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "bundler/plugin/api"
3
4
 
4
5
  module Bundler
5
6
  module Plugin
6
7
  autoload :DSL, "bundler/plugin/dsl"
8
+ autoload :Events, "bundler/plugin/events"
7
9
  autoload :Index, "bundler/plugin/index"
8
10
  autoload :Installer, "bundler/plugin/installer"
9
11
  autoload :SourceList, "bundler/plugin/source_list"
@@ -37,7 +39,11 @@ module Bundler
37
39
 
38
40
  save_plugins names, specs
39
41
  rescue PluginError => e
40
- specs.values.map {|spec| Bundler.rm_rf(spec.full_gem_path) } if specs
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) }
45
+ end
46
+
41
47
  Bundler.ui.error "Failed to install plugin #{name}: #{e.message}\n #{e.backtrace.join("\n ")}"
42
48
  end
43
49
 
@@ -61,8 +67,10 @@ module Bundler
61
67
  installed_specs = Installer.new.install_definition(definition)
62
68
 
63
69
  save_plugins plugins, installed_specs, builder.inferred_plugins
64
- rescue => e
65
- Bundler.ui.error "Failed to install plugin: #{e.message}\n #{e.backtrace[0]}"
70
+ rescue RuntimeError => e
71
+ unless e.is_a?(GemfileError)
72
+ Bundler.ui.error "Failed to install plugin: #{e.message}\n #{e.backtrace[0]}"
73
+ end
66
74
  raise
67
75
  end
68
76
 
@@ -73,8 +81,8 @@ module Bundler
73
81
 
74
82
  # The directory root for all plugin related data
75
83
  #
76
- # Points to root in app_config_path if ran in an app else points to the one
77
- # in user_bundle_path
84
+ # If run in an app, points to local root, in app_config_path
85
+ # Otherwise, points to global root, in Bundler.user_bundle_path("plugin")
78
86
  def root
79
87
  @root ||= if SharedHelpers.in_bundle?
80
88
  local_root
@@ -89,7 +97,7 @@ module Bundler
89
97
 
90
98
  # The global directory root for all plugin related data
91
99
  def global_root
92
- Bundler.user_bundle_path.join("plugin")
100
+ Bundler.user_bundle_path("plugin")
93
101
  end
94
102
 
95
103
  # The cache directory for plugin stuffs
@@ -148,6 +156,9 @@ module Bundler
148
156
  # To be called via the API to register a hooks and corresponding block that
149
157
  # will be called to handle the hook
150
158
  def add_hook(event, &block)
159
+ unless Events.defined_event?(event)
160
+ raise ArgumentError, "Event '#{event}' not defined in Bundler::Plugin::Events"
161
+ end
151
162
  @hooks_by_event[event.to_s] << block
152
163
  end
153
164
 
@@ -158,7 +169,10 @@ module Bundler
158
169
  #
159
170
  # @param [String] event
160
171
  def hook(event, *args, &arg_blk)
161
- return unless Bundler.settings[:plugins]
172
+ return unless Bundler.feature_flag.plugins?
173
+ unless Events.defined_event?(event)
174
+ raise ArgumentError, "Event '#{event}' not defined in Bundler::Plugin::Events"
175
+ end
162
176
 
163
177
  plugins = index.hook_plugins(event)
164
178
  return unless plugins.any?
@@ -257,7 +271,7 @@ module Bundler
257
271
  load path.join(PLUGIN_FILE_NAME)
258
272
 
259
273
  @loaded_plugin_names << name
260
- rescue => e
274
+ rescue RuntimeError => e
261
275
  Bundler.ui.error "Failed loading plugin #{name}: #{e.message}"
262
276
  raise
263
277
  end