bundler 1.13.6 → 1.17.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of bundler might be problematic. Click here for more details.

Files changed (323) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +554 -9
  3. data/README.md +28 -5
  4. data/bundler.gemspec +40 -11
  5. data/exe/bundle +4 -8
  6. data/exe/bundle_ruby +4 -3
  7. data/lib/bundler.rb +162 -68
  8. data/lib/bundler/build_metadata.rb +53 -0
  9. data/lib/bundler/capistrano.rb +5 -0
  10. data/lib/bundler/cli.rb +360 -118
  11. data/lib/bundler/cli/add.rb +35 -0
  12. data/lib/bundler/cli/binstubs.rb +18 -10
  13. data/lib/bundler/cli/cache.rb +6 -5
  14. data/lib/bundler/cli/check.rb +4 -6
  15. data/lib/bundler/cli/clean.rb +6 -7
  16. data/lib/bundler/cli/common.rb +47 -1
  17. data/lib/bundler/cli/config.rb +26 -7
  18. data/lib/bundler/cli/console.rb +2 -1
  19. data/lib/bundler/cli/doctor.rb +63 -18
  20. data/lib/bundler/cli/exec.rb +12 -5
  21. data/lib/bundler/cli/gem.rb +59 -21
  22. data/lib/bundler/cli/info.rb +50 -0
  23. data/lib/bundler/cli/init.rb +21 -7
  24. data/lib/bundler/cli/inject.rb +13 -4
  25. data/lib/bundler/cli/install.rb +72 -101
  26. data/lib/bundler/cli/issue.rb +40 -0
  27. data/lib/bundler/cli/list.rb +58 -0
  28. data/lib/bundler/cli/lock.rb +9 -6
  29. data/lib/bundler/cli/open.rb +4 -3
  30. data/lib/bundler/cli/outdated.rb +175 -60
  31. data/lib/bundler/cli/package.rb +9 -6
  32. data/lib/bundler/cli/platform.rb +2 -1
  33. data/lib/bundler/cli/plugin.rb +1 -0
  34. data/lib/bundler/cli/pristine.rb +47 -0
  35. data/lib/bundler/cli/remove.rb +18 -0
  36. data/lib/bundler/cli/show.rb +2 -2
  37. data/lib/bundler/cli/update.rb +44 -34
  38. data/lib/bundler/cli/viz.rb +5 -1
  39. data/lib/bundler/compact_index_client.rb +109 -0
  40. data/lib/bundler/compact_index_client/cache.rb +118 -0
  41. data/lib/bundler/compact_index_client/updater.rb +116 -0
  42. data/lib/bundler/compatibility_guard.rb +14 -0
  43. data/lib/bundler/constants.rb +1 -0
  44. data/lib/bundler/current_ruby.rb +17 -8
  45. data/lib/bundler/definition.rb +353 -182
  46. data/lib/bundler/dep_proxy.rb +3 -1
  47. data/lib/bundler/dependency.rb +22 -10
  48. data/lib/bundler/deployment.rb +1 -1
  49. data/lib/bundler/deprecate.rb +15 -3
  50. data/lib/bundler/dsl.rb +122 -64
  51. data/lib/bundler/endpoint_specification.rb +13 -3
  52. data/lib/bundler/env.rb +110 -38
  53. data/lib/bundler/environment_preserver.rb +27 -6
  54. data/lib/bundler/errors.rb +24 -0
  55. data/lib/bundler/feature_flag.rb +74 -0
  56. data/lib/bundler/fetcher.rb +18 -11
  57. data/lib/bundler/fetcher/base.rb +1 -0
  58. data/lib/bundler/fetcher/compact_index.rb +7 -5
  59. data/lib/bundler/fetcher/dependency.rb +3 -2
  60. data/lib/bundler/fetcher/downloader.rb +25 -7
  61. data/lib/bundler/fetcher/index.rb +3 -2
  62. data/lib/bundler/friendly_errors.rb +33 -7
  63. data/lib/bundler/gem_helper.rb +25 -11
  64. data/lib/bundler/gem_helpers.rb +70 -1
  65. data/lib/bundler/gem_remote_fetcher.rb +1 -0
  66. data/lib/bundler/gem_tasks.rb +1 -0
  67. data/lib/bundler/gem_version_promoter.rb +17 -2
  68. data/lib/bundler/gemdeps.rb +29 -0
  69. data/lib/bundler/graph.rb +1 -0
  70. data/lib/bundler/index.rb +28 -15
  71. data/lib/bundler/injector.rb +216 -33
  72. data/lib/bundler/inline.rb +12 -12
  73. data/lib/bundler/installer.rb +139 -53
  74. data/lib/bundler/installer/gem_installer.rb +15 -5
  75. data/lib/bundler/installer/parallel_installer.rb +113 -28
  76. data/lib/bundler/installer/standalone.rb +1 -0
  77. data/lib/bundler/lazy_specification.rb +31 -3
  78. data/lib/bundler/lockfile_generator.rb +95 -0
  79. data/lib/bundler/lockfile_parser.rb +50 -37
  80. data/lib/bundler/match_platform.rb +13 -3
  81. data/lib/bundler/mirror.rb +10 -5
  82. data/lib/bundler/plugin.rb +22 -8
  83. data/lib/bundler/plugin/api.rb +2 -1
  84. data/lib/bundler/plugin/api/source.rb +17 -4
  85. data/lib/bundler/plugin/events.rb +61 -0
  86. data/lib/bundler/plugin/index.rb +9 -2
  87. data/lib/bundler/plugin/installer.rb +7 -6
  88. data/lib/bundler/plugin/source_list.rb +7 -8
  89. data/lib/bundler/process_lock.rb +24 -0
  90. data/lib/bundler/psyched_yaml.rb +10 -0
  91. data/lib/bundler/remote_specification.rb +30 -1
  92. data/lib/bundler/resolver.rb +187 -194
  93. data/lib/bundler/resolver/spec_group.rb +106 -0
  94. data/lib/bundler/retry.rb +5 -1
  95. data/lib/bundler/ruby_dsl.rb +1 -0
  96. data/lib/bundler/ruby_version.rb +12 -2
  97. data/lib/bundler/rubygems_ext.rb +23 -8
  98. data/lib/bundler/rubygems_gem_installer.rb +90 -0
  99. data/lib/bundler/rubygems_integration.rb +193 -70
  100. data/lib/bundler/runtime.rb +39 -22
  101. data/lib/bundler/settings.rb +245 -85
  102. data/lib/bundler/settings/validator.rb +102 -0
  103. data/lib/bundler/setup.rb +4 -7
  104. data/lib/bundler/shared_helpers.rb +183 -40
  105. data/lib/bundler/similarity_detector.rb +1 -0
  106. data/lib/bundler/source.rb +58 -1
  107. data/lib/bundler/source/gemspec.rb +1 -0
  108. data/lib/bundler/source/git.rb +52 -23
  109. data/lib/bundler/source/git/git_proxy.rb +30 -14
  110. data/lib/bundler/source/metadata.rb +62 -0
  111. data/lib/bundler/source/path.rb +42 -16
  112. data/lib/bundler/source/path/installer.rb +4 -2
  113. data/lib/bundler/source/rubygems.rb +171 -82
  114. data/lib/bundler/source/rubygems/remote.rb +12 -2
  115. data/lib/bundler/source_list.rb +75 -15
  116. data/lib/bundler/spec_set.rb +67 -32
  117. data/lib/bundler/ssl_certs/certificate_manager.rb +2 -1
  118. data/lib/bundler/stub_specification.rb +86 -2
  119. data/lib/bundler/templates/.document +1 -0
  120. data/lib/bundler/templates/Executable +13 -1
  121. data/lib/bundler/templates/Executable.bundler +105 -0
  122. data/lib/bundler/templates/Executable.standalone +5 -5
  123. data/lib/bundler/templates/Gemfile +3 -0
  124. data/lib/bundler/templates/gems.rb +8 -0
  125. data/lib/bundler/templates/newgem/Gemfile.tt +4 -2
  126. data/lib/bundler/templates/newgem/LICENSE.txt.tt +1 -1
  127. data/lib/bundler/templates/newgem/README.md.tt +14 -8
  128. data/lib/bundler/templates/newgem/Rakefile.tt +5 -5
  129. data/lib/bundler/templates/newgem/bin/console.tt +1 -1
  130. data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +4 -4
  131. data/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +3 -3
  132. data/lib/bundler/templates/newgem/gitignore.tt +5 -1
  133. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +7 -6
  134. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +4 -4
  135. data/lib/bundler/templates/newgem/newgem.gemspec.tt +21 -12
  136. data/lib/bundler/templates/newgem/rspec.tt +1 -0
  137. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +1 -3
  138. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +13 -1
  139. data/lib/bundler/templates/newgem/test/newgem_test.rb.tt +1 -1
  140. data/lib/bundler/templates/newgem/test/test_helper.rb.tt +3 -3
  141. data/lib/bundler/templates/newgem/{.travis.yml.tt → travis.yml.tt} +2 -0
  142. data/lib/bundler/ui.rb +1 -0
  143. data/lib/bundler/ui/rg_proxy.rb +1 -0
  144. data/lib/bundler/ui/shell.rb +30 -10
  145. data/lib/bundler/ui/silent.rb +21 -1
  146. data/lib/bundler/uri_credentials_filter.rb +1 -0
  147. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1638 -0
  148. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +2 -0
  149. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +26 -0
  150. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +7 -0
  151. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +1 -0
  152. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +26 -6
  153. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +2 -1
  154. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +12 -4
  155. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +3 -2
  156. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +63 -0
  157. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +11 -3
  158. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +13 -1
  159. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +3 -2
  160. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +3 -2
  161. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +18 -5
  162. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +75 -7
  163. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +2 -1
  164. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +1 -0
  165. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +3 -1
  166. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +499 -128
  167. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +1 -0
  168. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +8 -4
  169. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/faster.rb +1 -0
  170. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/persistent.rb +27 -24
  171. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/persistent/ssl_reuse.rb +2 -1
  172. data/lib/bundler/vendor/thor/lib/thor.rb +46 -21
  173. data/lib/bundler/vendor/thor/lib/thor/actions.rb +24 -22
  174. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +2 -1
  175. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
  176. data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +2 -2
  177. data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +16 -8
  178. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +66 -18
  179. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +17 -15
  180. data/lib/bundler/vendor/thor/lib/thor/base.rb +55 -32
  181. data/lib/bundler/vendor/thor/lib/thor/command.rb +13 -11
  182. data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +21 -1
  183. data/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +7 -5
  184. data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +94 -63
  185. data/lib/bundler/vendor/thor/lib/thor/error.rb +3 -3
  186. data/lib/bundler/vendor/thor/lib/thor/group.rb +13 -13
  187. data/lib/bundler/vendor/thor/lib/thor/invocation.rb +4 -5
  188. data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +2 -0
  189. data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +4 -7
  190. data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +16 -16
  191. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +42 -21
  192. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +13 -10
  193. data/lib/bundler/vendor/thor/lib/thor/runner.rb +31 -29
  194. data/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
  195. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +49 -33
  196. data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +1 -1
  197. data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +4 -4
  198. data/lib/bundler/vendor/thor/lib/thor/util.rb +8 -7
  199. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  200. data/lib/bundler/vendored_fileutils.rb +9 -0
  201. data/lib/bundler/vendored_molinillo.rb +1 -0
  202. data/lib/bundler/vendored_persistent.rb +43 -3
  203. data/lib/bundler/vendored_thor.rb +6 -2
  204. data/lib/bundler/version.rb +19 -2
  205. data/lib/bundler/version_ranges.rb +76 -0
  206. data/lib/bundler/vlad.rb +5 -0
  207. data/lib/bundler/worker.rb +30 -6
  208. data/lib/bundler/yaml_serializer.rb +4 -4
  209. data/man/bundle-add.1 +58 -0
  210. data/man/bundle-add.1.txt +52 -0
  211. data/man/bundle-add.ronn +40 -0
  212. data/{lib/bundler/man/bundle-binstubs → man/bundle-binstubs.1} +11 -1
  213. data/man/bundle-binstubs.1.txt +48 -0
  214. data/man/bundle-binstubs.ronn +15 -1
  215. data/man/bundle-check.1 +31 -0
  216. data/man/bundle-check.1.txt +33 -0
  217. data/man/bundle-check.ronn +26 -0
  218. data/man/bundle-clean.1 +24 -0
  219. data/man/bundle-clean.1.txt +26 -0
  220. data/man/bundle-clean.ronn +18 -0
  221. data/man/bundle-config.1 +497 -0
  222. data/man/bundle-config.1.txt +529 -0
  223. data/man/bundle-config.ronn +233 -61
  224. data/man/bundle-doctor.1 +44 -0
  225. data/man/bundle-doctor.1.txt +44 -0
  226. data/man/bundle-doctor.ronn +33 -0
  227. data/{lib/bundler/man/bundle-exec → man/bundle-exec.1} +6 -3
  228. data/man/bundle-exec.1.txt +178 -0
  229. data/man/bundle-exec.ronn +10 -3
  230. data/{lib/bundler/man/bundle-gem → man/bundle-gem.1} +4 -4
  231. data/man/bundle-gem.1.txt +91 -0
  232. data/man/bundle-gem.ronn +3 -2
  233. data/man/bundle-info.1 +20 -0
  234. data/man/bundle-info.1.txt +21 -0
  235. data/man/bundle-info.ronn +17 -0
  236. data/man/bundle-init.1 +25 -0
  237. data/man/bundle-init.1.txt +34 -0
  238. data/man/bundle-init.ronn +29 -0
  239. data/man/bundle-inject.1 +33 -0
  240. data/man/bundle-inject.1.txt +32 -0
  241. data/man/bundle-inject.ronn +22 -0
  242. data/{lib/bundler/man/bundle-install → man/bundle-install.1} +32 -29
  243. data/man/bundle-install.1.txt +396 -0
  244. data/man/bundle-install.ronn +45 -36
  245. data/man/bundle-list.1 +50 -0
  246. data/man/bundle-list.1.txt +43 -0
  247. data/man/bundle-list.ronn +33 -0
  248. data/{lib/bundler/man/bundle-lock → man/bundle-lock.1} +43 -2
  249. data/man/bundle-lock.1.txt +93 -0
  250. data/man/bundle-lock.ronn +47 -0
  251. data/man/bundle-open.1 +32 -0
  252. data/man/bundle-open.1.txt +29 -0
  253. data/man/bundle-open.ronn +19 -0
  254. data/man/bundle-outdated.1 +155 -0
  255. data/man/bundle-outdated.1.txt +131 -0
  256. data/man/bundle-outdated.ronn +111 -0
  257. data/{lib/bundler/man/bundle-package → man/bundle-package.1} +6 -3
  258. data/man/bundle-package.1.txt +79 -0
  259. data/man/bundle-package.ronn +7 -2
  260. data/{lib/bundler/man/bundle-platform → man/bundle-platform.1} +1 -1
  261. data/man/bundle-platform.1.txt +57 -0
  262. data/man/bundle-pristine.1 +34 -0
  263. data/man/bundle-pristine.1.txt +44 -0
  264. data/man/bundle-pristine.ronn +34 -0
  265. data/man/bundle-remove.1 +31 -0
  266. data/man/bundle-remove.1.txt +34 -0
  267. data/man/bundle-remove.ronn +23 -0
  268. data/man/bundle-show.1 +23 -0
  269. data/man/bundle-show.1.txt +27 -0
  270. data/man/bundle-show.ronn +21 -0
  271. data/man/bundle-update.1 +394 -0
  272. data/man/bundle-update.1.txt +391 -0
  273. data/man/bundle-update.ronn +172 -16
  274. data/man/bundle-viz.1 +39 -0
  275. data/man/bundle-viz.1.txt +39 -0
  276. data/man/bundle-viz.ronn +30 -0
  277. data/{lib/bundler/man/bundle → man/bundle.1} +44 -28
  278. data/man/bundle.1.txt +116 -0
  279. data/man/bundle.ronn +39 -27
  280. data/{lib/bundler/man → man}/gemfile.5 +67 -84
  281. data/man/gemfile.5.ronn +77 -55
  282. data/man/gemfile.5.txt +653 -0
  283. data/man/index.txt +25 -8
  284. metadata +118 -58
  285. data/.codeclimate.yml +0 -25
  286. data/.gitignore +0 -16
  287. data/.rspec +0 -3
  288. data/.rubocop.yml +0 -128
  289. data/.rubocop_todo.yml +0 -248
  290. data/.travis.yml +0 -108
  291. data/CODE_OF_CONDUCT.md +0 -42
  292. data/CONTRIBUTING.md +0 -36
  293. data/DEVELOPMENT.md +0 -148
  294. data/ISSUES.md +0 -100
  295. data/Rakefile +0 -333
  296. data/bin/rake +0 -19
  297. data/bin/rspec +0 -15
  298. data/bin/rubocop +0 -17
  299. data/bin/with_rubygems +0 -39
  300. data/lib/bundler/man/bundle-binstubs.txt +0 -33
  301. data/lib/bundler/man/bundle-config +0 -254
  302. data/lib/bundler/man/bundle-config.txt +0 -282
  303. data/lib/bundler/man/bundle-exec.txt +0 -171
  304. data/lib/bundler/man/bundle-gem.txt +0 -90
  305. data/lib/bundler/man/bundle-install.txt +0 -385
  306. data/lib/bundler/man/bundle-lock.txt +0 -52
  307. data/lib/bundler/man/bundle-package.txt +0 -74
  308. data/lib/bundler/man/bundle-platform.txt +0 -57
  309. data/lib/bundler/man/bundle-update +0 -221
  310. data/lib/bundler/man/bundle-update.txt +0 -227
  311. data/lib/bundler/man/bundle.txt +0 -104
  312. data/lib/bundler/man/gemfile.5.txt +0 -636
  313. data/lib/bundler/postit_trampoline.rb +0 -68
  314. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client.rb +0 -79
  315. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client/cache.rb +0 -112
  316. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client/updater.rb +0 -80
  317. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client/version.rb +0 -4
  318. data/lib/bundler/vendor/postit/lib/postit.rb +0 -15
  319. data/lib/bundler/vendor/postit/lib/postit/environment.rb +0 -44
  320. data/lib/bundler/vendor/postit/lib/postit/installer.rb +0 -28
  321. data/lib/bundler/vendor/postit/lib/postit/parser.rb +0 -21
  322. data/lib/bundler/vendor/postit/lib/postit/setup.rb +0 -12
  323. data/lib/bundler/vendor/postit/lib/postit/version.rb +0 -3
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class Settings
5
+ class Validator
6
+ class Rule
7
+ attr_reader :description
8
+
9
+ def initialize(keys, description, &validate)
10
+ @keys = keys
11
+ @description = description
12
+ @validate = validate
13
+ end
14
+
15
+ def validate!(key, value, settings)
16
+ instance_exec(key, value, settings, &@validate)
17
+ end
18
+
19
+ def fail!(key, value, *reasons)
20
+ reasons.unshift @description
21
+ raise InvalidOption, "Setting `#{key}` to #{value.inspect} failed:\n#{reasons.map {|r| " - #{r}" }.join("\n")}"
22
+ end
23
+
24
+ def set(settings, key, value, *reasons)
25
+ hash_key = k(key)
26
+ return if settings[hash_key] == value
27
+ reasons.unshift @description
28
+ Bundler.ui.info "Setting `#{key}` to #{value.inspect}, since #{reasons.join(", ")}"
29
+ if value.nil?
30
+ settings.delete(hash_key)
31
+ else
32
+ settings[hash_key] = value
33
+ end
34
+ end
35
+
36
+ def k(key)
37
+ Bundler.settings.key_for(key)
38
+ end
39
+ end
40
+
41
+ def self.rules
42
+ @rules ||= Hash.new {|h, k| h[k] = [] }
43
+ end
44
+ private_class_method :rules
45
+
46
+ def self.rule(keys, description, &blk)
47
+ rule = Rule.new(keys, description, &blk)
48
+ keys.each {|k| rules[k] << rule }
49
+ end
50
+ private_class_method :rule
51
+
52
+ def self.validate!(key, value, settings)
53
+ rules_to_validate = rules[key]
54
+ rules_to_validate.each {|rule| rule.validate!(key, value, settings) }
55
+ end
56
+
57
+ rule %w[path path.system], "path and path.system are mutually exclusive" do |key, value, settings|
58
+ if key == "path" && value
59
+ set(settings, "path.system", nil)
60
+ elsif key == "path.system" && value
61
+ set(settings, :path, nil)
62
+ end
63
+ end
64
+
65
+ rule %w[with without], "a group cannot be in both `with` & `without` simultaneously" do |key, value, settings|
66
+ with = settings.fetch(k(:with), "").split(":").map(&:to_sym)
67
+ without = settings.fetch(k(:without), "").split(":").map(&:to_sym)
68
+
69
+ other_key = key == "with" ? :without : :with
70
+ other_setting = key == "with" ? without : with
71
+
72
+ conflicting = with & without
73
+ if conflicting.any?
74
+ fail!(key, value, "`#{other_key}` is current set to #{other_setting.inspect}", "the `#{conflicting.join("`, `")}` groups conflict")
75
+ end
76
+ end
77
+
78
+ rule %w[path], "relative paths are expanded relative to the current working directory" do |key, value, settings|
79
+ next if value.nil?
80
+
81
+ path = Pathname.new(value)
82
+ next if !path.relative? || !Bundler.feature_flag.path_relative_to_cwd?
83
+
84
+ path = path.expand_path
85
+
86
+ root = begin
87
+ Bundler.root
88
+ rescue GemfileNotFound
89
+ Pathname.pwd.expand_path
90
+ end
91
+
92
+ path = begin
93
+ path.relative_path_from(root)
94
+ rescue ArgumentError
95
+ path
96
+ end
97
+
98
+ set(settings, key, path.to_s)
99
+ end
100
+ end
101
+ end
102
+ end
data/lib/bundler/setup.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- require "bundler/postit_trampoline" unless ENV["BUNDLE_DISABLE_POSTIT"]
2
+
3
3
  require "bundler/shared_helpers"
