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,5 +1,7 @@
1
- require 'bundler/vendored_thor' unless defined?(Thor)
2
- require 'bundler'
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/vendored_thor" unless defined?(Thor)
4
+ require "bundler"
3
5
 
4
6
  module Bundler
5
7
  class GemHelper
@@ -35,30 +37,35 @@ module Bundler
35
37
  built_gem_path = nil
36
38
 
37
39
  desc "Build #{name}-#{version}.gem into the pkg directory."
38
- task 'build' do
40
+ task "build" do
39
41
  built_gem_path = build_gem
40
42
  end
41
43
 
42
44
  desc "Build and install #{name}-#{version}.gem into system gems."
43
- task 'install' => 'build' do
45
+ task "install" => "build" do
44
46
  install_gem(built_gem_path)
45
47
  end
46
48
 
47
- desc "Create tag #{version_tag} and build and push #{name}-#{version}.gem to Rubygems\n" \
48
- "To prevent publishing in Rubygems use `gem_push=no rake release`"
49
- task 'release' => ['build', 'release:guard_clean',
50
- 'release:source_control_push', 'release:rubygem_push'] do
49
+ desc "Build and install #{name}-#{version}.gem into system gems without network access."
50
+ task "install:local" => "build" do
51
+ install_gem(built_gem_path, :local)
52
+ end
53
+
54
+ desc "Create tag #{version_tag} and build and push #{name}-#{version}.gem to #{gem_push_host}\n" \
55
+ "To prevent publishing in RubyGems use `gem_push=no rake release`"
56
+ task "release", [:remote] => ["build", "release:guard_clean",
57
+ "release:source_control_push", "release:rubygem_push"] do
51
58
  end
52
59
 
53
- task 'release:guard_clean' do
60
+ task "release:guard_clean" do
54
61
  guard_clean
55
62
  end
56
63
 
57
- task 'release:source_control_push' do
58
- tag_version { git_push } unless already_tagged?
64
+ task "release:source_control_push", [:remote] do |_, args|
65
+ tag_version { git_push(args[:remote]) } unless already_tagged?
59
66
  end
60
67
 
61
- task 'release:rubygem_push' do
68
+ task "release:rubygem_push" do
62
69
  rubygem_push(built_gem_path) if gem_push?
63
70
  end
64
71
 
@@ -67,57 +74,71 @@ module Bundler
67
74
 
68
75
  def build_gem
69
76
  file_name = nil
70
- sh("gem build -V '#{spec_path}'") { |out, code|
77
+ sh("gem build -V '#{spec_path}'") do
71
78
  file_name = File.basename(built_gem_path)
72
- FileUtils.mkdir_p(File.join(base, 'pkg'))
73
- FileUtils.mv(built_gem_path, 'pkg')
79
+ SharedHelpers.filesystem_access(File.join(base, "pkg")) {|p| FileUtils.mkdir_p(p) }
80
+ FileUtils.mv(built_gem_path, "pkg")
74
81
  Bundler.ui.confirm "#{name} #{version} built to pkg/#{file_name}."
75
- }
76
- File.join(base, 'pkg', file_name)
82
+ end
83
+ File.join(base, "pkg", file_name)
77
84
  end
78
85
 
79
- def install_gem(built_gem_path=nil)
86
+ def install_gem(built_gem_path = nil, local = false)
80
87
  built_gem_path ||= build_gem
81
- out, _ = sh_with_code("gem install '#{built_gem_path}' --local")
88
+ out, _ = sh_with_code("gem install '#{built_gem_path}'#{" --local" if local}")
82
89
  raise "Couldn't install gem, run `gem install #{built_gem_path}' for more detailed output" unless out[/Successfully installed/]
83
90
  Bundler.ui.confirm "#{name} (#{version}) installed."
84
91
  end
85
92
 
86
- protected
93
+ protected
94
+
87
95
  def rubygem_push(path)
