bundler 1.17.3 → 2.4.19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (383) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +2786 -1256
  3. data/LICENSE.md +18 -19
  4. data/README.md +10 -14
  5. data/bundler.gemspec +13 -33
  6. data/exe/bundle +15 -8
  7. data/exe/bundler +1 -1
  8. data/lib/bundler/.document +1 -0
  9. data/lib/bundler/build_metadata.rb +4 -12
  10. data/lib/bundler/capistrano.rb +4 -4
  11. data/lib/bundler/cli/add.rb +28 -16
  12. data/lib/bundler/cli/binstubs.rb +12 -4
  13. data/lib/bundler/cli/cache.rb +24 -17
  14. data/lib/bundler/cli/check.rb +5 -3
  15. data/lib/bundler/cli/clean.rb +1 -1
  16. data/lib/bundler/cli/common.rb +41 -13
  17. data/lib/bundler/cli/config.rb +170 -86
  18. data/lib/bundler/cli/console.rb +3 -3
  19. data/lib/bundler/cli/doctor.rb +27 -10
  20. data/lib/bundler/cli/exec.rb +8 -25
  21. data/lib/bundler/cli/fund.rb +36 -0
  22. data/lib/bundler/cli/gem.rb +261 -48
  23. data/lib/bundler/cli/info.rb +53 -9
  24. data/lib/bundler/cli/init.rb +7 -3
  25. data/lib/bundler/cli/inject.rb +1 -1
  26. data/lib/bundler/cli/install.rb +39 -67
  27. data/lib/bundler/cli/issue.rb +8 -7
  28. data/lib/bundler/cli/list.rb +19 -11
  29. data/lib/bundler/cli/lock.rb +11 -4
  30. data/lib/bundler/cli/open.rb +14 -9
  31. data/lib/bundler/cli/outdated.rb +153 -122
  32. data/lib/bundler/cli/platform.rb +8 -6
  33. data/lib/bundler/cli/plugin.rb +19 -2
  34. data/lib/bundler/cli/pristine.rb +6 -1
  35. data/lib/bundler/cli/remove.rb +1 -2
  36. data/lib/bundler/cli/show.rb +3 -3
  37. data/lib/bundler/cli/update.rb +49 -18
  38. data/lib/bundler/cli/viz.rb +1 -1
  39. data/lib/bundler/cli.rb +269 -165
  40. data/lib/bundler/compact_index_client/cache.rb +7 -24
  41. data/lib/bundler/compact_index_client/gem_parser.rb +28 -0
  42. data/lib/bundler/compact_index_client/updater.rb +58 -57
  43. data/lib/bundler/compact_index_client.rb +28 -18
  44. data/lib/bundler/constants.rb +1 -1
  45. data/lib/bundler/current_ruby.rb +26 -11
  46. data/lib/bundler/definition.rb +432 -464
  47. data/lib/bundler/dependency.rb +29 -71
  48. data/lib/bundler/deployment.rb +1 -1
  49. data/lib/bundler/digest.rb +71 -0
  50. data/lib/bundler/dsl.rb +85 -117
  51. data/lib/bundler/endpoint_specification.rb +16 -14
  52. data/lib/bundler/env.rb +11 -16
  53. data/lib/bundler/environment_preserver.rb +32 -5
  54. data/lib/bundler/errors.rb +31 -14
  55. data/lib/bundler/feature_flag.rb +12 -33
  56. data/lib/bundler/fetcher/base.rb +7 -9
  57. data/lib/bundler/fetcher/compact_index.rb +47 -40
  58. data/lib/bundler/fetcher/dependency.rb +3 -7
  59. data/lib/bundler/fetcher/downloader.rb +17 -12
  60. data/lib/bundler/fetcher/index.rb +5 -32
  61. data/lib/bundler/fetcher.rb +51 -43
  62. data/lib/bundler/force_platform.rb +18 -0
  63. data/lib/bundler/friendly_errors.rb +49 -54
  64. data/lib/bundler/gem_helper.rb +81 -46
  65. data/lib/bundler/gem_helpers.rb +44 -28
  66. data/lib/bundler/gem_tasks.rb +1 -1
  67. data/lib/bundler/gem_version_promoter.rb +54 -99
  68. data/lib/bundler/graph.rb +5 -5
  69. data/lib/bundler/index.rb +16 -54
  70. data/lib/bundler/injector.rb +51 -17
  71. data/lib/bundler/inline.rb +28 -29
  72. data/lib/bundler/installer/gem_installer.rb +22 -23
  73. data/lib/bundler/installer/parallel_installer.rb +39 -52
  74. data/lib/bundler/installer/standalone.rb +62 -12
  75. data/lib/bundler/installer.rb +47 -98
  76. data/lib/bundler/lazy_specification.rb +88 -52
  77. data/lib/bundler/lockfile_generator.rb +4 -4
  78. data/lib/bundler/lockfile_parser.rb +41 -72
  79. data/{man → lib/bundler/man}/bundle-add.1 +29 -5
  80. data/{man/bundle-add.ronn → lib/bundler/man/bundle-add.1.ronn} +22 -4
  81. data/{man → lib/bundler/man}/bundle-binstubs.1 +6 -4
  82. data/{man/bundle-binstubs.ronn → lib/bundler/man/bundle-binstubs.1.ronn} +3 -5
  83. data/lib/bundler/man/bundle-cache.1 +61 -0
  84. data/{man/bundle-package.ronn → lib/bundler/man/bundle-cache.1.ronn} +24 -17
  85. data/{man → lib/bundler/man}/bundle-check.1 +1 -1
  86. data/{man → lib/bundler/man}/bundle-clean.1 +2 -2
  87. data/{man/bundle-clean.ronn → lib/bundler/man/bundle-clean.1.ronn} +1 -1
  88. data/{man → lib/bundler/man}/bundle-config.1 +78 -63
  89. data/{man/bundle-config.ronn → lib/bundler/man/bundle-config.1.ronn} +96 -88
  90. data/lib/bundler/man/bundle-console.1 +53 -0
  91. data/lib/bundler/man/bundle-console.1.ronn +44 -0
  92. data/{man → lib/bundler/man}/bundle-doctor.1 +1 -1
  93. data/{man → lib/bundler/man}/bundle-exec.1 +6 -6
  94. data/{man/bundle-exec.ronn → lib/bundler/man/bundle-exec.1.ronn} +6 -6
  95. data/lib/bundler/man/bundle-gem.1 +105 -0
  96. data/lib/bundler/man/bundle-gem.1.ronn +117 -0
  97. data/lib/bundler/man/bundle-help.1 +13 -0
  98. data/lib/bundler/man/bundle-help.1.ronn +12 -0
  99. data/{man → lib/bundler/man}/bundle-info.1 +3 -3
  100. data/{man/bundle-info.ronn → lib/bundler/man/bundle-info.1.ronn} +3 -3
  101. data/{man → lib/bundler/man}/bundle-init.1 +6 -2
  102. data/{man/bundle-init.ronn → lib/bundler/man/bundle-init.1.ronn} +3 -1
  103. data/{man → lib/bundler/man}/bundle-inject.1 +5 -2
  104. data/{man/bundle-inject.ronn → lib/bundler/man/bundle-inject.1.ronn} +3 -1
  105. data/{man → lib/bundler/man}/bundle-install.1 +42 -37
  106. data/{man/bundle-install.ronn → lib/bundler/man/bundle-install.1.ronn} +42 -38
  107. data/{man → lib/bundler/man}/bundle-list.1 +7 -7
  108. data/{man/bundle-list.ronn → lib/bundler/man/bundle-list.1.ronn} +6 -6
  109. data/{man → lib/bundler/man}/bundle-lock.1 +1 -1
  110. data/{man → lib/bundler/man}/bundle-open.1 +22 -2
  111. data/{man/bundle-open.ronn → lib/bundler/man/bundle-open.1.ronn} +9 -1
  112. data/{man → lib/bundler/man}/bundle-outdated.1 +15 -18
  113. data/{man/bundle-outdated.ronn → lib/bundler/man/bundle-outdated.1.ronn} +13 -19
  114. data/{man → lib/bundler/man}/bundle-platform.1 +16 -6
  115. data/{man/bundle-platform.ronn → lib/bundler/man/bundle-platform.1.ronn} +14 -7
  116. data/lib/bundler/man/bundle-plugin.1 +81 -0
  117. data/lib/bundler/man/bundle-plugin.1.ronn +59 -0
  118. data/{man → lib/bundler/man}/bundle-pristine.1 +1 -1
  119. data/{man → lib/bundler/man}/bundle-remove.1 +1 -1
  120. data/{man → lib/bundler/man}/bundle-show.1 +1 -1
  121. data/{man → lib/bundler/man}/bundle-update.1 +8 -8
  122. data/{man/bundle-update.ronn → lib/bundler/man/bundle-update.1.ronn} +8 -7
  123. data/lib/bundler/man/bundle-version.1 +35 -0
  124. data/lib/bundler/man/bundle-version.1.ronn +24 -0
  125. data/{man → lib/bundler/man}/bundle-viz.1 +4 -1
  126. data/{man/bundle-viz.ronn → lib/bundler/man/bundle-viz.1.ronn} +2 -0
  127. data/{man → lib/bundler/man}/bundle.1 +17 -12
  128. data/{man/bundle.ronn → lib/bundler/man/bundle.1.ronn} +14 -9
  129. data/{man → lib/bundler/man}/gemfile.5 +139 -92
  130. data/{man → lib/bundler/man}/gemfile.5.ronn +118 -96
  131. data/{man → lib/bundler/man}/index.txt +5 -1
  132. data/lib/bundler/match_metadata.rb +13 -0
  133. data/lib/bundler/match_platform.rb +1 -2
  134. data/lib/bundler/match_remote_metadata.rb +29 -0
  135. data/lib/bundler/mirror.rb +10 -12
  136. data/lib/bundler/plugin/api/source.rb +29 -15
  137. data/lib/bundler/plugin/api.rb +1 -1
  138. data/lib/bundler/plugin/dsl.rb +1 -1
  139. data/lib/bundler/plugin/index.rb +32 -9
  140. data/lib/bundler/plugin/installer/git.rb +0 -4
  141. data/lib/bundler/plugin/installer/rubygems.rb +1 -9
  142. data/lib/bundler/plugin/installer.rb +40 -24
  143. data/lib/bundler/plugin/source_list.rb +5 -1
  144. data/lib/bundler/plugin.rb +103 -43
  145. data/lib/bundler/process_lock.rb +1 -1
  146. data/lib/bundler/remote_specification.rb +12 -9
  147. data/lib/bundler/resolver/base.rb +107 -0
  148. data/lib/bundler/resolver/candidate.rb +94 -0
  149. data/lib/bundler/resolver/incompatibility.rb +15 -0
  150. data/lib/bundler/resolver/package.rb +72 -0
  151. data/lib/bundler/resolver/root.rb +25 -0
  152. data/lib/bundler/resolver/spec_group.rb +49 -73
  153. data/lib/bundler/resolver.rb +355 -301
  154. data/lib/bundler/retry.rb +4 -4
  155. data/lib/bundler/ruby_dsl.rb +7 -1
  156. data/lib/bundler/ruby_version.rb +12 -40
  157. data/lib/bundler/rubygems_ext.rb +237 -92
  158. data/lib/bundler/rubygems_gem_installer.rb +87 -21
  159. data/lib/bundler/rubygems_integration.rb +180 -516
  160. data/lib/bundler/runtime.rb +26 -41
  161. data/lib/bundler/safe_marshal.rb +31 -0
  162. data/lib/bundler/self_manager.rb +168 -0
  163. data/lib/bundler/settings.rb +164 -120
  164. data/lib/bundler/setup.rb +14 -12
  165. data/lib/bundler/shared_helpers.rb +62 -103
  166. data/lib/bundler/similarity_detector.rb +3 -3
  167. data/lib/bundler/source/git/git_proxy.rb +292 -128
  168. data/lib/bundler/source/git.rb +114 -64
  169. data/lib/bundler/source/metadata.rb +9 -9
  170. data/lib/bundler/source/path/installer.rb +11 -32
  171. data/lib/bundler/source/path.rb +29 -18
  172. data/lib/bundler/source/rubygems/remote.rb +3 -4
  173. data/lib/bundler/source/rubygems.rb +181 -208
  174. data/lib/bundler/source/rubygems_aggregate.rb +68 -0
  175. data/lib/bundler/source.rb +31 -11
  176. data/lib/bundler/source_list.rb +108 -67
  177. data/lib/bundler/source_map.rb +71 -0
  178. data/lib/bundler/spec_set.rb +96 -72
  179. data/lib/bundler/stub_specification.rb +45 -37
  180. data/lib/bundler/templates/Executable +3 -5
  181. data/lib/bundler/templates/Executable.bundler +22 -18
  182. data/lib/bundler/templates/Executable.standalone +4 -4
  183. data/lib/bundler/templates/Gemfile +0 -2
  184. data/lib/bundler/templates/newgem/CHANGELOG.md.tt +5 -0
  185. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
  186. data/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
  187. data/lib/bundler/templates/newgem/Gemfile.tt +22 -2
  188. data/lib/bundler/templates/newgem/README.md.tt +13 -15
  189. data/lib/bundler/templates/newgem/Rakefile.tt +43 -5
  190. data/lib/bundler/templates/newgem/bin/console.tt +1 -4
  191. data/lib/bundler/templates/newgem/circleci/config.yml.tt +25 -0
  192. data/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
  193. data/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
  194. data/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
  195. data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +1 -1
  196. data/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
  197. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +37 -0
  198. data/lib/bundler/templates/newgem/gitignore.tt +3 -0
  199. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +18 -0
  200. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
  201. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +4 -2
  202. data/lib/bundler/templates/newgem/newgem.gemspec.tt +37 -41
  203. data/lib/bundler/templates/newgem/rubocop.yml.tt +13 -0
  204. data/lib/bundler/templates/newgem/sig/newgem.rbs.tt +8 -0
  205. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
  206. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -1
  207. data/lib/bundler/templates/newgem/standard.yml.tt +3 -0
  208. data/lib/bundler/templates/newgem/test/minitest/test_helper.rb.tt +6 -0
  209. data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/test_newgem.rb.tt} +3 -1
  210. data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  211. data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  212. data/lib/bundler/ui/rg_proxy.rb +2 -2
  213. data/lib/bundler/ui/shell.rb +39 -20
  214. data/lib/bundler/ui/silent.rb +21 -5
  215. data/lib/bundler/ui.rb +3 -3
  216. data/lib/bundler/uri_credentials_filter.rb +10 -4
  217. data/lib/bundler/uri_normalizer.rb +23 -0
  218. data/lib/bundler/vendor/.document +1 -0
  219. data/lib/bundler/vendor/connection_pool/LICENSE +20 -0
  220. data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +174 -0
  221. data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +3 -0
  222. data/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +56 -0
  223. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +128 -0
  224. data/lib/bundler/vendor/fileutils/LICENSE.txt +22 -0
  225. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1493 -425
  226. data/lib/bundler/vendor/net-http-persistent/README.rdoc +82 -0
  227. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +40 -0
  228. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +53 -0
  229. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +79 -0
  230. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +302 -462
  231. data/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
  232. data/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
  233. data/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
  234. data/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
  235. data/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
  236. data/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
  237. data/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
  238. data/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
  239. data/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
  240. data/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +60 -0
  241. data/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
  242. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
  243. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
  244. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +411 -0
  245. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +248 -0
  246. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
  247. data/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
  248. data/lib/bundler/vendor/thor/LICENSE.md +20 -0
  249. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +1 -1
  250. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +3 -2
  251. data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +7 -17
  252. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +25 -14
  253. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +20 -10
  254. data/lib/bundler/vendor/thor/lib/thor/actions.rb +34 -15
  255. data/lib/bundler/vendor/thor/lib/thor/base.rb +63 -43
  256. data/lib/bundler/vendor/thor/lib/thor/command.rb +21 -14
  257. data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +6 -0
  258. data/lib/bundler/vendor/thor/lib/thor/error.rb +83 -0
  259. data/lib/bundler/vendor/thor/lib/thor/group.rb +3 -3
  260. data/lib/bundler/vendor/thor/lib/thor/invocation.rb +1 -0
  261. data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +1 -1
  262. data/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb +6 -6
  263. data/lib/bundler/vendor/thor/lib/thor/line_editor.rb +2 -2
  264. data/lib/bundler/vendor/thor/lib/thor/nested_context.rb +29 -0
  265. data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +7 -3
  266. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +20 -7
  267. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +40 -6
  268. data/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -4
  269. data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +1 -0
  270. data/lib/bundler/vendor/thor/lib/thor/runner.rb +15 -14
  271. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +88 -13
  272. data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +10 -2
  273. data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +3 -3
  274. data/lib/bundler/vendor/thor/lib/thor/shell.rb +5 -5
  275. data/lib/bundler/vendor/thor/lib/thor/util.rb +18 -2
  276. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  277. data/lib/bundler/vendor/thor/lib/thor.rb +16 -9
  278. data/lib/bundler/vendor/tsort/LICENSE.txt +22 -0
  279. data/lib/bundler/vendor/tsort/lib/tsort.rb +452 -0
  280. data/lib/bundler/vendor/uri/LICENSE.txt +22 -0
  281. data/lib/bundler/vendor/uri/lib/uri/common.rb +729 -0
  282. data/lib/bundler/vendor/uri/lib/uri/file.rb +100 -0
  283. data/lib/bundler/vendor/uri/lib/uri/ftp.rb +267 -0
  284. data/lib/bundler/vendor/uri/lib/uri/generic.rb +1587 -0
  285. data/lib/bundler/vendor/uri/lib/uri/http.rb +125 -0
  286. data/lib/bundler/vendor/uri/lib/uri/https.rb +23 -0
  287. data/lib/bundler/vendor/uri/lib/uri/ldap.rb +261 -0
  288. data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +22 -0
  289. data/lib/bundler/vendor/uri/lib/uri/mailto.rb +293 -0
  290. data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +539 -0
  291. data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +119 -0
  292. data/lib/bundler/vendor/uri/lib/uri/version.rb +6 -0
  293. data/lib/bundler/vendor/uri/lib/uri/ws.rb +83 -0
  294. data/lib/bundler/vendor/uri/lib/uri/wss.rb +23 -0
  295. data/lib/bundler/vendor/uri/lib/uri.rb +104 -0
  296. data/lib/bundler/vendored_fileutils.rb +1 -6
  297. data/lib/bundler/vendored_persistent.rb +2 -39
  298. data/lib/bundler/{vendored_molinillo.rb → vendored_pub_grub.rb} +1 -1
  299. data/lib/bundler/vendored_thor.rb +2 -2
  300. data/lib/bundler/vendored_tsort.rb +4 -0
  301. data/lib/bundler/vendored_uri.rb +4 -0
  302. data/lib/bundler/version.rb +5 -20
  303. data/lib/bundler/vlad.rb +2 -2
  304. data/lib/bundler/worker.rb +26 -15
  305. data/lib/bundler/yaml_serializer.rb +3 -4
  306. data/lib/bundler.rb +285 -190
  307. metadata +157 -218
  308. data/exe/bundle_ruby +0 -60
  309. data/lib/bundler/cli/package.rb +0 -49
  310. data/lib/bundler/compatibility_guard.rb +0 -14
  311. data/lib/bundler/dep_proxy.rb +0 -48
  312. data/lib/bundler/gem_remote_fetcher.rb +0 -43
  313. data/lib/bundler/gemdeps.rb +0 -29
  314. data/lib/bundler/psyched_yaml.rb +0 -37
  315. data/lib/bundler/ssl_certs/certificate_manager.rb +0 -66
  316. data/lib/bundler/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem +0 -21
  317. data/lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem +0 -23
  318. data/lib/bundler/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem +0 -25
  319. data/lib/bundler/templates/gems.rb +0 -8
  320. data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +0 -3
  321. data/lib/bundler/templates/newgem/test/test_helper.rb.tt +0 -4
  322. data/lib/bundler/templates/newgem/travis.yml.tt +0 -7
  323. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +0 -26
  324. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  325. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -81
  326. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
  327. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
  328. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
  329. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
  330. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
  331. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
  332. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
  333. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
  334. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -136
  335. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -223
  336. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +0 -143
  337. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  338. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -101
  339. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
  340. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +0 -837
  341. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
  342. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +0 -58
  343. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -12
  344. data/lib/bundler/vendor/net-http-persistent/lib/net/http/faster.rb +0 -27
  345. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/ssl_reuse.rb +0 -129
  346. data/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +0 -12
  347. data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +0 -129
  348. data/lib/bundler/version_ranges.rb +0 -76
  349. data/man/bundle-add.1.txt +0 -52
  350. data/man/bundle-binstubs.1.txt +0 -48
  351. data/man/bundle-check.1.txt +0 -33
  352. data/man/bundle-clean.1.txt +0 -26
  353. data/man/bundle-config.1.txt +0 -529
  354. data/man/bundle-doctor.1.txt +0 -44
  355. data/man/bundle-exec.1.txt +0 -178
  356. data/man/bundle-gem.1 +0 -80
  357. data/man/bundle-gem.1.txt +0 -91
  358. data/man/bundle-gem.ronn +0 -78
  359. data/man/bundle-info.1.txt +0 -21
  360. data/man/bundle-init.1.txt +0 -34
  361. data/man/bundle-inject.1.txt +0 -32
  362. data/man/bundle-install.1.txt +0 -396
  363. data/man/bundle-list.1.txt +0 -43
  364. data/man/bundle-lock.1.txt +0 -93
  365. data/man/bundle-open.1.txt +0 -29
  366. data/man/bundle-outdated.1.txt +0 -131
  367. data/man/bundle-package.1 +0 -55
  368. data/man/bundle-package.1.txt +0 -79
  369. data/man/bundle-platform.1.txt +0 -57
  370. data/man/bundle-pristine.1.txt +0 -44
  371. data/man/bundle-remove.1.txt +0 -34
  372. data/man/bundle-show.1.txt +0 -27
  373. data/man/bundle-update.1.txt +0 -391
  374. data/man/bundle-viz.1.txt +0 -39
  375. data/man/bundle.1.txt +0 -116
  376. data/man/gemfile.5.txt +0 -653
  377. /data/lib/bundler/{ssl_certs → man}/.document +0 -0
  378. /data/{man/bundle-check.ronn → lib/bundler/man/bundle-check.1.ronn} +0 -0
  379. /data/{man/bundle-doctor.ronn → lib/bundler/man/bundle-doctor.1.ronn} +0 -0
  380. /data/{man/bundle-lock.ronn → lib/bundler/man/bundle-lock.1.ronn} +0 -0
  381. /data/{man/bundle-pristine.ronn → lib/bundler/man/bundle-pristine.1.ronn} +0 -0
  382. /data/{man/bundle-remove.ronn → lib/bundler/man/bundle-remove.1.ronn} +0 -0
  383. /data/{man/bundle-show.ronn → lib/bundler/man/bundle-show.1.ronn} +0 -0
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "uri"
4
-
5
3
  module Bundler
