[前][次][番号順一覧][スレッド一覧]

ruby-changes:72821

From: Nobuyoshi <ko1@a...>
Date: Fri, 5 Aug 2022 13:00:46 +0900 (JST)
Subject: [ruby-changes:72821] 6a8f1a9e5c (master): Copy from bundled gem source for test

https://git.ruby-lang.org/ruby.git/commit/?id=6a8f1a9e5c

From 6a8f1a9e5cd1c9c2b3c6925d8d3fa76a29dabf73 Mon Sep 17 00:00:00 2001
From: Nobuyoshi Nakada <nobu@r...>
Date: Sat, 30 Jul 2022 21:08:00 +0900
Subject: 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(-)

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 https://github.com/ruby/ruby/blob/trunk/common.mk#L1344
 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 https://github.com/ruby/ruby/blob/trunk/common.mk#L1358
 	    -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: https://github.com/ruby/ruby/blob/trunk/defs/gmake.mk#L292
 	    -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)) https://github.com/ruby/ruby/blob/trunk/defs/gmake.mk#L305
 
 $(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' https://github.com/ruby/ruby/blob/trunk/tool/gem-unpack.rb#L5
 # 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
-- 
cgit v1.2.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]