bundler 1.15.4 → 1.16.0.pre.1

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 (251) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +43 -0
  3. data/README.md +12 -7
  4. data/exe/bundle +1 -1
  5. data/exe/bundle_ruby +4 -3
  6. data/lib/bundler.rb +47 -37
  7. data/lib/bundler/build_metadata.rb +38 -0
  8. data/lib/bundler/capistrano.rb +5 -0
  9. data/lib/bundler/cli.rb +155 -67
  10. data/lib/bundler/cli/add.rb +0 -1
  11. data/lib/bundler/cli/binstubs.rb +9 -7
  12. data/lib/bundler/cli/cache.rb +5 -4
  13. data/lib/bundler/cli/check.rb +3 -5
  14. data/lib/bundler/cli/clean.rb +5 -6
  15. data/lib/bundler/cli/common.rb +11 -2
  16. data/lib/bundler/cli/config.rb +2 -1
  17. data/lib/bundler/cli/console.rb +2 -1
  18. data/lib/bundler/cli/doctor.rb +1 -0
  19. data/lib/bundler/cli/exec.rb +2 -1
  20. data/lib/bundler/cli/gem.rb +3 -2
  21. data/lib/bundler/cli/info.rb +0 -1
  22. data/lib/bundler/cli/init.rb +17 -6
  23. data/lib/bundler/cli/inject.rb +1 -0
  24. data/lib/bundler/cli/install.rb +61 -61
  25. data/lib/bundler/cli/issue.rb +1 -1
  26. data/lib/bundler/cli/list.rb +22 -0
  27. data/lib/bundler/cli/lock.rb +0 -1
  28. data/lib/bundler/cli/open.rb +2 -2
  29. data/lib/bundler/cli/outdated.rb +13 -8
  30. data/lib/bundler/cli/package.rb +9 -6
  31. data/lib/bundler/cli/platform.rb +1 -0
  32. data/lib/bundler/cli/plugin.rb +1 -0
  33. data/lib/bundler/cli/pristine.rb +9 -2
  34. data/lib/bundler/cli/show.rb +0 -1
  35. data/lib/bundler/cli/update.rb +31 -5
  36. data/lib/bundler/cli/viz.rb +1 -0
  37. data/lib/bundler/compact_index_client.rb +1 -0
  38. data/lib/bundler/compact_index_client/cache.rb +1 -0
  39. data/lib/bundler/compact_index_client/updater.rb +3 -2
  40. data/lib/bundler/compatibility_guard.rb +14 -0
  41. data/lib/bundler/constants.rb +1 -0
  42. data/lib/bundler/current_ruby.rb +5 -4
  43. data/lib/bundler/definition.rb +140 -95
  44. data/lib/bundler/dep_proxy.rb +2 -0
  45. data/lib/bundler/dependency.rb +6 -7
  46. data/lib/bundler/deployment.rb +1 -1
  47. data/lib/bundler/deprecate.rb +1 -0
  48. data/lib/bundler/dsl.rb +97 -62
  49. data/lib/bundler/endpoint_specification.rb +9 -0
  50. data/lib/bundler/env.rb +63 -27
  51. data/lib/bundler/environment_preserver.rb +26 -6
  52. data/lib/bundler/errors.rb +1 -0
  53. data/lib/bundler/feature_flag.rb +39 -4
  54. data/lib/bundler/fetcher.rb +15 -8
  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 +1 -0
  58. data/lib/bundler/fetcher/downloader.rb +1 -0
  59. data/lib/bundler/fetcher/index.rb +1 -0
  60. data/lib/bundler/friendly_errors.rb +2 -1
  61. data/lib/bundler/gem_helper.rb +14 -9
  62. data/lib/bundler/gem_helpers.rb +1 -0
  63. data/lib/bundler/gem_remote_fetcher.rb +1 -0
  64. data/lib/bundler/gem_tasks.rb +1 -0
  65. data/lib/bundler/gem_version_promoter.rb +1 -0
  66. data/lib/bundler/gemdeps.rb +1 -0
  67. data/lib/bundler/graph.rb +1 -0
  68. data/lib/bundler/index.rb +15 -8
  69. data/lib/bundler/injector.rb +25 -22
  70. data/lib/bundler/inline.rb +5 -7
  71. data/lib/bundler/installer.rb +93 -45
  72. data/lib/bundler/installer/gem_installer.rb +2 -0
  73. data/lib/bundler/installer/parallel_installer.rb +73 -42
  74. data/lib/bundler/installer/standalone.rb +1 -0
  75. data/lib/bundler/lazy_specification.rb +2 -1
  76. data/lib/bundler/lockfile_generator.rb +95 -0
  77. data/lib/bundler/lockfile_parser.rb +10 -4
  78. data/lib/bundler/match_platform.rb +1 -0
  79. data/lib/bundler/mirror.rb +6 -3
  80. data/lib/bundler/plugin.rb +1 -0
  81. data/lib/bundler/plugin/api/source.rb +8 -0
  82. data/lib/bundler/plugin/installer.rb +7 -6
  83. data/lib/bundler/plugin/source_list.rb +7 -8
  84. data/lib/bundler/process_lock.rb +24 -0
  85. data/lib/bundler/psyched_yaml.rb +1 -0
  86. data/lib/bundler/remote_specification.rb +1 -0
  87. data/lib/bundler/resolver.rb +138 -191
  88. data/lib/bundler/resolver/spec_group.rb +111 -0
  89. data/lib/bundler/retry.rb +1 -0
  90. data/lib/bundler/ruby_dsl.rb +1 -0
  91. data/lib/bundler/ruby_version.rb +1 -0
  92. data/lib/bundler/rubygems_ext.rb +5 -4
  93. data/lib/bundler/rubygems_gem_installer.rb +23 -0
  94. data/lib/bundler/rubygems_integration.rb +56 -27
  95. data/lib/bundler/runtime.rb +3 -5
  96. data/lib/bundler/settings.rb +177 -76
  97. data/lib/bundler/settings/validator.rb +79 -0
  98. data/lib/bundler/setup.rb +1 -0
  99. data/lib/bundler/shared_helpers.rb +86 -26
  100. data/lib/bundler/similarity_detector.rb +1 -0
  101. data/lib/bundler/source.rb +32 -0
  102. data/lib/bundler/source/gemspec.rb +1 -0
  103. data/lib/bundler/source/git.rb +21 -16
  104. data/lib/bundler/source/git/git_proxy.rb +14 -10
  105. data/lib/bundler/source/metadata.rb +63 -0
  106. data/lib/bundler/source/path.rb +8 -8
  107. data/lib/bundler/source/path/installer.rb +2 -0
  108. data/lib/bundler/source/rubygems.rb +131 -84
  109. data/lib/bundler/source/rubygems/remote.rb +3 -0
  110. data/lib/bundler/source_list.rb +75 -15
  111. data/lib/bundler/spec_set.rb +2 -1
  112. data/lib/bundler/ssl_certs/certificate_manager.rb +2 -1
  113. data/lib/bundler/stub_specification.rb +1 -0
  114. data/lib/bundler/templates/Executable +4 -0
  115. data/lib/bundler/templates/Executable.bundler +105 -0
  116. data/lib/bundler/templates/Gemfile +1 -0
  117. data/lib/bundler/templates/gems.rb +8 -0
  118. data/lib/bundler/templates/newgem/README.md.tt +1 -1
  119. data/lib/bundler/templates/newgem/gitignore.tt +0 -1
  120. data/lib/bundler/templates/newgem/newgem.gemspec.tt +4 -1
  121. data/lib/bundler/templates/newgem/rspec.tt +1 -0
  122. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +0 -2
  123. data/lib/bundler/ui.rb +1 -0
  124. data/lib/bundler/ui/rg_proxy.rb +1 -0
  125. data/lib/bundler/ui/shell.rb +15 -4
  126. data/lib/bundler/ui/silent.rb +1 -0
  127. data/lib/bundler/uri_credentials_filter.rb +1 -0
  128. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1638 -0
  129. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +2 -0
  130. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +26 -0
  131. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +7 -0
  132. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +1 -0
  133. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +3 -2
  134. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +1 -0
  135. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +1 -0
  136. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -0
  137. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -0
  138. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -0
  139. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +1 -0
  140. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -0
  141. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +1 -0
  142. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +3 -2
  143. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +69 -6
  144. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +2 -1
  145. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +1 -0
  146. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +3 -1
  147. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +487 -148
  148. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +1 -0
  149. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +8 -4
  150. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1 -1
  151. data/lib/bundler/vendored_fileutils.rb +9 -0
  152. data/lib/bundler/vendored_molinillo.rb +1 -0
  153. data/lib/bundler/vendored_persistent.rb +34 -0
  154. data/lib/bundler/vendored_thor.rb +1 -0
  155. data/lib/bundler/version.rb +6 -2
  156. data/lib/bundler/version_ranges.rb +1 -0
  157. data/lib/bundler/vlad.rb +5 -0
  158. data/lib/bundler/worker.rb +1 -0
  159. data/lib/bundler/yaml_serializer.rb +3 -3
  160. data/man/bundle-add.1 +43 -0
  161. data/man/bundle-add.1.txt +40 -0
  162. data/man/bundle-binstubs.1 +40 -0
  163. data/man/bundle-binstubs.1.txt +48 -0
  164. data/man/bundle-binstubs.ronn +14 -0
  165. data/man/bundle-check.1 +31 -0
  166. data/man/bundle-check.1.txt +32 -0
  167. data/man/bundle-clean.1 +24 -0
  168. data/man/bundle-clean.1.txt +26 -0
  169. data/man/bundle-config.1 +455 -0
  170. data/man/bundle-config.1.txt +491 -0
  171. data/man/bundle-config.ronn +133 -79
  172. data/man/bundle-exec.1 +165 -0
  173. data/man/bundle-exec.1.txt +178 -0
  174. data/man/bundle-exec.ronn +7 -0
  175. data/man/bundle-gem.1 +80 -0
  176. data/man/bundle-gem.1.txt +91 -0
  177. data/man/bundle-gem.ronn +2 -1
  178. data/man/bundle-info.1 +20 -0
  179. data/man/bundle-info.1.txt +21 -0
  180. data/man/bundle-init.1 +20 -0
  181. data/man/bundle-init.1.txt +24 -0
  182. data/man/bundle-inject.1 +33 -0
  183. data/man/bundle-inject.1.txt +32 -0
  184. data/man/bundle-install.1 +305 -0
  185. data/man/bundle-install.1.txt +385 -0
  186. data/man/bundle-install.ronn +32 -32
  187. data/man/bundle-list.1 +20 -0
  188. data/man/bundle-list.1.txt +21 -0
  189. data/man/bundle-list.ronn +15 -0
  190. data/man/bundle-lock.1 +84 -0
  191. data/man/bundle-lock.1.txt +93 -0
  192. data/man/bundle-open.1 +32 -0
  193. data/man/bundle-open.1.txt +29 -0
  194. data/man/bundle-outdated.1 +151 -0
  195. data/man/bundle-outdated.1.txt +127 -0
  196. data/man/bundle-outdated.ronn +1 -1
  197. data/man/bundle-package.1 +55 -0
  198. data/man/bundle-package.1.txt +79 -0
  199. data/man/bundle-package.ronn +5 -0
  200. data/man/bundle-platform.1 +61 -0
  201. data/man/bundle-platform.1.txt +57 -0
  202. data/man/bundle-pristine.1 +34 -0
  203. data/man/bundle-pristine.1.txt +44 -0
  204. data/man/bundle-pristine.ronn +24 -3
  205. data/man/bundle-show.1 +23 -0
  206. data/man/bundle-show.1.txt +25 -0
  207. data/man/bundle-update.1 +390 -0
  208. data/man/bundle-update.1.txt +386 -0
  209. data/man/bundle-update.ronn +2 -2
  210. data/man/bundle-viz.1 +39 -0
  211. data/man/bundle-viz.1.txt +38 -0
  212. data/man/bundle-viz.ronn +5 -5
  213. data/man/bundle.1 +132 -0
  214. data/man/bundle.1.txt +113 -0
  215. data/man/bundle.ronn +5 -2
  216. data/man/gemfile.5 +679 -0
  217. data/man/gemfile.5.ronn +31 -0
  218. data/man/gemfile.5.txt +636 -0
  219. data/man/index.txt +23 -0
  220. metadata +21 -36
  221. data/.codeclimate.yml +0 -25
  222. data/.gitignore +0 -18
  223. data/.rspec +0 -3
  224. data/.rubocop.yml +0 -131
  225. data/.rubocop_todo.yml +0 -418
  226. data/.travis.yml +0 -122
  227. data/CODE_OF_CONDUCT.md +0 -42
  228. data/CONTRIBUTING.md +0 -17
  229. data/Rakefile +0 -338
  230. data/bin/rake +0 -19
  231. data/bin/rspec +0 -15
  232. data/bin/rubocop +0 -17
  233. data/bin/with_rubygems +0 -39
  234. data/bundler.gemspec +0 -48
  235. data/doc/README.md +0 -30
  236. data/doc/TROUBLESHOOTING.md +0 -64
  237. data/doc/contributing/BUG_TRIAGE.md +0 -36
  238. data/doc/contributing/COMMUNITY.md +0 -13
  239. data/doc/contributing/GETTING_HELP.md +0 -11
  240. data/doc/contributing/HOW_YOU_CAN_HELP.md +0 -27
  241. data/doc/contributing/ISSUES.md +0 -51
  242. data/doc/contributing/README.md +0 -38
  243. data/doc/development/NEW_FEATURES.md +0 -10
  244. data/doc/development/PULL_REQUESTS.md +0 -40
  245. data/doc/development/README.md +0 -19
  246. data/doc/development/RELEASING.md +0 -9
  247. data/doc/development/SETUP.md +0 -27
  248. data/doc/documentation/README.md +0 -29
  249. data/doc/documentation/VISION.md +0 -26
  250. data/doc/documentation/WRITING.md +0 -54
  251. data/task/release.rake +0 -116
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "digest/sha1"
3
4
 
