diff options
-rw-r--r-- | lib/rubygems/commands/pristine_command.rb | 18 | ||||
-rw-r--r-- | test/rubygems/test_gem_commands_pristine_command.rb | 15 |
2 files changed, 26 insertions, 7 deletions
diff --git a/lib/rubygems/commands/pristine_command.rb b/lib/rubygems/commands/pristine_command.rb index 96e48df4e6..ec791d310a 100644 --- a/lib/rubygems/commands/pristine_command.rb +++ b/lib/rubygems/commands/pristine_command.rb @@ -137,6 +137,13 @@ extensions will be restored. specs.group_by(&:full_name_with_location).values.each do |grouped_specs| spec = grouped_specs.find {|s| !s.default_gem? } || grouped_specs.first + unless only_executables_or_plugins? + # Default gemspecs include changes provided by ruby-core installer that + # can't currently be pristined (inclusion of compiled extension targets in + # the file list). So stick to resetting executables if it's a default gem. + options[:only_executables] = true if spec.default_gem? + end + if options.key? :skip if options[:skip].include? spec.name say "Skipped #{spec.full_name}, it was given through options" @@ -144,14 +151,14 @@ extensions will be restored. end end - unless spec.extensions.empty? || options[:extensions] || options[:only_executables] || options[:only_plugins] + unless spec.extensions.empty? || options[:extensions] || only_executables_or_plugins? say "Skipped #{spec.full_name_with_location}, it needs to compile an extension" next end gem = spec.cache_file - unless File.exist?(gem) || options[:only_executables] || options[:only_plugins] + unless File.exist?(gem) || only_executables_or_plugins? require_relative "../remote_fetcher" say "Cached gem for #{spec.full_name_with_location} not found, attempting to fetch..." @@ -185,7 +192,6 @@ extensions will be restored. env_shebang: env_shebang, build_args: spec.build_args, bin_dir: bin_dir, - install_as_default: spec.default_gem?, } if options[:only_executables] @@ -202,4 +208,10 @@ extensions will be restored. say "Restored #{spec.full_name_with_location}" end end + + private + + def only_executables_or_plugins? + options[:only_executables] || options[:only_plugins] + end end diff --git a/test/rubygems/test_gem_commands_pristine_command.rb b/test/rubygems/test_gem_commands_pristine_command.rb index 190f78c79f..2a715921b3 100644 --- a/test/rubygems/test_gem_commands_pristine_command.rb +++ b/test/rubygems/test_gem_commands_pristine_command.rb @@ -630,8 +630,16 @@ class TestGemCommandsPristineCommand < Gem::TestCase def test_execute_default_gem default_gem_spec = new_default_spec("default", "2.0.0.0", - nil, "default/gem.rb") - install_default_gems(default_gem_spec) + nil, "exe/executable") + default_gem_spec.executables = "executable" + install_default_gems default_gem_spec + + exe = File.join @gemhome, "bin", "executable" + + assert_path_exist exe, "default gem's executable not installed" + + content_with_replaced_shebang = File.read(exe).gsub(/^#![^\n]+ruby/, "#!/usr/bin/env ruby_executable_hooks") + File.write(exe, content_with_replaced_shebang) @cmd.options[:args] = %w[default] @@ -642,8 +650,7 @@ class TestGemCommandsPristineCommand < Gem::TestCase assert_equal( [ "Restoring gems to pristine condition...", - "Cached gem for default-2.0.0.0 not found, attempting to fetch...", - "Skipped default-2.0.0.0, it was not found from cache and remote sources", + "Restored default-2.0.0.0", ], @ui.output.split("\n") ) |