bundler 1.15.1 → 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 (294) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +320 -0
  3. data/README.md +17 -8
  4. data/bundler.gemspec +25 -9
  5. data/exe/bundle +1 -6
  6. data/exe/bundle_ruby +4 -3
  7. data/lib/bundler/build_metadata.rb +53 -0
  8. data/lib/bundler/capistrano.rb +5 -0
  9. data/lib/bundler/cli/add.rb +15 -6
  10. data/lib/bundler/cli/binstubs.rb +17 -9
  11. data/lib/bundler/cli/cache.rb +5 -4
  12. data/lib/bundler/cli/check.rb +3 -5
  13. data/lib/bundler/cli/clean.rb +5 -6
  14. data/lib/bundler/cli/common.rb +11 -2
  15. data/lib/bundler/cli/config.rb +2 -1
  16. data/lib/bundler/cli/console.rb +2 -1
  17. data/lib/bundler/cli/doctor.rb +48 -1
  18. data/lib/bundler/cli/exec.rb +6 -5
  19. data/lib/bundler/cli/gem.rb +13 -8
  20. data/lib/bundler/cli/info.rb +0 -1
  21. data/lib/bundler/cli/init.rb +18 -6
  22. data/lib/bundler/cli/inject.rb +1 -0
  23. data/lib/bundler/cli/install.rb +64 -77
  24. data/lib/bundler/cli/issue.rb +1 -1
  25. data/lib/bundler/cli/list.rb +58 -0
  26. data/lib/bundler/cli/lock.rb +0 -1
  27. data/lib/bundler/cli/open.rb +2 -2
  28. data/lib/bundler/cli/outdated.rb +20 -9
  29. data/lib/bundler/cli/package.rb +9 -6
  30. data/lib/bundler/cli/platform.rb +1 -0
  31. data/lib/bundler/cli/plugin.rb +1 -0
  32. data/lib/bundler/cli/pristine.rb +20 -6
  33. data/lib/bundler/cli/remove.rb +18 -0
  34. data/lib/bundler/cli/show.rb +0 -1
  35. data/lib/bundler/cli/update.rb +35 -7
  36. data/lib/bundler/cli/viz.rb +4 -0
  37. data/lib/bundler/cli.rb +234 -90
  38. data/lib/bundler/compact_index_client/cache.rb +1 -2
  39. data/lib/bundler/compact_index_client/updater.rb +35 -7
  40. data/lib/bundler/compact_index_client.rb +1 -0
  41. data/lib/bundler/compatibility_guard.rb +14 -0
  42. data/lib/bundler/constants.rb +1 -0
  43. data/lib/bundler/current_ruby.rb +13 -5
  44. data/lib/bundler/definition.rb +192 -139
  45. data/lib/bundler/dep_proxy.rb +3 -1
  46. data/lib/bundler/dependency.rb +9 -9
  47. data/lib/bundler/deployment.rb +1 -1
  48. data/lib/bundler/deprecate.rb +15 -3
  49. data/lib/bundler/dsl.rb +115 -64
  50. data/lib/bundler/endpoint_specification.rb +10 -1
  51. data/lib/bundler/env.rb +90 -29
  52. data/lib/bundler/environment_preserver.rb +27 -6
  53. data/lib/bundler/errors.rb +1 -0
  54. data/lib/bundler/feature_flag.rb +46 -4
  55. data/lib/bundler/fetcher/base.rb +1 -0
  56. data/lib/bundler/fetcher/compact_index.rb +2 -11
  57. data/lib/bundler/fetcher/dependency.rb +2 -1
  58. data/lib/bundler/fetcher/downloader.rb +11 -5
  59. data/lib/bundler/fetcher/index.rb +3 -2
  60. data/lib/bundler/fetcher.rb +18 -11
  61. data/lib/bundler/friendly_errors.rb +6 -1
  62. data/lib/bundler/gem_helper.rb +19 -10
  63. data/lib/bundler/gem_helpers.rb +1 -0
  64. data/lib/bundler/gem_remote_fetcher.rb +1 -0
  65. data/lib/bundler/gem_tasks.rb +1 -0
  66. data/lib/bundler/gem_version_promoter.rb +17 -2
  67. data/lib/bundler/gemdeps.rb +1 -0
  68. data/lib/bundler/graph.rb +1 -0
  69. data/lib/bundler/index.rb +8 -8
  70. data/lib/bundler/injector.rb +192 -30
  71. data/lib/bundler/inline.rb +10 -10
  72. data/lib/bundler/installer/gem_installer.rb +12 -2
  73. data/lib/bundler/installer/parallel_installer.rb +78 -42
  74. data/lib/bundler/installer/standalone.rb +1 -0
  75. data/lib/bundler/installer.rb +138 -53
  76. data/lib/bundler/lazy_specification.rb +3 -2
  77. data/lib/bundler/lockfile_generator.rb +95 -0
  78. data/lib/bundler/lockfile_parser.rb +10 -4
  79. data/lib/bundler/match_platform.rb +1 -0
  80. data/lib/bundler/mirror.rb +8 -5
  81. data/lib/bundler/plugin/api/source.rb +9 -2
  82. data/lib/bundler/plugin/events.rb +61 -0
  83. data/lib/bundler/plugin/index.rb +7 -2
  84. data/lib/bundler/plugin/installer.rb +7 -6
  85. data/lib/bundler/plugin/source_list.rb +7 -8
  86. data/lib/bundler/plugin.rb +13 -5
  87. data/lib/bundler/process_lock.rb +24 -0
  88. data/lib/bundler/psyched_yaml.rb +10 -0
  89. data/lib/bundler/remote_specification.rb +10 -1
  90. data/lib/bundler/resolver/spec_group.rb +106 -0
  91. data/lib/bundler/resolver.rb +158 -195
  92. data/lib/bundler/retry.rb +1 -0
  93. data/lib/bundler/ruby_dsl.rb +1 -0
  94. data/lib/bundler/ruby_version.rb +2 -1
  95. data/lib/bundler/rubygems_ext.rb +5 -4
  96. data/lib/bundler/rubygems_gem_installer.rb +31 -1
  97. data/lib/bundler/rubygems_integration.rb +71 -32
  98. data/lib/bundler/runtime.rb +11 -9
  99. data/lib/bundler/settings/validator.rb +102 -0
  100. data/lib/bundler/settings.rb +213 -86
  101. data/lib/bundler/setup.rb +4 -7
  102. data/lib/bundler/shared_helpers.rb +131 -26
  103. data/lib/bundler/similarity_detector.rb +1 -0
  104. data/lib/bundler/source/gemspec.rb +1 -0
  105. data/lib/bundler/source/git/git_proxy.rb +21 -11
  106. data/lib/bundler/source/git.rb +24 -19
  107. data/lib/bundler/source/metadata.rb +62 -0
  108. data/lib/bundler/source/path/installer.rb +2 -0
  109. data/lib/bundler/source/path.rb +11 -7
  110. data/lib/bundler/source/rubygems/remote.rb +8 -2
  111. data/lib/bundler/source/rubygems.rb +161 -84
  112. data/lib/bundler/source.rb +36 -0
  113. data/lib/bundler/source_list.rb +75 -15
  114. data/lib/bundler/spec_set.rb +12 -6
  115. data/lib/bundler/ssl_certs/certificate_manager.rb +2 -1
  116. data/lib/bundler/stub_specification.rb +1 -0
  117. data/lib/bundler/templates/.document +1 -0
  118. data/lib/bundler/templates/Executable +12 -0
  119. data/lib/bundler/templates/Executable.bundler +105 -0
  120. data/lib/bundler/templates/Gemfile +3 -0
  121. data/lib/bundler/templates/gems.rb +8 -0
  122. data/lib/bundler/templates/newgem/Gemfile.tt +2 -0
  123. data/lib/bundler/templates/newgem/README.md.tt +1 -1
  124. data/lib/bundler/templates/newgem/gitignore.tt +0 -1
  125. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +1 -0
  126. data/lib/bundler/templates/newgem/newgem.gemspec.tt +12 -3
  127. data/lib/bundler/templates/newgem/rspec.tt +1 -0
  128. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +0 -2
  129. data/lib/bundler/templates/newgem/{.travis.yml.tt → travis.yml.tt} +2 -0
  130. data/lib/bundler/ui/rg_proxy.rb +1 -0
  131. data/lib/bundler/ui/shell.rb +17 -4
  132. data/lib/bundler/ui/silent.rb +1 -0
  133. data/lib/bundler/ui.rb +1 -0
  134. data/lib/bundler/uri_credentials_filter.rb +1 -0
  135. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1638 -0
  136. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +26 -0
  137. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +7 -0
  138. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +1 -0
  139. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +1 -0
  140. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +1 -0
  141. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -0
  142. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -0
  143. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -0
  144. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +1 -0
  145. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -0
  146. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +1 -0
  147. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +15 -4
  148. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +3 -2
  149. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +75 -7
  150. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +2 -1
  151. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +1 -0
  152. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +3 -1
  153. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +491 -148
  154. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +1 -0
  155. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +8 -4
  156. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +2 -0
  157. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +3 -1
  158. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +1 -0
  159. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +1 -0
  160. data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +9 -1
  161. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +45 -8
  162. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +9 -3
  163. data/lib/bundler/vendor/thor/lib/thor/actions.rb +6 -3
  164. data/lib/bundler/vendor/thor/lib/thor/base.rb +27 -4
  165. data/lib/bundler/vendor/thor/lib/thor/command.rb +9 -7
  166. data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +12 -0
  167. data/lib/bundler/vendor/thor/lib/thor/group.rb +1 -1
  168. data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +2 -0
  169. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +5 -5
  170. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +6 -5
  171. data/lib/bundler/vendor/thor/lib/thor/runner.rb +6 -4
  172. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +10 -9
  173. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  174. data/lib/bundler/vendor/thor/lib/thor.rb +25 -8
  175. data/lib/bundler/vendored_fileutils.rb +9 -0
  176. data/lib/bundler/vendored_molinillo.rb +1 -0
  177. data/lib/bundler/vendored_persistent.rb +35 -0
  178. data/lib/bundler/vendored_thor.rb +1 -0
  179. data/lib/bundler/version.rb +6 -2
  180. data/lib/bundler/version_ranges.rb +1 -0
  181. data/lib/bundler/vlad.rb +5 -0
  182. data/lib/bundler/worker.rb +1 -0
  183. data/lib/bundler/yaml_serializer.rb +3 -3
  184. data/lib/bundler.rb +86 -52
  185. data/man/bundle-add.1 +18 -3
  186. data/man/bundle-add.1.txt +26 -14
  187. data/man/bundle-add.ronn +13 -2
  188. data/man/bundle-binstubs.1 +11 -1
  189. data/man/bundle-binstubs.1.txt +33 -18
  190. data/man/bundle-binstubs.ronn +15 -1
  191. data/man/bundle-check.1 +4 -4
  192. data/man/bundle-check.1.txt +15 -14
  193. data/man/bundle-check.ronn +3 -3
  194. data/man/bundle-clean.1 +1 -1
  195. data/man/bundle-clean.1.txt +10 -10
  196. data/man/bundle-config.1 +129 -29
  197. data/man/bundle-config.1.txt +285 -174
  198. data/man/bundle-config.ronn +167 -88
  199. data/man/bundle-doctor.1 +44 -0
  200. data/man/bundle-doctor.1.txt +44 -0
  201. data/man/bundle-doctor.ronn +33 -0
  202. data/man/bundle-exec.1 +6 -3
  203. data/man/bundle-exec.1.txt +78 -71
  204. data/man/bundle-exec.ronn +10 -3
  205. data/man/bundle-gem.1 +4 -4
  206. data/man/bundle-gem.1.txt +41 -40
  207. data/man/bundle-gem.ronn +3 -2
  208. data/man/bundle-info.1 +1 -1
  209. data/man/bundle-info.1.txt +8 -8
  210. data/man/bundle-init.1 +9 -4
  211. data/man/bundle-init.1.txt +23 -13
  212. data/man/bundle-init.ronn +15 -4
  213. data/man/bundle-inject.1 +4 -4
  214. data/man/bundle-inject.1.txt +10 -10
  215. data/man/bundle-inject.ronn +3 -3
  216. data/man/bundle-install.1 +31 -28
  217. data/man/bundle-install.1.txt +205 -194
  218. data/man/bundle-install.ronn +44 -35
  219. data/man/bundle-list.1 +50 -0
  220. data/man/bundle-list.1.txt +43 -0
  221. data/man/bundle-list.ronn +33 -0
  222. data/man/bundle-lock.1 +1 -1
  223. data/man/bundle-lock.1.txt +47 -47
  224. data/man/bundle-lock.ronn +1 -1
  225. data/man/bundle-open.1 +1 -1
  226. data/man/bundle-open.1.txt +7 -7
  227. data/man/bundle-outdated.1 +7 -3
  228. data/man/bundle-outdated.1.txt +40 -36
  229. data/man/bundle-outdated.ronn +6 -2
  230. data/man/bundle-package.1 +6 -3
  231. data/man/bundle-package.1.txt +44 -39
  232. data/man/bundle-package.ronn +7 -2
  233. data/man/bundle-platform.1 +1 -1
  234. data/man/bundle-platform.1.txt +13 -13
  235. data/man/bundle-pristine.1 +21 -3
  236. data/man/bundle-pristine.1.txt +33 -10
  237. data/man/bundle-pristine.ronn +24 -3
  238. data/man/bundle-remove.1 +31 -0
  239. data/man/bundle-remove.1.txt +34 -0
  240. data/man/bundle-remove.ronn +23 -0
  241. data/man/bundle-show.1 +3 -3
  242. data/man/bundle-show.1.txt +14 -12
  243. data/man/bundle-show.ronn +3 -2
  244. data/man/bundle-update.1 +13 -9
  245. data/man/bundle-update.1.txt +133 -130
  246. data/man/bundle-update.ronn +21 -17
  247. data/man/bundle-viz.1 +7 -7
  248. data/man/bundle-viz.1.txt +17 -15
  249. data/man/bundle-viz.ronn +6 -6
  250. data/man/bundle.1 +31 -32
  251. data/man/bundle.1.txt +63 -75
  252. data/man/bundle.ronn +35 -47
  253. data/man/gemfile.5 +44 -8
  254. data/man/gemfile.5.ronn +54 -8
  255. data/man/gemfile.5.txt +218 -165
  256. data/man/index.txt +25 -15
  257. metadata +36 -44
  258. data/.codeclimate.yml +0 -25
  259. data/.gitignore +0 -18
  260. data/.rspec +0 -3
  261. data/.rubocop.yml +0 -131
  262. data/.rubocop_todo.yml +0 -418
  263. data/.travis.yml +0 -122
  264. data/CODE_OF_CONDUCT.md +0 -42
  265. data/CONTRIBUTING.md +0 -17
  266. data/Rakefile +0 -346
  267. data/bin/rake +0 -19
  268. data/bin/rspec +0 -15
  269. data/bin/rubocop +0 -17
  270. data/bin/with_rubygems +0 -39
  271. data/doc/README.md +0 -30
  272. data/doc/TROUBLESHOOTING.md +0 -64
  273. data/doc/contributing/BUG_TRIAGE.md +0 -36
  274. data/doc/contributing/COMMUNITY.md +0 -13
  275. data/doc/contributing/GETTING_HELP.md +0 -11
  276. data/doc/contributing/HOW_YOU_CAN_HELP.md +0 -27
  277. data/doc/contributing/ISSUES.md +0 -51
  278. data/doc/contributing/README.md +0 -38
  279. data/doc/development/NEW_FEATURES.md +0 -10
  280. data/doc/development/PULL_REQUESTS.md +0 -40
  281. data/doc/development/README.md +0 -19
  282. data/doc/development/RELEASING.md +0 -9
  283. data/doc/development/SETUP.md +0 -29
  284. data/doc/documentation/README.md +0 -29
  285. data/doc/documentation/VISION.md +0 -26
  286. data/doc/documentation/WRITING.md +0 -54
  287. data/lib/bundler/postit_trampoline.rb +0 -73
  288. data/lib/bundler/vendor/postit/lib/postit/environment.rb +0 -44
  289. data/lib/bundler/vendor/postit/lib/postit/installer.rb +0 -28
  290. data/lib/bundler/vendor/postit/lib/postit/parser.rb +0 -21
  291. data/lib/bundler/vendor/postit/lib/postit/setup.rb +0 -12
  292. data/lib/bundler/vendor/postit/lib/postit/version.rb +0 -3
  293. data/lib/bundler/vendor/postit/lib/postit.rb +0 -15
  294. data/task/release.rake +0 -116