4
4
 
5
5
  if Bundler::SharedHelpers.in_bundle?
@@ -20,12 +20,9 @@ if Bundler::SharedHelpers.in_bundle?
20
20
  Bundler.setup
21
21
  end
22
22
 
23
- unless ENV["BUNDLE_POSTIT_TRAMPOLINING_VERSION"]
24
- # Add bundler to the load path after disabling system gems
25
- # This is guarenteed to be done already if we've trampolined
26
- bundler_lib = File.expand_path("../..", __FILE__)
27
- $LOAD_PATH.unshift(bundler_lib) unless $LOAD_PATH.include?(bundler_lib)
28
- end
23
+ # Add bundler to the load path after disabling system gems
24
+ bundler_lib = File.expand_path("../..", __FILE__)
25
+ $LOAD_PATH.unshift(bundler_lib) unless $LOAD_PATH.include?(bundler_lib)
29
26
 
30
27
  Bundler.ui = nil
31
28
  end
@@ -1,13 +1,18 @@
1
1
  # frozen_string_literal: true
2
+
3
+ require "bundler/compatibility_guard"
4
+
2
5
  require "pathname"
3
6
  require "rubygems"
4
7
 
8
+ require "bundler/version"
5
9
  require "bundler/constants"
6
10
  require "bundler/rubygems_integration"
