rubygems-update 2.6.11 → 2.7.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (405) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +8 -22
  3. data/CONTRIBUTING.rdoc +53 -54
  4. data/History.txt +405 -0
  5. data/Manifest.txt +46 -15
  6. data/POLICIES.rdoc +3 -3
  7. data/README.md +72 -0
  8. data/Rakefile +55 -12
  9. data/appveyor.yml +29 -1
  10. data/bin/gem +1 -1
  11. data/bin/update_rubygems +2 -2
  12. data/bundler/CHANGELOG.md +412 -9
  13. data/bundler/CODE_OF_CONDUCT.md +1 -1
  14. data/bundler/CONTRIBUTING.md +10 -29
  15. data/bundler/README.md +27 -11
  16. data/bundler/bundler.gemspec +58 -0
  17. data/bundler/exe/bundle +5 -7
  18. data/bundler/exe/bundle_ruby +4 -3
  19. data/bundler/lib/bundler.rb +103 -79
  20. data/bundler/lib/bundler/build_metadata.rb +53 -0
  21. data/bundler/lib/bundler/capistrano.rb +5 -0
  22. data/bundler/lib/bundler/cli.rb +231 -66
  23. data/bundler/lib/bundler/cli/add.rb +25 -0
  24. data/bundler/lib/bundler/cli/binstubs.rb +9 -7
  25. data/bundler/lib/bundler/cli/cache.rb +5 -4
  26. data/bundler/lib/bundler/cli/check.rb +3 -5
  27. data/bundler/lib/bundler/cli/clean.rb +5 -6
  28. data/bundler/lib/bundler/cli/common.rb +18 -2
  29. data/bundler/lib/bundler/cli/config.rb +26 -7
  30. data/bundler/lib/bundler/cli/console.rb +2 -1
  31. data/bundler/lib/bundler/cli/doctor.rb +1 -0
  32. data/bundler/lib/bundler/cli/exec.rb +6 -5
  33. data/bundler/lib/bundler/cli/gem.rb +42 -18
  34. data/bundler/lib/bundler/cli/info.rb +50 -0
  35. data/bundler/lib/bundler/cli/init.rb +21 -7
  36. data/bundler/lib/bundler/cli/inject.rb +13 -4
  37. data/bundler/lib/bundler/cli/install.rb +61 -77
  38. data/bundler/lib/bundler/cli/issue.rb +40 -0
  39. data/bundler/lib/bundler/cli/list.rb +22 -0
  40. data/bundler/lib/bundler/cli/lock.rb +4 -2
  41. data/bundler/lib/bundler/cli/open.rb +2 -2
  42. data/bundler/lib/bundler/cli/outdated.rb +30 -28
  43. data/bundler/lib/bundler/cli/package.rb +9 -6
  44. data/bundler/lib/bundler/cli/platform.rb +1 -0
  45. data/bundler/lib/bundler/cli/plugin.rb +1 -0
  46. data/bundler/lib/bundler/cli/pristine.rb +43 -0
  47. data/bundler/lib/bundler/cli/show.rb +1 -1
  48. data/bundler/lib/bundler/cli/update.rb +36 -13
  49. data/bundler/lib/bundler/cli/viz.rb +5 -1
  50. data/bundler/lib/bundler/compact_index_client.rb +1 -0
  51. data/bundler/lib/bundler/compact_index_client/cache.rb +1 -2
  52. data/bundler/lib/bundler/compact_index_client/updater.rb +36 -8
  53. data/bundler/lib/bundler/compatibility_guard.rb +14 -0
  54. data/bundler/lib/bundler/constants.rb +1 -0
  55. data/bundler/lib/bundler/current_ruby.rb +16 -8
  56. data/bundler/lib/bundler/definition.rb +252 -170
  57. data/bundler/lib/bundler/dep_proxy.rb +3 -1
  58. data/bundler/lib/bundler/dependency.rb +7 -7
  59. data/bundler/lib/bundler/deployment.rb +1 -1
  60. data/bundler/lib/bundler/deprecate.rb +15 -3
  61. data/bundler/lib/bundler/dsl.rb +103 -62
  62. data/bundler/lib/bundler/endpoint_specification.rb +13 -3
  63. data/bundler/lib/bundler/env.rb +101 -38
  64. data/bundler/lib/bundler/environment_preserver.rb +27 -6
  65. data/bundler/lib/bundler/errors.rb +3 -1
  66. data/bundler/lib/bundler/feature_flag.rb +39 -4
  67. data/bundler/lib/bundler/fetcher.rb +18 -11
  68. data/bundler/lib/bundler/fetcher/base.rb +1 -0
  69. data/bundler/lib/bundler/fetcher/compact_index.rb +2 -12
  70. data/bundler/lib/bundler/fetcher/dependency.rb +2 -1
  71. data/bundler/lib/bundler/fetcher/downloader.rb +14 -7
  72. data/bundler/lib/bundler/fetcher/index.rb +3 -2
  73. data/bundler/lib/bundler/friendly_errors.rb +7 -2
  74. data/bundler/lib/bundler/gem_helper.rb +24 -10
  75. data/bundler/lib/bundler/gem_helpers.rb +1 -0
  76. data/bundler/lib/bundler/gem_remote_fetcher.rb +1 -0
  77. data/bundler/lib/bundler/gem_tasks.rb +1 -0
  78. data/bundler/lib/bundler/gem_version_promoter.rb +13 -0
  79. data/bundler/lib/bundler/gemdeps.rb +1 -0
  80. data/bundler/lib/bundler/graph.rb +1 -0
  81. data/bundler/lib/bundler/index.rb +19 -11
  82. data/bundler/lib/bundler/injector.rb +54 -30
  83. data/bundler/lib/bundler/inline.rb +10 -10
  84. data/bundler/lib/bundler/installer.rb +114 -52
  85. data/bundler/lib/bundler/installer/gem_installer.rb +14 -4
  86. data/bundler/lib/bundler/installer/parallel_installer.rb +91 -42
  87. data/bundler/lib/bundler/installer/standalone.rb +1 -0
  88. data/bundler/lib/bundler/lazy_specification.rb +17 -4
  89. data/bundler/lib/bundler/lockfile_generator.rb +95 -0
  90. data/bundler/lib/bundler/lockfile_parser.rb +49 -35
  91. data/bundler/lib/bundler/match_platform.rb +1 -0
  92. data/bundler/lib/bundler/mirror.rb +10 -5
  93. data/bundler/lib/bundler/plugin.rb +8 -3
  94. data/bundler/lib/bundler/plugin/api/source.rb +16 -3
  95. data/bundler/lib/bundler/plugin/index.rb +9 -2
  96. data/bundler/lib/bundler/plugin/installer.rb +7 -6
  97. data/bundler/lib/bundler/plugin/source_list.rb +7 -8
  98. data/bundler/lib/bundler/process_lock.rb +24 -0
  99. data/bundler/lib/bundler/psyched_yaml.rb +10 -0
  100. data/bundler/lib/bundler/remote_specification.rb +25 -1
  101. data/bundler/lib/bundler/resolver.rb +176 -193
  102. data/bundler/lib/bundler/resolver/spec_group.rb +106 -0
  103. data/bundler/lib/bundler/retry.rb +1 -0
  104. data/bundler/lib/bundler/ruby_dsl.rb +1 -0
  105. data/bundler/lib/bundler/ruby_version.rb +7 -2
  106. data/bundler/lib/bundler/rubygems_ext.rb +18 -8
  107. data/bundler/lib/bundler/rubygems_gem_installer.rb +25 -2
  108. data/bundler/lib/bundler/rubygems_integration.rb +166 -69
  109. data/bundler/lib/bundler/runtime.rb +29 -19
  110. data/bundler/lib/bundler/settings.rb +202 -87
  111. data/bundler/lib/bundler/settings/validator.rb +79 -0
  112. data/bundler/lib/bundler/setup.rb +4 -7
  113. data/bundler/lib/bundler/shared_helpers.rb +143 -27
  114. data/bundler/lib/bundler/similarity_detector.rb +1 -0
  115. data/bundler/lib/bundler/source.rb +53 -1
  116. data/bundler/lib/bundler/source/gemspec.rb +1 -0
  117. data/bundler/lib/bundler/source/git.rb +51 -22
  118. data/bundler/lib/bundler/source/git/git_proxy.rb +23 -13
  119. data/bundler/lib/bundler/source/metadata.rb +63 -0
  120. data/bundler/lib/bundler/source/path.rb +38 -17
  121. data/bundler/lib/bundler/source/path/installer.rb +4 -2
  122. data/bundler/lib/bundler/source/rubygems.rb +161 -82
  123. data/bundler/lib/bundler/source/rubygems/remote.rb +12 -2
  124. data/bundler/lib/bundler/source_list.rb +75 -15
  125. data/bundler/lib/bundler/spec_set.rb +37 -21
  126. data/bundler/lib/bundler/ssl_certs/certificate_manager.rb +2 -1
  127. data/bundler/lib/bundler/stub_specification.rb +86 -2
  128. data/bundler/lib/bundler/templates/.document +1 -0
  129. data/bundler/lib/bundler/templates/Executable +13 -1
  130. data/bundler/lib/bundler/templates/Executable.bundler +105 -0
  131. data/bundler/lib/bundler/templates/Executable.standalone +5 -5
  132. data/bundler/lib/bundler/templates/Gemfile +3 -0
  133. data/bundler/lib/bundler/templates/gems.rb +8 -0
  134. data/bundler/lib/bundler/templates/newgem/Gemfile.tt +4 -2
  135. data/bundler/lib/bundler/templates/newgem/LICENSE.txt.tt +1 -1
  136. data/bundler/lib/bundler/templates/newgem/README.md.tt +14 -8
  137. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +5 -5
  138. data/bundler/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +4 -4
  139. data/bundler/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +3 -3
  140. data/bundler/lib/bundler/templates/newgem/gitignore.tt +0 -1
  141. data/bundler/lib/bundler/templates/newgem/lib/newgem.rb.tt +6 -6
  142. data/bundler/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +4 -4
  143. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +21 -12
  144. data/bundler/lib/bundler/templates/newgem/rspec.tt +1 -0
  145. data/bundler/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +0 -2
  146. data/bundler/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +3 -0
  147. data/bundler/lib/bundler/templates/newgem/test/newgem_test.rb.tt +1 -1
  148. data/bundler/lib/bundler/templates/newgem/test/test_helper.rb.tt +3 -3
  149. data/bundler/lib/bundler/templates/newgem/{.travis.yml.tt → travis.yml.tt} +2 -0
  150. data/bundler/lib/bundler/ui.rb +1 -0
  151. data/bundler/lib/bundler/ui/rg_proxy.rb +1 -0
  152. data/bundler/lib/bundler/ui/shell.rb +26 -10
  153. data/bundler/lib/bundler/ui/silent.rb +12 -1
  154. data/bundler/lib/bundler/uri_credentials_filter.rb +1 -0
  155. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +1638 -0
  156. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo.rb +2 -0
  157. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +26 -0
  158. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +7 -0
  159. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +1 -0
  160. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +16 -5
  161. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +1 -0
  162. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +10 -2
  163. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -0
  164. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -0
  165. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -0
  166. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +1 -0
  167. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -0
  168. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +1 -0
  169. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +16 -5
  170. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +75 -7
  171. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +2 -1
  172. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +1 -0
  173. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +3 -1
  174. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +501 -138
  175. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +1 -0
  176. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +8 -4
  177. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +3 -1
  178. data/bundler/lib/bundler/vendor/thor/lib/thor.rb +46 -21
  179. data/bundler/lib/bundler/vendor/thor/lib/thor/actions.rb +24 -22
  180. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +2 -1
  181. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
  182. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +2 -2
  183. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +16 -8
  184. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +66 -18
  185. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +17 -15
  186. data/bundler/lib/bundler/vendor/thor/lib/thor/base.rb +55 -32
  187. data/bundler/lib/bundler/vendor/thor/lib/thor/command.rb +13 -11
  188. data/bundler/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +21 -1
  189. data/bundler/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +7 -5
  190. data/bundler/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +94 -63
  191. data/bundler/lib/bundler/vendor/thor/lib/thor/error.rb +3 -3
  192. data/bundler/lib/bundler/vendor/thor/lib/thor/group.rb +13 -13
  193. data/bundler/lib/bundler/vendor/thor/lib/thor/invocation.rb +4 -5
  194. data/bundler/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +2 -0
  195. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +4 -7
  196. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +16 -16
  197. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/option.rb +42 -21
  198. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/options.rb +13 -10
  199. data/bundler/lib/bundler/vendor/thor/lib/thor/runner.rb +31 -29
  200. data/bundler/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
  201. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +49 -33
  202. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/color.rb +1 -1
  203. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/html.rb +4 -4
  204. data/bundler/lib/bundler/vendor/thor/lib/thor/util.rb +8 -7
  205. data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  206. data/bundler/lib/bundler/vendored_fileutils.rb +9 -0
  207. data/bundler/lib/bundler/vendored_molinillo.rb +1 -0
  208. data/bundler/lib/bundler/vendored_persistent.rb +35 -0
  209. data/bundler/lib/bundler/vendored_thor.rb +6 -2
  210. data/bundler/lib/bundler/version.rb +19 -2
  211. data/bundler/lib/bundler/version_ranges.rb +76 -0
  212. data/bundler/lib/bundler/vlad.rb +5 -0
  213. data/bundler/lib/bundler/worker.rb +3 -1
  214. data/bundler/lib/bundler/yaml_serializer.rb +3 -3
  215. data/bundler/man/bundle-add.ronn +29 -0
  216. data/bundler/man/bundle-binstubs.ronn +15 -1
  217. data/bundler/man/bundle-check.ronn +26 -0
  218. data/bundler/man/bundle-clean.ronn +18 -0
  219. data/bundler/man/bundle-config.ronn +193 -69
  220. data/bundler/man/bundle-doctor.ronn +33 -0
  221. data/bundler/man/bundle-exec.ronn +10 -3
  222. data/bundler/man/bundle-gem.ronn +3 -2
  223. data/bundler/man/bundle-info.ronn +17 -0
  224. data/bundler/man/bundle-init.ronn +29 -0
  225. data/bundler/man/bundle-inject.ronn +22 -0
  226. data/bundler/man/bundle-install.ronn +44 -35
  227. data/bundler/man/bundle-list.ronn +15 -0
  228. data/bundler/man/bundle-lock.ronn +1 -1
  229. data/bundler/man/bundle-open.ronn +19 -0
  230. data/bundler/man/bundle-outdated.ronn +2 -2
  231. data/bundler/man/bundle-package.ronn +7 -2
  232. data/bundler/man/bundle-pristine.ronn +34 -0
  233. data/bundler/man/bundle-show.ronn +21 -0
  234. data/bundler/man/bundle-update.ronn +24 -17
  235. data/bundler/man/bundle-viz.ronn +30 -0
  236. data/bundler/man/bundle.ronn +36 -45
  237. data/bundler/man/gemfile.5.ronn +77 -71
  238. data/lib/rubygems.rb +102 -46
  239. data/lib/rubygems/basic_specification.rb +8 -4
  240. data/lib/rubygems/bundler_version_finder.rb +99 -0
  241. data/lib/rubygems/command.rb +10 -2
  242. data/lib/rubygems/command_manager.rb +8 -4
  243. data/lib/rubygems/commands/cert_command.rb +31 -6
  244. data/lib/rubygems/commands/cleanup_command.rb +10 -3
  245. data/lib/rubygems/commands/generate_index_command.rb +1 -1
  246. data/lib/rubygems/commands/help_command.rb +1 -1
  247. data/lib/rubygems/commands/install_command.rb +7 -0
  248. data/lib/rubygems/commands/open_command.rb +1 -1
  249. data/lib/rubygems/commands/owner_command.rb +7 -2
  250. data/lib/rubygems/commands/pristine_command.rb +11 -8
  251. data/lib/rubygems/commands/push_command.rb +39 -5
  252. data/lib/rubygems/commands/query_command.rb +17 -17
  253. data/lib/rubygems/commands/setup_command.rb +174 -69
  254. data/lib/rubygems/commands/signin_command.rb +33 -0
  255. data/lib/rubygems/commands/signout_command.rb +33 -0
  256. data/lib/rubygems/commands/sources_command.rb +1 -1
  257. data/lib/rubygems/commands/uninstall_command.rb +5 -4
  258. data/lib/rubygems/commands/unpack_command.rb +19 -7
  259. data/lib/rubygems/commands/update_command.rb +1 -1
  260. data/lib/rubygems/commands/which_command.rb +1 -1
  261. data/lib/rubygems/commands/yank_command.rb +4 -11
  262. data/lib/rubygems/config_file.rb +15 -26
  263. data/lib/rubygems/core_ext/kernel_require.rb +12 -16
  264. data/lib/rubygems/dependency.rb +3 -0
  265. data/lib/rubygems/dependency_installer.rb +8 -2
  266. data/lib/rubygems/dependency_list.rb +1 -1
  267. data/lib/rubygems/errors.rb +3 -0
  268. data/lib/rubygems/exceptions.rb +11 -1
  269. data/lib/rubygems/ext/builder.rb +2 -2
  270. data/lib/rubygems/ext/ext_conf_builder.rb +2 -4
  271. data/lib/rubygems/ext/rake_builder.rb +1 -1
  272. data/lib/rubygems/gem_runner.rb +5 -1
  273. data/lib/rubygems/gemcutter_utilities.rb +5 -2
  274. data/lib/rubygems/indexer.rb +6 -5
  275. data/lib/rubygems/install_update_options.rb +6 -29
  276. data/lib/rubygems/installer.rb +60 -13
  277. data/lib/rubygems/installer_test_case.rb +6 -3
  278. data/lib/rubygems/package.rb +55 -8
  279. data/lib/rubygems/package/file_source.rb +2 -2
  280. data/lib/rubygems/package/old.rb +3 -3
  281. data/lib/rubygems/package/tar_header.rb +17 -10
  282. data/lib/rubygems/package/tar_writer.rb +4 -3
  283. data/lib/rubygems/platform.rb +1 -1
  284. data/lib/rubygems/remote_fetcher.rb +2 -2
  285. data/lib/rubygems/request.rb +1 -1
  286. data/lib/rubygems/request_set.rb +47 -19
  287. data/lib/rubygems/request_set/gem_dependency_api.rb +3 -3
  288. data/lib/rubygems/request_set/lockfile.rb +1 -1
  289. data/lib/rubygems/requirement.rb +19 -4
  290. data/lib/rubygems/resolver.rb +24 -3
  291. data/lib/rubygems/resolver/api_specification.rb +5 -0
  292. data/lib/rubygems/resolver/installer_set.rb +4 -6
  293. data/lib/rubygems/safe_yaml.rb +51 -0
  294. data/lib/rubygems/security.rb +18 -6
  295. data/lib/rubygems/security/trust_dir.rb +1 -1
  296. data/lib/rubygems/security_option.rb +43 -0
  297. data/lib/rubygems/server.rb +21 -17
  298. data/lib/rubygems/source.rb +9 -6
  299. data/lib/rubygems/source/git.rb +2 -1
  300. data/lib/rubygems/source/local.rb +38 -35
  301. data/lib/rubygems/source/lock.rb +4 -1
  302. data/lib/rubygems/source_local.rb +3 -1
  303. data/lib/rubygems/source_specific_file.rb +3 -2
  304. data/lib/rubygems/spec_fetcher.rb +7 -3
  305. data/lib/rubygems/specification.rb +315 -249
  306. data/lib/rubygems/ssl_certs/{index.rubygems.org → rubygems.org}/GlobalSignRootCA.pem +0 -0
  307. data/lib/rubygems/ssl_certs/rubygems.org/GlobalSignRootCA_R3.pem +21 -0
  308. data/lib/rubygems/stub_specification.rb +4 -3
  309. data/lib/rubygems/test_case.rb +51 -11
  310. data/lib/rubygems/test_utilities.rb +2 -2
  311. data/lib/rubygems/text.rb +14 -1
  312. data/lib/rubygems/user_interaction.rb +24 -15
  313. data/lib/rubygems/util.rb +6 -16
  314. data/lib/rubygems/util/licenses.rb +72 -4
  315. data/lib/rubygems/validator.rb +3 -3
  316. data/lib/rubygems/version.rb +24 -4
  317. data/lib/rubygems/version_option.rb +6 -1
  318. data/lib/ubygems.rb +3 -0
  319. data/setup.rb +1 -1
  320. data/test/rubygems/private3072_key.pem +40 -0
  321. data/test/rubygems/public3072_cert.pem +25 -0
  322. data/test/rubygems/test_bundled_ca.rb +7 -4
  323. data/test/rubygems/test_config.rb +1 -1
  324. data/test/rubygems/test_gem.rb +158 -39
  325. data/test/rubygems/test_gem_bundler_version_finder.rb +126 -0
  326. data/test/rubygems/test_gem_command.rb +7 -1
  327. data/test/rubygems/test_gem_command_manager.rb +2 -2
  328. data/test/rubygems/test_gem_commands_build_command.rb +29 -1
  329. data/test/rubygems/test_gem_commands_cert_command.rb +64 -0
  330. data/test/rubygems/test_gem_commands_cleanup_command.rb +44 -1
  331. data/test/rubygems/test_gem_commands_install_command.rb +73 -2
  332. data/test/rubygems/test_gem_commands_open_command.rb +2 -1
  333. data/test/rubygems/test_gem_commands_owner_command.rb +25 -0
  334. data/test/rubygems/test_gem_commands_pristine_command.rb +1 -1
  335. data/test/rubygems/test_gem_commands_push_command.rb +25 -5
  336. data/test/rubygems/test_gem_commands_query_command.rb +154 -1
  337. data/test/rubygems/test_gem_commands_setup_command.rb +140 -10
  338. data/test/rubygems/test_gem_commands_signin_command.rb +98 -0
  339. data/test/rubygems/test_gem_commands_signout_command.rb +37 -0
  340. data/test/rubygems/test_gem_commands_sources_command.rb +52 -0
  341. data/test/rubygems/test_gem_commands_uninstall_command.rb +15 -3
  342. data/test/rubygems/test_gem_commands_update_command.rb +1 -7
  343. data/test/rubygems/test_gem_commands_which_command.rb +3 -3
  344. data/test/rubygems/test_gem_dependency.rb +28 -0
  345. data/test/rubygems/test_gem_dependency_installer.rb +1 -1
  346. data/test/rubygems/test_gem_doctor.rb +2 -2
  347. data/test/rubygems/test_gem_ext_builder.rb +8 -8
  348. data/test/rubygems/test_gem_ext_configure_builder.rb +1 -1
  349. data/test/rubygems/test_gem_ext_rake_builder.rb +2 -6
  350. data/test/rubygems/test_gem_gemcutter_utilities.rb +4 -4
  351. data/test/rubygems/test_gem_indexer.rb +1 -2
  352. data/test/rubygems/test_gem_install_update_options.rb +6 -1
  353. data/test/rubygems/test_gem_installer.rb +168 -31
  354. data/test/rubygems/test_gem_package.rb +183 -26
  355. data/test/rubygems/test_gem_package_old.rb +1 -1
  356. data/test/rubygems/test_gem_package_tar_header.rb +21 -0
  357. data/test/rubygems/test_gem_rdoc.rb +2 -0
  358. data/test/rubygems/test_gem_remote_fetcher.rb +24 -5
  359. data/test/rubygems/test_gem_request.rb +5 -2
  360. data/test/rubygems/test_gem_request_connection_pools.rb +6 -7
  361. data/test/rubygems/test_gem_request_set.rb +7 -7
  362. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +3 -3
  363. data/test/rubygems/test_gem_request_set_lockfile.rb +4 -4
  364. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +1 -1
  365. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +1 -1
  366. data/test/rubygems/test_gem_requirement.rb +12 -0
  367. data/test/rubygems/test_gem_resolver.rb +26 -0
  368. data/test/rubygems/test_gem_resolver_api_specification.rb +24 -0
  369. data/test/rubygems/test_gem_resolver_conflict.rb +1 -1
  370. data/test/rubygems/test_gem_resolver_git_specification.rb +1 -1
  371. data/test/rubygems/test_gem_resolver_installer_set.rb +1 -1
  372. data/test/rubygems/test_gem_security.rb +5 -0
  373. data/test/rubygems/test_gem_security_policy.rb +27 -27
  374. data/test/rubygems/test_gem_security_signer.rb +6 -6
  375. data/test/rubygems/test_gem_security_trust_dir.rb +2 -2
  376. data/test/rubygems/test_gem_server.rb +194 -12
  377. data/test/rubygems/test_gem_source.rb +12 -3
  378. data/test/rubygems/test_gem_source_git.rb +1 -1
  379. data/test/rubygems/test_gem_spec_fetcher.rb +20 -0
  380. data/test/rubygems/test_gem_specification.rb +180 -42
  381. data/test/rubygems/test_gem_stream_ui.rb +8 -8
  382. data/test/rubygems/test_gem_stub_specification.rb +26 -8
  383. data/test/rubygems/test_gem_text.rb +16 -0
  384. data/test/rubygems/test_gem_util.rb +26 -0
  385. data/test/rubygems/test_gem_version.rb +68 -9
  386. data/test/rubygems/test_gem_version_option.rb +15 -0
  387. data/test/rubygems/test_kernel.rb +30 -0
  388. data/test/rubygems/test_require.rb +70 -21
  389. data/util/ci +1 -0
  390. data/util/generate_spdx_license_list.rb +16 -6
  391. data/util/update_bundled_ca_certificates.rb +1 -3
  392. metadata +61 -57
  393. data/README.rdoc +0 -54
  394. data/bundler/DEVELOPMENT.md +0 -150
  395. data/bundler/ISSUES.md +0 -117
  396. data/bundler/lib/bundler/postit_trampoline.rb +0 -73
  397. data/bundler/lib/bundler/vendor/postit/lib/postit.rb +0 -15
  398. data/bundler/lib/bundler/vendor/postit/lib/postit/environment.rb +0 -44
  399. data/bundler/lib/bundler/vendor/postit/lib/postit/installer.rb +0 -28
  400. data/bundler/lib/bundler/vendor/postit/lib/postit/parser.rb +0 -21
  401. data/bundler/lib/bundler/vendor/postit/lib/postit/setup.rb +0 -12
  402. data/bundler/lib/bundler/vendor/postit/lib/postit/version.rb +0 -3
  403. data/bundler/man/index.txt +0 -8
  404. data/lib/rubygems/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem +0 -23
  405. data/lib/rubygems/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem +0 -25
