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
@@ -1,19 +1,24 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler
3
4
  # used for Creating Specifications from the Gemcutter Endpoint
4
5
  class EndpointSpecification < Gem::Specification
5
6
  ILLFORMED_MESSAGE = 'Ill-formed requirement ["#<YAML::Syck::DefaultKey'.freeze
6
7
  include MatchPlatform
7
8
 
8
- attr_reader :name, :version, :platform, :dependencies, :required_rubygems_version, :required_ruby_version, :checksum
9
- attr_accessor :source, :remote
9
+ attr_reader :name, :version, :platform, :required_rubygems_version, :required_ruby_version, :checksum
10
+ attr_accessor :source, :remote, :dependencies
10
11
 
11
12
  def initialize(name, version, platform, dependencies, metadata = nil)
13
+ super()
12
14
  @name = name
13
15
  @version = Gem::Version.create version
14
16
  @platform = platform
15
17
  @dependencies = dependencies.map {|dep, reqs| build_dependency(dep, reqs) }
16
18
 
19
+ @loaded_from = nil
20
+ @remote_specification = nil
21
+
17
22
  parse_metadata(metadata)
18
23
  end
19
24
 
@@ -71,6 +76,8 @@ module Bundler
71
76
  @remote_specification.post_install_message
72
77
  elsif _local_specification
73
78
  _local_specification.post_install_message
79
+ else
80
+ super
74
81
  end
75
82
  end
76
83
 
@@ -80,6 +87,8 @@ module Bundler
80
87
  @remote_specification.extensions
81
88
  elsif _local_specification
82
89
  _local_specification.extensions
90
+ else
91
+ super
83
92
  end
84
93
  end
85
94
 
@@ -91,6 +100,7 @@ module Bundler
91
100
  end
92
101
 
93
102
  def __swap__(spec)
103
+ SharedHelpers.ensure_same_dependencies(self, dependencies, spec.dependencies)
94
104
  @remote_specification = spec
95
105
  end
96
106
 
@@ -113,7 +123,7 @@ module Bundler
113
123
  @required_ruby_version = Gem::Requirement.new(v)
114
124
  end
115
125
  end
116
- rescue => e
126
+ rescue StandardError => e
117
127
  raise GemspecError, "There was an error parsing the metadata for the gem #{name} (#{version}): #{e.class}\n#{e}\nThe metadata was #{data.inspect}"
118
128
  end
119
129
 
data/lib/bundler/env.rb CHANGED
@@ -1,83 +1,155 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "bundler/rubygems_integration"
3
4
  require "bundler/source/git/git_proxy"
4
5
 
5
6
  module Bundler
6
7
  class Env
7
- def write(io)
8
- io.write report(:print_gemfile => true, :print_gemspecs => true)
8
+ def self.write(io)
9
+ io.write report
9
10
  end
10
11
 
11
- def report(options = {})
12
- print_gemfile = options.delete(:print_gemfile)
13
- print_gemspecs = options.delete(:print_gemspecs)
14
-
15
- out = String.new("Environment\n\n")
16
- out << " Bundler #{Bundler::VERSION}\n"
17
- out << " Rubygems #{Gem::VERSION}\n"
18
- out << " Ruby #{ruby_version}"
19
- out << " GEM_HOME #{ENV["GEM_HOME"]}\n" unless ENV["GEM_HOME"].nil? || ENV["GEM_HOME"].empty?
20
- out << " GEM_PATH #{ENV["GEM_PATH"]}\n" unless ENV["GEM_PATH"] == ENV["GEM_HOME"]
21
- out << " RVM #{ENV["rvm_version"]}\n" if ENV["rvm_version"]
22
- out << " Git #{git_version}\n"
23
- %w(rubygems-bundler open_gem).each do |name|
24
- specs = Bundler.rubygems.find_name(name)
25
- out << " #{name} (#{specs.map(&:version).join(",")})\n" unless specs.empty?
26
- end
12
+ def self.report(options = {})
13
+ print_gemfile = options.delete(:print_gemfile) { true }
14
+ print_gemspecs = options.delete(:print_gemspecs) { true }
15
+
16
+ out = String.new
17
+ append_formatted_table("Environment", environment, out)
18
+ append_formatted_table("Bundler Build Metadata", BuildMetadata.to_h, out)
27
19
 