7
11
  require "bundler/current_ruby"
8
12
 
9
13
  module Gem
10
14
  class Dependency
15
+ # This is only needed for RubyGems < 1.4
11
16
  unless method_defined? :requirement
12
17
  def requirement
13
18
  version_requirements
@@ -18,12 +23,16 @@ end
18
23
 
19
24
  module Bundler
20
25
  module SharedHelpers
21
- attr_accessor :gem_loaded
26
+ def root
27
+ gemfile = find_gemfile
28
+ raise GemfileNotFound, "Could not locate Gemfile" unless gemfile
29
+ Pathname.new(gemfile).untaint.expand_path.parent
30
+ end
22
31
 
23
32
  def default_gemfile
24
- gemfile = find_gemfile
33
+ gemfile = find_gemfile(:order_matters)
25
34
  raise GemfileNotFound, "Could not locate Gemfile" unless gemfile
26
- Pathname.new(gemfile).untaint
35
+ Pathname.new(gemfile).untaint.expand_path
27
36
  end
28
37
 
29
38
  def default_lockfile
@@ -39,10 +48,12 @@ module Bundler
39
48
  bundle_dir = find_directory(".bundle")
40
49
  return nil unless bundle_dir
41
50
 
42
- global_bundle_dir = File.join(Bundler.rubygems.user_home, ".bundle")
51
+ bundle_dir = Pathname.new(bundle_dir)
52
+
53
+ global_bundle_dir = Bundler.user_home.join(".bundle")
43
54
  return nil if bundle_dir == global_bundle_dir
