rubygems-update 2.7.11 → 3.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +67 -0
  3. data/.travis.yml +24 -18
  4. data/CODE_OF_CONDUCT.md +10 -8
  5. data/CONTRIBUTING.md +148 -0
  6. data/History.txt +458 -8
  7. data/MAINTAINERS.txt +1 -0
  8. data/Manifest.txt +16 -9
  9. data/POLICIES.md +92 -0
  10. data/README.md +53 -26
  11. data/Rakefile +77 -211
  12. data/{UPGRADING.rdoc → UPGRADING.md} +31 -32
  13. data/appveyor.yml +20 -45
  14. data/bin/gem +1 -2
  15. data/bin/update_rubygems +2 -3
  16. data/bundler/CHANGELOG.md +65 -0
  17. data/bundler/bundler.gemspec +7 -1
  18. data/bundler/lib/bundler/build_metadata.rb +1 -1
  19. data/bundler/lib/bundler/cli/add.rb +15 -5
  20. data/bundler/lib/bundler/cli/binstubs.rb +8 -2
  21. data/bundler/lib/bundler/cli/doctor.rb +47 -1
  22. data/bundler/lib/bundler/cli/install.rb +8 -5
  23. data/bundler/lib/bundler/cli/list.rb +41 -5
  24. data/bundler/lib/bundler/cli/outdated.rb +7 -1
  25. data/bundler/lib/bundler/cli/pristine.rb +4 -0
  26. data/bundler/lib/bundler/cli/remove.rb +18 -0
  27. data/bundler/lib/bundler/cli.rb +63 -21
  28. data/bundler/lib/bundler/definition.rb +15 -16
  29. data/bundler/lib/bundler/dependency.rb +2 -2
  30. data/bundler/lib/bundler/dsl.rb +19 -3
  31. data/bundler/lib/bundler/feature_flag.rb +7 -0
  32. data/bundler/lib/bundler/gem_version_promoter.rb +4 -2
  33. data/bundler/lib/bundler/injector.rb +168 -9
  34. data/bundler/lib/bundler/installer/parallel_installer.rb +5 -0
  35. data/bundler/lib/bundler/installer.rb +29 -6
  36. data/bundler/lib/bundler/plugin/events.rb +61 -0
  37. data/bundler/lib/bundler/plugin.rb +10 -3
  38. data/bundler/lib/bundler/resolver.rb +2 -2
  39. data/bundler/lib/bundler/rubygems_gem_installer.rb +7 -0
  40. data/bundler/lib/bundler/runtime.rb +8 -2
  41. data/bundler/lib/bundler/settings/validator.rb +23 -0
  42. data/bundler/lib/bundler/settings.rb +24 -3
  43. data/bundler/lib/bundler/shared_helpers.rb +19 -3
  44. data/bundler/lib/bundler/source/metadata.rb +2 -3
  45. data/bundler/lib/bundler/source.rb +9 -9
  46. data/bundler/lib/bundler/templates/newgem/lib/newgem.rb.tt +1 -0
  47. data/bundler/lib/bundler/version.rb +1 -1
  48. data/bundler/lib/bundler.rb +26 -8
  49. data/bundler/man/bundle-add.ronn +13 -2
  50. data/bundler/man/bundle-config.ronn +21 -0
  51. data/bundler/man/bundle-install.ronn +1 -1
  52. data/bundler/man/bundle-list.ronn +19 -1
  53. data/bundler/man/bundle-outdated.ronn +4 -0
  54. data/bundler/man/bundle-remove.ronn +23 -0
  55. data/bundler/man/bundle-update.ronn +1 -1
  56. data/bundler/man/bundle.ronn +3 -0
  57. data/lib/rubygems/available_set.rb +1 -1
  58. data/lib/rubygems/basic_specification.rb +12 -12
  59. data/lib/rubygems/bundler_version_finder.rb +3 -3
  60. data/lib/rubygems/command.rb +22 -15
  61. data/lib/rubygems/command_manager.rb +22 -5
  62. data/lib/rubygems/commands/build_command.rb +41 -7
  63. data/lib/rubygems/commands/cert_command.rb +45 -24
  64. data/lib/rubygems/commands/check_command.rb +1 -1
  65. data/lib/rubygems/commands/cleanup_command.rb +14 -7
  66. data/lib/rubygems/commands/contents_command.rb +14 -15
  67. data/lib/rubygems/commands/dependency_command.rb +17 -17
  68. data/lib/rubygems/commands/environment_command.rb +20 -1
  69. data/lib/rubygems/commands/fetch_command.rb +2 -3
  70. data/lib/rubygems/commands/generate_index_command.rb +2 -3
  71. data/lib/rubygems/commands/help_command.rb +12 -13
  72. data/lib/rubygems/commands/info_command.rb +33 -0
  73. data/lib/rubygems/commands/install_command.rb +21 -17
  74. data/lib/rubygems/commands/list_command.rb +0 -1
  75. data/lib/rubygems/commands/lock_command.rb +3 -4
  76. data/lib/rubygems/commands/open_command.rb +16 -10
  77. data/lib/rubygems/commands/owner_command.rb +21 -7
  78. data/lib/rubygems/commands/pristine_command.rb +23 -16
  79. data/lib/rubygems/commands/push_command.rb +19 -8
  80. data/lib/rubygems/commands/query_command.rb +24 -24
  81. data/lib/rubygems/commands/rdoc_command.rb +3 -4
  82. data/lib/rubygems/commands/search_command.rb +0 -1
  83. data/lib/rubygems/commands/server_command.rb +1 -2
  84. data/lib/rubygems/commands/setup_command.rb +86 -48
  85. data/lib/rubygems/commands/signin_command.rb +2 -1
  86. data/lib/rubygems/commands/signout_command.rb +2 -2
  87. data/lib/rubygems/commands/sources_command.rb +11 -12
  88. data/lib/rubygems/commands/specification_command.rb +7 -7
  89. data/lib/rubygems/commands/uninstall_command.rb +50 -18
  90. data/lib/rubygems/commands/unpack_command.rb +16 -7
  91. data/lib/rubygems/commands/update_command.rb +28 -23
  92. data/lib/rubygems/commands/which_command.rb +5 -8
  93. data/lib/rubygems/commands/yank_command.rb +1 -2
  94. data/lib/rubygems/compatibility.rb +1 -21
  95. data/lib/rubygems/config_file.rb +36 -36
  96. data/lib/rubygems/core_ext/kernel_require.rb +6 -6
  97. data/lib/rubygems/core_ext/kernel_warn.rb +45 -0
  98. data/lib/rubygems/defaults.rb +31 -19
  99. data/lib/rubygems/dependency.rb +15 -15
  100. data/lib/rubygems/dependency_installer.rb +30 -33
  101. data/lib/rubygems/dependency_list.rb +9 -10
  102. data/lib/rubygems/deprecate.rb +2 -3
  103. data/lib/rubygems/doctor.rb +5 -6
  104. data/lib/rubygems/errors.rb +3 -3
  105. data/lib/rubygems/exceptions.rb +11 -8
  106. data/lib/rubygems/ext/build_error.rb +0 -1
  107. data/lib/rubygems/ext/builder.rb +50 -23
  108. data/lib/rubygems/ext/cmake_builder.rb +2 -2
  109. data/lib/rubygems/ext/configure_builder.rb +2 -3
  110. data/lib/rubygems/ext/ext_conf_builder.rb +8 -7
  111. data/lib/rubygems/ext/rake_builder.rb +16 -18
  112. data/lib/rubygems/ext.rb +0 -1
  113. data/lib/rubygems/gem_runner.rb +2 -2
  114. data/lib/rubygems/gemcutter_utilities.rb +46 -12
  115. data/lib/rubygems/indexer.rb +19 -12
  116. data/lib/rubygems/install_default_message.rb +0 -1
  117. data/lib/rubygems/install_message.rb +0 -1
  118. data/lib/rubygems/install_update_options.rb +3 -29
  119. data/lib/rubygems/installer.rb +97 -55
  120. data/lib/rubygems/installer_test_case.rb +2 -16
  121. data/lib/rubygems/local_remote_options.rb +5 -4
  122. data/lib/rubygems/mock_gem_ui.rb +3 -4
  123. data/lib/rubygems/name_tuple.rb +4 -4
  124. data/lib/rubygems/package/digest_io.rb +3 -4
  125. data/lib/rubygems/package/file_source.rb +3 -4
  126. data/lib/rubygems/package/io_source.rb +1 -2
  127. data/lib/rubygems/package/old.rb +8 -16
  128. data/lib/rubygems/package/source.rb +0 -1
  129. data/lib/rubygems/package/tar_header.rb +13 -4
  130. data/lib/rubygems/package/tar_reader/entry.rb +20 -4
  131. data/lib/rubygems/package/tar_reader.rb +2 -4
  132. data/lib/rubygems/package/tar_test_case.rb +2 -8
  133. data/lib/rubygems/package/tar_writer.rb +13 -15
  134. data/lib/rubygems/package.rb +90 -63
  135. data/lib/rubygems/package_task.rb +0 -1
  136. data/lib/rubygems/path_support.rb +16 -6
  137. data/lib/rubygems/platform.rb +4 -5
  138. data/lib/rubygems/psych_tree.rb +1 -1
  139. data/lib/rubygems/rdoc.rb +2 -313
  140. data/lib/rubygems/remote_fetcher.rb +29 -82
  141. data/lib/rubygems/request/connection_pools.rb +24 -13
  142. data/lib/rubygems/request/http_pool.rb +3 -4
  143. data/lib/rubygems/request/https_pool.rb +1 -3
  144. data/lib/rubygems/request.rb +17 -16
  145. data/lib/rubygems/request_set/gem_dependency_api.rb +46 -49
  146. data/lib/rubygems/request_set/lockfile/parser.rb +18 -29
  147. data/lib/rubygems/request_set/lockfile/tokenizer.rb +9 -9
  148. data/lib/rubygems/request_set/lockfile.rb +12 -12
  149. data/lib/rubygems/request_set.rb +52 -25
  150. data/lib/rubygems/requirement.rb +32 -21
  151. data/lib/rubygems/resolver/activation_request.rb +6 -6
  152. data/lib/rubygems/resolver/api_set.rb +5 -6
  153. data/lib/rubygems/resolver/api_specification.rb +2 -3
  154. data/lib/rubygems/resolver/best_set.rb +5 -6
  155. data/lib/rubygems/resolver/composed_set.rb +5 -6
  156. data/lib/rubygems/resolver/conflict.rb +5 -5
  157. data/lib/rubygems/resolver/current_set.rb +1 -2
  158. data/lib/rubygems/resolver/dependency_request.rb +4 -4
  159. data/lib/rubygems/resolver/git_set.rb +5 -6
  160. data/lib/rubygems/resolver/git_specification.rb +4 -5
  161. data/lib/rubygems/resolver/index_set.rb +5 -6
  162. data/lib/rubygems/resolver/index_specification.rb +3 -4
  163. data/lib/rubygems/resolver/installed_specification.rb +3 -4
  164. data/lib/rubygems/resolver/installer_set.rb +12 -12
  165. data/lib/rubygems/resolver/local_specification.rb +1 -2
  166. data/lib/rubygems/resolver/lock_set.rb +5 -6
  167. data/lib/rubygems/resolver/lock_specification.rb +7 -8
  168. data/lib/rubygems/resolver/requirement_list.rb +1 -1
  169. data/lib/rubygems/resolver/set.rb +2 -2
  170. data/lib/rubygems/resolver/source_set.rb +4 -5
  171. data/lib/rubygems/resolver/spec_specification.rb +1 -2
  172. data/lib/rubygems/resolver/specification.rb +10 -7
  173. data/lib/rubygems/resolver/stats.rb +1 -1
  174. data/lib/rubygems/resolver/vendor_set.rb +4 -5
  175. data/lib/rubygems/resolver/vendor_specification.rb +2 -3
  176. data/lib/rubygems/resolver.rb +14 -16
  177. data/lib/rubygems/s3_uri_signer.rb +183 -0
  178. data/lib/rubygems/safe_yaml.rb +18 -10
  179. data/lib/rubygems/security/policies.rb +1 -2
  180. data/lib/rubygems/security/policy.rb +25 -25
  181. data/lib/rubygems/security/signer.rb +72 -24
  182. data/lib/rubygems/security/trust_dir.rb +10 -10
  183. data/lib/rubygems/security.rb +21 -22
  184. data/lib/rubygems/security_option.rb +0 -1
  185. data/lib/rubygems/server.rb +21 -21
  186. data/lib/rubygems/source/git.rb +9 -10
  187. data/lib/rubygems/source/installed.rb +3 -4
  188. data/lib/rubygems/source/local.rb +7 -7
  189. data/lib/rubygems/source/lock.rb +4 -4
  190. data/lib/rubygems/source/specific_file.rb +5 -5
  191. data/lib/rubygems/source/vendor.rb +2 -3
  192. data/lib/rubygems/source.rb +16 -25
  193. data/lib/rubygems/source_list.rb +2 -2
  194. data/lib/rubygems/source_local.rb +0 -1
  195. data/lib/rubygems/spec_fetcher.rb +5 -6
  196. data/lib/rubygems/specification.rb +219 -558
  197. data/lib/rubygems/specification_policy.rb +407 -0
  198. data/lib/rubygems/stub_specification.rb +12 -17
  199. data/lib/rubygems/test_case.rb +161 -75
  200. data/lib/rubygems/test_utilities.rb +20 -35
  201. data/lib/rubygems/text.rb +6 -6
  202. data/lib/rubygems/uninstaller.rb +38 -27
  203. data/lib/rubygems/uri_formatter.rb +1 -2
  204. data/lib/rubygems/user_interaction.rb +37 -89
  205. data/lib/rubygems/util/licenses.rb +27 -1
  206. data/lib/rubygems/util/list.rb +1 -1
  207. data/lib/rubygems/util.rb +32 -14
  208. data/lib/rubygems/validator.rb +4 -5
  209. data/lib/rubygems/version.rb +15 -15
  210. data/lib/rubygems/version_option.rb +2 -3
  211. data/lib/rubygems.rb +71 -102
  212. data/rubygems-update.gemspec +43 -0
  213. data/setup.rb +2 -8
  214. data/test/rubygems/ca_cert.pem +74 -65
  215. data/test/rubygems/client.pem +103 -45
  216. data/test/rubygems/rubygems_plugin.rb +0 -1
  217. data/test/rubygems/simple_gem.rb +1 -1
  218. data/test/rubygems/ssl_cert.pem +78 -17
  219. data/test/rubygems/ssl_key.pem +25 -13
  220. data/test/rubygems/test_bundled_ca.rb +1 -1
  221. data/test/rubygems/test_config.rb +7 -2
  222. data/test/rubygems/test_gem.rb +205 -132
  223. data/test/rubygems/test_gem_bundler_version_finder.rb +4 -0
  224. data/test/rubygems/test_gem_command.rb +0 -1
  225. data/test/rubygems/test_gem_command_manager.rb +18 -3
  226. data/test/rubygems/test_gem_commands_build_command.rb +220 -15
  227. data/test/rubygems/test_gem_commands_cert_command.rb +69 -8
  228. data/test/rubygems/test_gem_commands_check_command.rb +1 -1
  229. data/test/rubygems/test_gem_commands_cleanup_command.rb +27 -1
  230. data/test/rubygems/test_gem_commands_contents_command.rb +1 -2
  231. data/test/rubygems/test_gem_commands_dependency_command.rb +33 -34
  232. data/test/rubygems/test_gem_commands_environment_command.rb +1 -0
  233. data/test/rubygems/test_gem_commands_fetch_command.rb +0 -1
  234. data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -1
  235. data/test/rubygems/test_gem_commands_help_command.rb +7 -4
  236. data/test/rubygems/test_gem_commands_info_command.rb +44 -0
  237. data/test/rubygems/test_gem_commands_install_command.rb +79 -12
  238. data/test/rubygems/test_gem_commands_lock_command.rb +0 -1
  239. data/test/rubygems/test_gem_commands_open_command.rb +29 -0
  240. data/test/rubygems/test_gem_commands_outdated_command.rb +0 -1
  241. data/test/rubygems/test_gem_commands_owner_command.rb +93 -57
  242. data/test/rubygems/test_gem_commands_pristine_command.rb +65 -30
  243. data/test/rubygems/test_gem_commands_push_command.rb +54 -0
  244. data/test/rubygems/test_gem_commands_query_command.rb +102 -100
  245. data/test/rubygems/test_gem_commands_search_command.rb +0 -1
  246. data/test/rubygems/test_gem_commands_server_command.rb +0 -1
  247. data/test/rubygems/test_gem_commands_setup_command.rb +50 -15
  248. data/test/rubygems/test_gem_commands_signin_command.rb +1 -1
  249. data/test/rubygems/test_gem_commands_sources_command.rb +0 -1
  250. data/test/rubygems/test_gem_commands_specification_command.rb +2 -3
  251. data/test/rubygems/test_gem_commands_stale_command.rb +3 -2
  252. data/test/rubygems/test_gem_commands_uninstall_command.rb +161 -8
  253. data/test/rubygems/test_gem_commands_unpack_command.rb +17 -1
  254. data/test/rubygems/test_gem_commands_update_command.rb +19 -2
  255. data/test/rubygems/test_gem_commands_which_command.rb +0 -1
  256. data/test/rubygems/test_gem_commands_yank_command.rb +0 -1
  257. data/test/rubygems/test_gem_config_file.rb +4 -2
  258. data/test/rubygems/test_gem_dependency.rb +0 -1
  259. data/test/rubygems/test_gem_dependency_installer.rb +8 -5
  260. data/test/rubygems/test_gem_dependency_list.rb +6 -7
  261. data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -1
  262. data/test/rubygems/test_gem_doctor.rb +1 -2
  263. data/test/rubygems/test_gem_ext_builder.rb +10 -23
  264. data/test/rubygems/test_gem_ext_cmake_builder.rb +5 -4
  265. data/test/rubygems/test_gem_ext_configure_builder.rb +3 -3
  266. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +8 -9
  267. data/test/rubygems/test_gem_ext_rake_builder.rb +20 -5
  268. data/test/rubygems/test_gem_gem_runner.rb +0 -1
  269. data/test/rubygems/test_gem_gemcutter_utilities.rb +32 -6
  270. data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -1
  271. data/test/rubygems/test_gem_indexer.rb +16 -10
  272. data/test/rubygems/test_gem_install_update_options.rb +1 -20
  273. data/test/rubygems/test_gem_installer.rb +154 -119
  274. data/test/rubygems/test_gem_local_remote_options.rb +3 -3
  275. data/test/rubygems/test_gem_name_tuple.rb +0 -1
  276. data/test/rubygems/test_gem_package.rb +77 -31
  277. data/test/rubygems/test_gem_package_old.rb +0 -1
  278. data/test/rubygems/test_gem_package_tar_header.rb +42 -2
  279. data/test/rubygems/test_gem_package_tar_reader.rb +0 -1
  280. data/test/rubygems/test_gem_package_tar_reader_entry.rb +11 -0
  281. data/test/rubygems/test_gem_package_tar_writer.rb +43 -7
  282. data/test/rubygems/test_gem_package_task.rb +2 -2
  283. data/test/rubygems/test_gem_path_support.rb +28 -11
  284. data/test/rubygems/test_gem_platform.rb +4 -5
  285. data/test/rubygems/test_gem_rdoc.rb +1 -136
  286. data/test/rubygems/test_gem_remote_fetcher.rb +241 -141
  287. data/test/rubygems/test_gem_request.rb +9 -9
  288. data/test/rubygems/test_gem_request_connection_pools.rb +24 -3
  289. data/test/rubygems/test_gem_request_set.rb +5 -5
  290. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +82 -64
  291. data/test/rubygems/test_gem_request_set_lockfile.rb +1 -2
  292. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +4 -9
  293. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +1 -1
  294. data/test/rubygems/test_gem_requirement.rb +24 -4
  295. data/test/rubygems/test_gem_resolver.rb +13 -17
  296. data/test/rubygems/test_gem_resolver_activation_request.rb +0 -1
  297. data/test/rubygems/test_gem_resolver_api_set.rb +0 -1
  298. data/test/rubygems/test_gem_resolver_api_specification.rb +0 -1
  299. data/test/rubygems/test_gem_resolver_best_set.rb +0 -1
  300. data/test/rubygems/test_gem_resolver_composed_set.rb +0 -1
  301. data/test/rubygems/test_gem_resolver_conflict.rb +0 -1
  302. data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -1
  303. data/test/rubygems/test_gem_resolver_git_set.rb +0 -1
  304. data/test/rubygems/test_gem_resolver_git_specification.rb +0 -1
  305. data/test/rubygems/test_gem_resolver_index_set.rb +0 -1
  306. data/test/rubygems/test_gem_resolver_index_specification.rb +0 -1
  307. data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -1
  308. data/test/rubygems/test_gem_resolver_installer_set.rb +2 -3
  309. data/test/rubygems/test_gem_resolver_local_specification.rb +0 -1
  310. data/test/rubygems/test_gem_resolver_lock_set.rb +0 -1
  311. data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -1
  312. data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -1
  313. data/test/rubygems/test_gem_resolver_specification.rb +1 -2
  314. data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -1
  315. data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -1
  316. data/test/rubygems/test_gem_security.rb +1 -3
  317. data/test/rubygems/test_gem_security_policy.rb +5 -6
  318. data/test/rubygems/test_gem_security_signer.rb +4 -3
  319. data/test/rubygems/test_gem_security_trust_dir.rb +1 -2
  320. data/test/rubygems/test_gem_server.rb +4 -4
  321. data/test/rubygems/test_gem_source.rb +0 -13
  322. data/test/rubygems/test_gem_source_fetch_problem.rb +0 -1
  323. data/test/rubygems/test_gem_source_git.rb +0 -1
  324. data/test/rubygems/test_gem_source_installed.rb +0 -1
  325. data/test/rubygems/test_gem_source_lock.rb +0 -1
  326. data/test/rubygems/test_gem_source_vendor.rb +0 -1
  327. data/test/rubygems/test_gem_spec_fetcher.rb +0 -1
  328. data/test/rubygems/test_gem_specification.rb +366 -198
  329. data/test/rubygems/test_gem_stream_ui.rb +15 -32
  330. data/test/rubygems/test_gem_stub_specification.rb +0 -2
  331. data/test/rubygems/test_gem_text.rb +4 -0
  332. data/test/rubygems/test_gem_uninstaller.rb +42 -3
  333. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -1
  334. data/test/rubygems/test_gem_uri_formatter.rb +0 -1
  335. data/test/rubygems/test_gem_util.rb +31 -11
  336. data/test/rubygems/test_gem_validator.rb +0 -1
  337. data/test/rubygems/test_gem_version.rb +11 -11
  338. data/test/rubygems/test_gem_version_option.rb +0 -1
  339. data/test/rubygems/test_remote_fetch_error.rb +0 -1
  340. data/test/rubygems/test_require.rb +67 -52
  341. data/util/CL2notes +1 -2
  342. data/util/ci +20 -12
  343. data/util/cops/deprecations.rb +52 -0
  344. data/util/create_certs.rb +6 -7
  345. data/util/create_certs.sh +27 -0
  346. data/util/create_encrypted_key.rb +4 -5
  347. data/util/patch_with_prs.rb +1 -1
  348. data/util/rubocop +8 -0
  349. data/util/update_bundled_ca_certificates.rb +12 -13
  350. data/util/update_changelog.rb +1 -1
  351. metadata +61 -51
  352. data/.autotest +0 -71
  353. data/.document +0 -5
  354. data/CONTRIBUTING.rdoc +0 -130
  355. data/CVE-2013-4287.txt +0 -35
  356. data/CVE-2013-4363.txt +0 -45
  357. data/CVE-2015-3900.txt +0 -40
  358. data/POLICIES.rdoc +0 -74
  359. data/test/rubygems/fix_openssl_warnings.rb +0 -13
