rubygems-update 3.2.2 → 3.2.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/{History.txt → CHANGELOG.md} +482 -424
  3. data/Manifest.txt +30 -27
  4. data/Rakefile +11 -15
  5. data/bundler/CHANGELOG.md +67 -2
  6. data/bundler/bundler.gemspec +1 -1
  7. data/bundler/lib/bundler.rb +3 -7
  8. data/bundler/lib/bundler/build_metadata.rb +2 -2
  9. data/bundler/lib/bundler/cli.rb +2 -5
  10. data/bundler/lib/bundler/cli/cache.rb +1 -0
  11. data/bundler/lib/bundler/cli/gem.rb +2 -0
  12. data/bundler/lib/bundler/cli/update.rb +1 -1
  13. data/bundler/lib/bundler/compact_index_client/cache.rb +5 -13
  14. data/bundler/lib/bundler/compact_index_client/gem_parser.rb +28 -0
  15. data/bundler/lib/bundler/compact_index_client/updater.rb +0 -8
  16. data/bundler/lib/bundler/definition.rb +29 -21
  17. data/bundler/lib/bundler/dep_proxy.rb +15 -8
  18. data/bundler/lib/bundler/feature_flag.rb +0 -1
  19. data/bundler/lib/bundler/fetcher.rb +0 -1
  20. data/bundler/lib/bundler/gem_helper.rb +9 -7
  21. data/bundler/lib/bundler/gem_helpers.rb +30 -24
  22. data/bundler/lib/bundler/gem_version_promoter.rb +2 -2
  23. data/bundler/lib/bundler/installer.rb +0 -17
  24. data/bundler/lib/bundler/installer/standalone.rb +14 -0
  25. data/bundler/lib/bundler/lazy_specification.rb +10 -11
  26. data/bundler/{man → lib/bundler/man}/bundle-add.1 +1 -1
  27. data/bundler/{man → lib/bundler/man}/bundle-binstubs.1 +1 -1
  28. data/bundler/{man → lib/bundler/man}/bundle-cache.1 +1 -1
  29. data/bundler/{man → lib/bundler/man}/bundle-check.1 +1 -1
  30. data/bundler/{man → lib/bundler/man}/bundle-clean.1 +1 -1
  31. data/bundler/{man → lib/bundler/man}/bundle-config.1 +4 -4
  32. data/bundler/lib/bundler/man/bundle-config.1.ronn +3 -3
  33. data/bundler/{man → lib/bundler/man}/bundle-doctor.1 +1 -1
  34. data/bundler/{man → lib/bundler/man}/bundle-exec.1 +1 -1
  35. data/bundler/{man → lib/bundler/man}/bundle-gem.1 +1 -1
  36. data/bundler/{man → lib/bundler/man}/bundle-info.1 +1 -1
  37. data/bundler/{man → lib/bundler/man}/bundle-init.1 +1 -1
  38. data/bundler/{man → lib/bundler/man}/bundle-inject.1 +1 -1
  39. data/bundler/{man → lib/bundler/man}/bundle-install.1 +1 -1
  40. data/bundler/{man → lib/bundler/man}/bundle-list.1 +1 -1
  41. data/bundler/{man → lib/bundler/man}/bundle-lock.1 +1 -1
  42. data/bundler/{man → lib/bundler/man}/bundle-open.1 +1 -1
  43. data/bundler/{man → lib/bundler/man}/bundle-outdated.1 +1 -1
  44. data/bundler/{man → lib/bundler/man}/bundle-platform.1 +1 -1
  45. data/bundler/{man → lib/bundler/man}/bundle-pristine.1 +1 -1
  46. data/bundler/{man → lib/bundler/man}/bundle-remove.1 +1 -1
  47. data/bundler/{man → lib/bundler/man}/bundle-show.1 +1 -1
  48. data/bundler/{man → lib/bundler/man}/bundle-update.1 +1 -1
  49. data/bundler/{man → lib/bundler/man}/bundle-viz.1 +1 -1
  50. data/bundler/{man → lib/bundler/man}/bundle.1 +1 -1
  51. data/bundler/{man → lib/bundler/man}/gemfile.5 +1 -1
  52. data/bundler/{man → lib/bundler/man}/index.txt +0 -0
  53. data/bundler/lib/bundler/resolver.rb +36 -16
  54. data/bundler/lib/bundler/resolver/spec_group.rb +18 -23
  55. data/bundler/lib/bundler/rubygems_ext.rb +16 -0
  56. data/bundler/lib/bundler/rubygems_integration.rb +0 -5
  57. data/bundler/lib/bundler/settings.rb +1 -1
  58. data/bundler/lib/bundler/source/git.rb +19 -17
  59. data/bundler/lib/bundler/source/git/git_proxy.rb +54 -49
  60. data/bundler/lib/bundler/source/path/installer.rb +2 -0
  61. data/bundler/lib/bundler/source/rubygems.rb +10 -2
  62. data/bundler/lib/bundler/spec_set.rb +6 -9
  63. data/bundler/lib/bundler/templates/newgem/Gemfile.tt +1 -1
  64. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +1 -1
  65. data/bundler/lib/bundler/templates/newgem/rubocop.yml.tt +3 -0
  66. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +7 -0
  67. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +1 -1
  68. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +11 -0
  69. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +11 -7
  70. data/bundler/lib/bundler/version.rb +1 -1
  71. data/lib/rubygems.rb +2 -2
  72. data/lib/rubygems/commands/setup_command.rb +16 -62
  73. data/lib/rubygems/dependency_installer.rb +1 -0
  74. data/lib/rubygems/ext/builder.rb +5 -4
  75. data/lib/rubygems/ext/cmake_builder.rb +1 -2
  76. data/lib/rubygems/ext/configure_builder.rb +1 -2
  77. data/lib/rubygems/gemcutter_utilities.rb +2 -2
  78. data/lib/rubygems/installer.rb +0 -23
  79. data/lib/rubygems/installer_uninstaller_utils.rb +6 -1
  80. data/lib/rubygems/platform.rb +0 -4
  81. data/lib/rubygems/remote_fetcher.rb +4 -2
  82. data/lib/rubygems/request_set.rb +2 -13
  83. data/lib/rubygems/requirement.rb +1 -1
  84. data/lib/rubygems/resolver.rb +6 -1
  85. data/lib/rubygems/resolver/api_set.rb +28 -19
  86. data/lib/rubygems/resolver/api_set/gem_parser.rb +20 -0
  87. data/lib/rubygems/resolver/api_specification.rb +4 -3
  88. data/lib/rubygems/resolver/best_set.rb +2 -2
  89. data/lib/rubygems/resolver/index_specification.rb +18 -0
  90. data/lib/rubygems/resolver/installer_set.rb +57 -7
  91. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/vertex.rb +1 -1
  92. data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +1 -1
  93. data/lib/rubygems/resolver/spec_specification.rb +14 -0
  94. data/lib/rubygems/resolver/specification.rb +12 -0
  95. data/lib/rubygems/source.rb +10 -6
  96. data/lib/rubygems/specification.rb +18 -14
  97. data/lib/rubygems/test_case.rb +17 -4
  98. data/rubygems-update.gemspec +2 -2
  99. data/test/rubygems/data/null-required-rubygems-version.gemspec.rz +0 -0
  100. data/test/rubygems/test_gem.rb +5 -0
  101. data/test/rubygems/test_gem_commands_install_command.rb +131 -0
  102. data/test/rubygems/test_gem_commands_setup_command.rb +21 -37
  103. data/test/rubygems/test_gem_dependency_installer.rb +27 -47
  104. data/test/rubygems/test_gem_ext_builder.rb +30 -6
  105. data/test/rubygems/test_gem_ext_cmake_builder.rb +2 -4
  106. data/test/rubygems/test_gem_ext_configure_builder.rb +2 -2
  107. data/test/rubygems/test_gem_installer.rb +8 -60
  108. data/test/rubygems/test_gem_platform.rb +8 -0
  109. data/test/rubygems/test_gem_remote_fetcher.rb +1 -1
  110. data/test/rubygems/test_gem_requirement.rb +34 -0
  111. data/test/rubygems/test_gem_resolver_api_set.rb +26 -52
  112. data/test/rubygems/test_gem_resolver_api_specification.rb +3 -3
  113. data/test/rubygems/test_gem_resolver_best_set.rb +26 -3
  114. data/test/rubygems/test_gem_source.rb +2 -2
  115. data/test/rubygems/test_gem_source_subpath_problem.rb +2 -2
  116. data/test/rubygems/test_gem_specification.rb +9 -3
  117. data/test/rubygems/test_gem_stream_ui.rb +1 -1
  118. metadata +34 -55