4
5
  module Bundler
@@ -11,7 +12,7 @@ module Bundler
11
12
  end
12
13
 
13
14
  def setup(*groups)
14
- @definition.ensure_equivalent_gemfile_and_lockfile if Bundler.settings[:frozen]
15
+ @definition.ensure_equivalent_gemfile_and_lockfile if Bundler.frozen?
15
16
 
16
17
  groups.map!(&:to_sym)
17
18
 
@@ -262,9 +263,6 @@ module Bundler
262
263
  end
263
264
 
264
265
  def setup_manpath
265
- # Store original MANPATH for restoration later in with_clean_env()
266
- ENV["BUNDLER_ORIG_MANPATH"] = ENV["MANPATH"]
267
-
268
266
  # Add man/ subdirectories from activated bundles to MANPATH for man(1)
269
267
  manuals = $LOAD_PATH.map do |path|
270
268
  man_subdir = path.sub(/lib$/, "man")
@@ -272,7 +270,7 @@ module Bundler
272
270
  end.compact
273
271
 
274
272
  return if manuals.empty?
275
- ENV["MANPATH"] = manuals.concat(
273
+ Bundler::SharedHelpers.set_env "MANPATH", manuals.concat(
276
274
  ENV["MANPATH"].to_s.split(File::PATH_SEPARATOR)
277
275
  ).uniq.join(File::PATH_SEPARATOR)
278
276
  end
@@ -1,40 +1,71 @@
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
12
17
  cache_all
13
18
  cache_all_platforms
19
+ cache_command_is_package
20
+ console_command
21
+ default_install_uses_path
22
+ deployment
23
+ deployment_means_frozen
14
24
  disable_checksum_validation
15
25
  disable_exec_load
16
26
  disable_local_branch_check
27
+ disable_multisource
17
28
  disable_shared_gems
18
29
  disable_version_check
30
+ error_on_stderr
19
31
  force_ruby_platform
32
+ forget_cli_options
20
33
  frozen
21
34
  gem.coc
22
35
  gem.mit
36
+ global_gem_cache
23
37
  ignore_messages
38
+ init_gems_rb
39
+ list_command
40
+ lockfile_uses_separate_rubygems_sources
24
41
  major_deprecations
25
42
  no_install
26
43
  no_prune
27
44
  only_update_to_newer_versions
45
+ path.system
28
46
  plugins
47
+ prefer_gems_rb
48
+ print_only_version_number
49
+ setup_makes_kernel_gem_public
29
50
  silence_root_warning
30
- ).freeze
31
-
32
- NUMBER_KEYS = %w(
51
+ skip_default_git_sources
52
+ specific_platform
53
+ suppress_install_using_messages
54
+ unlock_source_unlocks_spec
55
+ update_requires_all_flag
56
+ ].freeze
57
+
58
+ NUMBER_KEYS = %w[
33
59
  redirect
34
60
  retry
35
61
  ssl_verify_mode
36
62
  timeout
37
- ).freeze
63
+ ].freeze
64
+
65
+ ARRAY_KEYS = %w[
66
+ with
67
+ without
68
+ ].freeze
38
69
 
