bundler 1.15.2 → 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 (286) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +302 -0
  3. data/README.md +17 -8
  4. data/bundler.gemspec +25 -9
  5. data/exe/bundle +1 -1
  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 -61
  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 +1 -0
  37. data/lib/bundler/cli.rb +227 -89
  38. data/lib/bundler/compact_index_client/cache.rb +1 -2
  39. data/lib/bundler/compact_index_client/updater.rb +14 -4
  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 +5 -7
  72. data/lib/bundler/installer/gem_installer.rb +11 -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 +1 -0
  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 +200 -77
  101. data/lib/bundler/setup.rb +1 -0
  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 +8 -8
  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 +10 -5
  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 +1 -0
  121. data/lib/bundler/templates/gems.rb +8 -0
  122. data/lib/bundler/templates/newgem/README.md.tt +1 -1
  123. data/lib/bundler/templates/newgem/gitignore.tt +0 -1
  124. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +1 -0
  125. data/lib/bundler/templates/newgem/newgem.gemspec.tt +12 -3
  126. data/lib/bundler/templates/newgem/rspec.tt +1 -0
  127. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +0 -2
  128. data/lib/bundler/templates/newgem/{.travis.yml.tt → travis.yml.tt} +2 -0
  129. data/lib/bundler/ui/rg_proxy.rb +1 -0
  130. data/lib/bundler/ui/shell.rb +17 -4
  131. data/lib/bundler/ui/silent.rb +1 -0
  132. data/lib/bundler/ui.rb +1 -0
  133. data/lib/bundler/uri_credentials_filter.rb +1 -0
  134. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1638 -0
  135. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +26 -0
  136. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +7 -0
  137. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +1 -0
  138. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +1 -0
  139. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +1 -0
  140. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -0
  141. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -0
  142. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -0
  143. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +1 -0
  144. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -0
  145. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +1 -0
  146. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +15 -4
  147. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +3 -2
  148. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +75 -7
  149. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +2 -1
  150. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +1 -0
  151. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +3 -1
  152. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +491 -148
  153. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +1 -0
  154. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +8 -4
  155. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +2 -0
  156. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1 -1
  157. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +1 -0
  158. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +1 -0
  159. data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +9 -1
  160. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +45 -8
  161. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +9 -3
  162. data/lib/bundler/vendor/thor/lib/thor/actions.rb +6 -3
  163. data/lib/bundler/vendor/thor/lib/thor/base.rb +27 -4
  164. data/lib/bundler/vendor/thor/lib/thor/command.rb +9 -7
  165. data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +12 -0
  166. data/lib/bundler/vendor/thor/lib/thor/group.rb +1 -1
  167. data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +2 -0
  168. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +5 -5
  169. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +6 -5
  170. data/lib/bundler/vendor/thor/lib/thor/runner.rb +6 -4
  171. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +10 -9
  172. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  173. data/lib/bundler/vendor/thor/lib/thor.rb +25 -8
  174. data/lib/bundler/vendored_fileutils.rb +9 -0
  175. data/lib/bundler/vendored_molinillo.rb +1 -0
  176. data/lib/bundler/vendored_persistent.rb +35 -0
  177. data/lib/bundler/vendored_thor.rb +1 -0
  178. data/lib/bundler/version.rb +6 -2
  179. data/lib/bundler/version_ranges.rb +1 -0
  180. data/lib/bundler/vlad.rb +5 -0
  181. data/lib/bundler/worker.rb +1 -0
  182. data/lib/bundler/yaml_serializer.rb +3 -3
  183. data/lib/bundler.rb +86 -52
  184. data/man/bundle-add.1 +18 -3
  185. data/man/bundle-add.1.txt +26 -14
  186. data/man/bundle-add.ronn +13 -2
  187. data/man/bundle-binstubs.1 +11 -1
  188. data/man/bundle-binstubs.1.txt +33 -18
  189. data/man/bundle-binstubs.ronn +15 -1
  190. data/man/bundle-check.1 +4 -4
  191. data/man/bundle-check.1.txt +15 -14
  192. data/man/bundle-check.ronn +3 -3
  193. data/man/bundle-clean.1 +1 -1
  194. data/man/bundle-clean.1.txt +10 -10
  195. data/man/bundle-config.1 +129 -29
  196. data/man/bundle-config.1.txt +285 -174
  197. data/man/bundle-config.ronn +167 -88
  198. data/man/bundle-doctor.1 +44 -0
  199. data/man/bundle-doctor.1.txt +44 -0
  200. data/man/bundle-doctor.ronn +33 -0
  201. data/man/bundle-exec.1 +6 -3
  202. data/man/bundle-exec.1.txt +78 -71
  203. data/man/bundle-exec.ronn +10 -3
  204. data/man/bundle-gem.1 +3 -3
  205. data/man/bundle-gem.1.txt +40 -39
  206. data/man/bundle-gem.ronn +2 -1
  207. data/man/bundle-info.1 +1 -1
  208. data/man/bundle-info.1.txt +8 -8
  209. data/man/bundle-init.1 +9 -4
  210. data/man/bundle-init.1.txt +23 -13
  211. data/man/bundle-init.ronn +15 -4
  212. data/man/bundle-inject.1 +4 -4
  213. data/man/bundle-inject.1.txt +10 -10
  214. data/man/bundle-inject.ronn +3 -3
  215. data/man/bundle-install.1 +31 -28
  216. data/man/bundle-install.1.txt +205 -194
  217. data/man/bundle-install.ronn +44 -35
  218. data/man/bundle-list.1 +50 -0
  219. data/man/bundle-list.1.txt +43 -0
  220. data/man/bundle-list.ronn +33 -0
  221. data/man/bundle-lock.1 +1 -1
  222. data/man/bundle-lock.1.txt +47 -47
  223. data/man/bundle-lock.ronn +1 -1
  224. data/man/bundle-open.1 +1 -1
  225. data/man/bundle-open.1.txt +7 -7
  226. data/man/bundle-outdated.1 +7 -3
  227. data/man/bundle-outdated.1.txt +40 -36
  228. data/man/bundle-outdated.ronn +6 -2
  229. data/man/bundle-package.1 +6 -3
  230. data/man/bundle-package.1.txt +44 -39
  231. data/man/bundle-package.ronn +7 -2
  232. data/man/bundle-platform.1 +1 -1
  233. data/man/bundle-platform.1.txt +13 -13
  234. data/man/bundle-pristine.1 +21 -3
  235. data/man/bundle-pristine.1.txt +33 -10
  236. data/man/bundle-pristine.ronn +24 -3
  237. data/man/bundle-remove.1 +31 -0
  238. data/man/bundle-remove.1.txt +34 -0
  239. data/man/bundle-remove.ronn +23 -0
  240. data/man/bundle-show.1 +3 -3
  241. data/man/bundle-show.1.txt +14 -12
  242. data/man/bundle-show.ronn +3 -2
  243. data/man/bundle-update.1 +13 -9
  244. data/man/bundle-update.1.txt +133 -130
  245. data/man/bundle-update.ronn +21 -17
  246. data/man/bundle-viz.1 +7 -7
  247. data/man/bundle-viz.1.txt +17 -15
  248. data/man/bundle-viz.ronn +6 -6
  249. data/man/bundle.1 +31 -23
  250. data/man/bundle.1.txt +63 -57
  251. data/man/bundle.ronn +35 -29
  252. data/man/gemfile.5 +44 -8
  253. data/man/gemfile.5.ronn +54 -8
  254. data/man/gemfile.5.txt +218 -165
  255. data/man/index.txt +25 -15
  256. metadata +36 -36
  257. data/.codeclimate.yml +0 -25
  258. data/.gitignore +0 -18
  259. data/.rspec +0 -3
  260. data/.rubocop.yml +0 -131
  261. data/.rubocop_todo.yml +0 -418
  262. data/.travis.yml +0 -122
  263. data/CODE_OF_CONDUCT.md +0 -42
  264. data/CONTRIBUTING.md +0 -17
  265. data/Rakefile +0 -338
  266. data/bin/rake +0 -19
  267. data/bin/rspec +0 -15
  268. data/bin/rubocop +0 -17
  269. data/bin/with_rubygems +0 -39
  270. data/doc/README.md +0 -30
  271. data/doc/TROUBLESHOOTING.md +0 -64
  272. data/doc/contributing/BUG_TRIAGE.md +0 -36
  273. data/doc/contributing/COMMUNITY.md +0 -13
  274. data/doc/contributing/GETTING_HELP.md +0 -11
  275. data/doc/contributing/HOW_YOU_CAN_HELP.md +0 -27
  276. data/doc/contributing/ISSUES.md +0 -51
  277. data/doc/contributing/README.md +0 -38
  278. data/doc/development/NEW_FEATURES.md +0 -10
  279. data/doc/development/PULL_REQUESTS.md +0 -40
  280. data/doc/development/README.md +0 -19
  281. data/doc/development/RELEASING.md +0 -9
  282. data/doc/development/SETUP.md +0 -27
  283. data/doc/documentation/README.md +0 -29
  284. data/doc/documentation/VISION.md +0 -26
  285. data/doc/documentation/WRITING.md +0 -54
  286. data/task/release.rake +0 -116
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler
3
4
  class CLI::Cache