@@ -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::Install
@@ -13,19 +12,9 @@ module Bundler
13
12
 
14
13
  warn_if_root
15
14
 
16
- warn_if_outdated
17
-
18
- [:with, :without].each do |option|
19
- if options[option]
20
- options[option] = options[option].join(":").tr(" ", ":").split(":")
21
- end
22
- end
23
-
24
- check_for_group_conflicts
25
-
26
15
  normalize_groups
27
16
 
28
- ENV["RB_USER_INSTALL"] = "1" if Bundler::FREEBSD
17
+ Bundler::SharedHelpers.set_env "RB_USER_INSTALL", "1" if Bundler::FREEBSD
29
18
 
30
19
  # Disable color in deployment mode
31
20
  Bundler.ui.shell = Thor::Shell::Basic.new if options[:deployment]
@@ -34,22 +23,28 @@ module Bundler
34
23
 
35
24
  check_trust_policy
36
25
 
37
- if options[:deployment] || options[:frozen]
26
+ if options[:deployment] || options[:frozen] || Bundler.frozen_bundle?
38
27
  unless Bundler.default_lockfile.exist?
39
- flag = options[:deployment] ? "--deployment" : "--frozen"
40
- raise ProductionError, "The #{flag} flag requires a #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}. Please make " \
28
+ flag = "--deployment flag" if options[:deployment]
29
+ flag ||= "--frozen flag" if options[:frozen]
30
+ flag ||= "deployment setting"
31
+ raise ProductionError, "The #{flag} requires a #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}. Please make " \
41
32
  "sure you have checked your #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)} into version control " \