@@ -329,11 +329,11 @@ module Bundler::Molinillo
329
329
 
330
330
  # Look for past conflicts that could be unwound to affect the
331
331
  # requirement tree for the current conflict
332
+ all_reqs = last_detail_for_current_unwind.all_requirements
333
+ all_reqs_size = all_reqs.size
332
334
  relevant_unused_unwinds = unused_unwind_options.select do |alternative|
333
- intersecting_requirements =
334
- last_detail_for_current_unwind.all_requirements &
335
- alternative.requirements_unwound_to_instead
336
- next if intersecting_requirements.empty?
335
+ diff_reqs = all_reqs - alternative.requirements_unwound_to_instead
336
+ next if diff_reqs.size == all_reqs_size
337
337
  # Find the highest index unwind whilst looping through
338
338
  current_detail = alternative if alternative > current_detail
339
339
  alternative
@@ -344,8 +344,12 @@ module Bundler::Molinillo
344
344
  state.unused_unwind_options += unwind_details.reject { |detail| detail.state_index == -1 }
345
345
 
346
346
  # Update the requirements_unwound_to_instead on any relevant unused unwinds
347
- relevant_unused_unwinds.each { |d| d.requirements_unwound_to_instead << current_detail.state_requirement }
348
- unwind_details.each { |d| d.requirements_unwound_to_instead << current_detail.state_requirement }
347
+ relevant_unused_unwinds.each do |d|
348
+ (d.requirements_unwound_to_instead << current_detail.state_requirement).uniq!
349
+ end
350
+ unwind_details.each do |d|
351
+ (d.requirements_unwound_to_instead << current_detail.state_requirement).uniq!
352
+ end
349
353
 
