rubygems-update 2.6.1 → 3.5.0

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 (801) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +5899 -0
  3. data/CODE_OF_CONDUCT.md +76 -35
  4. data/CONTRIBUTING.md +231 -0
  5. data/MAINTAINERS.txt +8 -0
  6. data/Manifest.txt +428 -216
  7. data/POLICIES.md +135 -0
  8. data/README.md +112 -0
  9. data/UPGRADING.md +15 -0
  10. data/bundler/CHANGELOG.md +4719 -0
  11. data/bundler/LICENSE.md +22 -0
  12. data/bundler/README.md +58 -0
  13. data/bundler/UPGRADING.md +222 -0
  14. data/bundler/bundler.gemspec +46 -0
  15. data/bundler/exe/bundle +29 -0
  16. data/bundler/exe/bundler +4 -0
  17. data/bundler/lib/bundler/.document +1 -0
  18. data/bundler/lib/bundler/build_metadata.rb +45 -0
  19. data/bundler/lib/bundler/capistrano.rb +22 -0
  20. data/bundler/lib/bundler/checksum.rb +245 -0
  21. data/bundler/lib/bundler/ci_detector.rb +75 -0
  22. data/bundler/lib/bundler/cli/add.rb +47 -0
  23. data/bundler/lib/bundler/cli/binstubs.rb +57 -0
  24. data/bundler/lib/bundler/cli/cache.rb +43 -0
  25. data/bundler/lib/bundler/cli/check.rb +40 -0
  26. data/bundler/lib/bundler/cli/clean.rb +25 -0
  27. data/bundler/lib/bundler/cli/common.rb +138 -0
  28. data/bundler/lib/bundler/cli/config.rb +204 -0
  29. data/bundler/lib/bundler/cli/console.rb +44 -0
  30. data/bundler/lib/bundler/cli/doctor.rb +157 -0
  31. data/bundler/lib/bundler/cli/exec.rb +88 -0
  32. data/bundler/lib/bundler/cli/fund.rb +36 -0
  33. data/bundler/lib/bundler/cli/gem.rb +471 -0
  34. data/bundler/lib/bundler/cli/info.rb +83 -0
  35. data/bundler/lib/bundler/cli/init.rb +51 -0
  36. data/bundler/lib/bundler/cli/inject.rb +60 -0
  37. data/bundler/lib/bundler/cli/install.rb +190 -0
  38. data/bundler/lib/bundler/cli/issue.rb +41 -0
  39. data/bundler/lib/bundler/cli/list.rb +66 -0
  40. data/bundler/lib/bundler/cli/lock.rb +73 -0
  41. data/bundler/lib/bundler/cli/open.rb +29 -0
  42. data/bundler/lib/bundler/cli/outdated.rb +297 -0
  43. data/bundler/lib/bundler/cli/platform.rb +48 -0
  44. data/bundler/lib/bundler/cli/plugin.rb +34 -0
  45. data/bundler/lib/bundler/cli/pristine.rb +60 -0
  46. data/bundler/lib/bundler/cli/remove.rb +17 -0
  47. data/bundler/lib/bundler/cli/show.rb +75 -0
  48. data/bundler/lib/bundler/cli/update.rb +123 -0
  49. data/bundler/lib/bundler/cli/viz.rb +31 -0
  50. data/bundler/lib/bundler/cli.rb +846 -0
  51. data/bundler/lib/bundler/compact_index_client/cache.rb +121 -0
  52. data/bundler/lib/bundler/compact_index_client/cache_file.rb +153 -0
  53. data/bundler/lib/bundler/compact_index_client/gem_parser.rb +32 -0
  54. data/bundler/lib/bundler/compact_index_client/updater.rb +115 -0
  55. data/bundler/lib/bundler/compact_index_client.rb +126 -0
  56. data/bundler/lib/bundler/constants.rb +7 -0
  57. data/bundler/lib/bundler/current_ruby.rb +92 -0
  58. data/bundler/lib/bundler/definition.rb +1005 -0
  59. data/bundler/lib/bundler/dependency.rb +101 -0
  60. data/bundler/lib/bundler/deployment.rb +69 -0
  61. data/bundler/lib/bundler/deprecate.rb +44 -0
  62. data/bundler/lib/bundler/digest.rb +71 -0
  63. data/bundler/lib/bundler/dsl.rb +601 -0
  64. data/bundler/lib/bundler/endpoint_specification.rb +147 -0
  65. data/bundler/lib/bundler/env.rb +148 -0
  66. data/bundler/lib/bundler/environment_preserver.rb +86 -0
  67. data/bundler/lib/bundler/errors.rb +233 -0
  68. data/bundler/lib/bundler/feature_flag.rb +53 -0
  69. data/bundler/lib/bundler/fetcher/base.rb +52 -0
  70. data/bundler/lib/bundler/fetcher/compact_index.rb +129 -0
  71. data/bundler/lib/bundler/fetcher/dependency.rb +78 -0
  72. data/bundler/lib/bundler/fetcher/downloader.rb +91 -0
  73. data/bundler/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
  74. data/bundler/lib/bundler/fetcher/index.rb +25 -0
  75. data/bundler/lib/bundler/fetcher.rb +324 -0
  76. data/bundler/lib/bundler/force_platform.rb +18 -0
  77. data/bundler/lib/bundler/friendly_errors.rb +126 -0
  78. data/bundler/lib/bundler/gem_helper.rb +237 -0
  79. data/bundler/lib/bundler/gem_helpers.rb +127 -0
  80. data/bundler/lib/bundler/gem_tasks.rb +7 -0
  81. data/bundler/lib/bundler/gem_version_promoter.rb +145 -0
  82. data/bundler/lib/bundler/graph.rb +152 -0
  83. data/bundler/lib/bundler/index.rb +205 -0
  84. data/bundler/lib/bundler/injector.rb +287 -0
  85. data/bundler/lib/bundler/inline.rb +73 -0
  86. data/bundler/lib/bundler/installer/gem_installer.rb +84 -0
  87. data/bundler/lib/bundler/installer/parallel_installer.rb +202 -0
  88. data/bundler/lib/bundler/installer/standalone.rb +116 -0
  89. data/bundler/lib/bundler/installer.rb +267 -0
  90. data/bundler/lib/bundler/lazy_specification.rb +170 -0
  91. data/bundler/lib/bundler/lockfile_generator.rb +104 -0
  92. data/bundler/lib/bundler/lockfile_parser.rb +289 -0
  93. data/bundler/lib/bundler/man/.document +1 -0
  94. data/bundler/lib/bundler/man/bundle-add.1 +59 -0
  95. data/bundler/lib/bundler/man/bundle-add.1.ronn +58 -0
  96. data/bundler/lib/bundler/man/bundle-binstubs.1 +30 -0
  97. data/bundler/lib/bundler/man/bundle-binstubs.1.ronn +41 -0
  98. data/bundler/lib/bundler/man/bundle-cache.1 +40 -0
  99. data/bundler/lib/bundler/man/bundle-cache.1.ronn +79 -0
  100. data/bundler/lib/bundler/man/bundle-check.1 +22 -0
  101. data/bundler/lib/bundler/man/bundle-check.1.ronn +26 -0
  102. data/bundler/lib/bundler/man/bundle-clean.1 +17 -0
  103. data/bundler/lib/bundler/man/bundle-clean.1.ronn +18 -0
  104. data/bundler/lib/bundler/man/bundle-config.1 +321 -0
  105. data/bundler/lib/bundler/man/bundle-config.1.ronn +411 -0
  106. data/bundler/lib/bundler/man/bundle-console.1 +35 -0
  107. data/bundler/lib/bundler/man/bundle-console.1.ronn +44 -0
  108. data/bundler/lib/bundler/man/bundle-doctor.1 +30 -0
  109. data/bundler/lib/bundler/man/bundle-doctor.1.ronn +33 -0
  110. data/bundler/lib/bundler/man/bundle-exec.1 +104 -0
  111. data/bundler/lib/bundler/man/bundle-exec.1.ronn +151 -0
  112. data/bundler/lib/bundler/man/bundle-gem.1 +69 -0
  113. data/bundler/lib/bundler/man/bundle-gem.1.ronn +117 -0
  114. data/bundler/lib/bundler/man/bundle-help.1 +9 -0
  115. data/bundler/lib/bundler/man/bundle-help.1.ronn +12 -0
  116. data/bundler/lib/bundler/man/bundle-info.1 +14 -0
  117. data/bundler/lib/bundler/man/bundle-info.1.ronn +17 -0
  118. data/bundler/lib/bundler/man/bundle-init.1 +20 -0
  119. data/bundler/lib/bundler/man/bundle-init.1.ronn +31 -0
  120. data/bundler/lib/bundler/man/bundle-inject.1 +23 -0
  121. data/bundler/lib/bundler/man/bundle-inject.1.ronn +24 -0
  122. data/bundler/lib/bundler/man/bundle-install.1 +215 -0
  123. data/bundler/lib/bundler/man/bundle-install.1.ronn +383 -0
  124. data/bundler/lib/bundler/man/bundle-list.1 +35 -0
  125. data/bundler/lib/bundler/man/bundle-list.1.ronn +33 -0
  126. data/bundler/lib/bundler/man/bundle-lock.1 +60 -0
  127. data/bundler/lib/bundler/man/bundle-lock.1.ronn +94 -0
  128. data/bundler/lib/bundler/man/bundle-open.1 +32 -0
  129. data/bundler/lib/bundler/man/bundle-open.1.ronn +27 -0
  130. data/bundler/lib/bundler/man/bundle-outdated.1 +100 -0
  131. data/bundler/lib/bundler/man/bundle-outdated.1.ronn +106 -0
  132. data/bundler/lib/bundler/man/bundle-platform.1 +49 -0
  133. data/bundler/lib/bundler/man/bundle-platform.1.ronn +49 -0
  134. data/bundler/lib/bundler/man/bundle-plugin.1 +55 -0
  135. data/bundler/lib/bundler/man/bundle-plugin.1.ronn +59 -0
  136. data/bundler/lib/bundler/man/bundle-pristine.1 +23 -0
  137. data/bundler/lib/bundler/man/bundle-pristine.1.ronn +34 -0
  138. data/bundler/lib/bundler/man/bundle-remove.1 +21 -0
  139. data/bundler/lib/bundler/man/bundle-remove.1.ronn +23 -0
  140. data/bundler/lib/bundler/man/bundle-show.1 +16 -0
  141. data/bundler/lib/bundler/man/bundle-show.1.ronn +21 -0
  142. data/bundler/lib/bundler/man/bundle-update.1 +275 -0
  143. data/bundler/lib/bundler/man/bundle-update.1.ronn +351 -0
  144. data/bundler/lib/bundler/man/bundle-version.1 +22 -0
  145. data/bundler/lib/bundler/man/bundle-version.1.ronn +24 -0
  146. data/bundler/lib/bundler/man/bundle-viz.1 +30 -0
  147. data/bundler/lib/bundler/man/bundle-viz.1.ronn +32 -0
  148. data/bundler/lib/bundler/man/bundle.1 +102 -0
  149. data/bundler/lib/bundler/man/bundle.1.ronn +116 -0
  150. data/bundler/lib/bundler/man/gemfile.5 +470 -0
  151. data/bundler/lib/bundler/man/gemfile.5.ronn +552 -0
  152. data/bundler/lib/bundler/man/index.txt +29 -0
  153. data/bundler/lib/bundler/match_metadata.rb +17 -0
  154. data/bundler/lib/bundler/match_platform.rb +23 -0
  155. data/bundler/lib/bundler/match_remote_metadata.rb +29 -0
  156. data/bundler/lib/bundler/mirror.rb +221 -0
  157. data/bundler/lib/bundler/plugin/api/source.rb +321 -0
  158. data/bundler/lib/bundler/plugin/api.rb +81 -0
  159. data/bundler/lib/bundler/plugin/dsl.rb +53 -0
  160. data/bundler/lib/bundler/plugin/events.rb +61 -0
  161. data/bundler/lib/bundler/plugin/index.rb +193 -0
  162. data/bundler/lib/bundler/plugin/installer/git.rb +34 -0
  163. data/bundler/lib/bundler/plugin/installer/rubygems.rb +19 -0
  164. data/bundler/lib/bundler/plugin/installer.rb +112 -0
  165. data/bundler/lib/bundler/plugin/source_list.rb +31 -0
  166. data/bundler/lib/bundler/plugin.rb +359 -0
  167. data/bundler/lib/bundler/process_lock.rb +24 -0
  168. data/bundler/lib/bundler/remote_specification.rb +117 -0
  169. data/bundler/lib/bundler/resolver/base.rb +107 -0
  170. data/bundler/lib/bundler/resolver/candidate.rb +94 -0
  171. data/bundler/lib/bundler/resolver/incompatibility.rb +15 -0
  172. data/bundler/lib/bundler/resolver/package.rb +77 -0
  173. data/bundler/lib/bundler/resolver/root.rb +25 -0
  174. data/bundler/lib/bundler/resolver/spec_group.rb +79 -0
  175. data/bundler/lib/bundler/resolver.rb +462 -0
  176. data/bundler/lib/bundler/retry.rb +66 -0
  177. data/bundler/lib/bundler/ruby_dsl.rb +53 -0
  178. data/bundler/lib/bundler/ruby_version.rb +131 -0
  179. data/bundler/lib/bundler/rubygems_ext.rb +328 -0
  180. data/bundler/lib/bundler/rubygems_gem_installer.rb +137 -0
  181. data/bundler/lib/bundler/rubygems_integration.rb +493 -0
  182. data/bundler/lib/bundler/runtime.rb +307 -0
  183. data/bundler/lib/bundler/safe_marshal.rb +31 -0
  184. data/bundler/lib/bundler/self_manager.rb +186 -0
  185. data/bundler/lib/bundler/settings/validator.rb +102 -0
  186. data/bundler/lib/bundler/settings.rb +588 -0
  187. data/bundler/lib/bundler/setup.rb +33 -0
  188. data/bundler/lib/bundler/shared_helpers.rb +380 -0
  189. data/bundler/lib/bundler/similarity_detector.rb +63 -0
  190. data/bundler/lib/bundler/source/gemspec.rb +18 -0
  191. data/bundler/lib/bundler/source/git/git_proxy.rb +455 -0
  192. data/bundler/lib/bundler/source/git.rb +380 -0
  193. data/bundler/lib/bundler/source/metadata.rb +62 -0
  194. data/bundler/lib/bundler/source/path/installer.rb +53 -0
  195. data/bundler/lib/bundler/source/path.rb +261 -0
  196. data/bundler/lib/bundler/source/rubygems/remote.rb +68 -0
  197. data/bundler/lib/bundler/source/rubygems.rb +516 -0
  198. data/bundler/lib/bundler/source/rubygems_aggregate.rb +68 -0
  199. data/bundler/lib/bundler/source.rb +116 -0
  200. data/bundler/lib/bundler/source_list.rb +227 -0
  201. data/bundler/lib/bundler/source_map.rb +71 -0
  202. data/bundler/lib/bundler/spec_set.rb +247 -0
  203. data/bundler/lib/bundler/stub_specification.rb +119 -0
  204. data/bundler/lib/bundler/templates/.document +1 -0
  205. data/bundler/lib/bundler/templates/Executable +27 -0
  206. data/bundler/lib/bundler/templates/Executable.bundler +109 -0
  207. data/bundler/lib/bundler/templates/Executable.standalone +14 -0
  208. data/bundler/lib/bundler/templates/Gemfile +5 -0
  209. data/bundler/lib/bundler/templates/newgem/CHANGELOG.md.tt +5 -0
  210. data/bundler/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +84 -0
  211. data/bundler/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
  212. data/bundler/lib/bundler/templates/newgem/Gemfile.tt +26 -0
  213. data/bundler/lib/bundler/templates/newgem/LICENSE.txt.tt +21 -0
  214. data/bundler/lib/bundler/templates/newgem/README.md.tt +45 -0
  215. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +67 -0
  216. data/bundler/lib/bundler/templates/newgem/bin/console.tt +11 -0
  217. data/bundler/lib/bundler/templates/newgem/bin/setup.tt +8 -0
  218. data/bundler/lib/bundler/templates/newgem/circleci/config.yml.tt +25 -0
  219. data/bundler/lib/bundler/templates/newgem/exe/newgem.tt +3 -0
  220. data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
  221. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
  222. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
  223. data/bundler/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +9 -0
  224. data/bundler/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +6 -0
  225. data/bundler/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
  226. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +37 -0
  227. data/bundler/lib/bundler/templates/newgem/gitignore.tt +23 -0
  228. data/bundler/lib/bundler/templates/newgem/gitlab-ci.yml.tt +18 -0
  229. data/bundler/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +9 -0
  230. data/bundler/lib/bundler/templates/newgem/lib/newgem.rb.tt +15 -0
  231. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +51 -0
  232. data/bundler/lib/bundler/templates/newgem/rspec.tt +3 -0
  233. data/bundler/lib/bundler/templates/newgem/rubocop.yml.tt +13 -0
  234. data/bundler/lib/bundler/templates/newgem/sig/newgem.rbs.tt +8 -0
  235. data/bundler/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +11 -0
  236. data/bundler/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +15 -0
  237. data/bundler/lib/bundler/templates/newgem/standard.yml.tt +3 -0
  238. data/bundler/lib/bundler/templates/newgem/test/minitest/test_helper.rb.tt +6 -0
  239. data/bundler/lib/bundler/templates/newgem/test/minitest/test_newgem.rb.tt +13 -0
  240. data/bundler/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  241. data/bundler/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  242. data/bundler/lib/bundler/ui/rg_proxy.rb +19 -0
  243. data/bundler/lib/bundler/ui/shell.rb +165 -0
  244. data/bundler/lib/bundler/ui/silent.rb +85 -0
  245. data/bundler/lib/bundler/ui.rb +9 -0
  246. data/bundler/lib/bundler/uri_credentials_filter.rb +43 -0
  247. data/bundler/lib/bundler/uri_normalizer.rb +23 -0
  248. data/bundler/lib/bundler/vendor/.document +1 -0
  249. data/bundler/lib/bundler/vendor/connection_pool/LICENSE +20 -0
  250. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +174 -0
  251. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +3 -0
  252. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +56 -0
  253. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +175 -0
  254. data/bundler/lib/bundler/vendor/fileutils/LICENSE.txt +22 -0
  255. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +2694 -0
  256. data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +82 -0
  257. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +41 -0
  258. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +65 -0
  259. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +79 -0
  260. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1073 -0
  261. data/bundler/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
  262. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
  263. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
  264. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
  265. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
  266. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
  267. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
  268. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
  269. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
  270. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +60 -0
  271. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
  272. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
  273. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
  274. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +411 -0
  275. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +248 -0
  276. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
  277. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
  278. data/bundler/lib/bundler/vendor/thor/LICENSE.md +20 -0
  279. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +105 -0
  280. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +61 -0
  281. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +108 -0
  282. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +143 -0
  283. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +373 -0
  284. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +130 -0
  285. data/bundler/lib/bundler/vendor/thor/lib/thor/actions.rb +340 -0
  286. data/bundler/lib/bundler/vendor/thor/lib/thor/base.rb +825 -0
  287. data/bundler/lib/bundler/vendor/thor/lib/thor/command.rb +151 -0
  288. data/bundler/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +107 -0
  289. data/bundler/lib/bundler/vendor/thor/lib/thor/error.rb +106 -0
  290. data/bundler/lib/bundler/vendor/thor/lib/thor/group.rb +281 -0
  291. data/bundler/lib/bundler/vendor/thor/lib/thor/invocation.rb +178 -0
  292. data/bundler/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +37 -0
  293. data/bundler/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb +88 -0
  294. data/bundler/lib/bundler/vendor/thor/lib/thor/line_editor.rb +17 -0
  295. data/bundler/lib/bundler/vendor/thor/lib/thor/nested_context.rb +29 -0
  296. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +89 -0
  297. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +195 -0
  298. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/option.rb +178 -0
  299. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/options.rb +293 -0
  300. data/bundler/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -0
  301. data/bundler/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +72 -0
  302. data/bundler/lib/bundler/vendor/thor/lib/thor/runner.rb +335 -0
  303. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +388 -0
  304. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/color.rb +115 -0
  305. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/column_printer.rb +29 -0
  306. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/html.rb +84 -0
  307. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/lcs_diff.rb +49 -0
  308. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +134 -0
  309. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/terminal.rb +42 -0
  310. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +38 -0
  311. data/bundler/lib/bundler/vendor/thor/lib/thor/shell.rb +81 -0
  312. data/bundler/lib/bundler/vendor/thor/lib/thor/util.rb +285 -0
  313. data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +3 -0
  314. data/bundler/lib/bundler/vendor/thor/lib/thor.rb +663 -0
  315. data/bundler/lib/bundler/vendor/tsort/LICENSE.txt +22 -0
  316. data/bundler/lib/bundler/vendor/tsort/lib/tsort.rb +455 -0
  317. data/bundler/lib/bundler/vendor/uri/LICENSE.txt +22 -0
  318. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +853 -0
  319. data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +100 -0
  320. data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +267 -0
  321. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +1588 -0
  322. data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +125 -0
  323. data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +23 -0
  324. data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +261 -0
  325. data/bundler/lib/bundler/vendor/uri/lib/uri/ldaps.rb +22 -0
  326. data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +293 -0
  327. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +539 -0
  328. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +183 -0
  329. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +6 -0
  330. data/bundler/lib/bundler/vendor/uri/lib/uri/ws.rb +83 -0
  331. data/bundler/lib/bundler/vendor/uri/lib/uri/wss.rb +23 -0
  332. data/bundler/lib/bundler/vendor/uri/lib/uri.rb +104 -0
  333. data/bundler/lib/bundler/vendored_fileutils.rb +4 -0
  334. data/bundler/lib/bundler/vendored_net_http.rb +8 -0
  335. data/bundler/lib/bundler/vendored_persistent.rb +11 -0
  336. data/bundler/lib/bundler/vendored_pub_grub.rb +4 -0
  337. data/bundler/lib/bundler/vendored_thor.rb +8 -0
  338. data/bundler/lib/bundler/vendored_timeout.rb +8 -0
  339. data/bundler/lib/bundler/vendored_tsort.rb +4 -0
  340. data/bundler/lib/bundler/vendored_uri.rb +4 -0
  341. data/bundler/lib/bundler/version.rb +13 -0
  342. data/bundler/lib/bundler/vlad.rb +17 -0
  343. data/bundler/lib/bundler/worker.rb +117 -0
  344. data/bundler/lib/bundler/yaml_serializer.rb +93 -0
  345. data/bundler/lib/bundler.rb +665 -0
  346. data/{test/rubygems/bogussources.rb → exe/gem} +5 -2
  347. data/exe/update_rubygems +38 -0
  348. data/hide_lib_for_update/note.txt +0 -4
  349. data/lib/rubygems/available_set.rb +12 -12
  350. data/lib/rubygems/basic_specification.rb +75 -58
  351. data/lib/rubygems/bundler_version_finder.rb +77 -0
  352. data/lib/rubygems/ci_detector.rb +75 -0
  353. data/lib/rubygems/command.rb +144 -71
  354. data/lib/rubygems/command_manager.rb +64 -27
  355. data/lib/rubygems/commands/build_command.rb +88 -17
  356. data/lib/rubygems/commands/cert_command.rb +131 -83
  357. data/lib/rubygems/commands/check_command.rb +30 -27
  358. data/lib/rubygems/commands/cleanup_command.rb +57 -40
  359. data/lib/rubygems/commands/contents_command.rb +37 -39
  360. data/lib/rubygems/commands/dependency_command.rb +53 -65
  361. data/lib/rubygems/commands/environment_command.rb +32 -16
  362. data/lib/rubygems/commands/exec_command.rb +249 -0
  363. data/lib/rubygems/commands/fetch_command.rb +36 -19
  364. data/lib/rubygems/commands/generate_index_command.rb +40 -74
  365. data/lib/rubygems/commands/help_command.rb +22 -22
  366. data/lib/rubygems/commands/info_command.rb +38 -0
  367. data/lib/rubygems/commands/install_command.rb +67 -143
  368. data/lib/rubygems/commands/list_command.rb +10 -9
  369. data/lib/rubygems/commands/lock_command.rb +12 -14
  370. data/lib/rubygems/commands/mirror_command.rb +4 -4
  371. data/lib/rubygems/commands/open_command.rb +28 -26
  372. data/lib/rubygems/commands/outdated_command.rb +6 -6
  373. data/lib/rubygems/commands/owner_command.rb +51 -27
  374. data/lib/rubygems/commands/pristine_command.rb +99 -71
  375. data/lib/rubygems/commands/push_command.rb +53 -46
  376. data/lib/rubygems/commands/query_command.rb +21 -328
  377. data/lib/rubygems/commands/rdoc_command.rb +33 -33
  378. data/lib/rubygems/commands/search_command.rb +9 -9
  379. data/lib/rubygems/commands/server_command.rb +15 -76
  380. data/lib/rubygems/commands/setup_command.rb +370 -186
  381. data/lib/rubygems/commands/signin_command.rb +34 -0
  382. data/lib/rubygems/commands/signout_command.rb +32 -0
  383. data/lib/rubygems/commands/sources_command.rb +57 -41
  384. data/lib/rubygems/commands/specification_command.rb +38 -28
  385. data/lib/rubygems/commands/stale_command.rb +6 -5
  386. data/lib/rubygems/commands/uninstall_command.rb +96 -62
  387. data/lib/rubygems/commands/unpack_command.rb +44 -53
  388. data/lib/rubygems/commands/update_command.rb +155 -99
  389. data/lib/rubygems/commands/which_command.rb +14 -17
  390. data/lib/rubygems/commands/yank_command.rb +28 -32
  391. data/lib/rubygems/compatibility.rb +13 -32
  392. data/lib/rubygems/config_file.rb +214 -119
  393. data/lib/rubygems/core_ext/kernel_gem.rb +10 -16
  394. data/lib/rubygems/core_ext/kernel_require.rb +92 -90
  395. data/lib/rubygems/core_ext/kernel_warn.rb +49 -0
  396. data/lib/rubygems/core_ext/tcpsocket_init.rb +54 -0
  397. data/lib/rubygems/defaults.rb +184 -54
  398. data/lib/rubygems/dependency.rb +75 -62
  399. data/lib/rubygems/dependency_installer.rb +74 -230
  400. data/lib/rubygems/dependency_list.rb +32 -33
  401. data/lib/rubygems/deprecate.rb +113 -17
  402. data/lib/rubygems/doctor.rb +31 -31
  403. data/lib/rubygems/errors.rb +51 -13
  404. data/lib/rubygems/exceptions.rb +65 -35
  405. data/lib/rubygems/ext/build_error.rb +3 -1
  406. data/lib/rubygems/ext/builder.rb +103 -77
  407. data/lib/rubygems/ext/cargo_builder/link_flag_converter.rb +27 -0
  408. data/lib/rubygems/ext/cargo_builder.rb +360 -0
  409. data/lib/rubygems/ext/cmake_builder.rb +6 -7
  410. data/lib/rubygems/ext/configure_builder.rb +6 -9
  411. data/lib/rubygems/ext/ext_conf_builder.rb +40 -61
  412. data/lib/rubygems/ext/rake_builder.rb +18 -21
  413. data/lib/rubygems/ext.rb +8 -7
  414. data/lib/rubygems/gem_runner.rb +19 -21
  415. data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +163 -0
  416. data/lib/rubygems/gemcutter_utilities/webauthn_listener.rb +105 -0
  417. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +78 -0
  418. data/lib/rubygems/gemcutter_utilities.rb +246 -43
  419. data/lib/rubygems/install_default_message.rb +3 -3
  420. data/lib/rubygems/install_message.rb +3 -3
  421. data/lib/rubygems/install_update_options.rb +104 -98
  422. data/lib/rubygems/installer.rb +407 -225
  423. data/lib/rubygems/installer_uninstaller_utils.rb +27 -0
  424. data/lib/rubygems/local_remote_options.rb +29 -32
  425. data/lib/rubygems/name_tuple.rb +18 -23
  426. data/lib/rubygems/net/http.rb +3 -0
  427. data/lib/rubygems/net-http/LICENSE.txt +22 -0
  428. data/lib/rubygems/net-http/lib/net/http/backward.rb +40 -0
  429. data/lib/rubygems/net-http/lib/net/http/exceptions.rb +34 -0
  430. data/lib/rubygems/net-http/lib/net/http/generic_request.rb +414 -0
  431. data/lib/rubygems/net-http/lib/net/http/header.rb +981 -0
  432. data/lib/rubygems/net-http/lib/net/http/proxy_delta.rb +17 -0
  433. data/lib/rubygems/net-http/lib/net/http/request.rb +88 -0
  434. data/lib/rubygems/net-http/lib/net/http/requests.rb +425 -0
  435. data/lib/rubygems/net-http/lib/net/http/response.rb +738 -0
  436. data/lib/rubygems/net-http/lib/net/http/responses.rb +1174 -0
  437. data/lib/rubygems/net-http/lib/net/http/status.rb +84 -0
  438. data/lib/rubygems/net-http/lib/net/http.rb +2496 -0
  439. data/lib/rubygems/net-http/lib/net/https.rb +23 -0
  440. data/lib/rubygems/net-protocol/LICENSE.txt +22 -0
  441. data/lib/rubygems/net-protocol/lib/net/protocol.rb +544 -0
  442. data/lib/rubygems/openssl.rb +7 -0
  443. data/lib/rubygems/optparse/.document +1 -0
  444. data/lib/rubygems/optparse/COPYING +56 -0
  445. data/lib/rubygems/optparse/lib/optionparser.rb +2 -0
  446. data/lib/rubygems/optparse/lib/optparse/ac.rb +54 -0
  447. data/lib/rubygems/optparse/lib/optparse/date.rb +18 -0
  448. data/lib/rubygems/optparse/lib/optparse/kwargs.rb +22 -0
  449. data/lib/rubygems/optparse/lib/optparse/shellwords.rb +7 -0
  450. data/lib/rubygems/optparse/lib/optparse/time.rb +11 -0
  451. data/lib/rubygems/optparse/lib/optparse/uri.rb +7 -0
  452. data/lib/rubygems/optparse/lib/optparse/version.rb +71 -0
  453. data/lib/rubygems/optparse/lib/optparse.rb +2330 -0
  454. data/lib/rubygems/optparse.rb +3 -0
  455. data/lib/rubygems/package/digest_io.rb +5 -7
  456. data/lib/rubygems/package/file_source.rb +6 -8
  457. data/lib/rubygems/package/io_source.rb +6 -4
  458. data/lib/rubygems/package/old.rb +19 -28
  459. data/lib/rubygems/package/source.rb +1 -1
  460. data/lib/rubygems/package/tar_header.rb +114 -93
  461. data/lib/rubygems/package/tar_reader/entry.rb +116 -22
  462. data/lib/rubygems/package/tar_reader.rb +18 -40
  463. data/lib/rubygems/package/tar_writer.rb +42 -56
  464. data/lib/rubygems/package.rb +245 -145
  465. data/lib/rubygems/package_task.rb +8 -14
  466. data/lib/rubygems/path_support.rb +21 -16
  467. data/lib/rubygems/platform.rb +135 -74
  468. data/lib/rubygems/psych_tree.rb +3 -2
  469. data/lib/rubygems/query_utils.rb +349 -0
  470. data/lib/rubygems/rdoc.rb +4 -326
  471. data/lib/rubygems/remote_fetcher.rb +99 -181
  472. data/lib/rubygems/request/connection_pools.rb +31 -24
  473. data/lib/rubygems/request/http_pool.rb +6 -7
  474. data/lib/rubygems/request/https_pool.rb +2 -3
  475. data/lib/rubygems/request.rb +103 -53
  476. data/lib/rubygems/request_set/gem_dependency_api.rb +182 -190
  477. data/lib/rubygems/request_set/lockfile/parser.rb +42 -52
  478. data/lib/rubygems/request_set/lockfile/tokenizer.rb +34 -24
  479. data/lib/rubygems/request_set/lockfile.rb +32 -35
  480. data/lib/rubygems/request_set.rb +115 -71
  481. data/lib/rubygems/requirement.rb +77 -68
  482. data/lib/rubygems/resolv/LICENSE.txt +22 -0
  483. data/lib/rubygems/resolv/lib/resolv.rb +3387 -0
  484. data/lib/rubygems/resolver/activation_request.rb +34 -61
  485. data/lib/rubygems/resolver/api_set/gem_parser.rb +24 -0
  486. data/lib/rubygems/resolver/api_set.rb +40 -32
  487. data/lib/rubygems/resolver/api_specification.rb +37 -18
  488. data/lib/rubygems/resolver/best_set.rb +15 -17
  489. data/lib/rubygems/resolver/composed_set.rb +9 -11
  490. data/lib/rubygems/resolver/conflict.rb +19 -33
  491. data/lib/rubygems/resolver/current_set.rb +2 -4
  492. data/lib/rubygems/resolver/dependency_request.rb +8 -9
  493. data/lib/rubygems/resolver/git_set.rb +8 -10
  494. data/lib/rubygems/resolver/git_specification.rb +11 -13
  495. data/lib/rubygems/resolver/index_set.rb +13 -15
  496. data/lib/rubygems/resolver/index_specification.rb +42 -11
  497. data/lib/rubygems/resolver/installed_specification.rb +9 -11
  498. data/lib/rubygems/resolver/installer_set.rb +87 -45
  499. data/lib/rubygems/resolver/local_specification.rb +5 -7
  500. data/lib/rubygems/resolver/lock_set.rb +13 -15
  501. data/lib/rubygems/resolver/lock_specification.rb +13 -15
  502. data/lib/rubygems/resolver/molinillo/LICENSE +9 -0
  503. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
  504. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/specification_provider.rb +88 -0
  505. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/action.rb +36 -0
  506. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +66 -0
  507. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +62 -0
  508. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +63 -0
  509. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +61 -0
  510. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/log.rb +126 -0
  511. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/set_payload.rb +46 -0
  512. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/tag.rb +36 -0
  513. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/vertex.rb +164 -0
  514. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +110 -146
  515. data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +83 -9
  516. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +2 -1
  517. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb +13 -1
  518. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/ui.rb +3 -1
  519. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb +552 -172
  520. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolver.rb +3 -2
  521. data/lib/rubygems/resolver/molinillo/lib/molinillo/state.rb +12 -6
  522. data/lib/rubygems/resolver/molinillo/lib/molinillo.rb +6 -5
  523. data/lib/rubygems/resolver/molinillo.rb +2 -1
  524. data/lib/rubygems/resolver/requirement_list.rb +2 -2
  525. data/lib/rubygems/resolver/set.rb +3 -5
  526. data/lib/rubygems/resolver/source_set.rb +6 -7
  527. data/lib/rubygems/resolver/spec_specification.rb +16 -4
  528. data/lib/rubygems/resolver/specification.rb +25 -10
  529. data/lib/rubygems/resolver/stats.rb +1 -0
  530. data/lib/rubygems/resolver/vendor_set.rb +6 -8
  531. data/lib/rubygems/resolver/vendor_specification.rb +6 -8
  532. data/lib/rubygems/resolver.rb +121 -72
  533. data/lib/rubygems/s3_uri_signer.rb +177 -0
  534. data/lib/rubygems/safe_marshal/elements.rb +138 -0
  535. data/lib/rubygems/safe_marshal/reader.rb +306 -0
  536. data/lib/rubygems/safe_marshal/visitors/stream_printer.rb +31 -0
  537. data/lib/rubygems/safe_marshal/visitors/to_ruby.rb +385 -0
  538. data/lib/rubygems/safe_marshal/visitors/visitor.rb +74 -0
  539. data/lib/rubygems/safe_marshal.rb +74 -0
  540. data/lib/rubygems/safe_yaml.rb +36 -0
  541. data/lib/rubygems/security/policies.rb +49 -51
  542. data/lib/rubygems/security/policy.rb +46 -53
  543. data/lib/rubygems/security/signer.rb +86 -29
  544. data/lib/rubygems/security/trust_dir.rb +22 -24
  545. data/lib/rubygems/security.rb +101 -82
  546. data/lib/rubygems/security_option.rb +43 -0
  547. data/lib/rubygems/shellwords.rb +3 -0
  548. data/lib/rubygems/source/git.rb +40 -42
  549. data/lib/rubygems/source/installed.rb +5 -9
  550. data/lib/rubygems/source/local.rb +30 -33
  551. data/lib/rubygems/source/lock.rb +10 -10
  552. data/lib/rubygems/source/specific_file.rb +7 -9
  553. data/lib/rubygems/source/vendor.rb +3 -7
  554. data/lib/rubygems/source.rb +78 -68
  555. data/lib/rubygems/source_list.rb +11 -15
  556. data/lib/rubygems/spec_fetcher.rb +71 -83
  557. data/lib/rubygems/specification.rb +833 -1115
  558. data/lib/rubygems/specification_policy.rb +538 -0
  559. data/lib/rubygems/ssl_certs/rubygems.org/GlobalSignRootCA.pem +21 -0
  560. data/lib/rubygems/ssl_certs/rubygems.org/GlobalSignRootCA_R3.pem +21 -0
  561. data/lib/rubygems/stub_specification.rb +55 -57
  562. data/lib/rubygems/text.rb +39 -27
  563. data/lib/rubygems/timeout/LICENSE.txt +22 -0
  564. data/lib/rubygems/timeout/lib/timeout.rb +199 -0
  565. data/lib/rubygems/timeout.rb +3 -0
  566. data/lib/rubygems/tsort/.document +1 -0
  567. data/lib/rubygems/tsort/LICENSE.txt +22 -0
  568. data/lib/rubygems/tsort/lib/tsort.rb +455 -0
  569. data/lib/rubygems/tsort.rb +3 -0
  570. data/lib/rubygems/uninstaller.rb +150 -87
  571. data/lib/rubygems/unknown_command_spell_checker.rb +21 -0
  572. data/lib/rubygems/update_suggestion.rb +56 -0
  573. data/lib/rubygems/uri.rb +126 -0
  574. data/lib/rubygems/uri_formatter.rb +4 -7
  575. data/lib/rubygems/user_interaction.rb +92 -146
  576. data/lib/rubygems/util/licenses.rb +712 -317
  577. data/lib/rubygems/util/list.rb +5 -2
  578. data/lib/rubygems/util.rb +58 -75
  579. data/lib/rubygems/validator.rb +26 -48
  580. data/lib/rubygems/version.rb +106 -56
  581. data/lib/rubygems/version_option.rb +22 -14
  582. data/lib/rubygems/yaml_serializer.rb +93 -0
  583. data/lib/rubygems.rb +427 -361
  584. data/rubygems-update.gemspec +38 -0
  585. data/setup.rb +13 -27
  586. metadata +500 -363
  587. data/.autotest +0 -71
  588. data/.document +0 -5
  589. data/.travis.yml +0 -46
  590. data/CONTRIBUTING.rdoc +0 -129
  591. data/CVE-2013-4287.txt +0 -35
  592. data/CVE-2013-4363.txt +0 -45
  593. data/CVE-2015-3900.txt +0 -40
  594. data/History.txt +0 -3105
  595. data/MAINTAINERS.md +0 -5
  596. data/POLICIES.rdoc +0 -61
  597. data/README.rdoc +0 -54
  598. data/Rakefile +0 -449
  599. data/UPGRADING.rdoc +0 -92
  600. data/appveyor.yml +0 -36
  601. data/bin/gem +0 -25
  602. data/bin/update_rubygems +0 -37
  603. data/lib/gauntlet_rubygems.rb +0 -51
  604. data/lib/rubygems/indexer.rb +0 -434
  605. data/lib/rubygems/installer_test_case.rb +0 -194
  606. data/lib/rubygems/mock_gem_ui.rb +0 -89
  607. data/lib/rubygems/package/tar_test_case.rb +0 -147
  608. data/lib/rubygems/psych_additions.rb +0 -10
  609. data/lib/rubygems/server.rb +0 -869
  610. data/lib/rubygems/source_local.rb +0 -6
  611. data/lib/rubygems/source_specific_file.rb +0 -5
  612. data/lib/rubygems/ssl_certs/AddTrustExternalCARoot-2048.pem +0 -25
  613. data/lib/rubygems/ssl_certs/AddTrustExternalCARoot.pem +0 -32
  614. data/lib/rubygems/ssl_certs/Class3PublicPrimaryCertificationAuthority.pem +0 -14
  615. data/lib/rubygems/ssl_certs/DigiCertHighAssuranceEVRootCA.pem +0 -23
  616. data/lib/rubygems/ssl_certs/EntrustnetSecureServerCertificationAuthority.pem +0 -28
  617. data/lib/rubygems/ssl_certs/GeoTrustGlobalCA.pem +0 -20
  618. data/lib/rubygems/syck_hack.rb +0 -77
  619. data/lib/rubygems/test_case.rb +0 -1496
  620. data/lib/rubygems/test_utilities.rb +0 -384
  621. data/lib/ubygems.rb +0 -11
  622. data/test/rubygems/alternate_cert.pem +0 -18
  623. data/test/rubygems/alternate_cert_32.pem +0 -18
  624. data/test/rubygems/alternate_key.pem +0 -27
  625. data/test/rubygems/bad_rake.rb +0 -2
  626. data/test/rubygems/ca_cert.pem +0 -68
  627. data/test/rubygems/child_cert.pem +0 -18
  628. data/test/rubygems/child_cert_32.pem +0 -18
  629. data/test/rubygems/child_key.pem +0 -27
  630. data/test/rubygems/client.pem +0 -49
  631. data/test/rubygems/data/gem-private_key.pem +0 -27
  632. data/test/rubygems/data/gem-public_cert.pem +0 -20
  633. data/test/rubygems/data/null-type.gemspec.rz +0 -0
  634. data/test/rubygems/encrypted_private_key.pem +0 -30
  635. data/test/rubygems/expired_cert.pem +0 -18
  636. data/test/rubygems/fake_certlib/openssl.rb +0 -8
  637. data/test/rubygems/fix_openssl_warnings.rb +0 -13
  638. data/test/rubygems/foo/discover.rb +0 -1
  639. data/test/rubygems/future_cert.pem +0 -18
  640. data/test/rubygems/future_cert_32.pem +0 -18
  641. data/test/rubygems/good_rake.rb +0 -2
  642. data/test/rubygems/grandchild_cert.pem +0 -18
  643. data/test/rubygems/grandchild_cert_32.pem +0 -18
  644. data/test/rubygems/grandchild_key.pem +0 -27
  645. data/test/rubygems/invalid_client.pem +0 -49
  646. data/test/rubygems/invalid_issuer_cert.pem +0 -18
  647. data/test/rubygems/invalid_issuer_cert_32.pem +0 -18
  648. data/test/rubygems/invalid_key.pem +0 -27
  649. data/test/rubygems/invalid_signer_cert.pem +0 -18
  650. data/test/rubygems/invalid_signer_cert_32.pem +0 -18
  651. data/test/rubygems/invalidchild_cert.pem +0 -18
  652. data/test/rubygems/invalidchild_cert_32.pem +0 -18
  653. data/test/rubygems/invalidchild_key.pem +0 -27
  654. data/test/rubygems/plugin/exception/rubygems_plugin.rb +0 -3
  655. data/test/rubygems/plugin/load/rubygems_plugin.rb +0 -4
  656. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +0 -3
  657. data/test/rubygems/private_key.pem +0 -27
  658. data/test/rubygems/public_cert.pem +0 -18
  659. data/test/rubygems/public_cert_32.pem +0 -18
  660. data/test/rubygems/public_key.pem +0 -9
  661. data/test/rubygems/rubygems/commands/crash_command.rb +0 -6
  662. data/test/rubygems/rubygems_plugin.rb +0 -22
  663. data/test/rubygems/sff/discover.rb +0 -1
  664. data/test/rubygems/simple_gem.rb +0 -67
  665. data/test/rubygems/specifications/bar-0.0.2.gemspec +0 -9
  666. data/test/rubygems/specifications/foo-0.0.1-x86-mswin32.gemspec +0 -0
  667. data/test/rubygems/ssl_cert.pem +0 -19
  668. data/test/rubygems/ssl_key.pem +0 -15
  669. data/test/rubygems/test_bundled_ca.rb +0 -59
  670. data/test/rubygems/test_config.rb +0 -24
  671. data/test/rubygems/test_deprecate.rb +0 -77
  672. data/test/rubygems/test_gem.rb +0 -1718
  673. data/test/rubygems/test_gem_available_set.rb +0 -130
  674. data/test/rubygems/test_gem_command.rb +0 -248
  675. data/test/rubygems/test_gem_command_manager.rb +0 -264
  676. data/test/rubygems/test_gem_commands_build_command.rb +0 -121
  677. data/test/rubygems/test_gem_commands_cert_command.rb +0 -671
  678. data/test/rubygems/test_gem_commands_check_command.rb +0 -69
  679. data/test/rubygems/test_gem_commands_cleanup_command.rb +0 -197
  680. data/test/rubygems/test_gem_commands_contents_command.rb +0 -240
  681. data/test/rubygems/test_gem_commands_dependency_command.rb +0 -230
  682. data/test/rubygems/test_gem_commands_environment_command.rb +0 -154
  683. data/test/rubygems/test_gem_commands_fetch_command.rb +0 -127
  684. data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -51
  685. data/test/rubygems/test_gem_commands_help_command.rb +0 -75
  686. data/test/rubygems/test_gem_commands_install_command.rb +0 -1007
  687. data/test/rubygems/test_gem_commands_list_command.rb +0 -34
  688. data/test/rubygems/test_gem_commands_lock_command.rb +0 -69
  689. data/test/rubygems/test_gem_commands_mirror.rb +0 -20
  690. data/test/rubygems/test_gem_commands_open_command.rb +0 -70
  691. data/test/rubygems/test_gem_commands_outdated_command.rb +0 -33
  692. data/test/rubygems/test_gem_commands_owner_command.rb +0 -205
  693. data/test/rubygems/test_gem_commands_pristine_command.rb +0 -491
  694. data/test/rubygems/test_gem_commands_push_command.rb +0 -330
  695. data/test/rubygems/test_gem_commands_query_command.rb +0 -657
  696. data/test/rubygems/test_gem_commands_search_command.rb +0 -18
  697. data/test/rubygems/test_gem_commands_server_command.rb +0 -60
  698. data/test/rubygems/test_gem_commands_setup_command.rb +0 -136
  699. data/test/rubygems/test_gem_commands_sources_command.rb +0 -249
  700. data/test/rubygems/test_gem_commands_specification_command.rb +0 -251
  701. data/test/rubygems/test_gem_commands_stale_command.rb +0 -43
  702. data/test/rubygems/test_gem_commands_uninstall_command.rb +0 -283
  703. data/test/rubygems/test_gem_commands_unpack_command.rb +0 -209
  704. data/test/rubygems/test_gem_commands_update_command.rb +0 -514
  705. data/test/rubygems/test_gem_commands_which_command.rb +0 -87
  706. data/test/rubygems/test_gem_commands_yank_command.rb +0 -100
  707. data/test/rubygems/test_gem_config_file.rb +0 -491
  708. data/test/rubygems/test_gem_dependency.rb +0 -362
  709. data/test/rubygems/test_gem_dependency_installer.rb +0 -1235
  710. data/test/rubygems/test_gem_dependency_list.rb +0 -260
  711. data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -29
  712. data/test/rubygems/test_gem_doctor.rb +0 -169
  713. data/test/rubygems/test_gem_ext_builder.rb +0 -341
  714. data/test/rubygems/test_gem_ext_cmake_builder.rb +0 -87
  715. data/test/rubygems/test_gem_ext_configure_builder.rb +0 -87
  716. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +0 -211
  717. data/test/rubygems/test_gem_ext_rake_builder.rb +0 -65
  718. data/test/rubygems/test_gem_gem_runner.rb +0 -69
  719. data/test/rubygems/test_gem_gemcutter_utilities.rb +0 -235
  720. data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -62
  721. data/test/rubygems/test_gem_indexer.rb +0 -367
  722. data/test/rubygems/test_gem_install_update_options.rb +0 -197
  723. data/test/rubygems/test_gem_installer.rb +0 -1552
  724. data/test/rubygems/test_gem_local_remote_options.rb +0 -134
  725. data/test/rubygems/test_gem_name_tuple.rb +0 -45
  726. data/test/rubygems/test_gem_package.rb +0 -876
  727. data/test/rubygems/test_gem_package_old.rb +0 -90
  728. data/test/rubygems/test_gem_package_tar_header.rb +0 -147
  729. data/test/rubygems/test_gem_package_tar_reader.rb +0 -90
  730. data/test/rubygems/test_gem_package_tar_reader_entry.rb +0 -142
  731. data/test/rubygems/test_gem_package_tar_writer.rb +0 -264
  732. data/test/rubygems/test_gem_package_task.rb +0 -84
  733. data/test/rubygems/test_gem_path_support.rb +0 -121
  734. data/test/rubygems/test_gem_platform.rb +0 -308
  735. data/test/rubygems/test_gem_rdoc.rb +0 -270
  736. data/test/rubygems/test_gem_remote_fetcher.rb +0 -1051
  737. data/test/rubygems/test_gem_request.rb +0 -363
  738. data/test/rubygems/test_gem_request_connection_pools.rb +0 -130
  739. data/test/rubygems/test_gem_request_set.rb +0 -595
  740. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +0 -831
  741. data/test/rubygems/test_gem_request_set_lockfile.rb +0 -470
  742. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +0 -549
  743. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +0 -306
  744. data/test/rubygems/test_gem_requirement.rb +0 -387
  745. data/test/rubygems/test_gem_resolver.rb +0 -715
  746. data/test/rubygems/test_gem_resolver_activation_request.rb +0 -74
  747. data/test/rubygems/test_gem_resolver_api_set.rb +0 -209
  748. data/test/rubygems/test_gem_resolver_api_specification.rb +0 -145
  749. data/test/rubygems/test_gem_resolver_best_set.rb +0 -138
  750. data/test/rubygems/test_gem_resolver_composed_set.rb +0 -46
  751. data/test/rubygems/test_gem_resolver_conflict.rb +0 -88
  752. data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -85
  753. data/test/rubygems/test_gem_resolver_git_set.rb +0 -190
  754. data/test/rubygems/test_gem_resolver_git_specification.rb +0 -114
  755. data/test/rubygems/test_gem_resolver_index_set.rb +0 -90
  756. data/test/rubygems/test_gem_resolver_index_specification.rb +0 -90
  757. data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -50
  758. data/test/rubygems/test_gem_resolver_installer_set.rb +0 -258
  759. data/test/rubygems/test_gem_resolver_local_specification.rb +0 -46
  760. data/test/rubygems/test_gem_resolver_lock_set.rb +0 -64
  761. data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -100
  762. data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -21
  763. data/test/rubygems/test_gem_resolver_specification.rb +0 -65
  764. data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -84
  765. data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -84
  766. data/test/rubygems/test_gem_security.rb +0 -307
  767. data/test/rubygems/test_gem_security_policy.rb +0 -541
  768. data/test/rubygems/test_gem_security_signer.rb +0 -209
  769. data/test/rubygems/test_gem_security_trust_dir.rb +0 -101
  770. data/test/rubygems/test_gem_server.rb +0 -409
  771. data/test/rubygems/test_gem_silent_ui.rb +0 -117
  772. data/test/rubygems/test_gem_source.rb +0 -242
  773. data/test/rubygems/test_gem_source_fetch_problem.rb +0 -20
  774. data/test/rubygems/test_gem_source_git.rb +0 -309
  775. data/test/rubygems/test_gem_source_installed.rb +0 -37
  776. data/test/rubygems/test_gem_source_list.rb +0 -118
  777. data/test/rubygems/test_gem_source_local.rb +0 -107
  778. data/test/rubygems/test_gem_source_lock.rb +0 -115
  779. data/test/rubygems/test_gem_source_specific_file.rb +0 -76
  780. data/test/rubygems/test_gem_source_vendor.rb +0 -32
  781. data/test/rubygems/test_gem_spec_fetcher.rb +0 -311
  782. data/test/rubygems/test_gem_specification.rb +0 -3519
  783. data/test/rubygems/test_gem_stream_ui.rb +0 -239
  784. data/test/rubygems/test_gem_stub_specification.rb +0 -217
  785. data/test/rubygems/test_gem_text.rb +0 -77
  786. data/test/rubygems/test_gem_uninstaller.rb +0 -485
  787. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -33
  788. data/test/rubygems/test_gem_uri_formatter.rb +0 -29
  789. data/test/rubygems/test_gem_util.rb +0 -40
  790. data/test/rubygems/test_gem_validator.rb +0 -46
  791. data/test/rubygems/test_gem_version.rb +0 -222
  792. data/test/rubygems/test_gem_version_option.rb +0 -152
  793. data/test/rubygems/test_kernel.rb +0 -86
  794. data/test/rubygems/test_require.rb +0 -322
  795. data/test/rubygems/wrong_key_cert.pem +0 -18
  796. data/test/rubygems/wrong_key_cert_32.pem +0 -18
  797. data/util/CL2notes +0 -56
  798. data/util/create_certs.rb +0 -157
  799. data/util/create_encrypted_key.rb +0 -17
  800. data/util/generate_spdx_license_list.rb +0 -51
  801. data/util/update_bundled_ca_certificates.rb +0 -118