44
55
 
45
- Pathname.new(bundle_dir)
56
+ bundle_dir
46
57
  end
47
58
 
48
59
  def in_bundle?
@@ -62,7 +73,7 @@ module Bundler
62
73
  end
63
74
 
64
75
  def with_clean_git_env(&block)
65
- keys = %w(GIT_DIR GIT_WORK_TREE)
76
+ keys = %w[GIT_DIR GIT_WORK_TREE]
66
77
  old_env = keys.inject({}) do |h, k|
67
78
  h.update(k => ENV[k])
68
79
  end
@@ -101,16 +112,24 @@ module Bundler
101
112
  # end
102
113
  #
103
114
  # @see {Bundler::PermissionError}
104
- def filesystem_access(path, action = :write)
105
- yield path.dup.untaint
115
+ def filesystem_access(path, action = :write, &block)
116
+ # Use block.call instead of yield because of a bug in Ruby 2.2.2
117
+ # See https://github.com/bundler/bundler/issues/5341 for details
118
+ block.call(path.dup.untaint)
106
119
  rescue Errno::EACCES
107
120
  raise PermissionError.new(path, action)
108
121
  rescue Errno::EAGAIN
109
122
  raise TemporaryResourceError.new(path, action)
110
123
  rescue Errno::EPROTO
