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
@@ -166,6 +166,17 @@ module Bundler
166
166
  Check.new(options).run
167
167
  end
168
168
 
169
+ desc "remove [GEM [GEM ...]]", "Removes gems from the Gemfile"
170
+ long_desc <<-D
171
+ Removes the given gems from the Gemfile while ensuring that the resulting Gemfile is still valid. If the gem is not found, Bundler prints a error message and if gem could not be removed due to any reason Bundler will display a warning.
172
+ D
173
+ method_option "install", :type => :boolean, :banner =>
174
+ "Runs 'bundle install' after removing the gems from the Gemfile"
175
+ def remove(*gems)
176
+ require "bundler/cli/remove"
177
+ Remove.new(gems, options).run
178
+ end
179
+
169
180
  desc "install [OPTIONS]", "Install the current environment to the system"
170
181
  long_desc <<-D
171
182
  Install will install all of the gems in the current bundle, making them available
@@ -195,8 +206,7 @@ module Bundler
195
206
  "Do not attempt to fetch gems remotely and use the gem cache instead"
196
207
  deprecated_option "no-cache", :type => :boolean, :banner =>
197
208
  "Don't update the existing gem cache."
198
- method_option "redownload", :type => :boolean, :aliases =>
199
- [Bundler.feature_flag.forget_cli_options? ? nil : "--force"].compact, :banner =>
209
+ method_option "redownload", :type => :boolean, :aliases => "--force", :banner =>
200
210
  "Force downloading every gem."
201
211
  deprecated_option "no-prune", :type => :boolean, :banner =>
202
212
  "Don't remove stale gems from the cache."
@@ -219,6 +229,7 @@ module Bundler
219
229
  "Include gems that are part of the specified named group."
220
230
  map "i" => "install"
221
231
  def install
232
+ SharedHelpers.major_deprecation(2, "The `--force` option has been renamed to `--redownload`") if ARGV.include?("--force")
222
233
  require "bundler/cli/install"
223
234
  Bundler.settings.temporary(:no_install => false) do
224
235
  Install.new(options.dup).run
@@ -233,6 +244,8 @@ module Bundler
233
244
  D
234
245
  method_option "full-index", :type => :boolean, :banner =>
235
246
  "Fall back to using the single-file index of all gems"
247
+ method_option "gemfile", :type => :string, :banner =>
248
+ "Use the specified gemfile instead of Gemfile"
236
249
  method_option "group", :aliases => "-g", :type => :array, :banner =>
237
250
  "Update a specific group"
238
251
  method_option "jobs", :aliases => "-j", :type => :numeric, :banner =>
@@ -243,7 +256,7 @@ module Bundler
243
256
  "Only output warnings and errors."
244
257
  method_option "source", :type => :array, :banner =>
245
258
  "Update a specific source (and all gems associated with it)"
246
- method_option "force", :type => :boolean, :banner =>
259
+ method_option "redownload", :type => :boolean, :aliases => "--force", :banner =>
247
260
  "Force downloading every gem."
248
261
  method_option "ruby", :type => :boolean, :banner =>
249
262
  "Update ruby specified in Gemfile.lock"
@@ -262,6 +275,7 @@ module Bundler
262
275
  method_option "all", :type => :boolean, :banner =>
263
276
  "Update everything."
264
277
  def update(*gems)
278
+ SharedHelpers.major_deprecation(2, "The `--force` option has been renamed to `--redownload`") if ARGV.include?("--force")
265
279
  require "bundler/cli/update"
266
280
  Update.new(options, gems).run
267
281
  end
@@ -276,7 +290,21 @@ module Bundler
276
290
  method_option "outdated", :type => :boolean,
277
291
  :banner => "Show verbose output including whether gems are outdated."
278
292
  def show(gem_name = nil)