@@ -1,16 +1,17 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  #--
3
4
  # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
4
5
  # All rights reserved.
5
6
  # See LICENSE.txt for permissions.
6
7
  #++
7
8
 
8
- require 'rubygems/command'
9
- require 'rubygems/exceptions'
10
- require 'rubygems/package'
11
- require 'rubygems/ext'
12
- require 'rubygems/user_interaction'
13
- require 'fileutils'
9
+ require_relative "installer_uninstaller_utils"
10
+ require_relative "exceptions"
11
+ require_relative "deprecate"
12
+ require_relative "package"
13
+ require_relative "ext"
14
+ require_relative "user_interaction"
14
15
 
15
16
  ##
16
17
  # The installer installs the files contained in the .gem into the Gem.home.
@@ -26,12 +27,13 @@ require 'fileutils'
26
27
  # file. See Gem.pre_install and Gem.post_install for details.
27
28
 
28
29
  class Gem::Installer
30
+ extend Gem::Deprecate
29
31
 
30
32
  ##
31
33
  # Paths where env(1) might live. Some systems are broken and have it in
32
34
  # /bin
33
35
 
34
- ENV_PATHS = %w[/usr/bin/env /bin/env]
36
+ ENV_PATHS = %w[/usr/bin/env /bin/env].freeze
35
37
 
