bundler 1.9.0 → 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 (328) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1157 -6
  3. data/README.md +33 -6
  4. data/bundler.gemspec +51 -18
  5. data/exe/bundle +31 -0
  6. data/{bin → exe}/bundle_ruby +10 -6
  7. data/exe/bundler +4 -0
  8. data/lib/bundler.rb +326 -207
  9. data/lib/bundler/build_metadata.rb +53 -0
  10. data/lib/bundler/capistrano.rb +9 -3
  11. data/lib/bundler/cli.rb +522 -141
  12. data/lib/bundler/cli/add.rb +35 -0
  13. data/lib/bundler/cli/binstubs.rb +22 -11
  14. data/lib/bundler/cli/cache.rb +7 -6
  15. data/lib/bundler/cli/check.rb +11 -8
  16. data/lib/bundler/cli/clean.rb +7 -8
  17. data/lib/bundler/cli/common.rb +53 -7
  18. data/lib/bundler/cli/config.rb +84 -49
  19. data/lib/bundler/cli/console.rb +13 -8
  20. data/lib/bundler/cli/doctor.rb +140 -0
  21. data/lib/bundler/cli/exec.rb +77 -16
  22. data/lib/bundler/cli/gem.rb +120 -52
  23. data/lib/bundler/cli/info.rb +50 -0
  24. data/lib/bundler/cli/init.rb +21 -7
  25. data/lib/bundler/cli/inject.rb +37 -10
  26. data/lib/bundler/cli/install.rb +139 -78
  27. data/lib/bundler/cli/issue.rb +40 -0
  28. data/lib/bundler/cli/list.rb +58 -0
  29. data/lib/bundler/cli/lock.rb +63 -0
  30. data/lib/bundler/cli/open.rb +9 -6
  31. data/lib/bundler/cli/outdated.rb +221 -35
  32. data/lib/bundler/cli/package.rb +11 -7
  33. data/lib/bundler/cli/platform.rb +7 -4
  34. data/lib/bundler/cli/plugin.rb +24 -0
  35. data/lib/bundler/cli/pristine.rb +47 -0
  36. data/lib/bundler/cli/remove.rb +18 -0
  37. data/lib/bundler/cli/show.rb +11 -10
  38. data/lib/bundler/cli/update.rb +47 -29
  39. data/lib/bundler/cli/viz.rb +12 -8
  40. data/lib/bundler/compact_index_client.rb +109 -0
  41. data/lib/bundler/compact_index_client/cache.rb +118 -0
  42. data/lib/bundler/compact_index_client/updater.rb +116 -0
  43. data/lib/bundler/compatibility_guard.rb +14 -0
  44. data/lib/bundler/constants.rb +3 -1
  45. data/lib/bundler/current_ruby.rb +47 -137
  46. data/lib/bundler/definition.rb +599 -230
  47. data/lib/bundler/dep_proxy.rb +15 -10
  48. data/lib/bundler/dependency.rb +54 -25
  49. data/lib/bundler/deployment.rb +12 -2
  50. data/lib/bundler/deprecate.rb +33 -4
  51. data/lib/bundler/dsl.rb +383 -99
  52. data/lib/bundler/endpoint_specification.rb +72 -7
  53. data/lib/bundler/env.rb +121 -41
  54. data/lib/bundler/environment_preserver.rb +59 -0
  55. data/lib/bundler/errors.rb +158 -0
  56. data/lib/bundler/feature_flag.rb +74 -0
  57. data/lib/bundler/fetcher.rb +171 -280
  58. data/lib/bundler/fetcher/base.rb +52 -0
  59. data/lib/bundler/fetcher/compact_index.rb +126 -0
  60. data/lib/bundler/fetcher/dependency.rb +82 -0
  61. data/lib/bundler/fetcher/downloader.rb +84 -0
  62. data/lib/bundler/fetcher/index.rb +52 -0
  63. data/lib/bundler/friendly_errors.rb +113 -58
  64. data/lib/bundler/gem_helper.rb +73 -46
  65. data/lib/bundler/gem_helpers.rb +85 -9
  66. data/lib/bundler/gem_remote_fetcher.rb +43 -0
  67. data/lib/bundler/gem_tasks.rb +6 -1
  68. data/lib/bundler/gem_version_promoter.rb +190 -0
  69. data/lib/bundler/gemdeps.rb +29 -0
  70. data/lib/bundler/graph.rb +32 -49
  71. data/lib/bundler/index.rb +79 -67
  72. data/lib/bundler/injector.rb +219 -30
  73. data/lib/bundler/inline.rb +74 -0
  74. data/lib/bundler/installer.rb +191 -206
  75. data/lib/bundler/installer/gem_installer.rb +85 -0
  76. data/lib/bundler/installer/parallel_installer.rb +233 -0
  77. data/lib/bundler/installer/standalone.rb +53 -0
  78. data/lib/bundler/lazy_specification.rb +53 -13
  79. data/lib/bundler/lockfile_generator.rb +95 -0
  80. data/lib/bundler/lockfile_parser.rb +157 -62
  81. data/lib/bundler/match_platform.rb +15 -4
  82. data/lib/bundler/mirror.rb +223 -0
  83. data/lib/bundler/plugin.rb +292 -0
  84. data/lib/bundler/plugin/api.rb +81 -0
  85. data/lib/bundler/plugin/api/source.rb +306 -0
  86. data/lib/bundler/plugin/dsl.rb +53 -0
  87. data/lib/bundler/plugin/events.rb +61 -0
  88. data/lib/bundler/plugin/index.rb +162 -0
  89. data/lib/bundler/plugin/installer.rb +96 -0
  90. data/lib/bundler/plugin/installer/git.rb +38 -0
  91. data/lib/bundler/plugin/installer/rubygems.rb +27 -0
  92. data/lib/bundler/plugin/source_list.rb +27 -0
  93. data/lib/bundler/process_lock.rb +24 -0
  94. data/lib/bundler/psyched_yaml.rb +17 -6
  95. data/lib/bundler/remote_specification.rb +68 -11
  96. data/lib/bundler/resolver.rb +263 -229
  97. data/lib/bundler/resolver/spec_group.rb +106 -0
  98. data/lib/bundler/retry.rb +25 -19
  99. data/lib/bundler/ruby_dsl.rb +9 -2
  100. data/lib/bundler/ruby_version.rb +101 -66
  101. data/lib/bundler/rubygems_ext.rb +77 -37
  102. data/lib/bundler/rubygems_gem_installer.rb +106 -0
  103. data/lib/bundler/rubygems_integration.rb +450 -163
  104. data/lib/bundler/runtime.rb +133 -103
  105. data/lib/bundler/settings.rb +344 -83
  106. data/lib/bundler/settings/validator.rb +102 -0
  107. data/lib/bundler/setup.rb +7 -3
  108. data/lib/bundler/shared_helpers.rb +284 -54
  109. data/lib/bundler/similarity_detector.rb +21 -21
  110. data/lib/bundler/source.rb +68 -15
  111. data/lib/bundler/source/gemspec.rb +18 -0
  112. data/lib/bundler/source/git.rb +90 -55
  113. data/lib/bundler/source/git/git_proxy.rb +135 -35
  114. data/lib/bundler/source/metadata.rb +62 -0
  115. data/lib/bundler/source/path.rb +84 -61
  116. data/lib/bundler/source/path/installer.rb +53 -17
  117. data/lib/bundler/source/rubygems.rb +282 -122
  118. data/lib/bundler/source/rubygems/remote.rb +69 -0
  119. data/lib/bundler/source_list.rb +107 -22
  120. data/lib/bundler/spec_set.rb +83 -45
  121. data/lib/bundler/ssl_certs/certificate_manager.rb +8 -7
  122. data/lib/bundler/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem +21 -0
  123. data/lib/bundler/ssl_certs/{DigiCertHighAssuranceEVRootCA.pem → rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem} +0 -0
  124. data/lib/bundler/ssl_certs/{AddTrustExternalCARoot-2048.pem → rubygems.org/AddTrustExternalCARoot.pem} +0 -0
  125. data/lib/bundler/stub_specification.rb +108 -0
  126. data/lib/bundler/templates/.document +1 -0
  127. data/lib/bundler/templates/Executable +19 -6
  128. data/lib/bundler/templates/Executable.bundler +105 -0
  129. data/lib/bundler/templates/Executable.standalone +6 -4
  130. data/lib/bundler/templates/Gemfile +4 -1
  131. data/lib/bundler/templates/gems.rb +8 -0
  132. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +68 -7
  133. data/lib/bundler/templates/newgem/Gemfile.tt +4 -2
  134. data/lib/bundler/templates/newgem/LICENSE.txt.tt +1 -1
  135. data/lib/bundler/templates/newgem/README.md.tt +19 -11
  136. data/lib/bundler/templates/newgem/Rakefile.tt +10 -6
  137. data/lib/bundler/templates/newgem/bin/console.tt +1 -1
  138. data/lib/bundler/templates/newgem/bin/setup.tt +2 -1
  139. data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +4 -4
  140. data/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +3 -3
  141. data/lib/bundler/templates/newgem/gitignore.tt +5 -1
  142. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +7 -6
  143. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +4 -4
  144. data/lib/bundler/templates/newgem/newgem.gemspec.tt +31 -15
  145. data/lib/bundler/templates/newgem/rspec.tt +1 -0
  146. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +3 -5
  147. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +14 -2
  148. data/lib/bundler/templates/newgem/test/{test_newgem.rb.tt → newgem_test.rb.tt} +2 -2
  149. data/lib/bundler/templates/newgem/test/test_helper.rb.tt +4 -0
  150. data/lib/bundler/templates/newgem/travis.yml.tt +7 -0
  151. data/lib/bundler/ui.rb +5 -3
  152. data/lib/bundler/ui/rg_proxy.rb +5 -7
  153. data/lib/bundler/ui/shell.rb +69 -18
  154. data/lib/bundler/ui/silent.rb +26 -1
  155. data/lib/bundler/uri_credentials_filter.rb +37 -0
  156. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1638 -0
  157. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +12 -0
  158. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +26 -0
  159. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
  160. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +81 -0
  161. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +223 -0
  162. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +36 -0
  163. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +66 -0
  164. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +62 -0
  165. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +63 -0
  166. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +61 -0
  167. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +126 -0
  168. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +46 -0
  169. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +36 -0
  170. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +136 -0
  171. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +143 -0
  172. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +6 -0
  173. data/lib/bundler/vendor/{Molinillo-0.2.1 → molinillo}/lib/molinillo/modules/specification_provider.rb +11 -0
  174. data/lib/bundler/vendor/{Molinillo-0.2.1 → molinillo}/lib/molinillo/modules/ui.rb +6 -2
  175. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +837 -0
  176. data/lib/bundler/vendor/{Molinillo-0.2.1 → molinillo}/lib/molinillo/resolver.rb +6 -3
  177. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +58 -0
  178. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/faster.rb +1 -0
  179. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/persistent.rb +27 -24
  180. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/persistent/ssl_reuse.rb +2 -1
  181. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor.rb +47 -22
  182. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions.rb +31 -29
  183. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/create_file.rb +3 -2
  184. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/create_link.rb +3 -2
  185. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/directory.rb +3 -3
  186. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/empty_directory.rb +16 -8
  187. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/file_manipulation.rb +66 -18
  188. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/inject_into_file.rb +18 -16
  189. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/base.rb +67 -44
  190. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/command.rb +13 -11
  191. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/core_ext/hash_with_indifferent_access.rb +21 -1
  192. data/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +12 -0
  193. data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +129 -0
  194. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/error.rb +3 -3
  195. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/group.rb +14 -14
  196. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/invocation.rb +4 -5
  197. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/line_editor.rb +2 -2
  198. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/line_editor/basic.rb +2 -0
  199. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/line_editor/readline.rb +0 -0
  200. data/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -0
  201. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/parser/argument.rb +4 -7
  202. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/parser/arguments.rb +16 -16
  203. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/parser/option.rb +42 -21
  204. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/parser/options.rb +13 -10
  205. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/rake_compat.rb +1 -1
  206. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/runner.rb +35 -33
  207. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/shell.rb +4 -4
  208. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/shell/basic.rb +49 -33
  209. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/shell/color.rb +2 -2
  210. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/shell/html.rb +5 -5
  211. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/util.rb +8 -7
  212. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/version.rb +1 -1
  213. data/lib/bundler/vendored_fileutils.rb +9 -0
  214. data/lib/bundler/vendored_molinillo.rb +4 -5
  215. data/lib/bundler/vendored_persistent.rb +45 -4
  216. data/lib/bundler/vendored_thor.rb +8 -5
  217. data/lib/bundler/version.rb +23 -1
  218. data/lib/bundler/version_ranges.rb +76 -0
  219. data/lib/bundler/vlad.rb +8 -2
  220. data/lib/bundler/worker.rb +39 -6
  221. data/lib/bundler/yaml_serializer.rb +90 -0
  222. data/man/bundle-add.1 +58 -0
  223. data/man/bundle-add.1.txt +52 -0
  224. data/man/bundle-add.ronn +40 -0
  225. data/man/bundle-binstubs.1 +40 -0
  226. data/man/bundle-binstubs.1.txt +48 -0
  227. data/man/bundle-binstubs.ronn +43 -0
  228. data/man/bundle-check.1 +31 -0
  229. data/man/bundle-check.1.txt +33 -0
  230. data/man/bundle-check.ronn +26 -0
  231. data/man/bundle-clean.1 +24 -0
  232. data/man/bundle-clean.1.txt +26 -0
  233. data/man/bundle-clean.ronn +18 -0
  234. data/man/bundle-config.1 +497 -0
  235. data/man/bundle-config.1.txt +529 -0
  236. data/man/bundle-config.ronn +256 -31
  237. data/man/bundle-doctor.1 +44 -0
  238. data/man/bundle-doctor.1.txt +44 -0
  239. data/man/bundle-doctor.ronn +33 -0
  240. data/man/bundle-exec.1 +165 -0
  241. data/man/bundle-exec.1.txt +178 -0
  242. data/man/bundle-exec.ronn +19 -3
  243. data/man/bundle-gem.1 +80 -0
  244. data/man/bundle-gem.1.txt +91 -0
  245. data/man/bundle-gem.ronn +78 -0
  246. data/man/bundle-info.1 +20 -0
  247. data/man/bundle-info.1.txt +21 -0
  248. data/man/bundle-info.ronn +17 -0
  249. data/man/bundle-init.1 +25 -0
  250. data/man/bundle-init.1.txt +34 -0
  251. data/man/bundle-init.ronn +29 -0
  252. data/man/bundle-inject.1 +33 -0
  253. data/man/bundle-inject.1.txt +32 -0
  254. data/man/bundle-inject.ronn +22 -0
  255. data/man/bundle-install.1 +308 -0
  256. data/man/bundle-install.1.txt +396 -0
  257. data/man/bundle-install.ronn +64 -67
  258. data/man/bundle-list.1 +50 -0
  259. data/man/bundle-list.1.txt +43 -0
  260. data/man/bundle-list.ronn +33 -0
  261. data/man/bundle-lock.1 +84 -0
  262. data/man/bundle-lock.1.txt +93 -0
  263. data/man/bundle-lock.ronn +94 -0
  264. data/man/bundle-open.1 +32 -0
  265. data/man/bundle-open.1.txt +29 -0
  266. data/man/bundle-open.ronn +19 -0
  267. data/man/bundle-outdated.1 +155 -0
  268. data/man/bundle-outdated.1.txt +131 -0
  269. data/man/bundle-outdated.ronn +111 -0
  270. data/man/bundle-package.1 +55 -0
  271. data/man/bundle-package.1.txt +79 -0
  272. data/man/bundle-package.ronn +14 -8
  273. data/man/bundle-platform.1 +61 -0
  274. data/man/bundle-platform.1.txt +57 -0
  275. data/man/bundle-platform.ronn +1 -1
  276. data/man/bundle-pristine.1 +34 -0
  277. data/man/bundle-pristine.1.txt +44 -0
  278. data/man/bundle-pristine.ronn +34 -0
  279. data/man/bundle-remove.1 +31 -0
  280. data/man/bundle-remove.1.txt +34 -0
  281. data/man/bundle-remove.ronn +23 -0
  282. data/man/bundle-show.1 +23 -0
  283. data/man/bundle-show.1.txt +27 -0
  284. data/man/bundle-show.ronn +21 -0
  285. data/man/bundle-update.1 +394 -0
  286. data/man/bundle-update.1.txt +391 -0
  287. data/man/bundle-update.ronn +180 -18
  288. data/man/bundle-viz.1 +39 -0
  289. data/man/bundle-viz.1.txt +39 -0
  290. data/man/bundle-viz.ronn +30 -0
  291. data/man/bundle.1 +136 -0
  292. data/man/bundle.1.txt +116 -0
  293. data/man/bundle.ronn +46 -33
  294. data/man/gemfile.5 +689 -0
  295. data/man/gemfile.5.ronn +127 -79
  296. data/man/gemfile.5.txt +653 -0
  297. data/man/index.txt +25 -7
  298. metadata +242 -95
  299. data/.gitignore +0 -16
  300. data/.rspec +0 -3
  301. data/.travis.yml +0 -110
  302. data/CODE_OF_CONDUCT.md +0 -40
  303. data/CONTRIBUTING.md +0 -32
  304. data/DEVELOPMENT.md +0 -119
  305. data/ISSUES.md +0 -96
  306. data/Rakefile +0 -302
  307. data/UPGRADING.md +0 -103
  308. data/bin/bundle +0 -21
  309. data/bin/bundler +0 -21
  310. data/lib/bundler/anonymizable_uri.rb +0 -32
  311. data/lib/bundler/environment.rb +0 -42
  312. data/lib/bundler/gem_installer.rb +0 -9
  313. data/lib/bundler/gem_path_manipulation.rb +0 -8
  314. data/lib/bundler/ssl_certs/AddTrustExternalCARoot.pem +0 -32
  315. data/lib/bundler/ssl_certs/Class3PublicPrimaryCertificationAuthority.pem +0 -14
  316. data/lib/bundler/ssl_certs/EntrustnetSecureServerCertificationAuthority.pem +0 -28
  317. data/lib/bundler/ssl_certs/GeoTrustGlobalCA.pem +0 -20
  318. data/lib/bundler/templates/newgem/.travis.yml.tt +0 -3
  319. data/lib/bundler/templates/newgem/test/minitest_helper.rb.tt +0 -4
  320. data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo.rb +0 -5
  321. data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/dependency_graph.rb +0 -266
  322. data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/errors.rb +0 -69
  323. data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/gem_metadata.rb +0 -3
  324. data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/resolution.rb +0 -412
  325. data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/state.rb +0 -43
  326. data/lib/bundler/vendor/thor-0.19.1/lib/thor/core_ext/io_binary_read.rb +0 -10
  327. data/lib/bundler/vendor/thor-0.19.1/lib/thor/core_ext/ordered_hash.rb +0 -98
  328. data/lib/bundler/vendor/thor-0.19.1/lib/thor/parser.rb +0 -4