279
- Bundler::SharedHelpers.major_deprecation(2, "use `bundle list` instead of `bundle show`") if ARGV[0] == "show"
293
+ if ARGV[0] == "show"
294
+ rest = ARGV[1..-1]
295
+
296
+ new_command = rest.find {|arg| !arg.start_with?("--") } ? "info" : "list"
297
+
298
+ new_arguments = rest.map do |arg|
299
+ next arg if arg != "--paths"
300
+ next "--path" if new_command == "info"
301
+ end
302
+
303
+ old_argv = ARGV.join(" ")
304
+ new_argv = [new_command, *new_arguments.compact].join(" ")
305
+
306
+ Bundler::SharedHelpers.major_deprecation(2, "use `bundle #{new_argv}` instead of `bundle #{old_argv}`")
307
+ end
280
308
  require "bundler/cli/show"
281
309
  Show.new(options, gem_name).run
282
310
  end
@@ -285,6 +313,9 @@ module Bundler
285
313
  if Bundler.feature_flag.list_command?
286
314
  desc "list", "List all gems in the bundle"
287
315
  method_option "name-only", :type => :boolean, :banner => "print only the gem names"
316
+ method_option "only-group", :type => :string, :banner => "print gems from a particular group"
317
+ method_option "without-group", :type => :string, :banner => "print all gems expect from a group"
318
+ method_option "paths", :type => :boolean, :banner => "print the path to each gem in the bundle"
288
319
  def list
289
320
  require "bundler/cli/list"
290
321
  List.new(options).run
@@ -316,6 +347,8 @@ module Bundler
316
347
  "Specify a different shebang executable name than the default (usually 'ruby')"
317
348
  method_option "standalone", :type => :boolean, :banner =>
318
349
  "Make binstubs that can work without the Bundler runtime"
350
+ method_option "all", :type => :boolean, :banner =>
351
+ "Install binstubs for all gems"
319
352
  def binstubs(*gems)
320
353
  require "bundler/cli/binstubs"
321
354
  Binstubs.new(options, gems).run
@@ -328,10 +361,13 @@ module Bundler
328
361
  method_option "version", :aliases => "-v", :type => :string
329
362
  method_option "group", :aliases => "-g", :type => :string
330
363
  method_option "source", :aliases => "-s", :type => :string
331
-
332
- def add(gem_name)
364
+ method_option "skip-install", :type => :boolean, :banner =>
365
+ "Adds gem to the Gemfile but does not install it"
366
+ method_option "optimistic", :type => :boolean, :banner => "Adds optimistic declaration of version to gem"
367
+ method_option "strict", :type => :boolean, :banner => "Adds strict declaration of version to gem"
368
+ def add(*gems)
333
369
  require "bundler/cli/add"
334
- Add.new(options.dup, gem_name).run
370
+ Add.new(options.dup, gems).run
335
371
  end
336
372
 
337
373
  desc "outdated GEM [OPTIONS]", "List installed gems with newer versions available"
@@ -362,6 +398,8 @@ module Bundler
362
398
  method_option "filter-patch", :type => :boolean, :banner => "Only list patch newer versions"
363
399
  method_option "parseable", :aliases => "--porcelain", :type => :boolean, :banner =>
364
400
  "Use minimal formatting for more parseable output"
401
+ method_option "only-explicit", :type => :boolean, :banner =>
402
+ "Only list gems specified in your Gemfile, not their dependencies"
365
403
  def outdated(*gems)
366
404
  require "bundler/cli/outdated"
367
405
  Outdated.new(options, gems).run
@@ -413,6 +451,7 @@ module Bundler
413
451
 
414
452
  desc "exec [OPTIONS]", "Run the command in context of the bundle"
415
453
  method_option :keep_file_descriptors, :type => :boolean, :default => false
454
+ method_option :gemfile, :type => :string, :required => false
416
455
  long_desc <<-D
417
456
  Exec runs a command, providing it access to the gems in the bundle. While using
418
457
  bundle exec you can require and call the bundled gems as if they were installed
@@ -485,20 +524,23 @@ module Bundler
485
524
  end
486
525
  end
487
526
 