42
33
  "before deploying."
43
34
  end
44
35
 
45
36
  options[:local] = true if Bundler.app_cache.exist?
46
37
 
47
- Bundler.settings[:frozen] = "1"
38
+ if Bundler.feature_flag.deployment_means_frozen?
39
+ Bundler.settings.set_command_option :deployment, true
40
+ else
41
+ Bundler.settings.set_command_option :frozen, true
42
+ end
48
43
  end
49
44
 
50
45
  # When install is called with --no-deployment, disable deployment mode
51
46
  if options[:deployment] == false
52
- Bundler.settings.delete(:frozen)
47
+ Bundler.settings.set_command_option :frozen, nil
53
48
  options[:system] = true
54
49
  end
55
50
 
@@ -58,7 +53,7 @@ module Bundler
58
53
  Bundler::Fetcher.disable_endpoint = options["full-index"]
59
54
 
60
55
  if options["binstubs"]
61
- Bundler::SharedHelpers.major_deprecation \
56
+ Bundler::SharedHelpers.major_deprecation 2,
62
57
  "The --binstubs option will be removed in favor of `bundle binstubs`"
63
58
  end
64
59
 
@@ -68,24 +63,23 @@ module Bundler
68
63
  definition.validate_runtime!
69
64
 
70
65
  installer = Installer.install(Bundler.root, definition, options)