6
4
  module Plugin
7
5
  class API
@@ -37,7 +35,7 @@ module Bundler
37
35
  #
38
36
  # @!attribute [rw] dependency_names
39
37
  # @return [Array<String>] Names of dependencies that the source should
40
- # try to resolve. It is not necessary to use this list intenally. This
38
+ # try to resolve. It is not necessary to use this list internally. This
41
39
  # is present to be compatible with `Definition` and is used by
42
40
  # rubygems source.
43
41
  module Source
@@ -108,7 +106,7 @@ module Bundler
108
106
  def install_path
109
107
  @install_path ||=
110
108
  begin
111
- base_name = File.basename(URI.parse(uri).normalize.path)
109
+ base_name = File.basename(Bundler::URI.parse(uri).normalize.path)
112
110
 
113
111
  gem_install_dir.join("#{base_name}-#{uri_hash[0..11]}")
114
112
  end
@@ -142,6 +140,13 @@ module Bundler
142
140
  end
143
141
  end
144
142
 
143
+ # Set internal representation to fetch the gems/specs locally.
144
+ #
145
+ # When this is called, the source should try to fetch the specs and
146
+ # install from the local system.
147
+ def local!
148
+ end
149
+
145
150
  # Set internal representation to fetch the gems/specs from remote.
