diff options
author | NARUSE, Yui <naruse@airemix.jp> | 2019-10-22 21:12:50 +0900 |
---|---|---|
committer | NARUSE, Yui <naruse@airemix.jp> | 2019-10-22 21:17:29 +0900 |
commit | aec0a293a4f9d2f8f8d085f57023ec3ba4bf6525 (patch) | |
tree | 3cde9e5825e6b11a620a227ad44059931dbb275d | |
parent | ed3333f8736e054a2199a3b77e553b858c5fc7e6 (diff) |
Add a tool to generate a patch for www from log
Receives an output of `tool/make-snapshot` and genarete
* Markdown format for release note
* a patch for branches.yml, downloads.yml, and releases.yml of w.r-l.o
-rwxr-xr-x | bin/format-release | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/bin/format-release b/bin/format-release new file mode 100755 index 0000000000..7404ba2696 --- /dev/null +++ b/bin/format-release @@ -0,0 +1,197 @@ +#!/usr/bin/env ruby +# https://rubygems.org/gems/diffy +require "diffy" + +Diffy::Diff.default_options.merge!( + include_diff_info: true, + context: 1, +) + +class Tarball + attr_reader :version, :sha256 + + 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 + @size = size + @sha1 = sha1 + @sha256 = sha256 + @sha512 = sha512 + @version = ver + @xy = xy + 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 ext; @path[/(?:zip|tar\.(?:gz|bz2|xz))\z/]; end + + def to_md + <<eom +* <https://cache.ruby-lang.org/pub/ruby/#{@xy}/ruby-#{@version}.#{ext}> + + SIZE: #{@size} bytes + SHA1: #{@sha1} + SHA256: #{@sha256} + SHA512: #{@sha512} +eom + end + + # * /home/naruse/obj/ruby-trunk/tmp/ruby-2.6.0-preview3.tar.gz + # SIZE: 17116009 bytes + # SHA1: 21f62c369661a2ab1b521fd2fa8191a4273e12a1 + # SHA256: 97cea8aa63dfa250ba6902b658a7aa066daf817b22f82b7ee28f44aec7c2e394 + # SHA512: 1e2042324821bb4e110af7067f52891606dcfc71e640c194ab1c117f0b941550e0b3ac36ad3511214ac80c536b9e5cfaf8789eec74cf56971a832ea8fc4e6d94 + def self.parse(io, wwwdir) + 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 + end + xy = ver[/\A\d+\.\d+/] + ary.each do |tarball| + puts tarball.to_md + end + update_branches_yml(ver, xy, wwwdir) + update_downloads_yml(ver, xy, wwwdir) + update_releases_yml(ver, xy, ary, wwwdir) + ary + end + + def self.update_branches_yml(ver, xy, wwwdir) + filename = "_data/branches.yml" + 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| + unless ver.include?("-") + # assume this is X.Y.0 release + node.sub!(/^ status: preview\n/, " status: normal maintenance\n") + node.sub!(/^ date:\n/, " status: #{Time.now.year}-12-25\n") + end + node + end + else + if ver.include?("-") + status = "preview" + year = nil + else + status = "normal maintenance" + year = Time.now.year + end + entry = <<eom +- name: #{xy} + status: #{status} + date:#{ year && " #{year}-12-25" } + eol_date: + +eom + data.sub!(/(?=^- name)/, entry) + end + if data != orig_data + diff = Diffy::Diff.new(orig_data, data) + show_diff(filename, diff) + end + end + + def self.update_downloads_yml(ver, xy, wwwdir) + filename = "_data/downloads.yml" + orig_data = File.read(File.join(wwwdir, filename)) + data = orig_data.dup + + if /^preview:\n\n(?: .*\n)* - #{Regexp.escape(xy)}\./ =~ data + if ver.include?("-") + data.sub!(/^ - #{Regexp.escape(xy)}\..*/, " - #{ver}") + else + data.sub!(/^ - #{Regexp.escape(xy)}\..*\n/, "") + data.sub!(/(?<=^stable:\n\n)/, " - #{ver}\n") + end + else + unless data.sub!(/^ - #{Regexp.escape(xy)}\..*/, " - #{ver}") + if ver.include?("-") + data.sub!(/(?<=^preview:\n\n)/, " - #{ver}\n") + else + data.sub!(/(?<=^stable:\n\n)/, " - #{ver}\n") + end + end + end + if data != orig_data + diff = Diffy::Diff.new(orig_data, data) + show_diff(filename, diff) + end + end + + def self.update_releases_yml(ver, xy, ary, wwwdir) + filename = "_data/releases.yml" + orig_data = File.read(File.join(wwwdir, filename)) + data = orig_data.dup + + date = Time.now + entry = <<eom +- version: #{ver} + date: #{date.strftime("%Y-%m-%d")} + post: /en/news/#{date.strftime("%Y/%m/%d")}/ruby-#{ver.tr('.', '-')}-released/ + 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 + 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} +eom + + if data.include?("\n- version: #{ver}\n") + elsif data.sub!(/\n# #{Regexp.escape(xy)} series\n/, "\\&\n#{entry}") + else + data.sub!(/^$/, "\n# #{xy} series\n\n#{entry}") + end + if data != orig_data + diff = Diffy::Diff.new(orig_data, data) + show_diff(filename, diff) + end + end + + def self.show_diff(filename, diff) + diff.each_with_index do |line, index| + case index + when 0 + 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 + "+++ b/#{filename}\t#{$2}" + end + end + puts line + end + end +end + +def main + if ARGV.size != 1 + STDERR.puts "usage: cat output-of-make-snapshot | format-release <dir-of-w.r-l.o>" + exit + end + Tarball.parse(ARGF, wwwdir) +end + +main |