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,60 +1,96 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "uri"
3
4
 
4
5
  module Bundler
5
6
  class Settings
6
7
  autoload :Mirror, "bundler/mirror"
7
8
  autoload :Mirrors, "bundler/mirror"
9
+ autoload :Validator, "bundler/settings/validator"
8
10
 
9
- BOOL_KEYS = %w(
11
+ BOOL_KEYS = %w[
12
+ allow_bundler_dependency_conflicts
13
+ allow_deployment_source_credential_changes
10
14
  allow_offline_install
15
+ auto_clean_without_path
11
16
  auto_install
17
+ auto_config_jobs
12
18
  cache_all
13
19
  cache_all_platforms
20
+ cache_command_is_package
21
+ console_command
22
+ default_install_uses_path
23
+ deployment
24
+ deployment_means_frozen
14
25
  disable_checksum_validation
15
26
  disable_exec_load
16
27
  disable_local_branch_check
28
+ disable_multisource
29
+ disable_platform_warnings
17
30
  disable_shared_gems
18
31
  disable_version_check
32
+ error_on_stderr
19
33
  force_ruby_platform
34
+ forget_cli_options
20
35
  frozen
21
36
  gem.coc
22
37
  gem.mit
38
+ global_path_appends_ruby_scope
39
+ global_gem_cache
23
40
  ignore_messages
41
+ init_gems_rb
42
+ list_command
43
+ lockfile_uses_separate_rubygems_sources
24
44
  major_deprecations
25
45
  no_install
26
46
  no_prune
27
47
  only_update_to_newer_versions
48
+ path_relative_to_cwd
49
+ path.system
28
50
  plugins
51
+ prefer_gems_rb
52
+ print_only_version_number
53
+ setup_makes_kernel_gem_public
29
54
  silence_root_warning
30
- ).freeze
31
-
32
- NUMBER_KEYS = %w(
55
+ skip_default_git_sources
56
+ specific_platform
57
+ suppress_install_using_messages
58
+ unlock_source_unlocks_spec
59
+ update_requires_all_flag
60
+ use_gem_version_promoter_for_major_updates
61
+ viz_command
62
+ ].freeze
63
+
64
+ NUMBER_KEYS = %w[
65
+ jobs
33
66
  redirect
34
67
  retry
35
68
  ssl_verify_mode
36
69
  timeout
37
- ).freeze
70
+ ].freeze
71
+
72
+ ARRAY_KEYS = %w[
73
+ with
74
+ without
75
+ ].freeze
38
76
 
39
77
  DEFAULT_CONFIG = {
78
+ :disable_version_check => true,
40
79
  :redirect => 5,
41
80
  :retry => 3,
42
81
  :timeout => 10,
43
82
  }.freeze
44
83
 
45
- attr_accessor :cli_flags_given
46
-
47
84
  def initialize(root = nil)
48
85
  @root = root
49
86
  @local_config = load_config(local_config_file)
50
87
  @global_config = load_config(global_config_file)
51
- @cli_flags_given = false
52
88
  @temporary = {}
53
89
  end
54
90
 
55
91
  def [](name)
56
92
  key = key_for(name)
57
- value = @temporary.fetch(name) do
93
+ value = @temporary.fetch(key) do
58
94
  @local_config.fetch(key) do
59
95
  ENV.fetch(key) do
60
96
  @global_config.fetch(key) do
@@ -65,48 +101,59 @@ module Bundler
65
101
  converted_value(value, name)
66
102
  end
67
103
 
68
- def []=(key, value)
69
- if cli_flags_given
104
+ def set_command_option(key, value)
105
+ if Bundler.feature_flag.forget_cli_options?
106
+ temporary(key => value)
107
+ value
108
+ else
70
109
  command = if value.nil?
71
110
  "bundle config --delete #{key}"
72
111
  else
73
112
  "bundle config #{key} #{Array(value).join(":")}"
74
113
  end
75
114
 
76
- Bundler::SharedHelpers.major_deprecation \
115
+ Bundler::SharedHelpers.major_deprecation 2,\
77
116
  "flags passed to commands " \
78
117
  "will no longer be automatically remembered. Instead please set flags " \
79
118
  "you want remembered between commands using `bundle config " \
80
119
  "<setting name> <setting value>`, i.e. `#{command}`"
120
+
121
+ set_local(key, value)
81
122
  end
