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
@@ -0,0 +1,23 @@
1
+ bundle-remove(1) -- Removes gems from the Gemfile
2
+ ===========================================================================
3
+
4
+ ## SYNOPSIS
5
+
6
+ `bundle remove [GEM [GEM ...]] [--install]`
7
+
8
+ ## DESCRIPTION
9
+
10
+ Removes the given gems from the Gemfile while ensuring that the resulting Gemfile is still valid. If a gem cannot be removed, a warning is printed. If a gem is already absent from the Gemfile, and error is raised.
11
+
12
+ ## OPTIONS
13
+
14
+ * `--install`:
15
+ Runs `bundle install` after the given gems have been removed from the Gemfile, which ensures that both the lockfile and the installed gems on disk are also updated to remove the given gem(s).
16
+
17
+ Example:
18
+
19
+ bundle remove rails
20
+
21
+ bundle remove rails rack
22
+
23
+ bundle remove rails rack --install
@@ -65,7 +65,7 @@ gem.
65
65
  Only output warnings and errors.
66
66
 
67
67
  * `--force`:
68
- Force downloading every gem.
68
+ Force downloading every gem. `--redownload` is an alias of this option.
69
69
 
70
70
  * `--patch`:
71
71
  Prefer updating only to next patch version.
@@ -94,6 +94,9 @@ We divide `bundle` subcommands into primary commands and utilities:
94
94
  * [`bundle doctor(1)`](bundle-doctor.1.html):
95
95
  Display warnings about common problems
96
96
 
97
+ * [`bundle remove(1)`](bundle-remove.1.html):
98
+ Removes gems from the Gemfile
99
+
97
100
  ## PLUGINS
98
101
 
99
102
  When running a command that isn't listed in PRIMARY COMMANDS or UTILITIES,
@@ -103,7 +103,7 @@ class Gem::AvailableSet
103
103
  # Other options are :shallow for only direct development dependencies of the
104
104
  # gems in this set or :all for all development dependencies.
105
105
 
106
- def to_request_set development = :none
106
+ def to_request_set(development = :none)
107
107
  request_set = Gem::RequestSet.new
108
108
  request_set.development = :all == development
109
109
 
@@ -65,10 +65,10 @@ class Gem::BasicSpecification
65
65
  ##
66
66
  # Return true if this spec can require +file+.
67
67
 
68
- def contains_requirable_file? file
69
- if @ignored then
68
+ def contains_requirable_file?(file)
69
+ if @ignored
70
70
  return false
71
- elsif missing_extensions? then
71
+ elsif missing_extensions?
72
72
  @ignored = true
73
73
 
74
74
  warn "Ignoring #{full_name} because its extensions are not built. " +
@@ -124,7 +124,7 @@ class Gem::BasicSpecification
124
124
  # default Ruby platform.
125
125
 
126
126
  def full_name
127
- if platform == Gem::Platform::RUBY or platform.nil? then
127
+ if platform == Gem::Platform::RUBY or platform.nil?
128
128
  "#{name}-#{version}".dup.untaint
129
129
  else
130
130
  "#{name}-#{version}-#{platform}".dup.untaint
@@ -152,7 +152,7 @@ class Gem::BasicSpecification
152
152
  # The path to the data directory for this gem.
153
153
 
154
154
  def datadir
155
- # TODO: drop the extra ", gem_name" which is uselessly redundant
155
+ # TODO: drop the extra ", gem_name" which is uselessly redundant
156
156
  File.expand_path(File.join(gems_dir, full_name, "data", name)).untaint
157
157
  end
158
158
 
@@ -160,8 +160,8 @@ class Gem::BasicSpecification
160
160
  # Full path of the target library file.
161
161
  # If the file is not in this gem, return nil.
162
162
 
163
- def to_fullpath path
164
- if activated? then
163
+ def to_fullpath(path)
164
+ if activated?
165
165
  @paths_map ||= {}
166
166
  @paths_map[path] ||=
167
167
  begin
@@ -249,7 +249,7 @@ class Gem::BasicSpecification
249
249
  def source_paths
250
250
  paths = raw_require_paths.dup
251
251
 
252
- if have_extensions? then
252
+ if have_extensions?
253
253
  ext_dirs = extensions.map do |extension|
254
254
  extension.split(File::SEPARATOR, 2).first
255
255
  end.uniq
@@ -263,7 +263,7 @@ class Gem::BasicSpecification
263
263
  ##
264
264
  # Return all files in this gem that match for +glob+.
265
265
 
