summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2022-07-30 21:08:00 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2022-08-05 09:44:18 +0900
commit6a8f1a9e5cd1c9c2b3c6925d8d3fa76a29dabf73 (patch)
tree6bbef21f1444c091b651dd7d2a83bbbcb342b67b
parent87d8d25796df3865b5a0c9069c604e475a28027f (diff)
Copy from bundled gem source for test
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/6203
-rw-r--r--common.mk13
-rw-r--r--defs/gmake.mk4
-rw-r--r--tool/gem-unpack.rb63
3 files changed, 54 insertions, 26 deletions
diff --git a/common.mk b/common.mk
index 1a1260907b..515236b184 100644
--- a/common.mk
+++ b/common.mk
@@ -1344,7 +1344,7 @@ update-config_files: PHONY
refresh-gems: update-bundled_gems prepare-gems
prepare-gems: $(HAVE_BASERUBY:yes=update-gems) $(HAVE_BASERUBY:yes=extract-gems)
-update-gems$(gnumake:yes=-nongnumake): PHONY
+update-gems$(gnumake:yes=-sequential): PHONY
$(ECHO) Downloading bundled gem files...
$(Q) $(BASERUBY) -C "$(srcdir)" \
-I./tool -rdownloader -answ \
@@ -1358,15 +1358,20 @@ update-gems$(gnumake:yes=-nongnumake): PHONY
-e 'FileUtils.rm_rf(old.map{'"|n|"'n.chomp(".gem")})' \
gems/bundled_gems
-extract-gems$(gnumake:yes=-nongnumake): PHONY
+extract-gems$(gnumake:yes=-sequential): PHONY
$(ECHO) Extracting bundled gem files...
$(Q) $(RUNRUBY) -C "$(srcdir)" \
-Itool -rfileutils -rgem-unpack -answ \
-e 'BEGIN {d = ".bundle/gems"}' \
- -e 'gem, ver = *$$F' \
+ -e 'gem, ver, _, rev = *$$F' \
-e 'next if !ver or /^#/=~gem' \
-e 'g = "#{gem}-#{ver}"' \
- -e 'File.directory?("#{d}/#{g}") or Gem.unpack("gems/#{g}.gem", ".bundle")' \
+ -e 'if File.directory?("#{d}/#{g}")' \
+ -e 'elsif rev and File.exist?(gs = "gems/src/#{gem}/#{gem}.gemspec")' \
+ -e 'Gem.copy(gs, ".bundle")' \
+ -e 'else' \
+ -e 'Gem.unpack("gems/#{g}.gem", ".bundle")' \
+ -e 'end' \
gems/bundled_gems
update-bundled_gems: PHONY
diff --git a/defs/gmake.mk b/defs/gmake.mk
index a55edfb286..9d7bf029e2 100644
--- a/defs/gmake.mk
+++ b/defs/gmake.mk
@@ -292,6 +292,9 @@ gems/%.gem:
-e 'File.unlink(*old) and' \
-e 'FileUtils.rm_rf(old.map{'"|n|"'n.chomp(".gem")})'
+ifeq (,)
+extract-gems: extract-gems-sequential
+else
extract-gems: | $(patsubst %,.bundle/gems/%,$(bundled-gems))
.bundle/gems/%: gems/%.gem | .bundle/gems
@@ -302,6 +305,7 @@ extract-gems: | $(patsubst %,.bundle/gems/%,$(bundled-gems))
$(srcdir)/.bundle/gems:
$(MAKEDIRS) $@
+endif
ifneq ($(filter update-bundled_gems refresh-gems,$(MAKECMDGOALS)),)
update-gems: update-bundled_gems
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