146
151
  #
147
152
  # When this is called, the source should try to fetch the specs and
@@ -170,7 +175,7 @@ module Bundler
170
175
  #
171
176
  # This is used by `app_cache_path`
172
177
  def app_cache_dirname
173
- base_name = File.basename(URI.parse(uri).normalize.path)
178
+ base_name = File.basename(Bundler::URI.parse(uri).normalize.path)
174
179
  "#{base_name}-#{uri_hash}"
175
180
  end
176
181
 
@@ -196,7 +201,7 @@ module Bundler
196
201
  # This shall check if two source object represent the same source.
197
202
  #
198
203
  # The comparison shall take place only on the attribute that can be
199
- # inferred from the options passed from Gemfile and not on attibutes
204
+ # inferred from the options passed from Gemfile and not on attributes
200
205
  # that are used to pin down the gem to specific version (e.g. Git
201
206
  # sources should compare on branch and tag but not on commit hash)
202
207
  #
@@ -239,7 +244,21 @@ module Bundler
239
244
  specs.unmet_dependency_names
240
245
  end
241
246
 
247
+ # Used by definition.
248
+ #
242
249
  # Note: Do not override if you don't know what you are doing.
250
+ def spec_names
251
+ specs.spec_names
252
+ end
253
+
254
+ # Used by definition.
255
+ #
256
+ # Note: Do not override if you don't know what you are doing.
257
+ def add_dependency_names(names)
258
+ @dependencies |= Array(names)
259
+ end
260
+
261
+ # NOTE: Do not override if you don't know what you are doing.
243
262
  def can_lock?(spec)