350
354
  current_detail
351
355
  end
@@ -803,7 +807,7 @@ module Bundler::Molinillo
803
807
 
804
808
  possibilities.reverse_each do |possibility|
805
809
  dependencies = dependencies_for(possibility)
806
- if current_possibility_set && current_possibility_set.dependencies == dependencies
810
+ if current_possibility_set && dependencies_equal?(current_possibility_set.dependencies, dependencies)
807
811
  current_possibility_set.possibilities.unshift(possibility)
808
812
  else
809
813
  possibility_sets.unshift(PossibilitySet.new(dependencies, [possibility]))
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: false
2
2
 
3
3
  module Bundler
4
- VERSION = "2.2.2".freeze
4
+ VERSION = "2.2.7".freeze
5
5
 
6
6
  def self.bundler_major_version
7
7
  @bundler_major_version ||= VERSION.split(".").first.to_i
@@ -8,7 +8,7 @@
8
8
  require 'rbconfig'
9
9
 
10
10
  module Gem
11
- VERSION = "3.2.2".freeze
11
+ VERSION = "3.2.7".freeze
12
12
  end
13
13
 
14
14
  # Must be first since it unloads the prelude from 1.9.2
@@ -469,7 +469,7 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
469
469
  next if File.exist? subdir
470
470
  begin
471
471
  FileUtils.mkdir_p subdir, **options
472
- rescue Errno::EACCES
472
+ rescue SystemCallError
473
473
  end
474
474
  end
475
475
  ensure
@@ -6,8 +6,8 @@ require 'rubygems/command'
6
6
  # RubyGems checkout or tarball.
7
7
 
8
8
  class Gem::Commands::SetupCommand < Gem::Command