4
5
  attr_reader :options
@@ -10,9 +11,9 @@ module Bundler
10
11
  Bundler.definition.validate_runtime!
11
12
  Bundler.definition.resolve_with_cache!
12
13
  setup_cache_all
13
- Bundler.settings[:cache_all_platforms] = options["all-platforms"] if options.key?("all-platforms")
14
+ Bundler.settings.set_command_option_if_given :cache_all_platforms, options["all-platforms"]
14
15
  Bundler.load.cache
15
- Bundler.settings[:no_prune] = true if options["no-prune"]
16
+ Bundler.settings.set_command_option_if_given :no_prune, options["no-prune"]
16
17
  Bundler.load.lock
17
18
  rescue GemNotFound => e
18
19
  Bundler.ui.error(e.message)
@@ -23,9 +24,9 @@ module Bundler
23
24
  private
24
25
 
25
26
  def setup_cache_all
26
- Bundler.settings[:cache_all] = options[:all] if options.key?("all")
27
+ Bundler.settings.set_command_option_if_given :cache_all, options[:all]
27
28
 
28
- if Bundler.definition.has_local_dependencies? && !Bundler.settings[:cache_all]
29
+ if Bundler.definition.has_local_dependencies? && !Bundler.feature_flag.cache_all?
29
30
  Bundler.ui.warn "Your Gemfile contains path and git dependencies. If you want " \
