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
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rbconfig"
4
+
5
+ module Bundler
6
+ class CLI::Issue
7
+ def run
8
+ Bundler.ui.info <<-EOS.gsub(/^ {8}/, "")
9
+ Did you find an issue with Bundler? Before filing a new issue,
10
+ be sure to check out these resources:
11
+
12
+ 1. Check out our troubleshooting guide for quick fixes to common issues:
13
+ https://github.com/bundler/bundler/blob/master/doc/TROUBLESHOOTING.md
14
+
15
+ 2. Instructions for common Bundler uses can be found on the documentation
16
+ site: http://bundler.io/
17
+
18
+ 3. Information about each Bundler command can be found in the Bundler
19
+ man pages: http://bundler.io/man/bundle.1.html
20
+
21
+ Hopefully the troubleshooting steps above resolved your problem! If things
22
+ still aren't working the way you expect them to, please let us know so
23
+ that we can diagnose and help fix the problem you're having. Please
24
+ view the Filing Issues guide for more information:
25
+ https://github.com/bundler/bundler/blob/master/doc/contributing/ISSUES.md
26
+
27
+ EOS
28
+
29
+ Bundler.ui.info Bundler::Env.report
30
+
31
+ Bundler.ui.info "\n## Bundle Doctor"
32
+ doctor
33
+ end
34
+
35
+ def doctor
36
+ require "bundler/cli/doctor"
37
+ Bundler::CLI::Doctor.new({}).run
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class CLI::List
5
+ def initialize(options)
6
+ @options = options
7
+ end
8
+
9
+ def run
10
+ raise InvalidOption, "The `--only-group` and `--without-group` options cannot be used together" if @options["only-group"] && @options["without-group"]
11
+
12
+ raise InvalidOption, "The `--name-only` and `--paths` options cannot be used together" if @options["name-only"] && @options[:paths]
13
+
14
+ specs = if @options["only-group"] || @options["without-group"]
15
+ filtered_specs_by_groups
16
+ else
17
+ Bundler.load.specs
18
+ end.reject {|s| s.name == "bundler" }.sort_by(&:name)
19
+
20
+ return Bundler.ui.info "No gems in the Gemfile" if specs.empty?
21
+
22
+ return specs.each {|s| Bundler.ui.info s.name } if @options["name-only"]
23
+ return specs.each {|s| Bundler.ui.info s.full_gem_path } if @options["paths"]
24
+
25
+ Bundler.ui.info "Gems included by the bundle:"
26
+
27
+ specs.each {|s| Bundler.ui.info " * #{s.name} (#{s.version}#{s.git_version})" }
28
+
29
+ Bundler.ui.info "Use `bundle info` to print more detailed information about a gem"
30
+ end
31
+
32
+ private
33
+
34
+ def verify_group_exists(groups)
35
+ raise InvalidOption, "`#{@options["without-group"]}` group could not be found." if @options["without-group"] && !groups.include?(@options["without-group"].to_sym)
36
+
37
+ raise InvalidOption, "`#{@options["only-group"]}` group could not be found." if @options["only-group"] && !groups.include?(@options["only-group"].to_sym)
38
+ end
39
+
40
+ def filtered_specs_by_groups
41
+ definition = Bundler.definition
42
+ groups = definition.groups
43
+
44
+ verify_group_exists(groups)
45
+
46
+ show_groups =
47
+ if @options["without-group"]
48
+ groups.reject {|g| g == @options["without-group"].to_sym }
49
+ elsif @options["only-group"]
50
+ groups.select {|g| g == @options["only-group"].to_sym }
51
+ else
52
+ groups
53
+ end.map(&:to_sym)
54
+
55
+ definition.specs_for(show_groups)
56
+ end
57
+ end
58
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler
3
4
  class CLI::Lock
4
5
  attr_reader :options
@@ -17,14 +18,16 @@ module Bundler
17
18
  ui = Bundler.ui
