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 CLI::Package
4
5
  attr_reader :options
@@ -9,15 +10,15 @@ module Bundler
9
10
 
10
11
  def run
11
12
  Bundler.ui.level = "error" if options[:quiet]
12
- Bundler.settings[:path] = File.expand_path(options[:path]) if options[:path]
13
- Bundler.settings[:cache_all_platforms] = options["all-platforms"] if options.key?("all-platforms")
14
- Bundler.settings[:cache_path] = options["cache-path"] if options.key?("cache-path")
13
+ Bundler.settings.set_command_option_if_given :path, options[:path]
14
+ Bundler.settings.set_command_option_if_given :cache_all_platforms, options["all-platforms"]
15
+ Bundler.settings.set_command_option_if_given :cache_path, options["cache-path"]
15
16
 
16
17
  setup_cache_all
17
18
  install
18
19
 
19
20
  # TODO: move cache contents here now that all bundles are locked
20
- custom_path = Pathname.new(options[:path]) if options[:path]
21
+ custom_path = Bundler.settings[:path] if options[:path]
21
22
  Bundler.load.cache(custom_path)
22
23
  end
23
24
 
@@ -34,9 +35,11 @@ module Bundler
34
35
  end
35
36
 
36
37
  def setup_cache_all
37
- Bundler.settings[:cache_all] = options[:all] if options.key?("all")
38
+ all = options.fetch(:all, Bundler.feature_flag.cache_command_is_package? || nil)
39
+
40
+ Bundler.settings.set_command_option_if_given :cache_all, all
38
41
 
39
- if Bundler.definition.has_local_dependencies? && !Bundler.settings[:cache_all]
42
+ if Bundler.definition.has_local_dependencies? && !Bundler.feature_flag.cache_all?
40
43
  Bundler.ui.warn "Your Gemfile contains path and git dependencies. If you want " \
41
44
  "to package them as well, please pass the --all flag. This will be the default " \
42
45
  "on Bundler 2.0."
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler
3
4
  class CLI::Platform
4
5
  attr_reader :options
@@ -29,7 +30,7 @@ module Bundler
29
30
  output << "Your Gemfile specifies a Ruby version requirement:\n* #{ruby_version}"
30
31
 
31
32
  begin
32
- Bundler.definition.validate_ruby!
33
+ Bundler.definition.validate_runtime!
33
34
  output << "Your current platform satisfies the Ruby version requirement."
34
35
  rescue RubyVersionMismatch => e
35
36
  output << e.message
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "bundler/vendored_thor"
3
4
  module Bundler
4
5
  class CLI::Plugin < Thor
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class CLI::Pristine
5
+ def initialize(gems)
6
+ @gems = gems
7
+ end
8
+
9
+ def run
10
+ CLI::Common.ensure_all_gems_in_lockfile!(@gems)
11
+ definition = Bundler.definition
12
+ definition.validate_runtime!
13
+ installer = Bundler::Installer.new(Bundler.root, definition)
14
+
15
+ Bundler.load.specs.each do |spec|
16
+ next if spec.name == "bundler" # Source::Rubygems doesn't install bundler
17
+ next if !@gems.empty? && !@gems.include?(spec.name)
18
+
19
+ gem_name = "#{spec.name} (#{spec.version}#{spec.git_version})"
20
+ gem_name += " (#{spec.platform})" if !spec.platform.nil? && spec.platform != Gem::Platform::RUBY
21
+
22
+ case source = spec.source
23
+ when Source::Rubygems
24
+ cached_gem = spec.cache_file
25
+ unless File.exist?(cached_gem)
26
+ Bundler.ui.error("Failed to pristine #{gem_name}. Cached gem #{cached_gem} does not exist.")
27
+ next
28
+ end
29
+
30
+ FileUtils.rm_rf spec.full_gem_path
31
+ when Source::Git
32
+ source.remote!
33
+ if extension_cache_path = source.extension_cache_path(spec)
34
+ FileUtils.rm_rf extension_cache_path
35
+ end
36
+ FileUtils.rm_rf spec.extension_dir if spec.respond_to?(:extension_dir)
37
+ FileUtils.rm_rf spec.full_gem_path
38
+ else
39
+ Bundler.ui.warn("Cannot pristine #{gem_name}. Gem is sourced from local path.")
40
+ next
41
+ end
42
+
43
+ Bundler::GemInstaller.new(spec, installer, false, 0, true).install_from_spec
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class CLI::Remove
5
+ def initialize(gems, options)
6
+ @gems = gems
7
+ @options = options
8
+ end
9
+
10
+ def run
11
+ raise InvalidOption, "Please specify gems to remove." if @gems.empty?
12
+
13
+ Injector.remove(@gems, {})
14
+
15
+ Installer.install(Bundler.root, Bundler.definition) if @options["install"]
16
+ end
17
+ end
18
+ end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- require "bundler/cli/common"
3
2
 