9
- HISTORY_HEADER = /^===\s*[\d.a-zA-Z]+\s*\/\s*\d{4}-\d{2}-\d{2}\s*$/.freeze
10
- VERSION_MATCHER = /^===\s*([\d.a-zA-Z]+)\s*\/\s*\d{4}-\d{2}-\d{2}\s*$/.freeze
9
+ HISTORY_HEADER = /^#\s*[\d.a-zA-Z]+\s*\/\s*\d{4}-\d{2}-\d{2}\s*$/.freeze
10
+ VERSION_MATCHER = /^#\s*([\d.a-zA-Z]+)\s*\/\s*\d{4}-\d{2}-\d{2}\s*$/.freeze
11
11
 
12
12
  ENV_PATHS = %w[/usr/bin/env /bin/env].freeze
13
13
 
@@ -167,19 +167,18 @@ By default, this RubyGems will install gem as:
167
167
  extend MakeDirs
168
168
 
169
169
  lib_dir, bin_dir = make_destination_dirs install_destdir
170
- man_dir = make_man_dir install_destdir
170
+ man_dir = generate_default_man_dir install_destdir
171
171
 
172
172
  install_lib lib_dir
173
173
 
174
- install_man man_dir
175
-
176
174
  install_executables bin_dir
177
175
 
178
176
  remove_old_bin_files bin_dir
179
177
 
180
178
  remove_old_lib_files lib_dir
181
179
 
182
- remove_old_man_files man_dir
180
+ # Can be removed one we drop support for bundler 2.2.3 (the last version installing man files to man_dir)
181
+ remove_old_man_files man_dir if man_dir && File.exist?(man_dir)
183
182
 
184
183
  install_default_bundler_gem bin_dir
185
184
 
@@ -330,21 +329,6 @@ By default, this RubyGems will install gem as:
330
329
  end
331
330
  end
332
331
 
333
- def install_man(man_dir)
334
- mans = { 'Bundler' => 'bundler/man' }
335
- mans.each do |tool, path|
336
- say "Installing #{tool} manpages" if @verbose
337
-
338
- bundler_man1_files = bundler_man1_files_in(path)
339
- bundler_man5_files = bundler_man5_files_in(path)
340
-
341
- Dir.chdir path do
342
- install_file_list(bundler_man1_files, "#{man_dir}/man1")
343
- install_file_list(bundler_man5_files, "#{man_dir}/man5")
344
- end
345
- end
346
- end
347
-
348
332
  def install_rdoc
349
333
  gem_doc_dir = File.join Gem.dir, 'doc'
350
334
  rubygems_name = "rubygems-#{Gem::VERSION}"
@@ -391,9 +375,7 @@ By default, this RubyGems will install gem as:
391
375
  specs_dir = File.join(options[:destdir], specs_dir) unless Gem.win_platform?
392
376
  mkdir_p specs_dir, :mode => 0755
393
377
 
394
- bundler_spec = Gem::Specification.load("bundler/bundler.gemspec")
395
- bundler_spec.files = Dir.chdir("bundler") { Dir["{*.md,{lib,exe,man}/**/*}"] }
396
- bundler_spec.executables -= %w[bundler bundle_ruby]
378
+ bundler_spec = Dir.chdir("bundler") { Gem::Specification.load("bundler.gemspec") }
397
379
 
398
380
  # Remove bundler-*.gemspec in default specification directory.
399
381
  Dir.entries(specs_dir).
@@ -455,19 +437,12 @@ By default, this RubyGems will install gem as:
455
437
  return lib_dir, bin_dir
456
438
  end
457
439
 
458
- def make_man_dir(install_destdir)
459
- man_dir = generate_default_man_dir(install_destdir)
460
-
461
- mkdir_p man_dir, :mode => 0755
462
-
463
- return man_dir
464
- end
465
-
466
440
  def generate_default_man_dir(install_destdir)
467
441
  prefix = options[:prefix]
468
442
 
469
443
  if prefix.empty?
470
444
  man_dir = RbConfig::CONFIG['mandir']
445
+ return unless man_dir
471
446
  else
472
447
  man_dir = File.join prefix, 'man'
473
448
  end
