ruby/tool/sync_test_lib.rb

102 строки
2.5 KiB
Ruby
Executable File

#!/usr/bin/env ruby
require "fileutils"
test_lib_files = [
["lib/core_assertions.rb", "test/lib"],
["lib/find_executable.rb", "test/lib"],
["lib/envutil.rb", "test/lib"],
["lib/helper.rb", "test/lib"],
["rakelib/sync_tool.rake", "rakelib"],
].map do |file, dest|
[file, dest, File.read("#{__dir__}/#{file}")]
end
repos = %w[
bigdecimal cgi cmath date delegate did_you_mean digest drb erb etc
fileutils find forwardable io-console io-nonblock io-wait ipaddr
irb logger net-http net-protocol open-uri open3 openssl optparse
ostruct pathname pstore psych racc resolv stringio strscan tempfile
time timeout tmpdir uri weakref win32ole yaml zlib
]
branch_name = "update-test-lib-#{Time.now.strftime("%Y%m%d")}"
title = "Update test libraries from ruby/ruby #{Time.now.strftime("%Y-%m-%d")}"
commit = `git rev-parse HEAD`.chomp
message = "From https://github.com/ruby/ruby/commit/#{commit}"
update = true
keep = nil
topdir = nil
while arg = ARGV.shift
case arg
when '--dry-run'
update = false
keep = true
when '--update'
update = true
keep = false if keep.nil?
when '--no-update'
update = false
keep = true if keep.nil?
when '--keep'
keep = true
when '--no-keep'
keep = false
when '--'
break
else
if topdir
ARGV.unshift(arg)
else
topdir = arg
end
break
end
end
topdir ||= '..'
repos = ARGV unless ARGV.empty?
repos.each do |repo|
puts "#{repo}: start"
Dir.chdir("#{topdir}/#{repo}") do
if `git branch --list #{branch_name}`.empty?
system(*%W"git switch master")
system(*%W"git switch -c #{branch_name}")
else
puts "#{repo}: skip"
next
end
test_lib_files.each do |file, dest, code|
FileUtils.mkdir_p(dest)
file = "#{dest}/#{File.basename(file)}"
File.binwrite(file, code)
system "git add #{file}"
end
rf = File.binread("Rakefile")
if rf.sub!(/(?>\A|(\n)\n*)task +:sync_tool +do\n(?>(?> .*)?\n)*end\n(?=\z|(\n))/) {$1&&$2}
File.binwrite("Rakefile", rf)
system "git add Rakefile"
end
if IO.popen(%W"git commit -m #{title}\n\n#{message}", &:read).chomp =~ /nothing to commit/
puts "#{repo}: nothing to update"
elsif update
system(*%W"git push")
system(*%W"gh repo set-default ruby/#{repo}")
system(*%W"gh pr create --base master --head ruby:#{branch_name} --title #{title} --body #{message}")
puts "#{repo}: updated"
end
unless keep
system "git switch master"
system "git branch -D #{branch_name}"
end
end
rescue StandardError => e
puts e
end