488
- desc "viz [OPTIONS]", "Generates a visual dependency graph", :hide => true
489
- long_desc <<-D
490
- Viz generates a PNG file of the current Gemfile as a dependency graph.
491
- Viz requires the ruby-graphviz gem (and its dependencies).
492
- The associated gems must also be installed via 'bundle install'.
493
- D
494
- method_option :file, :type => :string, :default => "gem_graph", :aliases => "-f", :desc => "The name to use for the generated file. see format option"
495
- method_option :format, :type => :string, :default => "png", :aliases => "-F", :desc => "This is output format option. Supported format is png, jpg, svg, dot ..."
496
- method_option :requirements, :type => :boolean, :default => false, :aliases => "-R", :desc => "Set to show the version of each required dependency."
497
- method_option :version, :type => :boolean, :default => false, :aliases => "-v", :desc => "Set to show each gem version."
498
- method_option :without, :type => :array, :default => [], :aliases => "-W", :banner => "GROUP[ GROUP...]", :desc => "Exclude gems that are part of the specified named group."
499
- def viz
500
- require "bundler/cli/viz"
501
- Viz.new(options.dup).run
527
+ if Bundler.feature_flag.viz_command?
528
+ desc "viz [OPTIONS]", "Generates a visual dependency graph", :hide => true
529
+ long_desc <<-D
530
+ Viz generates a PNG file of the current Gemfile as a dependency graph.
531
+ Viz requires the ruby-graphviz gem (and its dependencies).
532
+ The associated gems must also be installed via 'bundle install'.
533
+ D
534
+ method_option :file, :type => :string, :default => "gem_graph", :aliases => "-f", :desc => "The name to use for the generated file. see format option"
535
+ method_option :format, :type => :string, :default => "png", :aliases => "-F", :desc => "This is output format option. Supported format is png, jpg, svg, dot ..."
536
+ method_option :requirements, :type => :boolean, :default => false, :aliases => "-R", :desc => "Set to show the version of each required dependency."
537
+ method_option :version, :type => :boolean, :default => false, :aliases => "-v", :desc => "Set to show each gem version."
538
+ method_option :without, :type => :array, :default => [], :aliases => "-W", :banner => "GROUP[ GROUP...]", :desc => "Exclude gems that are part of the specified named group."
539
+ def viz
540
+ SharedHelpers.major_deprecation 2, "The `viz` command has been moved to the `bundle-viz` gem, see https://github.com/bundler/bundler-viz"
541
+ require "bundler/cli/viz"
542
+ Viz.new(options.dup).run
543
+ end
502
544
  end
503
545
 
504
546
  old_gem = instance_method(:gem)
@@ -9,7 +9,6 @@ module Bundler
9
9
 