71
- Bundler.load.cache if Bundler.app_cache.exist? && !options["no-cache"] && !Bundler.settings[:frozen]
66
+ Bundler.load.cache if Bundler.app_cache.exist? && !options["no-cache"] && !Bundler.frozen_bundle?
72
67
 
73
68
  Bundler.ui.confirm "Bundle complete! #{dependencies_count_for(definition)}, #{gems_installed_for(definition)}."
74
69
  Bundler::CLI::Common.output_without_groups_message
75
70
 
76
- if Bundler.settings[:path]
77
- absolute_path = File.expand_path(Bundler.settings[:path])
78
- relative_path = absolute_path.sub(File.expand_path(".") + File::SEPARATOR, "." + File::SEPARATOR)
79
- Bundler.ui.confirm "Bundled gems are installed into #{relative_path}."
80
- else
71
+ if Bundler.use_system_gems?
81
72
  Bundler.ui.confirm "Use `bundle info [gemname]` to see where a bundled gem is installed."
73
+ else
74
+ relative_path = Bundler.configured_bundle_path.base_path_relative_to_pwd
75
+ Bundler.ui.confirm "Bundled gems are installed into `#{relative_path}`"
82
76
  end
83
77
 
84
78
  Bundler::CLI::Common.output_post_install_messages installer.post_install_messages