36
38
  ##
37
39
  # Deprecated in favor of Gem::Ext::BuildError
@@ -40,10 +42,7 @@ class Gem::Installer
40
42
 
41
43
  include Gem::UserInteraction
42
44
 
43
- ##
44
- # Filename of the gem being installed.
45
-
46
- attr_reader :gem
45
+ include Gem::InstallerUninstallerUtils
47
46
 
48
47
  ##
49
48
  # The directory a gem's executables will be installed into
@@ -62,22 +61,35 @@ class Gem::Installer
62
61
 
63
62
  attr_reader :options
64
63
 
65
- @path_warning = false
64
+ ##
65
+ # The gem package instance.
66
+
67
+ attr_reader :package
66
68
 
67
- @install_lock = Mutex.new
69
+ @path_warning = false
68
70
 
69
71
  class << self
72
+ #
73
+ # Changes in rubygems to lazily loading `rubygems/command` (in order to
74
+ # lazily load `optparse` as a side effect) affect bundler's custom installer
75
+ # which uses `Gem::Command` without requiring it (up until bundler 2.2.29).
76
+ # This hook is to compensate for that missing require.
77
+ #
78
+ # TODO: Remove when rubygems no longer supports running on bundler older
79
+ # than 2.2.29.
70
80
 
71
- ##
72
- # True if we've warned about PATH not including Gem.bindir
81
+ def inherited(klass)
82
+ if klass.name == "Bundler::RubyGemsGemInstaller"
83
+ require "rubygems/command"
84
+ end
73
85
 