@@ -1,16 +1,25 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Bundler
2
4
  # used for Creating Specifications from the Gemcutter Endpoint
3
5
  class EndpointSpecification < Gem::Specification
6
+ ILLFORMED_MESSAGE = 'Ill-formed requirement ["#<YAML::Syck::DefaultKey'.freeze
4
7
  include MatchPlatform
5
8
 
6
- attr_reader :name, :version, :platform, :dependencies
7
- attr_accessor :source, :source_uri
9
+ attr_reader :name, :version, :platform, :required_rubygems_version, :required_ruby_version, :checksum
10
+ attr_accessor :source, :remote, :dependencies
8
11
 
9
- def initialize(name, version, platform, dependencies)
12
+ def initialize(name, version, platform, dependencies, metadata = nil)
13
+ super()
10
14
  @name = name
11
- @version = version
15
+ @version = Gem::Version.create version
12
16
  @platform = platform
13
- @dependencies = dependencies
17
+ @dependencies = dependencies.map {|dep, reqs| build_dependency(dep, reqs) }
18
+
19
+ @loaded_from = nil
20
+ @remote_specification = nil
21
+
22
+ parse_metadata(metadata)
14
23
  end
15
24
 
16
25
  def fetch_platform
@@ -29,6 +38,16 @@ module Bundler
29
38
  end