111
124
  raise VirtualProtocolError.new
125
+ rescue Errno::ENOSPC
126
+ raise NoSpaceOnDeviceError.new(path, action)
112
127
  rescue *[const_get_safely(:ENOTSUP, Errno)].compact
113
128
  raise OperationNotSupportedError.new(path, action)
129
+ rescue Errno::EEXIST, Errno::ENOENT
130
+ raise
131
+ rescue SystemCallError => e
132
+ raise GenericSystemCallError.new(e, "There was an error accessing `#{path}`.")
114
133
  end
115
134
 
116
135
  def const_get_safely(constant_name, namespace)
@@ -120,28 +139,120 @@ module Bundler
120
139
  namespace.const_get(constant_name)
121
140
  end
122
141
 
123
- def major_deprecation(message)
142
+ def major_deprecation(major_version, message)
143
+ if Bundler.bundler_major_version >= major_version
144
+ require "bundler/errors"
145
+ raise DeprecatedError, "[REMOVED FROM #{major_version}.0] #{message}"
146
+ end
147
+
124
148
  return unless prints_major_deprecations?
125
149
  @major_deprecation_ui ||= Bundler::UI::Shell.new("no-color" => true)
126
150
  ui = Bundler.ui.is_a?(@major_deprecation_ui.class) ? Bundler.ui : @major_deprecation_ui
