aboutsummaryrefslogtreecommitdiffstats
path: root/bin
diff options
context:
space:
mode:
authorNARUSE, Yui <naruse@airemix.jp>2019-10-22 21:12:50 +0900
committerNARUSE, Yui <naruse@airemix.jp>2019-10-22 21:17:29 +0900
commitaec0a293a4f9d2f8f8d085f57023ec3ba4bf6525 (patch)
tree3cde9e5825e6b11a620a227ad44059931dbb275d /bin
parented3333f8736e054a2199a3b77e553b858c5fc7e6 (diff)
downloadruby-aec0a293a4f9d2f8f8d085f57023ec3ba4bf6525.tar.gz
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
Diffstat (limited to 'bin')
-rwxr-xr-xbin/format-release197
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