39
70
  DEFAULT_CONFIG = {
40
71
  :redirect => 5,
@@ -42,19 +73,16 @@ module Bundler
42
73
  :timeout => 10,
43
74
  }.freeze
44
75
 
45
- attr_accessor :cli_flags_given
46
-
47
76
  def initialize(root = nil)
48
77
  @root = root
49
78
  @local_config = load_config(local_config_file)
50
79
  @global_config = load_config(global_config_file)
51
- @cli_flags_given = false
52
80
  @temporary = {}
53
81
  end
54
82
 
55
83
  def [](name)
56
84
  key = key_for(name)
57
- value = @temporary.fetch(name) do
85
+ value = @temporary.fetch(key) do
58
86
  @local_config.fetch(key) do
59
87
  ENV.fetch(key) do
60
88
  @global_config.fetch(key) do
@@ -65,48 +93,59 @@ module Bundler
65
93
  converted_value(value, name)
66
94
  end
67
95
 
68
- def []=(key, value)
69
- if cli_flags_given
96
+ def set_command_option(key, value)
97
+ if Bundler.feature_flag.forget_cli_options?
98
+ temporary(key => value)
99
+ value
100
+ else
70
101
  command = if value.nil?
71
102
  "bundle config --delete #{key}"
72
103
  else