@@ -27,9 +27,7 @@ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
27
27
  # TODO: Make this unconditional when rubygems no longer supports Ruby 1.9.x.
28
28
  tmp_dest = get_relative_path(tmp_dest) unless Gem.win_platform? && RUBY_VERSION <= '2.0'
29
29
 
30
- t = nil
31
30
  Tempfile.open %w"siteconf .rb", "." do |siteconf|
32
- t = siteconf
33
31
  siteconf.puts "require 'rbconfig'"
34
32
  siteconf.puts "dest_path = #{tmp_dest.dump}"
35
33
  %w[sitearchdir sitelibdir].each do |dir|
@@ -37,7 +35,7 @@ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
37
35
  siteconf.puts "RbConfig::CONFIG['#{dir}'] = dest_path"
38
36
  end
39
37
 
40
- siteconf.flush
38
+ siteconf.close
41
39
 
42
40
  destdir = ENV["DESTDIR"]
43
41
 
@@ -78,9 +76,9 @@ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
78
76
  end
79
77
  ensure
80
78
  ENV["DESTDIR"] = destdir
79
+ siteconf.close!
81
80
  end
82
81
  end
83
- t.unlink if t and t.path
84
82
 
85
83
  results
86
84
  ensure
@@ -20,7 +20,7 @@ class Gem::Ext::RakeBuilder < Gem::Ext::Builder
20
20
  rake = ENV['rake']