30
31
  "to package them as well, please pass the --all flag. This will be the default " \
31
32
  "on Bundler 2.0."
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler
3
4
  class CLI::Check
4
5
  attr_reader :options
@@ -8,10 +9,7 @@ module Bundler
8
9
  end
9
10
 
10
11
  def run
11
- if options[:path]
12
- Bundler.settings[:path] = File.expand_path(options[:path])
13
- Bundler.settings[:disable_shared_gems] = true
14
- end
12
+ Bundler.settings.set_command_option_if_given :path, options[:path]
15
13
 
16
14
  begin
17
15
  definition = Bundler.definition
@@ -28,7 +26,7 @@ module Bundler
28
26
  not_installed.each {|s| Bundler.ui.error " * #{s.name} (#{s.version})" }
29
27
  Bundler.ui.warn "Install missing gems with `bundle install`"
30
28
  exit 1
31
- elsif !Bundler.default_lockfile.file? && Bundler.settings[:frozen]
29
+ elsif !Bundler.default_lockfile.file? && Bundler.frozen_bundle?
32
30
  Bundler.ui.error "This bundle has been frozen, but there is no #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)} present"
33
31
  exit 1
34
32
  else
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler
3
4
  class CLI::Clean
4
5
  attr_reader :options
@@ -15,12 +16,10 @@ module Bundler
15
16
  protected