@@ -518,20 +493,6 @@ By default, this RubyGems will install gem as:
518
493
  end
519
494
  end
520
495
 
521
- # for installation of bundler as default gems
522
- def bundler_man1_files_in(dir)
523
- Dir.chdir dir do
524
- Dir['bundle*.1']
525
- end
526
- end
527
-
528
- # for installation of bundler as default gems
529
- def bundler_man5_files_in(dir)
530
- Dir.chdir dir do
531
- Dir['gemfile.5']
532
- end
533
- end
534
-
535
496
  def remove_old_bin_files(bin_dir)
536
497
  old_bin_files = {
537
498
  'gem_mirror' => 'gem mirror',
@@ -585,33 +546,26 @@ abort "#{deprecation_message}"
585
546
  end
586
547
  end
587
548
 
588
- def remove_old_man_files(man_dir)
589
- man_dirs = { man_dir => "bundler/man" }
590
- man_dirs.each do |old_man_dir, new_man_dir|
591
- man1_files = bundler_man1_files_in(new_man_dir)
592
-
593
- old_man1_dir = "#{old_man_dir}/man1"
594
- old_man1_files = bundler_man1_files_in(old_man1_dir)
595
- old_man1_files += Dir.chdir(old_man1_dir) { Dir["bundle*.1.{txt,ronn}"] }
549
+ def remove_old_man_files(old_man_dir)
550
+ old_man1_dir = "#{old_man_dir}/man1"
596
551
 
597
- man1_to_remove = old_man1_files - man1_files
552
+ if File.exist?(old_man1_dir)
553
+ man1_to_remove = Dir.chdir(old_man1_dir) { Dir["bundle*.1{,.txt,.ronn}"] }
598
554
 
599
555
  remove_file_list(man1_to_remove, old_man1_dir)
556
+ end
600
557
 
601
- man5_files = bundler_man5_files_in(new_man_dir)
602
-
603
- old_man5_dir = "#{old_man_dir}/man5"
604
- old_man5_files = bundler_man5_files_in(old_man5_dir)
605
- old_man5_files += Dir.chdir(old_man5_dir) { Dir["gemfile.5.{txt,ronn}"] }
558
+ old_man5_dir = "#{old_man_dir}/man5"
606
559
 
607
- man5_to_remove = old_man5_files - man5_files
560
+ if File.exist?(old_man5_dir)
561
+ man5_to_remove = Dir.chdir(old_man5_dir) { Dir["gemfile.5{,.txt,.ronn}"] }
608
562
 
609
563
  remove_file_list(man5_to_remove, old_man5_dir)
610
564
  end
611
565
  end
612
566
 
613
567
  def show_release_notes
614
- release_notes = File.join Dir.pwd, 'History.txt'
568
+ release_notes = File.join Dir.pwd, 'CHANGELOG.md'
615
569
 
616
570
  release_notes =
617
571
  if File.exist? release_notes
@@ -286,6 +286,7 @@ class Gem::DependencyInstaller
286
286
 
287
287
  installer_set = Gem::Resolver::InstallerSet.new @domain
288
288
  installer_set.ignore_installed = (@minimal_deps == false) || @only_install_dir
289
+ installer_set.force = @force
289
290
 
290
291
  if consider_local?
291
292
  if dep_or_name =~ /\.gem$/ and File.file? dep_or_name
@@ -28,16 +28,17 @@ class Gem::Ext::Builder
28
28
  unless make_program
29
29
  make_program = (/mswin/ =~ RUBY_PLATFORM) ? 'nmake' : 'make'
30
30
  end
31
+ make_program = Shellwords.split(make_program)
31
32
 
32
- destdir = '"DESTDIR=%s"' % ENV['DESTDIR']
33
+ destdir = 'DESTDIR=%s' % ENV['DESTDIR']
33
34
 
34
35
  ['clean', '', 'install'].each do |target|
35
36
  # Pass DESTDIR via command line to override what's in MAKEFLAGS
36
37
  cmd = [
37
- make_program,
38
+ *make_program,
38
39
  destdir,
39
40
  target,
40
- ].join(' ').rstrip
41
+ ].reject(&:empty?)
41
42
  begin