18
19
  Bundler.ui = UI::Silent.new if print
19
20
 
20
- gems = options[:update]
21
21
  Bundler::Fetcher.disable_endpoint = options["full-index"]
22
22
 
23
- if gems && !gems.empty?
24
- definition = Bundler.definition(:gems => gems)
25
- else
26
- definition = Bundler.definition(true)
23
+ update = options[:update]
24
+ if update.is_a?(Array) # unlocking specific gems
25
+ Bundler::CLI::Common.ensure_all_gems_in_lockfile!(update)
26
+ update = { :gems => update, :lock_shared_dependencies => options[:conservative] }
27
27
  end
28
+ definition = Bundler.definition(update)
29
+
30
+ Bundler::CLI::Common.configure_gem_version_promoter(Bundler.definition, options) if options[:update]
28
31
 
29
32
  options["remove-platform"].each do |platform|
30
33
  definition.remove_platform(platform)
@@ -32,7 +35,7 @@ module Bundler
32
35
 
33
36
  options["add-platform"].each do |platform_string|
34
37
  platform = Gem::Platform.new(platform_string)
35
- if platform.to_a.compact == %w(unknown)
38
+ if platform.to_s == "unknown"
36
39
  Bundler.ui.warn "The platform `#{platform_string}` is unknown to RubyGems " \
37
40
  "and adding it will likely lead to resolution errors"
38
41
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- require "bundler/cli/common"
2
+
3
3
  require "shellwords"
4
4
 
5
5
  module Bundler
@@ -13,10 +13,11 @@ module Bundler
13
13
  def run
14
14
  editor = [ENV["BUNDLER_EDITOR"], ENV["VISUAL"], ENV["EDITOR"]].find {|e| !e.nil? && !e.empty? }
15
15
  return Bundler.ui.info("To open a bundled gem, set $EDITOR or $BUNDLER_EDITOR") unless editor
16
- path = Bundler::CLI::Common.select_spec(name, :regex_match).full_gem_path
16
+ return unless spec = Bundler::CLI::Common.select_spec(name, :regex_match)
17
+ path = spec.full_gem_path
17
18
  Dir.chdir(path) do
18
19
  command = Shellwords.split(editor) + [path]
19
- Bundler.with_clean_env do
20
+ Bundler.with_original_env do
20
21
  system(*command)
21
22
  end || Bundler.ui.info("Could not run '#{command.join(" ")}'")
22
23
  end
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
- require "bundler/cli/common"
3
2
 
4
3
  module Bundler
5
4
  class CLI::Outdated
6
5
  attr_reader :options, :gems
6
+
7
7
  def initialize(options, gems)
8
8
  @options = options
9
9
  @gems = gems
@@ -18,10 +18,14 @@ module Bundler
18
18
  Bundler::CLI::Common.select_spec(gem_name)
19
19
  end
20
20
 
21
- Bundler.definition.validate_ruby!
22
- current_specs = Bundler.ui.silence { Bundler.load.specs }
21
+ Bundler.definition.validate_runtime!
22
+ current_specs = Bundler.ui.silence { Bundler.definition.resolve }
23
23
  current_dependencies = {}
24
- Bundler.ui.silence { Bundler.load.dependencies.each {|dep| current_dependencies[dep.name] = dep } }
24
+ Bundler.ui.silence do
25
+ Bundler.load.dependencies.each do |dep|
26
+ current_dependencies[dep.name] = dep
27
+ end
28
+ end
25
29
 
26
30
  definition = if gems.empty? && sources.empty?
27
31
  # We're doing a full update
@@ -30,7 +34,23 @@ module Bundler
30
34
  Bundler.definition(:gems => gems, :sources => sources)
31
35
  end
32
36
 