4
3
  module Bundler
5
4
  class CLI::Show
@@ -13,7 +12,7 @@ module Bundler
13
12
 
14
13
  def run
15
14
  Bundler.ui.silence do
16
- Bundler.definition.validate_ruby!
15
+ Bundler.definition.validate_runtime!
17
16
  Bundler.load.lock
18
17
  end
19
18
 
@@ -64,6 +63,7 @@ module Bundler
64
63
  else
65
64
  definition.resolve_with_cache!
66
65
  end
66
+ Bundler.reset!
67
67
  definition.specs
68
68
  end
69
69
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler
3
4
  class CLI::Update
4
5
  attr_reader :options, :gems
@@ -10,12 +11,23 @@ module Bundler
10
11
  def run
11
12
  Bundler.ui.level = "error" if options[:quiet]
12
13
 
13
- Plugin.gemfile_install(Bundler.default_gemfile) if Bundler.settings[:plugins]
14
+ Plugin.gemfile_install(Bundler.default_gemfile) if Bundler.feature_flag.plugins?
14
15
 
15
16
  sources = Array(options[:source])
16
17
  groups = Array(options[:group]).map(&:to_sym)
17
18
 
18
- if gems.empty? && sources.empty? && groups.empty? && !options[:ruby] && !options[:bundler]
19
+ full_update = gems.empty? && sources.empty? && groups.empty? && !options[:ruby] && !options[:bundler]
20
+
21
+ if full_update && !options[:all]
22
+ if Bundler.feature_flag.update_requires_all_flag?
23
+ raise InvalidOption, "To update everything, pass the `--all` flag."
24
+ end
25
+ SharedHelpers.major_deprecation 2, "Pass --all to `bundle update` to update everything"
26
+ elsif !full_update && options[:all]
27
+ raise InvalidOption, "Cannot specify --all along with specific options."
28
+ end
29
+
30
+ if full_update
19
31
  # We're doing a full update
20
32
  Bundler.definition(true)
21
33
  else
@@ -23,28 +35,19 @@ module Bundler
23
35
  raise GemfileLockNotFound, "This Bundle hasn't been installed yet. " \
24
36
  "Run `bundle install` to update and install the bundled gems."
25
37
  end
26
- # cycle through the requested gems, to make sure they exist
27
- names = Bundler.locked_gems.specs.map(&:name)
28
- gems.each do |g|
29
- next if names.include?(g)
30
- require "bundler/cli/common"
31
- raise GemNotFound, Bundler::CLI::Common.gem_not_found_message(g, names)
32
- end
38
+ Bundler::CLI::Common.ensure_all_gems_in_lockfile!(gems)
33
39
 
34
40
  if groups.any?
35
- specs = Bundler.definition.specs_for groups
36
- gems.concat(specs.map(&:name))
41
+ deps = Bundler.definition.dependencies.select {|d| (d.groups & groups).any? }
42
+ gems.concat(deps.map(&:name))
37
43
  end
38
44
 
39
- Bundler.definition(:gems => gems, :sources => sources, :ruby => options[:ruby])
45
+ Bundler.definition(:gems => gems, :sources => sources, :ruby => options[:ruby],
46
+ :lock_shared_dependencies => options[:conservative],
47
+ :bundler => options[:bundler])
40
48
  end