42
43
  run(cmd, results, "make #{target}".rstrip, make_dir)
43
44
  rescue Gem::InstallError
@@ -56,7 +57,7 @@ class Gem::Ext::Builder
56
57
  p(command)
57
58
  end
58
59
  results << "current directory: #{dir}"
59
- results << (command.respond_to?(:shelljoin) ? command.shelljoin : command)
60
+ results << command.shelljoin
60
61
 
61
62
  require "open3"
62
63
  # Set $SOURCE_DATE_EPOCH for the subprocess.
@@ -4,8 +4,7 @@ require_relative '../command'
4
4
  class Gem::Ext::CmakeBuilder < Gem::Ext::Builder
5
5
  def self.build(extension, dest_path, results, args=[], lib_dir=nil, cmake_dir=Dir.pwd)
6
6
  unless File.exist?(File.join(cmake_dir, 'Makefile'))
7
- cmd = "cmake . -DCMAKE_INSTALL_PREFIX=#{dest_path}"
8
- cmd << " #{Gem::Command.build_args.join ' '}" unless Gem::Command.build_args.empty?
7
+ cmd = ["cmake", ".", "-DCMAKE_INSTALL_PREFIX=#{dest_path}", *Gem::Command.build_args]
9
8
 
10
9
  run cmd, results, class_name, cmake_dir
11
10
  end
@@ -8,8 +8,7 @@
8
8
  class Gem::Ext::ConfigureBuilder < Gem::Ext::Builder
9
9
  def self.build(extension, dest_path, results, args=[], lib_dir=nil, configure_dir=Dir.pwd)
10
10
  unless File.exist?(File.join(configure_dir, 'Makefile'))
11
- cmd = "sh ./configure --prefix=#{dest_path}"
12
- cmd << " #{args.join ' '}" unless args.empty?
11
+ cmd = ["sh", "./configure", "--prefix=#{dest_path}", *args]
13
12
 
14
13
  run cmd, results, class_name, configure_dir
15
14
  end
@@ -260,8 +260,8 @@ module Gem::GemcutterUtilities
260
260
  end
261
261
 
262
262
  def get_key_name(scope)
263
- hostname = Socket.gethostname || "unkown-host"
264
- user = ENV["USER"] || ENV["USERNAME"] || "unkown-user"
263
+ hostname = Socket.gethostname || "unknown-host"
264
+ user = ENV["USER"] || ENV["USERNAME"] || "unknown-user"
265
265
  ts = Time.now.strftime("%Y%m%d%H%M%S")
266
266
  default_key_name = "#{hostname}-#{user}-#{ts}"
267
267
 
@@ -638,27 +638,6 @@ class Gem::Installer
638
638
  end
639
639
  end
640
640
 
641
- def ensure_required_ruby_version_met # :nodoc:
642
- if rrv = spec.required_ruby_version
643
- ruby_version = Gem.ruby_version
644
- unless rrv.satisfied_by? ruby_version
645
- raise Gem::RuntimeRequirementNotMetError,
646
- "#{spec.name} requires Ruby version #{rrv}. The current ruby version is #{ruby_version}."
647
- end
648
- end
649
- end
650
-
651
- def ensure_required_rubygems_version_met # :nodoc:
652
- if rrgv = spec.required_rubygems_version
653
- unless rrgv.satisfied_by? Gem.rubygems_version
654
- rg_version = Gem::VERSION
655
- raise Gem::RuntimeRequirementNotMetError,
656
- "#{spec.name} requires RubyGems version #{rrgv}. The current RubyGems version is #{rg_version}. " +
657
- "Try 'gem update --system' to update RubyGems itself."
658
- end
659
- end
660
- end
661
-
662
641
  def ensure_dependencies_met # :nodoc:
663
642
  deps = spec.runtime_dependencies
664
643
  deps |= spec.development_dependencies if @development
@@ -914,8 +893,6 @@ TEXT
914
893
 
915
894
  return true if @force
916
895
 