28
- out << "\nBundler settings\n\n" unless Bundler.settings.all.empty?
29
- Bundler.settings.all.each do |setting|
30
- out << " " << setting << "\n"
31
- Bundler.settings.pretty_values_for(setting).each do |line|
32
- out << " " << line << "\n"
20
+ unless Bundler.settings.all.empty?
21
+ out << "\n## Bundler settings\n\n```\n"
22
+ Bundler.settings.all.each do |setting|
23
+ out << setting << "\n"
24
+ Bundler.settings.pretty_values_for(setting).each do |line|
25
+ out << " " << line << "\n"
26
+ end
33
27
  end
28
+ out << "```\n"
34
29
  end
35
30
 
31
+ return out unless SharedHelpers.in_bundle?
32
+
36
33
  if print_gemfile
37
- out << "\n#{Bundler.default_gemfile.relative_path_from(SharedHelpers.pwd)}\n\n"
38
- out << " " << read_file(Bundler.default_gemfile).gsub(/\n/, "\n ") << "\n"
34
+ gemfiles = [Bundler.default_gemfile]
35
+ begin
36
+ gemfiles = Bundler.definition.gemfiles
37
+ rescue GemfileNotFound
38
+ nil
39
+ end
40
+
41
+ out << "\n## Gemfile\n"
42
+ gemfiles.each do |gemfile|
43
+ out << "\n### #{Pathname.new(gemfile).relative_path_from(SharedHelpers.pwd)}\n\n"
44
+ out << "```ruby\n" << read_file(gemfile).chomp << "\n```\n"
45
+ end
39
46
 
40
- out << "\n#{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}\n\n"
41
- out << " " << read_file(Bundler.default_lockfile).gsub(/\n/, "\n ") << "\n"
47
+ out << "\n### #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}\n\n"
48
+ out << "```\n" << read_file(Bundler.default_lockfile).chomp << "\n```\n"
42
49
  end
43
50
 
44
51
  if print_gemspecs
45
52
  dsl = Dsl.new.tap {|d| d.eval_gemfile(Bundler.default_gemfile) }
53
+ out << "\n## Gemspecs\n" unless dsl.gemspecs.empty?
46
54
  dsl.gemspecs.each do |gs|
47
- out << "\n#{File.basename(gs.loaded_from)}"
48
- out << "\n\n " << read_file(gs.loaded_from).gsub(/\n/, "\n ") << "\n"
55
+ out << "\n### #{File.basename(gs.loaded_from)}"
56
+ out << "\n\n```ruby\n" << read_file(gs.loaded_from).chomp << "\n```\n"
49
57
  end
50
58
  end
51
59
 
52
60
  out
53
61
  end
54
62
 
55
- private
56
-
57
- def read_file(filename)
58
- File.read(filename.to_s).strip
63
+ def self.read_file(filename)
64
+ Bundler.read_file(filename.to_s).strip
59
65
  rescue Errno::ENOENT
60
66
  "<No #{filename} found>"
61
- rescue => e
67
+ rescue RuntimeError => e
62
68
  "#{e.class}: #{e.message}"
63
69
  end
64
70
 
65
- def ruby_version
71
+ def self.ruby_version
66
72
  str = String.new("#{RUBY_VERSION}")
67
73
  if RUBY_VERSION < "1.9"
68
74
  str << " (#{RUBY_RELEASE_DATE}"
69
75
  str << " patchlevel #{RUBY_PATCHLEVEL}" if defined? RUBY_PATCHLEVEL
70
- str << ") [#{RUBY_PLATFORM}]\n"
76
+ str << ") [#{RUBY_PLATFORM}]"
71
77
  else
72
78
  str << "p#{RUBY_PATCHLEVEL}" if defined? RUBY_PATCHLEVEL
