summaryrefslogtreecommitdiff
path: root/lib/rubygems/util.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rubygems/util.rb')
-rw-r--r--lib/rubygems/util.rb126
1 files changed, 49 insertions, 77 deletions
diff --git a/lib/rubygems/util.rb b/lib/rubygems/util.rb
index 2de45c900b..ee4106c6ce 100644
--- a/lib/rubygems/util.rb
+++ b/lib/rubygems/util.rb
@@ -1,21 +1,25 @@
# frozen_string_literal: true
+
##
# 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 'stringio'
- data = StringIO.new(data, 'r')
-
- unzipped = Zlib::GzipReader.new(data).read
- unzipped.force_encoding Encoding::BINARY if Object.const_defined? :Encoding
+ require "zlib"
+ require "stringio"
+ data = StringIO.new(data, "r")
+
+ gzip_reader = begin
+ Zlib::GzipReader.new(data)
+ rescue Zlib::GzipFile::Error => e
+ raise e.class, e.inspect, e.backtrace
+ end
+
+ unzipped = gzip_reader.read
+ unzipped.force_encoding Encoding::BINARY
unzipped
end
@@ -23,12 +27,14 @@ module Gem::Util
# Zlib::GzipWriter wrapper that zips +data+.
def self.gzip(data)
- require 'zlib'
- require 'stringio'
- zipped = StringIO.new(String.new, 'w')
- zipped.set_encoding Encoding::BINARY if Object.const_defined? :Encoding
+ require "zlib"
+ require "stringio"
+ zipped = StringIO.new(String.new, "w")
+ zipped.set_encoding Encoding::BINARY
- Zlib::GzipWriter.wrap zipped do |io| io.write data end
+ Zlib::GzipWriter.wrap zipped do |io|
+ io.write data
+ end
zipped.string
end
@@ -37,88 +43,54 @@ module Gem::Util
# A Zlib::Inflate#inflate wrapper
def self.inflate(data)
- require 'zlib'
+ 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.
+ # This calls IO.popen and reads the result
- def self.popen *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
- NULL_DEVICE = defined?(IO::NULL) ? IO::NULL : Gem.win_platform? ? 'NUL' : '/dev/null'
-
##
- # Invokes system, but silences all output.
-
- def self.silent_system *command
- opt = {:out => NULL_DEVICE, :err => [:child, :out]}
- if Hash === command.last
- opt.update(command.last)
- cmds = command[0...-1]
- else
- cmds = command.dup
- end
- return system(*(cmds << opt))
- rescue TypeError
- require 'thread'
-
- @silent_mutex ||= Mutex.new
+ # Enumerates the parents of +directory+.
- null_device = NULL_DEVICE
+ def self.traverse_parents(directory, &block)
+ return enum_for __method__, directory unless block_given?
- @silent_mutex.synchronize do
+ here = File.expand_path directory
+ loop 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
- stdout.close
- stderr.close
+ Dir.chdir here, &block
+ rescue StandardError
+ Errno::EACCES
end
+
+ new_here = File.expand_path("..", here)
+ return if new_here == here # toplevel
+ here = new_here
end
end
##
- # Enumerates the parents of +directory+.
+ # Globs for files matching +pattern+ inside of +directory+,
+ # returning absolute paths to the matching files.
- def self.traverse_parents directory, &block
- return enum_for __method__, directory unless block_given?
+ def self.glob_files_in_dir(glob, base_path)
+ Dir.glob(glob, base: base_path).map! {|f| File.expand_path(f, base_path) }
+ end
- here = File.expand_path directory
- loop do
- Dir.chdir here, &block
- new_here = File.expand_path('..', here)
- return if new_here == here # toplevel
- here = new_here
+ ##
+ # Corrects +path+ (usually returned by `Gem::URI.parse().path` on Windows), that
+ # comes with a leading slash.
+
+ def self.correct_for_windows_path(path)
+ if path[0].chr == "/" && path[1].chr.match?(/[a-z]/i) && path[2].chr == ":"
+ path[1..-1]
+ else
+ path
end
end
-
end