917
- ensure_required_ruby_version_met
918
- ensure_required_rubygems_version_met
919
896
  ensure_dependencies_met unless @ignore_dependencies
920
897
 
921
898
  true
@@ -6,11 +6,16 @@
6
6
  module Gem::InstallerUninstallerUtils
7
7
 
8
8
  def regenerate_plugins_for(spec, plugins_dir)
9
+ plugins = spec.plugins
10
+ return if plugins.empty?
11
+
12
+ require 'pathname'
13
+
9
14
  spec.plugins.each do |plugin|
10
15
  plugin_script_path = File.join plugins_dir, "#{spec.name}_plugin#{File.extname(plugin)}"
11
16
 
12
17
  File.open plugin_script_path, 'wb' do |file|
13
- file.puts "require '#{plugin}'"
18
+ file.puts "require_relative '#{Pathname.new(plugin).relative_path_from(Pathname.new(plugins_dir))}'"
14
19
  end
15
20
 
16
21
  verbose plugin_script_path
@@ -121,10 +121,6 @@ class Gem::Platform
121
121
  end
122
122
  end
123
123
 
124
- def inspect
125
- "%s @cpu=%p, @os=%p, @version=%p>" % [super[0..-2], *to_a]
126
- end
127
-
128
124
  def to_a
129
125
  [@cpu, @os, @version]
130
126
  end
@@ -26,13 +26,15 @@ class Gem::RemoteFetcher
26
26
  ##
27
27
  # The URI which was being accessed when the exception happened.
28
28
 
29
- attr_accessor :uri
29
+ attr_accessor :uri, :original_uri
30
30
 
31
31
  def initialize(message, uri)
32
32
  super message
33
33
 
34
34
  uri = parse_uri(uri)
35
35
 
36
+ @original_uri = uri.dup
37
+
36
38
  uri.password = 'REDACTED' if uri.respond_to?(:password) && uri.password
37
39
 
38
40
  @uri = uri.to_s
@@ -215,7 +217,7 @@ class Gem::RemoteFetcher
215
217
 
216
218
  case response
217
219
  when Net::HTTPOK, Net::HTTPNotModified then
218
- response.uri = uri if response.respond_to? :uri
220
+ response.uri = uri
219
221
  head ? response : response.body
220
222
  when Net::HTTPMovedPermanently, Net::HTTPFound, Net::HTTPSeeOther,
221
223
  Net::HTTPTemporaryRedirect then
@@ -195,19 +195,8 @@ class Gem::RequestSet
195
195
  yield req, installer if block_given?
196
196
  end
197
197
  rescue Gem::RuntimeRequirementNotMetError => e
198
- recent_match = req.spec.set.find_all(req.request).sort_by(&:version).reverse_each.find do |s|
199
- s = s.spec
200
- s.required_ruby_version.satisfied_by?(Gem.ruby_version) &&
201
- s.required_rubygems_version.satisfied_by?(Gem.rubygems_version) &&
202
- Gem::Platform.installable?(s)
203
- end
204
- if recent_match
205
- suggestion = "The last version of #{req.request} to support your Ruby & RubyGems was #{recent_match.version}. Try installing it with `gem install #{recent_match.name} -v #{recent_match.version}`"
206
- suggestion += " and then running the current command again" unless @always_install.include?(req.spec.spec)
207
- else
208
- suggestion = "There are no versions of #{req.request} compatible with your Ruby & RubyGems"
209
- suggestion += ". Maybe try installing an older version of the gem you're looking for?" unless @always_install.include?(req.spec.spec)
210
- end
198
+ suggestion = "There are no versions of #{req.request} compatible with your Ruby & RubyGems"
199
+ suggestion += ". Maybe try installing an older version of the gem you're looking for?" unless @always_install.include?(req.spec.spec)
211
200
  e.suggestion = suggestion
212
201
  raise
213
202
  end
@@ -190,7 +190,7 @@ class Gem::Requirement
190
190
  end
191
191
 
192
192
  def hash # :nodoc:
193
- requirements.sort.hash
193
+ requirements.map {|r| r.first == "~>" ? [r[0], r[1].to_s] : r }.sort.hash
194
194
  end