85
79
 
86
80
  warn_ambiguous_gems
87
81
 
88
- if Bundler.settings[:clean] && Bundler.settings[:path]
82
+ if CLI::Common.clean_after_install?
89
83
  require "bundler/cli/clean"
90
84
  Bundler::CLI::Clean.new(options).run
91
85
  end
@@ -116,20 +110,6 @@ module Bundler
116
110
  "application for all non-root users on this machine.", :wrap => true
117
111
  end
118
112
 
119
- def warn_if_outdated
120
- return if ENV["BUNDLE_POSTIT_TRAMPOLINING_VERSION"].nil?
121
- installed_version = Gem::Version.new(ENV["BUNDLE_POSTIT_TRAMPOLINING_VERSION"].dup)
122
- running_version = Gem::Version.new(Bundler::VERSION)
123
- return if Gem::Requirement.new(installed_version).satisfied_by?(running_version)
124
- if Bundler.settings[:warned_version].nil? || running_version > Gem::Version.new(Bundler.settings[:warned_version])
125
- Bundler.settings[:warned_version] = running_version
126
- Bundler.ui.warn "You're running Bundler #{installed_version} but this " \
127
- "project uses #{running_version}. To update, run `bundle update " \
128
- "--bundler`. You won't see this message again unless you upgrade " \
129
- "to a newer version of Bundler.", :wrap => true
130
- end
131
- end
132
-
133
113
  def dependencies_count_for(definition)
