diff options
Diffstat (limited to 'tool/format-release')
| -rwxr-xr-x | tool/format-release | 165 |
1 files changed, 103 insertions, 62 deletions
diff --git a/tool/format-release b/tool/format-release index e3ad5a9563..8bb6154243 100755 --- a/tool/format-release +++ b/tool/format-release @@ -1,45 +1,39 @@ #!/usr/bin/env ruby -# -# Tool to update w.r-l.o files on release -# -# This receives `make dist`'s output, and prints -# -# * links and digests of tarballs for releate article -# * patch for below data files -# * _data/branches.yml -# * _data/downloads.yml -# * _data/releases.yml -# -# To apply the patch, `patch -p1 < patch.txt` -require "diffy" + +require "bundler/inline" + +gemfile do + source "https://rubygems.org" + gem "diffy" +end + +require "open-uri" +require "yaml" +require_relative "./ruby-version" Diffy::Diff.default_options.merge!( include_diff_info: true, context: 1, ) -WWW = Dir.pwd # workdir of https://github.com/ruby/www.ruby-lang.org class Tarball - attr_reader :version, :sha256 + attr_reader :version, :size, :sha1, :sha256, :sha512 - def initialize(path, size, sha1, sha256, sha512) - /\A\/(?:[^\/\n]*\/)*(?:ruby-(?<ver>(?<xy>\d+\.\d+)\.\d+(?:-(?:preview|rc)\d+)?)[0-9a-z.\-]+)/ =~ path \ - or raise "tarball path doesn't mach regexp" - @path = path + def initialize(version, url, size, sha1, sha256, sha512) + @url = url @size = size @sha1 = sha1 @sha256 = sha256 @sha512 = sha512 - @version = ver - @xy = xy + @version = version + @xy = version[/\A\d+\.\d+/] end - def gz?; @path.end_with?('.gz'); end - def zip?; @path.end_with?('.zip'); end - def bz2?; @path.end_with?('.bz2'); end - def xz?; @path.end_with?('.xz'); end + def gz?; @url.end_with?('.gz'); end + def zip?; @url.end_with?('.zip'); end + def xz?; @url.end_with?('.xz'); end - def ext; @path[/(?:zip|tar\.(?:gz|bz2|xz))\z/]; end + def ext; @url[/(?:zip|tar\.(?:gz|xz))\z/]; end def to_md <<eom @@ -57,37 +51,50 @@ eom # SHA1: 21f62c369661a2ab1b521fd2fa8191a4273e12a1 # SHA256: 97cea8aa63dfa250ba6902b658a7aa066daf817b22f82b7ee28f44aec7c2e394 # SHA512: 1e2042324821bb4e110af7067f52891606dcfc71e640c194ab1c117f0b941550e0b3ac36ad3511214ac80c536b9e5cfaf8789eec74cf56971a832ea8fc4e6d94 - def self.parse(io) - ary = [] - ver = nil - io.read.scan(/^\* .*(?:\n .*)*/) do |unit| - path, size, sha1, sha256, sha512 = unit.lines.map(&:chomp) - path.slice!(0, 2) - size = size[/\d+/].to_i - sha1 = sha1[/\h{40}/] - sha256 = sha256[/\h{64}/] - sha512 = sha512[/\h{128}/] - tarball = Tarball.new(path, size, sha1, sha256, sha512) - if ver - raise "mixed versions" if tarball.version != ver - else - ver = tarball.version - end - ary << tarball + def self.parse(wwwdir, version, rubydir) + unless /\A(\d+)\.(\d+)\.(\d+)(?:-(?:preview|rc)\d+)?\z/ =~ version + raise "unexpected version string '#{version}'" + end + teeny = Integer($3) + + uri = "https://cache.ruby-lang.org/pub/tmp/ruby-info-#{version}-draft.yml" + info = YAML.unsafe_load(URI(uri).read) + if info.size != 1 + raise "unexpected info.yml '#{uri}'" + end + tarballs = [] + info[0]["size"].each_key do |ext| + url = info[0]["url"][ext] + size = info[0]["size"][ext] + sha1 = info[0]["sha1"][ext] + sha256 = info[0]["sha256"][ext] + sha512 = info[0]["sha512"][ext] + tarball = Tarball.new(version, url, size, sha1, sha256, sha512) + tarballs << tarball end - xy = ver[/\A\d+\.\d+/] - ary.each do |tarball| - puts tarball.to_md + + if teeny == 0 + # show diff shortstat + tag = RubyVersion.tag(version) + prev_tag = RubyVersion.tag(RubyVersion.previous(version)) + stat = `git -C #{rubydir} diff -l0 --shortstat #{prev_tag}..#{tag}` + files_changed, insertions, deletions = stat.scan(/\d+/) end - update_branches_yml(ver, xy) - update_downloads_yml(ver, xy) - update_releases_yml(ver, xy, ary) - ary + + xy = version[/\A\d+\.\d+/] + #puts "## Download\n\n" + #tarballs.each do |tarball| + # puts tarball.to_md + #end + update_branches_yml(version, xy, wwwdir) + update_downloads_yml(version, xy, wwwdir) + update_releases_yml(version, xy, tarballs, wwwdir, files_changed, insertions, deletions) + tarballs end - def self.update_branches_yml(ver, xy) + def self.update_branches_yml(ver, xy, wwwdir) filename = "_data/branches.yml" - orig_data = File.read(File.join(WWW, filename)) + orig_data = File.read(File.join(wwwdir, filename)) data = orig_data.dup if data.include?("\n- name: #{xy}\n") data.sub!(/\n- name: #{Regexp.escape(xy)}\n(?: .*\n)*/) do |node| @@ -121,9 +128,9 @@ eom end end - def self.update_downloads_yml(ver, xy) + def self.update_downloads_yml(ver, xy, wwwdir) filename = "_data/downloads.yml" - orig_data = File.read(File.join(WWW, filename)) + orig_data = File.read(File.join(wwwdir, filename)) data = orig_data.dup if /^preview:\n\n(?: .*\n)* - #{Regexp.escape(xy)}\./ =~ data @@ -148,29 +155,55 @@ eom end end - def self.update_releases_yml(ver, xy, ary) + def self.update_releases_yml(ver, xy, ary, wwwdir, files_changed, insertions, deletions) filename = "_data/releases.yml" - orig_data = File.read(File.join(WWW, filename)) + orig_data = File.read(File.join(wwwdir, filename)) data = orig_data.dup - date = Time.now + date = Time.now.utc # use utc to use previous day in midnight entry = <<eom - version: #{ver} date: #{date.strftime("%Y-%m-%d")} post: /en/news/#{date.strftime("%Y/%m/%d")}/ruby-#{ver.tr('.', '-')}-released/ +eom + + if /\.0(?:-\w+)?\z/ =~ ver + # preview, rc, or first release + entry <<= <<eom + tag: #{RubyVersion.tag(ver)} + stats: + files_changed: #{files_changed} + insertions: #{insertions} + deletions: #{deletions} +eom + end + + entry <<= <<eom url: gz: https://cache.ruby-lang.org/pub/ruby/#{xy}/ruby-#{ver}.tar.gz zip: https://cache.ruby-lang.org/pub/ruby/#{xy}/ruby-#{ver}.zip - bz2: https://cache.ruby-lang.org/pub/ruby/#{xy}/ruby-#{ver}.tar.bz2 xz: https://cache.ruby-lang.org/pub/ruby/#{xy}/ruby-#{ver}.tar.xz + size: + gz: #{ary.find{|x|x.gz? }.size} + zip: #{ary.find{|x|x.zip?}.size} + xz: #{ary.find{|x|x.xz? }.size} + sha1: + gz: #{ary.find{|x|x.gz? }.sha1} + zip: #{ary.find{|x|x.zip?}.sha1} + xz: #{ary.find{|x|x.xz? }.sha1} sha256: gz: #{ary.find{|x|x.gz? }.sha256} zip: #{ary.find{|x|x.zip?}.sha256} - bz2: #{ary.find{|x|x.bz2?}.sha256} xz: #{ary.find{|x|x.xz? }.sha256} + sha512: + gz: #{ary.find{|x|x.gz? }.sha512} + zip: #{ary.find{|x|x.zip?}.sha512} + xz: #{ary.find{|x|x.xz? }.sha512} eom if data.include?("\n- version: #{ver}\n") + # update existing entry + data.sub!(/\n- version: #{ver}\n(^ .*\n)*\n/, "\n#{entry}\n") elsif data.sub!(/\n# #{Regexp.escape(xy)} series\n/, "\\&\n#{entry}") else data.sub!(/^$/, "\n# #{xy} series\n\n#{entry}") @@ -185,11 +218,11 @@ eom diff.each_with_index do |line, index| case index when 0 - line.sub!(/\A--- (.*)\t(\d+-\d+-\d+ [0-9:.]+ [\-+]\d+)\Z/) do + line.sub!(/\A--- (.*)\t(\d+-\d+-\d+ [0-9:.]+(?: [\-+]\d+)?)\Z/) do "--- a/#{filename}\t#{$2}" end when 1 - line.sub!(/\A\+\+\+ (.*)\t(\d+-\d+-\d+ [0-9:.]+ [\-+]\d+)\Z/) do + line.sub!(/\A\+\+\+ (.*)\t(\d+-\d+-\d+ [0-9:.]+(?: [\-+]\d+)?)\Z/) do "+++ b/#{filename}\t#{$2}" end end @@ -199,6 +232,14 @@ eom end def main - Tarball.parse(ARGF) + wwwdir = ARGV.shift + version = ARGV.shift + rubydir = ARGV.shift + unless rubydir + STDERR.puts "usage: format-release <dir-of-w.r-l.o> <version> <ruby-dir>" + exit + end + Tarball.parse(wwwdir, version, rubydir) end + main |