127
- ui.warn("[DEPRECATED FOR #{Bundler::VERSION.split(".").first.to_i + 1}.0] #{message}")
151
+ ui.warn("[DEPRECATED FOR #{major_version}.0] #{message}")
128
152
  end
129
153
 
130
154
  def print_major_deprecations!
131
- deprecate_gemfile(find_gemfile) if find_gemfile == find_file("Gemfile")
155
+ multiple_gemfiles = search_up(".") do |dir|
156
+ gemfiles = gemfile_names.select {|gf| File.file? File.expand_path(gf, dir) }
157
+ next if gemfiles.empty?
158
+ break false if gemfiles.size == 1
159
+ end
160
+ if multiple_gemfiles && Bundler.bundler_major_version == 1
161
+ Bundler::SharedHelpers.major_deprecation 2, \
162
+ "gems.rb and gems.locked will be preferred to Gemfile and Gemfile.lock."
163
+ end
164
+
132
165
  if RUBY_VERSION < "2"
133
- major_deprecation("Bundler will only support ruby >= 2.0, you are running #{RUBY_VERSION}")
166
+ major_deprecation(2, "Bundler will only support ruby >= 2.0, you are running #{RUBY_VERSION}")
134
167
  end
135
168
  return if Bundler.rubygems.provides?(">= 2")