33
- definition_resolution = proc { options["local"] ? definition.resolve_with_cache! : definition.resolve_remotely! }
37
+ Bundler::CLI::Common.configure_gem_version_promoter(
38
+ Bundler.definition,
39
+ options
40
+ )
41
+
42
+ # the patch level options imply strict is also true. It wouldn't make
43
+ # sense otherwise.
44
+ strict = options[:strict] ||
45
+ Bundler::CLI::Common.patch_level_options(options).any?
46
+
47
+ filter_options_patch = options.keys &
48
+ %w[filter-major filter-minor filter-patch]
49
+
50
+ definition_resolution = proc do
51
+ options[:local] ? definition.resolve_with_cache! : definition.resolve_remotely!
52
+ end
53
+
34
54
  if options[:parseable]
35
55
  Bundler.ui.silence(&definition_resolution)
36
56
  else
@@ -38,84 +58,180 @@ module Bundler
38
58
  end
39
59
 
40
60
  Bundler.ui.info ""
61
+ outdated_gems_by_groups = {}
62
+ outdated_gems_list = []
41
63
 
42
- out_count = 0
43
64
  # Loop through the current specs
44
- gemfile_specs, dependency_specs = current_specs.partition {|spec| current_dependencies.key? spec.name }
45
- [gemfile_specs.sort_by(&:name), dependency_specs.sort_by(&:name)].flatten.each do |current_spec|
65
+ gemfile_specs, dependency_specs = current_specs.partition do |spec|
66
+ current_dependencies.key? spec.name
67
+ end
68
+
69
+ specs = if options["only-explicit"]
70
+ gemfile_specs
71
+ else
72
+ gemfile_specs + dependency_specs
73
+ end
74
+
75
+ specs.sort_by(&:name).each do |current_spec|
46
76
  next if !gems.empty? && !gems.include?(current_spec.name)
47
77
 
48
78
  dependency = current_dependencies[current_spec.name]
79
+ active_spec = retrieve_active_spec(strict, definition, current_spec)
49
80
 
50
- if options["strict"]
51
- active_spec = definition.specs.detect {|spec| spec.name == current_spec.name && spec.platform == current_spec.platform }
52
- else
53
- active_specs = definition.index[current_spec.name].select {|spec| spec.platform == current_spec.platform }.sort_by(&:version)
54
- if !current_spec.version.prerelease? && !options[:pre] && active_specs.size > 1
55
- active_spec = active_specs.delete_if {|b| b.respond_to?(:version) && b.version.prerelease? }
56
- end
57
- active_spec = active_specs.last
81
+ next if active_spec.nil?
82
+ if filter_options_patch.any?
83
+ update_present = update_present_via_semver_portions(current_spec, active_spec, options)
84
+ next unless update_present
85
+ end
86
+
87
+ gem_outdated = Gem::Version.new(active_spec.version) > Gem::Version.new(current_spec.version)
88
+ next unless gem_outdated || (current_spec.git_version != active_spec.git_version)
89
+ groups = nil
90
+ if dependency && !options[:parseable]
91
+ groups = dependency.groups.join(", ")
92
+ end
58
93
 
59
- if options[:major] || options[:minor] || options[:patch]
60
- update_present = update_present_via_semver_portions(current_spec, active_spec, options)
61
- active_spec = nil unless update_present
94
+ outdated_gems_list << { :active_spec => active_spec,
95
+ :current_spec => current_spec,
96
+ :dependency => dependency,
97
+ :groups => groups }
98
+
99
+ outdated_gems_by_groups[groups] ||= []
100
+ outdated_gems_by_groups[groups] << { :active_spec => active_spec,
101
+ :current_spec => current_spec,
102
+ :dependency => dependency,
103
+ :groups => groups }
104
+ end
105
+
106
+ if outdated_gems_list.empty?
107
+ display_nothing_outdated_message(filter_options_patch)
108
+ else
109
+ unless options[:parseable]
110
+ if options[:pre]
111
+ Bundler.ui.info "Outdated gems included in the bundle (including " \
112
+ "pre-releases):"
113
+ else
114
+ Bundler.ui.info "Outdated gems included in the bundle:"
62
115
  end
