summaryrefslogtreecommitdiff
path: root/tool
diff options
context:
space:
mode:
authornagachika <nagachika@ruby-lang.org>2022-10-20 21:33:39 +0900
committernagachika <nagachika@ruby-lang.org>2022-10-20 21:33:39 +0900
commit4bb62ee57285da427d73ba30e7d76f0f377c9936 (patch)
treee5e6bf3e034d4e6e0564072ab212b06ab00c9984 /tool
parent46c2bf373d2665148f5004186209fee15c96f9b6 (diff)
merge revision(s) 6a8f1a9e5cd1c9c2b3c6925d8d3fa76a29dabf73:
Copy from bundled gem source for test --- common.mk | 13 +++++++---- defs/gmake.mk | 4 ++++ tool/gem-unpack.rb | 63 +++++++++++++++++++++++++++++++++++------------------- 3 files changed, 54 insertions(+), 26 deletions(-)
Diffstat (limited to 'tool')
-rw-r--r--tool/gem-unpack.rb63
1 files changed, 41 insertions, 22 deletions
diff --git a/tool/gem-unpack.rb b/tool/gem-unpack.rb
index c50d47f797..6310c3f92a 100644
--- a/tool/gem-unpack.rb
+++ b/tool/gem-unpack.rb
@@ -5,30 +5,49 @@ require 'rubygems/package'
# This library is used by "make extract-gems" to
# unpack bundled gem files.
-def Gem.unpack(file, dir = ".")
- pkg = Gem::Package.new(file)
- spec = pkg.spec
- target = spec.full_name
- Gem.ensure_gem_subdirectories(dir)
- gem_dir = File.join(dir, "gems", target)
- pkg.extract_files gem_dir
- spec_dir = spec.extensions.empty? ? "specifications" : File.join("gems", target)
- File.binwrite(File.join(dir, spec_dir, "#{target}.gemspec"), spec.to_ruby)
- unless spec.extensions.empty?
- spec.dependencies.clear
- File.binwrite(File.join(dir, spec_dir, ".bundled.#{target}.gemspec"), spec.to_ruby)
+class << Gem
+ def unpack(file, *rest)
+ pkg = Gem::Package.new(file)
+ prepare_test(pkg.spec, *rest) {|dir| pkg.extract_files(dir)}
+ puts "Unpacked #{file}"
end
- if spec.bindir and spec.executables
- bindir = File.join(dir, "bin")
- Dir.mkdir(bindir) rescue nil
- spec.executables.each do |exe|
- File.open(File.join(bindir, exe), "wb", 0o777) {|f|
- f.print "#!ruby\n",
- %[load File.realpath("../gems/#{target}/#{spec.bindir}/#{exe}", __dir__)\n]
- }
+
+ def copy(path, *rest)
+ spec = Gem::Specification.load(path)
+ path = File.dirname(path)
+ prepare_test(spec, *rest) do |dir|
+ FileUtils.rm_rf(dir)
+ files = spec.files.reject {|f| f.start_with?(".git")}
+ dirs = files.map {|f| File.dirname(f) if f.include?("/")}.uniq
+ FileUtils.mkdir_p(dirs.map {|d| d ? "#{dir}/#{d}" : dir}.sort_by {|d| d.count("/")})
+ files.each do |f|
+ File.copy_stream(File.join(path, f), File.join(dir, f))
+ end
end
+ puts "Copied #{path}"
end
- FileUtils.rm_rf(Dir.glob("#{gem_dir}/.git*"))
- puts "Unpacked #{file}"
+ def prepare_test(spec, dir = ".")
+ target = spec.full_name
+ Gem.ensure_gem_subdirectories(dir)
+ gem_dir = File.join(dir, "gems", target)
+ yield gem_dir
+ spec_dir = spec.extensions.empty? ? "specifications" : File.join("gems", target)
+ File.binwrite(File.join(dir, spec_dir, "#{target}.gemspec"), spec.to_ruby)
+ unless spec.extensions.empty?
+ spec.dependencies.clear
+ File.binwrite(File.join(dir, spec_dir, ".bundled.#{target}.gemspec"), spec.to_ruby)
+ end
+ if spec.bindir and spec.executables
+ bindir = File.join(dir, "bin")
+ Dir.mkdir(bindir) rescue nil
+ spec.executables.each do |exe|
+ File.open(File.join(bindir, exe), "wb", 0o777) {|f|
+ f.print "#!ruby\n",
+ %[load File.realpath("../gems/#{target}/#{spec.bindir}/#{exe}", __dir__)\n]
+ }
+ end
+ end
+ FileUtils.rm_rf(Dir.glob("#{gem_dir}/.git*"))
+ end
end