16
17
 
17
18
  def require_path_or_force
18
- if !Bundler.settings[:path] && !options[:force]
19
- Bundler.ui.error "Cleaning all the gems on your system is dangerous! " \
20
- "If you're sure you want to remove every system gem not in this " \
21
- "bundle, run `bundle clean --force`."
22
- exit 1
23
- end
19
+ return unless Bundler.use_system_gems? && !options[:force]
20
+ raise InvalidOption, "Cleaning all the gems on your system is dangerous! " \
21
+ "If you're sure you want to remove every system gem not in this " \
22
+ "bundle, run `bundle clean --force`."
24
23
  end
25
24
  end
26
25
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler
3
4
  module CLI::Common
4
5
  def self.output_post_install_messages(messages)
@@ -14,12 +15,12 @@ module Bundler
14
15
  end
15
16
 
16
17
  def self.output_without_groups_message
17
- return unless Bundler.settings.without.any?
18
+ return if Bundler.settings[:without].empty?
18
19
  Bundler.ui.confirm without_groups_message
19
20
  end
20
21
 
21
22
  def self.without_groups_message
22
- groups = Bundler.settings.without
23
+ groups = Bundler.settings[:without]
23
24
  group_list = [groups[0...-1].join(", "), groups[-1..-1]].
24
25
  reject {|s| s.to_s.empty? }.join(" and ")
25
26
  group_str = (groups.size == 1) ? "group" : "groups"
@@ -89,5 +90,13 @@ module Bundler
89
90
  def self.patch_level_options(options)
90
91
  [:major, :minor, :patch].select {|v| options.keys.include?(v.to_s) }
91
92
  end
93
+
94
+ def self.clean_after_install?
95
+ clean = Bundler.settings[:clean]
96
+ return clean unless clean.nil?
97
+ clean ||= Bundler.feature_flag.auto_clean_without_path? && Bundler.settings[:path].nil?
98
+ clean &&= !Bundler.use_system_gems?
99
+ clean
100
+ end
92
101
  end
93
102
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler
3
4
  class CLI::Config
4
5
  attr_reader :name, :options, :scope, :thor
@@ -112,7 +113,7 @@ module Bundler
112
113
  end
113
114
 
114
115
  def valid_scope?(scope)
115
- %w(delete local global).include?(scope)
116
+ %w[delete local global].include?(scope)
116
117
  end
117
118
  end
118
119
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler
3
4
  class CLI::Console
4
5
  attr_reader :options, :group
@@ -8,7 +9,7 @@ module Bundler
8
9
  end
9
10
 
10
11
  def run
11
- Bundler::SharedHelpers.major_deprecation "bundle console will be replaced " \
12
+ Bundler::SharedHelpers.major_deprecation 2, "bundle console will be replaced " \
12
13
  "by `bin/console` generated by `bundle gem <name>`"
13
14
 
14
15
  group ? Bundler.require(:default, *(group.split.map!(&:to_sym))) : Bundler.require
@@ -62,6 +62,7 @@ module Bundler
62
62
 
63
63
  def run
64
64
  Bundler.ui.level = "error" if options[:quiet]
65
+ Bundler.settings.validate!
65
66
  check!
66
67
 
67
68
  definition = Bundler.definition
@@ -77,6 +78,8 @@ module Bundler
77
78
  end
78
79
  end
79
80
 
81
+ permissions_valid = check_home_permissions
82
+
80
83
  if broken_links.any?
81
84
  message = "The following gems are missing OS dependencies:"
82
85
  broken_links.map do |spec, paths|
@@ -85,9 +88,53 @@ module Bundler
85
88
  end
86
89
  end.flatten.sort.each {|m| message += m }
87
90
  raise ProductionError, message
88
- else
91
+ elsif !permissions_valid
89
92
  Bundler.ui.info "No issues found with the installed bundle"
90
93
  end
91
94
  end