88
- if Pathname.new("~/.gem/credentials").expand_path.exist?
89
- sh("gem push '#{path}'")
90
- Bundler.ui.confirm "Pushed #{name} #{version} to rubygems.org."
91
- else
96
+ gem_command = "gem push '#{path}'"
97
+ gem_command += " --key #{gem_key}" if gem_key
98
+ gem_command += " --host #{allowed_push_host}" if allowed_push_host
99
+ unless allowed_push_host || Bundler.user_home.join(".gem/credentials").file?
92
100
  raise "Your rubygems.org credentials aren't set. Run `gem push` to set them."
93
101
  end
102
+ sh(gem_command)
103
+ Bundler.ui.confirm "Pushed #{name} #{version} to #{gem_push_host}"
94
104
  end
95
105
 
96
106
  def built_gem_path
97
- Dir[File.join(base, "#{name}-*.gem")].sort_by{|f| File.mtime(f)}.last
107
+ Dir[File.join(base, "#{name}-*.gem")].sort_by {|f| File.mtime(f) }.last
98
108
  end
99
109
 
100
- def git_push
101
- perform_git_push
102
- perform_git_push ' --tags'
110
+ def git_push(remote = "")
111
+ perform_git_push remote
112
+ perform_git_push "#{remote} --tags"
103
113
  Bundler.ui.confirm "Pushed git commits and tags."
104
114
  end
105
115
 
106
- def perform_git_push(options = '')
116
+ def allowed_push_host
117
+ @gemspec.metadata["allowed_push_host"] if @gemspec.respond_to?(:metadata)
118
+ end
119
+
120
+ def gem_push_host
121
+ env_rubygems_host = ENV["RUBYGEMS_HOST"]
122
+ env_rubygems_host = nil if
123
+ env_rubygems_host && env_rubygems_host.empty?
124
+
125
+ allowed_push_host || env_rubygems_host || "rubygems.org"
126
+ end
127
+
128
+ def perform_git_push(options = "")
107
129
  cmd = "git push #{options}"
108
130
  out, code = sh_with_code(cmd)
109
131
  raise "Couldn't git push. `#{cmd}' failed with the following output:\n\n#{out}\n" unless code == 0
110
132
  end
111
133
 
112
134
  def already_tagged?
113
- if sh('git tag').split(/\n/).include?(version_tag)
114
- Bundler.ui.confirm "Tag #{version_tag} has already been created."
115
- true
116
- end
135
+ return false unless sh("git tag").split(/\n/).include?(version_tag)
136
+ Bundler.ui.confirm "Tag #{version_tag} has already been created."
137
+ true
117
138
  end
118
139
 
119
140
  def guard_clean
120
- clean? && committed? or raise("There are files that need to be committed first.")
141
+ clean? && committed? || raise("There are files that need to be committed first.")
121
142
  end
122
143
 
123
144
  def clean?
@@ -129,10 +150,10 @@ module Bundler
129
150
  end
130
151
 
131
152
  def tag_version
132
- sh "git tag -a -m \"Version #{version}\" #{version_tag}"
153
+ sh "git tag -m \"Version #{version}\" #{version_tag}"
133
154
  Bundler.ui.confirm "Tagged #{version_tag}."
134
155
  yield if block_given?
135
- rescue
156
+ rescue RuntimeError
136
157
  Bundler.ui.error "Untagging #{version_tag} due to error."
137
158
  sh_with_code "git tag -d #{version_tag}"
138
159
  raise
@@ -152,24 +173,30 @@ module Bundler
152
173
 
153
174
  def sh(cmd, &block)
154
175
  out, code = sh_with_code(cmd, &block)
155
- code == 0 ? out : raise(out.empty? ? "Running `#{cmd}' failed. Run this command directly for more detailed output." : out)
176
+ unless code.zero?
177
+ raise(out.empty? ? "Running `#{cmd}` failed. Run this command directly for more detailed output." : out)
178
+ end
179
+ out
156
180
  end