73
- str << " (#{RUBY_RELEASE_DATE} revision #{RUBY_REVISION}) [#{RUBY_PLATFORM}]\n"
79
+ str << " (#{RUBY_RELEASE_DATE} revision #{RUBY_REVISION}) [#{RUBY_PLATFORM}]"
74
80
  end
75
81
  end
76
82
 
77
- def git_version
83
+ def self.git_version
78
84
  Bundler::Source::Git::GitProxy.new(nil, nil, nil).full_version
79
85
  rescue Bundler::Source::Git::GitNotInstalledError
80
86
  "not installed"
81
87
  end
88
+
89
+ def self.version_of(script)
90
+ return "not installed" unless Bundler.which(script)
91
+ `#{script} --version`.chomp
92
+ end
93
+
94
+ def self.chruby_version
95
+ return "not installed" unless Bundler.which("chruby-exec")
96
+ `chruby-exec -- chruby --version`.
97
+ sub(/.*^chruby: (#{Gem::Version::VERSION_PATTERN}).*/m, '\1')
98
+ end
99
+
100
+ def self.environment
101
+ out = []
102
+
103
+ out << ["Bundler", Bundler::VERSION]
104
+ out << [" Platforms", Gem.platforms.join(", ")]
105
+ out << ["Ruby", ruby_version]
106
+ out << [" Full Path", Gem.ruby]
107
+ out << [" Config Dir", Pathname.new(Gem::ConfigFile::SYSTEM_WIDE_CONFIG_FILE).dirname]
108
+ out << ["RubyGems", Gem::VERSION]
109
+ out << [" Gem Home", ENV.fetch("GEM_HOME") { Gem.dir }]
110
+ out << [" Gem Path", ENV.fetch("GEM_PATH") { Gem.path.join(File::PATH_SEPARATOR) }]
111
+ out << [" User Path", Gem.user_dir]
112
+ out << [" Bin Dir", Gem.bindir]
113
+ if defined?(OpenSSL)
114
+ out << ["OpenSSL"]
115
+ out << [" Compiled", OpenSSL::OPENSSL_VERSION] if defined?(OpenSSL::OPENSSL_VERSION)
116
+ out << [" Loaded", OpenSSL::OPENSSL_LIBRARY_VERSION] if defined?(OpenSSL::OPENSSL_LIBRARY_VERSION)
117
+ out << [" Cert File", OpenSSL::X509::DEFAULT_CERT_FILE] if defined?(OpenSSL::X509::DEFAULT_CERT_FILE)
118
+ out << [" Cert Dir", OpenSSL::X509::DEFAULT_CERT_DIR] if defined?(OpenSSL::X509::DEFAULT_CERT_DIR)
119
+ end
120
+ out << ["Tools"]
121
+ out << [" Git", git_version]
122
+ out << [" RVM", ENV.fetch("rvm_version") { version_of("rvm") }]
123
+ out << [" rbenv", version_of("rbenv")]
124
+ out << [" chruby", chruby_version]
125
+
126
+ %w[rubygems-bundler open_gem].each do |name|
127
+ specs = Bundler.rubygems.find_name(name)
128
+ out << [" #{name}", "(#{specs.map(&:version).join(",")})"] unless specs.empty?
129
+ end
130
+ if (exe = caller.last.split(":").first) && exe =~ %r{(exe|bin)/bundler?\z}
131
+ shebang = File.read(exe).lines.first
132
+ shebang.sub!(/^#!\s*/, "")
133
+ unless shebang.start_with?(Gem.ruby, "/usr/bin/env ruby")
134
+ out << ["Gem.ruby", Gem.ruby]
135
+ out << ["bundle #!", shebang]
136
+ end
137
+ end
138
+
139
+ out
140
+ end
141
+
142
+ def self.append_formatted_table(title, pairs, out)
143
+ return if pairs.empty?
144
+ out << "\n" unless out.empty?
145
+ out << "## #{title}\n\n```\n"
146
+ ljust = pairs.map {|k, _v| k.to_s.length }.max
147
+ pairs.each do |k, v|
148
+ out << "#{k.to_s.ljust(ljust)} #{v}\n"
149
+ end
150
+ out << "```\n"
151
+ end
152
+
153
+ private_class_method :read_file, :ruby_version, :git_version, :append_formatted_table, :version_of, :chruby_version
82
154
  end
83
155
  end
@@ -1,12 +1,29 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler
3
4
  class EnvironmentPreserver
5
+ INTENTIONALLY_NIL = "BUNDLER_ENVIRONMENT_PRESERVER_INTENTIONALLY_NIL".freeze
6
+ BUNDLER_KEYS = %w[
7
+ BUNDLE_BIN_PATH
8
+ BUNDLE_GEMFILE
9
+ BUNDLER_ORIG_MANPATH
10
+ BUNDLER_VERSION
11
+ GEM_HOME
12
+ GEM_PATH
13
+ MANPATH
14
+ PATH
15
+ RB_USER_INSTALL
16
+ RUBYLIB
17
+ RUBYOPT
18
+ ].map(&:freeze).freeze
19
+ BUNDLER_PREFIX = "BUNDLER_ORIG_".freeze
20
+
4
21
  # @param env [ENV]
5
22
  # @param keys [Array<String>]
6
23
  def initialize(env, keys)
7
24
  @original = env.to_hash
8
25
  @keys = keys
9
- @prefix = "BUNDLER_ORIG_"
26
+ @prefix = BUNDLER_PREFIX
10
27
  end
11
28
 
12
29
  # @return [Hash]
@@ -14,9 +31,10 @@ module Bundler
14
31
  env = @original.clone
15
32
  @keys.each do |key|
16
33
  value = env[key]
17
- original_value = env[@prefix + key]
18
- if !value.nil? && !value.empty? && original_value.nil?
19
- env[@prefix + key] = value
34
+ if !value.nil? && !value.empty?
35
+ env[@prefix + key] ||= value
36
+ elsif value.nil?
37
+ env[@prefix + key] ||= INTENTIONALLY_NIL
20
38
  end
21
39
  end
22
40
  env
@@ -27,10 +45,13 @@ module Bundler
27
45
  env = @original.clone
28
46
  @keys.each do |key|
29
47
  value_original = env[@prefix + key]
30
- unless value_original.nil? || value_original.empty?
48
+ next if value_original.nil? || value_original.empty?
49
+ if value_original == INTENTIONALLY_NIL
50
+ env.delete(key)
51
+ else
31
52
  env[key] = value_original
32
- env.delete(@prefix + key)
33
53
  end
54
+ env.delete(@prefix + key)
34
55
  end
35
56
  env
36
57
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler
3
4
  class BundlerError < StandardError
4
5
  def self.status_code(code)
@@ -52,6 +53,9 @@ module Bundler
52
53
  class CyclicDependencyError < BundlerError; status_code(21); end
53
54
  class GemfileLockNotFound < BundlerError; status_code(22); end
54
55
  class PluginError < BundlerError; status_code(29); end
56
+ class SudoNotPermittedError < BundlerError; status_code(30); end
57
+ class ThreadCreationError < BundlerError; status_code(33); end
58
+ class APIResponseMismatchError < BundlerError; status_code(34); end
55
59
  class GemfileEvalError < GemfileError; end
56
60
  class MarshalError < StandardError; end
57
61
 
@@ -131,4 +135,24 @@ module Bundler
131
135
 
132
136
  status_code(28)
133
137
  end
138
+
139
+ class NoSpaceOnDeviceError < PermissionError
140
+ def message
141
+ "There was an error while trying to #{action} `#{@path}`. " \
142
+ "There was insufficient space remaining on the device."
143
+ end
144
+
145
+ status_code(31)
146
+ end
147
+
148
+ class GenericSystemCallError < BundlerError
149
+ attr_reader :underlying_error
150
+
151
+ def initialize(underlying_error, message)
152
+ @underlying_error = underlying_error
153
+ super("#{message}\nThe underlying system error is #{@underlying_error.class}: #{@underlying_error}")
154
+ end
155
+
156
+ status_code(32)
157
+ end
134
158
  end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class FeatureFlag
5
+ def self.settings_flag(flag, &default)
6
+ unless Bundler::Settings::BOOL_KEYS.include?(flag.to_s)
7
+ raise "Cannot use `#{flag}` as a settings feature flag since it isn't a bool key"
8
+ end
9
+
10
+ settings_method("#{flag}?", flag, &default)
11
+ end
12
+ private_class_method :settings_flag
13
+
14
+ def self.settings_option(key, &default)
15
+ settings_method(key, key, &default)
16
+ end
17
+ private_class_method :settings_option
18
+
19
+ def self.settings_method(name, key, &default)
20
+ define_method(name) do
21
+ value = Bundler.settings[key]
22
+ value = instance_eval(&default) if value.nil? && !default.nil?
23
+ value
24
+ end
25
+ end
26
+ private_class_method :settings_method
27
+
28
+ (1..10).each {|v| define_method("bundler_#{v}_mode?") { major_version >= v } }
29
+
30
+ settings_flag(:allow_bundler_dependency_conflicts) { bundler_2_mode? }
31
+ settings_flag(:allow_offline_install) { bundler_2_mode? }
32
+ settings_flag(:auto_clean_without_path) { bundler_2_mode? }
33
+ settings_flag(:auto_config_jobs) { bundler_2_mode? }
34
+ settings_flag(:cache_all) { bundler_2_mode? }
35
+ settings_flag(:cache_command_is_package) { bundler_2_mode? }
36
+ settings_flag(:console_command) { !bundler_2_mode? }
37
+ settings_flag(:default_install_uses_path) { bundler_2_mode? }
38
+ settings_flag(:deployment_means_frozen) { bundler_2_mode? }
39
+ settings_flag(:disable_multisource) { bundler_2_mode? }
40
+ settings_flag(:error_on_stderr) { bundler_2_mode? }
41
+ settings_flag(:forget_cli_options) { bundler_2_mode? }
42
+ settings_flag(:global_path_appends_ruby_scope) { bundler_2_mode? }
43
+ settings_flag(:global_gem_cache) { bundler_2_mode? }
44
+ settings_flag(:init_gems_rb) { bundler_2_mode? }
45
+ settings_flag(:list_command) { bundler_2_mode? }
46
+ settings_flag(:lockfile_uses_separate_rubygems_sources) { bundler_2_mode? }
47
+ settings_flag(:only_update_to_newer_versions) { bundler_2_mode? }
48
+ settings_flag(:path_relative_to_cwd) { bundler_2_mode? }
49
+ settings_flag(:plugins) { @bundler_version >= Gem::Version.new("1.14") }
50
+ settings_flag(:prefer_gems_rb) { bundler_2_mode? }
51
+ settings_flag(:print_only_version_number) { bundler_2_mode? }
52
+ settings_flag(:setup_makes_kernel_gem_public) { !bundler_2_mode? }
53
+ settings_flag(:skip_default_git_sources) { bundler_2_mode? }
54
+ settings_flag(:specific_platform) { bundler_2_mode? }
55
+ settings_flag(:suppress_install_using_messages) { bundler_2_mode? }
56
+ settings_flag(:unlock_source_unlocks_spec) { !bundler_2_mode? }
57
+ settings_flag(:update_requires_all_flag) { bundler_2_mode? }
58
+ settings_flag(:use_gem_version_promoter_for_major_updates) { bundler_2_mode? }
59
+ settings_flag(:viz_command) { !bundler_2_mode? }
60
+
61
+ settings_option(:default_cli_command) { bundler_2_mode? ? :cli_help : :install }
62
+
63
+ settings_method(:github_https?, "github.https") { bundler_2_mode? }
64
+
65
+ def initialize(bundler_version)
66
+ @bundler_version = Gem::Version.create(bundler_version)
67
+ end
68
+
69
+ def major_version
70
+ @bundler_version.segments.first
71
+ end
72
+ private :major_version
73
+ end
74
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "bundler/vendored_persistent"
3
4
  require "cgi"
4
5
  require "securerandom"
@@ -95,11 +96,11 @@ module Bundler
95
96
 
96
97
  uri = URI.parse("#{remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}.rz")
97
98
  if uri.scheme == "file"
98
- Bundler.load_marshal Gem.inflate(Gem.read_binary(uri.path))
99
+ Bundler.load_marshal Bundler.rubygems.inflate(Gem.read_binary(uri.path))
99
100
  elsif cached_spec_path = gemspec_cached_path(spec_file_name)
100
101
  Bundler.load_gemspec(cached_spec_path)
101
102
  else
102
- Bundler.load_marshal Gem.inflate(downloader.fetch(uri).body)
103
+ Bundler.load_marshal Bundler.rubygems.inflate(downloader.fetch(uri).body)
103
104
  end
104
105
  rescue MarshalError
105
106
  raise HTTPError, "Gemspec #{spec} contained invalid data.\n" \
@@ -177,7 +178,7 @@ module Bundler
177
178
  # engine_version raises on unknown engines
178
179
  engine_version = begin
179
180
  ruby.engine_versions
180
- rescue
181
+ rescue RuntimeError
181
182
  "???"
182
183
  end
183
184
  agent << " #{ruby.engine}/#{ruby.versions_string(engine_version)}"
@@ -237,7 +238,7 @@ module Bundler
237
238
  Bundler.settings[:ssl_client_cert]
238
239
  raise SSLError if needs_ssl && !defined?(OpenSSL::SSL)
239
240
 
240
- con = Net::HTTP::Persistent.new "bundler", :ENV
241
+ con = PersistentHTTP.new "bundler", :ENV
241
242
  if gem_proxy = Bundler.rubygems.configuration[:http_proxy]
242
243
  con.proxy = URI.parse(gem_proxy) if gem_proxy != :no_proxy
243
244
  end
@@ -248,8 +249,11 @@ module Bundler
248
249
  con.cert_store = bundler_cert_store
249
250
  end
250
251
 
251
- if Bundler.settings[:ssl_client_cert]
252
- pem = File.read(Bundler.settings[:ssl_client_cert])
252
+ ssl_client_cert = Bundler.settings[:ssl_client_cert] ||
253
+ (Bundler.rubygems.configuration.ssl_client_cert if
254
+ Bundler.rubygems.configuration.respond_to?(:ssl_client_cert))
255
+ if ssl_client_cert
256
+ pem = File.read(ssl_client_cert)
253
257
  con.cert = OpenSSL::X509::Certificate.new(pem)
254
258
  con.key = OpenSSL::PKey::RSA.new(pem)
255
259
  end
@@ -273,16 +277,19 @@ module Bundler
273
277
  Timeout::Error, EOFError, SocketError, Errno::ENETDOWN, Errno::ENETUNREACH,
274
278
  Errno::EINVAL, Errno::ECONNRESET, Errno::ETIMEDOUT, Errno::EAGAIN,
275
279
  Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError,
276
- Net::HTTP::Persistent::Error, Zlib::BufError, Errno::EHOSTUNREACH
280
+ PersistentHTTP::Error, Zlib::BufError, Errno::EHOSTUNREACH
277
281
  ].freeze
278
282
 
279
283
  def bundler_cert_store
280
284
  store = OpenSSL::X509::Store.new
281
- if Bundler.settings[:ssl_ca_cert]
282
- if File.directory? Bundler.settings[:ssl_ca_cert]
283
- store.add_path Bundler.settings[:ssl_ca_cert]
285
+ ssl_ca_cert = Bundler.settings[:ssl_ca_cert] ||
286
+ (Bundler.rubygems.configuration.ssl_ca_cert if
287
+ Bundler.rubygems.configuration.respond_to?(:ssl_ca_cert))
288
+ if ssl_ca_cert
289
+ if File.directory? ssl_ca_cert
290
+ store.add_path ssl_ca_cert
284
291
  else
285
- store.add_file Bundler.settings[:ssl_ca_cert]
292
+ store.add_file ssl_ca_cert
286
293
  end
287
294
  else
288
295
  store.set_default_paths