74
- attr_accessor :path_warning
86
+ super(klass)
87
+ end
75
88
 
76
89
  ##
77
- # Certain aspects of the install process are not thread-safe. This lock is
78
- # used to allow multiple threads to install Gems at the same time.
90
+ # True if we've warned about PATH not including Gem.bindir
79
91
 
80
- attr_reader :install_lock
92
+ attr_accessor :path_warning
81
93
 
82
94
  ##
83
95
  # Overrides the executable format.
@@ -92,13 +104,12 @@ class Gem::Installer
92
104
  def exec_format
93
105
  @exec_format ||= Gem.default_exec_format
94
106
  end
95
-
96
107
  end
97
108
 
98
109
  ##
99
110
  # Construct an installer object for the gem file located at +path+
100
111
 
101
- def self.at path, options = {}
112
+ def self.at(path, options = {})
102
113
  security_policy = options[:security_policy]
103
114
  package = Gem::Package.new path, security_policy
104
115
  new package, options
@@ -107,22 +118,28 @@ class Gem::Installer
107
118
  class FakePackage
108
119
  attr_accessor :spec
109
120
 
121
+ attr_accessor :dir_mode
122
+ attr_accessor :prog_mode
123
+ attr_accessor :data_mode
124
+
110
125
  def initialize(spec)