123
+ end
124
+
125
+ def set_command_option_if_given(key, value)
126
+ return if value.nil?
127
+ set_command_option(key, value)
128
+ end
129
+
130
+ def set_local(key, value)
82
131
  local_config_file || raise(GemfileNotFound, "Could not locate Gemfile")
132
+
83
133
  set_key(key, value, @local_config, local_config_file)
84
134
  end
85
- alias_method :set_local, :[]=
86
135
 
87
136
  def temporary(update)
88
- existing = Hash[update.map {|k, _| [k, @temporary[k]] }]
89
- @temporary.update(update)
137
+ existing = Hash[update.map {|k, _| [k, @temporary[key_for(k)]] }]
138
+ update.each do |k, v|
139
+ set_key(k, v, @temporary, nil)
140
+ end
90
141
  return unless block_given?
91
142
  begin
92
143
  yield
93
144
  ensure
94
- existing.each {|k, v| v.nil? ? @temporary.delete(k) : @temporary[k] = v }
145
+ existing.each {|k, v| set_key(k, v, @temporary, nil) }
95
146
  end
96
147
  end
97
148
 
98
- def delete(key)
99
- @local_config.delete(key_for(key))
100
- end
101
-
102
149
  def set_global(key, value)
103
150
  set_key(key, value, @global_config, global_config_file)
104
151
  end
105
152
 
106
153
  def all
107
- env_keys = ENV.keys.select {|k| k =~ /BUNDLE_.*/ }
154
+ env_keys = ENV.keys.grep(/\ABUNDLE_.+/)
108
155
 
109
- keys = @global_config.keys | @local_config.keys | env_keys
156
+ keys = @temporary.keys | @global_config.keys | @local_config.keys | env_keys
110
157
 
111
158
  keys.map do |key|
112
159
  key.sub(/^BUNDLE_/, "").gsub(/__/, ".").downcase
@@ -132,7 +179,7 @@ module Bundler
132
179
 
133
180
  def gem_mirrors
134
181
  all.inject(Mirrors.new) do |mirrors, k|
135
- mirrors.parse(k, self[k]) if k =~ /^mirror\./
182
+ mirrors.parse(k, self[k]) if k.start_with?("mirror.")
136
183
  mirrors
137
184
  end
138
185
  end
@@ -140,6 +187,7 @@ module Bundler
140
187
  def locations(key)
141
188
  key = key_for(key)
142
189
  locations = {}
190
+ locations[:temporary] = @temporary[key] if @temporary.key?(key)
143
191
  locations[:local] = @local_config[key] if @local_config.key?(key)
144
192
  locations[:env] = ENV[key] if ENV[key]
145
193
  locations[:global] = @global_config[key] if @global_config.key?(key)
@@ -151,6 +199,11 @@ module Bundler
151
199
  key = key_for(exposed_key)
152
200
 
153
201
  locations = []
202
+
203
+ if @temporary.key?(key)
204
+ locations << "Set for the current command: #{converted_value(@temporary[key], exposed_key).inspect}"
205
+ end
206
+
154
207
  if @local_config.key?(key)
155
208
  locations << "Set for your local app (#{local_config_file}): #{converted_value(@local_config[key], exposed_key).inspect}"
156
209
  end
@@ -167,37 +220,70 @@ module Bundler
167
220
  locations
168
221
  end
169
222
 
170
- def without=(array)
171
- set_array(:without, array)
172
- end
223
+ # for legacy reasons, in Bundler 1, the ruby scope isnt appended when the setting comes from ENV or the global config,
224
+ # nor do we respect :disable_shared_gems
225
+ def path
226
+ key = key_for(:path)
227
+ path = ENV[key] || @global_config[key]
228
+ if path && !@temporary.key?(key) && !@local_config.key?(key)
229
+ return Path.new(path, Bundler.feature_flag.global_path_appends_ruby_scope?, false, false)
230
+ end
173
231
 
174
- def with=(array)
175
- set_array(:with, array)
232
+ system_path = self["path.system"] || (self[:disable_shared_gems] == false)
233
+ Path.new(self[:path], true, system_path, Bundler.feature_flag.default_install_uses_path?)
176
234
  end
177
235
 
178
- def without
179
- get_array(:without)
180
- end
236
+ Path = Struct.new(:explicit_path, :append_ruby_scope, :system_path, :default_install_uses_path) do
237
+ def path
238
+ path = base_path
239
+ path = File.join(path, Bundler.ruby_scope) if append_ruby_scope && !use_system_gems?
240
+ path
241
+ end
181
242
 