134
114
  count = definition.dependencies.count
135
115
  "#{count} Gemfile #{count == 1 ? "dependency" : "dependencies"}"
@@ -140,15 +120,11 @@ module Bundler
140
120
  "#{count} #{count == 1 ? "gem" : "gems"} now installed"
141
121
  end
142
122
 
143
- def check_for_group_conflicts
144
- if options[:without] && options[:with]
145
- conflicting_groups = options[:without] & options[:with]
146
- unless conflicting_groups.empty?
147
- Bundler.ui.error "You can't list a group in both, --with and --without." \
148
- "The offending groups are: #{conflicting_groups.join(", ")}."
149
- exit 1
150
- end
151
- end
123
+ def check_for_group_conflicts_in_cli_options
124
+ conflicting_groups = Array(options[:without]) & Array(options[:with])
125
+ return if conflicting_groups.empty?
126
+ raise InvalidOption, "You can't list a group in both with and without." \
127
+ " The offending groups are: #{conflicting_groups.join(", ")}."
152
128
  end
153
129
 
154
130
  def check_for_options_conflicts
@@ -161,28 +137,29 @@ module Bundler
161
137
  end
162
138
 
163
139
  def check_trust_policy
164
- if options["trust-policy"]
165
- unless Bundler.rubygems.security_policies.keys.include?(options["trust-policy"])
166
- Bundler.ui.error "Rubygems doesn't know about trust policy '#{options["trust-policy"]}'. " \
167
- "The known policies are: #{Bundler.rubygems.security_policies.keys.join(", ")}."
168
- exit 1
169
- end
170
- Bundler.settings["trust-policy"] = options["trust-policy"]
171
- else
172
- Bundler.settings["trust-policy"] = nil if Bundler.settings["trust-policy"]
140
+ trust_policy = options["trust-policy"]
141
+ unless Bundler.rubygems.security_policies.keys.unshift(nil).include?(trust_policy)
142
+ raise InvalidOption, "RubyGems doesn't know about trust policy '#{trust_policy}'. " \
143
+ "The known policies are: #{Bundler.rubygems.security_policies.keys.join(", ")}."
173
144
  end
145
+ Bundler.settings.set_command_option_if_given :"trust-policy", trust_policy
174
146
  end
175
147
 
176
148
  def normalize_groups
177
- Bundler.settings.with = [] if options[:with] && options[:with].empty?
178
- Bundler.settings.without = [] if options[:without] && options[:without].empty?
149
+ options[:with] &&= options[:with].join(":").tr(" ", ":").split(":")
150
+ options[:without] &&= options[:without].join(":").tr(" ", ":").split(":")
179
151
 
180
- with = options.fetch("with", [])
181
- with |= Bundler.settings.with.map(&:to_s)
152
+ check_for_group_conflicts_in_cli_options
153
+
154
+ Bundler.settings.set_command_option :with, nil if options[:with] == []
155
+ Bundler.settings.set_command_option :without, nil if options[:without] == []
156
+
157
+ with = options.fetch(:with, [])
158
+ with |= Bundler.settings[:with].map(&:to_s)
182
159
  with -= options[:without] if options[:without]
183
160
 
184
- without = options.fetch("without", [])
185
- without |= Bundler.settings.without.map(&:to_s)
161
+ without = options.fetch(:without, [])
162
+ without |= Bundler.settings[:without].map(&:to_s)
186
163
  without -= options[:with] if options[:with]
187
164
 
188
165
  options[:with] = with
@@ -190,28 +167,38 @@ module Bundler
190
167
  end
191
168
 
192
169
  def normalize_settings