95
+
96
+ private
97
+
98
+ def check_home_permissions
99
+ require "find"
100
+ files_not_readable_or_writable = []
101
+ files_not_rw_and_owned_by_different_user = []
102
+ files_not_owned_by_current_user_but_still_rw = []
103
+ Find.find(Bundler.home.to_s).each do |f|
104
+ if !File.writable?(f) || !File.readable?(f)
105
+ if File.stat(f).uid != Process.uid
106
+ files_not_rw_and_owned_by_different_user << f
107
+ else
108
+ files_not_readable_or_writable << f
109
+ end
110
+ elsif File.stat(f).uid != Process.uid
111
+ files_not_owned_by_current_user_but_still_rw << f
112
+ end
113
+ end
114
+
115
+ ok = true
116
+ if files_not_owned_by_current_user_but_still_rw.any?
117
+ Bundler.ui.warn "Files exist in the Bundler home that are owned by another " \
118
+ "user, but are still readable/writable. These files are:\n - #{files_not_owned_by_current_user_but_still_rw.join("\n - ")}"
119
+
120
+ ok = false
121
+ end
122
+
123
+ if files_not_rw_and_owned_by_different_user.any?
124
+ Bundler.ui.warn "Files exist in the Bundler home that are owned by another " \
125
+ "user, and are not readable/writable. These files are:\n - #{files_not_rw_and_owned_by_different_user.join("\n - ")}"
126
+
127
+ ok = false
128
+ end
129
+
130
+ if files_not_readable_or_writable.any?
131
+ Bundler.ui.warn "Files exist in the Bundler home that are not " \
132
+ "readable/writable by the current user. These files are:\n - #{files_not_readable_or_writable.join("\n - ")}"
133
+
134
+ ok = false
135
+ end
136
+
137
+ ok
138
+ end
92
139
  end
93
140
  end
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "bundler/current_ruby"
3
4
 
4
5
  module Bundler
5
6
  class CLI::Exec
6
7
  attr_reader :options, :args, :cmd
7
8
 
8
- RESERVED_SIGNALS = %w(SEGV BUS ILL FPE VTALRM KILL STOP).freeze
9
+ TRAPPED_SIGNALS = %w[INT].freeze
9
10
 
10
11
  def initialize(options, args)
11
12
  @options = options
@@ -69,15 +70,14 @@ module Bundler
69
70
  ui = Bundler.ui
70
71
  Bundler.ui = nil
71
72
  require "bundler/setup"
72
- signals = Signal.list.keys - RESERVED_SIGNALS
73
- signals.each {|s| trap(s, "DEFAULT") }
73
+ TRAPPED_SIGNALS.each {|s| trap(s, "DEFAULT") }
74
74
  Kernel.load(file)
75
- rescue SystemExit
75
+ rescue SystemExit, SignalException
76
76
  raise
77
77
  rescue Exception => e # rubocop:disable Lint/RescueException
78
78
  Bundler.ui = ui
79
79
  Bundler.ui.error "bundler: failed to load command: #{cmd} (#{file})"
80
- backtrace = e.backtrace.take_while {|bt| !bt.start_with?(__FILE__) }
80
+ backtrace = e.backtrace ? e.backtrace.take_while {|bt| !bt.start_with?(__FILE__) } : []
81
81
  abort "#{e.class}: #{e.message}\n #{backtrace.join("\n ")}"
82
82
  end
83
83
 
@@ -89,6 +89,7 @@ module Bundler
89
89
  possibilities = [
90
90
  "#!/usr/bin/env ruby\n",
91
91
  "#!/usr/bin/env jruby\n",
92
+ "#!/usr/bin/env truffleruby\n",
92
93
  "#!#{Gem.ruby}\n",
93
94
  ]
94
95
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "pathname"
3
4
 
4
5
  module Bundler
@@ -71,10 +72,10 @@ module Bundler
71
72
  "bin/setup.tt" => "bin/setup"
72
73
  }
73
74
 
74
- executables = %w(
75
+ executables = %w[
75
76
  bin/console
76
77
  bin/setup
77
- )
78
+ ]
78
79
 