182
- def with
183
- get_array(:with)
184
- end
243
+ def use_system_gems?
244
+ return true if system_path
245
+ return false if explicit_path
246
+ !default_install_uses_path
247
+ end
185
248
 
186
- # @local_config["BUNDLE_PATH"] should be prioritized over ENV["BUNDLE_PATH"]
187
- def path
188
- key = key_for(:path)
189
- path = ENV[key] || @global_config[key]
190
- return path if path && !@local_config.key?(key)
249
+ def base_path
250
+ path = explicit_path
251
+ path ||= ".bundle" unless use_system_gems?
252
+ path ||= Bundler.rubygems.gem_dir
253
+ path
254
+ end
191
255
 
192
- if path = self[:path]
193
- "#{path}/#{Bundler.ruby_scope}"
194
- else
195
- Bundler.rubygems.gem_dir
256
+ def base_path_relative_to_pwd
257
+ base_path = Pathname.new(self.base_path)
258
+ expanded_base_path = base_path.expand_path(Bundler.root)
259
+ relative_path = expanded_base_path.relative_path_from(Pathname.pwd)
260
+ if relative_path.to_s.start_with?("..")
261
+ relative_path = base_path if base_path.absolute?
262
+ else
263
+ relative_path = Pathname.new(File.join(".", relative_path))
264
+ end
265
+ relative_path
266
+ rescue ArgumentError
267
+ expanded_base_path
268
+ end
269
+
270
+ def validate!
271
+ return unless explicit_path && system_path
272
+ path = Bundler.settings.pretty_values_for(:path)
273
+ path.unshift(nil, "path:") unless path.empty?
274
+ system_path = Bundler.settings.pretty_values_for("path.system")
275
+ system_path.unshift(nil, "path.system:") unless system_path.empty?
276
+ disable_shared_gems = Bundler.settings.pretty_values_for(:disable_shared_gems)
277
+ disable_shared_gems.unshift(nil, "disable_shared_gems:") unless disable_shared_gems.empty?
278
+ raise InvalidOption,
279
+ "Using a custom path while using system gems is unsupported.\n#{path.join("\n")}\n#{system_path.join("\n")}\n#{disable_shared_gems.join("\n")}"
196
280
  end
197
281
  end
198
282
 
199
283
  def allow_sudo?
200
- !@local_config.key?(key_for(:path))
284
+ key = key_for(:path)
285
+ path_configured = @temporary.key?(key) || @local_config.key?(key)
286
+ !path_configured
201
287
  end
202
288
 
203
289
  def ignore_config?
@@ -205,14 +291,17 @@ module Bundler
205
291
  end
206
292
 
207
293
  def app_cache_path
208
- @app_cache_path ||= begin
209
- path = self[:cache_path] || "vendor/cache"
210
- raise InvalidOption, "Cache path must be relative to the bundle path" if path.start_with?("/")
211
- path
212
- end
294
+ @app_cache_path ||= self[:cache_path] || "vendor/cache"
213
295
  end
214
296
 
215
- private
297
+ def validate!
298
+ all.each do |raw_key|
299
+ [@local_config, ENV, @global_config].each do |settings|
300
+ value = converted_value(settings[key_for(raw_key)], raw_key)
301
+ Validator.validate!(raw_key, value, settings.to_hash.dup)
302
+ end
303
+ end
304
+ end
216
305
 
217
306
  def key_for(key)
218
307
  key = Settings.normalize_uri(key).to_s if key.is_a?(String) && /https?:/ =~ key
@@ -220,15 +309,17 @@ module Bundler
220
309
  "BUNDLE_#{key}"
221
310
  end
222
311
 
312
+ private
313
+
223
314
  def parent_setting_for(name)
224
- split_specfic_setting_for(name)[0]
315
+ split_specific_setting_for(name)[0]
225
316
  end
226
317
 
227
- def specfic_gem_for(name)
228
- split_specfic_setting_for(name)[1]
318
+ def specific_gem_for(name)
319
+ split_specific_setting_for(name)[1]
229
320
  end
230
321
 
231
- def split_specfic_setting_for(name)
322
+ def split_specific_setting_for(name)
232
323
  name.split(".")
233
324
  end
234
325
 
@@ -245,43 +336,57 @@ module Bundler
245
336
  end
246
337
  end
247
338
 