266
- def matches_for_glob glob # TODO: rename?
266
+ def matches_for_glob(glob) # TODO: rename?
267
267
  # TODO: do we need these?? Kill it
268
268
  glob = File.join(self.lib_dirs_glob, glob)
269
269
 
@@ -276,13 +276,13 @@ class Gem::BasicSpecification
276
276
 
277
277
  def lib_dirs_glob
278
278
  dirs = if self.raw_require_paths
279
- if self.raw_require_paths.size > 1 then
279
+ if self.raw_require_paths.size > 1
280
280
  "{#{self.raw_require_paths.join(',')}}"
281
281
  else
282
282
  self.raw_require_paths.first
283
283
  end
284
284
  else
285
- "lib" # default value for require_paths for bundler/inline
285
+ "lib" # default value for require_paths for bundler/inline
286
286
  end
287
287
 
288
288
  "#{self.full_gem_path}/#{dirs}".dup.untaint
@@ -316,7 +316,7 @@ class Gem::BasicSpecification
316
316
 
317
317
  def have_extensions?; !extensions.empty?; end
318
318
 
319
- def have_file? file, suffixes
319
+ def have_file?(file, suffixes)
320
320
  return true if raw_require_paths.any? do |path|
321
321
  base = File.join(gems_dir, full_name, path.untaint, file).untaint
322
322
  suffixes.any? { |suf| File.file? base + suf }
@@ -87,9 +87,9 @@ To install the missing version, run `gem install bundler:#{vr.first}`
87
87
  return unless gemfile
88
88
 
89
89
  lockfile = case gemfile
90
- when "gems.rb" then "gems.locked"
91
- else "#{gemfile}.lock"
92
- end.dup.untaint
90
+ when "gems.rb" then "gems.locked"
91
+ else "#{gemfile}.lock"
92
+ end.dup.untaint
93
93
 
94
94
  return unless File.file?(lockfile)
95
95
 
@@ -152,16 +152,24 @@ class Gem::Command
152
152
  #--
153
153
  # TODO: replace +domain+ with a parameter to suppress suggestions
154
154
 
155
- def show_lookup_failure(gem_name, version, errors, domain)
155
+ def show_lookup_failure(gem_name, version, errors, domain, required_by = nil)
156
+ gem = "'#{gem_name}' (#{version})"
157
+ msg = String.new "Could not find a valid gem #{gem}"
158
+
156
159
  if errors and !errors.empty?
157
- msg = "Could not find a valid gem '#{gem_name}' (#{version}), here is why:\n".dup
160
+ msg << ", here is why:\n"
158
161
  errors.each { |x| msg << " #{x.wordy}\n" }
159
- alert_error msg
160
162
  else
161
- alert_error "Could not find a valid gem '#{gem_name}' (#{version}) in any repository"
163
+ if required_by and gem != required_by
164
+ msg << " (required by #{required_by}) in any repository"
165
+ else
166
+ msg << " in any repository"
167
+ end
162
168
  end
163
169
 
164
- unless domain == :local then # HACK
170
+ alert_error msg
171
+
172
+ unless domain == :local # HACK
165
173
  suggestions = Gem::SpecFetcher.fetcher.suggest_gems_from_name gem_name
166
174
 
167
175
  unless suggestions.empty?
@@ -176,7 +184,7 @@ class Gem::Command
176
184
  def get_all_gem_names
177
185
  args = options[:args]
178
186
 
179
- if args.nil? or args.empty? then
187
+ if args.nil? or args.empty?
180
188
  raise Gem::CommandLineError,
181
189
  "Please specify at least one gem name (e.g. gem build GEMNAME)"
182
190
  end
@@ -206,12 +214,12 @@ class Gem::Command
206
214
  def get_one_gem_name
207
215
  args = options[:args]
208
216
 
209
- if args.nil? or args.empty? then
217
+ if args.nil? or args.empty?
210
218
  raise Gem::CommandLineError,
211
219
  "Please specify a gem name on the command line (e.g. gem build GEMNAME)"
212
220
  end
213
221
 
214
- if args.size > 1 then
222
+ if args.size > 1
215
223
  raise Gem::CommandLineError,
216
224
  "Too many gem names (#{args.join(', ')}); please specify only one"
217
225
  end
@@ -305,9 +313,9 @@ class Gem::Command
305
313
  self.ui = ui = Gem::SilentUI.new
306
314
  end
307
315
 
308
- if options[:help] then
316
+ if options[:help]
309
317
  show_help
