rubygems-update 3.3.18 → 3.6.2

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 (832) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +2182 -1067
  3. data/CODE_OF_CONDUCT.md +79 -28
  4. data/Manifest.txt +184 -290
  5. data/README.md +35 -19
  6. data/bundler/CHANGELOG.md +1003 -3
  7. data/bundler/README.md +3 -7
  8. data/bundler/bundler.gemspec +11 -11
  9. data/bundler/exe/bundle +5 -25
  10. data/bundler/lib/bundler/build_metadata.rb +3 -3
  11. data/bundler/lib/bundler/capistrano.rb +1 -1
  12. data/bundler/lib/bundler/checksum.rb +254 -0
  13. data/bundler/lib/bundler/ci_detector.rb +75 -0
  14. data/bundler/lib/bundler/cli/add.rb +7 -5
  15. data/bundler/lib/bundler/cli/binstubs.rb +10 -6
  16. data/bundler/lib/bundler/cli/cache.rb +1 -1
  17. data/bundler/lib/bundler/cli/check.rb +4 -4
  18. data/bundler/lib/bundler/cli/common.rb +11 -1
  19. data/bundler/lib/bundler/cli/config.rb +8 -7
  20. data/bundler/lib/bundler/cli/console.rb +2 -5
  21. data/bundler/lib/bundler/cli/doctor.rb +10 -12
  22. data/bundler/lib/bundler/cli/exec.rb +2 -1
  23. data/bundler/lib/bundler/cli/fund.rb +1 -1
  24. data/bundler/lib/bundler/cli/gem.rb +77 -53
  25. data/bundler/lib/bundler/cli/info.rb +4 -15
  26. data/bundler/lib/bundler/cli/init.rb +6 -2
  27. data/bundler/lib/bundler/cli/inject.rb +1 -1
  28. data/bundler/lib/bundler/cli/install.rb +27 -15
  29. data/bundler/lib/bundler/cli/issue.rb +1 -1
  30. data/bundler/lib/bundler/cli/lock.rb +54 -28
  31. data/bundler/lib/bundler/cli/open.rb +9 -9
  32. data/bundler/lib/bundler/cli/outdated.rb +34 -29
  33. data/bundler/lib/bundler/cli/platform.rb +7 -5
  34. data/bundler/lib/bundler/cli/plugin.rb +9 -15
  35. data/bundler/lib/bundler/cli/pristine.rb +38 -30
  36. data/bundler/lib/bundler/cli/show.rb +4 -4
  37. data/bundler/lib/bundler/cli/update.rb +6 -5
  38. data/bundler/lib/bundler/cli/viz.rb +1 -1
  39. data/bundler/lib/bundler/cli.rb +258 -307
  40. data/bundler/lib/bundler/compact_index_client/cache.rb +55 -60
  41. data/bundler/lib/bundler/compact_index_client/cache_file.rb +148 -0
  42. data/bundler/lib/bundler/compact_index_client/gem_parser.rb +7 -3
  43. data/bundler/lib/bundler/compact_index_client/parser.rb +84 -0
  44. data/bundler/lib/bundler/compact_index_client/updater.rb +71 -83
  45. data/bundler/lib/bundler/compact_index_client.rb +58 -80
  46. data/bundler/lib/bundler/constants.rb +9 -2
  47. data/bundler/lib/bundler/current_ruby.rb +11 -16
  48. data/bundler/lib/bundler/definition.rb +547 -228
  49. data/bundler/lib/bundler/dependency.rb +30 -87
  50. data/bundler/lib/bundler/digest.rb +3 -3
  51. data/bundler/lib/bundler/dsl.rb +115 -65
  52. data/bundler/lib/bundler/endpoint_specification.rb +27 -14
  53. data/bundler/lib/bundler/env.rb +5 -7
  54. data/bundler/lib/bundler/environment_preserver.rb +8 -25
  55. data/bundler/lib/bundler/errors.rb +85 -11
  56. data/bundler/lib/bundler/feature_flag.rb +1 -2
  57. data/bundler/lib/bundler/fetcher/base.rb +5 -3
  58. data/bundler/lib/bundler/fetcher/compact_index.rb +28 -43
  59. data/bundler/lib/bundler/fetcher/dependency.rb +3 -7
  60. data/bundler/lib/bundler/fetcher/downloader.rb +17 -16
  61. data/bundler/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
  62. data/bundler/lib/bundler/fetcher/index.rb +2 -3
  63. data/bundler/lib/bundler/fetcher.rb +91 -74
  64. data/bundler/lib/bundler/force_platform.rb +16 -0
  65. data/bundler/lib/bundler/friendly_errors.rb +6 -9
  66. data/bundler/lib/bundler/gem_helper.rb +5 -6
  67. data/bundler/lib/bundler/gem_helpers.rb +45 -7
  68. data/bundler/lib/bundler/gem_version_promoter.rb +68 -109
  69. data/bundler/lib/bundler/graph.rb +9 -9
  70. data/bundler/lib/bundler/index.rb +69 -73
  71. data/bundler/lib/bundler/injector.rb +12 -13
  72. data/bundler/lib/bundler/inline.rb +40 -17
  73. data/bundler/lib/bundler/installer/gem_installer.rb +13 -12
  74. data/bundler/lib/bundler/installer/parallel_installer.rb +19 -66
  75. data/bundler/lib/bundler/installer/standalone.rb +29 -15
  76. data/bundler/lib/bundler/installer.rb +27 -77
  77. data/bundler/lib/bundler/lazy_specification.rb +134 -71
  78. data/bundler/lib/bundler/lockfile_generator.rb +13 -4
  79. data/bundler/lib/bundler/lockfile_parser.rb +134 -61
  80. data/bundler/lib/bundler/man/bundle-add.1 +46 -48
  81. data/bundler/lib/bundler/man/bundle-add.1.ronn +54 -22
  82. data/bundler/lib/bundler/man/bundle-binstubs.1 +10 -19
  83. data/bundler/lib/bundler/man/bundle-binstubs.1.ronn +6 -3
  84. data/bundler/lib/bundler/man/bundle-cache.1 +38 -25
  85. data/bundler/lib/bundler/man/bundle-cache.1.ronn +40 -4
  86. data/bundler/lib/bundler/man/bundle-check.1 +7 -14
  87. data/bundler/lib/bundler/man/bundle-check.1.ronn +7 -2
  88. data/bundler/lib/bundler/man/bundle-clean.1 +4 -11
  89. data/bundler/lib/bundler/man/bundle-clean.1.ronn +1 -1
  90. data/bundler/lib/bundler/man/bundle-config.1 +41 -220
  91. data/bundler/lib/bundler/man/bundle-config.1.ronn +27 -22
  92. data/bundler/lib/bundler/man/bundle-console.1 +33 -0
  93. data/bundler/lib/bundler/man/bundle-console.1.ronn +39 -0
  94. data/bundler/lib/bundler/man/bundle-doctor.1 +5 -19
  95. data/bundler/lib/bundler/man/bundle-doctor.1.ronn +1 -1
  96. data/bundler/lib/bundler/man/bundle-env.1 +9 -0
  97. data/bundler/lib/bundler/man/bundle-env.1.ronn +10 -0
  98. data/bundler/lib/bundler/man/bundle-exec.1 +20 -78
  99. data/bundler/lib/bundler/man/bundle-exec.1.ronn +12 -10
  100. data/bundler/lib/bundler/man/bundle-fund.1 +22 -0
  101. data/bundler/lib/bundler/man/bundle-fund.1.ronn +25 -0
  102. data/bundler/lib/bundler/man/bundle-gem.1 +53 -81
  103. data/bundler/lib/bundler/man/bundle-gem.1.ronn +41 -9
  104. data/bundler/lib/bundler/man/bundle-help.1 +9 -0
  105. data/bundler/lib/bundler/man/bundle-help.1.ronn +12 -0
  106. data/bundler/lib/bundler/man/bundle-info.1 +8 -11
  107. data/bundler/lib/bundler/man/bundle-info.1.ronn +9 -5
  108. data/bundler/lib/bundler/man/bundle-init.1 +7 -12
  109. data/bundler/lib/bundler/man/bundle-init.1.ronn +4 -1
  110. data/bundler/lib/bundler/man/bundle-inject.1 +17 -19
  111. data/bundler/lib/bundler/man/bundle-inject.1.ronn +12 -2
  112. data/bundler/lib/bundler/man/bundle-install.1 +42 -162
  113. data/bundler/lib/bundler/man/bundle-install.1.ronn +31 -49
  114. data/bundler/lib/bundler/man/bundle-issue.1 +45 -0
  115. data/bundler/lib/bundler/man/bundle-issue.1.ronn +37 -0
  116. data/bundler/lib/bundler/man/bundle-licenses.1 +9 -0
  117. data/bundler/lib/bundler/man/bundle-licenses.1.ronn +10 -0
  118. data/bundler/lib/bundler/man/bundle-list.1 +4 -19
  119. data/bundler/lib/bundler/man/bundle-list.1.ronn +4 -1
  120. data/bundler/lib/bundler/man/bundle-lock.1 +25 -34
  121. data/bundler/lib/bundler/man/bundle-lock.1.ronn +25 -4
  122. data/bundler/lib/bundler/man/bundle-open.1 +18 -18
  123. data/bundler/lib/bundler/man/bundle-open.1.ronn +10 -1
  124. data/bundler/lib/bundler/man/bundle-outdated.1 +22 -67
  125. data/bundler/lib/bundler/man/bundle-outdated.1.ronn +20 -12
  126. data/bundler/lib/bundler/man/bundle-platform.1 +16 -28
  127. data/bundler/lib/bundler/man/bundle-platform.1.ronn +14 -7
  128. data/bundler/lib/bundler/man/bundle-plugin.1 +58 -0
  129. data/bundler/lib/bundler/man/bundle-plugin.1.ronn +63 -0
  130. data/bundler/lib/bundler/man/bundle-pristine.1 +5 -16
  131. data/bundler/lib/bundler/man/bundle-pristine.1.ronn +1 -1
  132. data/bundler/lib/bundler/man/bundle-remove.1 +4 -14
  133. data/bundler/lib/bundler/man/bundle-remove.1.ronn +1 -1
  134. data/bundler/lib/bundler/man/bundle-show.1 +7 -11
  135. data/bundler/lib/bundler/man/bundle-show.1.ronn +4 -0
  136. data/bundler/lib/bundler/man/bundle-update.1 +30 -143
  137. data/bundler/lib/bundler/man/bundle-update.1.ronn +14 -6
  138. data/bundler/lib/bundler/man/bundle-version.1 +22 -0
  139. data/bundler/lib/bundler/man/bundle-version.1.ronn +24 -0
  140. data/bundler/lib/bundler/man/bundle-viz.1 +9 -18
  141. data/bundler/lib/bundler/man/bundle-viz.1.ronn +9 -3
  142. data/bundler/lib/bundler/man/bundle.1 +17 -51
  143. data/bundler/lib/bundler/man/bundle.1.ronn +12 -7
  144. data/bundler/lib/bundler/man/gemfile.5 +77 -341
  145. data/bundler/lib/bundler/man/gemfile.5.ronn +73 -54
  146. data/bundler/lib/bundler/man/index.txt +8 -0
  147. data/bundler/lib/bundler/match_metadata.rb +17 -0
  148. data/bundler/lib/bundler/match_platform.rb +1 -1
  149. data/bundler/lib/bundler/match_remote_metadata.rb +29 -0
  150. data/bundler/lib/bundler/materialization.rb +59 -0
  151. data/bundler/lib/bundler/mirror.rb +8 -10
  152. data/bundler/lib/bundler/plugin/api/source.rb +7 -5
  153. data/bundler/lib/bundler/plugin/events.rb +24 -0
  154. data/bundler/lib/bundler/plugin/index.rb +13 -5
  155. data/bundler/lib/bundler/plugin/installer/path.rb +18 -0
  156. data/bundler/lib/bundler/plugin/installer/rubygems.rb +0 -4
  157. data/bundler/lib/bundler/plugin/installer.rb +42 -19
  158. data/bundler/lib/bundler/plugin/source_list.rb +4 -4
  159. data/bundler/lib/bundler/plugin.rb +35 -7
  160. data/bundler/lib/bundler/process_lock.rb +10 -14
  161. data/bundler/lib/bundler/remote_specification.rb +17 -13
  162. data/bundler/lib/bundler/resolver/base.rb +117 -0
  163. data/bundler/lib/bundler/resolver/candidate.rb +82 -0
  164. data/bundler/lib/bundler/resolver/incompatibility.rb +15 -0
  165. data/bundler/lib/bundler/resolver/package.rb +90 -0
  166. data/bundler/lib/bundler/resolver/root.rb +25 -0
  167. data/bundler/lib/bundler/resolver/spec_group.rb +54 -67
  168. data/bundler/lib/bundler/resolver.rb +432 -329
  169. data/bundler/lib/bundler/retry.rb +2 -2
  170. data/bundler/lib/bundler/ruby_dsl.rb +42 -7
  171. data/bundler/lib/bundler/ruby_version.rb +23 -10
  172. data/bundler/lib/bundler/rubygems_ext.rb +286 -81
  173. data/bundler/lib/bundler/rubygems_gem_installer.rb +77 -68
  174. data/bundler/lib/bundler/rubygems_integration.rb +57 -155
  175. data/bundler/lib/bundler/runtime.rb +28 -17
  176. data/bundler/lib/bundler/safe_marshal.rb +31 -0
  177. data/bundler/lib/bundler/self_manager.rb +50 -12
  178. data/bundler/lib/bundler/settings.rb +144 -58
  179. data/bundler/lib/bundler/setup.rb +13 -1
  180. data/bundler/lib/bundler/shared_helpers.rb +87 -36
  181. data/bundler/lib/bundler/source/git/git_proxy.rb +278 -80
  182. data/bundler/lib/bundler/source/git.rb +161 -68
  183. data/bundler/lib/bundler/source/metadata.rb +16 -16
  184. data/bundler/lib/bundler/source/path/installer.rb +1 -22
  185. data/bundler/lib/bundler/source/path.rb +16 -26
  186. data/bundler/lib/bundler/source/rubygems/remote.rb +1 -1
  187. data/bundler/lib/bundler/source/rubygems.rb +94 -154
  188. data/bundler/lib/bundler/source.rb +3 -1
  189. data/bundler/lib/bundler/source_list.rb +34 -4
  190. data/bundler/lib/bundler/spec_set.rb +195 -65
  191. data/bundler/lib/bundler/stub_specification.rb +34 -4
  192. data/bundler/lib/bundler/templates/Executable +1 -1
  193. data/bundler/lib/bundler/templates/Executable.bundler +6 -11
  194. data/bundler/lib/bundler/templates/Executable.standalone +2 -0
  195. data/bundler/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +77 -29
  196. data/bundler/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
  197. data/bundler/lib/bundler/templates/newgem/README.md.tt +11 -5
  198. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +19 -8
  199. data/bundler/lib/bundler/templates/newgem/bin/console.tt +0 -4
  200. data/bundler/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
  201. data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
  202. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
  203. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
  204. data/bundler/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +1 -1
  205. data/bundler/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
  206. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +18 -8
  207. data/bundler/lib/bundler/templates/newgem/gitignore.tt +3 -0
  208. data/bundler/lib/bundler/templates/newgem/gitlab-ci.yml.tt +13 -4
  209. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +12 -4
  210. data/bundler/lib/bundler/templates/newgem/rubocop.yml.tt +0 -5
  211. data/bundler/lib/bundler/templates/newgem/standard.yml.tt +1 -1
  212. data/bundler/lib/bundler/ui/rg_proxy.rb +1 -1
  213. data/bundler/lib/bundler/ui/shell.rb +60 -15
  214. data/bundler/lib/bundler/ui/silent.rb +33 -6
  215. data/bundler/lib/bundler/uri_credentials_filter.rb +3 -3
  216. data/bundler/lib/bundler/uri_normalizer.rb +23 -0
  217. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +3 -3
  218. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  219. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -1
  220. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +56 -7
  221. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +1350 -418
  222. data/bundler/lib/bundler/vendor/net-http-persistent/.document +1 -0
  223. data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
  224. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +4 -3
  225. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +23 -11
  226. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +1 -1
  227. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +102 -64
  228. data/bundler/lib/bundler/vendor/pub_grub/.document +1 -0
  229. data/bundler/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
  230. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
  231. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
  232. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
  233. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
  234. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
  235. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
  236. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
  237. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
  238. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +61 -0
  239. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
  240. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
  241. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
  242. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +411 -0
  243. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +248 -0
  244. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
  245. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
  246. data/bundler/lib/bundler/vendor/securerandom/.document +1 -0
  247. data/bundler/lib/bundler/vendor/securerandom/COPYING +56 -0
  248. data/bundler/lib/bundler/vendor/securerandom/lib/securerandom.rb +102 -0
  249. data/bundler/lib/bundler/vendor/thor/.document +1 -0
  250. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +3 -2
  251. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +1 -1
  252. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +1 -1
  253. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +11 -15
  254. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +15 -4
  255. data/bundler/lib/bundler/vendor/thor/lib/thor/actions.rb +15 -15
  256. data/bundler/lib/bundler/vendor/thor/lib/thor/base.rb +140 -14
  257. data/bundler/lib/bundler/vendor/thor/lib/thor/command.rb +13 -4
  258. data/bundler/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +4 -0
  259. data/bundler/lib/bundler/vendor/thor/lib/thor/error.rb +16 -25
  260. data/bundler/lib/bundler/vendor/thor/lib/thor/group.rb +12 -1
  261. data/bundler/lib/bundler/vendor/thor/lib/thor/invocation.rb +1 -1
  262. data/bundler/lib/bundler/vendor/thor/lib/thor/nested_context.rb +2 -2
  263. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +17 -1
  264. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +33 -17
  265. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/option.rb +28 -9
  266. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/options.rb +46 -7
  267. data/bundler/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +2 -2
  268. data/bundler/lib/bundler/vendor/thor/lib/thor/runner.rb +40 -30
  269. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +35 -159
  270. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/color.rb +1 -46
  271. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/column_printer.rb +29 -0
  272. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/html.rb +1 -46
  273. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +118 -0
  274. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/terminal.rb +42 -0
  275. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +38 -0
  276. data/bundler/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
  277. data/bundler/lib/bundler/vendor/thor/lib/thor/util.rb +8 -7
  278. data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  279. data/bundler/lib/bundler/vendor/thor/lib/thor.rb +166 -8
  280. data/bundler/lib/bundler/vendor/tsort/.document +1 -0
  281. data/bundler/lib/bundler/vendor/tsort/lib/tsort.rb +3 -0
  282. data/bundler/lib/bundler/vendor/uri/.document +1 -0
  283. data/bundler/lib/bundler/vendor/uri/COPYING +56 -0
  284. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +343 -148
  285. data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +10 -4
  286. data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +3 -2
  287. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +44 -33
  288. data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +40 -2
  289. data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +2 -1
  290. data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
  291. data/bundler/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
  292. data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -2
  293. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +25 -12
  294. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +130 -38
  295. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  296. data/bundler/lib/bundler/vendor/uri/lib/uri/ws.rb +1 -2
  297. data/bundler/lib/bundler/vendor/uri/lib/uri/wss.rb +2 -1
  298. data/bundler/lib/bundler/vendor/uri/lib/uri.rb +12 -11
  299. data/bundler/lib/bundler/vendored_net_http.rb +23 -0
  300. data/bundler/lib/bundler/vendored_persistent.rb +0 -36
  301. data/bundler/lib/bundler/{vendored_tmpdir.rb → vendored_pub_grub.rb} +1 -1
  302. data/bundler/lib/bundler/vendored_securerandom.rb +12 -0
  303. data/bundler/lib/bundler/vendored_timeout.rb +12 -0
  304. data/bundler/lib/bundler/vendored_uri.rb +18 -1
  305. data/bundler/lib/bundler/version.rb +5 -1
  306. data/bundler/lib/bundler/vlad.rb +1 -1
  307. data/bundler/lib/bundler/worker.rb +5 -7
  308. data/bundler/lib/bundler/yaml_serializer.rb +22 -13
  309. data/bundler/lib/bundler.rb +155 -148
  310. data/{bundler → doc/bundler}/UPGRADING.md +11 -4
  311. data/{CONTRIBUTING.md → doc/rubygems/CONTRIBUTING.md} +40 -17
  312. data/doc/rubygems/POLICIES.md +204 -0
  313. data/{test/rubygems/fake_certlib/openssl.rb → exe/gem} +5 -1
  314. data/{bin → exe}/update_rubygems +12 -10
  315. data/lib/rubygems/available_set.rb +8 -7
  316. data/lib/rubygems/basic_specification.rb +90 -52
  317. data/lib/rubygems/bundler_version_finder.rb +6 -6
  318. data/lib/rubygems/ci_detector.rb +75 -0
  319. data/lib/rubygems/command.rb +68 -64
  320. data/lib/rubygems/command_manager.rb +39 -24
  321. data/lib/rubygems/commands/build_command.rb +14 -19
  322. data/lib/rubygems/commands/cert_command.rb +39 -39
  323. data/lib/rubygems/commands/check_command.rb +30 -25
  324. data/lib/rubygems/commands/cleanup_command.rb +32 -43
  325. data/lib/rubygems/commands/contents_command.rb +33 -25
  326. data/lib/rubygems/commands/dependency_command.rb +22 -23
  327. data/lib/rubygems/commands/environment_command.rb +8 -9
  328. data/lib/rubygems/commands/exec_command.rb +247 -0
  329. data/lib/rubygems/commands/fetch_command.rb +25 -10
  330. data/lib/rubygems/commands/generate_index_command.rb +40 -74
  331. data/lib/rubygems/commands/help_command.rb +15 -14
  332. data/lib/rubygems/commands/info_command.rb +5 -5
  333. data/lib/rubygems/commands/install_command.rb +31 -38
  334. data/lib/rubygems/commands/list_command.rb +6 -5
  335. data/lib/rubygems/commands/lock_command.rb +6 -5
  336. data/lib/rubygems/commands/mirror_command.rb +4 -3
  337. data/lib/rubygems/commands/open_command.rb +11 -12
  338. data/lib/rubygems/commands/outdated_command.rb +6 -5
  339. data/lib/rubygems/commands/owner_command.rb +23 -22
  340. data/lib/rubygems/commands/pristine_command.rb +83 -62
  341. data/lib/rubygems/commands/push_command.rb +38 -13
  342. data/lib/rubygems/commands/query_command.rb +11 -11
  343. data/lib/rubygems/commands/rdoc_command.rb +23 -28
  344. data/lib/rubygems/commands/rebuild_command.rb +262 -0
  345. data/lib/rubygems/commands/search_command.rb +6 -5
  346. data/lib/rubygems/commands/server_command.rb +4 -3
  347. data/lib/rubygems/commands/setup_command.rb +137 -154
  348. data/lib/rubygems/commands/signin_command.rb +10 -9
  349. data/lib/rubygems/commands/signout_command.rb +8 -7
  350. data/lib/rubygems/commands/sources_command.rb +34 -33
  351. data/lib/rubygems/commands/specification_command.rb +25 -20
  352. data/lib/rubygems/commands/stale_command.rb +5 -4
  353. data/lib/rubygems/commands/uninstall_command.rb +66 -59
  354. data/lib/rubygems/commands/unpack_command.rb +23 -30
  355. data/lib/rubygems/commands/update_command.rb +62 -94
  356. data/lib/rubygems/commands/which_command.rb +9 -8
  357. data/lib/rubygems/commands/yank_command.rb +14 -13
  358. data/lib/rubygems/compatibility.rb +5 -6
  359. data/lib/rubygems/config_file.rb +160 -50
  360. data/lib/rubygems/core_ext/kernel_gem.rb +3 -10
  361. data/lib/rubygems/core_ext/kernel_require.rb +88 -114
  362. data/lib/rubygems/core_ext/kernel_warn.rb +30 -39
  363. data/lib/rubygems/core_ext/tcpsocket_init.rb +4 -2
  364. data/lib/rubygems/defaults.rb +53 -22
  365. data/lib/rubygems/dependency.rb +34 -36
  366. data/lib/rubygems/dependency_installer.rb +52 -56
  367. data/lib/rubygems/dependency_list.rb +8 -7
  368. data/lib/rubygems/deprecate.rb +80 -75
  369. data/lib/rubygems/doctor.rb +23 -22
  370. data/lib/rubygems/errors.rb +6 -8
  371. data/lib/rubygems/exceptions.rb +20 -18
  372. data/lib/rubygems/ext/build_error.rb +2 -1
  373. data/lib/rubygems/ext/builder.rb +56 -32
  374. data/lib/rubygems/ext/cargo_builder/link_flag_converter.rb +9 -5
  375. data/lib/rubygems/ext/cargo_builder.rb +158 -131
  376. data/lib/rubygems/ext/cmake_builder.rb +9 -4
  377. data/lib/rubygems/ext/configure_builder.rb +9 -3
  378. data/lib/rubygems/ext/ext_conf_builder.rb +19 -15
  379. data/lib/rubygems/ext/rake_builder.rb +14 -7
  380. data/lib/rubygems/ext.rb +8 -7
  381. data/lib/rubygems/gem_runner.rb +23 -9
  382. data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +163 -0
  383. data/lib/rubygems/gemcutter_utilities/webauthn_listener.rb +105 -0
  384. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +80 -0
  385. data/lib/rubygems/gemcutter_utilities.rb +141 -63
  386. data/lib/rubygems/gemspec_helpers.rb +19 -0
  387. data/lib/rubygems/install_default_message.rb +3 -2
  388. data/lib/rubygems/install_message.rb +3 -2
  389. data/lib/rubygems/install_update_options.rb +72 -67
  390. data/lib/rubygems/installer.rb +148 -130
  391. data/lib/rubygems/installer_uninstaller_utils.rb +2 -4
  392. data/lib/rubygems/local_remote_options.rb +24 -28
  393. data/lib/rubygems/name_tuple.rb +10 -11
  394. data/lib/rubygems/package/digest_io.rb +2 -1
  395. data/lib/rubygems/package/file_source.rb +3 -2
  396. data/lib/rubygems/package/io_source.rb +1 -0
  397. data/lib/rubygems/package/old.rb +11 -10
  398. data/lib/rubygems/package/source.rb +1 -0
  399. data/lib/rubygems/package/tar_header.rb +125 -91
  400. data/lib/rubygems/package/tar_reader/entry.rb +106 -29
  401. data/lib/rubygems/package/tar_reader.rb +16 -39
  402. data/lib/rubygems/package/tar_writer.rb +29 -26
  403. data/lib/rubygems/package.rb +122 -84
  404. data/lib/rubygems/package_task.rb +7 -6
  405. data/lib/rubygems/path_support.rb +11 -11
  406. data/lib/rubygems/platform.rb +119 -70
  407. data/lib/rubygems/psych_tree.rb +6 -1
  408. data/lib/rubygems/query_utils.rb +46 -48
  409. data/lib/rubygems/rdoc.rb +13 -3
  410. data/lib/rubygems/remote_fetcher.rb +47 -39
  411. data/lib/rubygems/request/connection_pools.rb +6 -6
  412. data/lib/rubygems/request/http_pool.rb +2 -1
  413. data/lib/rubygems/request/https_pool.rb +1 -0
  414. data/lib/rubygems/request.rb +48 -44
  415. data/lib/rubygems/request_set/gem_dependency_api.rb +141 -144
  416. data/lib/rubygems/request_set/lockfile/parser.rb +31 -30
  417. data/lib/rubygems/request_set/lockfile/tokenizer.rb +24 -14
  418. data/lib/rubygems/request_set/lockfile.rb +11 -15
  419. data/lib/rubygems/request_set.rb +25 -23
  420. data/lib/rubygems/requirement.rb +30 -27
  421. data/lib/rubygems/resolver/activation_request.rb +7 -10
  422. data/lib/rubygems/resolver/api_set/gem_parser.rb +7 -3
  423. data/lib/rubygems/resolver/api_set.rb +20 -13
  424. data/lib/rubygems/resolver/api_specification.rb +8 -7
  425. data/lib/rubygems/resolver/best_set.rb +5 -32
  426. data/lib/rubygems/resolver/composed_set.rb +4 -3
  427. data/lib/rubygems/resolver/conflict.rb +14 -21
  428. data/lib/rubygems/resolver/current_set.rb +1 -0
  429. data/lib/rubygems/resolver/dependency_request.rb +3 -2
  430. data/lib/rubygems/resolver/git_set.rb +2 -2
  431. data/lib/rubygems/resolver/git_specification.rb +7 -6
  432. data/lib/rubygems/resolver/index_set.rb +10 -9
  433. data/lib/rubygems/resolver/index_specification.rb +8 -6
  434. data/lib/rubygems/resolver/installed_specification.rb +6 -5
  435. data/lib/rubygems/resolver/installer_set.rb +19 -22
  436. data/lib/rubygems/resolver/local_specification.rb +4 -3
  437. data/lib/rubygems/resolver/lock_set.rb +6 -5
  438. data/lib/rubygems/resolver/lock_specification.rb +5 -4
  439. data/lib/rubygems/resolver/requirement_list.rb +1 -0
  440. data/lib/rubygems/resolver/set.rb +1 -0
  441. data/lib/rubygems/resolver/source_set.rb +2 -0
  442. data/lib/rubygems/resolver/spec_specification.rb +8 -0
  443. data/lib/rubygems/resolver/specification.rb +2 -1
  444. data/lib/rubygems/resolver/stats.rb +2 -1
  445. data/lib/rubygems/resolver/vendor_set.rb +2 -1
  446. data/lib/rubygems/resolver/vendor_specification.rb +4 -3
  447. data/lib/rubygems/resolver.rb +51 -57
  448. data/lib/rubygems/s3_uri_signer.rb +18 -16
  449. data/lib/rubygems/safe_marshal/elements.rb +146 -0
  450. data/lib/rubygems/safe_marshal/reader.rb +325 -0
  451. data/lib/rubygems/safe_marshal/visitors/stream_printer.rb +31 -0
  452. data/lib/rubygems/safe_marshal/visitors/to_ruby.rb +428 -0
  453. data/lib/rubygems/safe_marshal/visitors/visitor.rb +74 -0
  454. data/lib/rubygems/safe_marshal.rb +74 -0
  455. data/lib/rubygems/safe_yaml.rb +14 -26
  456. data/lib/rubygems/security/policies.rb +48 -49
  457. data/lib/rubygems/security/policy.rb +25 -28
  458. data/lib/rubygems/security/signer.rb +16 -7
  459. data/lib/rubygems/security/trust_dir.rb +12 -13
  460. data/lib/rubygems/security.rb +40 -66
  461. data/lib/rubygems/security_option.rb +7 -6
  462. data/lib/rubygems/shellwords.rb +3 -0
  463. data/lib/rubygems/source/git.rb +34 -31
  464. data/lib/rubygems/source/installed.rb +4 -3
  465. data/lib/rubygems/source/local.rb +49 -49
  466. data/lib/rubygems/source/lock.rb +2 -3
  467. data/lib/rubygems/source/specific_file.rb +6 -4
  468. data/lib/rubygems/source/vendor.rb +1 -2
  469. data/lib/rubygems/source.rb +37 -31
  470. data/lib/rubygems/source_list.rb +8 -8
  471. data/lib/rubygems/spec_fetcher.rb +95 -66
  472. data/lib/rubygems/specification.rb +342 -404
  473. data/lib/rubygems/specification_policy.rb +147 -75
  474. data/lib/rubygems/specification_record.rb +212 -0
  475. data/lib/rubygems/stub_specification.rb +56 -30
  476. data/lib/rubygems/target_rbconfig.rb +50 -0
  477. data/lib/rubygems/text.rb +3 -4
  478. data/lib/rubygems/uninstaller.rb +67 -48
  479. data/lib/rubygems/update_suggestion.rb +56 -0
  480. data/lib/rubygems/uri.rb +10 -10
  481. data/lib/rubygems/uri_formatter.rb +2 -2
  482. data/lib/rubygems/user_interaction.rb +50 -40
  483. data/lib/rubygems/util/licenses.rb +310 -39
  484. data/lib/rubygems/util/list.rb +4 -1
  485. data/lib/rubygems/util.rb +19 -20
  486. data/lib/rubygems/validator.rb +15 -14
  487. data/lib/rubygems/vendor/molinillo/.document +1 -0
  488. data/lib/rubygems/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
  489. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +11 -11
  490. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +1 -1
  491. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +1 -1
  492. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -1
  493. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -1
  494. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -1
  495. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +1 -1
  496. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -1
  497. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +1 -1
  498. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +1 -1
  499. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph.rb +3 -3
  500. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/errors.rb +1 -1
  501. data/lib/rubygems/vendor/molinillo/lib/molinillo/gem_metadata.rb +6 -0
  502. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +2 -2
  503. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/modules/ui.rb +1 -1
  504. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/resolution.rb +4 -4
  505. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/resolver.rb +1 -1
  506. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/state.rb +1 -1
  507. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo.rb +2 -2
  508. data/lib/rubygems/vendor/net-http/.document +1 -0
  509. data/lib/rubygems/vendor/net-http/COPYING +56 -0
  510. data/lib/rubygems/vendor/net-http/lib/net/http/exceptions.rb +34 -0
  511. data/lib/rubygems/vendor/net-http/lib/net/http/generic_request.rb +414 -0
  512. data/lib/rubygems/vendor/net-http/lib/net/http/header.rb +981 -0
  513. data/lib/rubygems/vendor/net-http/lib/net/http/proxy_delta.rb +17 -0
  514. data/lib/rubygems/vendor/net-http/lib/net/http/request.rb +88 -0
  515. data/lib/rubygems/vendor/net-http/lib/net/http/requests.rb +430 -0
  516. data/lib/rubygems/vendor/net-http/lib/net/http/response.rb +738 -0
  517. data/lib/rubygems/vendor/net-http/lib/net/http/responses.rb +1174 -0
  518. data/lib/rubygems/vendor/net-http/lib/net/http/status.rb +84 -0
  519. data/lib/rubygems/vendor/net-http/lib/net/http.rb +2580 -0
  520. data/lib/rubygems/vendor/net-http/lib/net/https.rb +23 -0
  521. data/lib/rubygems/vendor/net-protocol/.document +1 -0
  522. data/lib/rubygems/vendor/net-protocol/lib/net/protocol.rb +544 -0
  523. data/lib/rubygems/vendor/optparse/.document +1 -0
  524. data/lib/rubygems/vendor/optparse/COPYING +56 -0
  525. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/ac.rb +16 -0
  526. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/kwargs.rb +8 -3
  527. data/lib/rubygems/vendor/optparse/lib/optparse/uri.rb +7 -0
  528. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/version.rb +9 -0
  529. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse.rb +206 -83
  530. data/lib/rubygems/vendor/resolv/.document +1 -0
  531. data/lib/rubygems/vendor/resolv/COPYING +56 -0
  532. data/lib/rubygems/vendor/resolv/lib/resolv.rb +3455 -0
  533. data/lib/rubygems/vendor/securerandom/.document +1 -0
  534. data/lib/rubygems/vendor/securerandom/COPYING +56 -0
  535. data/lib/rubygems/vendor/securerandom/lib/securerandom.rb +102 -0
  536. data/lib/rubygems/vendor/timeout/.document +1 -0
  537. data/lib/rubygems/vendor/timeout/COPYING +56 -0
  538. data/lib/rubygems/vendor/timeout/lib/timeout.rb +198 -0
  539. data/lib/rubygems/vendor/tsort/.document +1 -0
  540. data/lib/rubygems/vendor/tsort/lib/tsort.rb +455 -0
  541. data/lib/rubygems/vendor/uri/.document +1 -0
  542. data/lib/rubygems/vendor/uri/COPYING +56 -0
  543. data/lib/rubygems/vendor/uri/lib/uri/common.rb +876 -0
  544. data/lib/rubygems/vendor/uri/lib/uri/file.rb +100 -0
  545. data/lib/rubygems/vendor/uri/lib/uri/ftp.rb +267 -0
  546. data/lib/rubygems/vendor/uri/lib/uri/generic.rb +1578 -0
  547. data/lib/rubygems/vendor/uri/lib/uri/http.rb +125 -0
  548. data/lib/rubygems/vendor/uri/lib/uri/https.rb +23 -0
  549. data/lib/rubygems/vendor/uri/lib/uri/ldap.rb +261 -0
  550. data/lib/rubygems/vendor/uri/lib/uri/ldaps.rb +22 -0
  551. data/lib/rubygems/vendor/uri/lib/uri/mailto.rb +293 -0
  552. data/lib/rubygems/vendor/uri/lib/uri/rfc2396_parser.rb +546 -0
  553. data/lib/rubygems/vendor/uri/lib/uri/rfc3986_parser.rb +206 -0
  554. data/lib/rubygems/vendor/uri/lib/uri/version.rb +6 -0
  555. data/lib/rubygems/vendor/uri/lib/uri/ws.rb +83 -0
  556. data/lib/rubygems/vendor/uri/lib/uri/wss.rb +23 -0
  557. data/lib/rubygems/vendor/uri/lib/uri.rb +104 -0
  558. data/{bundler/lib/bundler → lib/rubygems}/vendored_molinillo.rb +0 -1
  559. data/lib/rubygems/vendored_net_http.rb +5 -0
  560. data/lib/rubygems/vendored_optparse.rb +3 -0
  561. data/lib/rubygems/vendored_securerandom.rb +3 -0
  562. data/lib/rubygems/vendored_timeout.rb +5 -0
  563. data/lib/rubygems/vendored_tsort.rb +3 -0
  564. data/lib/rubygems/version.rb +57 -45
  565. data/lib/rubygems/version_option.rb +6 -8
  566. data/lib/rubygems/yaml_serializer.rb +98 -0
  567. data/lib/rubygems.rb +191 -133
  568. data/rubygems-update.gemspec +16 -9
  569. data/setup.rb +12 -9
  570. metadata +233 -307
  571. data/POLICIES.md +0 -100
  572. data/bin/gem +0 -13
  573. data/bundler/lib/bundler/dep_proxy.rb +0 -55
  574. data/bundler/lib/bundler/templates/gems.rb +0 -5
  575. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +0 -5
  576. data/bundler/lib/bundler/templates/newgem/travis.yml.tt +0 -6
  577. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  578. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  579. data/bundler/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
  580. data/bundler/lib/bundler/version_ranges.rb +0 -122
  581. data/lib/rubygems/indexer.rb +0 -427
  582. data/lib/rubygems/mock_gem_ui.rb +0 -85
  583. data/lib/rubygems/optparse/lib/optparse/uri.rb +0 -7
  584. data/lib/rubygems/optparse.rb +0 -3
  585. data/lib/rubygems/resolver/molinillo/LICENSE +0 -9
  586. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  587. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
  588. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
  589. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
  590. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
  591. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
  592. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
  593. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
  594. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
  595. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
  596. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
  597. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +0 -255
  598. data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +0 -143
  599. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  600. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
  601. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/ui.rb +0 -67
  602. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb +0 -839
  603. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolver.rb +0 -46
  604. data/lib/rubygems/resolver/molinillo/lib/molinillo/state.rb +0 -58
  605. data/lib/rubygems/resolver/molinillo/lib/molinillo.rb +0 -11
  606. data/lib/rubygems/resolver/molinillo.rb +0 -2
  607. data/lib/rubygems/tsort/LICENSE.txt +0 -22
  608. data/lib/rubygems/tsort/lib/tsort.rb +0 -454
  609. data/lib/rubygems/tsort.rb +0 -3
  610. data/test/rubygems/alternate_cert.pem +0 -19
  611. data/test/rubygems/alternate_cert_32.pem +0 -19
  612. data/test/rubygems/alternate_key.pem +0 -27
  613. data/test/rubygems/bad_rake.rb +0 -2
  614. data/test/rubygems/ca_cert.pem +0 -77
  615. data/test/rubygems/child_cert.pem +0 -20
  616. data/test/rubygems/child_cert_32.pem +0 -20
  617. data/test/rubygems/child_key.pem +0 -27
  618. data/test/rubygems/client.pem +0 -107
  619. data/test/rubygems/data/excon-0.7.7.gemspec.rz +0 -0
  620. data/test/rubygems/data/gem-private_key.pem +0 -27
  621. data/test/rubygems/data/gem-public_cert.pem +0 -20
  622. data/test/rubygems/data/null-required-ruby-version.gemspec.rz +0 -0
  623. data/test/rubygems/data/null-required-rubygems-version.gemspec.rz +0 -0
  624. data/test/rubygems/data/pry-0.4.7.gemspec.rz +0 -0
  625. data/test/rubygems/encrypted_private_key.pem +0 -30
  626. data/test/rubygems/expired_cert.pem +0 -19
  627. data/test/rubygems/foo/discover.rb +0 -1
  628. data/test/rubygems/future_cert.pem +0 -19
  629. data/test/rubygems/future_cert_32.pem +0 -19
  630. data/test/rubygems/good_rake.rb +0 -2
  631. data/test/rubygems/grandchild_cert.pem +0 -20
  632. data/test/rubygems/grandchild_cert_32.pem +0 -20
  633. data/test/rubygems/grandchild_key.pem +0 -27
  634. data/test/rubygems/helper.rb +0 -1622
  635. data/test/rubygems/installer_test_case.rb +0 -247
  636. data/test/rubygems/invalid_client.pem +0 -49
  637. data/test/rubygems/invalid_issuer_cert.pem +0 -20
  638. data/test/rubygems/invalid_issuer_cert_32.pem +0 -20
  639. data/test/rubygems/invalid_key.pem +0 -27
  640. data/test/rubygems/invalid_signer_cert.pem +0 -19
  641. data/test/rubygems/invalid_signer_cert_32.pem +0 -19
  642. data/test/rubygems/invalidchild_cert.pem +0 -20
  643. data/test/rubygems/invalidchild_cert_32.pem +0 -20
  644. data/test/rubygems/invalidchild_key.pem +0 -27
  645. data/test/rubygems/package/tar_test_case.rb +0 -139
  646. data/test/rubygems/packages/ascii_binder-0.1.10.1.gem +0 -0
  647. data/test/rubygems/packages/ill-formatted-platform-1.0.0.10.gem +0 -0
  648. data/test/rubygems/plugin/exception/rubygems_plugin.rb +0 -3
  649. data/test/rubygems/plugin/load/rubygems_plugin.rb +0 -4
  650. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +0 -3
  651. data/test/rubygems/private3072_key.pem +0 -40
  652. data/test/rubygems/private_ec_key.pem +0 -9
  653. data/test/rubygems/private_key.pem +0 -27
  654. data/test/rubygems/public3072_cert.pem +0 -25
  655. data/test/rubygems/public_cert.pem +0 -20
  656. data/test/rubygems/public_cert_32.pem +0 -19
  657. data/test/rubygems/public_key.pem +0 -9
  658. data/test/rubygems/rubygems/commands/crash_command.rb +0 -4
  659. data/test/rubygems/rubygems_plugin.rb +0 -23
  660. data/test/rubygems/sff/discover.rb +0 -1
  661. data/test/rubygems/simple_gem.rb +0 -67
  662. data/test/rubygems/specifications/bar-0.0.2.gemspec +0 -7
  663. data/test/rubygems/specifications/foo-0.0.1-x86-mswin32.gemspec +0 -0
  664. data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +0 -12
  665. data/test/rubygems/ssl_cert.pem +0 -80
  666. data/test/rubygems/ssl_key.pem +0 -27
  667. data/test/rubygems/test_bundled_ca.rb +0 -60
  668. data/test/rubygems/test_config.rb +0 -27
  669. data/test/rubygems/test_deprecate.rb +0 -157
  670. data/test/rubygems/test_exit.rb +0 -11
  671. data/test/rubygems/test_gem.rb +0 -2112
  672. data/test/rubygems/test_gem_available_set.rb +0 -129
  673. data/test/rubygems/test_gem_bundler_version_finder.rb +0 -125
  674. data/test/rubygems/test_gem_command.rb +0 -400
  675. data/test/rubygems/test_gem_command_manager.rb +0 -334
  676. data/test/rubygems/test_gem_commands_build_command.rb +0 -727
  677. data/test/rubygems/test_gem_commands_cert_command.rb +0 -867
  678. data/test/rubygems/test_gem_commands_check_command.rb +0 -67
  679. data/test/rubygems/test_gem_commands_cleanup_command.rb +0 -291
  680. data/test/rubygems/test_gem_commands_contents_command.rb +0 -270
  681. data/test/rubygems/test_gem_commands_dependency_command.rb +0 -227
  682. data/test/rubygems/test_gem_commands_environment_command.rb +0 -167
  683. data/test/rubygems/test_gem_commands_fetch_command.rb +0 -257
  684. data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -80
  685. data/test/rubygems/test_gem_commands_help_command.rb +0 -93
  686. data/test/rubygems/test_gem_commands_info_command.rb +0 -43
  687. data/test/rubygems/test_gem_commands_install_command.rb +0 -1553
  688. data/test/rubygems/test_gem_commands_list_command.rb +0 -32
  689. data/test/rubygems/test_gem_commands_lock_command.rb +0 -66
  690. data/test/rubygems/test_gem_commands_mirror.rb +0 -19
  691. data/test/rubygems/test_gem_commands_open_command.rb +0 -97
  692. data/test/rubygems/test_gem_commands_outdated_command.rb +0 -49
  693. data/test/rubygems/test_gem_commands_owner_command.rb +0 -326
  694. data/test/rubygems/test_gem_commands_pristine_command.rb +0 -659
  695. data/test/rubygems/test_gem_commands_push_command.rb +0 -477
  696. data/test/rubygems/test_gem_commands_query_command.rb +0 -857
  697. data/test/rubygems/test_gem_commands_search_command.rb +0 -15
  698. data/test/rubygems/test_gem_commands_server_command.rb +0 -19
  699. data/test/rubygems/test_gem_commands_setup_command.rb +0 -447
  700. data/test/rubygems/test_gem_commands_signin_command.rb +0 -219
  701. data/test/rubygems/test_gem_commands_signout_command.rb +0 -30
  702. data/test/rubygems/test_gem_commands_sources_command.rb +0 -534
  703. data/test/rubygems/test_gem_commands_specification_command.rb +0 -276
  704. data/test/rubygems/test_gem_commands_stale_command.rb +0 -42
  705. data/test/rubygems/test_gem_commands_uninstall_command.rb +0 -504
  706. data/test/rubygems/test_gem_commands_unpack_command.rb +0 -223
  707. data/test/rubygems/test_gem_commands_update_command.rb +0 -835
  708. data/test/rubygems/test_gem_commands_which_command.rb +0 -84
  709. data/test/rubygems/test_gem_commands_yank_command.rb +0 -180
  710. data/test/rubygems/test_gem_config_file.rb +0 -504
  711. data/test/rubygems/test_gem_dependency.rb +0 -395
  712. data/test/rubygems/test_gem_dependency_installer.rb +0 -1155
  713. data/test/rubygems/test_gem_dependency_list.rb +0 -264
  714. data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -26
  715. data/test/rubygems/test_gem_doctor.rb +0 -194
  716. data/test/rubygems/test_gem_ext_builder.rb +0 -338
  717. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/.gitignore +0 -1
  718. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.lock +0 -243
  719. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.toml +0 -10
  720. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/build.rb +0 -21
  721. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +0 -10
  722. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/src/lib.rs +0 -27
  723. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/.gitignore +0 -1
  724. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +0 -243
  725. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +0 -10
  726. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/build.rb +0 -21
  727. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/rust_ruby_example.gemspec +0 -8
  728. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +0 -39
  729. data/test/rubygems/test_gem_ext_cargo_builder.rb +0 -178
  730. data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +0 -33
  731. data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +0 -75
  732. data/test/rubygems/test_gem_ext_cmake_builder.rb +0 -83
  733. data/test/rubygems/test_gem_ext_configure_builder.rb +0 -79
  734. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +0 -230
  735. data/test/rubygems/test_gem_ext_rake_builder.rb +0 -112
  736. data/test/rubygems/test_gem_gem_runner.rb +0 -113
  737. data/test/rubygems/test_gem_gemcutter_utilities.rb +0 -272
  738. data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -59
  739. data/test/rubygems/test_gem_indexer.rb +0 -361
  740. data/test/rubygems/test_gem_install_update_options.rb +0 -207
  741. data/test/rubygems/test_gem_installer.rb +0 -2394
  742. data/test/rubygems/test_gem_local_remote_options.rb +0 -132
  743. data/test/rubygems/test_gem_name_tuple.rb +0 -42
  744. data/test/rubygems/test_gem_package.rb +0 -1178
  745. data/test/rubygems/test_gem_package_old.rb +0 -90
  746. data/test/rubygems/test_gem_package_tar_header.rb +0 -225
  747. data/test/rubygems/test_gem_package_tar_reader.rb +0 -87
  748. data/test/rubygems/test_gem_package_tar_reader_entry.rb +0 -152
  749. data/test/rubygems/test_gem_package_tar_writer.rb +0 -330
  750. data/test/rubygems/test_gem_package_task.rb +0 -117
  751. data/test/rubygems/test_gem_path_support.rb +0 -138
  752. data/test/rubygems/test_gem_platform.rb +0 -391
  753. data/test/rubygems/test_gem_rdoc.rb +0 -136
  754. data/test/rubygems/test_gem_remote_fetcher.rb +0 -1226
  755. data/test/rubygems/test_gem_request.rb +0 -541
  756. data/test/rubygems/test_gem_request_connection_pools.rb +0 -150
  757. data/test/rubygems/test_gem_request_set.rb +0 -671
  758. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +0 -847
  759. data/test/rubygems/test_gem_request_set_lockfile.rb +0 -468
  760. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +0 -543
  761. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +0 -306
  762. data/test/rubygems/test_gem_requirement.rb +0 -498
  763. data/test/rubygems/test_gem_resolver.rb +0 -791
  764. data/test/rubygems/test_gem_resolver_activation_request.rb +0 -42
  765. data/test/rubygems/test_gem_resolver_api_set.rb +0 -209
  766. data/test/rubygems/test_gem_resolver_api_specification.rb +0 -166
  767. data/test/rubygems/test_gem_resolver_best_set.rb +0 -158
  768. data/test/rubygems/test_gem_resolver_composed_set.rb +0 -43
  769. data/test/rubygems/test_gem_resolver_conflict.rb +0 -81
  770. data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -82
  771. data/test/rubygems/test_gem_resolver_git_set.rb +0 -187
  772. data/test/rubygems/test_gem_resolver_git_specification.rb +0 -113
  773. data/test/rubygems/test_gem_resolver_index_set.rb +0 -87
  774. data/test/rubygems/test_gem_resolver_index_specification.rb +0 -92
  775. data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -46
  776. data/test/rubygems/test_gem_resolver_installer_set.rb +0 -275
  777. data/test/rubygems/test_gem_resolver_local_specification.rb +0 -43
  778. data/test/rubygems/test_gem_resolver_lock_set.rb +0 -61
  779. data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -97
  780. data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -18
  781. data/test/rubygems/test_gem_resolver_specification.rb +0 -62
  782. data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -81
  783. data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -81
  784. data/test/rubygems/test_gem_security.rb +0 -340
  785. data/test/rubygems/test_gem_security_policy.rb +0 -535
  786. data/test/rubygems/test_gem_security_signer.rb +0 -217
  787. data/test/rubygems/test_gem_security_trust_dir.rb +0 -98
  788. data/test/rubygems/test_gem_silent_ui.rb +0 -116
  789. data/test/rubygems/test_gem_source.rb +0 -253
  790. data/test/rubygems/test_gem_source_fetch_problem.rb +0 -36
  791. data/test/rubygems/test_gem_source_git.rb +0 -303
  792. data/test/rubygems/test_gem_source_installed.rb +0 -34
  793. data/test/rubygems/test_gem_source_list.rb +0 -118
  794. data/test/rubygems/test_gem_source_local.rb +0 -106
  795. data/test/rubygems/test_gem_source_lock.rb +0 -112
  796. data/test/rubygems/test_gem_source_specific_file.rb +0 -75
  797. data/test/rubygems/test_gem_source_subpath_problem.rb +0 -49
  798. data/test/rubygems/test_gem_source_vendor.rb +0 -29
  799. data/test/rubygems/test_gem_spec_fetcher.rb +0 -337
  800. data/test/rubygems/test_gem_specification.rb +0 -3756
  801. data/test/rubygems/test_gem_stream_ui.rb +0 -224
  802. data/test/rubygems/test_gem_stub_specification.rb +0 -277
  803. data/test/rubygems/test_gem_text.rb +0 -102
  804. data/test/rubygems/test_gem_uninstaller.rb +0 -674
  805. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -30
  806. data/test/rubygems/test_gem_uri.rb +0 -39
  807. data/test/rubygems/test_gem_uri_formatter.rb +0 -26
  808. data/test/rubygems/test_gem_util.rb +0 -90
  809. data/test/rubygems/test_gem_validator.rb +0 -42
  810. data/test/rubygems/test_gem_version.rb +0 -295
  811. data/test/rubygems/test_gem_version_option.rb +0 -164
  812. data/test/rubygems/test_kernel.rb +0 -129
  813. data/test/rubygems/test_project_sanity.rb +0 -20
  814. data/test/rubygems/test_remote_fetch_error.rb +0 -19
  815. data/test/rubygems/test_require.rb +0 -719
  816. data/test/rubygems/test_rubygems.rb +0 -74
  817. data/test/rubygems/utilities.rb +0 -371
  818. data/test/rubygems/wrong_key_cert.pem +0 -19
  819. data/test/rubygems/wrong_key_cert_32.pem +0 -19
  820. data/test/test_changelog_generator.rb +0 -17
  821. /data/{lib/rubygems/optparse → bundler/lib/bundler/vendor/connection_pool}/.document +0 -0
  822. /data/{lib/rubygems/tsort → bundler/lib/bundler/vendor/fileutils}/.document +0 -0
  823. /data/{lib/rubygems/optparse → bundler/lib/bundler/vendor/fileutils}/COPYING +0 -0
  824. /data/{MAINTAINERS.txt → doc/MAINTAINERS.txt} +0 -0
  825. /data/{UPGRADING.md → doc/rubygems/UPGRADING.md} +0 -0
  826. /data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/LICENSE +0 -0
  827. /data/{bundler/lib/bundler/vendor/fileutils → lib/rubygems/vendor/net-protocol}/LICENSE.txt +0 -0
  828. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optionparser.rb +0 -0
  829. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/date.rb +0 -0
  830. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/shellwords.rb +0 -0
  831. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/time.rb +0 -0
  832. /data/{bundler/lib/bundler/vendor/uri → lib/rubygems/vendor/tsort}/LICENSE.txt +0 -0