73
104
  "bundle config #{key} #{Array(value).join(":")}"
74
105
  end
75
106
 
76
- Bundler::SharedHelpers.major_deprecation \
107
+ Bundler::SharedHelpers.major_deprecation 2,\
77
108
  "flags passed to commands " \
78
109
  "will no longer be automatically remembered. Instead please set flags " \
79
110
  "you want remembered between commands using `bundle config " \
80
111
  "<setting name> <setting value>`, i.e. `#{command}`"
112
+
113
+ set_local(key, value)
81
114
  end
115
+ end
116
+
117
+ def set_command_option_if_given(key, value)
118
+ return if value.nil?
119
+ set_command_option(key, value)
120
+ end
121
+
122
+ def set_local(key, value)
82
123
  local_config_file || raise(GemfileNotFound, "Could not locate Gemfile")
124
+
83
125
  set_key(key, value, @local_config, local_config_file)
84
126
  end
85
- alias_method :set_local, :[]=
86
127
 
87
128
  def temporary(update)
88
- existing = Hash[update.map {|k, _| [k, @temporary[k]] }]
89
- @temporary.update(update)
129
+ existing = Hash[update.map {|k, _| [k, @temporary[key_for(k)]] }]
130
+ update.each do |k, v|
131
+ set_key(k, v, @temporary, nil)
132
+ end
90
133
  return unless block_given?