111
126
  @spec = spec
112
127
  end
113
128
 
114
- def extract_files destination_dir, pattern = '*'
129
+ def extract_files(destination_dir, pattern = "*")
115
130
  FileUtils.mkdir_p destination_dir
116
131
 
117
132
  spec.files.each do |file|
118
133
  file = File.join destination_dir, file
119
134
  next if File.exist? file
120
135
  FileUtils.mkdir_p File.dirname(file)
121
- File.open file, 'w' do |fp| fp.puts "# #{file}" end
136
+ File.open file, "w" do |fp|
137
+ fp.puts "# #{file}"
138
+ end
122
139
  end
123
140
  end
124
141
 
125
- def copy_to path
142
+ def copy_to(path)
126
143
  end
127
144
  end
128
145
 
@@ -130,14 +147,15 @@ class Gem::Installer
130
147
  # Construct an installer object for an ephemeral gem (one where we don't
131
148
  # actually have a .gem file, just a spec)
132
149
 
133
- def self.for_spec spec, options = {}
150
+ def self.for_spec(spec, options = {})
134
151
  # FIXME: we should have a real Package class for this
135
152
  new FakePackage.new(spec), options
136
153
  end
137
154
 
138
155
  ##
139
- # Constructs an Installer instance that will install the gem located at
140
- # +gem+. +options+ is a Hash with the following keys:
156
+ # Constructs an Installer instance that will install the gem at +package+ which
157
+ # can either be a path or an instance of Gem::Package. +options+ is a Hash
158
+ # with the following keys:
141
159
  #
142
160
  # :bin_dir:: Where to put a bin wrapper if needed.
143
161
  # :development:: Whether or not development dependencies should be installed.
@@ -157,26 +175,26 @@ class Gem::Installer
157
175
  # :wrappers:: Install wrappers if true, symlinks if false.
158
176
  # :build_args:: An Array of arguments to pass to the extension builder
159
177
  # process. If not set, then Gem::Command.build_args is used
178
+ # :post_install_message:: Print gem post install message if true
160
179
 
161
180
  def initialize(package, options={})
162
- require 'fileutils'
181
+ require "fileutils"
163
182
 
164
183
  @options = options
165
- if package.is_a? String
166
- security_policy = options[:security_policy]
167
- @package = Gem::Package.new package, security_policy
168
- if $VERBOSE
169
- warn "constructing an Installer object with a string is deprecated. Please use Gem::Installer.at (called from: #{caller.first})"
170
- end
171
- else
172
- @package = package
173
- end
184
+ @package = package
174
185
 
175
186
  process_options
176
187
 
177
- if options[:user_install] and not options[:unpack] then
178
- @gem_home = Gem.user_dir
179
- @bin_dir = Gem.bindir gem_home unless options[:bin_dir]
188
+ @package.dir_mode = options[:dir_mode]
189
+ @package.prog_mode = options[:prog_mode]
190
+ @package.data_mode = options[:data_mode]
191
+
192
+ if @gem_home == Gem.user_dir
193
+ # If we get here, then one of the following likely happened:
194
+ # - `--user-install` was specified
195
+ # - `Gem::PathSupport#home` fell back to `Gem.user_dir`
196
+ # - GEM_HOME was manually set to `Gem.user_dir`
197
+
180
198
  check_that_user_bin_dir_is_in_path