41
49
 
42
- patch_level = [:major, :minor, :patch].select {|v| options.keys.include?(v.to_s) }
43
- raise ProductionError, "Provide only one of the following options: #{patch_level.join(", ")}" unless patch_level.length <= 1
44
- Bundler.definition.gem_version_promoter.tap do |gvp|
45
- gvp.level = patch_level.first || :major
46
- gvp.strict = options[:strict]
47
- end
50
+ Bundler::CLI::Common.configure_gem_version_promoter(Bundler.definition, options)
48
51
 
49
52
  Bundler::Fetcher.disable_endpoint = options["full-index"]
50
53
 
@@ -52,30 +55,37 @@ module Bundler
52
55
  opts["update"] = true
53
56
  opts["local"] = options[:local]
54
57
 
55
- Bundler.settings[:jobs] = opts["jobs"] if opts["jobs"]
58
+ Bundler.settings.set_command_option_if_given :jobs, opts["jobs"]
56
59
 
57
- # rubygems plugins sometimes hook into the gem install process
58
- Gem.load_env_plugins if Gem.respond_to?(:load_env_plugins)
59
-
60
- Bundler.definition.validate_ruby!
61
- Installer.install Bundler.root, Bundler.definition, opts
60
+ Bundler.definition.validate_runtime!
61
+ installer = Installer.install Bundler.root, Bundler.definition, opts
62
62
  Bundler.load.cache if Bundler.app_cache.exist?
63
63
 
64
- if Bundler.settings[:clean] && Bundler.settings[:path]
64
+ if CLI::Common.clean_after_install?
65
65
  require "bundler/cli/clean"
66
66
  Bundler::CLI::Clean.new(options).run
67
67
  end
68
68
 
69
- Bundler.ui.confirm "Bundle updated!"
70
- without_groups_messages
71
- end
72
-
73
- private
69
+ if locked_gems = Bundler.definition.locked_gems
70
+ gems.each do |name|
71
+ locked_version = locked_gems.specs.find {|s| s.name == name }
72
+ locked_version &&= locked_version.version
73
+ next unless locked_version
74
+ new_version = Bundler.definition.specs[name].first
75
+ new_version &&= new_version.version
76
+ if !new_version
77
+ Bundler.ui.warn "Bundler attempted to update #{name} but it was removed from the bundle"
78
+ elsif new_version < locked_version
79
+ Bundler.ui.warn "Note: #{name} version regressed from #{locked_version} to #{new_version}"
80
+ elsif new_version == locked_version
81
+ Bundler.ui.warn "Bundler attempted to update #{name} but its version stayed the same"
82
+ end
83
+ end
84
+ end
74
85
 
75
- def without_groups_messages
76
- return unless Bundler.settings.without.any?
77
- require "bundler/cli/common"
78
- Bundler.ui.confirm Bundler::CLI::Common.without_groups_message
86
+ Bundler.ui.confirm "Bundle updated!"
87
+ Bundler::CLI::Common.output_without_groups_message
88
+ Bundler::CLI::Common.output_post_install_messages installer.post_install_messages
79
89
  end
80
90
  end
81
91
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler
3
4
  class CLI::Viz
4
5
  attr_reader :options, :gem_name
@@ -7,6 +8,9 @@ module Bundler
7
8
  end
8
9
 
9
10
  def run
11
+ # make sure we get the right `graphviz`. There is also a `graphviz`
12
+ # gem we're not built to support
13
+ gem "ruby-graphviz"
10
14
  require "graphviz"
11
15
 
12
16
  options[:without] = options[:without].join(":").tr(" ", ":").split(":")
@@ -21,7 +25,7 @@ module Bundler
21
25
  rescue StandardError => e
22
26
  raise unless e.message =~ /GraphViz not installed or dot not in PATH/
23
27
  Bundler.ui.error e.message