193
- Bundler.settings[:path] = nil if options[:system]
194
- Bundler.settings[:path] = "vendor/bundle" if options[:deployment]
195
- Bundler.settings[:path] = options["path"] if options["path"]
196
- Bundler.settings[:path] ||= "bundle" if options["standalone"]
170
+ Bundler.settings.set_command_option :path, nil if options[:system]
171
+ Bundler.settings.temporary(:path_relative_to_cwd => false) do
172
+ Bundler.settings.set_command_option :path, "vendor/bundle" if options[:deployment]
173
+ end
174
+ Bundler.settings.set_command_option_if_given :path, options[:path]
175
+ Bundler.settings.temporary(:path_relative_to_cwd => false) do
176
+ Bundler.settings.set_command_option :path, "bundle" if options["standalone"] && Bundler.settings[:path].nil?
177
+ end
197
178
 
198
- Bundler.settings[:bin] = options["binstubs"] if options["binstubs"]
199
- Bundler.settings[:bin] = nil if options["binstubs"] && options["binstubs"].empty?
179
+ bin_option = options["binstubs"]
180
+ bin_option = nil if bin_option && bin_option.empty?
181
+ Bundler.settings.set_command_option :bin, bin_option if options["binstubs"]
200
182
 
201
- Bundler.settings[:shebang] = options["shebang"] if options["shebang"]
183
+ Bundler.settings.set_command_option_if_given :shebang, options["shebang"]
202
184
 
203
- Bundler.settings[:jobs] = options["jobs"] if options["jobs"]
185
+ Bundler.settings.set_command_option_if_given :jobs, options["jobs"]
204
186
 
205
- Bundler.settings[:no_prune] = true if options["no-prune"]
187
+ Bundler.settings.set_command_option_if_given :no_prune, options["no-prune"]
206
188
 
207
- Bundler.settings[:no_install] = true if options["no-install"]
189
+ Bundler.settings.set_command_option_if_given :no_install, options["no-install"]
208
190
 
209
- Bundler.settings[:clean] = options["clean"] if options["clean"]
191
+ Bundler.settings.set_command_option_if_given :clean, options["clean"]
210
192
 
211
- Bundler.settings.without = options[:without]
212
- Bundler.settings.with = options[:with]
193
+ unless Bundler.settings[:without] == options[:without] && Bundler.settings[:with] == options[:with]
194
+ # need to nil them out first to get around validation for backwards compatibility
195
+ Bundler.settings.set_command_option :without, nil
196
+ Bundler.settings.set_command_option :with, nil
197
+ Bundler.settings.set_command_option :without, options[:without] - options[:with]
198
+ Bundler.settings.set_command_option :with, options[:with]
199
+ end
213
200
 
214
- Bundler.settings[:disable_shared_gems] = Bundler.settings[:path] ? true : nil
201
+ options[:force] = options[:redownload]
215
202
  end
216
203
 
217
204
  def warn_ambiguous_gems
@@ -26,7 +26,7 @@ module Bundler
26
26
 
27
27
  EOS
28
28
 
29
- Bundler.ui.info Bundler::Env.new.report
29
+ Bundler.ui.info Bundler::Env.report
30
30
 
31
31
  Bundler.ui.info "\n## Bundle Doctor"
32
32
  doctor
@@ -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,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- require "bundler/cli/common"
3
2
 
4
3
  module Bundler
5
4
  class CLI::Lock
@@ -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
@@ -17,7 +17,7 @@ module Bundler
17
17
  path = spec.full_gem_path
18
18
  Dir.chdir(path) do
19
19
  command = Shellwords.split(editor) + [path]
20
- Bundler.with_clean_env do
20
+ Bundler.with_original_env do
21
21
  system(*command)
22
22
  end || Bundler.ui.info("Could not run '#{command.join(" ")}'")
23
23
  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::Outdated
@@ -46,7 +45,7 @@ module Bundler
46
45
  Bundler::CLI::Common.patch_level_options(options).any?
47
46
 
48
47
  filter_options_patch = options.keys &
49
- %w(filter-major filter-minor filter-patch)
48
+ %w[filter-major filter-minor filter-patch]
50
49
 
51
50
  definition_resolution = proc do
52
51
  options[:local] ? definition.resolve_with_cache! : definition.resolve_remotely!
@@ -67,7 +66,13 @@ module Bundler
67
66
  current_dependencies.key? spec.name
68
67
  end
69
68
 
70
- (gemfile_specs + dependency_specs).sort_by(&:name).each do |current_spec|
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|
71
76
  next if !gems.empty? && !gems.include?(current_spec.name)
72
77
 
73
78
  dependency = current_dependencies[current_spec.name]
@@ -214,13 +219,19 @@ module Bundler
214
219
  end
215
220
 