244
263
  spec.source == self
245
264
  end
@@ -262,10 +281,11 @@ module Bundler
262
281
  end
263
282
 
264
283
  def to_s
265
- "plugin source for #{options[:type]} with uri #{uri}"
284
+ "plugin source for #{@type} with uri #{@uri}"
266
285
  end
286
+ alias_method :identifier, :to_s
267
287
 
268
- # Note: Do not override if you don't know what you are doing.
288
+ # NOTE: Do not override if you don't know what you are doing.
269
289
  def include?(other)
270
290
  other == self
271
291
  end
@@ -274,7 +294,7 @@ module Bundler
274
294
  SharedHelpers.digest(:SHA1).hexdigest(uri)
275
295
  end
276
296
 
277
- # Note: Do not override if you don't know what you are doing.
297
+ # NOTE: Do not override if you don't know what you are doing.
278
298
  def gem_install_dir
279
299
  Bundler.install_path
280
300
  end
@@ -288,12 +308,6 @@ module Bundler
288
308
  Bundler.root
289
309
  end
290
310
 
291
- # @private
292
- # Returns true
293
- def bundler_plugin_api_source?
294
- true
295
- end
296
-
297
311
  # @private
298
312
  # This API on source might not be stable, and for now we expect plugins
299
313
  # to download all specs in `#specs`, so we implement the method for