@@ -25,23 +25,17 @@ class Gem::FakeFetcher
25
25
 
26
26
  attr_reader :data
27
27
  attr_reader :last_request
28
- attr_reader :api_endpoints
29
28
  attr_accessor :paths
30
29
 
31
30
  def initialize
32
31
  @data = {}
33
32
  @paths = []
34
- @api_endpoints = {}
35
- end
36
-
37
- def api_endpoint(uri)
38
- @api_endpoints[uri] || uri
39
33
  end
40
34
 
41
35
  def find_data(path)
42
36
  return File.read path.path if URI === path and 'file' == path.scheme
43
37
 
44
- if URI === path and "URI::#{path.scheme.upcase}" != path.class.name then
38
+ if URI === path and "URI::#{path.scheme.upcase}" != path.class.name
45
39
  raise ArgumentError,
46
40
  "mismatch for scheme #{path.scheme} and class #{path.class}"
47
41
  end
@@ -50,20 +44,20 @@ class Gem::FakeFetcher
50
44
  @paths << path
51
45
  raise ArgumentError, 'need full URI' unless path =~ %r'^https?://'
52
46
 
53
- unless @data.key? path then
47
+ unless @data.key? path
54
48
  raise Gem::RemoteFetcher::FetchError.new("no data for #{path}", path)