157
181
 
158
182
  def sh_with_code(cmd, &block)
159
- cmd << " 2>&1"
160
- outbuf = ''
183
+ cmd += " 2>&1"
184
+ outbuf = String.new
161
185
  Bundler.ui.debug(cmd)
162
- SharedHelpers.chdir(base) {
186
+ SharedHelpers.chdir(base) do
163
187
  outbuf = `#{cmd}`
164
- if $? == 0
165
- block.call(outbuf) if block
166
- end
167
- }
168
- [outbuf, $?]
188
+ status = $?.exitstatus
189
+ block.call(outbuf) if status.zero? && block
190
+ [outbuf, status]
191
+ end
192
+ end
193
+
194
+ def gem_key
195
+ Bundler.settings["gem.push_key"].to_s.downcase if Bundler.settings["gem.push_key"]
169
196
  end
170
197
 
171
198
  def gem_push?
172
- ! %w{n no nil false off 0}.include?(ENV['gem_push'].to_s.downcase)
199
+ !%w[n no nil false off 0].include?(ENV["gem_push"].to_s.downcase)
173
200
  end
174
201
  end
175
202
  end
@@ -1,15 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Bundler
2
4
  module GemHelpers
3
-
4
- GENERIC_CACHE = {}
5
+ GENERIC_CACHE = {} # rubocop:disable MutableConstant
5
6
  GENERICS = [
6
- [Gem::Platform.new('java'), Gem::Platform.new('java')],
7
- [Gem::Platform.new('mswin32'), Gem::Platform.new('mswin32')],
8
- [Gem::Platform.new('mswin64'), Gem::Platform.new('mswin64')],
9
- [Gem::Platform.new('x64-mingw32'), Gem::Platform.new('x64-mingw32')],
10
- [Gem::Platform.new('x86_64-mingw32'), Gem::Platform.new('x64-mingw32')],
11
- [Gem::Platform.new('mingw32'), Gem::Platform.new('x86-mingw32')]
12
- ]
7
+ [Gem::Platform.new("java"), Gem::Platform.new("java")],
8
+ [Gem::Platform.new("mswin32"), Gem::Platform.new("mswin32")],
9
+ [Gem::Platform.new("mswin64"), Gem::Platform.new("mswin64")],
10
+ [Gem::Platform.new("universal-mingw32"), Gem::Platform.new("universal-mingw32")],
11
+ [Gem::Platform.new("x64-mingw32"), Gem::Platform.new("x64-mingw32")],
12
+ [Gem::Platform.new("x86_64-mingw32"), Gem::Platform.new("x64-mingw32")],
13
+ [Gem::Platform.new("mingw32"), Gem::Platform.new("x86-mingw32")]
14
+ ].freeze
13
15
 
14
16
  def generic(p)
15
17
  return p if p == Gem::Platform::RUBY
@@ -21,5 +23,79 @@ module Bundler
21
23
  found || Gem::Platform::RUBY
22
24
  end
23
25
  end