21
21
 
22
22
  rake ||= begin
23
- "#{Gem.ruby} -rubygems #{Gem.bin_path('rake', 'rake')}"
23
+ "#{Gem.ruby} -rrubygems #{Gem.bin_path('rake', 'rake')}"
24
24
  rescue Gem::Exception
25
25
  end
26
26
 
@@ -8,6 +8,7 @@
8
8
  require 'rubygems'
9
9
  require 'rubygems/command_manager'
10
10
  require 'rubygems/config_file'
11
+ require 'rubygems/deprecate'
11
12
 
12
13
  ##
13
14
  # Load additional plugins from $LOAD_PATH
@@ -26,7 +27,10 @@ Gem.load_env_plugins rescue nil
26
27
  class Gem::GemRunner
27
28
 
28
29
  def initialize(options={})
29
- # TODO: nuke these options
30
+ if !options.empty? && !Gem::Deprecate.skip
31
+ Kernel.warn "NOTE: passing options to Gem::GemRunner.new is deprecated with no replacement. It will be removed on or after 2016-10-01."
32
+ end
33
+
30
34
  @command_manager_class = options[:command_manager] || Gem::CommandManager
31
35
  @config_file_class = options[:config_file] || Gem::ConfigFile
32
36
  end
@@ -1,11 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
  require 'rubygems/remote_fetcher'