195
195
 
196
196
  def marshal_dump # :nodoc:
@@ -261,7 +261,12 @@ class Gem::Resolver
261
261
  end
262
262
 
263
263
  def requirement_satisfied_by?(requirement, activated, spec)
264
- requirement.matches_spec? spec
264
+ matches_spec = requirement.matches_spec? spec
265
+ return matches_spec if @soft_missing
266
+
267
+ matches_spec &&
268
+ spec.spec.required_ruby_version.satisfied_by?(Gem.ruby_version) &&
269
+ spec.spec.required_rubygems_version.satisfied_by?(Gem.rubygems_version)
265
270
  end
266
271
 
267
272
  def name_for(dependency)
@@ -4,6 +4,8 @@
4
4
  # Returns instances of APISpecification.
5
5
 
6
6
  class Gem::Resolver::APISet < Gem::Resolver::Set
7
+ autoload :GemParser, File.expand_path("api_set/gem_parser", __dir__)
8
+
7
9
  ##
8
10
  # The URI for the dependency API this APISet uses.
9
11
 
@@ -24,13 +26,13 @@ class Gem::Resolver::APISet < Gem::Resolver::Set
24
26
  # API URL +dep_uri+ which is described at
25
27
  # https://guides.rubygems.org/rubygems-org-api
26
28
 
27
- def initialize(dep_uri = 'https://rubygems.org/api/v1/dependencies')
29
+ def initialize(dep_uri = 'https://index.rubygems.org/info/')
28
30
  super()
29
31
 
30
32
  dep_uri = URI dep_uri unless URI === dep_uri
31
33
 
32
34
  @dep_uri = dep_uri
33
- @uri = dep_uri + '../..'
35
+ @uri = dep_uri + '..'
34
36
 
35
37
  @data = Hash.new {|h,k| h[k] = [] }
36
38
  @source = Gem::Source.new @uri
@@ -75,20 +77,8 @@ class Gem::Resolver::APISet < Gem::Resolver::Set
75
77
  def prefetch_now # :nodoc:
76
78
  needed, @to_fetch = @to_fetch, []
77
79
 
78
- uri = @dep_uri + "?gems=#{needed.sort.join ','}"
79
- str = Gem::RemoteFetcher.fetcher.fetch_path uri
80
-
81
- loaded = []
82
-
83
- Marshal.load(str).each do |ver|
84
- name = ver[:name]
85
-
86
- @data[name] << ver
87
- loaded << name
88
- end
89
-
90
- (needed - loaded).each do |missing|
91
- @data[missing] = []
80
+ needed.sort.each do |name|
81
+ versions(name)
92
82
  end
93
83
  end
94
84
 
@@ -111,13 +101,32 @@ class Gem::Resolver::APISet < Gem::Resolver::Set
111
101
  return @data[name]
112
102
  end
113
103
 
114
- uri = @dep_uri + "?gems=#{name}"
104
+ uri = @dep_uri + name
115
105
  str = Gem::RemoteFetcher.fetcher.fetch_path uri
116
106
 
117
- Marshal.load(str).each do |ver|
118
- @data[ver[:name]] << ver
107
+ lines(str).each do |ver|
108
+ number, platform, dependencies, requirements = parse_gem(ver)
109
+
110
+ platform ||= "ruby"
111
+ dependencies = dependencies.map {|dep_name, reqs| [dep_name, reqs.join(", ")] }
112
+ requirements = requirements.map {|req_name, reqs| [req_name.to_sym, reqs] }.to_h
113
+
114
+ @data[name] << { name: name, number: number, platform: platform, dependencies: dependencies, requirements: requirements }
119
115
  end
120
116
 
121
117
  @data[name]
122
118
  end
119
+
120
+ private
121
+
122
+ def lines(str)
123
+ lines = str.split("\n")
124
+ header = lines.index("---")
125
+ header ? lines[header + 1..-1] : lines
126
+ end
127
+
128
+ def parse_gem(string)
129
+ @gem_parser ||= GemParser.new
130
+ @gem_parser.parse(string)
131
+ end
123
132
  end