79
80
  templates.merge!("gitignore.tt" => ".gitignore") if Bundler.git_present?
80
81
 
@@ -82,7 +83,7 @@ module Bundler
82
83
  config[:test] = test_framework
83
84
  config[:test_framework_version] = TEST_FRAMEWORK_VERSIONS[test_framework]
84
85
 
85
- templates.merge!(".travis.yml.tt" => ".travis.yml")
86
+ templates.merge!("travis.yml.tt" => ".travis.yml")
86
87
 
87
88
  case test_framework
88
89
  when "rspec"
@@ -104,7 +105,7 @@ module Bundler
104
105
  if ask_and_set(:mit, "Do you want to license your code permissively under the MIT license?",
105
106
  "This means that any other developer or company will be legally allowed to use your code " \
106
107
  "for free as long as they admit you created it. You can read more about the MIT license " \
107
- "at http://choosealicense.com/licenses/mit.")
108
+ "at https://choosealicense.com/licenses/mit.")
108
109
  config[:mit] = true
109
110
  Bundler.ui.info "MIT License enabled in config"
110
111
  templates.merge!("LICENSE.txt.tt" => "LICENSE.txt")
@@ -117,7 +118,7 @@ module Bundler
117
118
  "of enforcing it, so be sure that you are prepared to do that. Be sure that your email " \
118
119
  "address is specified as a contact in the generated code of conduct so that people know " \
119
120
  "who to contact in case of a violation. For suggestions about " \
120
- "how to enforce codes of conduct, see http://bit.ly/coc-enforcement.")
121
+ "how to enforce codes of conduct, see https://bit.ly/coc-enforcement.")
121
122
  config[:coc] = true
122
123
  Bundler.ui.info "Code of conduct enabled in config"
123
124
  templates.merge!("CODE_OF_CONDUCT.md.tt" => "CODE_OF_CONDUCT.md")
@@ -141,9 +142,10 @@ module Bundler
141
142
  end
142
143
 
143
144
  executables.each do |file|
144
- path = target.join(file)
145
- executable = (path.stat.mode | 0o111)
146
- path.chmod(executable)
145
+ SharedHelpers.filesystem_access(target.join(file)) do |path|
146
+ executable = (path.stat.mode | 0o111)
147
+ path.chmod(executable)
148
+ end
147
149
  end
148
150
 
149
151
  if Bundler.git_present?
@@ -156,6 +158,9 @@ module Bundler
156
158
 
157
159
  # Open gemspec in editor
158
160
  open_editor(options["edit"], target.join("#{name}.gemspec")) if options[:edit]
161
+
162
+ Bundler.ui.info "Gem '#{name}' was successfully created. " \
163
+ "For more information on making a RubyGem visit https://bundler.io/guides/creating_gem.html"
159
164
  rescue Errno::EEXIST => e
160
165
  raise GenericSystemCallError.new(e, "There was a conflict while creating the new gem.")
161
166
  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::Info
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler
3
4
  class CLI::Init
4
5
  attr_reader :options
@@ -7,8 +8,13 @@ module Bundler
7
8
  end
8
9
 
9
10
  def run
10
- if File.exist?("Gemfile")
11
- Bundler.ui.error "Gemfile already exists at #{SharedHelpers.pwd}/Gemfile"
11
+ if File.exist?(gemfile)
12
+ Bundler.ui.error "#{gemfile} already exists at #{File.expand_path(gemfile)}"
13
+ exit 1
14
+ end
15
+
16
+ unless File.writable?(Dir.pwd)
17
+ Bundler.ui.error "Can not create #{gemfile} as the current directory is not writable."
12
18
  exit 1
13
19
  end
14
20
 
@@ -21,15 +27,21 @@ module Bundler
21
27
 
22
28
  spec = Bundler.load_gemspec_uncached(gemspec)
23
29
 
24
- puts "Writing new Gemfile to #{SharedHelpers.pwd}/Gemfile"
25
- File.open("Gemfile", "wb") do |file|
30
+ File.open(gemfile, "wb") do |file|
26
31
  file << "# Generated from #{gemspec}\n"
