diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2022-07-30 21:08:00 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2022-08-05 09:44:18 +0900 |
commit | 6a8f1a9e5cd1c9c2b3c6925d8d3fa76a29dabf73 (patch) | |
tree | 6bbef21f1444c091b651dd7d2a83bbbcb342b67b | |
parent | 87d8d25796df3865b5a0c9069c604e475a28027f (diff) | |
download | ruby-6a8f1a9e5cd1c9c2b3c6925d8d3fa76a29dabf73.tar.gz |
Copy from bundled gem source for test
-rw-r--r-- | common.mk | 13 | ||||
-rw-r--r-- | defs/gmake.mk | 4 | ||||
-rw-r--r-- | tool/gem-unpack.rb | 63 |
3 files changed, 54 insertions, 26 deletions
@@ -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 |