91
134
  begin
92
135
  yield
93
136
  ensure
94
- existing.each {|k, v| v.nil? ? @temporary.delete(k) : @temporary[k] = v }
137
+ existing.each {|k, v| set_key(k, v, @temporary, nil) }
95
138
  end
96
139
  end
97
140
 
98
- def delete(key)
99
- @local_config.delete(key_for(key))
100
- end
101
-
102
141
  def set_global(key, value)
103
142
  set_key(key, value, @global_config, global_config_file)
104
143
  end
105
144
 
106
145
  def all
107
- env_keys = ENV.keys.select {|k| k =~ /BUNDLE_.*/ }
146
+ env_keys = ENV.keys.grep(/\ABUNDLE_.+/)
108
147
 
109
- keys = @global_config.keys | @local_config.keys | env_keys
148
+ keys = @temporary.keys | @global_config.keys | @local_config.keys | env_keys
110
149
 
111
150
  keys.map do |key|
112
151
  key.sub(/^BUNDLE_/, "").gsub(/__/, ".").downcase
@@ -132,7 +171,7 @@ module Bundler
132
171
 
133
172
  def gem_mirrors
134
173
  all.inject(Mirrors.new) do |mirrors, k|
135
- mirrors.parse(k, self[k]) if k =~ /^mirror\./
174
+ mirrors.parse(k, self[k]) if k.start_with?("mirror.")
136
175
  mirrors
137
176
  end
138
177
  end
@@ -140,6 +179,7 @@ module Bundler
140
179
  def locations(key)
141
180
  key = key_for(key)
142
181
  locations = {}