310
- elsif @when_invoked then
318
+ elsif @when_invoked
311
319
  @when_invoked.call options
312
320
  else
313
321
  execute
@@ -353,7 +361,7 @@ class Gem::Command
353
361
 
354
362
  def remove_option(name)
355
363
  @option_groups.each do |_, option_list|
356
- option_list.reject! { |args, _| args.any? { |x| x =~ /^#{name}/ } }
364
+ option_list.reject! { |args, _| args.any? { |x| x.is_a?(String) && x =~ /^#{name}/ } }
357
365
  end
358
366
  end
359
367
 
@@ -443,7 +451,7 @@ class Gem::Command
443
451
  # Adds a section with +title+ and +content+ to the parser help view. Used
444
452
  # for adding command arguments and default arguments.
445
453
 
446
- def add_parser_run_info title, content
454
+ def add_parser_run_info(title, content)
447
455
  return if content.empty?
448
456
 
449
457
  @parser.separator nil
@@ -496,7 +504,6 @@ class Gem::Command
496
504
  @parser.separator " #{header}Options:"
497
505
 
498
506
  option_list.each do |args, handler|
499
- args.select { |arg| arg =~ /^-/ }
500
507
  @parser.on(*args) do |value|
501
508
  handler.call(value, @options)
502
509
  end
@@ -523,7 +530,7 @@ class Gem::Command
523
530
  add_common_option('-V', '--[no-]verbose',
524
531
  'Set the verbose level of output') do |value, options|
525
532
  # Set us to "really verbose" so the progress meter works
526
- if Gem.configuration.verbose and value then
533
+ if Gem.configuration.verbose and value
527
534
  Gem.configuration.verbose = 1
528
535
  else
529
536
  Gem.configuration.verbose = value
@@ -562,7 +569,7 @@ class Gem::Command
562
569
 
563
570
  # :stopdoc:
564
571
 
565
- HELP = <<-HELP
572
+ HELP = <<-HELP.freeze
566
573
  RubyGems is a sophisticated package manager for Ruby. This is a
567
574
  basic help message containing pointers to more information.
568
575
 
@@ -47,6 +47,7 @@ class Gem::CommandManager
47
47
  :fetch,
48
48
  :generate_index,
49
49
  :help,
50
+ :info,
50
51
  :install,
51
52
  :list,
52
53
  :lock,
@@ -70,7 +71,11 @@ class Gem::CommandManager
70
71
  :update,
71
72
  :which,
72
73
  :yank,
73
- ]
74
+ ].freeze
75
+
76
+ ALIAS_COMMANDS = {
77
+ 'i' => 'install'
78
+ }.freeze
74
79
 
75
80
  ##
76
81
  # Return the authoritative instance of the command manager.
@@ -152,7 +157,7 @@ class Gem::CommandManager
152
157
  end
153
158
 
154
159
  def process_args(args, build_args=nil)
155
- if args.empty? then
160
+ if args.empty?
156
161
  say Gem::Command::HELP
157
162
  terminate_interaction 1
158
163
  end
@@ -164,6 +169,12 @@ class Gem::CommandManager
164
169
  when '-v', '--version' then
165
170
  say Gem::VERSION
166
171
  terminate_interaction 0
172
+ when '--no-ri', '--no-rdoc' then
173
+ # This was added to compensate for a deprecation warning not being shown
174
+ # in Rubygems 2.x.x.
175
+ # TODO: Remove when Rubygems 3.1 is released.
176
+ alert_error "Invalid option: #{args.first}. Use --no-document instead."
177
+ terminate_interaction 1
167
178
  when /^-/ then
168
179
  alert_error clean_text("Invalid option: #{args.first}. See 'gem --help'.")
169
180
  terminate_interaction 1
@@ -175,18 +186,25 @@ class Gem::CommandManager
175
186
  end
176
187
 
177
188
  def find_command(cmd_name)
189
+ cmd_name = find_alias_command cmd_name
190
+
178
191
  possibilities = find_command_possibilities cmd_name
179
192
 
180
- if possibilities.size > 1 then
193
+ if possibilities.size > 1
181
194
  raise Gem::CommandLineError,
182
195
  "Ambiguous command #{cmd_name} matches [#{possibilities.join(', ')}]"
183
- elsif possibilities.empty? then
196
+ elsif possibilities.empty?
184
197
  raise Gem::CommandLineError, "Unknown command #{cmd_name}"
185
198
  end
186
199
 
187
200
  self[possibilities.first]
188
201
  end
189
202
 
203
+ def find_alias_command(cmd_name)
204
+ alias_name = ALIAS_COMMANDS[cmd_name]
205
+ alias_name ? alias_name : cmd_name
206
+ end
207
+
190
208
  def find_command_possibilities(cmd_name)
191
209
  len = cmd_name.length
192
210
 
@@ -220,4 +238,3 @@ class Gem::CommandManager
220
238
  end
221
239
 
222
240
  end
223
-
@@ -10,6 +10,18 @@ class Gem::Commands::BuildCommand < Gem::Command
10
10
  add_option '--force', 'skip validation of the spec' do |value, options|
11
11
  options[:force] = true
12
12
  end
13
+
14
+ add_option '--strict', 'consider warnings as errors when validating the spec' do |value, options|
15
+ options[:strict] = true
16
+ end
17
+
18
+ add_option '-o', '--output FILE', 'output gem with the given filename' do |value, options|
19
+ options[:output] = value
20
+ end
21
+
22
+ add_option '-C PATH', '', 'Run as if gem build was started in <PATH> instead of the current working directory.' do |value, options|
23
+ options[:build_path] = value
24
+ end
13
25
  end
14
26
 
15
27
  def arguments # :nodoc:
@@ -32,6 +44,11 @@ with gem spec:
32
44
  $ cd my_gem-1.0
33
45
  [edit gem contents]
34
46
  $ gem build my_gem-1.0.gemspec
47
+
48
+ Gems can be saved to a specified filename with the output option:
49
+
50
+ $ gem build my_gem-1.0.gemspec --output=release.gem
51
+
35
52
  EOF
36
53
  end
37
54
 
@@ -46,20 +63,37 @@ with gem spec:
46
63
  gemspec += '.gemspec' if File.exist? gemspec + '.gemspec'
47
64
  end
48
65
 
49
- if File.exist? gemspec then
50
- spec = Gem::Specification.load gemspec
66
+ if File.exist? gemspec
67
+ spec = Gem::Specification.load(gemspec)
51
68
 
52
- if spec then
53
- Gem::Package.build spec, options[:force]
69
+ if options[:build_path]
70
+ Dir.chdir(File.dirname(gemspec)) do
71
+ spec = Gem::Specification.load File.basename(gemspec)
72
+ build_package(spec)
73
+ end
54
74
  else
55
- alert_error "Error loading gemspec. Aborting."
56
- terminate_interaction 1
75
+ build_package(spec)
57
76
  end
77
+
58
78
  else
59
79
  alert_error "Gemspec file not found: #{gemspec}"
60
80
  terminate_interaction 1
61
81
  end
62
82
  end
63
83
 
64
- end
84
+ private
65
85
 
86
+ def build_package(spec)
87
+ if spec
88
+ Gem::Package.build(
89
+ spec,
90
+ options[:force],
91
+ options[:strict],
92
+ options[:output]
93
+ )
94
+ else
95
+ alert_error "Error loading gemspec. Aborting."
96
+ terminate_interaction 1
97
+ end
98
+ end
99
+ end
@@ -14,15 +14,16 @@ class Gem::Commands::CertCommand < Gem::Command
14
14
  super 'cert', 'Manage RubyGems certificates and signing settings',
15
15
  :add => [], :remove => [], :list => [], :build => [], :sign => []
16
16
 
17
- OptionParser.accept OpenSSL::X509::Certificate do |certificate|
17
+ OptionParser.accept OpenSSL::X509::Certificate do |certificate_file|
18
18
  begin
19
- OpenSSL::X509::Certificate.new File.read certificate
19
+ certificate = OpenSSL::X509::Certificate.new File.read certificate_file
20
20
  rescue Errno::ENOENT
21
- raise OptionParser::InvalidArgument, "#{certificate}: does not exist"
21
+ raise OptionParser::InvalidArgument, "#{certificate_file}: does not exist"
22
22
  rescue OpenSSL::X509::CertificateError
23
23
  raise OptionParser::InvalidArgument,
24
- "#{certificate}: invalid X509 certificate"
24
+ "#{certificate_file}: invalid X509 certificate"
25
25
  end
26
+ [certificate, certificate_file]
26
27
  end
27
28
 
28
29
  OptionParser.accept OpenSSL::PKey::RSA do |key_file|
@@ -42,7 +43,7 @@ class Gem::Commands::CertCommand < Gem::Command
42
43
  end
43
44
 
44
45
  add_option('-a', '--add CERT', OpenSSL::X509::Certificate,
45
- 'Add a trusted certificate.') do |cert, options|
46
+ 'Add a trusted certificate.') do |(cert, _), options|
46
47
  options[:add] << cert
47
48
  end
48
49
 
@@ -67,8 +68,9 @@ class Gem::Commands::CertCommand < Gem::Command
67
68
  end
68
69
 
69
70
  add_option('-C', '--certificate CERT', OpenSSL::X509::Certificate,
70
- 'Signing certificate for --sign') do |cert, options|
71
+ 'Signing certificate for --sign') do |(cert, cert_file), options|
71
72
  options[:issuer_cert] = cert