30
39
  end
31
40
 
41
+ # needed for inline
42
+ def load_paths
43
+ # remote specs aren't installed, and can't have load_paths
44
+ if _local_specification
45
+ _local_specification.load_paths
46
+ else
47
+ super
48
+ end
49
+ end
50
+
32
51
  # needed for binstubs
33
52
  def executables
34
53
  if @remote_specification
@@ -57,20 +76,66 @@ module Bundler
57
76
  @remote_specification.post_install_message
58
77
  elsif _local_specification
59
78
  _local_specification.post_install_message
79
+ else
80
+ super
81
+ end
82
+ end
83
+
84
+ # needed for "with native extensions" during install
85
+ def extensions
86
+ if @remote_specification
87
+ @remote_specification.extensions
88
+ elsif _local_specification
89
+ _local_specification.extensions
90
+ else
91
+ super
60
92
  end
61
93
  end
62
94
 
63
95
  def _local_specification
64
- eval(File.read(local_specification_path)) if @loaded_from && File.exist?(local_specification_path)
96
+ return unless @loaded_from && File.exist?(local_specification_path)
97
+ eval(File.read(local_specification_path)).tap do |spec|
98
+ spec.loaded_from = @loaded_from
99
+ end
65
100
  end
66
101
 
67
102
  def __swap__(spec)