63
116
  end
64
117
 
65
- next if active_spec.nil?
118
+ options_include_groups = [:group, :groups].select do |v|
119
+ options.keys.include?(v.to_s)
120
+ end
66
121
 
67
- gem_outdated = Gem::Version.new(active_spec.version) > Gem::Version.new(current_spec.version)
68
- git_outdated = current_spec.git_version != active_spec.git_version
69
- if gem_outdated || git_outdated
70
- unless options[:parseable]
71
- if out_count == 0
72
- if options["pre"]
73
- Bundler.ui.info "Outdated gems included in the bundle (including pre-releases):"
122
+ if options_include_groups.any?
123
+ ordered_groups = outdated_gems_by_groups.keys.compact.sort
124
+ [nil, ordered_groups].flatten.each do |groups|
125
+ gems = outdated_gems_by_groups[groups]
126
+ contains_group = if groups
127
+ groups.split(",").include?(options[:group])
128
+ else
129
+ options[:group] == "group"
130
+ end
131
+
132
+ next if (!options[:groups] && !contains_group) || gems.nil?
133
+
134
+ unless options[:parseable]
135
+ if groups
136
+ Bundler.ui.info "===== Group #{groups} ====="
74
137
  else
75
- Bundler.ui.info "Outdated gems included in the bundle:"
138
+ Bundler.ui.info "===== Without group ====="
76
139
  end
77
140
  end
141
+
142
+ gems.each do |gem|
143
+ print_gem(
144
+ gem[:current_spec],
145
+ gem[:active_spec],
146
+ gem[:dependency],
147
+ groups,
148
+ options_include_groups.any?
149
+ )
150
+ end
151
+ end
152
+ else
153
+ outdated_gems_list.each do |gem|
154
+ print_gem(
155
+ gem[:current_spec],
156
+ gem[:active_spec],
157
+ gem[:dependency],
158
+ gem[:groups],
159
+ options_include_groups.any?
160
+ )
78
161
  end
162
+ end
79
163
 