@@ -23,7 +23,7 @@ module Bundler
23
23
  # and hooks).
24
24
  module Plugin
25
25
  class API
26
- autoload :Source, "bundler/plugin/api/source"
26
+ autoload :Source, File.expand_path("api/source", __dir__)
27
27
 
28
28
  # The plugins should declare that they handle a command through this helper.
29
29
  #
@@ -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.
@@ -58,7 +58,10 @@ module Bundler
58
58
  raise SourceConflict.new(name, common) unless common.empty?
59
59
  sources.each {|k| @sources[k] = name }
60
60
 
61
- hooks.each {|e| (@hooks[e] ||= []) << name }
61
+ hooks.each do |event|
62
+ event_hooks = (@hooks[event] ||= []) << name
63
+ event_hooks.uniq!
64
+ end
62
65
 
63
66
  @plugin_paths[name] = path
64
67
  @load_paths[name] = load_paths
@@ -68,6 +71,18 @@ module Bundler
68
71
  raise
69
72
  end
70
73
 
74
+ def unregister_plugin(name)
75
+ @commands.delete_if {|_, v| v == name }
76
+ @sources.delete_if {|_, v| v == name }
77
+ @hooks.each do |hook, names|
78
+ names.delete(name)
79
+ @hooks.delete(hook) if names.empty?
80
+ end
81
+ @plugin_paths.delete(name)
82
+ @load_paths.delete(name)
83
+ save_index
84
+ end
85
+
71
86
  # Path of default index file
72
87
  def index_file
73
88
  Plugin.root.join("index")
@@ -100,6 +115,14 @@ module Bundler
100
115
  @plugin_paths[name]
101
116
  end
102
117
 
118
+ def installed_plugins
119
+ @plugin_paths.keys
120
+ end
121
+
122
+ def plugin_commands(plugin)
123
+ @commands.find_all {|_, n| n == plugin }.map(&:first)
124
+ end
125
+
103
126
  def source?(source)
104
127
  @sources.key? source
105
128
  end
@@ -113,7 +136,7 @@ module Bundler
113
136
  @hooks[event] || []
114
137
  end
115
138
 
116
- private
139
+ private
117
140
 
118
141
  # Reads the index file from the directory and initializes the instance
119
142
  # variables.
@@ -123,12 +146,12 @@ module Bundler
123
146
  # @param [Boolean] is the index file global index
124
147
  def load_index(index_file, global = false)
125
148
  SharedHelpers.filesystem_access(index_file, :read) do |index_f|
126
- valid_file = index_f && index_f.exist? && !index_f.size.zero?
149
+ valid_file = index_f&.exist? && !index_f.size.zero?
127
150
  break unless valid_file
128
151
 
129
152
  data = index_f.read
130
153
 
131
- require "bundler/yaml_serializer"
154
+ require_relative "../yaml_serializer"
132
155
  index = YAMLSerializer.load(data)
133
156
 
134
157
  @commands.merge!(index["commands"])
@@ -144,14 +167,14 @@ module Bundler
144
167
  # to be only String key value pairs)
145
168
  def save_index
146
169
  index = {
147
- "commands" => @commands,
148
- "hooks" => @hooks,
149
- "load_paths" => @load_paths,
170
+ "commands" => @commands,
171
+ "hooks" => @hooks,
172
+ "load_paths" => @load_paths,
150
173
  "plugin_paths" => @plugin_paths,
151
- "sources" => @sources,
174
+ "sources" => @sources,
152
175
  }
153
176
 
154
- require "bundler/yaml_serializer"
177
+ require_relative "../yaml_serializer"
155
178
  SharedHelpers.filesystem_access(index_file) do |index_f|
156
179
  FileUtils.mkdir_p(index_f.dirname)
