Index: lib/rubygems/commands/pristine_command.rb =================================================================== --- lib/rubygems/commands/pristine_command.rb (revision 42574) +++ lib/rubygems/commands/pristine_command.rb (working copy) @@ -21,7 +21,8 @@ class Gem::Commands::PristineCommand < G end add_option('--[no-]extensions', - 'Restore gems with extensions') do |value, options| + 'Restore gems with extensions', + 'in addition to regular gems') do |value, options| options[:extensions] = value end @@ -43,23 +44,23 @@ class Gem::Commands::PristineCommand < G def description # :nodoc: <<-EOF -The pristine command compares the installed gems with the contents of the -cached gem and restores any files that don't match the cached gem's copy. +The pristine command compares an installed gem with the contents of its +cached .gem file and restores any files that don't match the cached .gem's +copy. + +If you have made modifications to an installed gem, the pristine command +will revert them. All extensions are rebuilt and all bin stubs for the gem +are regenerated after checking for modifications. -If you have made modifications to your installed gems, the pristine command -will revert them. After all the gem's files have been checked all bin stubs -for the gem are regenerated. +If the cached gem cannot be found it will be downloaded. -If the cached gem cannot be found, you will need to use `gem install` to -revert the gem. - -If --no-extensions is provided pristine will not attempt to restore gems -with extensions. +If --no-extensions is provided pristine will not attempt to restore a gem +with an extension. EOF end def usage # :nodoc: - "#{program_name} [args]" + "#{program_name} [GEMNAME ...]" end def execute Index: lib/rubygems/core_ext/kernel_require.rb =================================================================== --- lib/rubygems/core_ext/kernel_require.rb (revision 42574) +++ lib/rubygems/core_ext/kernel_require.rb (working copy) @@ -8,6 +8,8 @@ require 'monitor' module Kernel + RUBYGEMS_ACTIVATION_MONITOR = Monitor.new # :nodoc: + if defined?(gem_original_require) then # Ruby ships with a custom_require, override its require remove_method :require @@ -33,10 +35,8 @@ module Kernel # The normal require functionality of returning false if # that file has already been loaded is preserved. - ACTIVATION_MONITOR = Monitor.new - def require path - ACTIVATION_MONITOR.enter + RUBYGEMS_ACTIVATION_MONITOR.enter spec = Gem.find_unresolved_default_spec(path) if spec @@ -118,7 +118,7 @@ module Kernel raise load_error ensure - ACTIVATION_MONITOR.exit + RUBYGEMS_ACTIVATION_MONITOR.exit end private :require Index: lib/rubygems/installer.rb =================================================================== --- lib/rubygems/installer.rb (revision 42574) +++ lib/rubygems/installer.rb (working copy) @@ -9,6 +9,7 @@ require 'rubygems/package' require 'rubygems/ext' require 'rubygems/user_interaction' require 'fileutils' +require 'thread' ## # The installer installs the files contained in the .gem into the Gem.home. @@ -32,6 +33,14 @@ class Gem::Installer ENV_PATHS = %w[/usr/bin/env /bin/env] ## + # The builder shells-out to run various commands after changing the + # directory. This means multiple installations cannot be allowed to build + # extensions in parallel as they may change each other's directories leading + # to broken extensions or failed installations. + + CHDIR_MUTEX = Mutex.new # :nodoc: + + ## # Raised when there is an error while building extensions. # class ExtensionBuildError < Gem::InstallError; end @@ -675,11 +684,13 @@ TEXT begin FileUtils.mkdir_p dest_path - Dir.chdir extension_dir do - results = builder.build(extension, gem_dir, dest_path, - results, @build_args) + CHDIR_MUTEX.synchronize do + Dir.chdir extension_dir do + results = builder.build(extension, gem_dir, dest_path, + results, @build_args) - say results.join("\n") if Gem.configuration.really_verbose + say results.join("\n") if Gem.configuration.really_verbose + end end rescue extension_build_error(extension_dir, results.join("\n"), $@) Index: lib/rubygems/package_task.rb =================================================================== --- lib/rubygems/package_task.rb (revision 42574) +++ lib/rubygems/package_task.rb (working copy) @@ -96,12 +96,15 @@ class Gem::PackageTask < Rake::PackageTa def define super - task :package => [:gem] - gem_file = File.basename gem_spec.cache_file gem_path = File.join package_dir, gem_file gem_dir = File.join package_dir, gem_spec.full_name + task :package => [:gem] + + directory package_dir + directory gem_dir + desc "Build the gem file #{gem_file}" task :gem => [gem_path] Index: lib/rubygems/specification.rb =================================================================== --- lib/rubygems/specification.rb (revision 42574) +++ lib/rubygems/specification.rb (working copy) @@ -188,15 +188,19 @@ class Gem::Specification attr_reader :version ## - # Paths in the gem to add to $LOAD_PATH when this gem is activated. + # Paths in the gem to add to $LOAD_PATH when this gem is + # activated. + # + # If you have an extension you do not need to add "ext" to the + # require path, the extension build process will copy the extension files + # into "lib" for you. + # + # The default value is "lib" # # Usage: # # # If all library files are in the root directory... # spec.require_path = '.' - # - # # If you have 'lib' and 'ext' directories... - # spec.require_paths << 'ext' attr_accessor :require_paths @@ -210,7 +214,7 @@ class Gem::Specification ## # A short summary of this gem's description. Displayed in `gem list -d`. # - # The description should be more detailed than the summary. + # The #description should be more detailed than the summary. # # Usage: # @@ -223,21 +227,23 @@ class Gem::Specification # # This is usually Gem::Platform::RUBY or Gem::Platform::CURRENT. # - # Most gems contain pure Ruby code; they should simply leave the default value - # in place. Some gems contain C (or other) code to be compiled into a Ruby - # “extension”. The should leave the default value in place unless their code - # will only compile on a certain type of system. Some gems consist of - # pre-compiled code (“binary gems”). It’s especially important that they set - # the platform attribute appropriately. A shortcut is to set the platform to - # Gem::Platform::CURRENT, which will cause the gem builder to set the platform - # to the appropriate value for the system on which the build is being performed. - # - # If this attribute is set to a non-default value, it will be included in the - # filename of the gem when it is built, e.g. fxruby-1.2.0-win32.gem. + # Most gems contain pure Ruby code; they should simply leave the default + # value in place. Some gems contain C (or other) code to be compiled into a + # Ruby "extension". The should leave the default value in place unless + # their code will only compile on a certain type of system. Some gems + # consist of pre-compiled code ("binary gems"). It's especially important + # that they set the platform attribute appropriately. A shortcut is to set + # the platform to Gem::Platform::CURRENT, which will cause the gem builder + # to set the platform to the appropriate value for the system on which the + # build is being performed. + # + # If this attribute is set to a non-default value, it will be included in + # the filename of the gem when it is built such as: + # nokogiri-1.6.0-x86-mingw32.gem # # Usage: # - # spec.platform = Gem::Platform::Win32 + # spec.platform = Gem::Platform.local def platform= platform if @original_platform.nil? or @@ -339,7 +345,7 @@ class Gem::Specification attr_reader :description ## - # A contact email for this gem + # A contact email address (or addresses) for this gem # # Usage: # @@ -455,6 +461,8 @@ class Gem::Specification # Usage: # # spec.extensions << 'ext/rmagic/extconf.rb' + # + # See Gem::Ext::Builder for information about writing extensions for gems. def extensions @extensions ||= [] @@ -484,6 +492,8 @@ class Gem::Specification # This should just be the name of your license. The full # text of the license should be inside of the gem when you build it. # + # You can set multiple licenses with #licenses= + # # Usage: # spec.license = 'MIT' @@ -520,15 +530,20 @@ class Gem::Specification end ## - # The version of ruby required by this gem + # The version of Ruby required by this gem. The ruby version can be + # specified to the patch-level: + # + # $ ruby -v -e 'p Gem.ruby_version' + # ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.4.0] + # # # # Usage: # - # # If it will work with 1.8.6 or greater... + # # This gem will work with 1.8.6 or greater... # spec.required_ruby_version = '>= 1.8.6' # - # # Hopefully by now: - # spec.required_ruby_version = '>= 1.9.2' + # # Only with ruby 2.0.x + # spec.required_ruby_version = '~> 2.0' def required_ruby_version= req @required_ruby_version = Gem::Requirement.create req @@ -536,7 +551,7 @@ class Gem::Specification ## # Lists the external (to RubyGems) requirements that must be met for this gem - # to work. It’s simply information for the user. + # to work. It's simply information for the user. # # Usage: # @@ -548,7 +563,7 @@ class Gem::Specification end ## - # A collection of unit test files. They will be loaded as unit tests when + # A collection of unit test files. They will be loaded as unit tests when # the user requests a gem to be unit tested. # # Usage: @@ -574,7 +589,7 @@ class Gem::Specification # # Deprecated: It is neither supported nor functional. - attr_accessor :autorequire + attr_accessor :autorequire # :nodoc: ## # Sets the default executable for this gem. @@ -602,9 +617,12 @@ class Gem::Specification # The RubyGems version required by this gem attr_reader :required_rubygems_version + ## # The rubyforge project this gem lives under. i.e. RubyGems' # rubyforge_project is "rubygems". + # + # This option is deprecated. attr_accessor :rubyforge_project @@ -1267,7 +1285,7 @@ class Gem::Specification end ## - # Singular reader for #authors + # Singular reader for #authors. Returns the first author in the list def author val = authors and val.first @@ -1275,6 +1293,8 @@ class Gem::Specification ## # The list of author names who wrote this gem. + # + # spec.authors = ['Chad Fowler', 'Jim Weirich', 'Rich Kilmer'] def authors @authors ||= [] @@ -1381,7 +1401,9 @@ class Gem::Specification end ## - # The date this gem was created. Lazily defaults to TODAY. + # The date this gem was created. Lazily defaults to the current UTC date. + # + # There is no need to set this in your gem specification. def date @date ||= TODAY @@ -1428,7 +1450,7 @@ class Gem::Specification # Deprecated: The name of the gem is assumed to be the name of the # executable now. See Gem.bin_path. - def default_executable + def default_executable # :nodoc: if defined?(@default_executable) and @default_executable result = @default_executable elsif @executables and @executables.size == 1 @@ -1487,7 +1509,7 @@ class Gem::Specification end ## - # A long description of this gem + # A detailed description of this gem. See also #summary def description= str @description = str.to_s @@ -1676,7 +1698,7 @@ class Gem::Specification # # Formerly used to indicate this gem was RDoc-capable. - def has_rdoc + def has_rdoc # :nodoc: true end @@ -1685,11 +1707,11 @@ class Gem::Specification # # Formerly used to indicate this gem was RDoc-capable. - def has_rdoc= ignored + def has_rdoc= ignored # :nodoc: @has_rdoc = true end - alias :has_rdoc? :has_rdoc + alias :has_rdoc? :has_rdoc # :nodoc: ## # True if this gem has files in test_files Index: lib/rubygems.rb =================================================================== --- lib/rubygems.rb (revision 42574) +++ lib/rubygems.rb (working copy) @@ -8,7 +8,7 @@ require 'rbconfig' module Gem - VERSION = '2.0.6' + VERSION = '2.0.7' end # Must be first since it unloads the prelude from 1.9.2 @@ -36,9 +36,9 @@ require 'rubygems/errors' # # Further RubyGems documentation can be found at: # +# * {RubyGems Guides}[http://guides.rubygems.org] # * {RubyGems API}[http://rubygems.rubyforge.org/rdoc] (also available from # gem server) -# * {RubyGems Bookshelf}[http://rubygem.org] # # == RubyGems Plugins # Index: test/rubygems/test_gem_commands_install_command.rb =================================================================== --- test/rubygems/test_gem_commands_install_command.rb (revision 42574) +++ test/rubygems/test_gem_commands_install_command.rb (working copy) @@ -1,5 +1,6 @@ require 'rubygems/test_case' require 'rubygems/commands/install_command' +require 'rubygems/rdoc' class TestGemCommandsInstallCommand < Gem::TestCase Index: test/rubygems/test_gem_package.rb =================================================================== --- test/rubygems/test_gem_package.rb (revision 42574) +++ test/rubygems/test_gem_package.rb (working copy) @@ -64,13 +64,16 @@ class TestGemPackage < Gem::Package::Tar reader = Gem::Package::TarReader.new gem_io checksums = nil + tar = nil reader.each_entry do |entry| case entry.full_name - when 'checksums.yaml.gz' + when 'checksums.yaml.gz' then Zlib::GzipReader.wrap entry do |io| checksums = io.read end + when 'data.tar.gz' then + tar = entry.read end end @@ -83,19 +86,14 @@ class TestGemPackage < Gem::Package::Tar metadata_sha1 = Digest::SHA1.hexdigest s.string metadata_sha512 = Digest::SHA512.hexdigest s.string - data_digests = nil - util_tar do |tar| - data_digests = package.add_contents tar - end - expected = { 'SHA1' => { 'metadata.gz' => metadata_sha1, - 'data.tar.gz' => data_digests['SHA1'].hexdigest, + 'data.tar.gz' => Digest::SHA1.hexdigest(tar), }, 'SHA512' => { 'metadata.gz' => metadata_sha512, - 'data.tar.gz' => data_digests['SHA512'].hexdigest, + 'data.tar.gz' => Digest::SHA512.hexdigest(tar), } } Index: test/rubygems/test_gem_package_task.rb =================================================================== --- test/rubygems/test_gem_package_task.rb (revision 42574) +++ test/rubygems/test_gem_package_task.rb (working copy) @@ -4,16 +4,37 @@ require 'rubygems/package_task' class TestGemPackageTask < Gem::TestCase + def setup + super + + Rake.application = Rake::Application.new + RakeFileUtils.verbose_flag = false + end + def test_gem_package gem = Gem::Specification.new do |g| g.name = "pkgr" g.version = "1.2.3" - g.files = Rake::FileList["x"].resolve + + g.authors = %w[author] + g.files = %w[x] + g.summary = 'summary' end + pkg = Gem::PackageTask.new(gem) do |p| p.package_files << "y" end - assert_equal ["x", "y"], pkg.package_files + + assert_equal %w[x y], pkg.package_files + + Dir.chdir @tempdir do + FileUtils.touch 'x' + FileUtils.touch 'y' + + Rake.application['package'].invoke + + assert_path_exists 'pkg/pkgr-1.2.3.gem' + end end def test_gem_package_with_current_platform