181
199
  end
182
200
  end
@@ -186,15 +204,15 @@ class Gem::Installer
186
204
  #
187
205
  # If +@force+ is set +filename+ is overwritten.
188
206
  #
189
- # If +filename+ exists and is a RubyGems wrapper for different gem the user
190
- # is consulted.
207
+ # If +filename+ exists and it is a RubyGems wrapper for a different gem, then
208
+ # the user is consulted.
191
209
  #
192
210
  # If +filename+ exists and +@bin_dir+ is Gem.default_bindir (/usr/local) the
193
211
  # user is consulted.
194
212
  #
195
213
  # Otherwise +filename+ is overwritten.
196
214
 
197
- def check_executable_overwrite filename # :nodoc:
215
+ def check_executable_overwrite(filename) # :nodoc:
198
216
  return if @force
199
217
 
200
218
  generated_bin = File.join @bin_dir, formatted_program_filename(filename)
@@ -204,33 +222,45 @@ class Gem::Installer
204
222
  ruby_executable = false
205
223
  existing = nil
206
224
 
207
- open generated_bin, 'rb' do |io|
208
- next unless io.gets =~ /^#!/ # shebang
225
+ File.open generated_bin, "rb" do |io|
226
+ line = io.gets
227
+ shebang = /^#!.*ruby/o
228
+
229
+ # TruffleRuby uses a bash prelude in default launchers
230
+ if load_relative_enabled? || RUBY_ENGINE == "truffleruby"
231
+ until line.nil? || shebang.match?(line) do
232
+ line = io.gets
233
+ end
234
+ end
235
+
236
+ next unless line&.match?(shebang)
237
+
209
238
  io.gets # blankline
210
239
 
211
- # TODO detect a specially formatted comment instead of trying
212
- # to run a regexp against Ruby code.
213
- next unless io.gets =~ /This file was generated by RubyGems/
240
+ # TODO: detect a specially formatted comment instead of trying
241
+ # to find a string inside Ruby code.
242
+ next unless io.gets&.include?("This file was generated by RubyGems")
214
243
 
215
244
  ruby_executable = true