26
+ module_function :generic
27
+
28
+ def generic_local_platform
29
+ generic(Bundler.local_platform)
30
+ end
31
+ module_function :generic_local_platform
32
+
33
+ def platform_specificity_match(spec_platform, user_platform)
34
+ spec_platform = Gem::Platform.new(spec_platform)
35
+ return PlatformMatch::EXACT_MATCH if spec_platform == user_platform
36
+ return PlatformMatch::WORST_MATCH if spec_platform.nil? || spec_platform == Gem::Platform::RUBY || user_platform == Gem::Platform::RUBY
37
+
38
+ PlatformMatch.new(
39
+ PlatformMatch.os_match(spec_platform, user_platform),
40
+ PlatformMatch.cpu_match(spec_platform, user_platform),
41
+ PlatformMatch.platform_version_match(spec_platform, user_platform)
42
+ )
43
+ end
44
+ module_function :platform_specificity_match
45
+
46
+ def select_best_platform_match(specs, platform)
47
+ specs.select {|spec| spec.match_platform(platform) }.
48
+ min_by {|spec| platform_specificity_match(spec.platform, platform) }
49
+ end
50
+ module_function :select_best_platform_match
51
+
52
+ PlatformMatch = Struct.new(:os_match, :cpu_match, :platform_version_match)
53
+ class PlatformMatch
54
+ def <=>(other)
55
+ return nil unless other.is_a?(PlatformMatch)
56
+
57
+ m = os_match <=> other.os_match
58
+ return m unless m.zero?
59
+
60
+ m = cpu_match <=> other.cpu_match
61
+ return m unless m.zero?
62
+
63
+ m = platform_version_match <=> other.platform_version_match
64
+ m
65
+ end
66
+
67
+ EXACT_MATCH = new(-1, -1, -1).freeze
68
+ WORST_MATCH = new(1_000_000, 1_000_000, 1_000_000).freeze
69
+
70
+ def self.os_match(spec_platform, user_platform)
71
+ if spec_platform.os == user_platform.os
72
+ 0
73
+ else
74
+ 1
75
+ end
76
+ end
77
+
78
+ def self.cpu_match(spec_platform, user_platform)
79
+ if spec_platform.cpu == user_platform.cpu
80
+ 0
81
+ elsif spec_platform.cpu == "arm" && user_platform.cpu.to_s.start_with?("arm")
82
+ 0
83
+ elsif spec_platform.cpu.nil? || spec_platform.cpu == "universal"
84
+ 1
85
+ else
86
+ 2
87
+ end
88
+ end
89
+
90
+ def self.platform_version_match(spec_platform, user_platform)
91
+ if spec_platform.version == user_platform.version
92
+ 0
93
+ elsif spec_platform.version.nil?
94
+ 1
95
+ else
96
+ 2
97
+ end
98
+ end
99
+ end
24
100
  end
25
101
  end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rubygems/remote_fetcher"
4
+
5
+ module Bundler
6
+ # Adds support for setting custom HTTP headers when fetching gems from the
7
+ # server.
8
+ #
9
+ # TODO: Get rid of this when and if gemstash only supports RubyGems versions
10
+ # that contain https://github.com/rubygems/rubygems/commit/3db265cc20b2f813.
11
+ class GemRemoteFetcher < Gem::RemoteFetcher
12
+ attr_accessor :headers
13
+
14
+ # Extracted from RubyGems 2.4.
15
+ def fetch_http(uri, last_modified = nil, head = false, depth = 0)
16
+ fetch_type = head ? Net::HTTP::Head : Net::HTTP::Get
17
+ # beginning of change
18
+ response = request uri, fetch_type, last_modified do |req|
19
+ headers.each {|k, v| req.add_field(k, v) } if headers
20
+ end
21
+ # end of change
22
+
23
+ case response
24
+ when Net::HTTPOK, Net::HTTPNotModified then
25
+ response.uri = uri if response.respond_to? :uri
26
+ head ? response : response.body
27
+ when Net::HTTPMovedPermanently, Net::HTTPFound, Net::HTTPSeeOther,
28
+ Net::HTTPTemporaryRedirect then
29
+ raise FetchError.new("too many redirects", uri) if depth > 10
30
+
31
+ location = URI.parse response["Location"]
32
+
33
+ if https?(uri) && !https?(location)
34
+ raise FetchError.new("redirecting to non-https resource: #{location}", uri)
35
+ end
36
+
37
+ fetch_http(location, last_modified, head, depth + 1)
38
+ else
39
+ raise FetchError.new("bad response #{response.message} #{response.code}", uri)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,2 +1,7 @@
1
- require 'bundler/gem_helper'
1
+ # frozen_string_literal: true
2
+
3
+ require "rake/clean"
4
+ CLOBBER.include "pkg"
5
+
6
+ require "bundler/gem_helper"
2
7
  Bundler::GemHelper.install_tasks