157
180
  File.open(index_f, "w") {|f| f.puts YAMLSerializer.dump(index) }
@@ -20,10 +20,6 @@ module Bundler
20
20
  end
21
21
  end
22
22
 
23
- def version_message(spec)
24
- "#{spec.name} #{spec.version}"
25
- end
26
-
27
23
  def root
28
24
  Plugin.root
29
25
  end
@@ -4,15 +4,7 @@ module Bundler
4
4
  module Plugin
5
5
  class Installer
6
6
  class Rubygems < Bundler::Source::Rubygems
7
- def version_message(spec)
8
- "#{spec.name} #{spec.version}"
9
- end
10
-
11
- private
12
-
13
- def requires_sudo?
14
- false # Will change on implementation of project level plugins
15
- end
7
+ private
16
8
 
17
9
  def rubygems_dir
18
10
  Plugin.root
@@ -8,18 +8,21 @@ module Bundler
8
8
  # are heavily dependent on the Gemfile.
9
9
  module Plugin
10
10
  class Installer
11
- autoload :Rubygems, "bundler/plugin/installer/rubygems"
12
- autoload :Git, "bundler/plugin/installer/git"
11
+ autoload :Rubygems, File.expand_path("installer/rubygems", __dir__)
12
+ autoload :Git, File.expand_path("installer/git", __dir__)
13
13
 
14
14
  def install(names, options)
15
+ check_sources_consistency!(options)
16
+
15
17
  version = options[:version] || [">= 0"]
16
- Bundler.settings.temporary(:lockfile_uses_separate_rubygems_sources => false, :disable_multisource => false) do
17
- if options[:git]
18
- install_git(names, version, options)
19
- else
20
- sources = options[:source] || Bundler.rubygems.sources
21
- install_rubygems(names, version, sources)
22
- end
18
+
19
+ if options[:git]
20
+ install_git(names, version, options)
21
+ elsif options[:local_git]
22
+ install_local_git(names, version, options)
23
+ else
24
+ sources = options[:source] || Gem.sources
25
+ install_rubygems(names, version, sources)
23
26
  end
24
27
  end
25
28
 
@@ -36,24 +39,26 @@ module Bundler
36
39
  install_from_specs specs
37
40
  end
38
41
 
39
- private
42
+ private
43
+
44
+ def check_sources_consistency!(options)
45
+ if options.key?(:git) && options.key?(:local_git)
46
+ raise InvalidOption, "Remote and local plugin git sources can't be both specified"
47
+ end
48
+ end
40
49
 
41
50
  def install_git(names, version, options)
42
51
  uri = options.delete(:git)
43
52
  options["uri"] = uri
44
53
 
45
- source_list = SourceList.new
46
- source_list.add_git_source(options)
47
-
48
- # To support both sources
49
- if options[:source]
50
- source_list.add_rubygems_source("remotes" => options[:source])
51
- end
54
+ install_all_sources(names, version, options, options[:source])
55
+ end
52
56
 
53
- deps = names.map {|name| Dependency.new name, version }
57
+ def install_local_git(names, version, options)
58
+ uri = options.delete(:local_git)
59
+ options["uri"] = uri
54
60
 
55
- definition = Definition.new(nil, deps, source_list, true)
56
- install_definition(definition)
61
+ install_all_sources(names, version, options, options[:source])
57
62
  end
58
63
 
59
64
  # Installs the plugin from rubygems source and returns the path where the
@@ -65,13 +70,24 @@ module Bundler
65
70
  #
66
71
  # @return [Hash] map of names to the specs of plugins installed
67
72
  def install_rubygems(names, version, sources)
68
- deps = names.map {|name| Dependency.new name, version }
73
+ install_all_sources(names, version, nil, sources)
74
+ end
69
75
 
76
+ def install_all_sources(names, version, git_source_options, rubygems_source)
70
77
  source_list = SourceList.new
71
- source_list.add_rubygems_source("remotes" => sources)
72
78
 
73
- definition = Definition.new(nil, deps, source_list, true)
74
- install_definition(definition)
79
+ source_list.add_git_source(git_source_options) if git_source_options
80
+ Array(rubygems_source).each {|remote| source_list.add_global_rubygems_remote(remote) } if rubygems_source
81
+
82
+ deps = names.map {|name| Dependency.new name, version }
83
+
84
+ Bundler.configure_gem_home_and_path(Plugin.root)
85
+
86
+ Bundler.settings.temporary(:deployment => false, :frozen => false) do
87
+ definition = Definition.new(nil, deps, source_list, true)
88
+
89
+ install_definition(definition)
90
+ end
75
91
  end
76
92
 
77
93
  # Installs the plugins and deps from the provided specs and returns map of
@@ -17,7 +17,11 @@ module Bundler
17
17
  path_sources + git_sources + rubygems_sources + [metadata_source]
18
18
  end
19
19
 
20
- private
20
+ def default_source
21
+ git_sources.first || global_rubygems_source
22
+ end
23
+
24
+ private
21
25
 
22
26
  def rubygems_aggregate_class
23
27
  Plugin::Installer::Rubygems
@@ -1,22 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "bundler/plugin/api"
3
+ require_relative "plugin/api"
4
4
 
5
5
  module Bundler
6
6
  module Plugin
7
- autoload :DSL, "bundler/plugin/dsl"
8
- autoload :Events, "bundler/plugin/events"
9
- autoload :Index, "bundler/plugin/index"
10
- autoload :Installer, "bundler/plugin/installer"
11
- autoload :SourceList, "bundler/plugin/source_list"
7
+ autoload :DSL, File.expand_path("plugin/dsl", __dir__)
8
+ autoload :Events, File.expand_path("plugin/events", __dir__)
9
+ autoload :Index, File.expand_path("plugin/index", __dir__)
10
+ autoload :Installer, File.expand_path("plugin/installer", __dir__)
11
+ autoload :SourceList, File.expand_path("plugin/source_list", __dir__)
12
12
 
13
13
  class MalformattedPlugin < PluginError; end
14
14
  class UndefinedCommandError < PluginError; end
15
15
  class UnknownSourceError < PluginError; end
16
+ class PluginInstallError < PluginError; end
16
17
 
17
- PLUGIN_FILE_NAME = "plugins.rb".freeze
18
+ PLUGIN_FILE_NAME = "plugins.rb"
18
19
 