3
+ require 'rubygems/text'
3
4
 
4
5
  ##
5
6
  # Utility methods for using the RubyGems API.
6
7
 
7
8
  module Gem::GemcutterUtilities
8
9
 
10
+ include Gem::Text
11
+
9
12
  # TODO: move to Gem::Command
10
13
  OptionParser.accept Symbol do |value|
11
14
  value.to_sym
@@ -145,13 +148,13 @@ module Gem::GemcutterUtilities
145
148
  if block_given? then
146
149
  yield response
147
150
  else
148
- say response.body
151
+ say clean_text(response.body)
149
152
  end
150
153
  else
151
154
  message = response.body
152
155
  message = "#{error_prefix}: #{message}" if error_prefix
153
156
 
154
- say message
157
+ say clean_text(message)
155
158
  terminate_interaction 1 # TODO: question this
156
159
  end
157
160
  end
@@ -2,6 +2,7 @@
2
2
  require 'rubygems'
3
3
  require 'rubygems/package'
4
4
  require 'time'
5
+ require 'tmpdir'
5
6
 
6
7
  begin
7
8
  gem 'builder'
@@ -64,7 +65,7 @@ class Gem::Indexer
64
65
  @build_modern = options[:build_modern]
65
66
 
66
67
  @dest_directory = directory