136
- major_deprecation("Bundler will only support rubygems >= 2.0, you are running #{Bundler.rubygems.version}")
169
+ major_deprecation(2, "Bundler will only support rubygems >= 2.0, you are running #{Bundler.rubygems.version}")
170
+ end
171
+
172
+ def trap(signal, override = false, &block)
173
+ prior = Signal.trap(signal) do
174
+ block.call
175
+ prior.call unless override
176
+ end
177
+ end
178
+
179
+ def ensure_same_dependencies(spec, old_deps, new_deps)
180
+ new_deps = new_deps.reject {|d| d.type == :development }
181
+ old_deps = old_deps.reject {|d| d.type == :development }
182
+
183
+ without_type = proc {|d| Gem::Dependency.new(d.name, d.requirements_list.sort) }
184
+ new_deps.map!(&without_type)
185
+ old_deps.map!(&without_type)
186
+
187
+ extra_deps = new_deps - old_deps
188
+ return if extra_deps.empty?
189
+
190
+ Bundler.ui.debug "#{spec.full_name} from #{spec.remote} has either corrupted API or lockfile dependencies" \
191
+ " (was expecting #{old_deps.map(&:to_s)}, but the real spec has #{new_deps.map(&:to_s)})"
192
+ raise APIResponseMismatchError,
193
+ "Downloading #{spec.full_name} revealed dependencies not in the API or the lockfile (#{extra_deps.join(", ")})." \
194
+ "\nEither installing with `--full-index` or running `bundle update #{spec.name}` should fix the problem."
195
+ end
196
+
197
+ def pretty_dependency(dep, print_source = false)
198
+ msg = String.new(dep.name)
199
+ msg << " (#{dep.requirement})" unless dep.requirement == Gem::Requirement.default
200
+
201
+ if dep.is_a?(Bundler::Dependency)
202
+ platform_string = dep.platforms.join(", ")
203
+ msg << " " << platform_string if !platform_string.empty? && platform_string != Gem::Platform::RUBY
204
+ end
205
+
206
+ msg << " from the `#{dep.source}` source" if print_source && dep.source
207
+ msg
208
+ end
209
+
210
+ def md5_available?
211
+ return @md5_available if defined?(@md5_available)
212
+ @md5_available = begin
213
+ require "openssl"
214
+ OpenSSL::Digest::MD5.digest("")
215
+ true
216
+ rescue LoadError
217
+ true
218
+ rescue OpenSSL::Digest::DigestError
219
+ false
220
+ end
221
+ end
222
+
223
+ def digest(name)
224
+ require "digest"
225
+ Digest(name)
226
+ end
227
+
228
+ def write_to_gemfile(gemfile_path, contents)
229
+ filesystem_access(gemfile_path) {|g| File.open(g, "w") {|file| file.puts contents } }
137
230
  end
138
231
 
139
232
  private
140
233
 
141
- def find_gemfile
234
+ def validate_bundle_path
235
+ path_separator = Bundler.rubygems.path_separator
236
+ return unless Bundler.bundle_path.to_s.split(path_separator).size > 1
237
+ message = "Your bundle path contains text matching #{path_separator.inspect}, " \
238
+ "which is the path separator for your system. Bundler cannot " \
239
+ "function correctly when the Bundle path contains the " \
240
+ "system's PATH separator. Please change your " \
241
+ "bundle path to not match #{path_separator.inspect}." \
242
+ "\nYour current bundle path is '#{Bundler.bundle_path}'."
243
+ raise Bundler::PathError, message
244
+ end
245
+
246
+ def find_gemfile(order_matters = false)
142
247
  given = ENV["BUNDLE_GEMFILE"]
143
248
  return given if given && !given.empty?
144
- find_file("Gemfile", "gems.rb")
249
+ names = gemfile_names
250
+ names.reverse! if order_matters && Bundler.feature_flag.prefer_gems_rb?
251
+ find_file(*names)
252
+ end
253
+
254
+ def gemfile_names
255
+ ["Gemfile", "gems.rb"]
145
256
  end
146
257
 
147
258
  def find_file(*names)
@@ -163,7 +274,15 @@ module Bundler
163
274
  until !File.directory?(current) || current == previous
164
275
  if ENV["BUNDLE_SPEC_RUN"]
165
276
  # avoid stepping above the tmp directory when testing
166
- return nil if File.file?(File.join(current, "bundler.gemspec"))
277
+ gemspec = if ENV["BUNDLE_RUBY"] && ENV["BUNDLE_GEM"]
278
+ # for Ruby Core
279
+ "lib/bundler.gemspec"
280
+ else
281
+ "bundler.gemspec"
282
+ end
283
+
284
+ # avoid stepping above the tmp directory when testing
285
+ return nil if File.file?(File.join(current, gemspec))
167
286
  end
168
287
 
169
288
  names.each do |name|
@@ -175,67 +294,91 @@ module Bundler
175
294
  end
176
295
  end
177
296
 
297
+ def set_env(key, value)
298
+ raise ArgumentError, "new key #{key}" unless EnvironmentPreserver::BUNDLER_KEYS.include?(key)
299
+ orig_key = "#{EnvironmentPreserver::BUNDLER_PREFIX}#{key}"
300
+ orig = ENV[key]
301
+ orig ||= EnvironmentPreserver::INTENTIONALLY_NIL
302
+ ENV[orig_key] ||= orig
303
+
304
+ ENV[key] = value
305
+ end
306
+ public :set_env
307
+
178
308
  def set_bundle_variables
179
309
  begin