216
221
  def check_for_deployment_mode
217
- if Bundler.settings[:frozen]
218
- raise ProductionError, "You are trying to check outdated gems in " \
219
- "deployment mode. Run `bundle outdated` elsewhere.\n" \
220
- "\nIf this is a development machine, remove the " \
221
- "#{Bundler.default_gemfile} freeze" \
222
- "\nby running `bundle install --no-deployment`."
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"
223
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}`."
224
235
  end
225
236
 
226
237
  def update_present_via_semver_portions(current_spec, active_spec, options)
@@ -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
@@ -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
@@ -1,16 +1,25 @@
1
1
  # frozen_string_literal: true
2
- require "bundler/cli/common"
3
2
 
4
3
  module Bundler
5
4
  class CLI::Pristine
5
+ def initialize(gems)
6
+ @gems = gems
7
+ end
8
+
6
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
+
7
15
  Bundler.load.specs.each do |spec|
8
16
  next if spec.name == "bundler" # Source::Rubygems doesn't install bundler
17
+ next if !@gems.empty? && !@gems.include?(spec.name)
9
18
 
10
19
  gem_name = "#{spec.name} (#{spec.version}#{spec.git_version})"
11
20
  gem_name += " (#{spec.platform})" if !spec.platform.nil? && spec.platform != Gem::Platform::RUBY
12
21
 
13
- case spec.source
22
+ case source = spec.source
14
23
  when Source::Rubygems
15
24
  cached_gem = spec.cache_file
16
25
  unless File.exist?(cached_gem)
@@ -19,14 +28,19 @@ module Bundler
19
28
  end
20
29
 
21
30
  FileUtils.rm_rf spec.full_gem_path
22
- spec.source.install(spec, :force => true)
23
31
  when Source::Git
24
- git_source = spec.source
25
- git_source.remote!
26
- git_source.install(spec, :force => true)
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
27
38
  else
28
39
  Bundler.ui.warn("Cannot pristine #{gem_name}. Gem is sourced from local path.")
40
+ next
29
41
  end
42
+
43
+ Bundler::GemInstaller.new(spec, installer, false, 0, true).install_from_spec
30
44
  end
31
45
  end
32
46
  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
@@ -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::Update
@@ -17,7 +16,18 @@ module Bundler
17
16
  sources = Array(options[:source])
18
17
  groups = Array(options[:group]).map(&:to_sym)
19
18
 
20
- 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
21
31
  # We're doing a full update
22
32
  Bundler.definition(true)
23
33
  else
@@ -28,12 +38,13 @@ module Bundler
28
38
  Bundler::CLI::Common.ensure_all_gems_in_lockfile!(gems)
29
39
 
30
40
  if groups.any?
31
- specs = Bundler.definition.specs_for groups
32
- gems.concat(specs.map(&:name))
41
+ deps = Bundler.definition.dependencies.select {|d| (d.groups & groups).any? }
42
+ gems.concat(deps.map(&:name))
33
43
  end
34
44
 
35
45
  Bundler.definition(:gems => gems, :sources => sources, :ruby => options[:ruby],
36
- :lock_shared_dependencies => options[:conservative])
46
+ :lock_shared_dependencies => options[:conservative],
47
+ :bundler => options[:bundler])
37
48
  end
38
49
 
39
50
  Bundler::CLI::Common.configure_gem_version_promoter(Bundler.definition, options)
@@ -44,17 +55,34 @@ module Bundler
44
55
  opts["update"] = true
45
56
  opts["local"] = options[:local]
46
57
 
47
- Bundler.settings[:jobs] = opts["jobs"] if opts["jobs"]
58
+ Bundler.settings.set_command_option_if_given :jobs, opts["jobs"]
48
59
 
49
60
  Bundler.definition.validate_runtime!
50
61
  installer = Installer.install Bundler.root, Bundler.definition, opts
51
62
  Bundler.load.cache if Bundler.app_cache.exist?
52
63
 
53
- if Bundler.settings[:clean] && Bundler.settings[:path]
64
+ if CLI::Common.clean_after_install?
54
65
  require "bundler/cli/clean"
55
66
  Bundler::CLI::Clean.new(options).run
56
67
  end
57
68
 
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
85
+
58
86
  Bundler.ui.confirm "Bundle updated!"
59
87
  Bundler::CLI::Common.output_without_groups_message
60
88
  Bundler::CLI::Common.output_post_install_messages installer.post_install_messages
@@ -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(":")