67
- @directory = File.join(Dir.tmpdir, "gem_generate_index_#{$$}")
68
+ @directory = Dir.mktmpdir 'gem_generate_index'
68
69
 
69
70
  marshal_name = "Marshal.#{Gem.marshal_version}"
70
71
 
@@ -123,7 +124,7 @@ class Gem::Indexer
123
124
  marshal_name = File.join @quick_marshal_dir, spec_file_name
124
125
 
125
126
  marshal_zipped = Gem.deflate Marshal.dump(spec)
126
- open marshal_name, 'wb' do |io| io.write marshal_zipped end
127
+ File.open marshal_name, 'wb' do |io| io.write marshal_zipped end
127
128
 
128
129
  files << marshal_name
129
130
 
@@ -261,7 +262,7 @@ class Gem::Indexer
261
262
 
262
263
  zipped = Gem.deflate data
263
264
 
264
- open "#{filename}.#{extension}", 'wb' do |io|
265
+ File.open "#{filename}.#{extension}", 'wb' do |io|
265
266
  io.write zipped
266
267
  end
267
268
  end
@@ -346,7 +347,7 @@ class Gem::Indexer
346
347
  data = Gem.read_binary path
347
348
  compressed_data = Gem.read_binary "#{path}.#{extension}"
348
349
 