24
- Bundler.ui.warn "Please install GraphViz. On a Mac with homebrew, you can run `brew install graphviz`."
28
+ Bundler.ui.warn "Please install GraphViz. On a Mac with Homebrew, you can run `brew install graphviz`."
25
29
  end
26
30
  end
27
31
  end
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pathname"
4
+ require "set"
5
+
6
+ module Bundler
7
+ class CompactIndexClient
8
+ DEBUG_MUTEX = Mutex.new
9
+ def self.debug
10
+ return unless ENV["DEBUG_COMPACT_INDEX"]
11
+ DEBUG_MUTEX.synchronize { warn("[#{self}] #{yield}") }
12
+ end
13
+
14
+ class Error < StandardError; end
15
+
16
+ require "bundler/compact_index_client/cache"
17
+ require "bundler/compact_index_client/updater"
18
+
19
+ attr_reader :directory
20
+
21
+ # @return [Lambda] A lambda that takes an array of inputs and a block, and
22
+ # maps the inputs with the block in parallel.
23
+ #
24
+ attr_accessor :in_parallel
25
+
26
+ def initialize(directory, fetcher)
27
+ @directory = Pathname.new(directory)
28
+ @updater = Updater.new(fetcher)
29
+ @cache = Cache.new(@directory)
30
+ @endpoints = Set.new
31
+ @info_checksums_by_name = {}
32
+ @parsed_checksums = false
33
+ @mutex = Mutex.new
34
+ @in_parallel = lambda do |inputs, &blk|
35
+ inputs.map(&blk)
36
+ end
37
+ end
38
+
39
+ def names
40
+ Bundler::CompactIndexClient.debug { "/names" }
41
+ update(@cache.names_path, "names")
42
+ @cache.names
43
+ end
44
+
45
+ def versions
46
+ Bundler::CompactIndexClient.debug { "/versions" }
47
+ update(@cache.versions_path, "versions")
48
+ versions, @info_checksums_by_name = @cache.versions
49
+ versions
50
+ end
51
+
52
+ def dependencies(names)
53
+ Bundler::CompactIndexClient.debug { "dependencies(#{names})" }
54
+ in_parallel.call(names) do |name|
55
+ update_info(name)
56
+ @cache.dependencies(name).map {|d| d.unshift(name) }
57
+ end.flatten(1)
58
+ end
59
+
60
+ def spec(name, version, platform = nil)
61
+ Bundler::CompactIndexClient.debug { "spec(name = #{name}, version = #{version}, platform = #{platform})" }
62
+ update_info(name)
63
+ @cache.specific_dependency(name, version, platform)
64
+ end
65
+
66
+ def update_and_parse_checksums!
67
+ Bundler::CompactIndexClient.debug { "update_and_parse_checksums!" }
68
+ return @info_checksums_by_name if @parsed_checksums
69
+ update(@cache.versions_path, "versions")
70
+ @info_checksums_by_name = @cache.checksums
71
+ @parsed_checksums = true
72
+ end
73
+
74
+ private
75
+
76
+ def update(local_path, remote_path)
77
+ Bundler::CompactIndexClient.debug { "update(#{local_path}, #{remote_path})" }
78
+ unless synchronize { @endpoints.add?(remote_path) }
79
+ Bundler::CompactIndexClient.debug { "already fetched #{remote_path}" }
80
+ return
81
+ end
82
+ @updater.update(local_path, url(remote_path))
83
+ end
84
+
85
+ def update_info(name)
86
+ Bundler::CompactIndexClient.debug { "update_info(#{name})" }
87
+ path = @cache.info_path(name)
88
+ checksum = @updater.checksum_for_file(path)
89
+ unless existing = @info_checksums_by_name[name]
90
+ Bundler::CompactIndexClient.debug { "skipping updating info for #{name} since it is missing from versions" }
91
+ return
92
+ end
93
+ if checksum == existing
94
+ Bundler::CompactIndexClient.debug { "skipping updating info for #{name} since the versions checksum matches the local checksum" }
95
+ return
96
+ end
97
+ Bundler::CompactIndexClient.debug { "updating info for #{name} since the versions checksum #{existing} != the local checksum #{checksum}" }
98
+ update(path, "info/#{name}")
99
+ end
100
+
101
+ def url(path)
102
+ path
103
+ end
104
+
105
+ def synchronize
106
+ @mutex.synchronize { yield }
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class CompactIndexClient
5
+ class Cache
6
+ attr_reader :directory
7
+
8
+ def initialize(directory)
9
+ @directory = Pathname.new(directory).expand_path
10
+ info_roots.each do |dir|
11
+ SharedHelpers.filesystem_access(dir) do
12
+ FileUtils.mkdir_p(dir)
13
+ end
14
+ end
15
+ end
16
+
17
+ def names
18
+ lines(names_path)
19
+ end
20
+
21
+ def names_path
22
+ directory.join("names")
23
+ end
24
+
25
+ def versions
26
+ versions_by_name = Hash.new {|hash, key| hash[key] = [] }
27
+ info_checksums_by_name = {}
28
+
29
+ lines(versions_path).each do |line|
30
+ name, versions_string, info_checksum = line.split(" ", 3)
31
+ info_checksums_by_name[name] = info_checksum || ""
32
+ versions_string.split(",").each do |version|
33
+ if version.start_with?("-")
34
+ version = version[1..-1].split("-", 2).unshift(name)
35
+ versions_by_name[name].delete(version)
36
+ else
37
+ version = version.split("-", 2).unshift(name)
38
+ versions_by_name[name] << version
39
+ end
40
+ end
41
+ end
42
+
43
+ [versions_by_name, info_checksums_by_name]
44
+ end
45
+
46
+ def versions_path
47
+ directory.join("versions")
48
+ end
49
+
50
+ def checksums
51
+ checksums = {}
52
+
53
+ lines(versions_path).each do |line|
54
+ name, _, checksum = line.split(" ", 3)
55
+ checksums[name] = checksum
56
+ end
57
+
58
+ checksums
59
+ end
60
+
61
+ def dependencies(name)
62
+ lines(info_path(name)).map do |line|
63
+ parse_gem(line)
64
+ end
65
+ end
66
+
67
+ def info_path(name)
68
+ name = name.to_s
69
+ if name =~ /[^a-z0-9_-]/
70
+ name += "-#{SharedHelpers.digest(:MD5).hexdigest(name).downcase}"
71
+ info_roots.last.join(name)
72
+ else
73
+ info_roots.first.join(name)
74
+ end
75
+ end
76
+
77
+ def specific_dependency(name, version, platform)
78
+ pattern = [version, platform].compact.join("-")
79
+ return nil if pattern.empty?
80
+
81
+ gem_lines = info_path(name).read
82
+ gem_line = gem_lines[/^#{Regexp.escape(pattern)}\b.*/, 0]
83
+ gem_line ? parse_gem(gem_line) : nil
84
+ end
85
+
86
+ private
87
+
88
+ def lines(path)
89
+ return [] unless path.file?
90
+ lines = SharedHelpers.filesystem_access(path, :read, &:read).split("\n")
91
+ header = lines.index("---")
92
+ header ? lines[header + 1..-1] : lines
93
+ end
94
+
95
+ def parse_gem(string)
96
+ version_and_platform, rest = string.split(" ", 2)
97
+ version, platform = version_and_platform.split("-", 2)
98
+ dependencies, requirements = rest.split("|", 2).map {|s| s.split(",") } if rest
99
+ dependencies = dependencies ? dependencies.map {|d| parse_dependency(d) } : []
100
+ requirements = requirements ? requirements.map {|r| parse_dependency(r) } : []
101
+ [version, platform, dependencies, requirements]
102
+ end
103
+
104
+ def parse_dependency(string)
105
+ dependency = string.split(":")
106
+ dependency[-1] = dependency[-1].split("&") if dependency.size > 1
107
+ dependency
108
+ end
109
+
110
+ def info_roots
111
+ [
112
+ directory.join("info"),
113
+ directory.join("info-special-characters"),
114
+ ]
115
+ end
116
+ end
117
+ end
118
+ end