182
+ locations[:temporary] = @temporary[key] if @temporary.key?(key)
143
183
  locations[:local] = @local_config[key] if @local_config.key?(key)
144
184
  locations[:env] = ENV[key] if ENV[key]
145
185
  locations[:global] = @global_config[key] if @global_config.key?(key)
@@ -151,6 +191,11 @@ module Bundler
151
191
  key = key_for(exposed_key)
152
192
 
153
193
  locations = []
194
+
195
+ if @temporary.key?(key)
196
+ locations << "Set for the current command: #{converted_value(@temporary[key], exposed_key).inspect}"
197
+ end
198
+
154
199
  if @local_config.key?(key)
155
200
  locations << "Set for your local app (#{local_config_file}): #{converted_value(@local_config[key], exposed_key).inspect}"
156
201
  end
@@ -167,37 +212,56 @@ module Bundler
167
212
  locations
168
213
  end
169
214
 
170
- def without=(array)
171
- set_array(:without, array)
172
- end
215
+ # for legacy reasons, the ruby scope isnt appended when the setting comes from ENV or the global config,
216
+ # nor do we respect :disable_shared_gems
217
+ def path
218
+ key = key_for(:path)
219
+ path = ENV[key] || @global_config[key]
220
+ if path && !@temporary.key?(key) && !@local_config.key?(key)
221
+ return Path.new(path, false, false, false)
222
+ end
173
223
 
174
- def with=(array)
175
- set_array(:with, array)
224
+ system_path = self["path.system"] || (self[:disable_shared_gems] == false)
225
+ Path.new(self[:path], true, system_path, Bundler.feature_flag.default_install_uses_path?)
176
226
  end
177
227
 
178
- def without
179
- get_array(:without)
180
- end
228
+ Path = Struct.new(:explicit_path, :append_ruby_scope, :system_path, :default_install_uses_path) do
229
+ def path
230
+ path = base_path
231
+ path = File.join(path, Bundler.ruby_scope) if append_ruby_scope && !use_system_gems?
232
+ path
233
+ end
181
234
 
182
- def with
183
- get_array(:with)
184
- end
235
+ def use_system_gems?
236
+ return true if system_path
237
+ return false if explicit_path
238
+ !default_install_uses_path
239
+ end
185
240
 
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)
241
+ def base_path
242
+ path = explicit_path
243
+ path ||= ".bundle" unless use_system_gems?
244
+ path ||= Bundler.rubygems.gem_dir
245
+ path
246
+ end
191
247
 
192
- if path = self[:path]
193
- "#{path}/#{Bundler.ruby_scope}"
194
- else
195
- Bundler.rubygems.gem_dir
248
+ def validate!
249
+ return unless explicit_path && system_path
250
+ path = Bundler.settings.pretty_values_for(:path)
251
+ path.unshift(nil, "path:") unless path.empty?
252
+ system_path = Bundler.settings.pretty_values_for("path.system")
253
+ system_path.unshift(nil, "path.system:") unless system_path.empty?
254
+ disable_shared_gems = Bundler.settings.pretty_values_for(:disable_shared_gems)
255
+ disable_shared_gems.unshift(nil, "disable_shared_gems:") unless disable_shared_gems.empty?
256
+ raise InvalidOption,
257
+ "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
258
  end
197
259
  end
198
260
 
199
261
  def allow_sudo?
200
- !@local_config.key?(key_for(:path))
262
+ key = key_for(:path)
263
+ path_configured = @temporary.key?(key) || @local_config.key?(key)
264
+ !path_configured
201
265
  end
202
266
 
203
267
  def ignore_config?
@@ -205,14 +269,17 @@ module Bundler
205
269
  end
206
270
 
207
271
  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
272
+ @app_cache_path ||= self[:cache_path] || "vendor/cache"
213
273
  end
214
274
 
215
- private
275
+ def validate!
276
+ all.each do |raw_key|
277
+ [@local_config, ENV, @global_config].each do |settings|
278
+ value = converted_value(settings[key_for(raw_key)], raw_key)
279
+ Validator.validate!(raw_key, value, settings.to_hash.dup)
280
+ end
281
+ end
282
+ end
216
283
 
217
284
  def key_for(key)
218
285
  key = Settings.normalize_uri(key).to_s if key.is_a?(String) && /https?:/ =~ key
@@ -220,15 +287,17 @@ module Bundler
220
287
  "BUNDLE_#{key}"