349
- unless data == Gem.inflate(compressed_data) then
350
+ unless data == Gem::Util.inflate(compressed_data) then
350
351
  raise "Compressed file #{compressed_path} does not match uncompressed file #{path}"
351
352
  end
352
353
  end
@@ -427,7 +428,7 @@ class Gem::Indexer
427
428
 
428
429
  specs_index = compact_specs specs_index.uniq.sort
429
430
 
430
- open dest, 'wb' do |io|
431
+ File.open dest, 'wb' do |io|
431
432
  Marshal.dump specs_index, io
432
433
  end
433
434
  end
@@ -6,37 +6,18 @@
6
6
  #++
7
7
 
8
8
  require 'rubygems'
9
-
10
- # forward-declare
11
-
12
- module Gem::Security # :nodoc:
13
- class Policy # :nodoc:
14
- end
15
- end
9
+ require 'rubygems/security_option'
16
10
 
17
11
  ##
18
12
  # Mixin methods for install and update options for Gem::Commands
19
13
 
20
14
  module Gem::InstallUpdateOptions
15
+ include Gem::SecurityOption
21
16
 
22
17
  ##
23
18
  # Add the install/update options to the option parser.
24
19
 
25
20
  def add_install_update_options
26
- # TODO: use @parser.accept
27
- OptionParser.accept Gem::Security::Policy do |value|
28
- require 'rubygems/security'
29
-
30
- raise OptionParser::InvalidArgument, 'OpenSSL not installed' unless
31
- defined?(Gem::Security::HighSecurity)
32
-
33
- value = Gem::Security::Policies[value]
34
- valid = Gem::Security::Policies.keys.sort
35
- message = "#{value} (#{valid.join ', '} are valid)"
36
- raise OptionParser::InvalidArgument, message if value.nil?
37
- value
38
- end
39
-
40
21
  add_option(:"Install/Update", '-i', '--install-dir DIR',
41
22
  'Gem repository directory to get installed',
42
23
  'gems') do |value, options|
@@ -44,7 +25,7 @@ module Gem::InstallUpdateOptions
44
25
  end
45
26
 
46
27
  add_option(:"Install/Update", '-n', '--bindir DIR',
47
- 'Directory where binary files are',
28
+ 'Directory where executables are',
48
29
  'located') do |value, options|
49
30
  options[:bin_dir] = File.expand_path(value)
50
31
  end
@@ -124,11 +105,7 @@ module Gem::InstallUpdateOptions
124
105
  options[:wrappers] = value
125
106
  end
126
107
 
127
- add_option(:"Install/Update", '-P', '--trust-policy POLICY',
128
- Gem::Security::Policy,
129
- 'Specify gem trust policy') do |value, options|
130
- options[:security_policy] = value
131
- end
108
+ add_security_option
132
109
 
133
110
  add_option(:"Install/Update", '--ignore-dependencies',
134
111
  'Do not install any required dependent gems') do |value, options|
@@ -136,8 +113,8 @@ module Gem::InstallUpdateOptions
136
113
  end
137
114
 
138
115
  add_option(:"Install/Update", '--[no-]format-executable',
139
- 'Make installed executable names match ruby.',
140
- 'If ruby is ruby18, foo_exec will be',
116
+ 'Make installed executable names match Ruby.',
117
+ 'If Ruby is ruby18, foo_exec will be',
141
118
  'foo_exec18') do |value, options|
142
119
  options[:format_executable] = value
143
120
  end
@@ -7,6 +7,7 @@
7
7
 
8
8
  require 'rubygems/command'
9
9
  require 'rubygems/exceptions'
10
+ require 'rubygems/deprecate'
10
11
  require 'rubygems/package'
11
12
  require 'rubygems/ext'
12
13
  require 'rubygems/user_interaction'
@@ -27,6 +28,8 @@ require 'fileutils'
27
28
 
28
29
  class Gem::Installer
29
30
 
31
+ extend Gem::Deprecate
32
+
30
33
  ##
31
34
  # Paths where env(1) might live. Some systems are broken and have it in
32
35
  # /bin
@@ -136,8 +139,9 @@ class Gem::Installer
136
139
  end
137
140
 
138
141
  ##
139
- # Constructs an Installer instance that will install the gem located at
140
- # +gem+. +options+ is a Hash with the following keys:
142
+ # Constructs an Installer instance that will install the gem at +package+ which
143
+ # can either be a path or an instance of Gem::Package. +options+ is a Hash
144
+ # with the following keys:
141
145
  #
142
146
  # :bin_dir:: Where to put a bin wrapper if needed.
143
147
  # :development:: Whether or not development dependencies should be installed.
@@ -157,6 +161,7 @@ class Gem::Installer
157
161
  # :wrappers:: Install wrappers if true, symlinks if false.
158
162
  # :build_args:: An Array of arguments to pass to the extension builder
159
163
  # process. If not set, then Gem::Command.build_args is used
164
+ # :post_install_message:: Print gem post install message if true
160
165
 
161
166
  def initialize(package, options={})
162
167
  require 'fileutils'
@@ -204,7 +209,7 @@ class Gem::Installer
204
209
  ruby_executable = false
205
210
  existing = nil
206
211
 
207
- open generated_bin, 'rb' do |io|
212
+ File.open generated_bin, 'rb' do |io|
208
213
  next unless io.gets =~ /^#!/ # shebang
209
214
  io.gets # blankline
210
215
 
@@ -214,7 +219,7 @@ class Gem::Installer
214
219
 
215
220
  ruby_executable = true
