From 8fadbe5f3e5e8b2d9f635a274b4121811313de84 Mon Sep 17 00:00:00 2001 From: drbrain Date: Fri, 13 Dec 2013 00:51:04 +0000 Subject: * lib/rubygems: Update to RubyGems master ddac51f. Changes: * Allow override for the shared gem installation directory for rubygems packagers. * Lock gem cache files for read and write to improve thread safety. * Use io/console when available. * Minor cleanup. * test/rubygems: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44157 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/rubygems.rb | 10 ++++-- lib/rubygems/basic_specification.rb | 15 ++++++-- lib/rubygems/defaults.rb | 11 ++++++ lib/rubygems/remote_fetcher.rb | 1 + lib/rubygems/request_set.rb | 4 --- lib/rubygems/source/git.rb | 8 ++--- lib/rubygems/specification.rb | 1 - lib/rubygems/test_case.rb | 13 ++++--- lib/rubygems/user_interaction.rb | 71 +++++++++++++++---------------------- 9 files changed, 69 insertions(+), 65 deletions(-) (limited to 'lib') diff --git a/lib/rubygems.rb b/lib/rubygems.rb index 732005fb9a..9baee34b2d 100644 --- a/lib/rubygems.rb +++ b/lib/rubygems.rb @@ -764,7 +764,10 @@ module Gem # Safely read a file in binary mode on all platforms. def self.read_binary(path) - File.open path, binary_mode do |f| f.read end + File.open path, binary_mode do |f| + f.flock(File::LOCK_EX) + f.read + end end ## @@ -1163,17 +1166,18 @@ module Gem autoload :ConfigFile, 'rubygems/config_file' autoload :Dependency, 'rubygems/dependency' autoload :DependencyList, 'rubygems/dependency_list' - autoload :Resolver, 'rubygems/resolver' autoload :DependencyResolver, 'rubygems/resolver' + autoload :Installer, 'rubygems/installer' autoload :PathSupport, 'rubygems/path_support' autoload :Platform, 'rubygems/platform' autoload :RequestSet, 'rubygems/request_set' autoload :Requirement, 'rubygems/requirement' + autoload :Resolver, 'rubygems/resolver' + autoload :Source, 'rubygems/source' autoload :SourceList, 'rubygems/source_list' autoload :SpecFetcher, 'rubygems/spec_fetcher' autoload :Specification, 'rubygems/specification' autoload :Version, 'rubygems/version' - autoload :Source, 'rubygems/source' require "rubygems/specification" end diff --git a/lib/rubygems/basic_specification.rb b/lib/rubygems/basic_specification.rb index 6cc13bb539..a52377ff22 100644 --- a/lib/rubygems/basic_specification.rb +++ b/lib/rubygems/basic_specification.rb @@ -72,9 +72,16 @@ class Gem::BasicSpecification # Returns full path to the directory where gem's extensions are installed. def extension_dir - @extension_dir ||= - File.join base_dir, 'extensions', Gem::Platform.local.to_s, - Gem.extension_api_version, full_name + @extension_dir ||= File.expand_path File.join(extensions_dir, full_name) + end + + ## + # Returns path to the extensions directory. + + def extensions_dir + @extensions_dir ||= Gem.default_ext_dir_for(base_dir) || + File.join(base_dir, 'extensions', Gem::Platform.local.to_s, + Gem.extension_api_version) end def find_full_gem_path # :nodoc: @@ -147,7 +154,9 @@ class Gem::BasicSpecification @loaded_from = path && path.to_s @extension_dir = nil + @extensions_dir = nil @full_gem_path = nil + @gem_dir = nil @gems_dir = nil @base_dir = nil end diff --git a/lib/rubygems/defaults.rb b/lib/rubygems/defaults.rb index 591580b7da..e4bf4e5a7f 100644 --- a/lib/rubygems/defaults.rb +++ b/lib/rubygems/defaults.rb @@ -51,6 +51,17 @@ module Gem @default_dir ||= File.join(*path) end + ## + # Returns binary extensions dir for specified RubyGems base dir or nil + # if such directory cannot be determined. + # + # By default, the binary extensions are located side by side with their + # Ruby counterparts, therefore nil is returned + + def self.default_ext_dir_for base_dir + nil + end + ## # Paths where RubyGems' .rb files and bin files are installed diff --git a/lib/rubygems/remote_fetcher.rb b/lib/rubygems/remote_fetcher.rb index c6816e8f0f..e32c024989 100644 --- a/lib/rubygems/remote_fetcher.rb +++ b/lib/rubygems/remote_fetcher.rb @@ -292,6 +292,7 @@ class Gem::RemoteFetcher if update and path then open(path, 'wb') do |io| + io.flock(File::LOCK_EX) io.write data end end diff --git a/lib/rubygems/request_set.rb b/lib/rubygems/request_set.rb index 68a8112c37..24bd6d1109 100644 --- a/lib/rubygems/request_set.rb +++ b/lib/rubygems/request_set.rb @@ -1,8 +1,4 @@ require 'rubygems' -require 'rubygems/dependency' -require 'rubygems/dependency_list' -require 'rubygems/installer' -require 'rubygems/resolver' require 'tsort' ## diff --git a/lib/rubygems/source/git.rb b/lib/rubygems/source/git.rb index 522acea217..28178a5f4f 100644 --- a/lib/rubygems/source/git.rb +++ b/lib/rubygems/source/git.rb @@ -9,9 +9,7 @@ require 'rubygems/util' # source = # Gem::Source::Git.new 'rake', 'git@example:rake.git', 'rake-10.1.0', false # -# spec = source.load_spec 'rake' -# -# source.checkout +# source.specs class Gem::Source::Git < Gem::Source @@ -187,15 +185,13 @@ class Gem::Source::Git < Gem::Source Dir.chdir directory do spec = Gem::Specification.load file if spec then - loaded_from = File.expand_path file - spec.loaded_from = loaded_from spec.base_dir = base_dir spec.extension_dir = File.join base_dir, 'extensions', Gem::Platform.local.to_s, Gem.extension_api_version, "#{name}-#{dir_shortref}" - spec.full_gem_path = File.dirname loaded_from if spec + spec.full_gem_path = File.dirname spec.loaded_from if spec end spec end diff --git a/lib/rubygems/specification.rb b/lib/rubygems/specification.rb index d2d10e1a0a..e9f126c6e1 100644 --- a/lib/rubygems/specification.rb +++ b/lib/rubygems/specification.rb @@ -1916,7 +1916,6 @@ class Gem::Specification < Gem::BasicSpecification @cache_dir = nil @cache_file = nil @doc_dir = nil - @gem_dir = nil @ri_dir = nil @spec_dir = nil @spec_file = nil diff --git a/lib/rubygems/test_case.rb b/lib/rubygems/test_case.rb index 314682f13b..8dc37d6720 100644 --- a/lib/rubygems/test_case.rb +++ b/lib/rubygems/test_case.rb @@ -24,16 +24,19 @@ unless Gem::Dependency.new('rdoc', '>= 3.10').matching_specs.empty? gem 'json' end -require 'rubygems/deprecate' require 'minitest/autorun' + +require 'rubygems/deprecate' + require 'fileutils' +require 'pathname' +require 'pp' +require 'rubygems/package' +require 'shellwords' require 'tmpdir' require 'uri' -require 'rubygems/package' -require 'pp' require 'zlib' -require 'pathname' -require 'shellwords' + Gem.load_yaml require 'rubygems/mock_gem_ui' diff --git a/lib/rubygems/user_interaction.rb b/lib/rubygems/user_interaction.rb index fad29b4afd..f5e460f994 100644 --- a/lib/rubygems/user_interaction.rb +++ b/lib/rubygems/user_interaction.rb @@ -4,6 +4,11 @@ # See LICENSE.txt for permissions. #++ +begin + require 'io/console' +rescue LoadError +end + ## # Module that defines the default UserInteraction. Any class including this # module will have access to the +ui+ method that returns the default UI. @@ -283,41 +288,27 @@ class Gem::StreamUI result end - if RUBY_VERSION > '1.9.2' then - ## - # Ask for a password. Does not echo response to terminal. - - def ask_for_password(question) - return nil if not tty? - - require 'io/console' - - @outs.print(question + " ") - @outs.flush + ## + # Ask for a password. Does not echo response to terminal. - password = @ins.noecho {@ins.gets} - password.chomp! if password - password - end - else - ## - # Ask for a password. Does not echo response to terminal. + def ask_for_password(question) + return nil if not tty? - def ask_for_password(question) - return nil if not tty? + @outs.print(question, " ") + @outs.flush - @outs.print(question + " ") - @outs.flush + password = _gets_noecho + @outs.puts + password.chomp! if password + password + end - Gem.win_platform? ? ask_for_password_on_windows : ask_for_password_on_unix + if IO.method_defined?(:noecho) then + def _gets_noecho + @ins.noecho {@ins.gets} end - - ## - # Asks for a password that works on windows. Ripped from the Heroku gem. - - def ask_for_password_on_windows - return nil if not tty? - + elsif Gem.win_platform? + def _gets_noecho require "Win32API" char = nil password = '' @@ -330,22 +321,16 @@ class Gem::StreamUI password << char.chr end end - - puts password end - - ## - # Asks for a password that works on unix - - def ask_for_password_on_unix - return nil if not tty? - + else + def _gets_noecho system "stty -echo" - password = @ins.gets - password.chomp! if password - system "stty echo" - password + begin + @ins.gets + ensure + system "stty echo" + end end end -- cgit v1.2.3