27
32
  file << spec.to_gemfile
28
33
  end
29
34
  else
30
- puts "Writing new Gemfile to #{SharedHelpers.pwd}/Gemfile"
31
- FileUtils.cp(File.expand_path("../../templates/Gemfile", __FILE__), "Gemfile")
35
+ FileUtils.cp(File.expand_path("../../templates/#{gemfile}", __FILE__), gemfile)
32
36
  end
37
+
38
+ puts "Writing new #{gemfile} to #{SharedHelpers.pwd}/#{gemfile}"
39
+ end
40
+
41
+ private
42
+
43
+ def gemfile
44
+ @gemfile ||= Bundler.feature_flag.init_gems_rb? ? "gems.rb" : "Gemfile"
33
45
  end
34
46
  end
35
47
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler
3
4
  class CLI::Inject
4
5
  attr_reader :options, :name, :version, :group, :source, :gems
@@ -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,17 +12,9 @@ module Bundler
13
12
 
14
13
  warn_if_root
15
14
 
16
- [:with, :without].each do |option|
17
- if options[option]
18
- options[option] = options[option].join(":").tr(" ", ":").split(":")
19
- end
20
- end
21
-
22
- check_for_group_conflicts
23
-
24
15
  normalize_groups
25
16
 
26
- ENV["RB_USER_INSTALL"] = "1" if Bundler::FREEBSD
17
+ Bundler::SharedHelpers.set_env "RB_USER_INSTALL", "1" if Bundler::FREEBSD
27
18
 
28
19
  # Disable color in deployment mode
29
20
  Bundler.ui.shell = Thor::Shell::Basic.new if options[:deployment]
@@ -32,22 +23,28 @@ module Bundler
32
23
 
33
24
  check_trust_policy
34
25
 
35
- if options[:deployment] || options[:frozen]
26
+ if options[:deployment] || options[:frozen] || Bundler.frozen_bundle?
36
27
  unless Bundler.default_lockfile.exist?
37
- flag = options[:deployment] ? "--deployment" : "--frozen"
38
- 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 " \
39
32
  "sure you have checked your #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)} into version control " \
40
33
  "before deploying."
41
34
  end
42
35
 
43
36
  options[:local] = true if Bundler.app_cache.exist?
44
37
 
45
- 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
46
43
  end
47
44
 
48
45
  # When install is called with --no-deployment, disable deployment mode
49
46
  if options[:deployment] == false
50
- Bundler.settings.delete(:frozen)
47
+ Bundler.settings.set_command_option :frozen, nil
51
48
  options[:system] = true
52
49
  end
53
50
 
@@ -56,7 +53,7 @@ module Bundler
56
53
  Bundler::Fetcher.disable_endpoint = options["full-index"]
57
54
 
58
55
  if options["binstubs"]
59
- Bundler::SharedHelpers.major_deprecation \
56
+ Bundler::SharedHelpers.major_deprecation 2,
60
57
  "The --binstubs option will be removed in favor of `bundle binstubs`"
61
58
  end
62
59
 
@@ -66,24 +63,23 @@ module Bundler
66
63
  definition.validate_runtime!
67
64
 
68
65
  installer = Installer.install(Bundler.root, definition, options)
69
- 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?
70
67
 
71
68
  Bundler.ui.confirm "Bundle complete! #{dependencies_count_for(definition)}, #{gems_installed_for(definition)}."
72
69
  Bundler::CLI::Common.output_without_groups_message
73
70
 