80
- spec_version = "#{active_spec.version}#{active_spec.git_version}"
81
- current_version = "#{current_spec.version}#{current_spec.git_version}"
82
- dependency_version = %(, requested #{dependency.requirement}) if dependency && dependency.specific?
164
+ exit 1
165
+ end
166
+ end
83
167
 
84
- if dependency && !options[:parseable]
85
- groups = dependency.groups.join(", ")
86
- pl = (dependency.groups.length > 1) ? "s" : ""
87
- groups = " in group#{pl} \"#{groups}\""
88
- end
168
+ private
89
169
 
90
- spec_outdated_info = "#{active_spec.name} (newest #{spec_version}, installed #{current_version}#{dependency_version})"
91
- if options[:parseable]
92
- Bundler.ui.info spec_outdated_info.to_s.rstrip
93
- else
94
- Bundler.ui.info " * #{spec_outdated_info}#{groups}".rstrip
95
- end
170
+ def retrieve_active_spec(strict, definition, current_spec)
171
+ if strict
172
+ active_spec = definition.find_resolved_spec(current_spec)
173
+ else
174
+ active_specs = definition.find_indexed_specs(current_spec)
175
+ if !current_spec.version.prerelease? && !options[:pre] && active_specs.size > 1
176
+ active_specs.delete_if {|b| b.respond_to?(:version) && b.version.prerelease? }
177
+ end
178
+ active_spec = active_specs.last
179
+ end
96
180
 
97
- out_count += 1
181
+ active_spec
182
+ end
183
+
184
+ def display_nothing_outdated_message(filter_options_patch)
185
+ unless options[:parseable]
186
+ if filter_options_patch.any?
187
+ display = filter_options_patch.map do |o|
188
+ o.sub("filter-", "")
189
+ end.join(" or ")
190
+
191
+ Bundler.ui.info "No #{display} updates to display.\n"
192
+ else
193
+ Bundler.ui.info "Bundle up to date!\n"
98
194
  end
99
- Bundler.ui.debug "from #{active_spec.loaded_from}"
195
+ end
196
+ end
197
+
198
+ def print_gem(current_spec, active_spec, dependency, groups, options_include_groups)
199
+ spec_version = "#{active_spec.version}#{active_spec.git_version}"
200
+ spec_version += " (from #{active_spec.loaded_from})" if Bundler.ui.debug? && active_spec.loaded_from
201
+ current_version = "#{current_spec.version}#{current_spec.git_version}"
202
+
203
+ if dependency && dependency.specific?
204
+ dependency_version = %(, requested #{dependency.requirement})
100
205
  end
101
206
 
102
- if out_count.zero?
103
- Bundler.ui.info "Bundle up to date!\n" unless options[:parseable]
207
+ spec_outdated_info = "#{active_spec.name} (newest #{spec_version}, " \
208
+ "installed #{current_version}#{dependency_version})"
209
+
210
+ output_message = if options[:parseable]
211
+ spec_outdated_info.to_s
212
+ elsif options_include_groups || !groups
213
+ " * #{spec_outdated_info}"
104
214
  else
105
- exit 1
215
+ " * #{spec_outdated_info} in groups \"#{groups}\""
106
216
  end
107
- end
108
217
 
109
- private
218
+ Bundler.ui.info output_message.rstrip
219
+ end
110
220
 
111
221
  def check_for_deployment_mode
112
- if Bundler.settings[:frozen]
113
- error_message = "You are trying to check outdated gems in deployment mode. " \
114
- "Run `bundle outdated` elsewhere.\n" \
115
- "\nIf this is a development machine, remove the #{Bundler.default_gemfile} freeze" \
116
- "\nby running `bundle install --no-deployment`."
117
- raise ProductionError, error_message
222
+ return unless Bundler.frozen_bundle?
223
+ suggested_command = if Bundler.settings.locations("frozen")[:global]
224
+ "bundle config --delete frozen"
225
+ elsif Bundler.settings.locations("deployment").keys.&([:global, :local]).any?
226
+ "bundle config --delete deployment"
227
+ else
228
+ "bundle install --no-deployment"
118
229
  end
230
+ raise ProductionError, "You are trying to check outdated gems in " \
231
+ "deployment mode. Run `bundle outdated` elsewhere.\n" \
232
+ "\nIf this is a development machine, remove the " \
233
+ "#{Bundler.default_gemfile} freeze" \
234
+ "\nby running `#{suggested_command}`."
119
235
  end
120
236
 
121
237
  def update_present_via_semver_portions(current_spec, active_spec, options)
@@ -123,16 +239,15 @@ module Bundler
123
239
  active_major = active_spec.version.segments.first
124
240
 
125
241
  update_present = false
242
+ update_present = active_major > current_major if options["filter-major"]
126
243
 
127
- update_present = active_major > current_major if options[:major]
128
-
129
- if !update_present && (options[:minor] || options[:patch]) && current_major == active_major
244
+ if !update_present && (options["filter-minor"] || options["filter-patch"]) && current_major == active_major
130
245
  current_minor = get_version_semver_portion_value(current_spec, 1)
131
246
  active_minor = get_version_semver_portion_value(active_spec, 1)
132
247
 
133
- update_present = active_minor > current_minor if options[:minor]
248
+ update_present = active_minor > current_minor if options["filter-minor"]
134
249
 
135
- if !update_present && options[:patch] && current_minor == active_minor
250
+ if !update_present && options["filter-patch"] && current_minor == active_minor
136
251
  current_patch = get_version_semver_portion_value(current_spec, 2)
137
252
  active_patch = get_version_semver_portion_value(active_spec, 2)
138
253