216
221
  existing = io.read.slice(%r{
217
- ^(
222
+ ^\s*(
218
223
  gem \s |
219
224
  load \s Gem\.bin_path\( |
220
225
  load \s Gem\.activate_bin_path\(
@@ -425,7 +430,7 @@ class Gem::Installer
425
430
  # specifications directory.
426
431
 
427
432
  def write_spec
428
- open spec_file, 'w' do |file|
433
+ File.open spec_file, 'w' do |file|
429
434
  spec.installed_by_version = Gem.rubygems_version
430
435
 
431
436
  file.puts spec.to_ruby_for_cache
@@ -462,7 +467,12 @@ class Gem::Installer
462
467
  def generate_bin # :nodoc:
463
468
  return if spec.executables.nil? or spec.executables.empty?
464
469
 
465
- Dir.mkdir @bin_dir unless File.exist? @bin_dir
470
+ begin
471
+ Dir.mkdir @bin_dir
472
+ rescue SystemCallError
473
+ raise unless File.directory? @bin_dir
474
+ end
475
+
466
476
  raise Gem::FilePermissionError.new(@bin_dir) unless File.writable? @bin_dir
467
477
 
468
478
  spec.executables.each do |filename|
@@ -471,7 +481,7 @@ class Gem::Installer
471
481
 
472
482
  unless File.exist? bin_path then
473
483
  # TODO change this to a more useful warning
474
- warn "#{bin_path} maybe `gem pristine #{spec.name}` will fix it?"
484
+ warn "`#{bin_path}` does not exist, maybe `gem pristine #{spec.name}` will fix it?"
475
485
  next
476
486
  end
477
487
 
@@ -608,7 +618,9 @@ class Gem::Installer
608
618
  def ensure_required_ruby_version_met # :nodoc:
609
619
  if rrv = spec.required_ruby_version then
610
620
  unless rrv.satisfied_by? Gem.ruby_version then
611
- raise Gem::InstallError, "#{spec.name} requires Ruby version #{rrv}."
621
+ ruby_version = Gem.ruby_api_version
622
+ raise Gem::RuntimeRequirementNotMetError,
623
+ "#{spec.name} requires Ruby version #{rrv}. The current ruby version is #{ruby_version}."
612
624
  end
613
625
  end
614
626
  end
@@ -616,8 +628,9 @@ class Gem::Installer
616
628
  def ensure_required_rubygems_version_met # :nodoc:
617
629
  if rrgv = spec.required_rubygems_version then
618
630
  unless rrgv.satisfied_by? Gem.rubygems_version then
619
- raise Gem::InstallError,
620
- "#{spec.name} requires RubyGems version #{rrgv}. " +
631
+ rg_version = Gem::VERSION
632
+ raise Gem::RuntimeRequirementNotMetError,
633
+ "#{spec.name} requires RubyGems version #{rrgv}. The current RubyGems version is #{rg_version}. " +
621
634
  "Try 'gem update --system' to update RubyGems itself."
622
635
  end
623
636
  end
@@ -697,10 +710,34 @@ class Gem::Installer
697
710
  unpack or File.writable?(gem_home)
698
711
  end
699
712
 
713
+ def verify_spec
714
+ unless spec.name =~ Gem::Specification::VALID_NAME_PATTERN
715
+ raise Gem::InstallError, "#{spec} has an invalid name"
716
+ end
717
+
718
+ if spec.raw_require_paths.any?{|path| path =~ /\r\n|\r|\n/ }
719
+ raise Gem::InstallError, "#{spec} has an invalid require_paths"
720
+ end
721
+
722
+ if spec.extensions.any?{|ext| ext =~ /\r\n|\r|\n/ }
723
+ raise Gem::InstallError, "#{spec} has an invalid extensions"
724
+ end
725
+
726
+ unless spec.specification_version.to_s =~ /\A\d+\z/
727
+ raise Gem::InstallError, "#{spec} has an invalid specification_version"
728
+ end
729
+
730
+ if spec.dependencies.any? {|dep| dep.type =~ /\r\n|\r|\n/ || dep.name =~ /\r\n|\r|\n/ }
731
+ raise Gem::InstallError, "#{spec} has an invalid dependencies"
732
+ end
733
+ end
734
+
700
735
  ##
701
736
  # Return the text for an application file.
702
737
 
703
738
  def app_script_text(bin_file_name)
739
+ # note that the `load` lines cannot be indented, as old RG versions match
740
+ # against the beginning of the line
704
741
  return <<-TEXT
705
742
  #{shebang bin_file_name}
706
743
  #
@@ -723,7 +760,12 @@ if ARGV.first
723
760
  end
724
761
  end
725
762
 
763
+ if Gem.respond_to?(:activate_bin_path)
726
764
  load Gem.activate_bin_path('#{spec.name}', '#{bin_file_name}', version)
765
+ else
766
+ gem #{spec.name.dump}, version
767
+ load Gem.bin_path(#{spec.name.dump}, #{bin_file_name.dump}, version)
768
+ end
727
769
  TEXT
728
770
  end
729
771
 
@@ -755,13 +797,14 @@ TEXT
755
797
  ##
756
798
  # Logs the build +output+ in +build_dir+, then raises Gem::Ext::BuildError.
757
799
  #
758
- # TODO: Delete this for RubyGems 3. It remains for API compatibility
800
+ # TODO: Delete this for RubyGems 4. It remains for API compatibility
759
801
 
760
802
  def extension_build_error(build_dir, output, backtrace = nil) # :nodoc:
761
803
  builder = Gem::Ext::Builder.new spec, @build_args
762
804
 
763
805
  builder.build_error build_dir, output, backtrace
764
806
  end
807
+ deprecate :extension_build_error, :none, 2018, 12
765
808
 
766
809
  ##
767
810
  # Reads the file index and extracts each file into the gem directory.
@@ -809,11 +852,15 @@ TEXT
809
852
  #
810
853
  # Version and dependency checks are skipped if this install is forced.
811
854
  #
812
- # The dependent check will be skipped this install is ignoring dependencies.
855
+ # The dependent check will be skipped if the install is ignoring dependencies.
813
856
 
814
857
  def pre_install_checks
815
858
  verify_gem_home options[:unpack]
816
859
 
860
+ # The name and require_paths must be verified first, since it could contain
861
+ # ruby code that would be eval'ed in #ensure_loadable_spec
862
+ verify_spec
863
+
817
864
  ensure_loadable_spec
818
865
 
819
866
  if options[:install_as_default]
@@ -844,7 +891,7 @@ TEXT
844
891
 
845
892
  build_info_file = File.join build_info_dir, "#{spec.full_name}.info"
846
893
 
847
- open build_info_file, 'w' do |io|
894
+ File.open build_info_file, 'w' do |io|
848
895
  @build_args.each do |arg|
849
896
  io.puts arg
850
897
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  require 'rubygems/test_case'
3
3
  require 'rubygems/installer'
4
+ require 'rubygems/deprecate'
4
5
 
5
6
  class Gem::Installer
6
7
 
@@ -72,7 +73,7 @@ class Gem::InstallerTestCase < Gem::TestCase
72
73
  # a spec named 'a', intended for regular installs
73
74
  # @user_spec::
74
75
  # a spec named 'b', intended for user installs
75
-
76
+ #
76
77
  # @gem::
77
78
  # the path to a built gem from @spec
78
79
  # @user_spec::
@@ -107,15 +108,17 @@ class Gem::InstallerTestCase < Gem::TestCase
107
108
  end
108
109
 
109
110
  def util_gem_bindir spec = @spec # :nodoc:
110
- # TODO: deprecate
111
111
  spec.bin_dir
112
112
  end
113
113
 
114
114
  def util_gem_dir spec = @spec # :nodoc:
115
- # TODO: deprecate
116
115
  spec.gem_dir
117
116
  end
118
117
 
118
+ extend Gem::Deprecate
119
+ deprecate :util_gem_bindir, "@spec.bin_dir", 2016, 10
120
+ deprecate :util_gem_dir, "@spec.gem_dir", 2016, 10
121
+
119
122
  ##
120
123
  # The path where installed executables live
121
124
 
@@ -219,7 +219,7 @@ class Gem::Package
219
219
  next unless stat.file?
220
220
 
221
221
  tar.add_file_simple file, stat.mode, stat.size do |dst_io|
222
- open file, 'rb' do |src_io|
222
+ File.open file, 'rb' do |src_io|
223
223
  dst_io.write src_io.read 16384 until src_io.eof?
224
224
  end
225
225
  end
@@ -378,9 +378,9 @@ EOM
378
378
  File.dirname destination
379
379
  end
380
380
 
381
- FileUtils.mkdir_p mkdir, mkdir_options
381
+ mkdir_p_safe mkdir, mkdir_options, destination_dir, entry.full_name
382
382
 
383
- open destination, 'wb' do |out|
383
+ File.open destination, 'wb' do |out|
384
384
  out.write entry.read
385
385
  FileUtils.chmod entry.header.mode, destination
386
386
  end if entry.file?
@@ -416,20 +416,53 @@ EOM
416
416
  raise Gem::Package::PathError.new(filename, destination_dir) if
417
417
  filename.start_with? '/'
418
418
 
419
- destination_dir = File.realpath destination_dir if
420
- File.respond_to? :realpath
419
+ destination_dir = realpath destination_dir
421
420
  destination_dir = File.expand_path destination_dir
422
421
 
423
422
  destination = File.join destination_dir, filename
424
423
  destination = File.expand_path destination
425
424
 
426
425
  raise Gem::Package::PathError.new(destination, destination_dir) unless
427
- destination.start_with? destination_dir
426
+ destination.start_with? destination_dir + '/'
427
+
428
+ begin
429
+ real_destination = File.expand_path(File.realpath(destination))
430
+ rescue
431
+ # it's fine if the destination doesn't exist, because rm -rf'ing it can't cause any damage
432
+ nil
433
+ else
434
+ raise Gem::Package::PathError.new(real_destination, destination_dir) unless
435
+ real_destination.start_with? destination_dir + '/'
436
+ end
428
437
 
429
438
  destination.untaint
430
439
  destination
431
440
  end
432
441
 
442
+ def normalize_path(pathname)
443
+ if Gem.win_platform?
444
+ pathname.downcase
445
+ else
446
+ pathname
447
+ end
448
+ end
449
+
450
+ def mkdir_p_safe mkdir, mkdir_options, destination_dir, file_name
451
+ destination_dir = realpath File.expand_path(destination_dir)
452
+ parts = mkdir.split(File::SEPARATOR)
453
+ parts.reduce do |path, basename|
454
+ path = realpath path unless path == ""
455
+ path = File.expand_path(path + File::SEPARATOR + basename)
456
+ lstat = File.lstat path rescue nil
457
+ if !lstat || !lstat.directory?
458
+ unless normalize_path(path).start_with? normalize_path(destination_dir) and (FileUtils.mkdir path, mkdir_options rescue false)
459
+ raise Gem::Package::PathError.new(file_name, destination_dir)
460
+ end
461
+ end
462
+ path
463
+ end
464
+ end
465
+
433
466
  ##
434
467
  # Loads a Gem::Specification from the TarEntry +entry+
435
468
 
@@ -468,7 +501,7 @@ EOM
468
501
 
469
502
  @checksums = gem.seek 'checksums.yaml.gz' do |entry|
470
503
  Zlib::GzipReader.wrap entry do |gz_io|
471
- YAML.load gz_io.read
504
+ Gem::SafeYAML.safe_load gz_io.read
472
505
  end
473
506
  end
474
507
  end
@@ -576,7 +609,7 @@ EOM
576
609
  end
577
610
 
578
611
  case file_name
579
- when /^metadata(.gz)?$/ then
612
+ when "metadata", "metadata.gz" then
580
613
  load_spec entry
581
614
  when 'data.tar.gz' then
582
615
  verify_gz entry
@@ -603,6 +636,10 @@ EOM
603
636
  raise Gem::Package::FormatError.new \
604
637
  'package content (data.tar.gz) is missing', @gem
605
638
  end
639
+
640
+ if duplicates = @files.group_by {|f| f }.select {|k,v| v.size > 1 }.map(&:first) and duplicates.any?
641
+ raise Gem::Security::Exception, "duplicate files in the package: (#{duplicates.map(&:inspect).join(', ')})"
642
+ end
606
643
  end
607
644
 
608
645
  ##
@@ -616,6 +653,16 @@ EOM
616
653
  raise Gem::Package::FormatError.new(e.message, entry.full_name)
617
654
  end
618
655
 
656
+ if File.respond_to? :realpath
657
+ def realpath file
658
+ File.realpath file
659
+ end
660
+ else
661
+ def realpath file
662
+ file
663
+ end
664
+ end
665
+
619
666
  end
620
667
 
621
668
  require 'rubygems/package/digest_io'