74
- if Bundler.settings[:path]
75
- absolute_path = File.expand_path(Bundler.settings[:path])
76
- relative_path = absolute_path.sub(File.expand_path(".") + File::SEPARATOR, "." + File::SEPARATOR)
77
- Bundler.ui.confirm "Bundled gems are installed into #{relative_path}."
78
- else
71
+ if Bundler.use_system_gems?
79
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}`"
80
76
  end
81
77
 
82
78
  Bundler::CLI::Common.output_post_install_messages installer.post_install_messages
83
79
 
84
80
  warn_ambiguous_gems
85
81
 
86
- if Bundler.settings[:clean] && Bundler.settings[:path]
82
+ if CLI::Common.clean_after_install?
87
83
  require "bundler/cli/clean"
88
84
  Bundler::CLI::Clean.new(options).run
89
85
  end
@@ -124,15 +120,11 @@ module Bundler
124
120
  "#{count} #{count == 1 ? "gem" : "gems"} now installed"
125
121
  end
126
122
 
127
- def check_for_group_conflicts
128
- if options[:without] && options[:with]
129
- conflicting_groups = options[:without] & options[:with]
130
- unless conflicting_groups.empty?
131
- Bundler.ui.error "You can't list a group in both, --with and --without." \
132
- " The offending groups are: #{conflicting_groups.join(", ")}."
133
- exit 1
134
- end
135
- 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(", ")}."
136
128
  end
137
129
 
138
130
  def check_for_options_conflicts
@@ -145,28 +137,29 @@ module Bundler
145
137
  end
146
138
 
147
139
  def check_trust_policy
148
- if options["trust-policy"]
149
- unless Bundler.rubygems.security_policies.keys.include?(options["trust-policy"])
150
- Bundler.ui.error "Rubygems doesn't know about trust policy '#{options["trust-policy"]}'. " \
151
- "The known policies are: #{Bundler.rubygems.security_policies.keys.join(", ")}."
152
- exit 1
153
- end
154
- Bundler.settings["trust-policy"] = options["trust-policy"]
155
- else
156
- 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(", ")}."
157
144
  end
145
+ Bundler.settings.set_command_option_if_given :"trust-policy", trust_policy
158
146
  end
159
147
 
160
148
  def normalize_groups
161
- Bundler.settings.with = [] if options[:with] && options[:with].empty?
162
- 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(":")
151
+
152
+ check_for_group_conflicts_in_cli_options
163
153
 
164
- with = options.fetch("with", [])
165
- with |= Bundler.settings.with.map(&:to_s)
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)
166
159
  with -= options[:without] if options[:without]
167
160
 
168
- without = options.fetch("without", [])
169
- without |= Bundler.settings.without.map(&:to_s)
161
+ without = options.fetch(:without, [])
162
+ without |= Bundler.settings[:without].map(&:to_s)
170
163
  without -= options[:with] if options[:with]
171
164
 
172
165
  options[:with] = with
@@ -174,28 +167,38 @@ module Bundler
174
167
  end
175
168
 
176
169
  def normalize_settings
177
- Bundler.settings[:path] = nil if options[:system]
178
- Bundler.settings[:path] = "vendor/bundle" if options[:deployment]
179
- Bundler.settings[:path] = options["path"] if options["path"]
180
- 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
181
178
 
182
- Bundler.settings[:bin] = options["binstubs"] if options["binstubs"]
183
- 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"]
184
182
 
185
- Bundler.settings[:shebang] = options["shebang"] if options["shebang"]
183
+ Bundler.settings.set_command_option_if_given :shebang, options["shebang"]
186
184
 
187
- Bundler.settings[:jobs] = options["jobs"] if options["jobs"]
185
+ Bundler.settings.set_command_option_if_given :jobs, options["jobs"]
188
186
 
189
- Bundler.settings[:no_prune] = true if options["no-prune"]
187
+ Bundler.settings.set_command_option_if_given :no_prune, options["no-prune"]
190
188
 
191
- Bundler.settings[:no_install] = true if options["no-install"]
189
+ Bundler.settings.set_command_option_if_given :no_install, options["no-install"]
192
190
 
193
- Bundler.settings[:clean] = options["clean"] if options["clean"]
191
+ Bundler.settings.set_command_option_if_given :clean, options["clean"]
194
192
 
195
- Bundler.settings.without = options[:without]
196
- 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
197
200
 
198
- Bundler.settings[:disable_shared_gems] = Bundler.settings[:path] ? true : nil
201
+ options[:force] = options[:redownload]
199
202
  end
200
203
 
201
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