180
- ENV["BUNDLE_BIN_PATH"] = Bundler.rubygems.bin_path("bundler", "bundle", VERSION)
310
+ exe_file = Bundler.rubygems.bin_path("bundler", "bundle", VERSION)
311
+ unless File.exist?(exe_file)
312
+ exe_file = File.expand_path("../../../exe/bundle", __FILE__)
313
+ end
314
+ Bundler::SharedHelpers.set_env "BUNDLE_BIN_PATH", exe_file
181
315
  rescue Gem::GemNotFoundException
182
- ENV["BUNDLE_BIN_PATH"] = File.expand_path("../../../exe/bundle", __FILE__)
316
+ exe_file = File.expand_path("../../../exe/bundle", __FILE__)
317
+ # for Ruby core repository
318
+ exe_file = File.expand_path("../../../../bin/bundle", __FILE__) unless File.exist?(exe_file)
319
+ Bundler::SharedHelpers.set_env "BUNDLE_BIN_PATH", exe_file
183
320
  end
184
321
 
185
322
  # Set BUNDLE_GEMFILE
186
- ENV["BUNDLE_GEMFILE"] = find_gemfile.to_s
187
- ENV["BUNDLER_VERSION"] = Bundler::VERSION
323
+ Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", find_gemfile(:order_matters).to_s
324
+ Bundler::SharedHelpers.set_env "BUNDLER_VERSION", Bundler::VERSION
188
325
  end
189
326
 
190
327
  def set_path
328
+ validate_bundle_path
191
329
  paths = (ENV["PATH"] || "").split(File::PATH_SEPARATOR)
192
330
  paths.unshift "#{Bundler.bundle_path}/bin"
193
- ENV["PATH"] = paths.uniq.join(File::PATH_SEPARATOR)
331
+ Bundler::SharedHelpers.set_env "PATH", paths.uniq.join(File::PATH_SEPARATOR)
194
332
  end
195
333
 
196
334
  def set_rubyopt
197
335
  rubyopt = [ENV["RUBYOPT"]].compact
198
336
  return if !rubyopt.empty? && rubyopt.first =~ %r{-rbundler/setup}
199
337
  rubyopt.unshift %(-rbundler/setup)
200
- ENV["RUBYOPT"] = rubyopt.join(" ")
338
+ Bundler::SharedHelpers.set_env "RUBYOPT", rubyopt.join(" ")
201
339
  end
202
340
 
203
341
  def set_rubylib
204
342
  rubylib = (ENV["RUBYLIB"] || "").split(File::PATH_SEPARATOR)
205
- rubylib.unshift File.expand_path("../..", __FILE__)
206
- ENV["RUBYLIB"] = rubylib.uniq.join(File::PATH_SEPARATOR)
343
+ rubylib.unshift bundler_ruby_lib
344
+ Bundler::SharedHelpers.set_env "RUBYLIB", rubylib.uniq.join(File::PATH_SEPARATOR)
345
+ end
346
+
347
+ def bundler_ruby_lib
348
+ resolve_path File.expand_path("../..", __FILE__)
207
349
  end
208
350
 
209
351
  def clean_load_path
210
352
  # handle 1.9 where system gems are always on the load path
211
- if defined?(::Gem)
212
- me = File.expand_path("../../", __FILE__)
213
- me = /^#{Regexp.escape(me)}/
353
+ return unless defined?(::Gem)
214
354
 
215
- loaded_gem_paths = Bundler.rubygems.loaded_gem_paths
355
+ bundler_lib = bundler_ruby_lib
216
356
 
217
- $LOAD_PATH.reject! do |p|
218
- next if File.expand_path(p) =~ me
219
- loaded_gem_paths.delete(p)
220
- end
221
- $LOAD_PATH.uniq!
357
+ loaded_gem_paths = Bundler.rubygems.loaded_gem_paths
358
+
359
+ $LOAD_PATH.reject! do |p|
360
+ next if resolve_path(p).start_with?(bundler_lib)
361
+ loaded_gem_paths.delete(p)
222
362
  end
363
+ $LOAD_PATH.uniq!
364
+ end
365
+
366
+ def resolve_path(path)
367
+ expanded = File.expand_path(path)
368
+ return expanded unless File.respond_to?(:realpath) && File.exist?(expanded)
369
+
370
+ File.realpath(expanded)
223
371
  end
224
372
 
225
373
  def prints_major_deprecations?
226
374
  require "bundler"
227
- return false unless Bundler.settings[:major_deprecations]
375
+ deprecation_release = Bundler::VERSION.split(".").drop(1).include?("99")
376
+ return false if !deprecation_release && !Bundler.settings[:major_deprecations]
228
377
  require "bundler/deprecate"
229
378
  return false if Bundler::Deprecate.skip
230
379
  true
231
380
  end
232
381
 
233
- def deprecate_gemfile(gemfile)
234
- return unless gemfile && File.basename(gemfile) == "Gemfile"
235
- Bundler::SharedHelpers.major_deprecation \
236
- "gems.rb and gems.locked will be prefered to Gemfile and Gemfile.lock."
237
- end
238
-
239
382
  extend self
240
383
  end
241
384
  end