248
- def is_num(value)
249
- NUMBER_KEYS.include?(value.to_s)
339
+ def is_num(key)
340
+ NUMBER_KEYS.include?(key.to_s)
250
341
  end
251
342
 
252
- def get_array(key)
253
- self[key] ? self[key].split(":").map(&:to_sym) : []
343
+ def is_array(key)
344
+ ARRAY_KEYS.include?(key.to_s)
254
345
  end
255
346
 
256
- def set_array(key, array)
257
- self[key] = (array.empty? ? nil : array.join(":")) if array
347
+ def to_array(value)
348
+ return [] unless value
349
+ value.split(":").map(&:to_sym)
258
350
  end
259
351
 
260
- def set_key(key, value, hash, file)
261
- key = key_for(key)
352
+ def array_to_s(array)
353
+ array = Array(array)
354
+ return nil if array.empty?
355
+ array.join(":").tr(" ", ":")
356
+ end
262
357
 
263
- unless hash[key] == value
264
- hash[key] = value
265
- hash.delete(key) if value.nil?
266
- SharedHelpers.filesystem_access(file) do |p|
267
- FileUtils.mkdir_p(p.dirname)
268
- require "bundler/yaml_serializer"
269
- p.open("w") {|f| f.write(YAMLSerializer.dump(hash)) }
270
- end
271
- end
358
+ def set_key(raw_key, value, hash, file)
359
+ raw_key = raw_key.to_s
360
+ value = array_to_s(value) if is_array(raw_key)
361
+
362
+ key = key_for(raw_key)
363
+
364
+ return if hash[key] == value
365
+
366
+ hash[key] = value
367
+ hash.delete(key) if value.nil?
272
368
 
273
- value
369
+ Validator.validate!(raw_key, converted_value(value, raw_key), hash)
370
+
371
+ return unless file
372
+ SharedHelpers.filesystem_access(file) do |p|
373
+ FileUtils.mkdir_p(p.dirname)
374
+ require "bundler/yaml_serializer"
375
+ p.open("w") {|f| f.write(YAMLSerializer.dump(hash)) }
376
+ end
274
377
  end
275
378
 
276
379
  def converted_value(value, key)
277
- if value.nil?
380
+ if is_array(key)
381
+ to_array(value)
382
+ elsif value.nil?
278
383
  nil
279
384
  elsif is_bool(key) || value == "false"
280
385
  to_bool(value)
281
386
  elsif is_num(key)
282
387
  value.to_i
283
388
  else
284
- value
389
+ value.to_s
285
390
  end
286
391
  end
287
392
 
@@ -290,7 +395,7 @@ module Bundler
290
395
  Pathname.new(ENV["BUNDLE_CONFIG"])
291
396
  else
292
397
  begin
293
- Bundler.user_bundle_path.join("config")
398
+ Bundler.user_bundle_path("config")
294
399
  rescue PermissionError, GenericSystemCallError
295
400
  nil
296
401
  end
@@ -325,16 +430,34 @@ module Bundler
325
430
  end
326
431
  end
327
432
 
433
+ PER_URI_OPTIONS = %w[
434
+ fallback_timeout
435
+ ].freeze
436
+
437
+ NORMALIZE_URI_OPTIONS_PATTERN =
438
+ /
439
+ \A
440
+ (\w+\.)? # optional prefix key
441
+ (https?.*?) # URI
442
+ (\.#{Regexp.union(PER_URI_OPTIONS)})? # optional suffix key
443
+ \z
444
+ /ix
445
+
328
446
  # TODO: duplicates Rubygems#normalize_uri
329
447
  # TODO: is this the correct place to validate mirror URIs?
330
448
  def self.normalize_uri(uri)
331
449
  uri = uri.to_s
332
- uri = "#{uri}/" unless uri =~ %r{/\Z}
450
+ if uri =~ NORMALIZE_URI_OPTIONS_PATTERN
451
+ prefix = $1
452
+ uri = $2
453
+ suffix = $3
454
+ end
455
+ uri = "#{uri}/" unless uri.end_with?("/")
333
456
  uri = URI(uri)
334
457
  unless uri.absolute?
335
458
  raise ArgumentError, format("Gem sources must be absolute. You provided '%s'.", uri)
336
459
  end
337
- uri
460
+ "#{prefix}#{uri}#{suffix}"
338
461
  end
339
462
  end
340
463
  end
data/lib/bundler/setup.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "bundler/shared_helpers"
3
4
 
4
5
  if Bundler::SharedHelpers.in_bundle?