Skip to content

Commit

Permalink
Copy from bundled gem source for test
Browse files Browse the repository at this point in the history
  • Loading branch information
nobu committed Aug 5, 2022
1 parent 87d8d25 commit 6a8f1a9
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 26 deletions.
13 changes: 9 additions & 4 deletions common.mk
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand All @@ -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
Expand Down
4 changes: 4 additions & 0 deletions defs/gmake.mk
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
63 changes: 41 additions & 22 deletions tool/gem-unpack.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,30 +5,49 @@
# 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

0 comments on commit 6a8f1a9

Please sign in to comment.