221
288
  end
222
289
 
290
+ private
291
+
223
292
  def parent_setting_for(name)
224
- split_specfic_setting_for(name)[0]
293
+ split_specific_setting_for(name)[0]
225
294
  end
226
295
 
227
- def specfic_gem_for(name)
228
- split_specfic_setting_for(name)[1]
296
+ def specific_gem_for(name)
297
+ split_specific_setting_for(name)[1]
229
298
  end
230
299
 
231
- def split_specfic_setting_for(name)
300
+ def split_specific_setting_for(name)
232
301
  name.split(".")
233
302
  end
234
303
 
@@ -245,43 +314,57 @@ module Bundler
245
314
  end
246
315
  end
247
316
 
248
- def is_num(value)
249
- NUMBER_KEYS.include?(value.to_s)
317
+ def is_num(key)
318
+ NUMBER_KEYS.include?(key.to_s)
250
319
  end
251
320
 
252
- def get_array(key)
253
- self[key] ? self[key].split(":").map(&:to_sym) : []
321
+ def is_array(key)
322
+ ARRAY_KEYS.include?(key.to_s)
254
323
  end
255
324
 
256
- def set_array(key, array)
257
- self[key] = (array.empty? ? nil : array.join(":")) if array
325
+ def to_array(value)
326
+ return [] unless value
327
+ value.split(":").map(&:to_sym)
258
328
  end
259
329
 
260
- def set_key(key, value, hash, file)
261
- key = key_for(key)
330
+ def array_to_s(array)
331
+ array = Array(array)
332
+ return nil if array.empty?
333
+ array.join(":").tr(" ", ":")
334
+ end
262
335
 
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
336
+ def set_key(raw_key, value, hash, file)
337
+ raw_key = raw_key.to_s
338
+ value = array_to_s(value) if is_array(raw_key)
339
+
340
+ key = key_for(raw_key)
341
+
342
+ return if hash[key] == value
343
+
344
+ hash[key] = value
345
+ hash.delete(key) if value.nil?
272
346
 
273
- value
347
+ Validator.validate!(raw_key, converted_value(value, raw_key), hash)
348
+
349
+ return unless file
350
+ SharedHelpers.filesystem_access(file) do |p|
351
+ FileUtils.mkdir_p(p.dirname)
352
+ require "bundler/yaml_serializer"
353
+ p.open("w") {|f| f.write(YAMLSerializer.dump(hash)) }
354
+ end
274
355
  end
275
356
 
276
357
  def converted_value(value, key)
277
- if value.nil?
358
+ if is_array(key)
359
+ to_array(value)
360
+ elsif value.nil?
278
361
  nil
279
362
  elsif is_bool(key) || value == "false"
280
363
  to_bool(value)
281
364
  elsif is_num(key)
282
365
  value.to_i
283
366
  else
284
- value
367
+ value.to_s
285
368
  end
286
369
  end
287
370
 
@@ -325,16 +408,34 @@ module Bundler
325
408
  end
326
409
  end
327
410
 
411
+ PER_URI_OPTIONS = %w[
412
+ fallback_timeout
413
+ ].freeze
414
+
415
+ NORMALIZE_URI_OPTIONS_PATTERN =
416
+ /
417
+ \A
418
+ (\w+\.)? # optional prefix key
419
+ (https?.*?) # URI
420
+ (\.#{Regexp.union(PER_URI_OPTIONS)})? # optional suffix key
421
+ \z
422
+ /ix
423
+
328
424
  # TODO: duplicates Rubygems#normalize_uri
329
425
  # TODO: is this the correct place to validate mirror URIs?
330
426
  def self.normalize_uri(uri)
331
427
  uri = uri.to_s
332
- uri = "#{uri}/" unless uri =~ %r{/\Z}
428
+ if uri =~ NORMALIZE_URI_OPTIONS_PATTERN
429
+ prefix = $1
430
+ uri = $2
431
+ suffix = $3
432
+ end
433
+ uri = "#{uri}/" unless uri.end_with?("/")
333
434
  uri = URI(uri)
334
435
  unless uri.absolute?
335
436
  raise ArgumentError, format("Gem sources must be absolute. You provided '%s'.", uri)
336
437
  end
337
- uri
438
+ "#{prefix}#{uri}#{suffix}"
338
439
  end
339
440
  end
340
441
  end