216
- existing = io.read.slice(%r{
217
- ^(
245
+ existing = io.read.slice(/
246
+ ^\s*(
218
247
  gem \s |
219
- load \s Gem\.bin_path\(
248
+ load \s Gem\.bin_path\( |
249
+ load \s Gem\.activate_bin_path\(
220
250
  )
221
251
  (['"])(.*?)(\2),
222
- }x, 3)
252
+ /x, 3)
223
253
  end
224
254
 
225
255
  return if spec.name == existing
226
256
 
227
257
  # somebody has written to RubyGems' directory, overwrite, too bad
228
- return if Gem.default_bindir != @bin_dir and not ruby_executable
258
+ return if Gem.default_bindir != @bin_dir && !ruby_executable
229
259
 
230
260
  question = "#{spec.name}'s executable \"#{filename}\" conflicts with ".dup
231
261
 
232
- if ruby_executable then
233
- question << existing
262
+ if ruby_executable
263
+ question << (existing || "an unknown executable")
234
264
 
235
265
  return if ask_yes_no "#{question}\nOverwrite the executable?", false
236
266
 
@@ -259,8 +289,6 @@ class Gem::Installer
259
289
 
260
290
  def spec
261
291
  @package.spec
262
- rescue Gem::Package::Error => e
263
- raise Gem::InstallError, "invalid gem: #{e.message}"
264
292
  end
265
293
 
266
294
  ##
@@ -277,67 +305,76 @@ class Gem::Installer
277
305
  def install
278
306
  pre_install_checks
279
307
 
280
- FileUtils.rm_f File.join gem_home, 'specifications', spec.spec_name
281
-
282
308
  run_pre_install_hooks
283
309
 
310
+ # Set loaded_from to ensure extension_dir is correct
311
+ if @options[:install_as_default]
312
+ spec.loaded_from = default_spec_file
313
+ else
314
+ spec.loaded_from = spec_file
315
+ end
316
+
284
317
  # Completely remove any previous gem files
285
318
  FileUtils.rm_rf gem_dir
319
+ FileUtils.rm_rf spec.extension_dir
286
320
 
287
- FileUtils.mkdir_p gem_dir
321
+ dir_mode = options[:dir_mode]
322
+ FileUtils.mkdir_p gem_dir, mode: dir_mode && 0o755
288
323
 
289
324
  if @options[:install_as_default]
290
- spec.loaded_from = default_spec_file
291
325
  extract_bin
292
326
  write_default_spec
293
327
  else
294
- spec.loaded_from = spec_file
295
328
  extract_files
296
329
 
297
330
  build_extensions
298
331
  write_build_info_file
299
332
  run_post_build_hooks
333
+ end
334
+
335
+ generate_bin
336
+ generate_plugins
300
337
 
301
- generate_bin
338
+ unless @options[:install_as_default]
302
339
  write_spec
303
340
  write_cache_file
304
341
  end
305
342
 
343
+ File.chmod(dir_mode, gem_dir) if dir_mode
344
+
306
345
  say spec.post_install_message if options[:post_install_message] && !spec.post_install_message.nil?
307
346
 
308
- Gem::Installer.install_lock.synchronize { Gem::Specification.reset }
347
+ Gem::Specification.add_spec(spec)
348
+
349
+ load_plugin
309
350
 
310
351
  run_post_install_hooks
311
352
 
312
353
  spec
313
-
314
- # TODO This rescue is in the wrong place. What is raising this exception?
315
- # move this rescue to around the code that actually might raise it.
316
- rescue Zlib::GzipFile::Error
317
- raise Gem::InstallError, "gzip error installing #{gem}"
354
+ rescue Errno::EACCES => e
355
+ # Permission denied - /path/to/foo
356
+ raise Gem::FilePermissionError, e.message.split(" - ").last
318
357
  end
319
358
 
320
359
  def run_pre_install_hooks # :nodoc:
321
360
  Gem.pre_install_hooks.each do |hook|
322
- if hook.call(self) == false then
323
- location = " at #{$1}" if hook.inspect =~ /@(.*:\d+)/
361
+ next unless hook.call(self) == false
362
+ location = " at #{$1}" if hook.inspect =~ /[ @](.*:\d+)/
324
363
 
325
- message = "pre-install hook#{location} failed for #{spec.full_name}"
326
- raise Gem::InstallError, message
327
- end
364
+ message = "pre-install hook#{location} failed for #{spec.full_name}"
365
+ raise Gem::InstallError, message
328
366
  end
329
367
  end
330
368
 
331
369
  def run_post_build_hooks # :nodoc:
332
370
  Gem.post_build_hooks.each do |hook|
333
- if hook.call(self) == false then
334
- FileUtils.rm_rf gem_dir
371
+ next unless hook.call(self) == false
372
+ FileUtils.rm_rf gem_dir
335
373
 
336
- location = " at #{$1}" if hook.inspect =~ /@(.*:\d+)/
374
+ location = " at #{$1}" if hook.inspect =~ /[ @](.*:\d+)/
337
375
 
338
- message = "post-build hook#{location} failed for #{spec.full_name}"
339
- raise Gem::InstallError, message
340
- end
376
+ message = "post-build hook#{location} failed for #{spec.full_name}"
377
+ raise Gem::InstallError, message
341
378
  end
342
379
  end
343
380
 
@@ -353,11 +390,11 @@ class Gem::Installer
353
390
  # we'll be installing into.
354
391
 
355
392
  def installed_specs
356
- @specs ||= begin
393
+ @installed_specs ||= begin
357
394
  specs = []
358
395
 
359
- Dir[File.join(gem_home, "specifications", "*.gemspec")].each do |path|
360
- spec = Gem::Specification.load path.untaint
396
+ Gem::Util.glob_files_in_dir("*.gemspec", File.join(gem_home, "specifications")).each do |path|
397
+ spec = Gem::Specification.load path
361
398
  specs << spec if spec
362
399
  end
363
400
 
@@ -373,7 +410,7 @@ class Gem::Installer
373
410
  # dependency :: Gem::Dependency
374
411
 
375
412
  def ensure_dependency(spec, dependency)
376
- unless installation_satisfies_dependency? dependency then
413
+ unless installation_satisfies_dependency? dependency
377
414
  raise Gem::InstallError, "#{spec.name} requires #{dependency}"
378
415
  end
379
416
  true
@@ -383,10 +420,10 @@ class Gem::Installer
383
420
  # True if the gems in the system satisfy +dependency+.
384
421
 
385
422
  def installation_satisfies_dependency?(dependency)
386
- return true if @options[:development] and dependency.type == :development
387
- return true if installed_specs.detect { |s| dependency.matches_spec? s }
423
+ return true if @options[:development] && dependency.type == :development
424
+ return true if installed_specs.detect {|s| dependency.matches_spec? s }
388
425
  return false if @only_install_dir
389
- not dependency.matching_specs.empty?
426
+ !dependency.matching_specs.empty?
390
427
  end
391
428
 
392
429
  ##
@@ -396,6 +433,7 @@ class Gem::Installer
396
433
  @gem_dir = directory
397
434
  extract_files
398
435
  end
436
+ rubygems_deprecate :unpack
399
437
 
400
438
  ##
401
439
  # The location of the spec file that is installed.
@@ -410,7 +448,7 @@ class Gem::Installer
410
448
  #
411
449
 
412
450
  def default_spec_file
413
- File.join Gem::Specification.default_specifications_dir, "#{spec.full_name}.gemspec"
451
+ File.join gem_home, "specifications", "default", "#{spec.full_name}.gemspec"
414
452
  end
415
453
 
416
454
  ##
@@ -418,33 +456,30 @@ class Gem::Installer
418
456
  # specifications directory.
419
457
 
420
458
  def write_spec
421
- open spec_file, 'w' do |file|
422
- spec.installed_by_version = Gem.rubygems_version
423
-
424
- file.puts spec.to_ruby_for_cache
459
+ spec.installed_by_version = Gem.rubygems_version
425
460
 
426
- file.fsync rescue nil # for filesystems without fsync(2)
427
- end
461
+ Gem.write_binary(spec_file, spec.to_ruby_for_cache)
428
462
  end
429
463
 
430
464
  ##
431
465
  # Writes the full .gemspec specification (in Ruby) to the gem home's
432
466
  # specifications/default directory.
467
+ #
468
+ # In contrast to #write_spec, this keeps file lists, so the `gem contents`
469
+ # command works.
433
470
 
434
471
  def write_default_spec
435
- File.open(default_spec_file, "w") do |file|
436
- file.puts spec.to_ruby
437
- end
472
+ Gem.write_binary(default_spec_file, spec.to_ruby)
438
473
  end
439
474
 
440
475
  ##
441
476
  # Creates windows .bat files for easy running of commands
442
477
 
443
478
  def generate_windows_script(filename, bindir)
444
- if Gem.win_platform? then
445
- script_name = filename + ".bat"
479
+ if Gem.win_platform?
480
+ script_name = formatted_program_filename(filename) + ".bat"
446
481
  script_path = File.join bindir, File.basename(script_name)
447
- File.open script_path, 'w' do |file|
482
+ File.open script_path, "w" do |file|
448
483
  file.puts windows_stub_script(bindir, filename)
449
484
  end
450
485
 
@@ -453,33 +488,45 @@ class Gem::Installer
453
488
  end
454
489
 
455
490
  def generate_bin # :nodoc:
456
- return if spec.executables.nil? or spec.executables.empty?
491
+ return if spec.executables.nil? || spec.executables.empty?
457
492
 
458
- Dir.mkdir @bin_dir unless File.exist? @bin_dir
459
- raise Gem::FilePermissionError.new(@bin_dir) unless File.writable? @bin_dir
493
+ ensure_writable_dir @bin_dir
460
494
 
461
495
  spec.executables.each do |filename|
462
- filename.untaint
463
496
  bin_path = File.join gem_dir, spec.bindir, filename
464
-
465
- unless File.exist? bin_path then
466
- # TODO change this to a more useful warning
467
- warn "#{bin_path} maybe `gem pristine #{spec.name}` will fix it?"
468
- next
469
- end
497
+ next unless File.exist? bin_path
470
498
 
471
499
  mode = File.stat(bin_path).mode
472
- FileUtils.chmod mode | 0111, bin_path unless (mode | 0111) == mode
500
+ dir_mode = options[:prog_mode] || (mode | 0o111)
501
+
502
+ unless dir_mode == mode
503
+ require "fileutils"
504
+ FileUtils.chmod dir_mode, bin_path
505
+ end
473
506
 
474
507
  check_executable_overwrite filename
475
508
 
476
- if @wrappers then
509
+ if @wrappers
477
510
  generate_bin_script filename, @bin_dir
478
511
  else
479
512
  generate_bin_symlink filename, @bin_dir
480
513
  end
514
+ end
515
+ end
516
+
517
+ def generate_plugins # :nodoc:
518
+ latest = Gem::Specification.latest_spec_for(spec.name)
519
+ return if latest && latest.version > spec.version
481
520
 
521
+ ensure_writable_dir @plugins_dir
522
+
523
+ if spec.plugins.empty?
524
+ remove_plugins_for(spec, @plugins_dir)
525
+ else
526
+ regenerate_plugins_for(spec, @plugins_dir)
482
527
  end
528
+ rescue ArgumentError => e
529
+ raise e, "#{latest.name} #{latest.version} #{spec.name} #{spec.version}: #{e.message}"
483
530
  end
484
531
 
485
532
  ##
@@ -487,15 +534,17 @@ class Gem::Installer
487
534
  #--
488
535
  # The Windows script is generated in addition to the regular one due to a
489
536
  # bug or misfeature in the Windows shell's pipe. See
490
- # http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/193379
537
+ # https://blade.ruby-lang.org/ruby-talk/193379
491
538
 
492
539
  def generate_bin_script(filename, bindir)
493
540
  bin_script_path = File.join bindir, formatted_program_filename(filename)
494
541
 
542
+ require "fileutils"
495
543
  FileUtils.rm_f bin_script_path # prior install may have been --no-wrappers
496
544
 
497
- File.open bin_script_path, 'wb', 0755 do |file|
545
+ File.open bin_script_path, "wb", 0o755 do |file|
498
546
  file.print app_script_text(filename)
547
+ file.chmod(options[:prog_mode] || 0o755)
499
548
  end
500
549
 
501
550
  verbose bin_script_path
@@ -508,25 +557,22 @@ class Gem::Installer
508
557
  # the symlink if the gem being installed has a newer version.
509
558
 
510
559
  def generate_bin_symlink(filename, bindir)
511
- if Gem.win_platform? then
512
- alert_warning "Unable to use symlinks on Windows, installing wrapper"
513
- generate_bin_script filename, bindir
514
- return
515
- end
516
-
517
560
  src = File.join gem_dir, spec.bindir, filename
518
561
  dst = File.join bindir, formatted_program_filename(filename)
519
562
 
520
- if File.exist? dst then
521
- if File.symlink? dst then
563
+ if File.exist? dst
564
+ if File.symlink? dst
522
565
  link = File.readlink(dst).split File::SEPARATOR
523
- cur_version = Gem::Version.create(link[-3].sub(/^.*-/, ''))
566
+ cur_version = Gem::Version.create(link[-3].sub(/^.*-/, ""))
524
567
  return if spec.version < cur_version
525
568
  end
526
569
  File.unlink dst
527
570
  end
528
571
 
529
- FileUtils.symlink src, dst, :verbose => Gem.configuration.really_verbose
572
+ FileUtils.symlink src, dst, verbose: Gem.configuration.really_verbose
573
+ rescue NotImplementedError, SystemCallError
574
+ alert_warning "Unable to use symlinks, installing wrapper"
575
+ generate_bin_script filename, bindir
530
576
  end
531
577
 
532
578
  ##
@@ -545,11 +591,10 @@ class Gem::Installer
545
591
  #
546
592
 
547
593
  def shebang(bin_file_name)
548
- ruby_name = RbConfig::CONFIG['ruby_install_name'] if @env_shebang
549
594
  path = File.join gem_dir, spec.bindir, bin_file_name
550
- first_line = File.open(path, "rb") {|file| file.gets}
595
+ first_line = File.open(path, "rb", &:gets) || ""
551
596
 
552
- if /\A#!/ =~ first_line then
597
+ if first_line.start_with?("#!")
553
598
  # Preserve extra words on shebang line, like "-w". Thanks RPA.
554
599
  shebang = first_line.sub(/\A\#!.*?ruby\S*((\s+\S+)+)/, "#!#{Gem.ruby}")
555
600
  opts = $1
@@ -558,7 +603,7 @@ class Gem::Installer
558
603
 
559
604
  if which = Gem.configuration[:custom_shebang]
560
605
  # replace bin_file_name with "ruby" to avoid endless loops
561
- which = which.gsub(/ #{bin_file_name}$/," #{RbConfig::CONFIG['ruby_install_name']}")
606
+ which = which.gsub(/ #{bin_file_name}$/," #{ruby_install_name}")
562
607
 
563
608
  which = which.gsub(/\$(\w+)/) do
564
609
  case $1
@@ -574,14 +619,12 @@ class Gem::Installer
574
619
  end
575
620
 
576
621
  "#!#{which}"
577
- elsif not ruby_name then
578
- "#!#{Gem.ruby}#{opts}"
579
- elsif opts then
580
- "#!/bin/sh\n'exec' #{ruby_name.dump} '-x' \"$0\" \"$@\"\n#{shebang}"
581
- else
622
+ elsif @env_shebang
582
623
  # Create a plain shebang line.
583
624
  @env_path ||= ENV_PATHS.find {|env_path| File.executable? env_path }
584
- "#!#{@env_path} #{ruby_name}"
625
+ "#!#{@env_path} #{ruby_install_name}"
626
+ else
627
+ "#{bash_prolog_script}#!#{Gem.ruby}#{opts}"
585
628
  end
586
629
  end
587
630
 
@@ -591,7 +634,6 @@ class Gem::Installer
591
634
 
592
635
  def ensure_loadable_spec
593
636
  ruby = spec.to_ruby_for_cache
594
- ruby.untaint
595
637
 
596
638
  begin
597
639
  eval ruby
@@ -601,24 +643,6 @@ class Gem::Installer
601
643
  end
602
644
  end
603
645
 
604
- def ensure_required_ruby_version_met # :nodoc:
605
- if rrv = spec.required_ruby_version then
606
- unless rrv.satisfied_by? Gem.ruby_version then
607
- raise Gem::InstallError, "#{spec.name} requires Ruby version #{rrv}."
608
- end
609
- end
610
- end
611
-
612
- def ensure_required_rubygems_version_met # :nodoc:
613
- if rrgv = spec.required_rubygems_version then
614
- unless rrgv.satisfied_by? Gem.rubygems_version then
615
- raise Gem::InstallError,
616
- "#{spec.name} requires RubyGems version #{rrgv}. " +
617
- "Try 'gem update --system' to update RubyGems itself."
618
- end
619
- end
620
- end
621
-
622
646
  def ensure_dependencies_met # :nodoc:
623
647
  deps = spec.runtime_dependencies
624
648
  deps |= spec.development_dependencies if @development
@@ -630,74 +654,110 @@ class Gem::Installer
630
654
 
631
655
  def process_options # :nodoc:
632
656
  @options = {
633
- :bin_dir => nil,
634
- :env_shebang => false,
635
- :force => false,
636
- :only_install_dir => false,
637
- :post_install_message => true
657
+ bin_dir: nil,
658
+ env_shebang: false,
659
+ force: false,
660
+ only_install_dir: false,
661
+ post_install_message: true,
638
662
  }.merge options
639
663
 
640
664
  @env_shebang = options[:env_shebang]
641
665
  @force = options[:force]
642
666
  @install_dir = options[:install_dir]
643
- @gem_home = options[:install_dir] || Gem.dir
667
+ @user_install = options[:user_install]
644
668
  @ignore_dependencies = options[:ignore_dependencies]
645
669
  @format_executable = options[:format_executable]
646
670
  @wrappers = options[:wrappers]
647
671
  @only_install_dir = options[:only_install_dir]
648
672
 
673
+ @bin_dir = options[:bin_dir]
674
+ @development = options[:development]
675
+ @build_root = options[:build_root]
676
+
677
+ @build_args = options[:build_args]
678
+
679
+ @gem_home = @install_dir || user_install_dir || Gem.dir
680
+
649
681
  # If the user has asked for the gem to be installed in a directory that is
650
682
  # the system gem directory, then use the system bin directory, else create
651
683
  # (or use) a new bin dir under the gem_home.
652
- @bin_dir = options[:bin_dir] || Gem.bindir(gem_home)
653
- @development = options[:development]
654
- @build_root = options[:build_root]
684
+ @bin_dir ||= Gem.bindir(@gem_home)
655
685
 
656
- @build_args = options[:build_args] || Gem::Command.build_args
686
+ @plugins_dir = Gem.plugindir(@gem_home)
657
687
 
658
688
  unless @build_root.nil?
659
- require 'pathname'
660
- @build_root = Pathname.new(@build_root).expand_path
661
- @bin_dir = File.join(@build_root, options[:bin_dir] || Gem.bindir(@gem_home))
662
- @gem_home = File.join(@build_root, @gem_home)
663
- alert_warning "You build with buildroot.\n Build root: #{@build_root}\n Bin dir: #{@bin_dir}\n Gem home: #{@gem_home}"
689
+ @bin_dir = File.join(@build_root, @bin_dir.gsub(/^[a-zA-Z]:/, ""))
690
+ @gem_home = File.join(@build_root, @gem_home.gsub(/^[a-zA-Z]:/, ""))
691
+ @plugins_dir = File.join(@build_root, @plugins_dir.gsub(/^[a-zA-Z]:/, ""))
692
+ alert_warning "You build with buildroot.\n Build root: #{@build_root}\n Bin dir: #{@bin_dir}\n Gem home: #{@gem_home}\n Plugins dir: #{@plugins_dir}"
664
693
  end
665
694
  end
666
695
 
667
696
  def check_that_user_bin_dir_is_in_path # :nodoc:
697
+ return if self.class.path_warning
698
+
668
699
  user_bin_dir = @bin_dir || Gem.bindir(gem_home)
669
- user_bin_dir = user_bin_dir.gsub(File::SEPARATOR, File::ALT_SEPARATOR) if
670
- File::ALT_SEPARATOR
700
+ user_bin_dir = user_bin_dir.tr(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR
701
+
702
+ path = ENV["PATH"]
703
+ path = path.tr(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR
671
704
 
672
- path = ENV['PATH']
673
- if Gem.win_platform? then
705
+ if Gem.win_platform?
674
706
  path = path.downcase
675
707
  user_bin_dir = user_bin_dir.downcase
676
708
  end
677
709
 
678
710
  path = path.split(File::PATH_SEPARATOR)
679
711
 
680
- unless path.include? user_bin_dir then
681
- unless !Gem.win_platform? && (path.include? user_bin_dir.sub(ENV['HOME'], '~'))
682
- unless self.class.path_warning then
683
- alert_warning "You don't have #{user_bin_dir} in your PATH,\n\t gem executables will not run."
684
- self.class.path_warning = true
685
- end
712
+ unless path.include? user_bin_dir
713
+ unless !Gem.win_platform? && (path.include? user_bin_dir.sub(ENV["HOME"], "~"))
714
+ alert_warning "You don't have #{user_bin_dir} in your PATH,\n\t gem executables will not run."
715
+ self.class.path_warning = true
686
716
  end
687
717
  end
688
718
  end
689
719
 
690
- def verify_gem_home(unpack = false) # :nodoc:
691
- FileUtils.mkdir_p gem_home
692
- raise Gem::FilePermissionError, gem_home unless
693
- unpack or File.writable?(gem_home)
720
+ def verify_gem_home # :nodoc:
721
+ FileUtils.mkdir_p gem_home, mode: options[:dir_mode] && 0o755
722
+ end
723
+
724
+ def verify_spec
725
+ unless Gem::Specification::VALID_NAME_PATTERN.match?(spec.name)
726
+ raise Gem::InstallError, "#{spec} has an invalid name"
727
+ end
728
+
729
+ if spec.raw_require_paths.any? {|path| path =~ /\R/ }
730
+ raise Gem::InstallError, "#{spec} has an invalid require_paths"
731
+ end
732
+
733
+ if spec.extensions.any? {|ext| ext =~ /\R/ }
734
+ raise Gem::InstallError, "#{spec} has an invalid extensions"
735
+ end
736
+
737
+ if /\R/.match?(spec.platform.to_s)
738
+ raise Gem::InstallError, "#{spec.platform} is an invalid platform"
739
+ end
740
+
741
+ unless /\A\d+\z/.match?(spec.specification_version.to_s)
742
+ raise Gem::InstallError, "#{spec} has an invalid specification_version"
743
+ end
744
+
745
+ if spec.dependencies.any? {|dep| dep.type != :runtime && dep.type != :development }
746
+ raise Gem::InstallError, "#{spec} has an invalid dependencies"
747
+ end
748
+
749
+ if spec.dependencies.any? {|dep| dep.name =~ /(?:\R|[<>])/ }
750
+ raise Gem::InstallError, "#{spec} has an invalid dependencies"
751
+ end
694
752
  end
695
753
 
696
754
  ##
697
755
  # Return the text for an application file.
698
756
 
699
757
  def app_script_text(bin_file_name)
700
- return <<-TEXT
758
+ # NOTE: that the `load` lines cannot be indented, as old RG versions match
759
+ # against the beginning of the line
760
+ <<-TEXT
701
761
  #{shebang bin_file_name}
702
762
  #
703
763
  # This file was generated by RubyGems.
@@ -707,19 +767,43 @@ class Gem::Installer
707
767
  #
708
768
 
709
769
  require 'rubygems'
710
-
711
- version = "#{Gem::Requirement.default}.a"
712
-
713
- if ARGV.first
714
- str = ARGV.first
715
- str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
716
- if str =~ /\\A_(.*)_\\z/ and Gem::Version.correct?($1) then
717
- version = $1
770
+ #{gemdeps_load(spec.name)}
771
+ version = "#{Gem::Requirement.default_prerelease}"
772
+
773
+ str = ARGV.first
774
+ if str
775
+ str = str.b[/\\A_(.*)_\\z/, 1]
776
+ if str and Gem::Version.correct?(str)
777
+ #{explicit_version_requirement(spec.name)}
718
778
  ARGV.shift
719
779
  end
720
780
  end
721
781
 
722
- load Gem.bin_path('#{spec.name}', '#{bin_file_name}', version)
782
+ if Gem.respond_to?(:activate_bin_path)
783
+ load Gem.activate_bin_path('#{spec.name}', '#{bin_file_name}', version)
784
+ else
785
+ gem #{spec.name.dump}, version
786
+ load Gem.bin_path(#{spec.name.dump}, #{bin_file_name.dump}, version)
787
+ end
788
+ TEXT
789
+ end
790
+
791
+ def gemdeps_load(name)
792
+ return "" if name == "bundler"
793
+
794
+ <<-TEXT
795
+
796
+ Gem.use_gemdeps
797
+ TEXT
798
+ end
799
+
800
+ def explicit_version_requirement(name)
801
+ code = "version = str"
802
+ return code unless name == "bundler"
803
+
804
+ code += <<-TEXT
805
+
806
+ ENV['BUNDLER_VERSION'] = str
723
807
  TEXT
724
808
  end
725
809
 
@@ -727,38 +811,47 @@ TEXT
727
811
  # return the stub script text used to launch the true Ruby script
728
812
 
729
813
  def windows_stub_script(bindir, bin_file_name)
730
- ruby = Gem.ruby.gsub(/^\"|\"$/, "").tr(File::SEPARATOR, "\\")
731
- return <<-TEXT
814
+ rb_topdir = RbConfig::TOPDIR || File.dirname(rb_config["bindir"])
815
+
816
+ # get ruby executable file name from RbConfig
817
+ ruby_exe = "#{rb_config["RUBY_INSTALL_NAME"]}#{rb_config["EXEEXT"]}"
818
+ ruby_exe = "ruby.exe" if ruby_exe.empty?
819
+
820
+ if File.exist?(File.join(bindir, ruby_exe))
821
+ # stub & ruby.exe within same folder. Portable
822
+ <<-TEXT
732
823
  @ECHO OFF
733
- IF NOT "%~f0" == "~f0" GOTO :WinNT
734
- @"#{ruby}" "#{File.join(bindir, bin_file_name)}" %1 %2 %3 %4 %5 %6 %7 %8 %9
735
- GOTO :EOF
736
- :WinNT
737
- @"#{ruby}" "%~dpn0" %*
738
- TEXT
824
+ @"%~dp0#{ruby_exe}" "%~dpn0" %*
825
+ TEXT
826
+ elsif bindir.downcase.start_with? rb_topdir.downcase
827
+ # stub within ruby folder, but not standard bin. Portable
828
+ require "pathname"
829
+ from = Pathname.new bindir
830
+ to = Pathname.new "#{rb_topdir}/bin"
831
+ rel = to.relative_path_from from
832
+ <<-TEXT
833
+ @ECHO OFF
834
+ @"%~dp0#{rel}/#{ruby_exe}" "%~dpn0" %*
835
+ TEXT
836
+ else
837
+ # outside ruby folder, maybe -user-install or bundler. Portable, but ruby
838
+ # is dependent on PATH
839
+ <<-TEXT
840
+ @ECHO OFF
841
+ @#{ruby_exe} "%~dpn0" %*
842
+ TEXT
843
+ end
739
844
  end
740
-
741
845
  ##
742
846
  # Builds extensions. Valid types of extensions are extconf.rb files,
743
847
  # configure scripts and rakefiles or mkrf_conf files.
744
848
 
745
849
  def build_extensions
746
- builder = Gem::Ext::Builder.new spec, @build_args
850
+ builder = Gem::Ext::Builder.new spec, build_args
747
851
 
748
852
  builder.build_extensions
749
853
  end
750
854
 
751
- ##
752
- # Logs the build +output+ in +build_dir+, then raises Gem::Ext::BuildError.
753
- #
754
- # TODO: Delete this for RubyGems 3. It remains for API compatibility
755
-
756
- def extension_build_error(build_dir, output, backtrace = nil) # :nodoc:
757
- builder = Gem::Ext::Builder.new spec, @build_args
758
-
759
- builder.build_error build_dir, output, backtrace
760
- end
761
-
762
855
  ##
763
856
  # Reads the file index and extracts each file into the gem directory.
764
857
  #
@@ -774,14 +867,14 @@ TEXT
774
867
  # without the full gem installed.
775
868
 
776
869
  def extract_bin
777
- @package.extract_files gem_dir, "bin/*"
870
+ @package.extract_files gem_dir, "#{spec.bindir}/*"
778
871
  end
779
872
 
780
873
  ##
781
874
  # Prefix and suffix the program filename the same as ruby.
782
875
 
783
876
  def formatted_program_filename(filename)
784
- if @format_executable then
877
+ if @format_executable
785
878
  self.class.exec_format % File.basename(filename)
786
879
  else
787
880
  filename
@@ -798,6 +891,13 @@ TEXT
798
891
  gem_dir.to_s
799
892
  end
800
893
 
894
+ ##
895
+ # Filename of the gem being installed.
896
+
897
+ def gem
898
+ @package.gem.path
899
+ end
900
+
801
901
  ##
802
902
  # Performs various checks before installing the gem such as the install
803
903
  # repository is writable and its directories exist, required Ruby and
@@ -805,10 +905,14 @@ TEXT
805
905
  #
806
906
  # Version and dependency checks are skipped if this install is forced.
807
907
  #
808
- # The dependent check will be skipped this install is ignoring dependencies.
908
+ # The dependent check will be skipped if the install is ignoring dependencies.
809
909
 
810
910
  def pre_install_checks
811
- verify_gem_home options[:unpack]
911
+ verify_gem_home
912
+
913
+ # The name and require_paths must be verified first, since it could contain
914
+ # ruby code that would be eval'ed in #ensure_loadable_spec
915
+ verify_spec
812
916
 
813
917
  ensure_loadable_spec
814
918
 
@@ -820,8 +924,6 @@ TEXT
820
924
 
821
925
  return true if @force
822
926
 
823
- ensure_required_ruby_version_met
824
- ensure_required_rubygems_version_met
825
927
  ensure_dependencies_met unless @ignore_dependencies
826
928
 
827
929
  true
@@ -832,27 +934,107 @@ TEXT
832
934
  # extensions.
833
935
 
834
936
  def write_build_info_file
835
- return if @build_args.empty?
937
+ return if build_args.empty?
836
938
 
837
- build_info_dir = File.join gem_home, 'build_info'
939
+ build_info_dir = File.join gem_home, "build_info"
838
940
 
839
- FileUtils.mkdir_p build_info_dir
941
+ dir_mode = options[:dir_mode]
942
+ FileUtils.mkdir_p build_info_dir, mode: dir_mode && 0o755
840
943
 
841
944
  build_info_file = File.join build_info_dir, "#{spec.full_name}.info"
842
945
 
843
- open build_info_file, 'w' do |io|
844
- @build_args.each do |arg|
946
+ File.open build_info_file, "w" do |io|
947
+ build_args.each do |arg|
845
948
  io.puts arg
846
949
  end
847
950
  end
951
+
952
+ File.chmod(dir_mode, build_info_dir) if dir_mode
848
953
  end
849
954
 
850
955
  ##
851
956
  # Writes the .gem file to the cache directory
852
957
 
853
958
  def write_cache_file
854
- cache_file = File.join gem_home, 'cache', spec.file_name
959
+ cache_file = File.join gem_home, "cache", spec.file_name
855
960
  @package.copy_to cache_file
856
961
  end
857
962
 
963
+ def ensure_writable_dir(dir) # :nodoc:
964
+ begin
965
+ Dir.mkdir dir, *[options[:dir_mode] && 0o755].compact
966
+ rescue SystemCallError
967
+ raise unless File.directory? dir
968
+ end
969
+
970
+ raise Gem::FilePermissionError.new(dir) unless File.writable? dir
971
+ end
972
+
973
+ private
974
+
975
+ def user_install_dir
976
+ # never install to user home in --build-root mode
977
+ return unless @build_root.nil?
978
+
979
+ # Please note that @user_install might have three states:
980
+ # * `true`: `--user-install`
981
+ # * `false`: `--no-user-install` and
982
+ # * `nil`: option was not specified
983
+ if @user_install || (@user_install.nil? && Gem.default_user_install)
984
+ Gem.user_dir
985
+ end
986
+ end
987
+
988
+ def build_args
989
+ @build_args ||= begin
990
+ require_relative "command"
991
+ Gem::Command.build_args
992
+ end
993
+ end
994
+
995
+ def rb_config
996
+ RbConfig::CONFIG
997
+ end
998
+
999
+ def ruby_install_name
1000
+ rb_config["ruby_install_name"]
1001
+ end
1002
+
1003
+ def load_relative_enabled?
1004
+ rb_config["LIBRUBY_RELATIVE"] == "yes"
1005
+ end
1006
+
1007
+ def bash_prolog_script
1008
+ if load_relative_enabled?
1009
+ script = +<<~EOS
1010
+ bindir="${0%/*}"
1011
+ EOS
1012
+
1013
+ script << %(exec "$bindir/#{ruby_install_name}" "-x" "$0" "$@"\n)
1014
+
1015
+ <<~EOS
1016
+ #!/bin/sh
1017
+ # -*- ruby -*-
1018
+ _=_\\
1019
+ =begin
1020
+ #{script.chomp}
1021
+ =end
1022
+ EOS
1023
+ else
1024
+ ""
1025
+ end
1026
+ end
1027
+
1028
+ def load_plugin
1029
+ specs = Gem::Specification.find_all_by_name(spec.name)
1030
+ # If old version already exists, this plugin isn't loaded
1031
+ # immediately. It's for avoiding a case that multiple versions
1032
+ # are loaded at the same time.
1033
+ return unless specs.size == 1
1034
+
1035
+ plugin_files = spec.plugins.map do |plugin|
1036
+ File.join(@plugins_dir, "#{spec.name}_plugin#{File.extname(plugin)}")
1037
+ end
1038
+ Gem.load_plugin_files(plugin_files)
1039
+ end
858
1040
  end