103
+ SharedHelpers.ensure_same_dependencies(self, dependencies, spec.dependencies)
68
104
  @remote_specification = spec
69
105
  end
70
106
 
71
- private
107
+ private
108
+
72
109
  def local_specification_path
73
110
  "#{base_dir}/specifications/#{full_name}.gemspec"
74
111
  end
112
+
113
+ def parse_metadata(data)
114
+ return unless data
115
+ data.each do |k, v|
116
+ next unless v
117
+ case k.to_s
118
+ when "checksum"
119
+ @checksum = v.last
120
+ when "rubygems"
121
+ @required_rubygems_version = Gem::Requirement.new(v)
122
+ when "ruby"
123
+ @required_ruby_version = Gem::Requirement.new(v)
124
+ end
125
+ end
126
+ rescue StandardError => e
127
+ raise GemspecError, "There was an error parsing the metadata for the gem #{name} (#{version}): #{e.class}\n#{e}\nThe metadata was #{data.inspect}"
128
+ end
129
+
130
+ def build_dependency(name, requirements)
131
+ Gem::Dependency.new(name, requirements)
132
+ rescue ArgumentError => e
133
+ raise unless e.message.include?(ILLFORMED_MESSAGE)
134
+ puts # we shouldn't print the error message on the "fetching info" status line
135
+ raise GemspecError,
136
+ "Unfortunately, the gem #{name} (#{version}) has an invalid " \
137
+ "gemspec.\nPlease ask the gem author to yank the bad version to fix " \
138
+ "this issue. For more information, see http://bit.ly/syck-defaultkey."
139
+ end
75
140
  end