19
- module_function
20
+ module_function
20
21
 
21
22
  def reset!
22
23
  instance_variables.each {|i| remove_instance_variable(i) }
@@ -35,16 +36,62 @@ module Bundler
35
36
  # @param [Hash] options various parameters as described in description.
36
37
  # Refer to cli/plugin for available options
37
38
  def install(names, options)
39
+ raise InvalidOption, "You cannot specify `--branch` and `--ref` at the same time." if options["branch"] && options["ref"]
40
+
38
41
  specs = Installer.new.install(names, options)
39
42
 
40
43
  save_plugins names, specs
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) }
44
+ rescue PluginError
45
+ specs_to_delete = specs.select {|k, _v| names.include?(k) && !index.commands.values.include?(k) }
46
+ specs_to_delete.each_value {|spec| Bundler.rm_rf(spec.full_gem_path) }
47
+
48
+ raise
49
+ end
50
+
51
+ # Uninstalls plugins by the given names
52
+ #
53
+ # @param [Array<String>] names the names of plugins to be uninstalled
54
+ def uninstall(names, options)
55
+ if names.empty? && !options[:all]
56
+ Bundler.ui.error "No plugins to uninstall. Specify at least 1 plugin to uninstall.\n"\
57
+ "Use --all option to uninstall all the installed plugins."
58
+ return
45
59
  end
46
60
 
47
- Bundler.ui.error "Failed to install plugin #{name}: #{e.message}\n #{e.backtrace.join("\n ")}"
61
+ names = index.installed_plugins if options[:all]
62
+ if names.any?
63
+ names.each do |name|
64
+ if index.installed?(name)
65
+ Bundler.rm_rf(index.plugin_path(name))
66
+ index.unregister_plugin(name)
67
+ Bundler.ui.info "Uninstalled plugin #{name}"
68
+ else
69
+ Bundler.ui.error "Plugin #{name} is not installed \n"
70
+ end
71
+ end
72
+ else
73
+ Bundler.ui.info "No plugins installed"
74
+ end
75
+ end
76
+
77
+ # List installed plugins and commands
78
+ #
79
+ def list
80
+ installed_plugins = index.installed_plugins
81
+ if installed_plugins.any?
82
+ output = String.new
83
+ installed_plugins.each do |plugin|
84
+ output << "#{plugin}\n"
85
+ output << "-----\n"
86
+ index.plugin_commands(plugin).each do |command|
87
+ output << " #{command}\n"
88
+ end
89
+ output << "\n"
90
+ end
91
+ else
92
+ output = "No plugins installed"
93
+ end
94
+ Bundler.ui.info output
48
95
  end
49
96
 
50
97
  # Evaluates the Gemfile with a limited DSL and installs the plugins
@@ -53,20 +100,23 @@ module Bundler
53
100
  # @param [Pathname] gemfile path
54
101
  # @param [Proc] block that can be evaluated for (inline) Gemfile
55
102
  def gemfile_install(gemfile = nil, &inline)
56
- builder = DSL.new
57
- if block_given?
58
- builder.instance_eval(&inline)
59
- else
60
- builder.eval_gemfile(gemfile)
103
+ Bundler.settings.temporary(:frozen => false, :deployment => false) do
104
+ builder = DSL.new
105
+ if block_given?
106
+ builder.instance_eval(&inline)
107
+ else
108
+ builder.eval_gemfile(gemfile)
109
+ end
110
+ builder.check_primary_source_safety
111
+ definition = builder.to_definition(nil, true)
112
+
113
+ return if definition.dependencies.empty?
114
+
115
+ plugins = definition.dependencies.map(&:name).reject {|p| index.installed? p }
116
+ installed_specs = Installer.new.install_definition(definition)
117
+
118
+ save_plugins plugins, installed_specs, builder.inferred_plugins
61
119
  end
62
- definition = builder.to_definition(nil, true)
63
-
64
- return if definition.dependencies.empty?
65
-
66
- plugins = definition.dependencies.map(&:name).reject {|p| index.installed? p }
67
- installed_specs = Installer.new.install_definition(definition)
68
-
69
- save_plugins plugins, installed_specs, builder.inferred_plugins
70
120
  rescue RuntimeError => e
71
121
  unless e.is_a?(GemfileError)
72
122
  Bundler.ui.error "Failed to install plugin: #{e.message}\n #{e.backtrace[0]}"
@@ -116,7 +166,7 @@ module Bundler
116
166
  end
117
167
 
118
168
  # To be called from Cli class to pass the command and argument to
119
- # approriate plugin class
169
+ # appropriate plugin class
120
170
  def exec_command(command, args)
121
171
  raise UndefinedCommandError, "Command `#{command}` not found" unless command? command
122
172
 
@@ -135,7 +185,7 @@ module Bundler
135
185
  !index.source_plugin(name.to_s).nil?
136
186
  end
137
187
 
138
- # @return [Class] that handles the source. The calss includes API::Source
188
+ # @return [Class] that handles the source. The class includes API::Source
139
189
  def source(name)
140
190
  raise UnknownSourceError, "Source #{name} not found" unless source? name
141
191
 
@@ -197,10 +247,11 @@ module Bundler
197
247
  # @param [Array<String>] names of inferred source plugins that can be ignored
198
248
  def save_plugins(plugins, specs, optional_plugins = [])
199
249
  plugins.each do |name|
250
+ next if index.installed?(name)
251
+
200
252
  spec = specs[name]
201
- validate_plugin! Pathname.new(spec.full_gem_path)
202
- installed = register_plugin(name, spec, optional_plugins.include?(name))
203
- Bundler.ui.info "Installed plugin #{name}" if installed
253
+
254
+ save_plugin(name, spec, optional_plugins.include?(name))
204
255
  end
205
256
  end
206
257
 
@@ -215,6 +266,22 @@ module Bundler
215
266
  raise MalformattedPlugin, "#{PLUGIN_FILE_NAME} was not found in the plugin." unless plugin_file.file?
216
267
  end
217
268
 