55
49
  end
56
50
 
57
51
  @data[path]
58
52
  end
59
53
 
60
- def fetch_path path, mtime = nil, head = false
54
+ def fetch_path(path, mtime = nil, head = false)
61
55
  data = find_data(path)
62
56
 
63
- if data.respond_to?(:call) then
57
+ if data.respond_to?(:call)
64
58
  data.call
65
59
  else
66
- if path.to_s =~ /gz$/ and not data.nil? and not data.empty? then
60
+ if path.to_s =~ /gz$/ and not data.nil? and not data.empty?
67
61
  data = Gem::Util.gunzip data
68
62
  end
69
63
 
@@ -71,7 +65,7 @@ class Gem::FakeFetcher
71
65
  end
72
66
  end
73
67
 
74
- def cache_update_path uri, path = nil, update = true
68
+ def cache_update_path(uri, path = nil, update = true)
75
69
  if data = fetch_path(uri)
76
70
  open(path, 'wb') { |io| io.write data } if path and update
77
71
  data
@@ -93,7 +87,7 @@ class Gem::FakeFetcher
93
87
 
94
88
  def request(uri, request_class, last_modified = nil)
95
89
  data = find_data(uri)
96
- body, code, msg = data
90
+ body, code, msg = (data.respond_to?(:call) ? data.call : data)
97
91
 