@@ -0,0 +1,190 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ # This class contains all of the logic for determining the next version of a
5
+ # Gem to update to based on the requested level (patch, minor, major).
6
+ # Primarily designed to work with Resolver which will provide it the list of
7
+ # available dependency versions as found in its index, before returning it to
8
+ # to the resolution engine to select the best version.
9
+ class GemVersionPromoter
10
+ DEBUG = ENV["DEBUG_RESOLVER"]
11
+
12
+ attr_reader :level, :locked_specs, :unlock_gems
13
+
14
+ # By default, strict is false, meaning every available version of a gem
15
+ # is returned from sort_versions. The order gives preference to the
16
+ # requested level (:patch, :minor, :major) but in complicated requirement
17
+ # cases some gems will by necessity by promoted past the requested level,
18
+ # or even reverted to older versions.
19
+ #
20
+ # If strict is set to true, the results from sort_versions will be
21
+ # truncated, eliminating any version outside the current level scope.
22
+ # This can lead to unexpected outcomes or even VersionConflict exceptions
23
+ # that report a version of a gem not existing for versions that indeed do
24
+ # existing in the referenced source.
25
+ attr_accessor :strict
26
+
27
+ attr_accessor :prerelease_specified
28
+
29
+ # Given a list of locked_specs and a list of gems to unlock creates a
30
+ # GemVersionPromoter instance.
31
+ #
32
+ # @param locked_specs [SpecSet] All current locked specs. Unlike Definition
33
+ # where this list is empty if all gems are being updated, this should
34
+ # always be populated for all gems so this class can properly function.
35
+ # @param unlock_gems [String] List of gem names being unlocked. If empty,
36
+ # all gems will be considered unlocked.
37
+ # @return [GemVersionPromoter]
38
+ def initialize(locked_specs = SpecSet.new([]), unlock_gems = [])
39
+ @level = :major
40
+ @strict = false
41
+ @locked_specs = locked_specs
42
+ @unlock_gems = unlock_gems
43
+ @sort_versions = {}
44
+ @prerelease_specified = {}
45
+ end
46
+
47
+ # @param value [Symbol] One of three Symbols: :major, :minor or :patch.
48
+ def level=(value)
49
+ v = case value
50
+ when String, Symbol
51
+ value.to_sym
52
+ end
53
+
54
+ raise ArgumentError, "Unexpected level #{v}. Must be :major, :minor or :patch" unless [:major, :minor, :patch].include?(v)
55
+ @level = v
56
+ end
57
+
58
+ # Given a Dependency and an Array of SpecGroups of available versions for a
59
+ # gem, this method will return the Array of SpecGroups sorted (and possibly
60
+ # truncated if strict is true) in an order to give preference to the current
61
+ # level (:major, :minor or :patch) when resolution is deciding what versions
62
+ # best resolve all dependencies in the bundle.
63
+ # @param dep [Dependency] The Dependency of the gem.
64
+ # @param spec_groups [SpecGroup] An array of SpecGroups for the same gem
65
+ # named in the @dep param.
66
+ # @return [SpecGroup] A new instance of the SpecGroup Array sorted and
67
+ # possibly filtered.
68
+ def sort_versions(dep, spec_groups)
69
+ before_result = "before sort_versions: #{debug_format_result(dep, spec_groups).inspect}" if DEBUG
70
+
71
+ @sort_versions[dep] ||= begin
72
+ gem_name = dep.name
73
+
74
+ # An Array per version returned, different entries for different platforms.
75
+ # We only need the version here so it's ok to hard code this to the first instance.
76
+ locked_spec = locked_specs[gem_name].first
77
+
78
+ if strict
79
+ filter_dep_specs(spec_groups, locked_spec)
80
+ else
81
+ sort_dep_specs(spec_groups, locked_spec)
82
+ end.tap do |specs|
83
+ if DEBUG
84
+ STDERR.puts before_result
85
+ STDERR.puts " after sort_versions: #{debug_format_result(dep, specs).inspect}"
86
+ end
87
+ end
88
+ end
89
+ end
90
+
91
+ # @return [bool] Convenience method for testing value of level variable.
92
+ def major?
93
+ level == :major
94
+ end
95
+
96
+ # @return [bool] Convenience method for testing value of level variable.
97
+ def minor?
98
+ level == :minor
99
+ end
100
+
101
+ private
102
+
103
+ def filter_dep_specs(spec_groups, locked_spec)
104
+ res = spec_groups.select do |spec_group|
105
+ if locked_spec && !major?
106
+ gsv = spec_group.version
107
+ lsv = locked_spec.version
108
+
109
+ must_match = minor? ? [0] : [0, 1]
110
+
111
+ matches = must_match.map {|idx| gsv.segments[idx] == lsv.segments[idx] }
112
+ (matches.uniq == [true]) ? (gsv >= lsv) : false
113
+ else
114
+ true
115
+ end
116
+ end
117
+
118
+ sort_dep_specs(res, locked_spec)
119
+ end
120
+
121
+ def sort_dep_specs(spec_groups, locked_spec)
122
+ return spec_groups unless locked_spec
123
+ @gem_name = locked_spec.name
124
+ @locked_version = locked_spec.version
125
+
126
+ result = spec_groups.sort do |a, b|
127
+ @a_ver = a.version
128
+ @b_ver = b.version
129
+
130
+ unless @prerelease_specified[@gem_name]
131
+ a_pre = @a_ver.prerelease?
132
+ b_pre = @b_ver.prerelease?
133
+
134
+ next -1 if a_pre && !b_pre
135
+ next 1 if b_pre && !a_pre
136
+ end
137
+
138
+ if major?
139
+ @a_ver <=> @b_ver
140
+ elsif either_version_older_than_locked
141
+ @a_ver <=> @b_ver
142
+ elsif segments_do_not_match(:major)
143
+ @b_ver <=> @a_ver
144
+ elsif !minor? && segments_do_not_match(:minor)
145
+ @b_ver <=> @a_ver
146
+ else
147
+ @a_ver <=> @b_ver
148
+ end
149
+ end
150
+ post_sort(result)
151
+ end
152
+
153
+ def either_version_older_than_locked
154
+ @a_ver < @locked_version || @b_ver < @locked_version
155
+ end
156
+
157
+ def segments_do_not_match(level)
158
+ index = [:major, :minor].index(level)
159
+ @a_ver.segments[index] != @b_ver.segments[index]
160
+ end
161
+
162
+ def unlocking_gem?
163
+ unlock_gems.empty? || unlock_gems.include?(@gem_name)
164
+ end
165
+
166
+ # Specific version moves can't always reliably be done during sorting
167
+ # as not all elements are compared against each other.
168
+ def post_sort(result)
169
+ # default :major behavior in Bundler does not do this
170
+ return result if major?
171
+ if unlocking_gem?
172
+ result
173
+ else
174
+ move_version_to_end(result, @locked_version)
175
+ end
176
+ end
177
+
178
+ def move_version_to_end(result, version)
179
+ move, keep = result.partition {|s| s.version.to_s == version.to_s }
180
+ keep.concat(move)
181
+ end
182
+
183
+ def debug_format_result(dep, spec_groups)
184
+ a = [dep.to_s,
185
+ spec_groups.map {|sg| [sg.version, sg.dependencies_for_activated_platforms.map {|dp| [dp.name, dp.requirement.to_s] }] }]
186
+ last_map = a.last.map {|sg_data| [sg_data.first.version, sg_data.last.map {|aa| aa.join(" ") }] }
187
+ [a.first, last_map, level, strict ? :strict : :not_strict]
188
+ end
189
+ end
190
+ end