76
141
  end
@@ -1,75 +1,155 @@
1
- require 'bundler/rubygems_integration'
2
- require 'bundler/source/git/git_proxy'
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/rubygems_integration"
4
+ require "bundler/source/git/git_proxy"
3
5
 
4
6
  module Bundler
5
7
  class Env
6
-
7
- def write(io)
8
- io.write report(:print_gemfile => 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
-
14
- out = "Environment\n\n"
15
- out << " Bundler #{Bundler::VERSION}\n"
16
- out << " Rubygems #{Gem::VERSION}\n"
17
- out << " Ruby #{ruby_version}"
18
- out << " GEM_HOME #{ENV['GEM_HOME']}\n" unless ENV['GEM_HOME'].nil? || ENV['GEM_HOME'].empty?
19
- out << " GEM_PATH #{ENV['GEM_PATH']}\n" unless ENV['GEM_PATH'] == ENV['GEM_HOME']
20
- out << " RVM #{ENV['rvm_version']}\n" if ENV['rvm_version']
21
- out << " Git #{git_version}\n"
22
- %w(rubygems-bundler open_gem).each do |name|
23
- specs = Bundler.rubygems.find_name(name)
24
- out << " #{name} (#{specs.map(&:version).join(',')})\n" unless specs.empty?
25
- end
12
+ def self.report(options = {})
13
+ print_gemfile = options.delete(:print_gemfile) { true }
14
+ print_gemspecs = options.delete(:print_gemspecs) { true }
26
15
 
27
- out << "\nBundler settings\n\n" unless Bundler.settings.all.empty?
28
- Bundler.settings.all.each do |setting|
29
- out << " " << setting << "\n"
30
- Bundler.settings.pretty_values_for(setting).each do |line|
31
- out << " " << line << "\n"
16
+ out = String.new
17
+ append_formatted_table("Environment", environment, out)
18
+ append_formatted_table("Bundler Build Metadata", BuildMetadata.to_h, out)
19
+
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
32
27
  end
28
+ out << "```\n"
33
29
  end
34
30
 
31
+ return out unless SharedHelpers.in_bundle?
32
+
35
33
  if print_gemfile
36
- out << "\nGemfile\n\n"
37
- 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
46
+
47
+ out << "\n### #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}\n\n"
48
+ out << "```\n" << read_file(Bundler.default_lockfile).chomp << "\n```\n"
49
+ end
38
50
 
39
- out << "\n" << "Gemfile.lock\n\n"
40
- out << " " << read_file(Bundler.default_lockfile).gsub(/\n/, "\n ") << "\n"
51
+ if print_gemspecs
52
+ dsl = Dsl.new.tap {|d| d.eval_gemfile(Bundler.default_gemfile) }
53
+ out << "\n## Gemspecs\n" unless dsl.gemspecs.empty?
54
+ dsl.gemspecs.each do |gs|
55
+ out << "\n### #{File.basename(gs.loaded_from)}"
56
+ out << "\n\n```ruby\n" << read_file(gs.loaded_from).chomp << "\n```\n"
57
+ end
41
58
  end
42
59
 
43
60
  out
44
61
  end
45
62
 
46
- private
47
-
48
- def read_file(filename)
49
- File.read(filename.to_s).strip
63
+ def self.read_file(filename)
64
+ Bundler.read_file(filename.to_s).strip
50
65
  rescue Errno::ENOENT
51
66
  "<No #{filename} found>"
52
- rescue => e
67
+ rescue RuntimeError => e
53
68
  "#{e.class}: #{e.message}"
54
69
  end
55
70
 
56
- def ruby_version
57
- str = "#{RUBY_VERSION}"
58
- if RUBY_VERSION < '1.9'
71
+ def self.ruby_version
72
+ str = String.new("#{RUBY_VERSION}")
73
+ if RUBY_VERSION < "1.9"
59
74
  str << " (#{RUBY_RELEASE_DATE}"
60
75
  str << " patchlevel #{RUBY_PATCHLEVEL}" if defined? RUBY_PATCHLEVEL
61
- str << ") [#{RUBY_PLATFORM}]\n"
76
+ str << ") [#{RUBY_PLATFORM}]"
62
77
  else
63
78
  str << "p#{RUBY_PATCHLEVEL}" if defined? RUBY_PATCHLEVEL
64
- str << " (#{RUBY_RELEASE_DATE} revision #{RUBY_REVISION}) [#{RUBY_PLATFORM}]\n"
79
+ str << " (#{RUBY_RELEASE_DATE} revision #{RUBY_REVISION}) [#{RUBY_PLATFORM}]"
65
80
  end
66
81
  end
67
82
 
68
- def git_version
69
- Bundler::Source::Git::GitProxy.new(nil, nil, nil).version
83
+ def self.git_version
84
+ Bundler::Source::Git::GitProxy.new(nil, nil, nil).full_version
70
85
  rescue Bundler::Source::Git::GitNotInstalledError
71
86
  "not installed"
72
87
  end
73
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
74
154
  end
75
155
  end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
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
+
21
+ # @param env [ENV]
22
+ # @param keys [Array<String>]
23
+ def initialize(env, keys)
24
+ @original = env.to_hash
25
+ @keys = keys
26
+ @prefix = BUNDLER_PREFIX
27
+ end
28
+
29
+ # @return [Hash]
30
+ def backup
31
+ env = @original.clone
32
+ @keys.each do |key|
33
+ value = env[key]
34
+ if !value.nil? && !value.empty?
35
+ env[@prefix + key] ||= value
36
+ elsif value.nil?
37
+ env[@prefix + key] ||= INTENTIONALLY_NIL
38
+ end
39
+ end
40
+ env
41
+ end
42
+
43
+ # @return [Hash]
44
+ def restore
45
+ env = @original.clone
46
+ @keys.each do |key|
47
+ value_original = env[@prefix + key]
48
+ next if value_original.nil? || value_original.empty?
49
+ if value_original == INTENTIONALLY_NIL
50
+ env.delete(key)
51
+ else
52
+ env[key] = value_original
53
+ end
54
+ env.delete(@prefix + key)
55
+ end
56
+ env
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,158 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class BundlerError < StandardError
5
+ def self.status_code(code)
6
+ define_method(:status_code) { code }
7
+ if match = BundlerError.all_errors.find {|_k, v| v == code }
8
+ error, _ = match
9
+ raise ArgumentError,
10
+ "Trying to register #{self} for status code #{code} but #{error} is already registered"
11
+ end
12
+ BundlerError.all_errors[self] = code
13
+ end
14
+
15
+ def self.all_errors
16
+ @all_errors ||= {}
17
+ end
18
+ end
19
+
20
+ class GemfileError < BundlerError; status_code(4); end
21
+ class InstallError < BundlerError; status_code(5); end
22
+
23
+ # Internal error, should be rescued
24
+ class VersionConflict < BundlerError
25
+ attr_reader :conflicts
26
+
27
+ def initialize(conflicts, msg = nil)
28
+ super(msg)
29
+ @conflicts = conflicts
30
+ end
31
+
32
+ status_code(6)
33
+ end
34
+
35
+ class GemNotFound < BundlerError; status_code(7); end
36
+ class InstallHookError < BundlerError; status_code(8); end
37
+ class GemfileNotFound < BundlerError; status_code(10); end
38
+ class GitError < BundlerError; status_code(11); end
39
+ class DeprecatedError < BundlerError; status_code(12); end
40
+ class PathError < BundlerError; status_code(13); end
41
+ class GemspecError < BundlerError; status_code(14); end
42
+ class InvalidOption < BundlerError; status_code(15); end
43
+ class ProductionError < BundlerError; status_code(16); end
44
+ class HTTPError < BundlerError
45
+ status_code(17)
46
+ def filter_uri(uri)
47
+ URICredentialsFilter.credential_filtered_uri(uri)
48
+ end
49
+ end
50
+ class RubyVersionMismatch < BundlerError; status_code(18); end
51
+ class SecurityError < BundlerError; status_code(19); end
52
+ class LockfileError < BundlerError; status_code(20); end
53
+ class CyclicDependencyError < BundlerError; status_code(21); end
54
+ class GemfileLockNotFound < BundlerError; status_code(22); end
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
59
+ class GemfileEvalError < GemfileError; end
60
+ class MarshalError < StandardError; end
61
+
62
+ class PermissionError < BundlerError
63
+ def initialize(path, permission_type = :write)
64
+ @path = path
65
+ @permission_type = permission_type
66
+ end
67
+
68
+ def action
69
+ case @permission_type
70
+ when :read then "read from"
71
+ when :write then "write to"
72
+ when :executable, :exec then "execute"
73
+ else @permission_type.to_s
74
+ end
75
+ end
76
+
77
+ def message
78
+ "There was an error while trying to #{action} `#{@path}`. " \
79
+ "It is likely that you need to grant #{@permission_type} permissions " \
80
+ "for that path."
81
+ end
82
+
83
+ status_code(23)
84
+ end
85
+
86
+ class GemRequireError < BundlerError
87
+ attr_reader :orig_exception
88
+
89
+ def initialize(orig_exception, msg)
90
+ full_message = msg + "\nGem Load Error is: #{orig_exception.message}\n"\
91
+ "Backtrace for gem load error is:\n"\
92
+ "#{orig_exception.backtrace.join("\n")}\n"\
93
+ "Bundler Error Backtrace:\n"
94
+ super(full_message)
95
+ @orig_exception = orig_exception
96
+ end
97
+
98
+ status_code(24)
99
+ end
100
+
101
+ class YamlSyntaxError < BundlerError
102
+ attr_reader :orig_exception
103
+
104
+ def initialize(orig_exception, msg)
105
+ super(msg)
106
+ @orig_exception = orig_exception
107
+ end
108
+
109
+ status_code(25)
110
+ end
111
+
112
+ class TemporaryResourceError < PermissionError
113
+ def message
114
+ "There was an error while trying to #{action} `#{@path}`. " \
115
+ "Some resource was temporarily unavailable. It's suggested that you try" \
116
+ "the operation again."
117
+ end
118
+
119
+ status_code(26)
120
+ end
121
+
122
+ class VirtualProtocolError < BundlerError
123
+ def message
124
+ "There was an error relating to virtualization and file access." \
125
+ "It is likely that you need to grant access to or mount some file system correctly."
126
+ end
127
+
128
+ status_code(27)
129
+ end
130
+
131
+ class OperationNotSupportedError < PermissionError
132
+ def message
133
+ "Attempting to #{action} `#{@path}` is unsupported by your OS."
134
+ end
135
+
136
+ status_code(28)
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
158
+ end