269
+ # Validates and registers a plugin.
270
+ #
271
+ # @param [String] name the name of the plugin
272
+ # @param [Specification] spec of installed plugin
273
+ # @param [Boolean] optional_plugin, removed if there is conflict with any
274
+ # other plugin (used for default source plugins)
275
+ #
276
+ # @raise [PluginInstallError] if validation or registration raises any error
277
+ def save_plugin(name, spec, optional_plugin = false)
278
+ validate_plugin! Pathname.new(spec.full_gem_path)
279
+ installed = register_plugin(name, spec, optional_plugin)
280
+ Bundler.ui.info "Installed plugin #{name}" if installed
281
+ rescue PluginError => e
282
+ raise PluginInstallError, "Failed to install plugin `#{spec.name}`, due to #{e.class} (#{e.message})"
283
+ end
284
+
218
285
  # Runs the plugins.rb file in an isolated namespace, records the plugin
219
286
  # actions it registers for and then passes the data to index to be stored.
220
287
  #
@@ -234,7 +301,7 @@ module Bundler
234
301
  @hooks_by_event = Hash.new {|h, k| h[k] = [] }
235
302
 
236
303
  load_paths = spec.load_paths
237
- add_to_load_path(load_paths)
304
+ Bundler.rubygems.add_to_load_path(load_paths)
238
305
  path = Pathname.new spec.full_gem_path
239
306
 
240
307
  begin
@@ -261,12 +328,14 @@ module Bundler
261
328
  #
262
329
  # @param [String] name of the plugin
263
330
  def load_plugin(name)
331
+ return unless name && !name.empty?
332
+
264
333
  # Need to ensure before this that plugin root where the rest of gems
265
334
  # are installed to be on load path to support plugin deps. Currently not
266
335
  # done to avoid conflicts
267
336
  path = index.plugin_path(name)
268
337
 
269
- add_to_load_path(index.load_paths(name))
338
+ Bundler.rubygems.add_to_load_path(index.load_paths(name))
270
339
 
271
340
  load path.join(PLUGIN_FILE_NAME)
272
341
 
@@ -276,17 +345,8 @@ module Bundler
276
345
  raise
277
346
  end
278
347
 
279
- def add_to_load_path(load_paths)
280
- if insert_index = Bundler.rubygems.load_path_insert_index
281
- $LOAD_PATH.insert(insert_index, *load_paths)
282
- else
283
- $LOAD_PATH.unshift(*load_paths)
284
- end
285
- end
286
-
287
348
  class << self
288
- private :load_plugin, :register_plugin, :save_plugins, :validate_plugin!,
289
- :add_to_load_path
349
+ private :load_plugin, :register_plugin, :save_plugins, :validate_plugin!
290
350
  end
291
351
  end
292
352
  end
@@ -12,7 +12,7 @@ module Bundler
12
12
  yield
13
13
  f.flock(File::LOCK_UN)
14
14
  end
15
- rescue Errno::EACCES, Errno::ENOLCK, *[SharedHelpers.const_get_safely(:ENOTSUP, Errno)].compact
15
+ rescue Errno::EACCES, Errno::ENOLCK, Errno::ENOTSUP, Errno::EPERM, Errno::EROFS
16
16
  # In the case the user does not have access to
17
17
  # create the lock file or is using NFS where
18
18
  # locks are not available we skip locking.
@@ -1,13 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "uri"
4
-
5
3
  module Bundler
6
4
  # Represents a lazily loaded gem specification, where the full specification
7
5
  # is on the source server in rubygems' "quick" index. The proxy object is to
8
6
  # be seeded with what we're given from the source's abbreviated index - the
9
7
  # full specification will only be fetched when necessary.
10
8
  class RemoteSpecification
9
+ include MatchRemoteMetadata
11
10
  include MatchPlatform
12
11
  include Comparable
13
12
 
@@ -18,7 +17,8 @@ module Bundler
18
17
  def initialize(name, version, platform, spec_fetcher)
19
18
  @name = name
20
19
  @version = Gem::Version.create version
21
- @platform = platform
20
+ @original_platform = platform || Gem::Platform::RUBY
21
+ @platform = Gem::Platform.new(platform)
22
22
  @spec_fetcher = spec_fetcher
23
23
  @dependencies = nil
24
24
  end
@@ -30,10 +30,10 @@ module Bundler
30
30
  end
31
31
 
32
32
  def full_name
33
- if platform == Gem::Platform::RUBY || platform.nil?
33
+ @full_name ||= if @platform == Gem::Platform::RUBY
34
34
  "#{@name}-#{@version}"
35
35
  else
36
- "#{@name}-#{@version}-#{platform}"
36
+ "#{@name}-#{@version}-#{@platform}"
37
37
  end
38
38
  end
39
39
 
@@ -52,6 +52,8 @@ module Bundler
52
52
  # once the remote gem is downloaded, the backend specification will
53
53
  # be swapped out.
54
54
  def __swap__(spec)
55
+ raise APIResponseInvalidDependenciesError unless spec.dependencies.all? {|d| d.is_a?(Gem::Dependency) }
56
+
55
57
  SharedHelpers.ensure_same_dependencies(self, dependencies, spec.dependencies)
56
58
  @_remote_specification = spec
57
59
  end
@@ -78,7 +80,8 @@ module Bundler
78
80
  deps = method_missing(:dependencies)
79
81
 
80
82
  # allow us to handle when the specs dependencies are an array of array of string
81
- # see https://github.com/bundler/bundler/issues/5797
83
+ # in order to delay the crash to `#__swap__` where it results in a friendlier error
84
+ # see https://github.com/rubygems/bundler/issues/5797
82
85
  deps = deps.map {|d| d.is_a?(Gem::Dependency) ? d : Gem::Dependency.new(*d) }
83
86
 
84
87
  deps
@@ -90,16 +93,16 @@ module Bundler
90
93
  " #{source.revision[0..6]}"
91
94
  end
92
95
 
93
- private
96
+ private
94
97
 
95
98
  def to_ary
96
99
  nil
97
100
  end
98
101
 
99
102
  def _remote_specification
100
- @_remote_specification ||= @spec_fetcher.fetch_spec([@name, @version, @platform])
103
+ @_remote_specification ||= @spec_fetcher.fetch_spec([@name, @version, @original_platform])
101
104
  @_remote_specification || raise(GemspecError, "Gemspec data for #{full_name} was" \
102
- " missing from the server! Try installing with `--full-index` as a workaround.")
105
+ " missing from the server!")
103
106
  end
104
107
 
105
108
  def method_missing(method, *args, &blk)