98
92
  @last_request = request_class.new uri.request_uri
99
93
  yield @last_request if block_given?
@@ -104,21 +98,13 @@ class Gem::FakeFetcher
104
98
  response
105
99
  end
106
100
 
107
- def pretty_print q # :nodoc:
101
+ def pretty_print(q) # :nodoc:
108
102
  q.group 2, '[FakeFetcher', ']' do
109
103
  q.breakable
110
104
  q.text 'URIs:'
111
105
 
112
106
  q.breakable
113
107
  q.pp @data.keys
114
-
115
- unless @api_endpoints.empty? then
116
- q.breakable
117
- q.text 'API endpoints:'
118
-
119
- q.breakable
120
- q.pp @api_endpoints.keys
121
- end
122
108
  end
123
109
  end
124
110
 
@@ -128,7 +114,7 @@ class Gem::FakeFetcher
128
114
 
129
115
  raise ArgumentError, 'need full URI' unless path =~ %r'^http://'
130
116
 
131
- unless @data.key? path then
117
+ unless @data.key? path
132
118
  raise Gem::RemoteFetcher::FetchError.new("no data for #{path}", path)
133
119
  end
134
120
 
@@ -137,9 +123,9 @@ class Gem::FakeFetcher
137
123
  data.respond_to?(:call) ? data.call : data.length
