summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authordrbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-12-13 00:51:04 +0000
committerdrbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-12-13 00:51:04 +0000
commit8fadbe5f3e5e8b2d9f635a274b4121811313de84 (patch)
tree3dc303b2b09eb4c54d19e3c68172856d13d60e2b /lib
parentc2dcb947aaf60421ca4035298059a029a0a24c26 (diff)
* 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
Diffstat (limited to 'lib')
-rw-r--r--lib/rubygems.rb10
-rw-r--r--lib/rubygems/basic_specification.rb15
-rw-r--r--lib/rubygems/defaults.rb11
-rw-r--r--lib/rubygems/remote_fetcher.rb1
-rw-r--r--lib/rubygems/request_set.rb4
-rw-r--r--lib/rubygems/source/git.rb8
-rw-r--r--lib/rubygems/specification.rb1
-rw-r--r--lib/rubygems/test_case.rb13
-rw-r--r--lib/rubygems/user_interaction.rb71
9 files changed, 69 insertions, 65 deletions
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
@@ -52,6 +52,17 @@ module Gem
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
def self.default_rubygems_dirs
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