@@ -1,1178 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'package/tar_test_case'
4
- require 'rubygems/openssl'
5
-
6
- class TestGemPackage < Gem::Package::TarTestCase
7
- def setup
8
- super
9
-
10
- @spec = quick_gem 'a' do |s|
11
- s.description = 'π'
12
- s.files = %w[lib/code.rb]
13
- end
14
-
15
- util_build_gem @spec
16
-
17
- @gem = @spec.cache_file
18
-
19
- @destination = File.join @tempdir, 'extract'
20
-
21
- FileUtils.mkdir_p @destination
22
- end
23
-
24
- def test_class_new_old_format
25
- pend "jruby can't require the simple_gem file" if Gem.java_platform?
26
- require_relative "simple_gem"
27
- File.open 'old_format.gem', 'wb' do |io|
28
- io.write SIMPLE_GEM
29
- end
30
-
31
- package = Gem::Package.new 'old_format.gem'
32
-
33
- assert package.spec
34
- end
35
-
36
- def test_add_checksums
37
- gem_io = StringIO.new
38
-
39
- spec = Gem::Specification.new 'build', '1'
40
- spec.summary = 'build'
41
- spec.authors = 'build'
42
- spec.files = ['lib/code.rb']
43
- spec.date = Time.at 0
44
- spec.rubygems_version = Gem::Version.new '0'
45
-
46
- FileUtils.mkdir 'lib'
47
-
48
- File.open 'lib/code.rb', 'w' do |io|
49
- io.write '# lib/code.rb'
50
- end
51
-
52
- package = Gem::Package.new spec.file_name
53
- package.spec = spec
54
- package.build_time = 1 # 0 uses current time
55
- package.setup_signer
56
-
57
- Gem::Package::TarWriter.new gem_io do |gem|
58
- package.add_metadata gem
59
- package.add_contents gem
60
- package.add_checksums gem
61
- end
62
-
63
- gem_io.rewind
64
-
65
- reader = Gem::Package::TarReader.new gem_io
66
-
67
- checksums = nil
68
- tar = nil
69
-
70
- reader.each_entry do |entry|
71
- case entry.full_name
72
- when 'checksums.yaml.gz' then
73
- Zlib::GzipReader.wrap entry do |io|
74
- checksums = io.read
75
- end
76
- when 'data.tar.gz' then
77
- tar = entry.read
78
- end
79
- end
80
-
81
- s = StringIO.new
82
-
83
- package.gzip_to s do |io|
84
- io.write spec.to_yaml
85
- end
86
-
87
- metadata_sha256 = OpenSSL::Digest::SHA256.hexdigest s.string
88
- metadata_sha512 = OpenSSL::Digest::SHA512.hexdigest s.string
89
-
90
- expected = {
91
- 'SHA512' => {
92
- 'metadata.gz' => metadata_sha512,
93
- 'data.tar.gz' => OpenSSL::Digest::SHA512.hexdigest(tar),
94
- },
95
- 'SHA256' => {
96
- 'metadata.gz' => metadata_sha256,
97
- 'data.tar.gz' => OpenSSL::Digest::SHA256.hexdigest(tar),
98
- },
99
- }
100
-
101
- assert_equal expected, load_yaml(checksums)
102
- end
103
-
104
- def test_build_time_uses_source_date_epoch
105
- epoch = ENV["SOURCE_DATE_EPOCH"]
106
- ENV["SOURCE_DATE_EPOCH"] = "123456789"
107
-
108
- spec = Gem::Specification.new 'build', '1'
109
- spec.summary = 'build'
110
- spec.authors = 'build'
111
- spec.files = ['lib/code.rb']
112
- spec.date = Time.at 0
113
- spec.rubygems_version = Gem::Version.new '0'
114
-
115
- package = Gem::Package.new spec.file_name
116
-
117
- assert_equal Time.at(ENV["SOURCE_DATE_EPOCH"].to_i).utc, package.build_time
118
- ensure
119
- ENV["SOURCE_DATE_EPOCH"] = epoch
120
- end
121
-
122
- def test_build_time_without_source_date_epoch
123
- epoch = ENV["SOURCE_DATE_EPOCH"]
124
- ENV["SOURCE_DATE_EPOCH"] = nil
125
-
126
- spec = Gem::Specification.new 'build', '1'
127
- spec.summary = 'build'
128
- spec.authors = 'build'
129
- spec.files = ['lib/code.rb']
130
- spec.rubygems_version = Gem::Version.new '0'
131
-
132
- package = Gem::Package.new spec.file_name
133
-
134
- assert_kind_of Time, package.build_time
135
-
136
- build_time = package.build_time.to_i
137
-
138
- assert_equal Gem.source_date_epoch.to_i, build_time
139
- ensure
140
- ENV["SOURCE_DATE_EPOCH"] = epoch
141
- end
142
-
143
- def test_add_files
144
- spec = Gem::Specification.new
145
- spec.files = %w[lib/code.rb lib/empty]
146
-
147
- FileUtils.mkdir_p 'lib/empty'
148
-
149
- File.open 'lib/code.rb', 'w' do |io|
150
- io.write '# lib/code.rb'
151
- end
152
-
153
- File.open 'lib/extra.rb', 'w' do |io|
154
- io.write '# lib/extra.rb'
155
- end
156
-
157
- package = Gem::Package.new 'bogus.gem'
158
- package.spec = spec
159
-
160
- tar = util_tar do |tar_io|
161
- package.add_files tar_io
162
- end
163
-
164
- tar.rewind
165
-
166
- files = []
167
-
168
- Gem::Package::TarReader.new tar do |tar_io|
169
- tar_io.each_entry do |entry|
170
- files << entry.full_name
171
- end
172
- end
173
-
174
- assert_equal %w[lib/code.rb], files
175
- end
176
-
177
- def test_add_files_symlink
178
- spec = Gem::Specification.new
179
- spec.files = %w[lib/code.rb lib/code_sym.rb lib/code_sym2.rb]
180
-
181
- FileUtils.mkdir_p 'lib'
182
-
183
- File.open 'lib/code.rb', 'w' do |io|
184
- io.write '# lib/code.rb'
185
- end
186
-
187
- # NOTE: 'code.rb' is correct, because it's relative to lib/code_sym.rb
188
- begin
189
- File.symlink('code.rb', 'lib/code_sym.rb')
190
- File.symlink('../lib/code.rb', 'lib/code_sym2.rb')
191
- rescue Errno::EACCES => e
192
- if win_platform?
193
- pend "symlink - must be admin with no UAC on Windows"
194
- else
195
- raise e
196
- end
197
- end
198
-
199
- package = Gem::Package.new 'bogus.gem'
200
- package.spec = spec
201
-
202
- tar = util_tar do |tar_io|
203
- package.add_files tar_io
204
- end
205
-
206
- tar.rewind
207
-
208
- files, symlinks = [], []
209
-
210
- Gem::Package::TarReader.new tar do |tar_io|
211
- tar_io.each_entry do |entry|
212
- if entry.symlink?
213
- symlinks << { entry.full_name => entry.header.linkname }
214
- else
215
- files << entry.full_name
216
- end
217
- end
218
- end
219
-
220
- assert_equal %w[lib/code.rb], files
221
- assert_equal [{ 'lib/code_sym.rb' => 'code.rb' }, { 'lib/code_sym2.rb' => '../lib/code.rb' }], symlinks
222
- end
223
-
224
- def test_build
225
- spec = Gem::Specification.new 'build', '1'
226
- spec.summary = 'build'
227
- spec.authors = 'build'
228
- spec.files = ['lib/code.rb']
229
- spec.rubygems_version = :junk
230
-
231
- FileUtils.mkdir 'lib'
232
-
233
- File.open 'lib/code.rb', 'w' do |io|
234
- io.write '# lib/code.rb'
235
- end
236
-
237
- package = Gem::Package.new spec.file_name
238
- package.spec = spec
239
-
240
- package.build
241
-
242
- assert_equal Gem::VERSION, spec.rubygems_version
243
- assert_path_exist spec.file_name
244
-
245
- reader = Gem::Package.new spec.file_name
246
- assert_equal spec, reader.spec
247
-
248
- assert_equal %w[metadata.gz data.tar.gz checksums.yaml.gz],
249
- reader.files
250
-
251
- assert_equal %w[lib/code.rb], reader.contents
252
- end
253
-
254
- def test_build_auto_signed
255
- pend 'openssl is missing' unless Gem::HAVE_OPENSSL
256
-
257
- FileUtils.mkdir_p File.join(Gem.user_home, '.gem')
258
-
259
- private_key_path = File.join Gem.user_home, '.gem', 'gem-private_key.pem'
260
- Gem::Security.write PRIVATE_KEY, private_key_path
261
-
262
- public_cert_path = File.join Gem.user_home, '.gem', 'gem-public_cert.pem'
263
- FileUtils.cp PUBLIC_CERT_PATH, public_cert_path
264
-
265
- spec = Gem::Specification.new 'build', '1'
266
- spec.summary = 'build'
267
- spec.authors = 'build'
268
- spec.files = ['lib/code.rb']
269
-
270
- FileUtils.mkdir 'lib'
271
-
272
- File.open 'lib/code.rb', 'w' do |io|
273
- io.write '# lib/code.rb'
274
- end
275
-
276
- package = Gem::Package.new spec.file_name
277
- package.spec = spec
278
-
279
- package.build
280
-
281
- assert_equal Gem::VERSION, spec.rubygems_version
282
- assert_path_exist spec.file_name
283
-
284
- reader = Gem::Package.new spec.file_name
285
- assert reader.verify
286
-
287
- assert_equal [PUBLIC_CERT.to_pem], reader.spec.cert_chain
288
-
289
- assert_equal %w[metadata.gz metadata.gz.sig
290
- data.tar.gz data.tar.gz.sig
291
- checksums.yaml.gz checksums.yaml.gz.sig],
292
- reader.files
293
-
294
- assert_equal %w[lib/code.rb], reader.contents
295
- end
296
-
297
- def test_build_auto_signed_encrypted_key
298
- pend 'openssl is missing' unless Gem::HAVE_OPENSSL
299
-
300
- FileUtils.mkdir_p File.join(Gem.user_home, '.gem')
301
-
302
- private_key_path = File.join Gem.user_home, '.gem', 'gem-private_key.pem'
303
- FileUtils.cp ENCRYPTED_PRIVATE_KEY_PATH, private_key_path
304
-
305
- public_cert_path = File.join Gem.user_home, '.gem', 'gem-public_cert.pem'
306
- Gem::Security.write PUBLIC_CERT, public_cert_path
307
-
308
- spec = Gem::Specification.new 'build', '1'
309
- spec.summary = 'build'
310
- spec.authors = 'build'
311
- spec.files = ['lib/code.rb']
312
-
313
- FileUtils.mkdir 'lib'
314
-
315
- File.open 'lib/code.rb', 'w' do |io|
316
- io.write '# lib/code.rb'
317
- end
318
-
319
- package = Gem::Package.new spec.file_name
320
- package.spec = spec
321
-
322
- package.build
323
-
324
- assert_equal Gem::VERSION, spec.rubygems_version
325
- assert_path_exist spec.file_name
326
-
327
- reader = Gem::Package.new spec.file_name
328
- assert reader.verify
329
-
330
- assert_equal [PUBLIC_CERT.to_pem], reader.spec.cert_chain
331
-
332
- assert_equal %w[metadata.gz metadata.gz.sig
333
- data.tar.gz data.tar.gz.sig
334
- checksums.yaml.gz checksums.yaml.gz.sig],
335
- reader.files
336
-
337
- assert_equal %w[lib/code.rb], reader.contents
338
- end
339
-
340
- def test_build_invalid
341
- spec = Gem::Specification.new 'build', '1'
342
-
343
- package = Gem::Package.new spec.file_name
344
- package.spec = spec
345
-
346
- e = assert_raise Gem::InvalidSpecificationException do
347
- package.build
348
- end
349
-
350
- assert_equal 'missing value for attribute summary', e.message
351
- end
352
-
353
- def test_build_invalid_arguments
354
- spec = Gem::Specification.new 'build', '1'
355
-
356
- package = Gem::Package.new spec.file_name
357
- package.spec = spec
358
-
359
- e = assert_raise ArgumentError do
360
- package.build true, true
361
- end
362
-
363
- assert_equal "skip_validation = true and strict_validation = true are incompatible", e.message
364
- end
365
-
366
- def test_build_signed
367
- pend 'openssl is missing' unless Gem::HAVE_OPENSSL
368
-
369
- spec = Gem::Specification.new 'build', '1'
370
- spec.summary = 'build'
371
- spec.authors = 'build'
372
- spec.files = ['lib/code.rb']
373
- spec.cert_chain = [PUBLIC_CERT.to_pem]
374
- spec.signing_key = PRIVATE_KEY
375
-
376
- FileUtils.mkdir 'lib'
377
-
378
- File.open 'lib/code.rb', 'w' do |io|
379
- io.write '# lib/code.rb'
380
- end
381
-
382
- package = Gem::Package.new spec.file_name
383
- package.spec = spec
384
-
385
- package.build
386
-
387
- assert_equal Gem::VERSION, spec.rubygems_version
388
- assert_path_exist spec.file_name
389
-
390
- reader = Gem::Package.new spec.file_name
391
- assert reader.verify
392
-
393
- assert_equal spec, reader.spec
394
-
395
- assert_equal %w[metadata.gz metadata.gz.sig
396
- data.tar.gz data.tar.gz.sig
397
- checksums.yaml.gz checksums.yaml.gz.sig],
398
- reader.files
399
-
400
- assert_equal %w[lib/code.rb], reader.contents
401
- end
402
-
403
- def test_build_signed_encrypted_key
404
- pend 'openssl is missing' unless Gem::HAVE_OPENSSL
405
-
406
- spec = Gem::Specification.new 'build', '1'
407
- spec.summary = 'build'
408
- spec.authors = 'build'
409
- spec.files = ['lib/code.rb']
410
- spec.cert_chain = [PUBLIC_CERT.to_pem]
411
- spec.signing_key = ENCRYPTED_PRIVATE_KEY
412
-
413
- FileUtils.mkdir 'lib'
414
-
415
- File.open 'lib/code.rb', 'w' do |io|
416
- io.write '# lib/code.rb'
417
- end
418
-
419
- package = Gem::Package.new spec.file_name
420
- package.spec = spec
421
-
422
- package.build
423
-
424
- assert_equal Gem::VERSION, spec.rubygems_version
425
- assert_path_exist spec.file_name
426
-
427
- reader = Gem::Package.new spec.file_name
428
- assert reader.verify
429
-
430
- assert_equal spec, reader.spec
431
-
432
- assert_equal %w[metadata.gz metadata.gz.sig
433
- data.tar.gz data.tar.gz.sig
434
- checksums.yaml.gz checksums.yaml.gz.sig],
435
- reader.files
436
-
437
- assert_equal %w[lib/code.rb], reader.contents
438
- end
439
-
440
- def test_raw_spec
441
- data_tgz = util_tar_gz {}
442
-
443
- gem = util_tar do |tar|
444
- tar.add_file 'data.tar.gz', 0644 do |io|
445
- io.write data_tgz.string
446
- end
447
-
448
- tar.add_file 'metadata.gz', 0644 do |io|
449
- Zlib::GzipWriter.wrap io do |gzio|
450
- gzio.write @spec.to_yaml
451
- end
452
- end
453
- end
454
-
455
- gem_path = "#{@destination}/test.gem"
456
-
457
- File.open gem_path, "wb" do |io|
458
- io.write gem.string
459
- end
460
-
461
- spec, metadata = Gem::Package.raw_spec(gem_path)
462
-
463
- assert_equal @spec, spec
464
- assert_match @spec.to_yaml, metadata.force_encoding("UTF-8")
465
- end
466
-
467
- def test_contents
468
- package = Gem::Package.new @gem
469
-
470
- assert_equal %w[lib/code.rb], package.contents
471
- end
472
-
473
- def test_extract_files
474
- package = Gem::Package.new @gem
475
-
476
- package.extract_files @destination
477
-
478
- extracted = File.join @destination, 'lib/code.rb'
479
- assert_path_exist extracted
480
-
481
- mask = 0100666 & (~File.umask)
482
-
483
- assert_equal mask.to_s(8), File.stat(extracted).mode.to_s(8) unless
484
- win_platform?
485
- end
486
-
487
- def test_extract_files_empty
488
- data_tgz = util_tar_gz {}
489
-
490
- gem = util_tar do |tar|
491
- tar.add_file 'data.tar.gz', 0644 do |io|
492
- io.write data_tgz.string
493
- end
494
-
495
- tar.add_file 'metadata.gz', 0644 do |io|
496
- Zlib::GzipWriter.wrap io do |gzio|
497
- gzio.write @spec.to_yaml
498
- end
499
- end
500
- end
501
-
502
- File.open 'empty.gem', 'wb' do |io|
503
- io.write gem.string
504
- end
505
-
506
- package = Gem::Package.new 'empty.gem'
507
-
508
- package.extract_files @destination
509
-
510
- assert_path_exist @destination
511
- end
512
-
513
- def test_extract_tar_gz_absolute
514
- package = Gem::Package.new @gem
515
-
516
- tgz_io = util_tar_gz do |tar|
517
- tar.add_file '/absolute.rb', 0644 do |io|
518
- io.write 'hi'
519
- end
520
- end
521
-
522
- e = assert_raise Gem::Package::PathError do
523
- package.extract_tar_gz tgz_io, @destination
524
- end
525
-
526
- assert_equal("installing into parent path /absolute.rb of " +
527
- "#{@destination} is not allowed", e.message)
528
- end
529
-
530
- def test_extract_tar_gz_symlink_relative_path
531
- package = Gem::Package.new @gem
532
-
533
- tgz_io = util_tar_gz do |tar|
534
- tar.add_file 'relative.rb', 0644 do |io|
535
- io.write 'hi'
536
- end
537
-
538
- tar.mkdir 'lib', 0755
539
- tar.add_symlink 'lib/foo.rb', '../relative.rb', 0644
540
- end
541
-
542
- begin
543
- package.extract_tar_gz tgz_io, @destination
544
- rescue Errno::EACCES => e
545
- if win_platform?
546
- pend "symlink - must be admin with no UAC on Windows"
547
- else
548
- raise e
549
- end
550
- end
551
-
552
- extracted = File.join @destination, 'lib/foo.rb'
553
- assert_path_exist extracted
554
- assert_equal '../relative.rb',
555
- File.readlink(extracted)
556
- assert_equal 'hi',
557
- File.read(extracted)
558
- end
559
-
560
- def test_extract_symlink_parent
561
- package = Gem::Package.new @gem
562
-
563
- tgz_io = util_tar_gz do |tar|
564
- tar.mkdir 'lib', 0755
565
- tar.add_symlink 'lib/link', '../..', 0644
566
- tar.add_file 'lib/link/outside.txt', 0644 do |io|
567
- io.write 'hi'
568
- end
569
- end
570
-
571
- # Extract into a subdirectory of @destination; if this test fails it writes
572
- # a file outside destination_subdir, but we want the file to remain inside
573
- # @destination so it will be cleaned up.
574
- destination_subdir = File.join @destination, 'subdir'
575
- FileUtils.mkdir_p destination_subdir
576
-
577
- expected_exceptions = win_platform? ? [Gem::Package::SymlinkError, Errno::EACCES] : [Gem::Package::SymlinkError]
578
-
579
- e = assert_raise(*expected_exceptions) do
580
- package.extract_tar_gz tgz_io, destination_subdir
581
- end
582
-
583
- pend "symlink - must be admin with no UAC on Windows" if Errno::EACCES === e
584
-
585
- assert_equal("installing symlink 'lib/link' pointing to parent path #{@destination} of " +
586
- "#{destination_subdir} is not allowed", e.message)
587
-
588
- assert_path_not_exist File.join(@destination, "outside.txt")
589
- assert_path_not_exist File.join(destination_subdir, "lib/link")
590
- end
591
-
592
- def test_extract_symlink_parent_doesnt_delete_user_dir
593
- package = Gem::Package.new @gem
594
-
595
- # Extract into a subdirectory of @destination; if this test fails it writes
596
- # a file outside destination_subdir, but we want the file to remain inside
597
- # @destination so it will be cleaned up.
598
- destination_subdir = File.join @destination, 'subdir'
599
- FileUtils.mkdir_p destination_subdir
600
-
601
- destination_user_dir = File.join @destination, 'user'
602
- destination_user_subdir = File.join destination_user_dir, 'dir'
603
- FileUtils.mkdir_p destination_user_subdir
604
-
605
- pend "TMPDIR seems too long to add it as symlink into tar" if destination_user_dir.size > 90
606
-
607
- tgz_io = util_tar_gz do |tar|
608
- tar.add_symlink 'link', destination_user_dir, 16877
609
- tar.add_symlink 'link/dir', '.', 16877
610
- end
611
-
612
- expected_exceptions = win_platform? ? [Gem::Package::SymlinkError, Errno::EACCES] : [Gem::Package::SymlinkError]
613
-
614
- e = assert_raise(*expected_exceptions) do
615
- package.extract_tar_gz tgz_io, destination_subdir
616
- end
617
-
618
- pend "symlink - must be admin with no UAC on Windows" if Errno::EACCES === e
619
-
620
- assert_equal("installing symlink 'link' pointing to parent path #{destination_user_dir} of " +
621
- "#{destination_subdir} is not allowed", e.message)
622
-
623
- assert_path_exist destination_user_subdir
624
- assert_path_not_exist File.join(destination_subdir, "link/dir")
625
- assert_path_not_exist File.join(destination_subdir, "link")
626
- end
627
-
628
- def test_extract_tar_gz_directory
629
- package = Gem::Package.new @gem
630
-
631
- tgz_io = util_tar_gz do |tar|
632
- tar.mkdir 'lib', 0755
633
- tar.add_file 'lib/foo.rb', 0644 do |io|
634
- io.write 'hi'
635
- end
636
- tar.mkdir 'lib/foo', 0755
637
- end
638
-
639
- package.extract_tar_gz tgz_io, @destination
640
-
641
- extracted = File.join @destination, 'lib/foo.rb'
642
- assert_path_exist extracted
643
-
644
- extracted = File.join @destination, 'lib/foo'
645
- assert_path_exist extracted
646
- end
647
-
648
- def test_extract_tar_gz_dot_slash
649
- package = Gem::Package.new @gem
650
-
651
- tgz_io = util_tar_gz do |tar|
652
- tar.add_file './dot_slash.rb', 0644 do |io|
653
- io.write 'hi'
654
- end
655
- end
656
-
657
- package.extract_tar_gz tgz_io, @destination
658
-
659
- extracted = File.join @destination, 'dot_slash.rb'
660
- assert_path_exist extracted
661
- end
662
-
663
- def test_extract_tar_gz_dot_file
664
- package = Gem::Package.new @gem
665
-
666
- tgz_io = util_tar_gz do |tar|
667
- tar.add_file '.dot_file.rb', 0644 do |io|
668
- io.write 'hi'
669
- end
670
- end
671
-
672
- package.extract_tar_gz tgz_io, @destination
673
-
674
- extracted = File.join @destination, '.dot_file.rb'
675
- assert_path_exist extracted
676
- end
677
-
678
- if Gem.win_platform?
679
- def test_extract_tar_gz_case_insensitive
680
- package = Gem::Package.new @gem
681
-
682
- tgz_io = util_tar_gz do |tar|
683
- tar.add_file 'foo/file.rb', 0644 do |io|
684
- io.write 'hi'
685
- end
686
- end
687
-
688
- package.extract_tar_gz tgz_io, @destination.upcase
689
-
690
- extracted = File.join @destination, 'foo/file.rb'
691
- assert_path_exist extracted
692
- end
693
- end
694
-
695
- def test_install_location
696
- package = Gem::Package.new @gem
697
-
698
- file = 'file.rb'.dup
699
- file.taint if RUBY_VERSION < '2.7'
700
-
701
- destination = package.install_location file, @destination
702
-
703
- assert_equal File.join(@destination, 'file.rb'), destination
704
- refute destination.tainted? if RUBY_VERSION < '2.7'
705
- end
706
-
707
- def test_install_location_absolute
708
- package = Gem::Package.new @gem
709
-
710
- e = assert_raise Gem::Package::PathError do
711
- package.install_location '/absolute.rb', @destination
712
- end
713
-
714
- assert_equal("installing into parent path /absolute.rb of " +
715
- "#{@destination} is not allowed", e.message)
716
- end
717
-
718
- def test_install_location_dots
719
- package = Gem::Package.new @gem
720
-
721
- file = 'file.rb'
722
-
723
- destination = File.join @destination, 'foo', '..', 'bar'
724
-
725
- FileUtils.mkdir_p File.join @destination, 'foo'
726
- FileUtils.mkdir_p File.expand_path destination
727
-
728
- destination = package.install_location file, destination
729
-
730
- # this test only fails on ruby missing File.realpath
731
- assert_equal File.join(@destination, 'bar', 'file.rb'), destination
732
- end
733
-
734
- def test_install_location_extra_slash
735
- package = Gem::Package.new @gem
736
-
737
- file = 'foo//file.rb'.dup
738
- file.taint if RUBY_VERSION < '2.7'
739
-
740
- destination = package.install_location file, @destination
741
-
742
- assert_equal File.join(@destination, 'foo', 'file.rb'), destination
743
- refute destination.tainted? if RUBY_VERSION < '2.7'
744
- end
745
-
746
- def test_install_location_relative
747
- package = Gem::Package.new @gem
748
-
749
- e = assert_raise Gem::Package::PathError do
750
- package.install_location '../relative.rb', @destination
751
- end
752
-
753
- parent = File.expand_path File.join @destination, "../relative.rb"
754
-
755
- assert_equal("installing into parent path #{parent} of " +
756
- "#{@destination} is not allowed", e.message)
757
- end
758
-
759
- def test_install_location_suffix
760
- package = Gem::Package.new @gem
761
-
762
- filename = "../#{File.basename(@destination)}suffix.rb"
763
-
764
- e = assert_raise Gem::Package::PathError do
765
- package.install_location filename, @destination
766
- end
767
-
768
- parent = File.expand_path File.join @destination, filename
769
-
770
- assert_equal("installing into parent path #{parent} of " +
771
- "#{@destination} is not allowed", e.message)
772
- end
773
-
774
- def test_load_spec
775
- entry = StringIO.new Gem::Util.gzip @spec.to_yaml
776
- def entry.full_name() 'metadata.gz' end
777
-
778
- package = Gem::Package.new 'nonexistent.gem'
779
-
780
- spec = package.load_spec entry
781
-
782
- assert_equal @spec, spec
783
- end
784
-
785
- def test_verify
786
- package = Gem::Package.new @gem
787
-
788
- package.verify
789
-
790
- assert_equal @spec, package.spec
791
- assert_equal %w[checksums.yaml.gz data.tar.gz metadata.gz],
792
- package.files.sort
793
- end
794
-
795
- def test_verify_checksum_bad
796
- data_tgz = util_tar_gz do |tar|
797
- tar.add_file 'lib/code.rb', 0444 do |io|
798
- io.write '# lib/code.rb'
799
- end
800
- end
801
-
802
- data_tgz = data_tgz.string
803
-
804
- gem = util_tar do |tar|
805
- metadata_gz = Gem::Util.gzip @spec.to_yaml
806
-
807
- tar.add_file 'metadata.gz', 0444 do |io|
808
- io.write metadata_gz
809
- end
810
-
811
- tar.add_file 'data.tar.gz', 0444 do |io|
812
- io.write data_tgz
813
- end
814
-
815
- bogus_checksums = {
816
- 'SHA1' => {
817
- 'data.tar.gz' => 'bogus',
818
- 'metadata.gz' => 'bogus',
819
- },
820
- }
821
- tar.add_file 'checksums.yaml.gz', 0444 do |io|
822
- Zlib::GzipWriter.wrap io do |gz_io|
823
- gz_io.write Psych.dump bogus_checksums
824
- end
825
- end
826
- end
827
-
828
- File.open 'mismatch.gem', 'wb' do |io|
829
- io.write gem.string
830
- end
831
-
832
- package = Gem::Package.new 'mismatch.gem'
833
-
834
- e = assert_raise Gem::Package::FormatError do
835
- package.verify
836
- end
837
-
838
- assert_equal 'SHA1 checksum mismatch for data.tar.gz in mismatch.gem',
839
- e.message
840
- end
841
-
842
- def test_verify_checksum_missing
843
- data_tgz = util_tar_gz do |tar|
844
- tar.add_file 'lib/code.rb', 0444 do |io|
845
- io.write '# lib/code.rb'
846
- end
847
- end
848
-
849
- data_tgz = data_tgz.string
850
-
851
- gem = util_tar do |tar|
852
- metadata_gz = Gem::Util.gzip @spec.to_yaml
853
-
854
- tar.add_file 'metadata.gz', 0444 do |io|
855
- io.write metadata_gz
856
- end
857
-
858
- digest = OpenSSL::Digest::SHA1.new
859
- digest << metadata_gz
860
-
861
- checksums = {
862
- 'SHA1' => {
863
- 'metadata.gz' => digest.hexdigest,
864
- },
865
- }
866
-
867
- tar.add_file 'checksums.yaml.gz', 0444 do |io|
868
- Zlib::GzipWriter.wrap io do |gz_io|
869
- gz_io.write Psych.dump checksums
870
- end
871
- end
872
-
873
- tar.add_file 'data.tar.gz', 0444 do |io|
874
- io.write data_tgz
875
- end
876
- end
877
-
878
- File.open 'data_checksum_missing.gem', 'wb' do |io|
879
- io.write gem.string
880
- end
881
-
882
- package = Gem::Package.new 'data_checksum_missing.gem'
883
-
884
- assert package.verify
885
- end
886
-
887
- def test_verify_corrupt
888
- pend "jruby strips the null byte and does not think it's corrupt" if Gem.java_platform?
889
- tf = Tempfile.open 'corrupt' do |io|
890
- data = Gem::Util.gzip 'a' * 10
891
- io.write \
892
- tar_file_header('metadata.gz', "\000x", 0644, data.length, Time.now)
893
- io.write data
894
- io.rewind
895
-
896
- package = Gem::Package.new io.path
897
-
898
- e = assert_raise Gem::Package::FormatError do
899
- package.verify
900
- end
901
-
902
- assert_equal "tar is corrupt, name contains null byte in #{io.path}",
903
- e.message
904
- io
905
- end
906
- tf.close!
907
- end
908
-
909
- def test_verify_empty
910
- FileUtils.touch 'empty.gem'
911
-
912
- package = Gem::Package.new 'empty.gem'
913
-
914
- e = assert_raise Gem::Package::FormatError do
915
- package.verify
916
- end
917
-
918
- assert_equal 'package metadata is missing in empty.gem', e.message
919
- end
920
-
921
- def test_verify_nonexistent
922
- package = Gem::Package.new 'nonexistent.gem'
923
-
924
- e = assert_raise Gem::Package::FormatError do
925
- package.verify
926
- end
927
-
928
- assert_match %r{^No such file or directory}, e.message
929
- assert_match %r{nonexistent.gem$}, e.message
930
- end
931
-
932
- def test_verify_duplicate_file
933
- FileUtils.mkdir_p 'lib'
934
- FileUtils.touch 'lib/code.rb'
935
-
936
- build = Gem::Package.new @gem
937
- build.spec = @spec
938
- build.setup_signer
939
- File.open @gem, 'wb' do |gem_io|
940
- Gem::Package::TarWriter.new gem_io do |gem|
941
- build.add_metadata gem
942
- build.add_contents gem
943
-
944
- gem.add_file_simple 'a.sig', 0444, 0
945
- gem.add_file_simple 'a.sig', 0444, 0
946
- end
947
- end
948
-
949
- package = Gem::Package.new @gem
950
-
951
- e = assert_raise Gem::Security::Exception do
952
- package.verify
953
- end
954
-
955
- assert_equal 'duplicate files in the package: ("a.sig")', e.message
956
- end
957
-
958
- def test_verify_security_policy
959
- pend 'openssl is missing' unless Gem::HAVE_OPENSSL
960
-
961
- package = Gem::Package.new @gem
962
- package.security_policy = Gem::Security::HighSecurity
963
-
964
- e = assert_raise Gem::Security::Exception do
965
- package.verify
966
- end
967
-
968
- assert_equal 'unsigned gems are not allowed by the High Security policy',
969
- e.message
970
-
971
- refute package.instance_variable_get(:@spec), '@spec must not be loaded'
972
- assert_empty package.instance_variable_get(:@files), '@files must empty'
973
- end
974
-
975
- def test_verify_security_policy_low_security
976
- pend 'openssl is missing' unless Gem::HAVE_OPENSSL
977
-
978
- @spec.cert_chain = [PUBLIC_CERT.to_pem]
979
- @spec.signing_key = PRIVATE_KEY
980
-
981
- FileUtils.mkdir_p 'lib'
982
- FileUtils.touch 'lib/code.rb'
983
-
984
- build = Gem::Package.new @gem
985
- build.spec = @spec
986
-
987
- build.build
988
-
989
- package = Gem::Package.new @gem
990
- package.security_policy = Gem::Security::LowSecurity
991
-
992
- assert package.verify
993
- end
994
-
995
- def test_verify_security_policy_checksum_missing
996
- pend 'openssl is missing' unless Gem::HAVE_OPENSSL
997
-
998
- @spec.cert_chain = [PUBLIC_CERT.to_pem]
999
- @spec.signing_key = PRIVATE_KEY
1000
-
1001
- build = Gem::Package.new @gem
1002
- build.spec = @spec
1003
- build.setup_signer
1004
-
1005
- FileUtils.mkdir 'lib'
1006
- FileUtils.touch 'lib/code.rb'
1007
-
1008
- File.open @gem, 'wb' do |gem_io|
1009
- Gem::Package::TarWriter.new gem_io do |gem|
1010
- build.add_metadata gem
1011
- build.add_contents gem
1012
-
1013
- # write bogus data.tar.gz to foil signature
1014
- bogus_data = Gem::Util.gzip 'hello'
1015
- fake_signer = Class.new do
1016
- def digest_name; 'SHA512'; end
1017
- def digest_algorithm; OpenSSL::Digest(:SHA512).new; end
1018
- def key; 'key'; end
1019
- def sign(*); 'fake_sig'; end
1020
- end
1021
- gem.add_file_signed 'data2.tar.gz', 0444, fake_signer.new do |io|
1022
- io.write bogus_data
1023
- end
1024
-
1025
- # pre rubygems 2.0 gems do not add checksums
1026
- end
1027
- end
1028
-
1029
- Gem::Security.trust_dir.trust_cert PUBLIC_CERT
1030
-
1031
- package = Gem::Package.new @gem
1032
- package.security_policy = Gem::Security::HighSecurity
1033
-
1034
- e = assert_raise Gem::Security::Exception do
1035
- package.verify
1036
- end
1037
-
1038
- assert_equal 'invalid signature', e.message
1039
-
1040
- refute package.instance_variable_get(:@spec), '@spec must not be loaded'
1041
- assert_empty package.instance_variable_get(:@files), '@files must empty'
1042
- end
1043
-
1044
- def test_verify_truncate
1045
- File.open 'bad.gem', 'wb' do |io|
1046
- io.write File.read(@gem, 1024) # don't care about newlines
1047
- end
1048
-
1049
- package = Gem::Package.new 'bad.gem'
1050
-
1051
- e = assert_raise Gem::Package::FormatError do
1052
- package.verify
1053
- end
1054
-
1055
- assert_equal 'package content (data.tar.gz) is missing in bad.gem',
1056
- e.message
1057
- end
1058
-
1059
- # end #verify tests
1060
-
1061
- def test_verify_entry
1062
- entry = Object.new
1063
- def entry.full_name() raise ArgumentError, 'whatever' end
1064
-
1065
- package = Gem::Package.new @gem
1066
-
1067
- _, err = use_ui @ui do
1068
- e = nil
1069
-
1070
- out_err = capture_output do
1071
- e = assert_raise ArgumentError do
1072
- package.verify_entry entry
1073
- end
1074
- end
1075
-
1076
- assert_equal "whatever", e.message
1077
- assert_equal "full_name", e.backtrace_locations.first.label
1078
-
1079
- out_err
1080
- end
1081
-
1082
- assert_equal "Exception while verifying #{@gem}\n", err
1083
-
1084
- valid_metadata = ["metadata", "metadata.gz"]
1085
- valid_metadata.each do |vm|
1086
- $spec_loaded = false
1087
- $good_name = vm
1088
-
1089
- entry = Object.new
1090
- def entry.full_name() $good_name end
1091
-
1092
- package = Gem::Package.new(@gem)
1093
- package.instance_variable_set(:@files, [])
1094
- def package.load_spec(entry) $spec_loaded = true end
1095
-
1096
- package.verify_entry(entry)
1097
-
1098
- assert $spec_loaded
1099
- end
1100
-
1101
- invalid_metadata = ["metadataxgz", "foobar\nmetadata", "metadata\nfoobar"]
1102
- invalid_metadata.each do |vm|
1103
- $spec_loaded = false
1104
- $bad_name = vm
1105
-
1106
- entry = Object.new
1107
- def entry.full_name() $bad_name end
1108
-
1109
- package = Gem::Package.new(@gem)
1110
- package.instance_variable_set(:@files, [])
1111
- def package.load_spec(entry) $spec_loaded = true end
1112
-
1113
- package.verify_entry(entry)
1114
-
1115
- refute $spec_loaded
1116
- end
1117
- end
1118
-
1119
- def test_spec
1120
- package = Gem::Package.new @gem
1121
-
1122
- assert_equal @spec, package.spec
1123
- end
1124
-
1125
- def test_gem_attr
1126
- package = Gem::Package.new(@gem)
1127
- assert_equal(@gem, package.gem.path)
1128
- end
1129
-
1130
- def test_spec_from_io
1131
- # This functionality is used by rubygems.org to extract spec data from an
1132
- # uploaded gem before it is written to storage.
1133
- io = StringIO.new Gem.read_binary @gem
1134
- package = Gem::Package.new io
1135
-
1136
- assert_equal @spec, package.spec
1137
- end
1138
-
1139
- def test_spec_from_io_raises_gem_error_for_io_not_at_start
1140
- io = StringIO.new Gem.read_binary @gem
1141
- io.read(1)
1142
- assert_raise(Gem::Package::Error) do
1143
- Gem::Package.new io
1144
- end
1145
- end
1146
-
1147
- def test_contents_from_io
1148
- io = StringIO.new Gem.read_binary @gem
1149
- package = Gem::Package.new io
1150
-
1151
- assert_equal %w[lib/code.rb], package.contents
1152
- end
1153
-
1154
- def util_tar
1155
- tar_io = StringIO.new
1156
-
1157
- Gem::Package::TarWriter.new tar_io do |tar|
1158
- yield tar
1159
- end
1160
-
1161
- tar_io.rewind
1162
-
1163
- tar_io
1164
- end
1165
-
1166
- def util_tar_gz(&block)
1167
- tar_io = util_tar(&block)
1168
-
1169
- tgz_io = StringIO.new
1170
-
1171
- # can't wrap TarWriter because it seeks
1172
- Zlib::GzipWriter.wrap tgz_io do |io|
1173
- io.write tar_io.string
1174
- end
1175
-
1176
- StringIO.new tgz_io.string
1177
- end
1178
- end