138
124
  end
139
125
 
140
- def download spec, source_uri, install_dir = Gem.dir
126
+ def download(spec, source_uri, install_dir = Gem.dir)
141
127
  name = File.basename spec.cache_file
142
- path = if Dir.pwd == install_dir then # see fetch_command
128
+ path = if Dir.pwd == install_dir # see fetch_command
143
129
  install_dir
144
130
  else
145
131
  File.join install_dir, "cache"
@@ -147,7 +133,7 @@ class Gem::FakeFetcher
147
133
 
148
134
  path = File.join path, name
149
135
 
150
- if source_uri =~ /^http/ then
136
+ if source_uri =~ /^http/
151
137
  File.open(path, "wb") do |f|
152
138
  f.write fetch_path(File.join(source_uri, "gems", name))
153
139
  end
@@ -158,7 +144,7 @@ class Gem::FakeFetcher
158
144
  path
159
145
  end
160
146
 
161
- def download_to_cache dependency
147
+ def download_to_cache(dependency)
162
148
  found, _ = Gem::SpecFetcher.fetcher.spec_for_dependency dependency
163
149
 
164
150
  return if found.empty?
@@ -201,7 +187,7 @@ class Gem::TestCase::SpecFetcherSetup
201
187
  # Executes a SpecFetcher setup block. Yields an instance then creates the
202
188
  # gems and specifications defined in the instance.
203
189
 
204
- def self.declare test, repository
190
+ def self.declare(test, repository)
205
191
  setup = new test, repository
206
192
 
207
193
  yield setup
@@ -209,7 +195,7 @@ class Gem::TestCase::SpecFetcherSetup
209
195
  setup.execute
210
196
  end
211
197
 
212
- def initialize test, repository # :nodoc:
198
+ def initialize(test, repository) # :nodoc:
213
199
  @test = test
214
200
  @repository = repository
215
201
 
@@ -277,7 +263,7 @@ class Gem::TestCase::SpecFetcherSetup
277
263
  # The specification will be yielded before gem creation for customization,
278
264
  # but only the block or the dependencies may be set, not both.
279
265
 
280
- def gem name, version, dependencies = nil, &block
266
+ def gem(name, version, dependencies = nil, &block)
281
267
  @operations << [:gem, name, version, dependencies, block]
282
268
  end
283
269
 
@@ -288,7 +274,7 @@ class Gem::TestCase::SpecFetcherSetup
288
274
  # The specification will be yielded before gem creation for customization,
289
275
  # but only the block or the dependencies may be set, not both.
290
276
 
291
- def download name, version, dependencies = nil, &block
277
+ def download(name, version, dependencies = nil, &block)
292
278
  @operations << [:download, name, version, dependencies, block]
293
279
  end
294
280
 
@@ -307,7 +293,7 @@ class Gem::TestCase::SpecFetcherSetup
307
293
  require 'socket'
308
294
  require 'rubygems/remote_fetcher'
309
295
 
310
- unless @test.fetcher then
296
+ unless @test.fetcher
311
297
  @test.fetcher = Gem::FakeFetcher.new
312
298
  Gem::RemoteFetcher.fetcher = @test.fetcher
313
299
  end
@@ -341,11 +327,11 @@ class Gem::TestCase::SpecFetcherSetup
341
327
  # The specification will be yielded before creation for customization,