10
10
  attr_reader(
11
11
  :dependencies,
12
- :gem_version_promoter,
13
12
  :locked_deps,
14
13
  :locked_gems,
15
14
  :platforms,
@@ -125,25 +124,25 @@ module Bundler
125
124
  @unlock[:gems] = @locked_specs.for(eager_unlock, [], false, false, false).map(&:name)
126
125
  end
127
126
 
128
- @gem_version_promoter = create_gem_version_promoter
129
-
130
127
  @dependency_changes = converge_dependencies
131
128
  @local_changes = converge_locals
132
129
 
133
130
  @requires = compute_requires
134
131
  end
135
132
 
136
- def create_gem_version_promoter
137
- locked_specs =
138
- if unlocking? && @locked_specs.empty? && !@lockfile_contents.empty?
139
- # Definition uses an empty set of locked_specs to indicate all gems
140
- # are unlocked, but GemVersionPromoter needs the locked_specs
141
- # for conservative comparison.
142
- Bundler::SpecSet.new(@locked_gems.specs)
143
- else
144
- @locked_specs
145
- end
146
- GemVersionPromoter.new(locked_specs, @unlock[:gems])
133
+ def gem_version_promoter
134
+ @gem_version_promoter ||= begin
135
+ locked_specs =
136
+ if unlocking? && @locked_specs.empty? && !@lockfile_contents.empty?
137
+ # Definition uses an empty set of locked_specs to indicate all gems
138
+ # are unlocked, but GemVersionPromoter needs the locked_specs
139
+ # for conservative comparison.
140
+ Bundler::SpecSet.new(@locked_gems.specs)
141
+ else
142
+ @locked_specs
143
+ end
144
+ GemVersionPromoter.new(locked_specs, @unlock[:gems])
145
+ end
147
146
  end
148
147
 
149
148
  def resolve_with_cache!
@@ -214,7 +213,7 @@ module Bundler
214
213
  @index = nil
215
214
  @resolve = nil
216
215
  @specs = nil
217
- @gem_version_promoter = create_gem_version_promoter
216
+ @gem_version_promoter = nil
218
217
 
219
218
  Bundler.ui.debug "The definition is missing dependencies, failed to resolve & materialize locally (#{e})"
220
219
  true
@@ -885,7 +884,7 @@ module Bundler
885
884
  dep = Dependency.new(dep, ">= 0") unless dep.respond_to?(:name)
886
885
  next if !remote && !dep.current_platform?
887
886
  platforms = dep.gem_platforms(sorted_platforms)
888
- if platforms.empty?
887
+ if platforms.empty? && !Bundler.settings[:disable_platform_warnings]
889
888
  mapped_platforms = dep.platforms.map {|p| Dependency::PLATFORM_MAP[p] }
890
889
  Bundler.ui.warn \
891
890
  "The dependency #{dep} will be unused by any of the platforms Bundler is installing for. " \
@@ -7,8 +7,7 @@ require "bundler/rubygems_ext"
7
7
  module Bundler
8
8
  class Dependency < Gem::Dependency
9
9
  attr_reader :autorequire
10
- attr_reader :groups
11
- attr_reader :platforms
10
+ attr_reader :groups, :platforms, :gemfile
12
11
 
13
12
  PLATFORM_MAP = {
14
13
  :ruby => Gem::Platform::RUBY,
@@ -88,6 +87,7 @@ module Bundler
88
87
  @platforms = Array(options["platforms"])
89
88
  @env = options["env"]
90
89
  @should_include = options.fetch("should_include", true)
90
+ @gemfile = options["gemfile"]
91
91
 
92
92
  @autorequire = Array(options["require"] || []) if options.key?("require")
93
93
  end
@@ -16,7 +16,7 @@ module Bundler
16
16
  VALID_PLATFORMS = Bundler::Dependency::PLATFORM_MAP.keys.freeze
17
17
 
18
18
  VALID_KEYS = %w[group groups git path glob name branch ref tag require submodules
19
- platform platforms type source install_if].freeze
19
+ platform platforms type source install_if gemfile].freeze
20
20
 
21
21
  attr_reader :gemspecs
22
22
  attr_accessor :dependencies
@@ -93,6 +93,7 @@ module Bundler
93
93
 
94
94
  def gem(name, *args)
95
95
  options = args.last.is_a?(Hash) ? args.pop.dup : {}
96
+ options["gemfile"] = @gemfile
96
97
  version = args || [">= 0"]
97
98
 
98
99
  normalize_options(name, version, options)
@@ -106,13 +107,28 @@ module Bundler
106
107
  if current.requirement != dep.requirement
107
108
  unless deleted_dep
108
109
  return if dep.type == :development
110
+
111
+ update_prompt = ""
112
+
113
+ if File.basename(@gemfile) == Injector::INJECTED_GEMS
114
+ if dep.requirements_list.include?(">= 0") && !current.requirements_list.include?(">= 0")
115
+ update_prompt = ". Gem already added"
116
+ else
117
+ update_prompt = ". If you want to update the gem version, run `bundle update #{current.name}`"
118
+
119
+ update_prompt += ". You may also need to change the version requirement specified in the Gemfile if it's too restrictive." unless current.requirements_list.include?(">= 0")
120
+ end
121
+ end
122
+
109
123
  raise GemfileError, "You cannot specify the same gem twice with different version requirements.\n" \
110
- "You specified: #{current.name} (#{current.requirement}) and #{dep.name} (#{dep.requirement})"
124
+ "You specified: #{current.name} (#{current.requirement}) and #{dep.name} (#{dep.requirement})" \
125
+ "#{update_prompt}"
111
126
  end
112
127
 
113
128
  else
114
129
  Bundler.ui.warn "Your Gemfile lists the gem #{current.name} (#{current.requirement}) more than once.\n" \
115
130
  "You should probably keep only one of them.\n" \
131
+ "Remove any duplicate entries and specify the gem only once (per group).\n" \
116
132
  "While it's not a problem now, it could cause errors if you change the version of one of them later."
117
133
  end
118
134
 
@@ -289,7 +305,7 @@ module Bundler
289
305
  # end
290
306
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
291
307
  # TODO: 2.0 upgrade this setting to the default
292
- if Bundler.settings["github.https"]
308
+ if Bundler.feature_flag.github_https?
293
309
  Bundler::SharedHelpers.major_deprecation 2, "The `github.https` setting will be removed"
294
310
  "https://github.com/#{repo_name}.git"
295
311
  else
@@ -30,6 +30,7 @@ module Bundler
30
30
  settings_flag(:allow_bundler_dependency_conflicts) { bundler_2_mode? }
31
31
  settings_flag(:allow_offline_install) { bundler_2_mode? }
32
32
  settings_flag(:auto_clean_without_path) { bundler_2_mode? }
33
+ settings_flag(:auto_config_jobs) { bundler_2_mode? }
33
34
  settings_flag(:cache_all) { bundler_2_mode? }
34
35
  settings_flag(:cache_command_is_package) { bundler_2_mode? }
35
36
  settings_flag(:console_command) { !bundler_2_mode? }
@@ -38,11 +39,13 @@ module Bundler
38
39
  settings_flag(:disable_multisource) { bundler_2_mode? }
39
40
  settings_flag(:error_on_stderr) { bundler_2_mode? }
40
41
  settings_flag(:forget_cli_options) { bundler_2_mode? }
42
+ settings_flag(:global_path_appends_ruby_scope) { bundler_2_mode? }
41
43
  settings_flag(:global_gem_cache) { bundler_2_mode? }
42
44
  settings_flag(:init_gems_rb) { bundler_2_mode? }
43
45
  settings_flag(:list_command) { bundler_2_mode? }
44
46
  settings_flag(:lockfile_uses_separate_rubygems_sources) { bundler_2_mode? }
45
47
  settings_flag(:only_update_to_newer_versions) { bundler_2_mode? }
48
+ settings_flag(:path_relative_to_cwd) { bundler_2_mode? }
46
49
  settings_flag(:plugins) { @bundler_version >= Gem::Version.new("1.14") }
47
50
  settings_flag(:prefer_gems_rb) { bundler_2_mode? }
48
51
  settings_flag(:print_only_version_number) { bundler_2_mode? }
@@ -52,9 +55,13 @@ module Bundler
52
55
  settings_flag(:suppress_install_using_messages) { bundler_2_mode? }
53
56
  settings_flag(:unlock_source_unlocks_spec) { !bundler_2_mode? }
54
57
  settings_flag(:update_requires_all_flag) { bundler_2_mode? }
58
+ settings_flag(:use_gem_version_promoter_for_major_updates) { bundler_2_mode? }
59
+ settings_flag(:viz_command) { !bundler_2_mode? }
55
60
 
56
61
  settings_option(:default_cli_command) { bundler_2_mode? ? :cli_help : :install }
57
62
 
63
+ settings_method(:github_https?, "github.https") { bundler_2_mode? }
64
+
58
65
  def initialize(bundler_version)
59
66
  @bundler_version = Gem::Version.create(bundler_version)
60
67
  end
@@ -7,6 +7,8 @@ module Bundler
7
7
  # available dependency versions as found in its index, before returning it to
8
8
  # to the resolution engine to select the best version.
9
9
  class GemVersionPromoter
10
+ DEBUG = ENV["DEBUG_RESOLVER"]
11
+
10
12
  attr_reader :level, :locked_specs, :unlock_gems
11
13
 
12
14
  # By default, strict is false, meaning every available version of a gem
@@ -64,7 +66,7 @@ module Bundler
64
66
  # @return [SpecGroup] A new instance of the SpecGroup Array sorted and
65
67
  # possibly filtered.
66
68
  def sort_versions(dep, spec_groups)
67
- before_result = "before sort_versions: #{debug_format_result(dep, spec_groups).inspect}" if ENV["DEBUG_RESOLVER"]
69
+ before_result = "before sort_versions: #{debug_format_result(dep, spec_groups).inspect}" if DEBUG
68
70
 
69
71
  @sort_versions[dep] ||= begin
70
72
  gem_name = dep.name
@@ -78,7 +80,7 @@ module Bundler
78
80
  else
79
81
  sort_dep_specs(spec_groups, locked_spec)
80
82
  end.tap do |specs|
81
- if ENV["DEBUG_RESOLVER"]
83
+ if DEBUG
82
84
  STDERR.puts before_result
83
85
  STDERR.puts " after sort_versions: #{debug_format_result(dep, specs).inspect}"
84
86
  end
@@ -2,13 +2,20 @@
2
2
 
3
3
  module Bundler
4
4
  class Injector
5
+ INJECTED_GEMS = "injected gems".freeze
6
+
5
7
  def self.inject(new_deps, options = {})
6
8
  injector = new(new_deps, options)
7
9
  injector.inject(Bundler.default_gemfile, Bundler.default_lockfile)
8
10
  end
9
11
 
10
- def initialize(new_deps, options = {})
11
- @new_deps = new_deps
12
+ def self.remove(gems, options = {})
13
+ injector = new(gems, options)
14
+ injector.remove(Bundler.default_gemfile, Bundler.default_lockfile)
15
+ end
16
+
17
+ def initialize(deps, options = {})
18
+ @deps = deps
12
19
  @options = options
13
20
  end
14
21
 
@@ -28,18 +35,19 @@ module Bundler
28
35
  builder.eval_gemfile(gemfile_path)
29
36
 
30
37
  # don't inject any gems that are already in the Gemfile
31
- @new_deps -= builder.dependencies
38
+ @deps -= builder.dependencies
32
39
 
33
40
  # add new deps to the end of the in-memory Gemfile
34
- # Set conservative versioning to false because we want to let the resolver resolve the version first
35
- builder.eval_gemfile("injected gems", build_gem_lines(false)) if @new_deps.any?
41
+ # Set conservative versioning to false because
42
+ # we want to let the resolver resolve the version first
43
+ builder.eval_gemfile(INJECTED_GEMS, build_gem_lines(false)) if @deps.any?
36
44
 
37
45
  # resolve to see if the new deps broke anything
38
46
  @definition = builder.to_definition(lockfile_path, {})
39
47
  @definition.resolve_remotely!
40
48
 
41
49
  # since nothing broke, we can add those gems to the gemfile
42
- append_to(gemfile_path, build_gem_lines(@options[:conservative_versioning])) if @new_deps.any?
50
+ append_to(gemfile_path, build_gem_lines(@options[:conservative_versioning])) if @deps.any?
43
51
 
44
52
  # since we resolved successfully, write out the lockfile
45
53
  @definition.lock(Bundler.default_lockfile)
@@ -48,7 +56,21 @@ module Bundler
48
56
  Bundler.reset_paths!
49
57
 
50
58
  # return an array of the deps that we added
51
- @new_deps
59
+ @deps
60
+ end
61
+ end
62
+
63
+ # @param [Pathname] gemfile_path The Gemfile from which to remove dependencies.
64
+ # @param [Pathname] lockfile_path The lockfile from which to remove dependencies.
65
+ # @return [Array]
66
+ def remove(gemfile_path, lockfile_path)
67
+ # remove gems from each gemfiles we have
68
+ Bundler.definition.gemfiles.each do |path|
69
+ deps = remove_deps(path)
70
+
71
+ show_warning("No gems were removed from the gemfile.") if deps.empty?
72
+
73
+ deps.each {|dep| Bundler.ui.confirm "#{SharedHelpers.pretty_dependency(dep, false)} was removed." }
52
74
  end
53
75
  end
54
76
 
@@ -61,11 +83,21 @@ module Bundler
61
83
  seg_end_index = version >= Gem::Version.new("1.0") ? 1 : 2
62
84
 
63
85
  prerelease_suffix = version.to_s.gsub(version.release.to_s, "") if version.prerelease?
64
- "~> #{segments[0..seg_end_index].join(".")}#{prerelease_suffix}"
86
+ "#{version_prefix}#{segments[0..seg_end_index].join(".")}#{prerelease_suffix}"
87
+ end
88
+
89
+ def version_prefix
90
+ if @options[:strict]
91
+ "= "
92
+ elsif @options[:optimistic]
93
+ ">= "
94
+ else
95
+ "~> "
96
+ end
65
97
  end
66
98
 
67
99
  def build_gem_lines(conservative_versioning)
68
- @new_deps.map do |d|
100
+ @deps.map do |d|
69
101
  name = d.name.dump
70
102
 
71
103
  requirement = if conservative_versioning
@@ -90,5 +122,132 @@ module Bundler
90
122
  f.puts new_gem_lines
91
123
  end
92
124
  end
125
+
126
+ # evalutes a gemfile to remove the specified gem
127
+ # from it.
128
+ def remove_deps(gemfile_path)
129
+ initial_gemfile = IO.readlines(gemfile_path)
130
+
131
+ Bundler.ui.info "Removing gems from #{gemfile_path}"
132
+
133
+ # evaluate the Gemfile we have
134
+ builder = Dsl.new
135
+ builder.eval_gemfile(gemfile_path)
136
+
137
+ removed_deps = remove_gems_from_dependencies(builder, @deps, gemfile_path)
138
+
139
+ # abort the opertion if no gems were removed
140
+ # no need to operate on gemfile furthur
141
+ return [] if removed_deps.empty?
142
+
143
+ cleaned_gemfile = remove_gems_from_gemfile(@deps, gemfile_path)
144
+
145
+ SharedHelpers.write_to_gemfile(gemfile_path, cleaned_gemfile)
146
+
147
+ # check for errors
148
+ # including extra gems being removed
149
+ # or some gems not being removed
150
+ # and return the actual removed deps
151
+ cross_check_for_errors(gemfile_path, builder.dependencies, removed_deps, initial_gemfile)
152
+ end
153
+
154
+ # @param [Dsl] builder Dsl object of current Gemfile.
155
+ # @param [Array] gems Array of names of gems to be removed.
156
+ # @param [Pathname] path of the Gemfile
157
+ # @return [Array] removed_deps Array of removed dependencies.
158
+ def remove_gems_from_dependencies(builder, gems, gemfile_path)
159
+ removed_deps = []
160
+
161
+ gems.each do |gem_name|
162
+ deleted_dep = builder.dependencies.find {|d| d.name == gem_name }
163
+
164
+ if deleted_dep.nil?
165
+ raise GemfileError, "`#{gem_name}` is not specified in #{gemfile_path} so it could not be removed."
166
+ end
167
+
168
+ builder.dependencies.delete(deleted_dep)
169
+
170
+ removed_deps << deleted_dep
171
+ end
172
+
173
+ removed_deps
174
+ end
175
+
176
+ # @param [Array] gems Array of names of gems to be removed.
177
+ # @param [Pathname] gemfile_path The Gemfile from which to remove dependencies.
178
+ def remove_gems_from_gemfile(gems, gemfile_path)
179
+ patterns = /gem\s+(['"])#{Regexp.union(gems)}\1|gem\s*\((['"])#{Regexp.union(gems)}\2\)/
180
+
181
+ # remove lines which match the regex
182
+ new_gemfile = IO.readlines(gemfile_path).reject {|line| line.match(patterns) }
183
+
184
+ # remove lone \n and append them with other strings
185
+ new_gemfile.each_with_index do |_line, index|
186
+ if new_gemfile[index + 1] == "\n"
187
+ new_gemfile[index] += new_gemfile[index + 1]
188
+ new_gemfile.delete_at(index + 1)
189
+ end
190
+ end
191
+
192
+ %w[group source env install_if].each {|block| remove_nested_blocks(new_gemfile, block) }
193
+
194
+ new_gemfile.join.chomp
195
+ end
196
+
197
+ # @param [Array] gemfile Array of gemfile contents.
198
+ # @param [String] block_name Name of block name to look for.
199
+ def remove_nested_blocks(gemfile, block_name)
200
+ nested_blocks = 0
201
+
202
+ # count number of nested blocks
203
+ gemfile.each_with_index {|line, index| nested_blocks += 1 if !gemfile[index + 1].nil? && gemfile[index + 1].include?(block_name) && line.include?(block_name) }
204
+
205
+ while nested_blocks >= 0
206
+ nested_blocks -= 1
207
+
208
+ gemfile.each_with_index do |line, index|
209
+ next unless !line.nil? && line.include?(block_name)
210
+ if gemfile[index + 1] =~ /^\s*end\s*$/
211
+ gemfile[index] = nil
212
+ gemfile[index + 1] = nil
213
+ end
214
+ end
215
+
216
+ gemfile.compact!
217
+ end
218
+ end
219
+
220
+ # @param [Pathname] gemfile_path The Gemfile from which to remove dependencies.
221
+ # @param [Array] original_deps Array of original dependencies.
222
+ # @param [Array] removed_deps Array of removed dependencies.
223
+ # @param [Array] initial_gemfile Contents of original Gemfile before any operation.
224
+ def cross_check_for_errors(gemfile_path, original_deps, removed_deps, initial_gemfile)
225
+ # evalute the new gemfile to look for any failure cases
226
+ builder = Dsl.new
227
+ builder.eval_gemfile(gemfile_path)
228
+
229
+ # record gems which were removed but not requested
230
+ extra_removed_gems = original_deps - builder.dependencies
231
+
232
+ # if some extra gems were removed then raise error
233
+ # and revert Gemfile to original
234
+ unless extra_removed_gems.empty?
235
+ SharedHelpers.write_to_gemfile(gemfile_path, initial_gemfile.join)
236
+
237
+ raise InvalidOption, "Gems could not be removed. #{extra_removed_gems.join(", ")} would also have been removed. Bundler cannot continue."
238
+ end
239
+
240
+ # record gems which could not be removed due to some reasons
241
+ errored_deps = builder.dependencies.select {|d| d.gemfile == gemfile_path } & removed_deps.select {|d| d.gemfile == gemfile_path }
242
+
243
+ show_warning "#{errored_deps.map(&:name).join(", ")} could not be removed." unless errored_deps.empty?
244
+
245
+ # return actual removed dependencies
246
+ removed_deps - errored_deps
247
+ end
248
+
249
+ def show_warning(message)
250
+ Bundler.ui.info Bundler.ui.add_color(message, :yellow)
251
+ end
93
252
  end
94
253
  end
@@ -87,6 +87,7 @@ module Bundler
87
87
  @force = force
88
88
  @specs = all_specs.map {|s| SpecInstallation.new(s) }
89
89
  @spec_set = all_specs
90
+ @rake = @specs.find {|s| s.name == "rake" }
90
91
  end
91
92
 
92
93
  def call
@@ -155,6 +156,7 @@ module Bundler
155
156
  end
156
157
 
157
158
  def do_install(spec_install, worker_num)
159
+ Plugin.hook(Plugin::Events::GEM_BEFORE_INSTALL, spec_install)
158
160
  gem_installer = Bundler::GemInstaller.new(
159
161
  spec_install.spec, @installer, @standalone, worker_num, @force
160
162
  )
@@ -170,6 +172,7 @@ module Bundler
170
172
  spec_install.state = :failed
171
173
  spec_install.error = "#{message}\n\n#{require_tree_for_spec(spec_install.spec)}"
172
174
  end
175
+ Plugin.hook(Plugin::Events::GEM_AFTER_INSTALL, spec_install)
173
176
  spec_install
174
177
  end
175
178
 
@@ -218,6 +221,8 @@ module Bundler
218
221
  # are installed.
219
222
  def enqueue_specs
220
223
  @specs.select(&:ready_to_enqueue?).each do |spec|
224
+ next if @rake && !@rake.installed? && spec.name != @rake.name
225
+
221
226
  if spec.dependencies_installed? @specs
222
227
  spec.state = :enqueued
223
228
  worker_pool.enq spec