73
+ options[:issuer_cert_file] = cert_file
72
74
  end
73
75
 
74
76
  add_option('-K', '--private-key KEY', OpenSSL::PKey::RSA,
@@ -87,11 +89,16 @@ class Gem::Commands::CertCommand < Gem::Command
87
89
 
88
90
  add_option('-d', '--days NUMBER_OF_DAYS',
89
91
  'Days before the certificate expires') do |days, options|
90
- options[:expiration_length_days] = days.to_i
92
+ options[:expiration_length_days] = days.to_i
93
+ end
94
+
95
+ add_option('-R', '--re-sign',
96
+ 'Re-signs the certificate from -C with the key from -K') do |resign, options|
97
+ options[:resign] = resign
91
98
  end
92
99
  end
93
100
 
94
- def add_certificate certificate # :nodoc:
101
+ def add_certificate(certificate) # :nodoc:
95
102
  Gem::Security.trust_dir.trust_cert certificate
96
103
 
97
104
  say "Added '#{certificate.subject}'"
@@ -114,10 +121,18 @@ class Gem::Commands::CertCommand < Gem::Command
114
121
  build email
115
122
  end
116
123
 
124
+ if options[:resign]
125
+ re_sign_cert(
126
+ options[:issuer_cert],
127
+ options[:issuer_cert_file],
128
+ options[:key]
129
+ )
130
+ end
131
+
117
132
  sign_certificates unless options[:sign].empty?
118
133
  end
119
134
 
120
- def build email
135
+ def build(email)
121
136
  if !valid_email?(email)
122
137
  raise Gem::CommandLineError, "Invalid email address #{email}"
123
138
  end
@@ -133,16 +148,16 @@ class Gem::Commands::CertCommand < Gem::Command
133
148
  end
134
149
  end
135
150
 
136
- def build_cert email, key # :nodoc:
137
- expiration_length_days = options[:expiration_length_days]
138
- age =
139
- if expiration_length_days.nil? || expiration_length_days == 0
140
- Gem::Security::ONE_YEAR
141
- else
142
- Gem::Security::ONE_DAY * expiration_length_days
143
- end
151
+ def build_cert(email, key) # :nodoc:
152
+ expiration_length_days = options[:expiration_length_days] ||
153
+ Gem.configuration.cert_expiration_length_days
154
+
155
+ cert = Gem::Security.create_cert_email(
156
+ email,
157
+ key,
158
+ (Gem::Security::ONE_DAY * expiration_length_days)
159
+ )
144
160
 
145
- cert = Gem::Security.create_cert_email email, key, age
146
161
  Gem::Security.write cert, "gem-public_cert.pem"
147
162
  end
148
163
 
@@ -164,7 +179,7 @@ class Gem::Commands::CertCommand < Gem::Command
164
179
  return key, key_path
165
180
  end
166
181
 
167
- def certificates_matching filter
182
+ def certificates_matching(filter)
168
183
  return enum_for __method__, filter unless block_given?
169
184
 
170
185
  Gem::Security.trusted_certificates.select do |certificate, _|
@@ -216,7 +231,7 @@ For further reading on signing gems see `ri Gem::Security`.
216
231
  EOF
217
232
  end
218
233
 
219
- def list_certificates_matching filter # :nodoc:
234
+ def list_certificates_matching(filter) # :nodoc:
220
235
  certificates_matching filter do |certificate, _|
221
236
  # this could probably be formatted more gracefully
222
237
  say certificate.subject.to_s
@@ -261,14 +276,14 @@ For further reading on signing gems see `ri Gem::Security`.
261
276
  load_default_key unless options[:key]
262
277
  end
263
278
 
264
- def remove_certificates_matching filter # :nodoc:
279
+ def remove_certificates_matching(filter) # :nodoc:
265
280
  certificates_matching filter do |certificate, path|
266
281
  FileUtils.rm path
267
282
  say "Removed '#{certificate.subject}'"
268
283
  end
269
284
  end
270
285
 
271
- def sign cert_file
286
+ def sign(cert_file)
272
287
  cert = File.read cert_file
273
288
  cert = OpenSSL::X509::Certificate.new cert
274
289
 
@@ -290,13 +305,19 @@ For further reading on signing gems see `ri Gem::Security`.
290
305
  end
291
306
  end
292
307
 
308
+ def re_sign_cert(cert, cert_path, private_key)
309
+ Gem::Security::Signer.re_sign_cert(cert, cert_path, private_key) do |expired_cert_path, new_expired_cert_path|
310
+ alert("Your certificate #{expired_cert_path} has been re-signed")
311
+ alert("Your expired certificate will be located at: #{new_expired_cert_path}")
312
+ end
313
+ end
314
+
293
315
  private
294
316
 
295
- def valid_email? email
317
+ def valid_email?(email)
296
318
  # It's simple, but is all we need
297
319
  email =~ /\A.+@.+\z/
298
320
  end
299
321
 
300
322
 
301
323
  end if defined?(OpenSSL::SSL)
302
-
@@ -44,7 +44,7 @@ class Gem::Commands::CheckCommand < Gem::Command
44
44
  gems = get_all_gem_names rescue []
45
45
 
46
46
  Gem::Validator.new.alien(gems).sort.each do |key, val|
47
- unless val.empty? then
47
+ unless val.empty?
48
48
  say "#{key} has #{val.size} problems"
49
49
  val.each do |error_entry|
50
50
  say " #{error_entry.path}:"
@@ -22,6 +22,12 @@ class Gem::Commands::CleanupCommand < Gem::Command
22
22
  options[:check_dev] = value
23
23
  end
24
24
 
25
+ add_option('--[no-]user-install',
26
+ 'Cleanup in user\'s home directory instead',
27
+ 'of GEM_HOME.') do |value, options|
28
+ options[:user_install] = value
29
+ end
30
+
25
31
  @candidate_gems = nil
26
32
  @default_gems = []
27
33
  @full = nil
@@ -56,7 +62,7 @@ If no gems are named all gems in GEM_HOME are cleaned.
56
62
  def execute
57
63
  say "Cleaning up installed gems..."
58
64
 
59
- if options[:args].empty? then
65
+ if options[:args].empty?
60
66
  done = false
61
67
  last_set = nil
62
68
 
@@ -105,7 +111,7 @@ If no gems are named all gems in GEM_HOME are cleaned.
105
111
  end
106
112
 
107
113
  def get_candidate_gems
108
- @candidate_gems = unless options[:args].empty? then
114
+ @candidate_gems = unless options[:args].empty?
109
115
  options[:args].map do |gem_name|
110
116
  Gem::Specification.find_all_by_name gem_name
111
117
  end.flatten
@@ -115,7 +121,6 @@ If no gems are named all gems in GEM_HOME are cleaned.
115
121
  end
116
122
 
117
123
  def get_gems_to_cleanup
118
-
119
124
  gems_to_cleanup = @candidate_gems.select { |spec|
120
125
  @primary_gems[spec.name].version != spec.version
121
126
  }
@@ -124,8 +129,10 @@ If no gems are named all gems in GEM_HOME are cleaned.
124
129
  spec.default_gem?
125
130
  }
126
131
 
132
+ uninstall_from = options[:user_install] ? Gem.user_dir : @original_home
133
+
127
134
  gems_to_cleanup = gems_to_cleanup.select { |spec|
128
- spec.base_dir == @original_home
135
+ spec.base_dir == uninstall_from
129
136
  }
130
137
 
131
138
  @default_gems += default_gems
@@ -138,16 +145,16 @@ If no gems are named all gems in GEM_HOME are cleaned.
138
145
 
139
146
  Gem::Specification.each do |spec|
140
147
  if @primary_gems[spec.name].nil? or
141
- @primary_gems[spec.name].version < spec.version then
148
+ @primary_gems[spec.name].version < spec.version
142
149
  @primary_gems[spec.name] = spec
143
150
  end
144
151
  end
145
152
  end
146
153
 
147
- def uninstall_dep spec
154
+ def uninstall_dep(spec)
148
155
  return unless @full.ok_to_remove?(spec.full_name, options[:check_dev])
149
156
 
150
- if options[:dryrun] then
157
+ if options[:dryrun]
151
158
  say "Dry Run Mode: Would uninstall #{spec.full_name}"
152
159
  return
153
160
  end