342
328
  # but only the block or the dependencies may be set, not both.
343
329
 
344
- def spec name, version, dependencies = nil, &block
330
+ def spec(name, version, dependencies = nil, &block)
345
331
  @operations << [:spec, name, version, dependencies, block]
346
332
  end
347
333
 
348
- def write_spec spec # :nodoc:
334
+ def write_spec(spec) # :nodoc:
349
335
  File.open spec.spec_file, 'w' do |io|
350
336
  io.write spec.to_ruby_for_cache
351
337
  end
@@ -381,4 +367,3 @@ class TempIO < Tempfile
381
367
  Gem.read_binary path
382
368
  end
383
369
  end
384
-
data/lib/rubygems/text.rb CHANGED
@@ -28,7 +28,7 @@ module Gem::Text
28
28
  work = clean_text(text)
29
29
 
30
30
  while work.length > wrap do
31
- if work =~ /^(.{0,#{wrap}})[ \n]/ then
31
+ if work =~ /^(.{0,#{wrap}})[ \n]/
32
32
  result << $1.rstrip
33
33
  work.slice!(0, $&.length)
34
34
  else
@@ -40,10 +40,10 @@ module Gem::Text
40
40
  result.join("\n").gsub(/^/, " " * indent)
41
41
  end
42
42
 
43
- def min3 a, b, c # :nodoc:
44
- if a < b && a < c then
43
+ def min3(a, b, c) # :nodoc:
44
+ if a < b && a < c
45
45
  a
46
- elsif b < c then
46
+ elsif b < c
47
47
  b
48
48
  else
49
49
  c
@@ -52,7 +52,7 @@ module Gem::Text
52
52
 
53
53
  # This code is based directly on the Text gem implementation
54
54
  # Returns a value representing the "cost" of transforming str1 into str2
55
- def levenshtein_distance str1, str2
55
+ def levenshtein_distance(str1, str2)
56
56
  s = str1
57
57
  t = str2
58
58
  n = s.length
@@ -73,7 +73,7 @@ module Gem::Text
73
73
  d[j+1] + 1, # insertion
74
74
  e + 1, # deletion
75
75
  d[j] + cost # substitution
76
- )
76
+ )
77
77
  d[j] = e
78
78
  e = x
79
79
  end
@@ -46,7 +46,7 @@ class Gem::Uninstaller
46
46
  # TODO document the valid options
47
47
  @gem = gem
48
48
  @version = options[:version] || Gem::Requirement.default
49
- @gem_home = File.expand_path(options[:install_dir] || Gem.dir)
49
+ @gem_home = File.realpath(options[:install_dir] || Gem.dir)
50
50
  @force_executables = options[:executables]
51
51
  @force_all = options[:all]
52
52
  @force_ignore = options[:ignore]
@@ -99,7 +99,7 @@ class Gem::Uninstaller
99
99
 
100
100
  list.sort!
101
101
 
102
- if list.empty? then
102
+ if list.empty?
103
103
  if other_repo_specs.empty?
104
104
  if default_specs.empty?
105
105
  raise Gem::InstallError, "gem #{@gem.inspect} is not installed"
@@ -119,19 +119,19 @@ class Gem::Uninstaller
119
119
  }
120
120
 
121
121
  raise Gem::InstallError, message.join("\n")
122
- elsif @force_all then
122
+ elsif @force_all
123
123
  remove_all list
124
124
 
125
- elsif list.size > 1 then
125
+ elsif list.size > 1
126
126
  gem_names = list.map { |gem| gem.full_name }
127
127
  gem_names << "All versions"
128
128
 
129
129
  say
130
130
  _, index = choose_from_list "Select gem to uninstall:", gem_names
131
131
 
132
- if index == list.size then
132
+ if index == list.size
133
133
  remove_all list
134
- elsif index >= 0 && index < list.size then
134
+ elsif index >= 0 && index < list.size
135
135
  uninstall_gem list[index]
136
136
  else
137
137
  say "Error: must enter a number [1-#{list.size+1}]"
@@ -194,7 +194,7 @@ class Gem::Uninstaller
194
194
 
195
195
  executables = executables.map { |exec| formatted_program_filename exec }
196
196
 
197
- remove = if @force_executables.nil? then
197
+ remove = if @force_executables.nil?
198
198
  ask_yes_no("Remove executables:\n" +
199
199
  "\t#{executables.join ', '}\n\n" +
200
200
  "in addition to the gem?",
@@ -203,7 +203,7 @@ class Gem::Uninstaller
203
203
  @force_executables
204
204
  end
205
205
 
206
- if remove then
206
+ if remove
207
207
  bin_dir = @bin_dir || Gem.bindir(spec.base_dir)
208
208
 
209
209
  raise Gem::FilePermissionError, bin_dir unless File.writable? bin_dir
@@ -213,8 +213,8 @@ class Gem::Uninstaller
213
213
 
214
214
  exe_file = File.join bin_dir, exe_name
215
215
 
216
- FileUtils.rm_f exe_file
217
- FileUtils.rm_f "#{exe_file}.bat"
216
+ safe_delete { FileUtils.rm exe_file }
217
+ safe_delete { FileUtils.rm "#{exe_file}.bat" }
218
218
  end
219
219
  else
220
220
  say "Executables and scripts will remain installed."
@@ -239,7 +239,7 @@ class Gem::Uninstaller
239
239
 
240
240
  def remove(spec)
241
241
  unless path_ok?(@gem_home, spec) or
242
- (@user_install and path_ok?(Gem.user_dir, spec)) then
242
+ (@user_install and path_ok?(Gem.user_dir, spec))
243
243
  e = Gem::GemNotInHomeException.new \
244
244
  "Gem '#{spec.full_name}' is not installed in directory #{@gem_home}"
245
245
  e.spec = spec
@@ -250,26 +250,26 @@ class Gem::Uninstaller
250
250
  raise Gem::FilePermissionError, spec.base_dir unless
251
251
  File.writable?(spec.base_dir)
252
252
 
253
- FileUtils.rm_rf spec.full_gem_path
254
- FileUtils.rm_rf spec.extension_dir
253
+ safe_delete { FileUtils.rm_r spec.full_gem_path }
254
+ safe_delete { FileUtils.rm_r spec.extension_dir }
255
255
 
256
256
  old_platform_name = spec.original_name
257
- gemspec = spec.spec_file
258
-
259
- unless File.exist? gemspec then
260
- gemspec = File.join(File.dirname(gemspec), "#{old_platform_name}.gemspec")
261
- end
262
-
263
- FileUtils.rm_rf gemspec
264
257
 
265
258
  gem = spec.cache_file
266
259
  gem = File.join(spec.cache_dir, "#{old_platform_name}.gem") unless
267
260
  File.exist? gem
268
261
 
269
- FileUtils.rm_rf gem
262
+ safe_delete { FileUtils.rm_r gem }
270
263
 
271
264
  Gem::RDoc.new(spec).remove
272
265
 
266
+ gemspec = spec.spec_file
267
+
268
+ unless File.exist? gemspec
269
+ gemspec = File.join(File.dirname(gemspec), "#{old_platform_name}.gemspec")
270
+ end
271
+
272
+ safe_delete { FileUtils.rm_r gemspec }
273
273
  say "Successfully uninstalled #{spec.full_name}"
274
274
 
275
275
  Gem::Specification.reset
@@ -289,7 +289,7 @@ class Gem::Uninstaller
289
289
  # Returns true if it is OK to remove +spec+ or this is a forced
290
290
  # uninstallation.
291
291
 
292
- def dependencies_ok? spec # :nodoc:
292
+ def dependencies_ok?(spec) # :nodoc:
293
293
  return true if @force_ignore
294
294
 
295
295
  deplist = Gem::DependencyList.from_specs
@@ -308,15 +308,15 @@ class Gem::Uninstaller
308
308
  ##
309
309
  # Asks if it is OK to remove +spec+. Returns true if it is OK.
310
310
 
311
- def ask_if_ok spec # :nodoc:
311
+ def ask_if_ok(spec) # :nodoc:
312
312
  msg = ['']
313
313
  msg << 'You have requested to uninstall the gem:'
314
314
  msg << "\t#{spec.full_name}"
315
315
  msg << ''
316
316
 
317
317
  siblings = Gem::Specification.select do |s|
318
- s.name == spec.name && s.full_name != spec.full_name
319
- end
318
+ s.name == spec.name && s.full_name != spec.full_name
319
+ end
320
320
 
321
321
  spec.dependent_gems.each do |dep_spec, dep, satlist|
322
322
  unless siblings.any? { |s| s.satisfies_requirement? dep }
@@ -332,15 +332,26 @@ class Gem::Uninstaller
332
332
  ##
333
333
  # Returns the formatted version of the executable +filename+
334
334
 
335
- def formatted_program_filename filename # :nodoc:
335
+ def formatted_program_filename(filename) # :nodoc:
336
336
  # TODO perhaps the installer should leave a small manifest
337
337
  # of what it did for us to find rather than trying to recreate
338
338
  # it again.
339
- if @format_executable then
339
+ if @format_executable
340
340
  require 'rubygems/installer'
341
341
  Gem::Installer.exec_format % File.basename(filename)
342
342
  else
343
343
  filename
344
344
  end
345
345
  end
346
+
347
+ def safe_delete(&block)
348
+ block.call
349
+ rescue Errno::ENOENT
350
+ nil
351
+ rescue Errno::EPERM
352
+ e = Gem::UninstallError.new
353
+ e.spec = @spec
354
+
355
+ raise e
356
+ end
346
357
  end
@@ -19,7 +19,7 @@ class Gem::UriFormatter
19
19
  ##
20
20
  # Creates a new URI formatter for +uri+.
21
21
 
22
- def initialize uri
22
+ def initialize(uri)
23
23
  @uri = uri
24
24
  end
25
25
 
@@ -47,4 +47,3 @@ class Gem::UriFormatter
47
47
  end
48
48
 
49
49
  end
50
-
@@ -98,7 +98,7 @@ module Gem::UserInteraction
98
98
  ##
99
99
  # Displays an alert +statement+. Asks a +question+ if given.
100
100
 
101
- def alert statement, question = nil
101
+ def alert(statement, question = nil)
102
102
  ui.alert statement, question
103
103
  end
104
104
 
@@ -106,7 +106,7 @@ module Gem::UserInteraction
106
106
  # Displays an error +statement+ to the error output location. Asks a
107
107
  # +question+ if given.
108
108
 
109
- def alert_error statement, question = nil
109
+ def alert_error(statement, question = nil)
110
110
  ui.alert_error statement, question
111
111
  end
112
112
 
@@ -114,49 +114,49 @@ module Gem::UserInteraction
114
114
  # Displays a warning +statement+ to the warning output location. Asks a
115
115
  # +question+ if given.
116
116
 
117
- def alert_warning statement, question = nil
117
+ def alert_warning(statement, question = nil)
118
118
  ui.alert_warning statement, question
119
119
  end
120
120
 
121
121
  ##
122
122
  # Asks a +question+ and returns the answer.
123
123
 
124
- def ask question
124
+ def ask(question)
125
125
  ui.ask question
126
126
  end
127
127
 
128
128
  ##
129
129
  # Asks for a password with a +prompt+
130
130
 
131
- def ask_for_password prompt
131
+ def ask_for_password(prompt)
132
132
  ui.ask_for_password prompt
133
133
  end
134
134
 
135
135
  ##
136
136
  # Asks a yes or no +question+. Returns true for yes, false for no.
137
137
 
138
- def ask_yes_no question, default = nil
138
+ def ask_yes_no(question, default = nil)
139
139
  ui.ask_yes_no question, default
140
140
  end
141
141
 
142
142
  ##
143
143
  # Asks the user to answer +question+ with an answer from the given +list+.
144
144
 
145
- def choose_from_list question, list
145
+ def choose_from_list(question, list)
146
146
  ui.choose_from_list question, list
147
147
  end
148
148
 
149
149
  ##
150
150
  # Displays the given +statement+ on the standard output (or equivalent).
151
151
 
152
- def say statement = ''
152
+ def say(statement = '')
153
153
  ui.say statement
154
154
  end
155
155
 
156
156
  ##
157
157
  # Terminates the RubyGems process with the given +exit_code+
158
158
 
159
- def terminate_interaction exit_code = 0
159
+ def terminate_interaction(exit_code = 0)
160
160
  ui.terminate_interaction exit_code
161
161
  end
162
162
 
@@ -208,18 +208,14 @@ class Gem::StreamUI
208
208
  # Returns true if TTY methods should be used on this StreamUI.
209
209
 
210
210
  def tty?
211
- if RUBY_VERSION < '1.9.3' and RUBY_PLATFORM =~ /mingw|mswin/ then
212
- @usetty
213
- else
214
- @usetty && @ins.tty?
215
- end
211
+ @usetty && @ins.tty?
216
212
  end
217
213
 
218
214
  ##
219
215
  # Prints a formatted backtrace to the errors stream if backtraces are
220
216
  # enabled.
221
217
 
222
- def backtrace exception
218
+ def backtrace(exception)
223
219
  return unless Gem.configuration.backtrace
224
220
 
225
221
  @errs.puts "\t#{exception.backtrace.join "\n\t"}"
@@ -254,8 +250,8 @@ class Gem::StreamUI
254
250
  # default.
255
251
 
256
252
  def ask_yes_no(question, default=nil)
257
- unless tty? then
258
- if default.nil? then
253
+ unless tty?
254
+ if default.nil?
259
255
  raise Gem::OperationNotSupportedError,
260
256
  "Not connected to a tty and no default specified"
261
257
  else
@@ -327,29 +323,7 @@ class Gem::StreamUI
327
323
 
328
324
  def _gets_noecho
329
325
  require_io_console
330
- if IO.method_defined?(:noecho) then
331
- @ins.noecho {@ins.gets}
332
- elsif Gem.win_platform?
333
- require "Win32API"
334
- password = ''
335
-
336
- while char = Win32API.new("crtdll", "_getch", [ ], "L").Call do
337
- break if char == 10 || char == 13 # received carriage return or newline
338
- if char == 127 || char == 8 # backspace and delete
339
- password.slice!(-1, 1)
340
- else
341
- password << char.chr
342
- end
343
- end
344
- password
345
- else
346
- system "stty -echo"
347
- begin
348
- @ins.gets
349
- ensure
350
- system "stty echo"
351
- end
352
- end
326
+ @ins.noecho {@ins.gets}
353
327
  end
354
328
 
355
329
  ##
@@ -541,11 +515,10 @@ class Gem::StreamUI
541
515
  # Return a download reporter object chosen from the current verbosity
542
516
 
543
517
  def download_reporter(*args)
544
- case Gem.configuration.verbose
545
- when nil, false
518
+ if [nil, false].include?(Gem.configuration.verbose) || !@outs.tty?
546
519
  SilentDownloadReporter.new(@outs, *args)
547
520
  else
548
- VerboseDownloadReporter.new(@outs, *args)
521
+ ThreadedDownloadReporter.new(@outs, *args)
549
522
  end
550
523
  end
551
524
 
@@ -582,9 +555,11 @@ class Gem::StreamUI
582
555
  end
583
556
 
584
557
  ##
585
- # A progress reporter that prints out messages about the current progress.
558
+ # A progress reporter that behaves nicely with threaded downloading.
559
+
560
+ class ThreadedDownloadReporter
586
561
 
587
- class VerboseDownloadReporter
562
+ MUTEX = Mutex.new
588
563
 
589
564
  ##
590
565
  # The current file name being displayed
@@ -592,71 +567,44 @@ class Gem::StreamUI
592
567
  attr_reader :file_name
593
568
 
594
569
  ##
595
- # The total bytes in the file
596
-
597
- attr_reader :total_bytes
598
-
599
- ##
600
- # The current progress (0 to 100)
601
-
602
- attr_reader :progress
603
-
604
- ##
605
- # Creates a new verbose download reporter that will display on
570
+ # Creates a new threaded download reporter that will display on
606
571
  # +out_stream+. The other arguments are ignored.
607
572
 
608
573
  def initialize(out_stream, *args)
574
+ @file_name = nil
609
575
  @out = out_stream
610
- @progress = 0
611
576
  end
612
577
 
613
578
  ##
614
- # Tells the download reporter that the +file_name+ is being fetched and
615
- # contains +total_bytes+.
616
-
617
- def fetch(file_name, total_bytes)
618
- @file_name = file_name
619
- @total_bytes = total_bytes.to_i
620
- @units = @total_bytes.zero? ? 'B' : '%'
579
+ # Tells the download reporter that the +file_name+ is being fetched.
580
+ # The other arguments are ignored.
621
581
 
622
- update_display(false)
582
+ def fetch(file_name, *args)
583
+ if @file_name.nil?
584
+ @file_name = file_name
585
+ locked_puts "Fetching #{@file_name}"
586
+ end
623
587
  end
624
588
 
625
589
  ##
626
- # Updates the verbose download reporter for the given number of +bytes+.
590
+ # Updates the threaded download reporter for the given number of +bytes+.
627
591
 
628
592
  def update(bytes)
629
- new_progress = if @units == 'B' then
630
- bytes
631
- else
632
- ((bytes.to_f * 100) / total_bytes.to_f).ceil
633
- end
634
-
635
- return if new_progress == @progress
636
-
637
- @progress = new_progress
638
- update_display
593
+ # Do nothing.
639
594
  end
640
595
 
641
596
  ##
642
597
  # Indicates the download is complete.
643
598
 
644
599
  def done
645
- @progress = 100 if @units == '%'
646
- update_display(true, true)
600
+ # Do nothing.
647
601
  end
648
602
 
649
603
  private
650
-
651
- def update_display(show_progress = true, new_line = false) # :nodoc:
652
- return unless @out.tty?
653
-
654
- if show_progress then
655
- @out.print "\rFetching: %s (%3d%s)" % [@file_name, @progress, @units]
656
- else
657
- @out.print "Fetching: %s" % @file_name
604
+ def locked_puts(message)
605
+ MUTEX.synchronize do
606
+ @out.puts message
658
607
  end
659
- @out.puts if new_line
660
608
  end
661
609
  end
662
610
  end
@@ -687,8 +635,8 @@ class Gem::SilentUI < Gem::StreamUI
687
635
  def initialize
688
636
  reader, writer = nil, nil
689
637
 
690
- reader = File.open(Gem::Util::NULL_DEVICE, 'r')
691
- writer = File.open(Gem::Util::NULL_DEVICE, 'w')
638
+ reader = File.open(IO::NULL, 'r')
639
+ writer = File.open(IO::NULL, 'w')
692
640
 
693
641
  super reader, writer, writer, false
694
642
  end