mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	 04817ae6d3
			
		
	
	
		04817ae6d3
		
	
	
	
	
		
			
			Fixed installation and activation of git: and path: gems via Gem.use_gemdeps Improved documentation coverage * test/rubygems: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43845 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			121 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| ##
 | |
| # This module contains various utility methods as module methods.
 | |
| 
 | |
| module Gem::Util
 | |
| 
 | |
|   @silent_mutex = nil
 | |
| 
 | |
|   ##
 | |
|   # Zlib::GzipReader wrapper that unzips +data+.
 | |
| 
 | |
|   def self.gunzip(data)
 | |
|     require 'zlib'
 | |
|     require 'rubygems/util/stringio'
 | |
|     data = Gem::StringSource.new data
 | |
| 
 | |
|     unzipped = Zlib::GzipReader.new(data).read
 | |
|     unzipped.force_encoding Encoding::BINARY if Object.const_defined? :Encoding
 | |
|     unzipped
 | |
|   end
 | |
| 
 | |
|   ##
 | |
|   # Zlib::GzipWriter wrapper that zips +data+.
 | |
| 
 | |
|   def self.gzip(data)
 | |
|     require 'zlib'
 | |
|     require 'rubygems/util/stringio'
 | |
|     zipped = Gem::StringSink.new
 | |
|     zipped.set_encoding Encoding::BINARY if Object.const_defined? :Encoding
 | |
| 
 | |
|     Zlib::GzipWriter.wrap zipped do |io| io.write data end
 | |
| 
 | |
|     zipped.string
 | |
|   end
 | |
| 
 | |
|   ##
 | |
|   # A Zlib::Inflate#inflate wrapper
 | |
| 
 | |
|   def self.inflate(data)
 | |
|     require 'zlib'
 | |
|     Zlib::Inflate.inflate data
 | |
|   end
 | |
| 
 | |
|   ##
 | |
|   # This calls IO.popen where it accepts an array for a +command+ (Ruby 1.9+)
 | |
|   # and implements an IO.popen-like behavior where it does not accept an array
 | |
|   # for a command.
 | |
| 
 | |
|   def self.popen *command
 | |
|     IO.popen command, &:read
 | |
|   rescue TypeError # ruby 1.8 only supports string command
 | |
|     r, w = IO.pipe
 | |
| 
 | |
|     pid = fork do
 | |
|       STDIN.close
 | |
|       STDOUT.reopen w
 | |
| 
 | |
|       exec(*command)
 | |
|     end
 | |
| 
 | |
|     w.close
 | |
| 
 | |
|     begin
 | |
|       return r.read
 | |
|     ensure
 | |
|       Process.wait pid
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   ##
 | |
|   # Invokes system, but silences all output.
 | |
| 
 | |
|   def self.silent_system *command
 | |
|     require 'thread'
 | |
| 
 | |
|     @silent_mutex ||= Mutex.new
 | |
| 
 | |
|     null_device = Gem.win_platform? ? 'NUL' : '/dev/null'
 | |
| 
 | |
|     @silent_mutex.synchronize do
 | |
|       begin
 | |
|         stdout = STDOUT.dup
 | |
|         stderr = STDERR.dup
 | |
| 
 | |
|         STDOUT.reopen null_device, 'w'
 | |
|         STDERR.reopen null_device, 'w'
 | |
| 
 | |
|         return system(*command)
 | |
|       ensure
 | |
|         STDOUT.reopen stdout
 | |
|         STDERR.reopen stderr
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   ##
 | |
|   # Enumerates the parents of +directory+.
 | |
| 
 | |
|   def self.traverse_parents directory
 | |
|     return enum_for __method__, directory unless block_given?
 | |
| 
 | |
|     here = File.expand_path directory
 | |
|     start = here
 | |
| 
 | |
|     Dir.chdir start
 | |
| 
 | |
|     begin
 | |
|       loop do
 | |
|         yield here
 | |
| 
 | |
|         Dir.chdir '..'
 | |
| 
 | |
|         return if Dir.pwd == here # toplevel
 | |
| 
 | |
|         here = Dir.pwd
 | |
|       end
 | |
|     ensure
 | |
|       Dir.chdir start
 | |
|     end
 | |
|   end
 | |
| 
 | |
| end
 |